PDA

Просмотр полной версии : Функциональный блок таймер с задержкой включения TON (TOF, TP)



Faton
17.05.2016, 14:33
В Codesys 2.3 Функциональный блок таймер с задержкой включения TON (TOF, TP) нужно было применять в ST языке с особенностью. Если в программе применяется цикл, условие, то нужно вызвать функциональный блок без параметров. В противном случае происходит запаздывание таймера.
Пример управления сверхзвуковой сиреной, звук в которой сбрасывается нажатием кнопки. А повторное нажатие отключает свет. Пример в Codesys 2,3
24495
Вопрос в Codesys 3.5 также применяем TON в ST языке?

приборист
17.05.2016, 14:42
О какой задержке речь?
Если не вызывать таймер в каком то условии, а вызывать в каждом цикле - никакой задержки не должно быть.
Или я что-то пропустил? :confused:

Faton
17.05.2016, 14:48
смысл, что если какое-нибудь ветвление в программе, которое требует времени на вычисления. Если в этом ветвлении нет вызова таймера, то его время срабатывания будет неточно.

приборист
17.05.2016, 14:56
Понял, но мне проще использовать два таймера в таком случае :)
От версии Codesys это не зависит.
Это же ФБ.

Faton
17.05.2016, 15:44
Спасибочки. А библиотека OSCAT новая 3.3.3.0 будет работать в Codesys 2,3? А то раньше без неё обходился.

Валенок
17.05.2016, 23:29
Глянул картинки из поста 1. Жесть.
Автор просто не понимает как работает таймер

Радонежский
18.05.2016, 11:15
Я считаю, что грамотно сделано. Это больше для затяжных циклов применяется. Вне зависимости где просто понаставил таймер и защитился от зависаний. Валенок, вы можете указать нормативный документ, который регламентирует применение таймеров в ST языке с циклами с условиями? Я пока не вспомнил когда и где, но раньше поднималась проблема, где причина была в отсутствии вызова таймера и это приводило к зависанию самого таймера.

capzap
18.05.2016, 12:14
так лепить друг за дружкой вызов таймера то зачем, что от этого измениться. Минимальная единица времени для контроллеров миллисекунды, между двумя инструкциями в коде проходят микросекунды, таким образом два вызова подряд ни чего не решают, ни как это не влияет на торможение или еще чего то там. По уму в таком коде таймер надо выводить в конец кода за все условия, что то вроде этого
tik(IN:=tik.IN,PT:=tik.PT); А в самих условиях оперировать только аргументами таймера, естественно если не требуется по условию сбросить таймер

Радонежский
18.05.2016, 13:03
У него в условиях таймер есть. Конечно можно оптимизировать код, убрав лишние вызовы, но в этом варианте точно с таймером будет все работать. Тупо (и глупо :) ) и надежно.

capzap
18.05.2016, 16:42
У него в условиях таймер есть. Конечно можно оптимизировать код, убрав лишние вызовы, но в этом варианте точно с таймером будет все работать. Тупо (и глупо :) ) и надежно.

ни ктож не говорит что не работает, но вся жесть и не понимание автора, как пишет Валенок, заключается в том что например нафига в условии T1.Q просто выполнять вызов таймера, может здесь требовалось произвести сброс с IN:=FALSE. Грамотности, как Вы пишите, здесь нет

Faton
18.05.2016, 17:34
"в условии T1.Q" это про строчку 14 на рисунке? В условии(или цикле) при дальнем усовершенствовании программы может появиться функциональный блок. Т.е. логика следующая: расставил "t1;" на стадии разработки. А потом через 3-4 месяца в случае надобности добавляешь функциональные блоки, которые могут быть ресурсоёмкими по времени. Иначе мне через 3-4 месяца надо вспоминать логику работы блока программы с таймером. Когда на объекте надо все поправить за 10-15 минут, а не стоять в грязном и жарком месте и напрягать извилины.
Как я понял у меня лишние вызовы "t1;", которые по-хорошему можно все убрать. Я прав?

Yegor
18.05.2016, 17:59
Тупо (и глупо :) ) и надежно.Надёжно? Когда таймер вызывают три раза подряд, эпитет "надёжно" должен быть последним в списке, потому что это явный признак неуверенности и bug driven development. От такого кода жди удар в спину в любой момент.

С таймерами и вообще любыми ФБ в ST всё очень просто: надо не вызывать блок в условиях, а условия передавать блоку. t1(IN := ACTIV AND P16 и т.д.). Вот из одного нашего проекта код:
RegenTimer(IN := RegenEnabled AND NOT RegenTimer.Q AND NOT RegenFilling AND NOT lvl1);
RegenTrig(clk := RegenEnabled);
RegenFilling := RegenEnabled AND (RegenFilling (*already*) OR NOT (*even*) lvl2 OR RegenTrig.Q OR RegenTimer.Q OR dtt1 >= 30) AND NOT lvl1 (*yet*);
FillEnd(clk := RegenFilling);

IF RegenFilling THEN (* Держать конфигурацию заполнения *)
k5 := TRUE;
k6 := ik5;
npp1 := ik6;
k10 := FALSE;
ELSIF FillEnd.Q THEN (* Отменить конфигурацию заполнения *)
k5 := k6 := npp1 := FALSE;
END_IF
Все таймеры и триггеры вызываются по одному разу, вне IF'ов, а сами IF'ы имеют единственный уровень вложенности. Условия реализованы через AND/OR/NOT. И это _весь_ код, который управляет заполнением испарителя не самой простой установки по множеству условий - периодически, по достижении уровня, по температуре, при активации. Причём код запуска это одновременно и код остановки. А IF'ами оно бы на целую страницу растянулось как минимум.

