Определение обратного фронта в Codesys

Для одной из моих программ мне нужно нормально замкнутое реле с таймером закрытия (NCTC) на лестничной диаграмме.

Я не знаю стандартного метода реализации такого, поэтому я пытаюсь создать его сам. Мой текущий подход требует обнаружения заднего края. Код такого детектора я нашел в конце книги: «IEC 61131-3: Программирование промышленных систем» (2-е издание, стр. 327). Выглядит так:

FUNCTION_BLOCK       F_TRIG      (* falling edge *)
    VAR_INPUT
        CLK  :     BOOL;
    END_VAR
    VAR_OUTPUT
        Q   :   BOOL;
    END_VAR
    VAR RETAIN
        MEM   :   BOOL := 1;       (* initialise edge flag *)
    END_VAR
    Q   :=  NOT CLK AND NOT MEM;   (* recognise falling edge *)
    MEM :=  NOT CLK;               (* reset edge flag *)
END_FUNCTION_BLOCK

Что дает мне ровно 5 ошибок (игнорируя сбой сборки из-за них):

ОШИБКА 4250: F_TRIG (1): ожидается другой оператор ST или конец POU
ОШИБКА 4250: F_TRIG (4): ожидается другой оператор ST или конец POU
ОШИБКА 4250: F_TRIG (7): Ожидается другой оператор «ST» или конец POU
ОШИБКА 4250: F_TRIG (10): ожидается другой оператор «ST» или конец POU
ОШИБКА 4250: F_TRIG (13): другой оператор «ST» или конец Ожидается POU

Я правильно настроил тип POU, чтобы он был функциональным блоком, а язык POU был ST. Я подозреваю, что мой синтаксис заржавел, но я открыт для предложений. Особенно, если я решаю эту проблему совершенно неправильным подходом.

Мне кажется, все в порядке. Что происходит не так?

Запуск Codesys 2.3.


person Mast    schedule 22.02.2017    source источник


Ответы (2)


  1. Удалить END_FUNCTION_BLOCK
  2. Удалить RETAIN. Вы можете сохранить функциональный блок. Не является переменной в функциональном блоке
  3. Q и MEM внизу ничего не объявляют.
  4. F_TRIG уже является типом в codesys. Нужно объявить как что-то еще

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

FUNCTION_BLOCK  CustomTrig    
VAR_INPUT
    CLK  :     BOOL;
END_VAR
VAR_OUTPUT
    Q   :   BOOL;
END_VAR
VAR
    MEM   :   BOOL := 1;     
END_VAR

Можете ли вы объяснить немного подробнее, что вы пытаетесь сделать? Я мог бы помочь вам разработать что-то (или может быть что-то уже встроено в codesys)

person mrsargent    schedule 22.02.2017
comment
Точка 3, Q и MEM объявляются как BOOL. Похоже, в конце у них будет определенное значение. - person Mast; 23.02.2017
comment
Я вернусь, чтобы подробнее рассказать о том, что я делаю, и сработало ли ваше предложение. - person Mast; 23.02.2017
comment
То, что я пытаюсь сделать, это построить нормально закрытое реле времени закрытия (NCTC). - person Mast; 23.02.2017
comment
Я попытался скопировать предложенную вами функцию, посмотрите, что она сделала, и это также не работает на 1, 4, 7 и 10. - person Mast; 23.02.2017
comment
Похоже, вам нужен блок TOF. Что означает НКТС? Первый раз слышу этот термин. Вам нужен таймер отключения? Вам нужно закрыть контакт через какое-то время на этот контакт был отправлен сигнал? - person Sergey Romanov; 08.06.2017

Если я правильно понимаю, вы хотите, чтобы вывод был:

  • TRUE в режиме ожидания (нормально закрытый)
  • FALSE во время таймера
  • ИСТИНА по истечении времени

Это противоположность встроенному функциональному блоку TP (временной импульс). Просто инвертируйте выход TP «Q».

person Scott    schedule 22.02.2017