PDA

Просмотр полной версии : ДРАКОН vs SFC



Владимир Ситников
07.10.2017, 21:51
Давайте обсудим вот это.
Язык ДРАКОН

А давайте.

Задача: есть кнопка "пуск". Если её нажимают, то нужно запустить насос. Если насос запущен, а через 10 секунд датчик давления не реагирует, считаем, что насос сломался, и пытаемся запустить следующий. Аналогично, если датчик давления потухнет при работающем насосе, тоже считаем насос поломанным.
Как кнопку "пуск" отпускают насос нужно выключить.

Собственно, вариант на ДРАКОНе:
33514

Поясню:
1) Схемы выполняются сверху вниз.
2) Прямоугольники -- это какие-то действия.
3) Трапеции типа 5, 8, 19, 24, 25 -- это "паузы" алгоритма (я их для наглядности отметил флажками). Как раз в них происходит "возврат управления в PLC_PRG.
Здесь как раз существенное отличие от SFC. В SFC "за 1 раз" выполняется максимум 1 переход, а тут может выполниться много действий пока очередь не дойдёт до паузы или до конца.
4) Шаг 7 это "запуск схемы <<запуск насоса>>". Иными словами, в начальный момент схема №2 не выполняется, а 1-ая схема ждёт команду "кнопки пуск". Если команда обнаружена, то запускается схема 2, но при этом схема 1 продолжает работать, она доходит до шага 9, обнаруживает, что "пуск ещё нажат" и возвращает управление, переходя на паузу 8
5) Схема 2 после своего запуска проходит по шагам 14, 15, 16, 17, 21, 22, 23 и останавливается на 10 секунд на шаге 24 и только там она возвращает управление в основной цикл.
6) Как только "схема 1" обнаруживает, что кнопку "пуск" отпустили, она просто останавливает схему "запуск насоса". При этом известно, что та находится в какой-то из своих пауз (19, 24, 25), поэтому останавливать её нестрашно.


Что думаете?

По-моему, возможность "просто поставить паузу посреди алгоритма" весьма точно выражает происходящее.

melky
08.10.2017, 00:02
очередной велосипед к существующим ПЛК ?

Владимир Ситников
08.10.2017, 00:23
очередной велосипед к существующим ПЛК ?

А к каким же еще? Ещё к ПР, но, как мы знаем, ПР на Драконе не программируется.
По-моему, удобнее чем SFC получается.

melky
08.10.2017, 09:04
Вопрос, а где код программы ? я вижу только алгоритм, следовательно в самом ПЛК должен храниться код (куски программы) который поддержит данный алгоритм.
Где же напастись столько памяти ?

capzap
08.10.2017, 09:42
сама идея не нова, скорее всего "слизана" из степа седьмого, фанаты SFC скорее всего смогут это и в КДС повторить

Владимир Ситников
08.10.2017, 10:06
Вопрос, а где код программы ? я вижу только алгоритм, следовательно в самом ПЛК должен храниться код (куски программы) который поддержит данный алгоритм.
Где же напастись столько памяти ?

Возьмём шаг "23 подать команду на пуск насоса".
Это может быть просто выдача единицы на DO.
С точки зрения схемы, либо нажимаем на 23 шаг и пишем "в нем" код, либо пишем в нем вызов существующей функции, блока или макроса.

Каждый шаг однозначно переводится в обычный код, который пишет составитель программы.

В более сложных случаях (например, 15 найти рабочий насос) шаг может представлять из себя вызов другой схемы. Я тут не расписывал по какому признаку выбирается насос. По наработке, по количеству включений или ещё как.

Остаётся вопрос как заставить ПЛК следовать этому алгоритму. В случае ПЛК алгоритм можно превратить в ST код. Например, создаём переменную с номером текущего шага и дальше

While.. case номер_шага=1:... case номер_шага=2:...

Возможно, простые действия будет удобнее прямо кодом на самом алгоритме, но это не суть.

В языке SFC точно так же составляется лишь алгоритм, а сами действия нужно описывать на других языках.

Владимир Ситников
08.10.2017, 10:17
сама идея не нова, скорее всего "слизана" из степа седьмого, фанаты SFC скорее всего смогут это и в КДС повторить

