Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 21

Тема: ДРАКОН vs SFC

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию ДРАКОН vs SFC

    Цитата Сообщение от Алексей Геннадьевич Посмотреть сообщение
    Давайте обсудим вот это.
    Язык ДРАКОН
    А давайте.

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

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

    Поясню:
    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), поэтому останавливать её нестрашно.


    Что думаете?

    По-моему, возможность "просто поставить паузу посреди алгоритма" весьма точно выражает происходящее.
    Последний раз редактировалось Владимир Ситников; 07.10.2017 в 21:56.

  2. #2
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

    очередной велосипед к существующим ПЛК ?

  3. #3

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    очередной велосипед к существующим ПЛК ?
    А к каким же еще? Ещё к ПР, но, как мы знаем, ПР на Драконе не программируется.
    По-моему, удобнее чем SFC получается.

  4. #4
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

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

  5. #5

    По умолчанию

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

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

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

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

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

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

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

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    сама идея не нова, скорее всего "слизана" из степа седьмого, фанаты SFC скорее всего смогут это и в КДС повторить
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    сама идея не нова, скорее всего "слизана" из степа седьмого, фанаты SFC скорее всего смогут это и в КДС повторить
    Во-первых, странно слышать, что Дракон, который разрабатывали для Бурана слизан со Step7.

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

    2) Наглядность Дракона выше, ведь алгоритм всегда выполняется сверху вниз, без пересечений.
    Последний раз редактировалось Владимир Ситников; 08.10.2017 в 10:22.

  8. #8

    По умолчанию

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

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

    Про языки CoDeSys там ничего нет.
    Последний раз редактировалось Вольд; 08.10.2017 в 11:53.

  9. #9

    По умолчанию

    Цитата Сообщение от Вольд Посмотреть сообщение
    Владимир, а для чего вы завели эту тему ?
    Во-первых, даже на этом форуме несколько раз всплывал вопрос Дракон-программирования применительно к ПЛК-ПР.
    Во-вторых, есть люди, которые программируют ОВЕН СПК107 на ДРАКОНе (см http://forum.drakon.su/viewtopic.php...t=6068#p100306 . Ну и пример программы: http://forum.drakon.su/viewtopic.php...art=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, куда можно добавить Дракон, о чём Алексей Геннадьевич и говорил.

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

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    во первых на скрине стоит дата 2008, что на двадцать лет позже чем полет самого бурана, каков там был дракон в самом начале я не видел, но пришел в войска на самую передовую технику и ни чего подобного в те годы не было, не думаю что для бурана рискнули и перешли на что то инновационное в плане управления автоматикой
    во вторых кроме КДС на чем то еще работали, открывали pcs чтоб говорить что sfc вот только такой и не иначе, судя по тому что модуль s7-1222 для Вас плк видимо нет
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 1 из 3 123 ПоследняяПоследняя

Ваши права

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