PDA

Просмотр полной версии : тонкости вложенных шагов Sfc



Kiselev
18.06.2008, 16:09
Возникла следующая проблема. Использую упрощенный SFC. Создал функциональный блок. Часть его шагов имеет вложенную структуру, которая также описывается на упрощенном SFC. В одном из вложений необходимо наложить временные рамки на работу шага-переход на следущий шаг должен быть на ранее, чем через 2 сек. Для этого я в "step attributes" указываю минимальное время шага 2 сек. Максимальное оставляю пустым. Условие перехода на следующий указываю TRUE. По логике алгоритма мне требуется всего 2 шага (оба с действиями, написанными на ST), с учетом шага инициализации- (тот что обведен двойной линией). Однако данный трюк не работает. Для корректной работы приходится оставлять начальный шаг пустым, переход на второй шаг всегда true, и изменять время выполнения уже второго шага. Всего шагов получается 3. Т.е. в итоге приходится добавлять еще один пустой шаг?почему? Работаю в Codesys 2.3.8.1. И вообще можете пояснить как работает шаг INIT в Codesys? Что с ним можно делать, а что нельзя?Что именно он "инициализирует"? Т.к. я обычно все рабочие таймеры, переменные сбрасываю в последнем шаге перед переходом к INIT (как описывал И. Петров в цикле своих статей по отладке прикладных прогамм ПЛК). Какие операции при этом остаются "за сценой" от прикладника? как осуществляется выход из подобной "вложенности" при наступлении условия перехода на следующий внешний шаг? вложенная структура успевает доработать или же прерывается?

Игорь Петров
19.06.2008, 09:11
...И вообще можете пояснить как работает шаг INIT в Codesys? Что с ним можно делать, а что нельзя?Что именно он "инициализирует"?
В CoDeSys 2.3 есть такая тонкость: в шаге INIT "step attributes" использовать нельзя.
Внутри исполнитель так устроен, что для 'завода' механизма атрибутов, SFC схема должна как минимум один переход пройти.

Вообще шаг INIT не делает никакой внутренней инициализации. Оставлять его пустым совершенно нормально. Возможно, по ходу развития прикладной программы, возникнет нужда делать некие подготовительные/инициализационные вычисления, тогда он и пригодится.


Какие операции при этом остаются "за сценой" от прикладника? как осуществляется выход из подобной "вложенности" при наступлении условия перехода на следующий внешний шаг? вложенная структура успевает доработать или же прерывается?
Если внешний SFC POU ушел на другой шаг, то вложенный SFC POU просто перестает вызываться и более ничего. В итоге 1) он естественно не доработает свою задержку 2) при повторном вызове (когда внешний SFC POU опять придет на шаг, где он вызывается), то пойдет он не с INIT, а с того места, где был брошен.

Если надо чтобы внешний SFC работал с оглядкой на внутренний, то лучше во внутреннем POU сделать некий выход-флаг (типа – Рядовой Петров стрельбу закончил!) и завязать его в разрешении перехода внешнего POU.

незарегистрированный
19.06.2008, 10:18
В CoDeSys 2.3 есть такая тонкость: в шаге INIT "step attributes" использовать нельзя.
Странно. У Lenze в их Drive PLC developer studio (их вариант codesys) шаг INIT можно задавать, там даже примеры фирменные были: POU для работы с блоками распределенного ввода-вывода. Заданная время "простоя" INIT требовалось для аппаратной инициализации CANbus.


Если внешний SFC POU ушел на другой шаг, то вложенный SFC POU просто перестает вызываться и более ничего. В итоге 1) он естественно не доработает свою задержку 2) при повторном вызове (когда внешний SFC POU опять придет на шаг, где он вызывается), то пойдет он не с INIT, а с того места, где был брошен.

внешнего POU.

А что делать, если в ситуации, описанной Вами в пункте 2, требуется начать с INIT, а не с того места, где он был брошен?

Kiselev
19.06.2008, 10:21
В CoDeSys 2.3 есть такая тонкость: в шаге INIT "step attributes" использовать нельзя.
Странно. У Lenze в их Drive PLC developer studio (их вариант codesys) шаг INIT можно задавать, там даже примеры фирменные были: POU для работы с блоками распределенного ввода-вывода. Заданная время "простоя" INIT требовалось для аппаратной инициализации CANbus.



Если внешний SFC POU ушел на другой шаг, то вложенный SFC POU просто перестает вызываться и более ничего. В итоге 1) он естественно не доработает свою задержку 2) при повторном вызове (когда внешний SFC POU опять придет на шаг, где он вызывается), то пойдет он не с INIT, а с того места, где был брошен.

внешнего POU.

А что делать, если в ситуации, описанной Вами в пункте 2, требуется начать с INIT, а не с того места, где он был брошен?

Игорь Петров
19.06.2008, 11:36
Странно. У Lenze...
Вполне возможно, они поправили эту 'особенность' в своей системе исполнения. Однако в других контроллерах с CoDeSys нельзя гарантировать, что так будет работать.:rolleyes:


