Сообщение от
SKV
Хочу добить тему организации опроса в одной задаче или в разных.
Опишу все еще раз, но по-другому.
Исходные данные следующие:
1. Количество модулей 10 шт. (все те же);
2. Время достаточное для опроса модуля по сети Modbus - 10 мс. Еще раз поясню, что за время я имею ввиду. Если я на N-ном цикле вызову, например, ФБ MB_RD_HOLD_REGS, то на цикле N+1, отстоящим от него на 10 мс (или более) выход Complete установится в true. Мои расчеты (см. выше) показывают, что 10 мс должно хватать (то же говорит и Валенок:"Почти всегда 3-10мс.").
3. Среднее время выполнения программы - 50 мс. Под этим временем понимается, то усредненное время, которое необходимо для выполнения всех операторов логики управления. Мне кажется, что для программы которая обрабатывает 10 модулей ввода/вывода, это вполне реальная величина.
4. Модули равнозначны по важности, поэтому - 5-й пункт.
5. Опрос модулей организован последовательно от 1 к 10-му. За опрос отвечают некие ФБ модулей. Так как ФБ модули используют общий ресурс - порт, то необходимо предусмотреть некий механизм, который определяет какой ФБ модуль сейчас занимает порт. Назовем условно этот механизм передачей маркера опроса.
Первый вариант. Все в одной задаче.
PROGRAM PLC_PRG
ФБМодуля1(); (* у кого маркер опроса тот исполняется *)
...
ФБМодуля10(); (* а так if not marker then exit; *)
ФБЛогики управления();
Второй вариант. Две разные задачи с разными циклами исполнения.
В это варианте изменен цикл вызова задачи управления. Он сделан равным 60 мс, т.е. с запасом от среднего времени выполнения - 50 мс.
PROGRAM Module_PRG (* циклическая интервал 10мс *)
ФБМодуля1(); (* у кого маркер опроса тот исполняется *)
...
ФБМодуля10(); (* а так if not marker then exit; *)
PROGRAM PLC_PRG (* циклическая интервал 60мс *)
ФБЛогики управления();
Теперь рассмотрим какое будет время реакции на событие в первом и во втором варианте.
Событием будем считать выход некоторого аналогового параметра за технологическую норму. Пусть данный технологический параметр привязан к первому модулю. Событие происходит удачно, как раз перед отправкой запроса в модуль.
За время реакции будем считать время от события до выдачи сигнала с 10-го модуля вывода на исполнительный механизм (ИМ).
Из прикрепленного рисунка хорошо видно, что время реакции в первом случае 450 мс, во втором 100 мс.
Что на мой взгляд существенно.
Другое дело, что если система небольшая, количество модулей 1-2, а время выполнения программы 5-10 мс, то все это безусловно теряет смысл.