DRAKON.SU https://forum.drakon.su/ |
|
Проблема с отображением алгоритмов реального времени https://forum.drakon.su/viewtopic.php?f=78&t=6068 |
Страница 3 из 3 |
Автор: | Владимир Ситников [ Суббота, 07 Октябрь, 2017 16:04 ] |
Заголовок сообщения: | Re: Проблема с отображением алгоритмов реального времени |
Сергей Ефанов писал(а): Порядок вызовов значения не имеет. Главное - все автоматы должны быть вызваны в КАЖДОМ цикле, и за один вызов любой автомат может совершить НЕ БОЛЕЕ ОДНОГО перехода. Средства их взаимодействия - несколько ОЧЕНЬ простых функций. Если автоматы обмениваются данными, то порядок играет значение. Например: Схема1 -- распознаёт одинарное и двойное нажатие Схема2 -- при двойном нажатии выключает свет. Если обрабатывать их в порядке Схема2, Схема1, то "Схема2" всегда будет работать "по старым данным", т.е. в систему добавляется задержка на ровном месте. |
Автор: | Владимир Паронджанов [ Суббота, 07 Октябрь, 2017 21:42 ] |
Заголовок сообщения: | Re: Проблема с отображением алгоритмов реального времени |
Владимир Ситников писал(а): Попробовал перерисовать, по-моему, так будет понятнее. Владимир, спасибо за подробный анализ и обширные комментарии.
............................................... |
Автор: | Владимир Ситников [ Понедельник, 09 Октябрь, 2017 21:40 ] |
Заголовок сообщения: | Re: Проблема с отображением алгоритмов реального времени |
Прикинул как может выглядеть та же задача в случае, если ST компилятор будет знать об операции "ПАУЗА" и транслировать код в автомат с разрывами по этим самым паузам. Вывод: 1) Само по себе "автоматическое преобразование последовательного кода в автоматную форму" удобно. Что на Драконе, что на "ST с паузами" получается понятный алгоритм. 2) Для данной задачи код на текстовом языке ST получается вполне понятным и логичным. Вполне возможно, что задача слишком простая и тут не видны отличия. 3) Нужно пробовать на других, более сложных задачах. 4) Добавил вариант на простом ST языке. Видно, там код получился совсем невыразительный. Т.е. автоматическая генерация автоматов действительно может упрощать написание и понимание кода. Стоит учитывать, что наверняка "разработчик алгоритма" и "программист" в случае ПЛК это одно и то же лицо. Т.е. вряд ли актуален сценарий, когда "инженер составляет алгоритм с пустыми иконами, а потом программист заполняет иконы кодом". В этом плане, если писать код сразу на ST, то видно куда перетекают данные (например, сразу видно где переменная с номером выбранного насоса). Код: PROGRAM Управление_Насосами VAR насос_качай : процесс запуск_насоса; WHILE TRUE WHILE NOT пуск (* ждём, когда нажмут кнопку *) ПАУЗА; END_WHILE ЗАПУСК_ПРОЦЕССА насос_качай; WHILE пуск (* ждём, когда отпустят кнопку *) ПАУЗА; END_WHILE ОСТАНОВ_ПРОЦЕССА насос_качай; остановить_все_насосы; END_WHILE END_PROGRAM Код: PROGRAM запуск_насоса VAR номер_насоса: INT; WHILE TRUE номер_насоса := найти_рабочий_насос; IF номер_насоса=-1 THEN авария_всех_насосов(); ПАУЗА t#1s; CONTINUE; END_IF; увеличить_количество_запусков(номер_насоса); запустить_насос(номер_насоса); ПАУЗА t#10s; WHILE давление_есть ПАУЗА; END_WHILE; (* Давление пропало, значит насос сломался *) остановить_насос(номер_насоса); установить_признак_аварии(номер_насоса); END_WHILE; END_PROGRAM Для полноты картины, код на обычном ST языке (такой, конечно, писать сложнее и чем Дракон вариант и чем ST-с-паузами). Код: PROGRAM запуск_насоса
VAR номер_насоса: INT; состояние : INT; ton1: TON; ton2: TON; WHILE TRUE CASE состояние OF 0: номер_насоса := найти_рабочий_насос; IF номер_насоса=-1 THEN авария_всех_насосов(); состояние := 1; (* ПАУЗА 1s *) ton1(IN := FALSE, PT := t#1s); RETURN; (* возвращаем управление *) END_IF; состояние := 2; 1: ton1(IN := TRUE); (* ПАУЗА 1s *) IF ton1.Q THEN состояние := 0; (* continue *) ELSE RETURN; (* возвращаем управление *) END_IF; 2: увеличить_количество_запусков(номер_насоса); запустить_насос(номер_насоса); ton2(IN := FALSE, PT := t#10s); состояние := 3; RETURN; 3: ton2(IN := TRUE); (* ПАУЗА 10s; *) IF ton2.Q THEN состояние := 4; ELSE RETURN; END_IF; 4: IF давление_есть THEN RETURN; ELSE (* Давление пропало, значит насос сломался *) состояние := 5; END_IF; 5: остановить_насос(номер_насоса); установить_признак_аварии(номер_насоса); состояние := 0; END_WHILE; END_PROGRAM |
Автор: | Владимир Паронджанов [ Понедельник, 09 Октябрь, 2017 23:53 ] |
Заголовок сообщения: | Re: Проблема с отображением алгоритмов реального времени |
А_МУР писал(а): Чуть позже если кому-то будет интересно напишу: 1) про основные типовые ТАЙМЕРЫ, 2) про РЕАЛЬНОЕ ВРЕМЯ от куда оно берется, и как выглядит, как обрабатывается внутри программы. 3) свое видение по применению алгоритмов ВРЕМЕНИ в ДРАКОНЕ Алексей, думаю, многим будет интересно. Пожалуйста, напишите. Многие будут вам благодарны. |
Автор: | Владимир Паронджанов [ Вторник, 10 Октябрь, 2017 00:02 ] |
Заголовок сообщения: | Re: Проблема с отображением алгоритмов реального времени |
Уважаемые коллеги! У меня просьба. Желательно, в одном и том же сообщении одновременно выкладывать две вещи: 1. Код 2. Соответствующую ему дракон-схему. Преимущество в том, что читатели форума (а их немало) одновременно увидят: и текст программы, и графику дракон-схемы. Это значительно облегчит понимание и сравнение того и другого. Получится исчерпывающая и значительно более полная, доходчивая и понятная картина. Код и дракон-схема. Код и дракон-схема. Код и дракон-схема. ............................ Причина в том, что в данной теме, которую открыл уважаемый Андрей Александрович (спасибо ему), обсуждаются сложные, тонкие и деликатные моменты, связанные с программированием реального времени. Некоторые моменты трудны для восприятия. Желательно, очень желательно помочь тем читателям форума, которые не имеют достаточной подготовки или не знакомы с нюансами использования программ реального времени. А также тем, которые по разным причинам испытывают трудности. |
Автор: | Владимир Паронджанов [ Вторник, 10 Октябрь, 2017 12:00 ] |
Заголовок сообщения: | Re: Проблема с отображением алгоритмов реального времени |
viewtopic.php?f=142&t=6092 |
Страница 3 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |