(* =============================================================================== 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