FUNCTION_BLOCK EXHAUST_FAN
VAR_INPUT
STS1:WORD;(*UZ21_STS1*)
ALM1:WORD;(*UZ21_ALM1*)
FRIQ1:WORD;(*UZ21_FRIQ1*)
A1:WORD;(*UZ21_A1*)
END_VAR
VAR_OUTPUT
CMD1:WORD;(*UZ21_CMD1*)
SP1:WORD;(*UZ21_SP1*)
STS:WORD;(*Слово состояния у блока вентиляторов*)
MODE:WORD;(*Режим блока вентиляторов*)
FREQUENCY:WORD;(*Частота на скаду*)
AMPER:WORD;(*AMPER*)
ALM:WORD;(*Слово нарушений*)
State1:INT;
END_VAR
VAR_IN_OUT
CMD:WORD;(*Слово команд*)
Setpoint:WORD;(*Установленное значение частоты*)
END_VAR
VAR
TON:TON;(*Задержка для передачи команды*)
TON1:TON;(*Выработка нарушений*)
TON2:TON;(*Для сброса команд*)
Setpoint_old:WORD;
M_AUTO:BOOL;(*Выбран автоматический режим*)
M_DIST:BOOL:=TRUE;(*Выбран дистанционный режим*)
END_VAR
(* @END_DECLARATION := '0' *)
STS:=0; Mode:=0; ALM:=0;
(* ------------------------ Чтение ----------------------------- *)
IF M_AUTO THEN Mode := Mode OR 4; END_IF;(*Автоматический 1 Алгоритм в автоматическом режиме*)
IF M_DIST THEN Mode := Mode OR 2; END_IF;(*Дистанционный 2 Алгоритм в дистанционном режиме*)
(* ------------------------ Установка режима----------------------------- *)
IF (CMD AND 4)<>0 THEN M_AUTO:=TRUE; M_DIST:=FALSE; END_IF;(*Перевести в автоматический режим*)
IF (CMD AND 8)<>0 THEN M_AUTO:=FALSE; M_DIST:=TRUE; END_IF;(*Перевести в дистанционный режим*)
CASE State1 OF
0
*Отключен*)
IF M_DIST AND (CMD AND 1)<>0 THEN State1:=1; END_IF;
IF M_AUTO AND (CMD AND 16)<>0 THEN State1:=1; END_IF;
1
*Включается*)
TON1(IN:=TRUE, PT:=T#10s);
CMD1:=1;
SP1:=Setpoint*100;
IF FREQUENCY>=5 THEN TON1(IN:=0); State1:=2; END_IF;
IF TON1.Q THEN TON1(IN:=0); State1:=4; END_IF;
2
*Включен*)
CMD1:=1;
SP1:=Setpoint*100;
IF M_DIST AND (CMD AND 2)<>0 THEN State1:=3; END_IF;
IF M_AUTO AND (CMD AND 32)<>0 THEN State1:=3; END_IF;
3
*Отключается*)
TON1(IN:=TRUE, PT:=T#10s);
CMD1:=0;
SP1:=Setpoint*100;
IF FREQUENCY=0 THEN TON1(IN:=0); State1:=0; END_IF;
IF TON1.Q THEN TON1(IN:=0); State1:=4; END_IF;
4
*Неисправность*)
IF M_DIST AND (CMD AND 1)<>0 THEN State1:=1; END_IF;
IF M_AUTO AND (CMD AND 16)<>0 THEN State1:=1; END_IF;
IF M_DIST AND (CMD AND 2)<>0 THEN State1:=3; END_IF;
IF M_AUTO AND (CMD AND 32)<>0 THEN State1:=3; END_IF;
IF FREQUENCY>=5 THEN State1:=2; END_IF;
END_CASE;
FREQUENCY:=FRIQ1/100;
AMPER:=A1;
IF FRIQ1=0 AND STS1=0 THEN STS:=STS OR 1; END_IF; (*Отсутствует связь*)
IF FREQUENCY>5 AND State1<>4 THEN STS:=STS OR 2; END_IF;(*Включен*)
IF FREQUENCY=0 AND State1<>4 THEN STS:=STS OR 4; END_IF;(*Отключен*)
IF State1=4 THEN STS:=STS OR 16; END_IF;(*Неисправность*)
IF NOT M_DIST AND NOT M_AUTO THEN MODE:=MODE OR 1; END_IF;
IF M_DIST THEN MODE:=MODE OR 2; END_IF;
IF M_AUTO THEN MODE:=MODE OR 4; END_IF;
IF State1=4 THEN ALM:=ALM OR 2; END_IF;
TON2(IN:=CMD<>0, PT:=T#1s);
IF TON2.Q THEN CMD:=0; END_IF;(*Сбрасываем команду после ее появления*)
Setpoint_old:=Setpoint;
END_FUNCTION_BLOCK