Данный CODESYS форум содержит архивную копию русской ветви только для чтения. Для создания сообщений пожалуйста используйте актуальную международную платформу CODESYS Forum. Close

Для начинающих. Почему SFC именно такой?

2011-06-07
2012-07-08
<< < 1 2 (Page 2 of 2)
  • Igor Petrov

    Igor Petrov - 2011-08-09

    Yougi писал(а):

    См. хелп тщательнее, мы используем <stepname>.t , а еще есть <stepname>._t (с подчеркиванием) она и служит для внутренних целей. </stepname></stepname>

    Писать в <stepname>.t в программе я бы очень не советовал. Запись разрешена в отладочных целях. Например, можно отладчиком ускорить или затянуть прохождение шага.</stepname>

     
  • Igor Petrov

    Igor Petrov - 2011-08-09

    codemo писал(а):
    Только SFC на этой диаграмме не рабочий:
    l viewtopic.php?p=2362#p2362 l
    т.к. условие перехода в самом низу (tProcessTime > T#4s) никогда не выполнится, т.к. MyTime зацикливает tProcessTime по модулю 4s.

    Тут хотелось показать последовательно пример в развитии с минимальными правками. Код примера работает. Рабочий цикл задачи у меня стоит 20 мс. В каждом цикле опрашиваем таймер. Получается, что его значения будут прыгать дискретно. В некой очередной итерации там будет 4 с копейками секунды. Переход SFC сработает. Конечно, существует некая вероятность попасть ровно на 4:00.00 и застрять. Вы правы, в реальной программе таких фокусов лучше избегать.

     
  • Igor Petrov

    Igor Petrov - 2011-08-09

    codemo писал(а):
    (1 цикл) выполняется Init, выполняется условие перехода после Init, выполняется Green...

    Ой, стоп, стоп.. 1 цикл выполняется только часть Инита (входное действие) и больше ничего!

    Это типовая ошибка N1 в понимании работы SFC. В отличие от программ на других языках, SFC программа не выполняется целиком каждый рабочий цикл!!! Так задумано. Это самое главное, что я пытался объяснить выше

    В каждом цикле вызова SFC работают только шаги, имеющие маркер. Все прочие можете закрыть бумагой и не смотреть. Работать в текущем цикле они не будут! Если шаг только получает активность, то в первом цикле вызова будет выполнено входное действие. На этом все, до свидания, конец рабочего цикла. Затем рабочее действие. Затем выходное, если оно есть. Даже если в переходе стоит константа TRUE, то это тоже упор выполнения. Исполнитель SFC должен прокрутить все действия шага. Это минимум 2 цикла. Цикл вызова – это такт, по которому происходит переключение с шага на шаг. Чаще никак.

    Мало того, в CoDeSys можно для каждой SFC подпрограммы индивидуально включить режим внешнего тактирования. Например, могу давать такты по кнопке оператора. Тогда даже если переход TRUE, то шаг будет крутить свои действия бесконечно, пока оператор не нажмет кнопку.

     
  • codemo

    codemo - 2011-08-09

    т.е. такое разбиение потока управления - решение проблемы кооперативной многозадачности: мы работаем по тикам тактирования, и чтобы это занимало минимум времени - единицей исполнения в цикле является на вся SFC и даже не один шаг, а его состовляющие: enter/run/exit (CoDeSys) и action (IEC).

    ещё вопросы - по actions (из стандарта IEC).
    1) в какой последовательности вызываются actions (я так понимаю - в той последовательности, в которой они объявлены в шаге).
    2) в какой последовательности вызываются actions вместе с enter/run/exit CoDeSys. actions выполняются в рабочем цикле? Что раньше - actions или код рабочего цикла?
    3) actions (IEC) на самом деле не вызовы, а установка флага - следует ли вызывать action и когда? т.е. если в шаге есть три action (IEC):
    N a()
    N b()
    N a()
    то в цикле n будет вызов a(), в n+1 - b(), n+2 - a(),
    но если в параллельном шаге есть запрет a():
    R a()
    то в нашем шаге a() не выполнится?

    А вообще, SFC - красивая вещь, только по-моему неудачно состыковали действия CoDeSys и IEC, лучше бы может быть добавили специальные классификаторы для разовых enter и exit.

     
  • codemo

    codemo - 2011-08-10

    В учебнике классификатор P описан как импульсный с двумя вызовами - один раз при активации и второй раз при деактивации шага. Я же по trace наблюдаю, что как для переменной, так и для вызова кода action, происходит два вызова в подряд идущих тиках. Но при этом переменной дёргается TRUE/FALSE, для вызова кода же (который тоже вызывается два раза) step.x и step._x всегда равен TRUE. т.е. в коде action нет возможности определить фронт активности задачи, хотя по переменной action - можно.
    Это не совпадает с графиком для P из учебника.

    Кстати, есть ли возможность вывода какой-то отладочной информации например в ST?

     
  • Igor Petrov

    Igor Petrov - 2011-08-10

    codemo писал(а):
    т.е. такое разбиение потока управления - решение проблемы кооперативной многозадачности...

    Этот вопрос выше уже рассматривался. Конечный автомат никак не связан ни с какими циклами или временами. Понятия времени в нем нет вообще. Теоретически, он мгновенно переходит из состояния в состояние. Практически в SFC дайте каждому шагу покрутиться как минимум несколько циклов вызовов. Делаем цикл вызова SFC минимум раз в 5 выше, чем нужное время переключения состояний и выбрасываем из головы все детали внутренней реализации. Каждый шаг – это некоторая работа, которая требует выполнения. SFC работает как человек. Есть дела: подогреть испаритель, продуть камеру, выйти на режим и пр. Каждое дело требует определенных действий и времени. О переключениях в рамках одного рабочего цикла тут думать не приходится. Это другая философия. Для этого есть ST , LD и FBD.

    codemo писал(а):
    в какой последовательности вызываются actions

    Если уж интересно залезать в такие тонкости, то давайте рассмотрим. Внутри каждого цикла вызова МЭК SFC исполнитель работает так: проходим по списку шагов, выбираем активные (имя шага.X = TRUE). Для них оцениваем условия переходов и вносим результаты в список. Оцениваем действия активных шагов по классификаторам и соответственно меняем флажки в списке действий. Если шаг только что получил активность, то ставим флаг входного действия. Все, со всеми условиями разобрались и для шагов и для действий. Теперь переходим к полезной работе. Берем список действий. Он один на SFC программу. Действия в нем размещены в алфавитном порядке. Пошли по нему сверху. Выполняем по очереди все действия у которых взведен флаг.

    Теперь можете самостоятельно ответить на свои вопросы. Если в активных шагах параллельных ветвей одно действие включено 2 раза, то выполнится оно только 1 раз за цикл. Если оно включено и выключено, то оно выключено = не выполняется. Если по S включили некое действие, то оно будет вызываться всегда в каждом цикле, даже если активных шагов вообще нет. Убить его можно только по R.

    codemo писал(а):
    А вообще, SFC - красивая вещь, только по-моему неудачно состыковали действия CoDeSys и IEC, лучше бы может быть добавили специальные классификаторы для разовых enter и exit.

    Согласен. Этот вопрос выше уже рассматривался. Во второй версии стандарта МЭК предусмотрены классификаторы P0 и P1. Их надо поддержать в CoDeSys.

     
  • Igor Petrov

    Igor Petrov - 2011-08-10

    codemo писал(а):
    Кстати, есть ли возможность вывода какой-то отладочной информации например в ST?
    Например? Вопрос не понятен.

    codemo писал(а):
    В учебнике классификатор P описан как импульсный с двумя вызовами - один раз при активации и второй раз при деактивации шага.

    По классическим западным учебникам так и по первой версии стандарта МЭК так. Но, там есть маленькое примечание, что можно и так:

    codemo писал(а):
    два вызова в подряд идущих тиках. Но при этом переменной дёргается TRUE/FALSE

    В CoDeSys все МЭК действия вызываются повторно при деактивации самого действия. Об этом есть примечание в документации.

    Это относится и к P. Оно активируется в начале шага и сразу, в следующем же цикле деактивируется. Имеем 2 вызова. Переменная ходит FALSE-TRUE-FALSE = дает 1 импульс.

    Увы, SFC не идеал, как и все другие языки

    Я бы внес в SFC несколько улучшений. В частности: обработку исключений, групповые переходы и параллельный старт. Но, это будет уже совсем новый язык программирования, который поднимается на уровень выше стандарта МЭК. Вместе с еще двумя новыми языками он скоро появится в CoDeSys V3.

     
  • codemo

    codemo - 2011-08-10

    В алфавитном порядке...
    Получается, упорядочивать действия надо на уровне последовательности шагов в SFC, а не последовательности действий в шаге.

    Цитата:
    Например? Вопрос не понятен.

    Конкретный пример: пытался выяснить - в какой последовательности вызываются действия enter/exit и МЭК, для этого пришлось извращаться - в каждом отслеживаемом действии переключаю глобальные логические переменные и смотрю их трассировку. Проще было бы чтобы была функция вроде log("enter called"), которая выводит строку в отладочный лог, который виден например только в CoDeSys.

    Кстати, этим извращённым спомобом выяснил, что шаг с непустыми enter/inside/exit и набором N-действий МЭК с небольшим ожиданием на пороге условия выполняется по циклам так:
    - в первом цикле выполняется входное, внутреннее, и все МЭК N-действия (в каком именно порядке - не удалось выяснить).
    - в последующих циклах выполняется только внутреннее действие шага (не МЭК)
    - на последнем шаге выполняется выходное и все МЭК N-действия.
    (действия у меня были простые - на ST просто переключали глобальные логические переменные)

     
  • Igor Petrov

    Igor Petrov - 2011-08-11

    codemo писал(а):
    Получается, упорядочивать действия надо на уровне последовательности шагов в SFC, а не последовательности действий в шаге.

    Конечно. Одинаковые действия в SFC могут быть привязаны к разным шагам. Эти шаги могут быть одновременно активны. Но, одно действие обязано отработать 1 раз в цикл, даже если оно активируется в сотне параллельных веток. Иначе, будет ужас.

    При программировании на SFC мы считаем, что все активные действия работают параллельно. Как внутри устроен планировщик нас интересовать не должно. На определенном железе это может быть реально распараллелено. Естественно, внутренне устройство совсем не простое, хитростей там хватает.

    codemo писал(а):
    пытался выяснить - в какой последовательности вызываются действия..

    Каждый шаг имеет переменные x и _x. Их можно использовать для трассировки. Аналогично есть FB логики действия. См. ‘Механизм управления действием’ в книжке.

     
  • sheGE

    sheGE - 2011-08-29

    по поводу "автоматного подхода" на CASE - это реальная программа или заготовка для наглядности? а то мне стало интересно этот кусок кода на ST проэмулировать, но при этом только тикает tProcesstime а состояния iState не меняются. что тут не так?

     
  • Igor Petrov

    Igor Petrov - 2011-08-29

    sheGE писал(а):
    ...тикает tProcesstime а состояния iState не меняются. что тут не так?

    Тут надо в иниц-и iState = 1; поставить, тогда автомат стартует.

     
  • sheGE

    sheGE - 2011-08-30

    инициализация это на SFC, насколько я понимаю. а у меня главная программа на ST, где тут поставить iState=1?

     
  • Igor Petrov

    Igor Petrov - 2011-08-31

    sheGE писал(а):
    инициализация это на SFC, насколько я понимаю. а у меня главная программа на ST, где тут поставить iState=1? посмотрите, пожалуйста.

    1) Прямо в объявлении переменной: iState: INT := 1;
    Или меняем переменную в отладчике для старта автомата.
    Или в CASE дописываем ELSE iState: INT := 1;

    2) Посмотрите внимательно на код примера и на свой код. В примере для каждого состояния прописан IF, который переводит автомат в другое состояние. Как только условие ухода выполнилось, прыгаем дальше, из 1 в 2 и др. У вас из 1 происходит переключение в 1. Т.е. никогда никуда не переходим

     
  • sheGE

    sheGE - 2011-09-01

    все заработало, удивительным образом, я только tProcesstime увеличил в 2 раза для наглядности. . Спасибо.

    автомат на CASE.pro [29.44 КБ]

     
  • drvlas

    drvlas - 2011-09-13

    Igor Petrov писал(а):
    http://ru.wikipedia.org/wiki/Автоматное_программирование

    Игорь, Вы не включили "Автоматное программирование" в тег. Ссылка ведет в начальную страницу Википедии. Тоже интересно, но требовалось не то

     
  • Igor Petrov

    Igor Petrov - 2011-09-13

    Спасибо, знаю. Не берет движок Кириллицу в ссылку Надо выделять и копировать в строку ввода.

     
  • Anonymous - 2012-01-08

    Originally created by: Дмитрий К

    Игорь, подскажите, пожалуйста.
    Ставлю МЭК-действие с SL-классификатором: включение и выключение через заданный промежуток времени BOOL-переменной (пример в файле). Все работает должным образом только при первом прохождении маркера через соответствующий шаг. При последующих активизациях шага действие не активируется, переменная не включается.
    Добиться, чтобы переменная включалась/выключалась повторно можно только «приклеив» в одном из последующих шагов для нее действие с классификатором «R».
    Что я не правильно понимаю в работе классификатора "SL"? Или, где ошибка?
    Кстати, условно аналогичный классификатор «L» работает у меня в программе как и описано в инструкции (т.е., сбрасывать его дополнительно не нужно).

    SFC РАБОТА ЭЛЕМЕНТОВ_2.pro [17.16 КБ]

     
  • Igor Petrov

    Igor Petrov - 2012-01-10

    По документации действие SL активируется на заданное время. Это обязано быть так при любых обстоятельствах. Проверим?

    В Вашей программе действие отрабатывает 5 секунд. Измените программу любым способом. Например:

    1. Поставьте FALSE после Step1. Программа застрянет на этом шаге бесконечно. Но, действие SL отработает 5 секунд.

    2. Поставьте в своей программе все условия переходов TRUE. Теперь SFC программа прошагает сотни раз за секунду. Но, действие SL отработает 5 секунд.

    Все четко.

    S в любых комбинациях требует сброса по R.

     
  • Anonymous - 2012-01-10

    Originally created by: Дмитрий К

    Понятно) Спасибо!

     
  • Anonymous - 2012-04-10

    Originally created by: Дмитрий К

    Игорь, подскажите, пожалуйста, правильно ли я понимаю, что из SFC-программы или SFC-функционального блока нельзя вызвать отдельный функциональный блок? В SFC подпрограмма может существовать только как действие и т.о., в SFC-программе возможен только один подуровень – в виде действия?
    Хотя, SFC не скрывает возможность создания функционального блока. Или, это сделано для каких-то других типов взаимодействий? Через глобальные переменные, например?

     
  • Igor Petrov

    Igor Petrov - 2012-04-11

    Откуда конкретно из SFC требуется вызывать ФБ? Что мешает из действия вызвать ФБ, написанный на SFC? Из его действия другой ФБ на SFC и так на любую глубину?

     
  • Anonymous - 2012-07-08

    Originally created by: Дмитрий К

    Игорь, поясните, пожалуйста.
    Программа в ST. В ней главный функциональный блок в SFC. Ему подчиняется функциональный блок - тоже в SFC. В режиме эмуляции работа главного ФБ отображается как положено (маркер бегает), но, когда в главном блоке включается подчиненный ему ФБ, то работа его (подчиненного) не отображается (маркер «висит» в Init). Хотя, он работает! Это видно из того, что он включает соответствующие переменные и условие перехода к следующему шагу главного ФБ заложено в нем.
    Здесь ошибка моя или программы? На всякий случай скажу: перезагружать программу пробовал; в других своих подобных программах такого явления не наблюдал.

     
<< < 1 2 (Page 2 of 2)