А тут...
t1;
...
IF KH_IN AND NOT t1.IN THEN
t1(IN := FALSE);
Зачем t1(IN := FALSE)? Он уже остановлен к этому моменту. Приходите на пересдачу.
Как я понял у меня лишние вызовы "t1;", которые по-хорошему можно все убрать. Я прав?У вас общий стратегический просчёт. Всё вывернуто наизнанку. Под ПЛК так не пишут.

Faton
18.05.2016, 20:24
Очень красивый код. Я сталкивался в Delphi с ситуацией, когда «длинные условия» типа

Вот из одного нашего проекта код:RegenTimer(IN := RegenEnabled AND NOT RegenTimer.Q AND NOT RegenFilling AND NOT lvl1);


неправильно интерпретировались компилятором. Искренне спасибо всем за помощь.


Зачем t1(IN := FALSE)? Он уже остановлен к этому моменту. Приходите на пересдачу.У вас общий стратегический просчёт. Всё вывернуто наизнанку. Под ПЛК так не пишут.
Это чтобы не ошибиться. Как правило, нет же готовой блок-схемы алгоритма. Это нормально и нужно, чтобы отчет времени обязательно начался заново, вне зависимости от ошибок в программе.

capzap
18.05.2016, 21:06
Очень красивый код. Я сталкивался в Delphi с ситуацией, когда «длинные условия» типа
неправильно интерпретировались компилятором. Искренне спасибо всем за помощь.
Это чтобы не ошибиться. Как правило, нет же готовой блок-схемы алгоритма. Это нормально и нужно, чтобы отчет времени обязательно начался заново, вне зависимости от ошибок в программе.
вот блин уже более чем уверен, что работа Ситникова все же нужна. Ни кто не удивится что у Вас и в дельфях что то не компилируется с таким то подходом к программированию

Валенок
18.05.2016, 23:11
Прошу извинить. Пальцы не гнул - реально не было возможности ответить. Мужики все замечательно рассказали.

сталкивался в Delphi с ситуацией, когда «длинные условия» типа неправильно интерпретировались компилятором
Вот ни разу. Бывало бился головой об стену, обегал вокруг дома, ходил за пивом - но находил причину и всегда был сам дурак.

Faton
19.05.2016, 13:57
Я в делфи пишу программки, которые приборы опрашивают по RS-485 и выводят значения с приборов. Сниффер у меня на делфи. Работает все спасибо говорят, а мне математику отправляют учить.capzap, может подскажите мне где могу научиться красивый код в ST языке писать? Возьмете меня в ученики на добровольных началах?

Yegor
19.05.2016, 16:39
Я в делфи пишу программки, которые приборы опрашивают по RS-485 и выводят значения с приборов. Сниффер у меня на делфи. Работает все спасибо говорят, а мне математику отправляют учить.Покажите код.

capzap
19.05.2016, 17:50
не уверен что для написания кода нужна красота, берите за основу обучения библиотеку на oscat.de
мне еще не понятно про математику, Вы даже с ехидничать толком не можете

Faton
20.05.2016, 08:49
Yegor, пример моего кода в делфи
24524
24525
capzap, спасибо, вы про этот документ: 90-oscat-basic-docu-english.pdf

capzap
20.05.2016, 09:57
может и это, вобще я говорил про исходный код в библиотеках базовой, для сети и для готовых процессов

а по поводу скрина, я правильно понял что трим Вам не подходит? Просто примера самой строки нет

Yegor
20.05.2016, 10:15
Yegor, пример моего кода в делфиНепоследовательное форматирование вообще всего (включая комментарии), комментирование очевидного, бессмысленные имена (i_int), орфографические ошибки в именах и т.д. Есть подозрение, что код можно целиком заменить на вызов HexToBin (http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Classes.HexToBin) (я практически не пользовался Дельфи). Это хорошо, что ваш код уже кому-то пригождается, но пока он ещё низкого качества. Работайте над собой.

Faton
20.05.2016, 10:48
Мне нужно с пробелами, чтобы было визуально отслеживать и анализировать обмен. Покажите мне свой идеальный код? Буду и у cazap и Вас у учиться.

capzap
20.05.2016, 12:12
Мне нужно с пробелами, чтобы было визуально отслеживать и анализировать обмен.ну как же нужно, если в самом начале выполняете StringReplace