А что делать, если в ситуации, описанной Вами в пункте 2, требуется начать с INIT, а не с того места, где он был брошен?
Хорошие методы:
1) проработать алгоритм так чтобы такая нужда не возникала
2) дать доработать вложенному POU так, чтобы он сам дошел на 'правильный' шаг прежде чем выдаст наверх флаг готовности (см. выше).
3) составить этот POU так, чтобы после отработки таймаутов он сам бы доходил до на INIT. Тогда при повторном вызове если время таймеров к этому моменту вышло, то он автоматом сразу прошагает куда надо. Таймеры идут даже если блок не вызывается – время остановить нельзя.

Кривой метод: сбросить извне вложенный POU вызвав его со взведенным флажком SFCInit

Kiselev
19.06.2008, 13:01
2 Игорь Петров

Если мы начали рассматривать особенности SFC, то интресует также следующие моменты:

1. Входные\выходные действия шага идендичны по своей сути схеме: шаг (действие, соотв. входному) ->true->основной шаг (действие)-какое-то условие-шаг (действие. соотв. выходному)->true?

2. В мануале Codesys_v23_ru написано:
"SFC POU состоит из набора шагов, связанных переходами. Существуют 2 вида шагов:
· Шаг простого типа (упрощенный SFC) может включать единственное действие. Графический фла-
жок (небольшой треугольник в верхнем углу шага) показывает, пустой шаг или нет.
· МЭК шаг (стандартный SFC) связан с произвольным числом действий или логических переменных.
Связанные действия располагаются с правой стороны от шага."

Я использую упрощенный SFC (галочка "use IEC-steps" не стоит), но внутри шага могу задавть сколь угодно много лог.переменных и действий. Или я что-то не то делаю? или так и должно быть. ТОгда в чем закючается "use IEC-steps"?

Игорь Петров
19.06.2008, 15:24
Входные\выходные действия шага идендичны по своей сути схеме: шаг (действие, соотв. входному) ->true->основной шаг (действие)-какое-то условие-шаг (действие. соотв. выходному)->true?
Непонятная схема...
Шаг с входным и выходным действием – это как бы маленькая вложенная вспомогательная SFC диаграмма из 3х шагов. Входное (Init), основное и выходное, оно срабатывает когда переход уже разрешен.

Реально внутри SFC исполнителя каждому шагу соответствуют 2 переменных. Первая StepName.x меняется при активации и деактивации соответствующего шага. Вторая StepName._x в каждом цикле вызова POU тупо копируется из первой. Далее в каждом цикле для каждого шага исполнитель смотрит если:

x = FALSE, _x = FALSE, то ничего не делать
x = TRUE, _x = FALSE, то вызвать входное действие
x = TRUE, _x = TRUE, то вызвать основное действие
x = FALSE, _x = TRUE, то вызвать выходное действие


Я использую упрощенный SFC (галочка "use IEC-steps" не стоит), но внутри шага могу задавть сколь угодно много лог.переменных и действий
:rolleyes: Не может этого быть!
Вероятно имеется в виду что внутри основного действия шага можно написать много всяких команд, влияющих на много всяких переменных? Но это одно действие, оно всегда выполняется одним сплошным куском за один цикл вызова. Никаких более хитрых условий тут быть не может. Например, я могу захотеть, чтобы некоторое действие (связанное с данным шагом) было выполнено через 10 сек. после того как данный шаг потеряет активность. В упрощенном SFC это не возможно, в полном МЭК элементарно. Там действия пририсованы справа от шага и их действительно может быть много и разных. Подробнее см. манул раздел 'Шаг МЭК' и 'Классификаторы действий'.

Kiselev
19.06.2008, 15:42
Непонятная схема...

:rolleyes: Не может этого быть!
Вероятно имеется в виду что внутри основного действия шага можно написать много всяких команд, влияющих на много всяких переменных? Но это одно действие, оно всегда выполняется одним сплошным куском за один цикл вызова. .
Спасибо, здесь и крылась моя ошибка. я думал, что действие-это какая либо операция с переменными. Хотя неоднократно читал про типы действий (ипмульсное, с запаздыванием и т.д.) Но никак почему не мог это до конца осознать:) .

Kiselev
19.06.2008, 15:54
Непонятная схема...
Например, я могу захотеть, чтобы некоторое действие (связанное с данным шагом) было выполнено через 10 сек. после того как данный шаг потеряет активность. В упрощенном SFC это не возможно, в полном МЭК элементарно.
Игорь, но описанную Вами ситуацию можно реализовать и упрощенным SFC, используя дополнительный шаг, принимающий маркер после того, как описанный Вами шаг потеряет активность, и содержащий в себе одно действие-вызов экземпляра TON. Далее ставим условие: достижение таймера своих заданных 10 сек и переход на новый шаг, в котором будет произведено "некоторое действие".
Т.е. в итоге немного громоздко, но задача решена, верно?

