CODESYS форум
https://forum-ru.codesys.com/

Для начинающих. Почему SFC именно такой?
https://forum-ru.codesys.com/viewtopic.php?f=8&t=1079
Страница 2 из 4

Автор:  Дмитрий К [ Ср июл 13, 2011 9:09 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Игорь, 100% понятно!! Очень здорово Вы расписали. Большое спасибо! Многое я уже именно так себе и представлял, однако, очень полезно было пройтись столь последовательно и в различных вариантах кодирования одного и того же процесса. Сразу все еще более прояснилось.
Программу «светофор» проштудировал в 2-х вариантах: один - как Ваш последний; второй – МЭК– вариант с параллельной ветвью и МЭК действием на ST. Все работает. Хотя, с таймером, закодированным <tmTimer(IN := tProcessTime < T#4s, ET => tProcessTime);> немного провозился, т.к., в режиме эмуляции он вяз в последнем шаге. В конце концов, методом «тыка» добавил знак «=» после знака «<» и – ура!! - все поехало!!))). Хотя, не знаю, действительно ли правильно поступил, т.к., не очень понимаю, почему таймер в данном случае работает именно так. Ведь, в описании к CoDeSys такого способа кодирования TON, вроде бы, не дается. Впрямую, по крайней мере. Или я чего-то не углядел… :?
Цитата:
В V3 самостоятельно изучите тему Макросов. Попробуйте левую ветку с шагами светофора разместить в макрос.

Пока, к сожалению, не добрался ни до V3, ни до макросов. Поскольку начал я с V2, то думал, что, для начала, быстрее будет разобраться в уже знакомом продукте. Хочется ведь скорее «в бой», применить, хоть что-нибудь, «на деле» :) . А времени на совершенствования, увы, жизнь оставляет совсем чуть-чуть)).