Во-первых, странно слышать, что Дракон, который разрабатывали для Бурана слизан со Step7.

Во-вторых, от SFC тут два существенных отличия:
1) В SFC за раз выполняется только 1 действие, а тут - все, пока не дойдёт до паузы. В приведенном примере как раз удобно, что можно логически разбить алгоритм. В результате понятно что происходит, и, с другой стороны, нет никаких накладных расходов в том, чтобы дробить алгоритм. В SFC же один шаг на 2 не раздробить, ведь за 1 цикл ПЛК срабатывает только 1 шаг SFC.

2) Наглядность Дракона выше, ведь алгоритм всегда выполняется сверху вниз, без пересечений.

Вольд
08.10.2017, 11:48
Владимир, а для чего вы завели эту тему ?

Читаем - Для создания и редактирования дракон-схем предлагается Интегрированная Среда ДРАКОН. Разработчик программы Тышов Геннадий Николаевич. Программа умеет превращать дракон-схемы в исходные тексты программ на языках семейств 1С, Delphi, C, Oberon, ASM.

Про языки CoDeSys там ничего нет.

capzap
08.10.2017, 11:54
во первых на скрине стоит дата 2008, что на двадцать лет позже чем полет самого бурана, каков там был дракон в самом начале я не видел, но пришел в войска на самую передовую технику и ни чего подобного в те годы не было, не думаю что для бурана рискнули и перешли на что то инновационное в плане управления автоматикой
во вторых кроме КДС на чем то еще работали, открывали pcs чтоб говорить что sfc вот только такой и не иначе, судя по тому что модуль s7-1222 для Вас плк видимо нет

Вольд
08.10.2017, 11:56
Вот хорошая тема на форуме была: http://forum.easyelectronics.ru/viewtopic.php?f=13&t=8992&start=475

melky
08.10.2017, 12:02
в любом языке за раз выполняется 1 действие.