Yegor
20.05.2016, 13:44
Покажите мне свой идеальный код?У меня (https://github.com/yegorpetrov) тоже мягко говоря не идеальный код и я на данном этапе не рекомендую по нему учиться кодить. Попробуйте "Совершенный код (http://www.labirint.ru/books/272529/)", например. Её по порядку не обязательно читать.

Faton
20.05.2016, 15:40
Yegor, в этой книге расписано как красиво писать в ST языке? Там же нет особенностей интерпретации и компиляции кода в Codesys. По-хорошему должен быть расписан процесс компиляции и декомпиляции конкретно для Codesys. Вот кто меня критикует за код, Вы из откуда знаете как работает компилятор/интерпретатор в Codesys? У вас есть отладчик, поделитесь? Отладчик (не тот который Codesys и делфи), а например OllyDbg для делфи и С/с++ и т.д..
У вас нет такого отладчика для Codesys? Тогда по какой документации судите меня?

Спасибо capzap. Он честно сказал на что равняться - на немецкую разработку Oscat. Ему спасибо, я правда еще не смотрел подробно документ и не нашел как пишутся функции и ФБ.
И еще , не придирайтесь, Вы же прекрасно знаете что можно всю жизнь сидеть и переписывать один и тот же алгоритм ну вот я исходил на тот момент так и применил StringReplace, хотя еще раньше есть её обработка.

capzap
20.05.2016, 18:26
не смотрел подробно документ и не нашел как пишутся функции и ФБ.

там исходники отлаженного кода для широкого применения, там не читать придется как писать ПОУ а изучать как это делают профи

По поводу придирок, про то как Вы будете избавляться от пробелов мне всё равно. В Вашем листинге я хотел увидеть тот набор условий приводящий к ошибке компилятора, как Вы заявили. А выкладывать код в котором и смотреть то не чего, какова его цель была, попробуйте найдите косяки что ли?

Yegor
20.05.2016, 19:00
в этой книге расписано как красиво писать в ST языке?В этой книге расписано как красиво писать код на любом языке. В том числе как писать код, чтобы не приходилось винить компилятор и лишний раз лезть в отладчик (хоть символьный, хоть низкоуровневый). Кстати в OSCAT вы рискуете многого не увидеть: во-первых, потому что это сильно фрагментированный код общего назначения (он не решает конкретных задач управления); во-вторых, потому что вы настолько обеспокоены тем, во что должен превращаться ваш код, что не желаете знать, откуда он должен браться. Серьёзно, почитайте книги о программировании без языков программирования в названии.

Faton
20.05.2016, 22:19
Читал недавно Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений – 2008. Что- то ясно и понятно, а что я считаю бесполезно….

Capzap, Так как мне научиться писать как профи, если примеров нет? Примеров у овена с отметкой «написано профи» нет и в OSCAT тоже нет.

У таймера должен очень точно работать механизм. Т.е. его на часы не должна влиять загруженность процессора. А большинство языков программирования это последовательность команд без привязки ко времени. Поэтому существуют приемы в языках, когда применяются потоки. Но в это не в Codesys.

capzap
20.05.2016, 23:28
Егор зря наехал на оскат, это с его колокольни так выглядит, а для Вас это как раз те функции , что нужны. Не вникал в смысл Вашего звонка, но мне кажется оскатовский PULS_T или как то так будет подходящей заменой Вашего кода. Еще раз повторю примеры имеются в этих библиотеках



У таймера должен очень точно работать механизм:)
Знали бы Вы еще что в плк часы сами по себе неимеют точности

Валенок
20.05.2016, 23:47
У таймера должен очень точно работать механизм
.. сказал Faton засекая время через которое он должен перевернуть песочные часы.

Чтоб таймер работал точно вовсе не надо его вызывать за каждым поворотом. Не обязательно его даже в каждом рабочем цикле вызывать.

А конкретизируя данный частный случай, вопрос о точности в контексте "нажатий кноп" - реально смешон.

PS
Ну и на картинке из поста 1, традиционный косяк в 33й строке - прибавлять нужно было не 7, а 11.

Yegor
21.05.2016, 00:31
Фатон, если я вам вместо механического секундомера точностью 0,1 сек дам электронный 0,001 сек, вы своими руками время все равно точнее не засечете. Потому что у вас реакция ограничена и палец так быстро не двигается. С ПЛК то же самое - нет смысла отслеживать ход времени в пределах одного рабочего цикла, потому что ввод-вывод все равно происходит не чаще вызова всей программы.

Владимир Ситников
21.05.2016, 10:21
Capzap, Так как мне научиться писать как профи, если примеров нет?

Научиться можно через практику.
Придумываешь себе задачу -- решаешь. Придумываешь -- решаешь. И так далее.

В этом плане OSCAT может выступать как вариант "сборника задач". Например, берём какую-нибудь функцию оттуда, и пробуем написать сами. Потом сравниваем "что у них" с тем "что получилось".
Если получилось короче -- пишем на форум. Вполне может оказаться, что в OSCAT что-то не самым лучшим образом написано.


Совершенство достигнуто не тогда, когда нечего добавить, а когда нечего убрать.

delete your code (https://www.youtube.com/watch?v=Oj4vXMRenFo) и т.п.

Ещё вариант: попробуйте в исходной программе убрать строки, чтобы она ещё работала. Смысл не в том, чтобы всё в одну строку записать, а в том, чтобы оставить минимально необходимое понятное.

Faton
23.05.2016, 14:29
1) capzap , время берется от так тактового генератора (резонатора), колебания которого не стабильны во времени и зависят от очень многих факторов . А Вы знаете, что и атомные часы в г. Москве подводят раз в сутки? Потому что есть среднее время между атомными часами. Я не настолько глуп... Для того, чтобы обеспечить точность времени или RTC (реальное время) нужно применять микросхемы сторонних производителей
2) «Чтоб таймер работал точно вовсе не надо его вызывать за каждым поворотом. Не обязательно его даже в каждом рабочем цикле вызывать.»
Здесь показан общий принцип применения таймера. В конкретном случае пустой вызов таймера не нужен,а в общем Я СЧИТАЮ нужен (ЛУЧШЕ ЗАЩИТИТЬСЯ ОТ БЕСКОНЕЧНЫХ ИЛИ ДОЛГИХ ЦИКЛОВ). А что если условие будет долгим и ПЛК прервет выполнение цикла по wath dog и в таком плане….
«Ну и на картинке из поста 1, традиционный косяк в 33й строке - прибавлять нужно было не 7, а 11.» Я там 33 строки не вижу…
3) Yegor, точности времени я представляю. Но что делает процессор в этот момент ни Вы, ни я не знаем.
4) vladimirisitnikov, спасибо. Я так и живу. У меня есть выбор могу искать день нужную функцию в OSCAT, а могу написать её сам и еще как дополнительная тренировка будет. Конечно есть сложные функции куда лучше не лезть, а звонок это просто. Чем меньше в проекте не известного кода (закрытых библиотек), тем яснее для разработчика алгоритм работы. Я стараюсь максимально избегать. Хочу вот в совершенстве овладеть работой с указателями/ памятью. У кого можно проконсультироваться?

capzap
23.05.2016, 14:39
Чем меньше в проекте не известного кода (закрытых библиотек), тем яснее для разработчика алгоритм работы.

