Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: тонкости вложенных шагов Sfc

  1. #1

    По умолчанию тонкости вложенных шагов Sfc

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

  2. #2

    По умолчанию

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

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

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

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

  3. #3
    незарегистрированный
    Гость

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    В 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, а не с того места, где он был брошен?

  4. #4

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    В 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, а не с того места, где он был брошен?

  5. #5

    По умолчанию

    Цитата Сообщение от Kiselev Посмотреть сообщение
    Странно. У Lenze...
    Вполне возможно, они поправили эту 'особенность' в своей системе исполнения. Однако в других контроллерах с CoDeSys нельзя гарантировать, что так будет работать.

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

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

  6. #6

    По умолчанию

    2 Игорь Петров

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

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

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

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

  7. #7

    По умолчанию

    Цитата Сообщение от Kiselev Посмотреть сообщение
    Входные\выходные действия шага идендичны по своей сути схеме: шаг (действие, соотв. входному) ->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, то вызвать выходное действие

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

  8. #8

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    Непонятная схема...

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

  9. #9

    По умолчанию

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

  10. #10

    По умолчанию

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

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •