Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 15 из 15

Тема: Задержка на языке ST

  1. #11

    По умолчанию

    Нарушать работу цикла ПЛК нежелательно. Дело порой доходило до того, что в отсутствие языка SFC в средах разработки некоторых ПЛК, программисты для организации последовательностей программных командоаппаратов делали следующее:
    обявлялась переменная типа WORD или DWORD. Например с именем STEP_CONTROL.
    А отдельные ее битовые поля использовались в качестве битов разрешения того или иного шага технологической последовательности:
    STEP_CONTROL.0
    STEP_CONTROL.1
    STEP_CONTROL.2
    ...

    При старте ПЛК переменная STEP_CONTROL инициализировалась значением "1". Т.е. программа приводилась в состояние "нулевого шага".

    Так же, организовывалась переменная STEP_ON, которая переводилась из состояния "0" в состояние "1" тогда, когда срабатывал тот или иной критерий завершения шага последовательности.
    При этом, занчение обрабатывалось функцией триггера "по фронту", что приводило в вызову функции "сдвиг влево" для переменной STEP_CONTROL, в результате чего технологическая последовательность перемещалась на следующий шаг.
    Единичка, сдвигаемая в переменной STEP_CONTROL именовалась на внутреннем жаргоне в ряде производственных коллективов "пузырьком", а сам процесс написания отладки таких программ - "гонять пузырь".
    С повышением культуры поставщиков инструментального ПО и приведением средств разрабоки к требованием МЭК такая необходимость отпала, поскольку стало возможным использовать средства языка описания технологических последовательностей SFC.
    Однако, в ряде случаев, использование сдвиговых регистров для организации командоаппаратов все еще остается актуальным.

    Такая "кулибинщина", а не желание во что бы то ни стало "повесить" цикл ПЛК, действительно оправдана и к ней приходили многие разработчики прикладного ПО для ПЛК независимо друг от друга.

    Написал об этом, чтобы проиллюстрировать общий подход к использованию модели ПЛК вне зависимости от прикладных задач.

    "Тормозя" работу контроллера на единственной операции, вы тем самым лишаетесь возможности выполнять какие-то другие действия. Например, реализацию алгоритмов противоаварийных защит и интерфейса оператора.

  2. #12

    По умолчанию

    Здравствуйте! Вопрос по задержке. Кусок программы:
    CASE FLG OF
    0:
    external_event:=TRUE;
    PL1:=TRUE;
    PL2:=FALSE;
    MN1:=TRUE;
    MN2:=FALSE;
    FLG:=1;
    1:
    myTON(IN:=external_event, PT:=t#3s);
    myR_TRIG(CLK:=myTon.Q);
    IF myR_TRIG.Q THEN
    PL1:=FALSE;
    PL2:=FALSE;
    MN1:=FALSE;
    MN2:=FALSE;
    FLG:=2;
    END_IF
    2:
    external_event:=FALSE;
    myTON.IN:=FALSE;
    END_CASE

    Смысл такой: при входе в CASE переменные PL1, PL2, MN1, MN2 принимают значения TRUE, FALSE, TRUE, FALSE соответственно на 3 секунды, потом все переходят в FALSE. В другой части программы они меняют свои значения. При повторном входе в CASE они опять принимают нужные значения TRUE, FALSE, TRUE, FALSE соответственно на 3 секунды, но в FALSE уже не переходят. Не могу разобраться в чем проблема...

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

    По умолчанию

    перепишите первый кейс на
    1:
    IF myR_myTON.Q THEN
    PL1:=FALSE;
    PL2:=FALSE;
    MN1:=FALSE;
    MN2:=FALSE;
    FLG:=2;
    END_IF
    myTON(IN:=NOT myTON.Q, PT:=t#3s);
    а external_event выкинте из кода
    либо в нулевом кейсе добавте myTON(IN:=FALSE);
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  4. #14

    По умолчанию

    Цитата Сообщение от Jolly Посмотреть сообщение
    2:
    external_event:=FALSE;
    myTON.IN:=FALSE;
    END_CASE

    Смысл такой: при входе в CASE переменные PL1, PL2, MN1, MN2 принимают значения TRUE, FALSE, TRUE, FALSE соответственно на 3 секунды, потом все переходят в FALSE. В другой части программы они меняют свои значения. При повторном входе в CASE они опять принимают нужные значения TRUE, FALSE, TRUE, FALSE соответственно на 3 секунды, но в FALSE уже не переходят. Не могу разобраться в чем проблема...
    Скорее всего, проблема в том, что вместо myTON.IN:=FALSE; нужно написать myTON(IN:=FALSE); -- иначе таймер так и не знает, что "ему нужно начать новый отсчёт времени".


    А вообще, конечно, тема пересекается с идеей пауз.
    Там это было бы:
    Код:
    PL1:=TRUE;
    PL2:=FALSE;
    MN1:=TRUE;
    MN2:=FALSE;
    
    ПАУЗА t#3s;
    
    PL1:=FALSE;
    PL2:=FALSE;
    MN1:=FALSE;
    MN2:=FALSE;

  5. #15

    По умолчанию

    Всем спасибо, получилось!

Страница 2 из 2 ПерваяПервая 12

Ваши права

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