Автор:  Дмитрий К [ Ср июл 13, 2011 9:13 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

это, на всякий случай, что у меня получилось

Вложения:
опять светофор 1, SFC.pro [18.7 КБ]
675 скачиваний

Автор:  Дмитрий К [ Чт июл 14, 2011 7:15 am ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Но:
Цитата:
А если таких светофоров сто или тысяча и с разными временами.

Цитата:
В идеале, допустимое число разных вычислений (обслуживаний разных светофоров и пр.), в одной программе, которые делаются одновременно, должно стремиться к бесконечности. Соответственно время цикла должно стремиться к нулю.

Т.е., в нашем случае, если я правильно понял, можно запрограммировать в параллельных ветвях несколько светофоров, работа которых укладывается в цикл одного таймера.
Однако, как быть в SFC, если одновременно должны работать несколько светофоров в разных, по времени, циклах?? Ведь условие перехода для параллельных ветвей – одно. Они получаются замкнутыми друг на друга, по времени?

Автор:  Igor Petrov [ Чт июл 14, 2011 10:08 am ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Дмитрий К писал(а):
это, на всякий случай, что у меня получилось

Хорошо получилось.

Все верно. Далее в переходах используем внутренне время активности шага. Например: Red.t > T#1s. Таймер и его ветку выбрасываем совсем. Получается простейший вариант.

В V2.3 полноценный SFC. В V3 добавлены возможности изменять начальный шаг, макросы, редактор более ‘умный’. В V2.3 он просто не позволяет изменить схему так, чтобы ее структура стала неправильной. Это иногда удивляет. Пытаешься что-то сделать, а оно не делается. V3 делает и автоматически корректирует.

В начале я обещал рассказать, что мы обсуждали на конференции в этом году про SFC. По первой редакции стандарта МЭК, действие P вызывается дважды подряд. Если с P связана логическая переменная, то она сначала взводится, потом сбрасывается. Получается 1 импульс. Это хорошо. Но, двойной вызов это не всегда то, что хотелось бы. Кроме того, было бы удобнее использовать МЭК действия везде, в том числе для входного и выходного. Отсюда растет идея ввести дополнительно классификаторы P0 и P1 аналогичные входному и выходному. Вторая редакция стандарта МЭК их предусматривает.

Автор:  Igor Petrov [ Чт июл 14, 2011 10:24 am ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Дмитрий К писал(а):
Однако, как быть в SFC, если одновременно должны работать несколько светофоров в разных, по времени, циклах??

Делаем светофор функциональным блоком (ФБ). Времена циклов делаем входными переменными. В программе объявляем много экземпляров ФБ. Можно даже массив.

Отдельная тема – обработка ошибок и принудительное изменение поведения SFC POU. Можем позднее рассмотреть. Ничего хитрого. См. ‘Флаги SFC’. Рулить ими нужно из вызывающей программы. Отсюда растет правило: Не пишите PLC_PRG на SFC. Делайте отдельный ФБ или программу.

Автор:  Дмитрий К [ Чт июл 28, 2011 1:39 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Вот такая получилась программка. Не знаю, все ли в ней хорошо. Хотелось, чтобы в основной программе отражалась работа всех светофоров. Включаются они одной кнопкой Tumbler.
Игорь, а почему в режиме эмуляции маркер не каждый раз проходит через Init, а один раз в несколько циклов?

Вложения:
ST, светофоры.pro [23.89 КБ]
604 скачивания

Автор:  Дмитрий К [ Чт июл 28, 2011 1:52 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Уже понял, что поспешил).
У меня из основной программы можно изменять времена циклов, но, нельзя изменять длительности каждого из цветов.

Автор:  Дмитрий К [ Пт июл 29, 2011 9:30 am ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Вот, переделал)
Правда, возникает вопрос. Когда только включаю эмулятор, визуально, все 3 светофора начинают работать синхронно (в одном зеленый горит 1с, в другом -2с и т.д.), переключаясь одновременно, с разницей в секунды. Затем, эта синхронность нарушается. И, соответственно, это означает, что и время, по секундам, выдерживается лишь приблизительно.

Вложения:
ST, светофоры.pro [23.88 КБ]
570 скачиваний

Автор:  Yougi [ Вс июл 31, 2011 3:33 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Цитата:
Далее в переходах используем внутренне время активности шага. Например: Red.t > T#1s.

А в стрюкциях ( User Manual) написано
Цитата:
Для МЭК шагов определена переменная <StepName>.t (<StepName>.t служит для внутренних целей).

Или "для внутренних целей" означает, что в неё писать нельзя?

Автор:  codemo [ Вс авг 07, 2011 3:24 am ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Спасибо за доходчивое объяснение.

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

Есть вопрос по отображению работы SFC на реальный PLC.
Опишите циклы PLC для этого примера светофора. Какие шаги исполняются на каждом цикле PLC. Я предполагаю так:
(1 цикл) выполняется Init, выполняется условие перехода после Init, выполняется Green, условие перехода после Green не выполняется, поэтому помечаем шаг Green и выходим из цикла.
(2 цикл) начинаем выполнение с помеченного шага Green, выполняем его, условие перехода не выполняется, поэтому помечаем шаг Green и выходим из цикла.
(допустим 100 цикл) начинаем выполнение с помеченного шага Green, выполняем его, условие перехода выполняется (прошло больше 1 сек), выполняем блок Yellow, условие перехода после Yellow не выполняется, поэтому помечаем шаг Yellow и выходим из цикла.



т.е. насколько я понимаю, выполнение на каждом цикле начинается с последнего помеченного цилка, и продолжается до упора в false-переход, при этом активный шаг помечаем (с него начинаем выполнение со следующего цикла).

а что происходит при распараллеливании (ветвь)?

Автор:  Igor Petrov [ Вт авг 09, 2011 1:25 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

Yougi писал(а):
Цитата:
Для МЭК шагов определена переменная <StepName>.t (<StepName>.t служит для внутренних целей).

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

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

Автор:  Igor Petrov [ Вт авг 09, 2011 1:53 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

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

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

Автор:  Igor Petrov [ Вт авг 09, 2011 2:47 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

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

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

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

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

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

Автор:  codemo [ Вт авг 09, 2011 8:21 pm ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

т.е. такое разбиение потока управления - решение проблемы кооперативной многозадачности: мы работаем по тикам тактирования, и чтобы это занимало минимум времени - единицей исполнения в цикле является на вся 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 [ Ср авг 10, 2011 12:18 am ]
Заголовок сообщения:  Re: Для начинающих. Почему SFC именно такой?

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

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

Страница 2 из 4 Часовой пояс: UTC+01:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/