Владимир Ситников
08.10.2017, 13:51
во первых на скрине стоит дата 2008, что на двадцать лет позже чем полет самого бурана, каков там был дракон в самом начале я не видел, но пришел в войска на самую передовую технику и ни чего подобного в те годы не было, не думаю что для бурана рискнули и перешли на что то инновационное в плане управления автоматикой
На wikipedia пишут (https://ru.wikipedia.org/wiki/%D0%94%D0%A0%D0%90%D0%9A%D0%9E%D0%9D): "ДРАКОН Разрабатывался с 1986 года как часть космической программы «Буран»..."

Картинку я делал в редакторе "ИС Дракон Тышова". 2008 это дата создания конкретного редактора.
Пока читал S7 увидел, что, да, картинки там весьма похожие. Возможно, авторы "вдохновлялись" чем-то одним.



во вторых кроме КДС на чем то еще работали, открывали pcs чтоб говорить что sfc вот только такой и не иначе, судя по тому что модуль s7-1222 для Вас плк видимо нет
Конечно, со Step7 я не работал. Сейчас глянул ихние описания SFC, но так и не понял "сколько действий выполняется за 1 цикл ПЛК".
Нашёл, что можно настраивать "как часто" будет вызываться SFC программа (например, каждый 16-ый цикл ПЛК). Но вот не нашёл того, сколько переходов по SFC может выполниться за 1 раз и как регулируется это количество.

Не знаю как в стандарте (не смог найти), но в КДС уж точно новые шаги выполняются только в следующем цикле ПЛК.
Если в S7 можно как-то этим управлять, то, по-моему, хорошо. Можете подробнее рассказать как оно там настраивается?

Владимир Ситников
08.10.2017, 14:02
Владимир, а для чего вы завели эту тему ?

Во-первых, даже на этом форуме несколько раз всплывал вопрос Дракон-программирования применительно к ПЛК-ПР.
Во-вторых, есть люди, которые программируют ОВЕН СПК107 на ДРАКОНе (см http://forum.drakon.su/viewtopic.php?f=78&t=6068#p100306 . Ну и пример программы: http://forum.drakon.su/viewtopic.php?f=78&t=6068&start=20#p100336 )

В третьих, я всё прикидываю "программу управления светом от выключателей" -- ну не очень мне нравится ST там. Конечно, сейчас как-то работает (и, да, ST гораздо лучше CFC), но описать процесс с паузами/временем по-моему гораздо упростит понимание.


Владимир, а для чего вы завели эту тему ?

Поэтому тему и завёл с целью поинтересоваться "а как вообще может выглядеть Дракон-программирование" применительно к ПЛК.
Может оказаться, что оно действительно сократит количество логических ошибок в алгоритмах.
Конечно, опечатки и ctrl c/v не исправить, а ситуации типа "если насос работал-работал и сломался, а программа забыла запустить запасной" из картинки могут быть гораздо виднее, чем из текста на таймерах.




Читаем - Для создания и редактирования дракон-схем предлагается Интегрированная Среда ДРАКОН. Разработчик программы Тышов Геннадий Николаевич. Программа умеет превращать дракон-схемы в исходные тексты программ на языках семейств 1С, Delphi, C, Oberon, ASM.

Про языки CoDeSys там ничего нет.
Вообще говоря, в среда Тышова умеет генерировать ST код примерно такого содержания (качество этого кода предлагаю не обсуждать, т.к. не в нём суть):

(*#1.1.3.Ветка. ========= ||главная||*)
(*#1.1.4.Вопрос. ||Есть пуск?||*)
IF NOT (
PUSK=TRUE
) THEN JMP L26; END_IF;(*Нет-> #1.1.26.Вопрос. ||насос 1 работает?||*)
JMP L5;(*-> #1.1.5.Вопрос. ||насос 1 работает?||*)
(*#1.1.26.Вопрос. ||насос 1 работает?||*)
L26: ;
IF NOT (
PUMP1=TRUE
) THEN JMP L31; END_IF;(*Нет-> #1.1.31.Вопрос. ||насос 2 работает?||*)
JMP L27;(*-> #1.1.27.Действие. ||насос 1= стоп||*)
(*#1.1.31.Вопрос. ||насос 2 работает?||*)
L31: ;
IF NOT (
PUMP2=TRUE
) THEN JMP L138; END_IF;(*Нет-> #1.1.138.Полка. ||код состояния = 0||*)
(*#1.1.32.Действие. ||насос 2 = стоп||*)
PUMP2:=FALSE;
JMP L138;(*-> #1.1.138.Полка. ||код состояния = 0||*)
(*#1.1.27.Действие. ||насос 1= стоп||*)
L27: ;
PUMP1:=FALSE;
(*#1.1.138.Полка. ||код состояния = 0|"останов насосов"|*)
L138: ;
...... Нет текста
(*#1.1.29.Действие. ||сброс бита аварии||*)
BIT_AVAR:=FALSE;
JMP L30;(*-> #1.1.30.Адрес. ||Завершение||*)
(*#1.1.5.Вопрос. ||насос 1 работает?||*)
L5: ;
IF NOT (
PUMP1=TRUE
) THEN JMP L13; END_IF;(*Нет-> #1.1.13.Вопрос. ||насос 2 работает?||*)
JMP L6;(*-> #1.1.6.Вопрос. ||реле давления включено?||*)
(*#1.1.13.Вопрос. ||насос 2 работает?||*)
L13: ;
IF NOT (
PUMP2=TRUE
) THEN JMP L22; END_IF;(*Нет-> #1.1.22.Вопрос. ||код состояния=5||*)
JMP L14;(*-> #1.1.14.Вопрос. ||реле давления включено?||*)
(*#1.1.22.Вопрос. ||код состояния=5||*)
L22: ;
IF
SOST=5
THEN JMP L30; END_IF;(*Да-> #1.1.30.Адрес. ||Завершение||*)
(*#1.1.23.Вопрос. ||код состояния=3||*)
IF
SOST=3
THEN JMP L30; END_IF;(*Да-> #1.1.30.Адрес. ||Завершение||*)
(*#1.1.24.Вопрос. ||код состояния=4||*)
IF
SOST=4
THEN JMP L30; END_IF;(*Да-> #1.1.30.Адрес. ||Завершение||*)
JMP L25;(*-> #1.1.25.Адрес. ||запуск насосов по переднему фронту||*)
(*#1.1.30.Адрес. ||Завершение||*)
L30: ;
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.25.Адрес. ||запуск насосов по переднему фронту||*)
L25: ;
JMP L34;(*-> #1.1.34.Ветка. ||запуск насосов по переднему фронту||*)
(*#1.1.14.Вопрос. ||реле давления включено?||*)
L14: ;
IF NOT (
RPD=TRUE
) THEN JMP L18; END_IF;(*Нет-> #1.1.18.Пауза. ||Запуск таймера TON2 10 сек.||*)
JMP L15;(*-> #1.1.15.Вопрос. ||код состояния=3||*)
(*#1.1.18.Пауза. ||Запуск таймера TON2 10 сек.||*)
L18: ;
TON2(IN:=NOT(RPD)AND PUMP2=TRUE,PT:=t#10S);
(*#1.1.19.Вопрос. ||Q таимера TON2=1||*)
IF NOT (
TON2.Q=TRUE
) THEN JMP L21; END_IF;(*Нет-> #1.1.21.Адрес. ||Завершение||*)
JMP L20;(*-> #1.1.20.Адрес. ||АВАРИЯ НАСОСА2||*)
(*#1.1.21.Адрес. ||Завершение||*)
L21: ;
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.20.Адрес. ||АВАРИЯ НАСОСА2||*)
L20: ;
JMP L65;(*-> #1.1.65.Ветка. ||АВАРИЯ НАСОСА2||*)
(*#1.1.15.Вопрос. ||код состояния=3||*)
L15: ;
IF
SOST=3
THEN JMP L17; END_IF;(*Да-> #1.1.17.Адрес. ||Завершение||*)
(*#1.1.137.Полка. ||код состояния = 2|"работает насос 2"|*)
...... Нет текста
JMP L17;(*-> #1.1.17.Адрес. ||Завершение||*)
(*#1.1.6.Вопрос. ||реле давления включено?||*)
L6: ;
IF NOT (
RPD=TRUE
) THEN JMP L16; END_IF;(*Нет-> #1.1.16.Пуск таймера. ||Запуск таймера TON1 10 сек.||*)
JMP L7;(*-> #1.1.7.Вопрос. ||код состояния=4||*)
(*#1.1.16.Пуск таймера. ||Запуск таймера TON1 10 сек.||*)
L16: ;
TON1(IN:=NOT(RPD)AND PUMP1=TRUE, PT:=t#10S);
(*#1.1.11.Вопрос. ||Q таимера TON1 = 1||*)
IF NOT (
TON1.Q=TRUE
) THEN JMP L17; END_IF;(*Нет-> #1.1.17.Адрес. ||Завершение||*)
JMP L12;(*-> #1.1.12.Адрес. ||АВРИЯ НАСОС 1||*)
(*#1.1.17.Адрес. ||Завершение||*)
L17: ;
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.12.Адрес. ||АВРИЯ НАСОС 1||*)
L12: ;
JMP L56;(*-> #1.1.56.Ветка. ||АВРИЯ НАСОС 1||*)
(*#1.1.7.Вопрос. ||код состояния=4||*)
L7: ;
IF
SOST=4
THEN JMP L9; END_IF;(*Да-> #1.1.9.Адрес. ||Завершение||*)
(*#1.1.8.Действие. ||код состояния=1 "работает насос 1"||*)
SOST:=1;
(*#1.1.9.Адрес. ||Завершение||*)
L9: ;
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.33.Левый комментарий-. ||ветка выполняется один раз при изменении пуска||*)
(*#1.1.34.Ветка. ========= ||запуск насосов по переднему фронту||*)
L34: ;
(*#1.1.35.Вопрос. ||ПУСК2>=ПУСК1?||*)
IF NOT (
PUSK2>=PUSK1
) THEN JMP L37; END_IF;(*Нет-> #1.1.37.Адрес. ||запуск насоса 2||*)
JMP L36;(*-> #1.1.36.Адрес. ||запуск насоса1||*)
(*#1.1.37.Адрес. ||запуск насоса 2||*)
L37: ;
JMP L47;(*-> #1.1.47.Ветка. ||запуск насоса 2||*)
(*#1.1.36.Адрес. ||запуск насоса1||*)
L36: ;
(*#1.1.38.Ветка.Цикл. ========= ||запуск насоса1||*)
L38: ;
(*#1.1.39.Действие. ||Насос1 = пуск||*)
PUMP1:=TRUE;
(*#1.1.40.Действие. ||Пуск1=пуск1+1||*)
PUSK1:=PUSK1+1;
(*#1.1.41.Вопрос. ||реле давления включено?||*)
IF NOT (
RPD=TRUE
) THEN JMP L28; END_IF;(*Нет-> #1.1.28.Пуск таймера. ||Запуск таймера TON3 10 сек.||*)
JMP L42;(*-> #1.1.42.Адрес. ||Завершение||*)
(*#1.1.28.Пуск таймера. ||Запуск таймера TON3 10 сек.||*)
L28: ;
TON3(IN:=NOT(RPD)AND PUMP1=TRUE,PT:=t#10S);
(*#1.1.44.Вопрос. ||Q таимера TON3 = 1||*)
IF NOT (
TON3.Q=TRUE
) THEN JMP L46; END_IF;(*Нет-> #1.1.46.Адрес. ||Завершение||*)
JMP L45;(*-> #1.1.45.Адрес. ||АВРИЯ НАСОС 1||*)
(*#1.1.46.Адрес. ||Завершение||*)
L46: ;
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.45.Адрес. ||АВРИЯ НАСОС 1||*)
L45: ;
JMP L56;(*-> #1.1.56.Ветка. ||АВРИЯ НАСОС 1||*)
(*#1.1.42.Адрес. ||Завершение||*)
L42: ;
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.47.Ветка.Цикл. ========= ||запуск насоса 2||*)
L47: ;
(*#1.1.48.Действие. ||Насос2 = пуск||*)
PUMP2:=TRUE;
(*#1.1.49.Действие. ||Пуск2=пуск2+1||*)
PUSK2:=PUSK2+1;
(*#1.1.50.Вопрос. ||реле давления включено?||*)
IF NOT (
RPD=TRUE
) THEN JMP L43; END_IF;(*Нет-> #1.1.43.Пуск таймера. ||Запуск таймера TON4 10 сек.||*)
JMP L51;(*-> #1.1.51.Адрес. ||Завершение||*)
(*#1.1.43.Пуск таймера. ||Запуск таймера TON4 10 сек.||*)
L43: ;
TON4(IN:=NOT(RPD)AND PUMP2=TRUE,PT:=t#10S);
(*#1.1.53.Вопрос. ||Q таимера TON4 = 1||*)
IF NOT (
TON4.Q=TRUE
) THEN JMP L55; END_IF;(*Нет-> #1.1.55.Адрес. ||Завершение||*)
JMP L54;(*-> #1.1.54.Адрес. ||АВАРИЯ НАСОСА2||*)
(*#1.1.55.Адрес. ||Завершение||*)
L55: ;
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.54.Адрес. ||АВАРИЯ НАСОСА2||*)
L54: ;
JMP L65;(*-> #1.1.65.Ветка. ||АВАРИЯ НАСОСА2||*)
(*#1.1.51.Адрес. ||Завершение||*)
L51: ;
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.56.Ветка. ========= ||АВРИЯ НАСОС 1||*)
L56: ;
(*#1.1.57.Вопрос. ||код состояния =4||*)
IF NOT (
SOST=4
) THEN JMP L140; END_IF;(*Нет-> #1.1.140.Полка. ||код состояния = 3||*)
JMP L139;(*-> #1.1.139.Полка. ||код состояния = 5||*)
(*#1.1.140.Полка. ||код состояния = 3|"авария насоса 1"|*)
L140: ;
SOST:=3;
(*#1.1.61.Действие. ||код состояния=3 "авария насоса 1"||*)
SOST:=3;
(*#1.1.62.Действие. ||насос 1 стоп||*)
PUMP1:=FALSE;
(*#1.1.63.Действие. ||ВКЛЮЧИТЬ БИТ АВАРИИ||*)
BIT_AVAR:=TRUE;
(*#1.1.64.Адрес. ||запуск насоса 2||*)
JMP L47;(*-> #1.1.47.Ветка. ||запуск насоса 2||*)
(*#1.1.139.Полка. ||код состояния = 5|"авария всех насосов"|*)
L139: ;
SOST:=5;
(*#1.1.59.Действие. ||насос 1 стоп||*)
PUMP1:=FALSE;
(*#1.1.60.Адрес. ||Завершение||*)
JMP L74;(*-> #1.1.74.Ветка. ||Завершение||*)
(*#1.1.65.Ветка. ========= ||АВАРИЯ НАСОСА2||*)
L65: ;
(*#1.1.66.Вопрос. ||код состояния =3||*)
IF NOT (
SOST=3
) THEN JMP L141; END_IF;(*Нет-> #1.1.141.Полка. ||код состояния = 4||*)
JMP L142;(*-> #1.1.142.Полка. ||код состояния = 5||*)
(*#1.1.141.Полка. ||код состояния = 4|"авария насоса 2"|*)
L141: ;
SOST:=4;
(*#1.1.71.Действие. ||насос 2 стоп||*)
PUMP2:=FALSE;
(*#1.1.72.Действие. ||ВКЛЮЧИТЬ БИТ АВАРИИ||*)
BIT_AVAR:=TRUE;
(*#1.1.73.Адрес. ||запуск насоса1||*)
JMP L38;(*-> #1.1.38.Ветка. ||запуск насоса1||*)
(*#1.1.142.Полка. ||код состояния = 5|"авария всех насосов"|*)
L142: ;
SOST:=5;
(*#1.1.68.Действие. ||насос 2 стоп||*)
PUMP2:=FALSE;
(*#1.1.69.Адрес. ||Завершение||*)
(*#1.1.74.Ветка. ========= ||Завершение||*)
L74: ;
(*#1.1.75.Конец. ||Конец||*)
(*#1.1.2.Заголовок.Конечный текст. ||БЛОК НАСОСОВ ПОДПИТКИ||*)
...... Нужна 1 строка разделитель: ====

Но суть совсем не в этом.
Суть в том, что, есть же Hardella IDE, куда можно добавить Дракон, о чём Алексей Геннадьевич и говорил.

Но, разумеется, перед тем, как что-то куда-то добавлять я хочу примериться "а как оно вообще".

Владимир Ситников
08.10.2017, 14:04
в любом языке за раз выполняется 1 действие.

Не понимаю смысла этой фразы.
В КДС SFC, за 1 срабатывание происходит максимум 1 переход к следующему квадратику (параллельные выполнения пока опустим).
И КДС никак не заставишь выполнить "вот эти 5 переходов между квадратиками в одном цикле ПЛК".

А тут же я предлагаю, чтобы наоборот: всё выполнялось в рамках одного цикла ПЛК, а деление на циклы было явным (на паузах).

Newcomer
08.10.2017, 14:40
Суть в том, что, есть же Hardella IDE, куда можно добавить Дракон, о чём Алексей Геннадьевич и говорил.
Но, разумеется, перед тем, как что-то куда-то добавлять я хочу примериться "а как оно вообще".

Какова будет реакция официальных представителей фирмы "ОВЕН" заранее известно, к сожалению.

Но если вы действительно добавите Дракон в Hardella IDE, то простые пользователи CoDeSys, которые не сильны в вопросах программирования вам спасибо точно скажут.

Лично я Hardella IDE использую когда возникает потребность работать с ШД и энкодерами. Все работает в реальном проекте. Есть одна проблема при управлении ШД, но я думаю она решаема.

У SIEMENS есть язык подобный Дракон (дополнительный пакет S7-GRAPH).

Послал в личку ссылку на документ.

capzap
08.10.2017, 14:54
Если в S7 можно как-то этим управлять, то, по-моему, хорошо. Можете подробнее рассказать как оно там настраивается?
я не поклонник SFC, в деталях мне нечего рассказать, помню что на занятиях уводили sfc-схему в прерывание, выполняли произвольный код, затем так же по условию возвращались в основную схему на то же место(шаг). На ST есть CASE, он вполне может заменить sfc-схему и там тоже только один кейс выполняется за один цикл контроллера

Владимир Ситников
08.10.2017, 17:13
я не поклонник SFC, в деталях мне нечего рассказать, помню что на занятиях уводили sfc-схему в прерывание, выполняли произвольный код, затем так же по условию возвращались в основную схему на то же место(шаг)
Ясно.


На ST есть CASE, он вполне может заменить sfc-схему и там тоже только один кейс выполняется за один цикл контроллера
Да, в ST есть CASE, но программа на CASE менее выразительна, чем Дракон-схема.

Владимир Ситников
08.10.2017, 19:39
Ну это если сама эта программа не вызывается из внешней пользовательской.
Кстати, да. Ступил. Если SFC вызвать несколько раз из прикладного кода, то она, конечно, запросто может сдвинуться на несколько шагов.

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

В этом плане Дракон-схема самоходная. Т.е. её вызов просто добавляем 1 раз в PLC_PRG и она прокручивается на нужное количество шагов.


Вы хотите вклеить эти внешние возможности сразу в среду исполнения ?
Непонятен вопрос. Можете поподробнее?

Владимир Ситников
08.10.2017, 21:55
PS
например внешний код с флажком "еще хочу" очевиден


t := time();
repeat
sfc(ещё := false);
until (time() - t) > дануна or not sfc.ещё //ещё - input, при необходимости поднимается внутрях
end_until
Да, чего-то туплю я. Получается, если в SFC проставлять флаг "ещё хочу" (или альтернативный "довольно"), то оно будет такое же самоходное.
Ну, там где я в Дракон схеме проставил флаг "хватит, пауза", там же и в SFC будет аналогичный флаг.

Получается, разница сводится к:
1) Разным картинкам. В SFC нет IF'ов. В Драконе они есть. В SFC только Jump'ы, а в Дракон'е более наглядные ветки (вертикальные). Т.е. формулировать алгоритм на Драконе по-моему, проще.
2) Немного разной смысловой нагрузкой шагов: в SFC развиты параметры "минимальная-максимальная длительность выполнения шага", "входные-выходные" действия (CDS может всё это рисовать). А в Драконе так сказать, штатных, средств отображения всех этих параметров нет. Наколхозить, конечно, можно, но Паронджанов о подобных штуках не пишет.
3) В SFC много внимания уделяется переходам между шагами (можно прямо код выполнять в переходах), а в Драконе как таковые переходы вообще за сущности не считаются, и все действия выполняются в квадратиках действий.
4) В SFC нужно не забывать выставлять флаг "ещё хочу". Может, и не так страшно. С одной стороны, оно делает SFC гибким (можно и так и сяк сделать), а с другой, я думал, что нужно делать какую-то одну модель выполнения, и прятать от программиста необходимость управления этим флагом.
5) В велосипедах можно сделать "запуск вложенной схемы", и т.п. На SFC, вроде, есть проблемы с вкладыванием.

Ну и собственно, вопрос: оно вообще в кассу или нет?

Владимир Ситников
08.10.2017, 23:39
1.Что значит нет if'ов ? Просто по сравнению с Драконом - из условия нет 2х выходов (неудобней). Но параллелится. Дальше тоже самое.
Так я об этом и говорю, что нет квадратика с двумя выходами и прочее.
Да, Дракон удобнее, вроде.


4."что нужно делать какую-то одну модель выполнения, и прятать от программиста необходимость управления этим флагом" Так если спрятать - тогда 1 шаг/цикл
Скажу по-другому. Делать так, чтобы флаг "довольно" генерировался на основе визуально-отличимого признака. Например, в паузах в алгоритме (ну, которые трапециями на картинке рисуются).
Возможно, только я так туплю, но почему-то не видно примеров "ещё-дануна" вариантов использования SFC.


Лично мне - нет.
Ясно, спасибо за пояснения.

Посмотрим, может ещё кто-нибудь что-нибудь скажет.

kreyser_waryag
13.03.2018, 21:15
Конечные автоматы - будущее ПЛК программирования. Обратите внимание на Matlab Simulink Stateflow. Он также умеет генерировать ST код.