FUNCTION_BLOCK Arbiter_CMD
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
CMD_PLC_old:WORD;
CMD_CLOUD_old:WORD;
CMD_PRG_old:WORD;
TON:TON;(*Приведение клоуда к прг*)
TON1:TON;(*Обнуление конфирма*)
TP:TP;(*Попытка взлома, ждем 3 мин*)
Count:INT;
Count1:INT;
R_TRIG:R_TRIG;
F_TRIG:F_TRIG;
END_VAR
VAR_IN_OUT
CMD_PLC:WORD;
CMD_CLOUD:WORD;
CMD_PRG:WORD;
Password:WORD;
Pass_const:WORD;
Confirm:WORD;
END_VAR
(* @END_DECLARATION := '0' *)
TON(IN:=CMD_CLOUD<>CMD_PRG, PT:=T#10s);
IF CMD_PLC_old<>CMD_PLC THEN
CMD_CLOUD:=0;
CMD_PRG:=CMD_PLC;
END_IF;
R_TRIG(CLK:=CMD_CLOUD<>CMD_PRG AND Password<>Pass_const);
IF R_TRIG.Q THEN
Confirm:=2; Count:=Count+1;
END_IF;
(*Попытка взлома, ждем 3 мин*)
IF Count>=3 THEN TP(IN:=TRUE, PT:=T#3m); END_IF;
F_TRIG(CLK:=TP.Q);
IF F_TRIG.Q THEN Count:=0; Count1:=Count1+1; TP(IN:=FALSE); END_IF;
IF CMD_CLOUD<>CMD_PRG AND
Password=Pass_const AND
NOT TP.Q THEN
CMD_PLC:=CMD_CLOUD;
CMD_PRG:=CMD_CLOUD;
Confirm:=1;
END_IF;
TON1(IN:=Confirm<>0, PT:=T#10s);
IF TON1.Q THEN Confirm:=0; Password:=0; END_IF;
IF CMD_PRG_old<>CMD_PRG THEN
CMD_PLC:=CMD_PRG;
CMD_CLOUD:=CMD_PRG;
END_IF;
IF TON.Q THEN CMD_CLOUD:=CMD_PRG; END_IF;
CMD_PLC_old:=CMD_PLC;
CMD_CLOUD_old:=CMD_CLOUD;
CMD_PRG_old:=CMD_PRG;
END_FUNCTION_BLOCK