Совершенно я извелся с таймерами КДС.
Прилагаю простой пример. В чем фишка: этот пример при отладке в режиме эмуляции прекрасно работает, а в железе - нет.
Кому влом раскручивать, приведу тексты, благо их мало:
Код:
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);
Код:
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
То есть, в функции ErrorsHandle() установлены биты, запущены таймеры. В основной программе в каждом цикле вызывается эта же функция с кодом несуществующей ошибки - для проверки состояния таймеров. Какой взвелся - его ошибку сбрасываем.
И именно так все обстоит при эмуляции. Гружу в живое тело - биты ошибок взводятся и не снимаются через положенные 5 секунд. Наблюдение за функцией ErrorsHandle() показывает, что оба таймера не запускались, или я неверно понимаю прилагаемую картинку.
Подскажите, что я неправильно делаю?
Просьба: не надо других способов отработки ошибок. Мне важно понять ситуацию с таймерами. Это же базовый элемент, а я с ним на ножах. Нехорошо...