DRAKON.SU

Текущее время: Четверг, 28 Март, 2024 15:07

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
СообщениеДобавлено: Суббота, 07 Октябрь, 2017 16:04 

Зарегистрирован: Среда, 03 Май, 2017 09:55
Сообщения: 200
Сергей Ефанов писал(а):
Порядок вызовов значения не имеет.

Главное - все автоматы должны быть вызваны в КАЖДОМ цикле, и за один вызов любой автомат может совершить НЕ БОЛЕЕ ОДНОГО перехода. Средства их взаимодействия - несколько ОЧЕНЬ простых функций.


Если автоматы обмениваются данными, то порядок играет значение.
Например:
Схема1 -- распознаёт одинарное и двойное нажатие
Схема2 -- при двойном нажатии выключает свет.

Если обрабатывать их в порядке Схема2, Схема1, то "Схема2" всегда будет работать "по старым данным", т.е. в систему добавляется задержка на ровном месте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 07 Октябрь, 2017 21:14 

Зарегистрирован: Среда, 03 Май, 2017 09:55
Сообщения: 200
А_МУР писал(а):
Здравствуйте Уважаемые Коллеги!
Выкладываю файл функционального блока под СПК 107 (ОВЕН)


Попробовал перерисовать, по-моему, так будет понятнее.
Да, я тут сделал одно действие "найти рабочий насос", но основная суть не в этом.

Я отметил флажками те действия, при которых будет "возврат управления в ПЛК". По сути, здесь это получились "паузы" (как самостоятельные, так и в циклах ожидания).

Например: основная схема -- №1. Она ждёт пока появится команда на запуск. Если команды нет, то возвращаем управление, и выполняем перепроверку уже на следующей итерации цикла.

Если пришла команда на запуск, то запускаем параллельный процесс "запуск насоса".
Основная схема при этом запускает процесс, доходит до №9 проверки "пора ли выключать" и там возвращает управление.


Схема "запуск насоса" проходится по действиям 14-23 (выбирает насос, подаёт команду на его запуск) и засыпает на 10 секунд. Т.е. она возвращает управление в ПЛК, и продолжает выполнение (передвигается к выбору 26) только через 10 секунд.

Там оно проверяет "есть ли давление". Если давление есть (насос работает), то просто возвращаем управление. Если давления нет (насос сломался), то отрабатываем аварию, запускаем новый насос и возвращаем управление либо на 24-ом, либо на 19-ом шаге.

Как только на основной схеме 9. "Есть пуск?" продвинется дальше, произойдёт останов параллельной схемы 2 и потом выключение насосов действием 11.

С одной стороны выглядит более-менее, а с другой мне не нравятся 3 вещи:
1) Если рисовать "цикл ожидания" без "паузы в 0 сек", то визуально тяжело отличить "обычный цикл" и "цикл ожидания". А сама икона ожидания с 0 секундами захламляет схему. С другой стороны, она, конечно, явно подчёркивает место, где схема может вернуть управление.
2) Циклы ожидания ждут бесконечно долго.
2.1) Например, момент ~24, когда "появилось ли давление после запуска насоса". Сейчас это сделано "паузой в 10 секунд". Да, пауза хорошо обозначает суть, но вместе с тем, если во время этой паузы пропадёт команда на пуск насосов, то пауза не даст на это среагировать. Из-за этого я вынес обработку "останова" в 1-ую схему, которая просто на корню режет процесс запуска, и останавливает насосы. В результате, либо схема 1 должна останавливать вообще все насосы, либо как-то из 2-ой выяснять последний запущенный.
2.2) Если давление "пропадёт" кратковременно, то схема подумает, что это авария насоса. Более надёжным критерием было бы что-то в духе "давление отсутствует менее 5-и секунд из 10-и", и это "на паузах" по-моему, тяжело выразить.
3) По схеме непонятно является ли процесс "запуск насоса" (схема 2) единственным, или в системе может быть запущенно сразу несколько таких процессов, например, для каждого насоса. Вполне возможно, что понадобятся оба варианта, а из картинки это непонятно.


Вложения:
pumps.png
pumps.png [ 17.42 КБ | Просмотров: 6801 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 07 Октябрь, 2017 21:42 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
Владимир Ситников писал(а):
Попробовал перерисовать, по-моему, так будет понятнее.
...............................................
Владимир, спасибо за подробный анализ и обширные комментарии.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 09 Октябрь, 2017 21:40 

Зарегистрирован: Среда, 03 Май, 2017 09:55
Сообщения: 200
Прикинул как может выглядеть та же задача в случае, если 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 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
А_МУР писал(а):
Чуть позже если кому-то будет интересно напишу:
1) про основные типовые ТАЙМЕРЫ,
2) про РЕАЛЬНОЕ ВРЕМЯ от куда оно берется, и как выглядит, как обрабатывается внутри программы.
3) свое видение по применению алгоритмов ВРЕМЕНИ в ДРАКОНЕ


Алексей, думаю, многим будет интересно. Пожалуйста, напишите.
Многие будут вам благодарны.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 10 Октябрь, 2017 00:02 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
Уважаемые коллеги!

У меня просьба. Желательно, в одном и том же сообщении одновременно выкладывать две вещи:

1. Код
2. Соответствующую ему дракон-схему.

Преимущество в том, что читатели форума (а их немало) одновременно увидят:
и текст программы, и графику дракон-схемы.

Это значительно облегчит понимание и сравнение того и другого.
Получится исчерпывающая и значительно более полная, доходчивая и понятная картина.

Код и дракон-схема.
Код и дракон-схема.
Код и дракон-схема.
............................

Причина в том, что в данной теме, которую открыл уважаемый Андрей Александрович (спасибо ему), обсуждаются сложные, тонкие и деликатные моменты, связанные с программированием реального времени.
Некоторые моменты трудны для восприятия.

Желательно, очень желательно помочь тем читателям форума, которые не имеют достаточной подготовки или не знакомы с нюансами использования программ реального времени.
А также тем, которые по разным причинам испытывают трудности.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 10 Октябрь, 2017 12:00 

Зарегистрирован: Воскресенье, 24 Февраль, 2008 15:32
Сообщения: 5846
Откуда: Москва
viewtopic.php?f=142&t=6092


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2008-2024, участники конференции «DRAKON.SU», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB