PDA

Просмотр полной версии : ПЛК100: таймеры при отладке



drvlas
23.04.2011, 16:37
Совершенно я извелся с таймерами КДС.

Прилагаю простой пример. В чем фишка: этот пример при отладке в режиме эмуляции прекрасно работает, а в железе - нет.

Кому влом раскручивать, приведу тексты, благо их мало:


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() показывает, что оба таймера не запускались, или я неверно понимаю прилагаемую картинку.

Подскажите, что я неправильно делаю?
Просьба: не надо других способов отработки ошибок. Мне важно понять ситуацию с таймерами. Это же базовый элемент, а я с ним на ножах. Нехорошо...

Малышев Олег
23.04.2011, 17:04
Ключем к решению является то что errorhandle - функция. Таймеры при вызове функции каждый раз создаются в стеке. То что работает на эмуляторе - это особенность реализации эмулятора. А вообще таймеры нужно создавать глобальными или внутри программы или FB.

drvlas
23.04.2011, 17:26
ЩА буду пробовать.

З.Ы. Вот, ежели не понял основ, то потом по граблям приходится ходить. Не воспринял мой организм ФБ...

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

Спасибо, Олег!