CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Вс июл 23, 2017 5:33 am

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




Начать новую тему  Ответить на тему  [ 47 сообщений ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
СообщениеДобавлено: Ср авг 10, 2011 10:05 am 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
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.


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

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
codemo писал(а):
Кстати, есть ли возможность вывода какой-то отладочной информации например в ST?
Например? Вопрос не понятен.

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

По классическим западным учебникам так и по первой версии стандарта МЭК так. Но, там есть маленькое примечание, что можно и так:
codemo писал(а):
два вызова в подряд идущих тиках. Но при этом переменной дёргается TRUE/FALSE


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

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


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

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


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

Зарегистрирован: Вс июл 24, 2011 3:32 am
Сообщения: 0
В алфавитном порядке...
Получается, упорядочивать действия надо на уровне последовательности шагов в SFC, а не последовательности действий в шаге.


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


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

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


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

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
codemo писал(а):
Получается, упорядочивать действия надо на уровне последовательности шагов в SFC, а не последовательности действий в шаге.

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

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

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

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


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

Зарегистрирован: Чт июн 02, 2011 2:42 pm
Сообщения: 0
по поводу "автоматного подхода" на CASE - это реальная программа или заготовка для наглядности? а то мне стало интересно этот кусок кода на ST проэмулировать, но при этом только тикает tProcesstime а состояния iState не меняются. что тут не так?


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

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
sheGE писал(а):
...тикает tProcesstime а состояния iState не меняются. что тут не так?

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


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

Зарегистрирован: Чт июн 02, 2011 2:42 pm
Сообщения: 0
инициализация это на SFC, насколько я понимаю. а у меня главная программа на ST, где тут поставить iState=1?


Вернуться к началу
СообщениеДобавлено: Ср авг 31, 2011 8:29 am 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
sheGE писал(а):
инициализация это на SFC, насколько я понимаю. а у меня главная программа на ST, где тут поставить iState=1? посмотрите, пожалуйста.

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

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


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

Зарегистрирован: Чт июн 02, 2011 2:42 pm
Сообщения: 0
все заработало, удивительным образом, я только tProcesstime увеличил в 2 раза для наглядности. :lol: . Спасибо.


Вложения:
автомат на CASE.pro [29.44 КБ]
123 скачивания
Вернуться к началу
СообщениеДобавлено: Вт сен 13, 2011 1:29 pm 
Не в сети

Зарегистрирован: Пт окт 15, 2010 2:40 pm
Сообщения: 7
Igor Petrov писал(а):
По автоматам см.: http://ru.wikipedia.org/wiki/Автоматное_программирование

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


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

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Спасибо, знаю. Не берет движок Кириллицу в ссылку :( Надо выделять и копировать в строку ввода.


Вернуться к началу
СообщениеДобавлено: Вс янв 08, 2012 6:14 pm 
Не в сети

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


Вложения:
SFC РАБОТА ЭЛЕМЕНТОВ_2.pro [17.16 КБ]
99 скачиваний
Вернуться к началу
СообщениеДобавлено: Вт янв 10, 2012 9:14 am 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
По документации действие SL активируется на заданное время. Это обязано быть так при любых обстоятельствах. Проверим?

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

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

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

Все четко.

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


Вернуться к началу
СообщениеДобавлено: Вт янв 10, 2012 3:34 pm 
Не в сети

Зарегистрирован: Пт апр 22, 2011 8:46 am
Сообщения: 20
Понятно) Спасибо!


Вернуться к началу
СообщениеДобавлено: Вт апр 10, 2012 1:20 pm 
Не в сети

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


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

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


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

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


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

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