золотые слова, еще остается добавить не только не известный но и не нужный. Нам например тяжело понять зачем в Вашем коде бесполезные вызовы ФБ. которые ни какой роли не играют

А что если условие будет долгим и ПЛК прервет выполнение цикла по wath dog да хоть бы и чуть не доберется до злой собаки, что это даст, проверка на сработку таймера (переменная .Q)в любом случае уже будет в следующем очередном цикле
Поймите, что таймеры запоминают время в момент его пуска и далее при вызовах берут текущее время полученную разность сравнивают с PT, если больше, именно больше а не равно, то включают выход

Валенок
23.05.2016, 18:54
В конкретном случае пустой вызов таймера не нужен,а в общем Я СЧИТАЮ нужен (ЛУЧШЕ ЗАЩИТИТЬСЯ ОТ БЕСКОНЕЧНЫХ ИЛИ ДОЛГИХ ЦИКЛОВ).
Не в конкретном, а в общем случае любой вызов таймера "просто так" - бессмыслица. Вы предполагаете что он с пружиной которую нужно периодически заводить ? И в чём защита-то ?
В общем Вы так и не разобрались в работе таймера.
Но т.к. NOP'ами кашу не испортишь - делайте что хотите.

Faton
25.07.2016, 21:11
У меня (https://github.com/yegorpetrov) тоже мягко говоря не идеальный код и я на данном этапе не рекомендую по нему учиться кодить. Попробуйте "Совершенный код (http://www.labirint.ru/books/272529/)", например. Её по порядку не обязательно читать.

Почитал книгу "Совершенный код". там примеры для с++, а не для паскаля. Это идеи для паскаля, а мне нужен практический подход. про таймеры там нет ничего. Yegor зря мне посоветовали книгу, она не для совершенного кода в Codesys

Yegor
25.07.2016, 22:35
Вы хотите научиться ездить или двигатель перебирать? Потому что если первое, то меня беспокоит не столько ваше отношение к этой книге, сколько аргументы против неё. Вы этими же аргументами откажетесь от любого материала, который мне помог на этом пути, например.

Есть книги, руководства и статьи, в которых показывают способы заставить работать ту или иную вещь в ST, а вот о том, как эту вещь к реальной проблеме красиво и правильно применить — нету. Берите материал для других языков, обобщайте, находите сходства и различия. Даже по части компиляции — почитайте как работают компиляторы вообще. Когда я обнаружил, что второму кодесису можно подсунуть выражение i.TRUE := i.FALSE (где i: INT) и он это съест, то я понял, почему он это делает не из какого-то руководства именно по ST, а просто знал из разных источников, что лексер криво сделан. Кстати толк от знания таких жутких тонкостей в программировании ПЛК сомнительный.

Если я вам про организацию игрового цикла в компьютерных играх скажу почитать, вы меня совсем пошлёте? А между тем очень похожий подход к программированию, тоже в бесконечном цикле, тоже куча таймеров, которые лишний раз вызывать не надо.

Владимир Ситников
25.07.2016, 22:43
Кстати толк от знания таких жутких тонкостей в программировании ПЛК сомнительный.
Вопрос на собеседовании "i := 42; i.TRUE := i.FALSE; чему станет равно i?"
Или так "переменная I имеет тип DATE. Чему будет равно i := BOOL_TO_DATE(TRUE);?"

В курилке смеяться над подобными вопросами очень большой смысл.
А в реальном АСУТП, конечно, никакого.

И, да, если кто-то реально спросит подобное на собеседовании стоит 42 раза подумать "а стоит ли туда идти".


Если я вам про организацию игрового цикла в компьютерных играх скажу почитать, вы меня совсем пошлёте? А между тем очень похожий подход к программированию, тоже в бесконечном цикле, тоже куча таймеров, которые лишний раз вызывать не надо.
+1

Faton
25.07.2016, 23:42
Если я вам про организацию игрового цикла в компьютерных играх скажу почитать, вы меня совсем пошлёте? А между тем очень похожий подход к программированию, тоже в бесконечном цикле, тоже куча таймеров, которые лишний раз вызывать не надо.
Рассказывать можно и про корабли, которые бороздят ... Если это имеет отношение к делу, то можно и поведать о цикла в компьютерных играх.
Основная проблема это недостаточно ресурсов (времени и денег), с которой встречается инженер. Я не могу просто читать про компиляторы. В своё время я уже начитался - и про ошибки округления и т.д.. Практическое применение прочитанного в чем? Версии компиляторов изменились, снова искать описания тестов или самим начать тестировать компиляторы? Книга "Совершенный код" неплохая, но для решения моих задач -красиво писать код на ST языке - не подходит. Даже возможности ООП в Delphi я не могу перенести в Codesys. Из какого источника вы узнали о проблеме интерпретации компилятором "i.TRUE"?
Любая технология(практические знания) с течением времени приходит к ширпотребу и для её реализации требуется все меньше ресурсов(времени и денег).Поэтому инженеру приходится изучать новые технологии.
Я вспомнил откуда я про таймер взял, это была тема в журнале СТА. Я могу повспоминать и найти ссылку.

Осинский Алексей
26.07.2016, 06:51
В своё время я уже начитался - и про ошибки округления и т.д.. Практическое применение прочитанного в чем?
Практическое применение: знать узкие места при работе с числами с плавающей точкой в программировании.
Если Вы не работаете с такими числами, то применения, безусловно, нет.

Книга "Совершенный код" неплохая, но для решения моих задач -красиво писать код на ST языке - не подходит.
Можно подробнее? Что именно не подходит?

Даже возможности ООП в Delphi я не могу перенести в Codesys.
С какими проблемами столкнулись здесь? Давайте помогу.

Faton
26.07.2016, 10:12
Давайте! Спс.
Для начала пример с работы с созданием и применением класса. (структуру или запись не является классом).
Ссылка на таймер на форуме СТА:
http://forum.cta.ru/forum_posts.asp?TID=2327

Осинский Алексей
26.07.2016, 10:54
Давайте! Спс.
Для начала пример с работы с созданием и применением класса. (структуру или запись не является классом).
Ссылка на таймер на форуме СТА:
http://forum.cta.ru/forum_posts.asp?TID=2327

А где, собственно, описание проблемы, с которой Вы столкнулись?
"Класс" в ООП = "Фунциональный Блок" в МЭК
Создайте необходимый Вам класс так: Контекстное меню Application -> Add object -> POU и выберите там "FB" и спецификаторы доступа.

Для использования объекта нужно создать экземпляр класса (в терминологии ООП).
В CODESYS это делается просто в секции объявления переменных напишите запись вида


fb_myclassInst : MYCLASS;

где fb_myclassInst имя экземпляра класса (объекта),
MYCLASS - имя класса.

Для вызова экземпляра класса без передачи параметров используйте запись вида


fb_myclassInst();

При необходимости передачи параметров можно использовать запись, принятую в других ЯП


fb_myclassInst.iInputVar1 := 100;
fb_myclassInst();
iOutValue1 := fb_myclassInst.iOutVar1;


либо запись, принятую в CODESYS:

fb_myclassInst (iInputVar1 := 100, iOutVar1 => iOutValue1);

при таких вызовах выполняется код, записанный в теле функционального блока.
Если выполнять код циклически (в каждом цикле ПЛК) нет необходимости, и объект должен реализовывать только событийную логику (или событийную логику в дополнение к циклическому выполнению), используйте методы.

Добавить метод просто: контекстное меню ФБ -> Add object -> Method

Для вызова методов ФБ используйте запись вида


iResult := fb_myclassInst.firstMethod (100);
где firstMethod - имя метода


"Конструктор" в ООП: метод "fb_Init" в CODESYS
"Деструктор" в ООП: метод "fb_Exit" в CODESYS
Более подробно об этих методах написано в справке CODESYS.

Надеюсь ответил на все вопросы. Если нет - сформулируйте как можно более подробно оставшиеся - я постараюсь помочь.

Faton
26.07.2016, 19:16
Спасибо за оперативный ответ.


Для использования объекта нужно создать экземпляр класса (в терминологии ООП).
В CODESYS это делается просто в секции объявления переменных напишите запись вида


fb_myclassInst : MYCLASS;


Где эта секция? В ассистенте ввода нет типа MYCLASS. Вручную попробовал вставить конструкцию в разных местах "fb_myclassInst : MYCLASS;" компилятор ругается.

capzap
26.07.2016, 19:53
Спасибо за оперативный ответ.

Где эта секция? В ассистенте ввода нет типа MYCLASS. Вручную попробовал вставить конструкцию в разных местах "fb_myclassInst : MYCLASS;" компилятор ругается.
это не секция, MYCLASS это то как Вы назовете свое ПОУ

не думаю что сильно поможет ООП, выкладываю проект, где пытался что то подобное начать использовать, может быть не рабочая версия, взял первое что попалось

Kostennikov
29.07.2016, 13:34
Раз уж тут про таймеры холиварят я тоже добавлю... У меня 31 объект. мне надо на каждом объекте 5 минут держать двигатель включенным 1 час выключенным, во время когда двигатель выключен поочередно должны включаться насосы 5 минут один потом 5 минут другой. так вот собственно мне городить 31 таймер на двигатель и 31 таймер на насосы. или можно какими-то функциями дропать текущее время плк и сравнивать разницу от уставки если больше чем уставка то выкл (т.е. каждый цикл дропаем время и если разница от начала запуска с текущим больше уставки то что то делаем). по времени реакции не принципиально если там буде погрешность в секунду две. Думаю выдержит ли плк 60+ таймеров или я что-то тоже не догнал в таймерах.

кода не прошу прошу совета.

capzap
29.07.2016, 14:00
Раз уж тут про таймеры холиварят я тоже добавлю... У меня 31 объект. мне надо на каждом объекте 5 минут держать двигатель включенным 1 час выключенным, во время когда двигатель выключен поочередно должны включаться насосы 5 минут один потом 5 минут другой. так вот собственно мне городить 31 таймер на двигатель и 31 таймер на насосы. или можно какими-то функциями дропать текущее время плк и сравнивать разницу от уставки если больше чем уставка то выкл (т.е. каждый цикл дропаем время и если разница от начала запуска с текущим больше уставки то что то делаем). по времени реакции не принципиально если там буде погрешность в секунду две. Думаю выдержит ли плк 60+ таймеров или я что-то тоже не догнал в таймерах.

кода не прошу прошу совета.

особо большой разницы нет, один таймер будет или несколько

Валенок
30.07.2016, 00:00
Думаю выдержит ли плк 60+ таймеров или я что-то тоже не догнал в таймерах.
Не догнали. Выдержит где-то 100 тысяч таймеров. Дальше думаю просто памяти не хватит.

Faton
01.08.2016, 13:22
это не секция, MYCLASS это то как Вы назовете свое ПОУ

не думаю что сильно поможет ООП, выкладываю проект, где пытался что то подобное начать использовать, может быть не рабочая версия, взял первое что попалось

Пытаюсь понять, т.к. компилятор подчеркивает трудно разобраться. Требуются подключить/заменить на новые библиотеки:
25662

Осинский Алексей
01.08.2016, 13:39
Пытаюсь понять, т.к. компилятор подчеркивает трудно разобраться. Требуются подключить/заменить на новые библиотеки:
25662

Сложно Вам будет. Думаю стоит все-таки последовательно подходить к разработке, раз нахрапом не получается.
Для начала ознакомьтесь с литературой Игоря Петрова: Руководство пользователя по программированию ПЛК в CoDeSys 2.3 (http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf)
В 3.5 по сути осталось то же самое, но расширился функционал и изменился интерфейс. Начните с этой книги, а потом добавляйте уже ООП и прочее.

То, что Вы наблюдаете - указание того, что есть более новые версии библиотек (компилятора и т.д.). В большинстве случаев не стоит их изменять.

Faton
06.08.2016, 17:57
Игоря Петрова: Руководство пользователя по программированию ПЛК в CoDeSys 2.3 эту книгу я конечно же читал и знаю.

Вот в проекте tcp304toPC.project (capzap) присутствует создание/ уничтожение объекта. Правда я до конца еще не разобрался в коде. Но считаю, что нужно стремиться к такой записи кода.
В Codesys Функциональный блок можно ли уничтожить и освободить память? Смотрю коды других они используют конструкцию if then,чтобы вывести из работы ФБ. А можно ли вместо этого уничтожить объект, а потом создать?
А лучше пример работы с классом/объектами и динамическом выделением памяти.

Владимир Ситников
06.08.2016, 20:53
Смотрю коды других они используют конструкцию if then,чтобы вывести из работы ФБ.
Само состояние ФБ сохраняется, поэтому говорить, что "совсем вывели из работы" неправильно.

Грубо говоря, блоку таймера не так важно вызывают ли его на каждом цикле, или через цикл, или вообще раз в секунду.
Рано или поздно он сработает.


А можно ли вместо этого уничтожить объект, а потом создать?
А лучше пример работы с классом/объектами и динамическом выделением памяти.
А смысл?
В программах ПЛК же заранее известно каким процессом управляем.
Что именно предлагается динамически создавать и уничтожать?

Какой смысл тратить время ПЛК на "создание/удаление", если в конечном итоге насосы на объекте не плодятся почкованием?

Faton
06.08.2016, 21:27
А если требуется считать показания теплового и электрических счетчиков на ЦТП раз в месяц? Можно отработать режим тестирования и выгрузить его из памяти. А так все роu находятся в памяти.

Владимир Ситников
06.08.2016, 21:36
А если требуется считать показания теплового и электрических счетчиков на ЦТП раз в месяц? Можно отработать режим тестирования и выгрузить его из памяти. А так все роu находятся в памяти.

Так не марсоход же, в котором нужно после приземления "выгружать из памяти программу полёта, и загружать программу езды по Марсу".

Какой смысл выгружать POU из памяти? Реально упираетесь в их количество? Их, конечно, ограниченное, количество, но выгружать просто ради выгрузки смысла нет.

Faton
06.08.2016, 21:41
Хорошо, сформулирую по-другому вопрос. Существует ли возможность в Codesys 2.3 и 3.5 выгрузки из памяти объекта или POU?

ASo
06.08.2016, 21:44
Очевидный вопрос - ЗАЧЕМ?
И из какой памяти?

Faton
06.08.2016, 21:57
Если взять ПЛК323 или СПК207, то в них Linux стоит. Чтобы использовать OpenVPN требуются ресурсы.Вот и возникает желание писать программу менее требовательной к ресурсам и при каждой возможности высвобождать память.

Валенок
07.08.2016, 00:23
Хорошо, сформулирую по-другому вопрос. Существует ли возможность в Codesys 2.3 и 3.5 выгрузки из памяти объекта или POU?
Объекта - да. Приспичило - изучаем syslibmem.
POU - тут специфично само желаемое действие. А так - с ходу нет. Через анус - можно.

Ну и продолжу - ЗАЧЕМ ? Просто распирает любопытство - кому на реальном плк потребовались его ресурсы в процессе ? Как осторожно предположил vladimirsitnikov - вырос вдруг насос ?

Yegor
07.08.2016, 15:03
В стандарте IEC 61131-3 без расширений вообще не предусматривается динамическое выделение памяти для чего бы ни было. Полностью статическое всё, и неспроста. Надо раз в месяц опрашивать - ну так и вызывайте этот POU раз в месяц. Никому и ничему он в памяти не мешает.

Валенок
07.08.2016, 15:39
Так, не за себя прошу, а токмо волею пославшего меня Foton'а


Yegor, Вы ж не будете отрицать удобство работы с динамической памятью в некоторых алгоритмах ?
А отсутствие среди 10-ти заповедей разрешения работы с динамической памятью не является запрещением работы с ней ))

