CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Сб июн 24, 2017 1:20 pm

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 47 сообщений ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
СообщениеДобавлено: Ср июл 13, 2011 9:09 pm 
Не в сети

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

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


Вернуться к началу
СообщениеДобавлено: Ср июл 13, 2011 9:13 pm 
Не в сети

Зарегистрирован: Пт апр 22, 2011 8:46 am
Сообщения: 20
это, на всякий случай, что у меня получилось


Вложения:
опять светофор 1, SFC.pro [18.7 КБ]
182 скачивания
Вернуться к началу
СообщениеДобавлено: Чт июл 14, 2011 7:15 am 
Не в сети

Зарегистрирован: Пт апр 22, 2011 8:46 am
Сообщения: 20
Но:
Цитата:
А если таких светофоров сто или тысяча и с разными временами.

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

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


Вернуться к началу
СообщениеДобавлено: Чт июл 14, 2011 10:08 am 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Дмитрий К писал(а):
это, на всякий случай, что у меня получилось

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

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

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

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


Вернуться к началу
СообщениеДобавлено: Чт июл 14, 2011 10:24 am 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Дмитрий К писал(а):
Однако, как быть в SFC, если одновременно должны работать несколько светофоров в разных, по времени, циклах??

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

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


Вернуться к началу
СообщениеДобавлено: Чт июл 28, 2011 1:39 pm 
Не в сети

Зарегистрирован: Пт апр 22, 2011 8:46 am
Сообщения: 20
Вот такая получилась программка. Не знаю, все ли в ней хорошо. Хотелось, чтобы в основной программе отражалась работа всех светофоров. Включаются они одной кнопкой Tumbler.
Игорь, а почему в режиме эмуляции маркер не каждый раз проходит через Init, а один раз в несколько циклов?


Вложения:
ST, светофоры.pro [23.89 КБ]
148 скачиваний
Вернуться к началу
СообщениеДобавлено: Чт июл 28, 2011 1:52 pm 
Не в сети

Зарегистрирован: Пт апр 22, 2011 8:46 am
Сообщения: 20
Уже понял, что поспешил).
У меня из основной программы можно изменять времена циклов, но, нельзя изменять длительности каждого из цветов.


Вернуться к началу
СообщениеДобавлено: Пт июл 29, 2011 9:30 am 
Не в сети

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


Вложения:
ST, светофоры.pro [23.88 КБ]
144 скачивания
Вернуться к началу
СообщениеДобавлено: Вс июл 31, 2011 3:33 pm 
Не в сети

Зарегистрирован: Вт дек 14, 2010 1:24 pm
Сообщения: 13
Цитата:
Далее в переходах используем внутренне время активности шага. Например: Red.t > T#1s.

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

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


Вернуться к началу
СообщениеДобавлено: Вс авг 07, 2011 3:24 am 
Не в сети

Зарегистрирован: Вс июл 24, 2011 3:32 am
Сообщения: 0
Спасибо за доходчивое объяснение.

Только 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-переход, при этом активный шаг помечаем (с него начинаем выполнение со следующего цикла).

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


Вернуться к началу
СообщениеДобавлено: Вт авг 09, 2011 1:25 pm 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Yougi писал(а):
Цитата:
Для МЭК шагов определена переменная <StepName>.t (<StepName>.t служит для внутренних целей).

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

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


Вернуться к началу
СообщениеДобавлено: Вт авг 09, 2011 1:53 pm 
Не в сети
Site Admin

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

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


Вернуться к началу
СообщениеДобавлено: Вт авг 09, 2011 2:47 pm 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
codemo писал(а):
(1 цикл) выполняется Init, выполняется условие перехода после Init, выполняется Green...

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

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

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

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


Вернуться к началу
СообщениеДобавлено: Вт авг 09, 2011 8:21 pm 
Не в сети

Зарегистрирован: Вс июл 24, 2011 3:32 am
Сообщения: 0
т.е. такое разбиение потока управления - решение проблемы кооперативной многозадачности: мы работаем по тикам тактирования, и чтобы это занимало минимум времени - единицей исполнения в цикле является на вся 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.


Вернуться к началу
СообщениеДобавлено: Ср авг 10, 2011 12:18 am 
Не в сети

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

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 47 сообщений ]  На страницу Пред. 1 2 3 4 След.

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB