--------------------------------------------------------------------Anfang Deklaration-----------------------------------------------------------------------------------------
FUNCTION_BLOCK Fb_ChangeOrUpdate_PrecentValue
(*WICHTIG*)
(*Bitte bedenke, dass dein Task Aufrufintervall immer min. doppelt so schnell sein muss, wie deine eingestellte Wertänderungsgeschwindigkeit
Beispiel:
Wertänderungsgeschwindigkeit: t#40ms
zyklische Task
Taskaufrufintervall: t#20ms
*)
VAR_INPUT
xSetOrDimmUp : BOOL;
xSetOrDimmDown : BOOL;
tShortTime: TIME := t#500ms;
END_VAR
VAR_OUTPUT
rActualPrecentValue : REAL;(*Ausgang zeigt imme den aktuell eingestellten Dimmwert an*)
rLastUpdatedPrecentValue : REAL;(*Ausgang Prozentwert nach kurz tasten (Update)*)
xUpdate : BOOL; (*Ausgang wird immer für einen Zyklus auf "True" gesetzt, sollte ein kurz tasten betätigt worden sein*)
END_VAR
VAR
TonDelayDimmUp: TON;
tUpSignal: TIME;
Ton1Inkrement: TON;
tInkrementValue: TIME := t#40ms;(*Wertänderungsgeschwindigkeit*)
flInkrement: R_TRIG;
rValue: REAL := 0;
TonDelayDimmDown: TON;
Ton1Dekrement: TON;
tDekrementValue: TIME := t#40ms;(*Wertänderungsgeschwindigkeit*)
flDekrement: R_TRIG;
tDownSignal: TIME ;
flLostSignal: F_TRIG;
END_VAR
------------------------------------------------------------Ende Deklaration---------------------------------------------------------------------------------
------------------------------------------------------------Anfang Quellcode--------------------------------------------------------------------------------
(*Init----------------------------*)
xUpdate := FALSE;
tUpSignal := tShortTime ;
tDownSignal := tShortTime;
(*--------------------------------*)
(*SET xUpDate bei kurz Tastendruck (DEFAULT: Tastendruck < t#500ms)*)
flLostSignal(CLK:=xSetOrDimmUp OR xSetOrDimmDown , Q=> );(*überwachung fallende Flanke der UP/Down Inputs*)
IF flLostSignal.Q AND NOT TonDelayDimmUp.Q AND NOT TonDelayDimmDown.Q THEN (*Set "xUpDate" WENN fallende Flanke und Tastendruck < t#500ms*)
xUpdate := TRUE;
END_IF
(*----------------------------------------------------*)
(*Einschaltverzögerung für UP and DOWN Inputs (Langtastendruck)*)
TonDelayDimmUp(IN:=xSetOrDimmUp , PT:=tUpSignal , Q=> , ET=> );
TonDelayDimmDown(IN:=xSetOrDimmDown , PT:= tDownSignal, Q=> , ET=> );
(*-----------------------------------------------------*)
(*Inkrementieren des Prozentwerts bei Langtastendruck des "xSetOrDimmUp" (Tasterverriegelung inklusieve)*)
IF TonDelayDimmUp.Q AND NOT xSetOrDimmDown THEN
Ton1Inkrement(IN:=NOT Ton1Inkrement.Q , PT:= tInkrementValue, Q=> , ET=> );
flInkrement(CLK:= Ton1Inkrement.Q, Q=> );
IF flInkrement.Q AND rValue < 99.8 THEN
rValue := rValue + 0.2;
END_IF
END_IF
(*----------------------------------------------------------------------*)
(*Dekrementieren des Prozentwertes bei Langtastendruck des "xSetOrDimmDown" (Tasterverriegelung inklusieve)*)
IF TonDelayDimmDown.Q AND NOT xSetOrDimmUp THEN
Ton1Dekrement(IN:=NOT Ton1Dekrement.Q , PT:= tDekrementValue, Q=> , ET=> );
flDekrement(CLK:= Ton1Dekrement.Q, Q=> );
IF flDekrement.Q AND rValue > 0.2 THEN
rValue := rValue - 0.2;
END_IF
END_IF
(*----------------------------------------------------------------------*)
rActualPrecentValue := rValue;(*Zuweisung der internen Variable auf den Ausgang*)
IF xUpdate THEN
rLastUpdatedPrecentValue := rValue;
END_IF
------------------------------------------------------------------------Ende Quellcode---------------------------------------------------------------------------------------------