Yegor
07.08.2016, 17:43
Не буду отрицать, конечно. Кстати рекурсия тоже бывает очень удобна в некоторых алгоритмах (;

Faton
08.08.2016, 22:34
Прошу прощения, та как сейчас в системе нет возможности запустить Codesys. Библиотека syslibmem скорее всего закрытая и описания на русском нет?

capzap
08.08.2016, 22:56
Прошу прощения, та как сейчас в системе нет возможности запустить Codesys. Библиотека syslibmem скорее всего закрытая и описания на русском нет?

без обид, но Вы не хотите сами разбираться, а всё туда же, цитирую: меня тоже волнует вопрос перехода на новый контроллер.Жду отзывов.

Faton
08.08.2016, 23:16
я не понял к чему это? В обновленном ПЛК110 могут быть 1) схемные 2) программные ошибки. Если производитель бы брал на себя ответственность за ущерб, причиненный из-за сырого прибора, то вопросов нет. А сейчас сталкиваюсь 70-80% готовности прибора и он выходит в продажу. Вот у меня в договоре с заказчиком написано, что я обязан полностью компенсировать ущерб, нанесенный контроллером. Поэтому на моих плечах груз ответственности.

приборист
08.08.2016, 23:24
я не понял к чему это? В обновленном ПЛК110 могут быть 1) схемные 2) программные ошибки. Если производитель бы брал на себя ответственность за ущерб, причиненный из-за сырого прибора, то вопросов нет. А сейчас сталкиваюсь 70-80% готовности прибора и он выходит в продажу. Вот у меня в договоре с заказчиком написано, что я обязан полностью компенсировать ущерб, нанесенный контроллером. Поэтому на моих плечах груз ответственности.

