Совершенно я извелся с таймерами КДС.
Прилагаю простой пример. В чем фишка: этот пример при отладке в режиме эмуляции прекрасно работает, а в железе - нет.
Кому влом раскручивать, приведу тексты, благо их мало:
Код:VAR_GLOBAL bError_0 : BOOL; bError_1 : BOOL; END_VARКод:PROGRAM PLC_PRG VAR a: WORD; END_VAR a := a + 1; IF a = 3 THEN ErrorsHandle(0); END_IF IF a = 100 THEN ErrorsHandle(1); END_IF ErrorsHandle(100);То есть, в функции ErrorsHandle() установлены биты, запущены таймеры. В основной программе в каждом цикле вызывается эта же функция с кодом несуществующей ошибки - для проверки состояния таймеров. Какой взвелся - его ошибку сбрасываем.Код:FUNCTION ErrorsHandle : BOOL VAR_INPUT byErrNmb: BYTE; END_VAR VAR t0,t1: TON; END_VAR CASE byErrNmb OF 0: bError_0 := TRUE; 1: bError_1 := TRUE; END_CASE t0( IN:=bError_0 AND NOT t0.Q, PT:=T#5s); t1( IN:=bError_1 AND NOT t1.Q, PT:=T#5s); IF t0.Q THEN bError_0 := FALSE; END_IF IF t1.Q THEN bError_1 := FALSE; END_IF
И именно так все обстоит при эмуляции. Гружу в живое тело - биты ошибок взводятся и не снимаются через положенные 5 секунд. Наблюдение за функцией ErrorsHandle() показывает, что оба таймера не запускались, или я неверно понимаю прилагаемую картинку.
Подскажите, что я неправильно делаю?
Просьба: не надо других способов отработки ошибок. Мне важно понять ситуацию с таймерами. Это же базовый элемент, а я с ним на ножах. Нехорошо...


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