PDA

Просмотр полной версии : Непонятки по запуску таймера ТР внутри IF END_IF



АлександрРуд
26.09.2011, 18:06
Должно работать но не работает. Программа функционирует правильно до того как переменная принимает значение MBSTEP := 4;здесь же должен запуститься таймер.
Что не правильно сделал подскажите, плиз!

T_OPERATION:TP;

IF ((NOT WORK_CYCLE) AND (STA_BUTTON OR START)) THEN

WORK_CYCLE := TRUE;
RELY_SLOW := TRUE;
RELY_FAST := TRUE;
RELY_UP := FALSE;
START := FALSE;
TIME_DWORD := WORD_TO_TIME(W);
MBSTEP := 2 ;
END_IF;


IF (WORK_CYCLE AND(MBSTEP=2) AND (MBNUM_OPERATION = CUT) AND SEN_DOWN )=TRUE THEN
RELY_SLOW := TRUE;
RELY_FAST := FALSE;
MBSTEP := 3 ;
END_IF
//где-то здесь ГЛЮК, таймер не запускается видно в отладчике
IF (WORK_CYCLE AND(MBSTEP=3) AND (MBNUM_OPERATION = CUT) AND (Pbuf>P1))=TRUE THEN
T_OPERATION(IN:=TRUE,PT:= TIME_DWORD);
RELY_SLOW := 0;
MBSTEP := 4;
END_IF

IF (WORK_CYCLE AND(MBSTEP=4) AND(MBNUM_OPERATION = CUT) AND NOT T_OPERATION.Q)=TRUE THEN
RELY_UP := TRUE;
MBSTEP := 5;
END_IF

capzap
26.09.2011, 18:19
Должно работать но не работает
Я бы не был так категоричен, мое мнение что в условиях полный хаос

lara197a
26.09.2011, 18:34
Если не выполняется условие, то не обрабатыватся и таймер. он остается в непонятном состоянии.
нужно по условию включать маркер запуска таймера. И выключать не забывайте.
А таймер обрабатывать вне IF.

В целом CFPZAR ПРАВ.

capzap
26.09.2011, 19:15
чтоб не проверять условия поодиночке, используйте ELSIF или CASE, общие для всех равенства, такие как WORK_CYCLE, выведите, по назначению, в общее условие, а внутри этого условия уже проверяйте экземплярные равенства

АлександрРуд
26.09.2011, 19:20
В IF всё вроде логично:
WORK_CYCLE =TRUE включение рабочего цикла.
MBNUM_OPERATION = 0 (CUT) Тип операции (на оборудовании два типа операции вырубка0 гибка1).


Этот кусок кода точно проходит.


IF (WORK_CYCLE AND(MBSTEP=3) AND (MBNUM_OPERATION = CUT) AND (Pbuf>P1))=TRUE THEN
T_OPERATION(IN:=TRUE,PT:= TIME_DWORD);
RELY_SLOW := 0;
MBSTEP := 4;
END_IF

MBSTEP точно присваивается 4 это видно по отладчику и панель Опер. считывает четвёрку.

В отладчике для таймера
IN =TRUE;
PT = то число какое нужно;
Q = TRUE;
а вот ET =0 и не изменяется

Почему то таймер не запускается.
соответственно ET не догоняет PT и T_OPERATION.Q никогда не становится FALSE Следующее условие не выполняется
IF (WORK_CYCLE AND(MBSTEP=4) AND(MBNUM_OPERATION = CUT) AND NOT T_OPERATION.Q)=TRUE THEN

АлександрРуд
26.09.2011, 19:23
А что ST допускает вложения типа: IF
IF
END_IF
END_IF
???

capzap
26.09.2011, 20:00
допускает такое вложение, главное синтаксис выдерживать, хотя о нем и компилятор напомнит если что. А по поводу таймера, это особенность контроллеров, чтобы он "тикал" надо его запускать каждый цикл, а у Вас он один раз выполняется, потому что ограничен условием, вот и стоит на месте, выведите его за условия, в начало или в конец, помоему не так важно, вообщем об этом уже писалось выше

АлександрРуд
26.09.2011, 20:16
Спасибо за помощь действительно внутри IF ... END_IF таймер не запускается