И поэтому хотите сыграть в рулетку?
Я боюсь спросить какая же стоимость договора, с такими условиями.
С такими условиями явно не на этот форум, а за другой продукцией.

Faton
08.08.2016, 23:34
Свои условия я не могу диктовать заказчику - Моэк. Он прописал, если мне не подходит , то я в могу отказаться и остаться без работы.
ПЛК110 применяем (старый)- и считаю рабочей лошадкой.С ПЛК160 меньше опыта- молчу.
Я тут запутался. Один "но Вы не хотите сами разбираться", второй про какую-то рулетку.
Насчет стоимости, то один тепловой пункт около 400 тыс. руб => особо не разбежишься, еще покупать кланы и т.д.

capzap
09.08.2016, 06:34
я не понял к чему это? В обновленном ПЛК110 могут быть 1) схемные 2) программные ошибки. Если производитель бы брал на себя ответственность за ущерб, причиненный из-за сырого прибора, то вопросов нет. А сейчас сталкиваюсь 70-80% готовности прибора и он выходит в продажу. Вот у меня в договоре с заказчиком написано, что я обязан полностью компенсировать ущерб, нанесенный контроллером. Поэтому на моих плечах груз ответственности.

ну вот я как раз про то, что Вы считаете свои проблемы с заказчиком у Вас возникнут из-за железа, а не собственноручно написанного кода,а тут как раз, судя по тому какие вопросы задаете, здесь самая большая беда