Игорь Петров
19.06.2008, 16:16
...немного громоздко, но задача решена, верно?
Нет. Я же хочу чтобы эти 10 секунд диаграмма не стояла, а продолжала ходить по куче всяких других шагов и выполнять кучу всякой другой нужной работы. В упрощенном SFC для этого придется делать параллельную всем другим ветку с отслеживанием этого таймера или всовывать эти проверки в другие шаги. Если мне это нужно в нескольких шагах, то придется делать ветки параллельные тем параллельным которые... я уже запутался в этой лапше. В полном SFC я просто вставлю в шаг 1 доп. действие с соотв-м классификатором. Все дела касающиеся работы данного шага будут у меня просто и компактно к нему прилеплены. Даже случись нужда (тфу, тфу, тфу) 1 Января с утра, я смогу разобраться, как это работает :D

Kiselev
19.06.2008, 16:45
Нет. Я же хочу чтобы эти 10 секунд диаграмма не стояла, а продолжала ходить по куче всяких других шагов и выполнять кучу всякой другой нужной работы. В упрощенном SFC для этого придется делать параллельную всем другим ветку с отслеживанием этого таймера или всовывать эти проверки в другие шаги. Если мне это нужно в нескольких шагах, то придется делать ветки параллельные тем параллельным которые... я уже запутался в этой лапше. В полном SFC я просто вставлю в шаг 1 доп. действие с соотв-м классификатором. Все дела касающиеся работы данного шага будут у меня просто и компактно к нему прилеплены. Даже случись нужда (тфу, тфу, тфу) 1 Января с утра, я смогу разобраться, как это работает :D

Но не противоречит ли данный подход (выполнения действия шага без однозначной привязки к управляющему маркеру) самому подходу подобного (SFC, Petri Nets) программирования. где ключевым понятием является связка "шаг-действие-переход" и управляющий маркер?

Игорь Петров
19.06.2008, 20:21
Но не противоречит ли данный подход (выполнения действия шага без однозначной привязки к управляющему маркеру) самому подходу подобного (SFC, Petri Nets) программирования. где ключевым понятием является связка "шаг-действие-переход" и управляющий маркер?
:confused: Философский вопрос…

Выходы ПЛК можно включать/выключать в разных шагах, при этом будут активироваться/деактивироваться некие механизмы и 'нечто' делать сами (как бы аппаратно определенные действия). Это нормально? Это связано с маркерами? Вероятно, да.

Теперь допустим, мы хотим этим 'нечто' управлять с контроллера более детально. Вместо сущности 'переменная' введем сущность работа или 'действие', которое можно точно также включать/выключать в разных шагах. В МЭК SFC примитивным действием может быть переключение логической переменной (имя BOOL переменной можно в лоб писать вместо имени МЭК действия), но мы имеем замечательную возможность наполнить действие чем-либо более программно сложным. Есть ли большая разница между включением/выключением по маркерам переменных и действий? Практически никакой.

Действия МЭК – это довольно самостоятельные сущности, их можно запускать и останавливать, как и некие внешние устройства. Маркер же действительно ходит по шагам и управляет МЭК действиями, как директор фирмы разными отделами и их работами. Сотрудники не должны все бросать, если директор ушел.

При этом подходе, глядя на SFC схему мы не должны брать в голову, что делается внутри каждого действия. Этого SFC схема не описывает. Она активирует и деактивирует действия в нужных шагах, в нужное время. Ключевым является 'шаг-условие-переход'. Действия (переменные) – это только инструмент исполнения решений SFC.

Kiselev
20.06.2008, 11:09
2Игорь Петров

Да,я понимаю о чем вы говорите. И с практически (а может и полностью) с Вами согласен. Просто меня смущает следующее: Я начал активно примять SFC в своих проектах после того, как начал копатьсяв теме конечных автоматов, диаграмм состояний и т.д. Т.е. для меня SFC на сегодняшний день это компромисс между своими старыми решениями в области программирования прикладных программ ПЛК (причем не только в среде Codesys, но и массе МЭК-экзотики) и пока еще не освоенной (по крайней мере на том уровне,чтобы можно было применять в коммерческих проектах) switch-технологии. Т.е. я пытаюсь при помощи SFC создать некую структуру (не знаю корректно ли нызывать ее автоматом) с заданным и определенным количеством состояний, чтобы исключить неоднозначность как на программном уровне, так и на уровне документирования\сопровождения\модернизации проекта. Все чаще приходится работать над проектами совместно с кем-то, очень трудно разбираться в чужом коде, тем более когда решения скажем, мягко, "не тривиальны". Вот и пытаюсь выработать некий "стандард" (хотя бы в рамках своей фирмы) для написания\сопровождения плк-программ.

Потому меня и смущает эта неоднозачность с МЭК-дейсвиями. Но будем разбираться, копать дальше:-)

gtfox
25.12.2011, 11:39
2Игорь Петров

и пока еще не освоенной (по крайней мере на том уровне,чтобы можно было применять в коммерческих проектах) switch-технологии.


для этого появился конвертер http://www.owen.ru/forum/showthread.php?p=74646#post74646