Files
PLC_Library/plc_src/POU/Общие/Button_acceleration.st
T

59 lines
2.0 KiB
Smalltalk

(*
===============================================================================
Project : PLC_Library
Device : -
Path : Общие
Name : Button_acceleration
Type : FUNCTION_BLOCK
===============================================================================
*)
FUNCTION_BLOCK Button_acceleration
(* Ускорение изменения значения при нажатой кнопке *)
VAR_INPUT
Button: BOOL;
D_0: REAL := 0; (* Прирост при одиночном нажатии *)
T_W_1: TIME := T#0s; (* Время кратковременного удержания *)
T_D_1: TIME := T#200ms; (* Шаг времени прироста при кратковременном удержании *)
D_1: REAL := 0; (* Прирост при кратковременном удержании *)
T_W_2: TIME := T#0S; (* Время длительного удержания *)
T_D_2: TIME := T#200MS; (* Шаг времени прироста при длительном удержании *)
D_2: REAL := 0; (* Прирост при длительном удержании *)
Zeroes : BOOL := false; (* При этом флаге происходит сброс в 0 при дадании -D_0 << D_0 *)
END_VAR
VAR_IN_OUT
Out: REAL; (* Вход-выход который изменяется *)
END_VAR
VAR
Ton_1: TON;
Ton_2: TON;
TOF_1: TOF;
TOF_2: TOF;
R_TRIG_0: R_TRIG;
R_TRIG_1: R_TRIG;
R_TRIG_2: R_TRIG;
END_VAR
VAR_OUTPUT
END_VAR
(*----- IMPLEMENTATION -----*)
Ton_1(PT := T_W_1,IN:=Button);
Ton_2(PT := T_W_2,IN:=Button);
TOF_1(PT := T_D_1,IN:=Ton_1.Q AND NOT(TOF_1.Q) AND NOT(Ton_2.Q));
TOF_2(PT := T_D_2,IN:=Ton_2.Q AND NOT(TOF_2.Q));
R_TRIG_0(CLK:=Button AND NOT(Ton_1.Q) AND NOT(Ton_2.Q));
R_TRIG_1(CLK:=TOF_1.Q);
R_TRIG_2(CLK:=TOF_2.Q);
IF R_TRIG_0.Q THEN
Out:=Out+D_0;
END_IF
IF R_TRIG_1.Q THEN
Out:=Out+D_1;
END_IF
IF R_TRIG_2.Q THEN
Out:=Out+D_2;
END_IF
IF Zeroes AND ABS(Out) < ABS(D_0) THEN
Out:=0;
END_IF
END_FUNCTION_BLOCK