Faton
09.08.2016, 08:52
Проблемы из-за "собственноручно написанного кода" возникают из-за не достаточно проработанной документации. Когда разжованы и показаны примеры (как в любом нормальном зарубежном стандарте, кроме наших гостов с двояким пониманием), тот проблемы сводятся к минимуму.

А ведь кто-то не поспевает выпускать актуальную документацию.

capzap
09.08.2016, 10:09
Видите ли, документация на ту же syslibmem существует и на русском, вопросы гипотетически могут возникнуть к точности перевода, поэтому легче все же читать англоязычную версию, а она что для зарубежных коллег, что для нас выходит что одинакова. И упоминание каких то гостов, это из разряда что мешает танцору. Если так нужно скачайте на сайте диск с ПО, там обязательно будет и русифицированная версия описания библиотек.

Валенок
09.08.2016, 10:24
Библиотека syslibmem скорее всего закрытая и описания на русском не
Описание на русском - см. хотя бы хэлп.
Закрытая - да. Ну приведите пример забубенных ПЛК где все-все открыто. Хотя зачем ? Смотрите прямо перед собой в 30..50см. Как же вы на энтом работаете-то ?


Вот у меня в договоре с заказчиком написано, что я обязан полностью компенсировать ущерб, нанесенный контроллером. Поэтому на моих плечах груз ответственности.
Ну Вы сами подписались.
Оплачиваю полностью ущерб ? Ни вопрос - имею полностью все прибыль с процесса. А не договора.
Никогда не думали про то, зачем что страховщики сначала требования выкатывают ?

Собсно нужно изучать фунционалную схему - что к чему вообще привести может. Смотреть узкие места техпроцесса. Что-то и схемно защитить, а так - какие-то мутные слова.
ПЛК включил механизм кабель к которому не затянули, и два голых фазных провода весело болтались в бочке с керосином - оплачиваем ущерб ? ПЛК ж виноват.
ПЛК включил прямым пуском неслабый насос в закрытый кран и порвал трубу, патаму что Заказчик попросил не ставить реле давления - да на фик нужен, датчик же есть. А гидробак вычеркнули - да нафик, ЧП ж стоит.
ПЛК не подал питание на Н.О. клапан который заливал емкость с гуаном стоящей на венецианском паркете. Клапан предоставил Заказчик - он просто у него был. Перелив - чистили 2 года назад. Уровень контролировали 1 (одним) поплавком за 100р (vs венец.паркет) который придавило кирпичом.
...


в любом нормальном зарубежном стандарте, кроме наших гостов с двояким пониманием),
Тама тоже хватает двоякости - раз юрист после банкира второй. Не надо ля-ля


Когда разжованы и показаны примеры
Видимо как только создасца специально отдел жевателей и его содержание упадет на стоимость изделия .. Глубоко имхо


Проблемы из-за "собственноручно написанного кода" возникают из-за не достаточно проработанной документации
Рассмешили. Спички детям не игрушка. Не уверен - не обгоняй.

Радонежский
09.08.2016, 11:15
Ребята, тут вам не первый канал :)
Я вот какой месяц жду описания регистров Modbus протокола для ТРМ138
1) Предоставьте описание статуса (код ошибки Modbus 0х0002, 0х0007 ...) табл.В.7 РЭ ТРМ138.
2) Есть ли четкое описание регистра "значения температуры" (Modbus 0х0001, 0х0006 ...).
http://www.owen.ru/forum/showthread.php?t=17601

Жду и жду и не пищу :)

