Для одной из моих программ мне нужно нормально замкнутое реле с таймером закрытия (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.