Faton
09.08.2016, 11:30
SysLibMem_RU.pdf файл нашел на рабочем ПК. Вчера я писал с ноутбука домашнего старого на нем Codesys нет(«Прошу прощения, та как сейчас в системе нет возможности запустить Codesys»), соответственно и описание нашел утром на русском. И нечего было так ругаться.
Разбор полетов:
1) Ну приведите пример забубенных ПЛК где все-все открыто.
Не открыто, а документировано. Посмотрите последний вебинар Овена по ТРМ, станет ясно.
2) Ну Вы сами подписались.
А что я могу навязать свои требования? Я не могу диктовать свои условия в тот период, когда и так работы нет.
3) Насчет техпроцесса, то у нас свои головы есть и они обеспечивают решения.
4) В ПЛК нет якобы проблем, а что тогда за постоянные прошивки. А еще припомню про работу интерфейса RS-485, который на некоторое время останавливается опрос. Конечно они обходятся, ищутся другие пути решения.
5) Ля-ля не для «нормального зарубежного стандарта». Я читаю зарубежные и знаю кто и как пишет наши госты. Скажу, что нашим ребятам, которые сидят в институтах нужны деньги и время и все они приведут в порядок. Сейчас этого нет и пока не светит. И чего вы хотите от этих гостов?
6)Мне нужно страховать свою работу? Люди, которые страхуют свои работы у нас откликнитесь! Будем Вас считать!
7) «Жду и жду». Это Вам к Валенку. У него есть все ответы на ваши вопросы по документации.

capzap
09.08.2016, 11:34
Ребята, тут вам не первый канал :)
Я вот какой месяц жду описания регистров Modbus протокола для ТРМ138
1) Предоставьте описание статуса (код ошибки Modbus 0х0002, 0х0007 ...) табл.В.7 РЭ ТРМ138.
2) Есть ли четкое описание регистра "значения температуры" (Modbus 0х0001, 0х0006 ...).
нормальном зарубежном стандарте

Жду и жду и не пищу :)

когда пишите код ошибки модбас это одно, когда регистр со значением статуса ошибки конкретного устройства это совершенно другое
например здесь смотреть надо http://www.kipshop.ru/CoDeSys/steps/owen_plc-configuration.pdf раздел В.1. Ошибки датчиков (аналоговых входов), должно соответствовать

capzap
09.08.2016, 11:36
SysLibMem_RU.pdf файл нашел на рабочем ПК. Вчера я писал с ноутбука домашнего старого на нем Codesys нет(«Прошу прощения, та как сейчас в системе нет возможности запустить Codesys»), соответственно и описание нашел утром на русском. И нечего было так ругаться.
в инет Вы выходите с любого компа, для Вас сложности загрузить мегабайтный архив? С этой страницы http://www.owen.ru/catalog/codesys_v2/67395347

Радонежский
09.08.2016, 12:16
а Вы до сих пор не разобрались?
1)
2 — Адрес данных, указанный в запросе, недоступен
7 — Ведомое устройство не может выполнить программную функцию, заданную в запросе

2) значение температуры int, как и во всех других приборах ОВЕНа округленный флоат, умноженный на десять в степени количесво знаков после запятой

Разобраться или догадаться? Вдруг я неправильно догадываюсь? Статус может принимать другие значения или только два 2 и 7?Спасибо.

Радонежский
09.08.2016, 12:52
На стр.47,48,49 коды ответов устройством по протоколу Modbus. А код 07 не описан, а Вы пишете «Ведомое устройство не может выполнить программную функцию, заданную в запросе» почему?
25754

Радонежский
09.08.2016, 13:10
Так это то, что должно отвечать устройство или в реальности будут ответы? Вообще ТРМ138 может посылать ответы с кодами: 01,02,03,04,05,06,07,08? Или только часть из них? Ни в РЭ, ни на wiki ссылок на ТРМ138 нет. Я только могу догадываться и тестировать.

Радонежский
09.08.2016, 13:36
На сайте овена нет утвержденной версии стандарта Modbus, только ссылки без конкретной версии протокола и т.д.
На документе должна быть печать "В работу".
Речь идет, что в реальности может ответить прибор ТРМ138, а не то что должен «по проекту».
Capzap, вы в своих проектах для Мастера делаете полную реализацию протокола Modbus? Или отбираете самое важное?

Faton
09.08.2016, 13:40
Изменения и не выполнения протокола Модбас устройствами лучше застраховать:)

Валенок
09.08.2016, 14:56
Не открыто, а документировано.
Вы ж спрашивали про "открытость"


А что я могу навязать свои требования? Я не могу диктовать свои условия в тот период, когда и так работы нет.
Заработок копейка, высокая вероятность потери миллиона. Это ваш выбор. Зачем такая работа ? Лучше уж без неё


Насчет техпроцесса, то у нас свои головы есть и они обеспечивают решения.
А-а-а. Вот оно. Типа "чиста программист". Ну тогда так и будете му..охаца.
А за убытки из-за некорректных показаний датчиков отвечает специальный датчикмэн ?


В ПЛК нет якобы проблем, а что тогда за постоянные прошивки.
Назовите хоть что-нить, где нет проблем (идею, самолет, человека, научную теорию, кладбище, молочную промышленность...)


А еще припомню про работу интерфейса RS-485, который на некоторое время останавливается опрос. Конечно они обходятся, ищутся другие пути решения.
Интерфейс никогда не останавливает опрос. Чисто программный косяк. Поэтому и обходится через либы.


Скажу, что нашим ребятам, которые сидят в институтах нужны деньги и время и все они приведут в порядок.
Ага, приведут. Тока к моменту приведения возникнут новые обстоятельства не отраженные в гостах


Мне нужно страховать свою работу?
Ну если неуверены - может и нужно..


«Жду и жду». Это Вам к Валенку. У него есть все ответы на ваши вопросы по документации.
Часть того что знаю - скажу. Но если не знаю - то и говорить не буду.


Кстати - как ООП поживает ?

Faton
09.08.2016, 16:32
Кстати - как ООП поживает ?
Валенок, сокращаем дискуссию: короче ты супер тебе учится не надо, а я еще зелёненький, вот и учи меня.
cazapу спасибо, он привел пример, но я без библиотек пока не разобрался.