Код:
(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '\/EXE' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
FUNCTION_BLOCK BTN_DIMM
VAR_INPUT
IN:BOOL;
    Addr:BYTE;
END_VAR
VAR_OUTPUT
END_VAR
VAR
FB_DALIV2DirectArcPowerControl:FB_DALIV2DirectArcPowerControl;
byPower,byPower_old:BYTE;
    State:INT;
bStart:BOOL;
Count:INT;
TON,TON1:TON;
    TP:TP;
    LAST_VALUE:BYTE:=254;
R_TRIG:R_TRIG;
F_TRIG:F_TRIG;
END_VAR
(* @END_DECLARATION := '0' *)
IF LAST_VALUE>254 THEN LAST_VALUE:=254; END_IF;

IF IN THEN Count:=Count+1; END_IF;
TON(IN:=NOT TON.Q, PT:=T#50ms);
TON1(IN:=NOT TON1.Q, PT:=T#80ms);

R_TRIG(CLK:=IN);
F_TRIG(CLK:=IN);

CASE State OF
0:(*Свет не горит*)
State:=State;
byPower:=0;
IF Count>3 AND Count<30 AND F_TRIG.Q THEN  byPower:= LAST_VALUE; Count:=0; State:=2; END_IF;(*Короткий импульс на свет горит*)
IF Count>30  AND  IN THEN Count:=0; State:=1; END_IF;(*Длительный импульс на свет разгорается*)

1:(*Свет загорается*)
State:=State;
IF IN AND byPower<= 255 AND TON1.Q THEN
    IF byPower<= 254 THEN byPower:=byPower+1; END_IF;
END_IF;

IF NOT IN THEN LAST_VALUE:=byPower; Count:=0; State:=2; END_IF;(*Значит кнопку отпустили*)
IF byPower>= 254 THEN Count:=0; State:=2; END_IF;(*Значит достигли предела*)

2:(*Свет горит*)
State:=State;
IF Count>3 AND Count<100 AND F_TRIG.Q THEN  Count:=0; State:=0; END_IF;(*Короткий импульс на отключение*)
(*IF Count>30  AND  IN THEN Count:=0; State:=3; END_IF;Длительный импульс*)
IF Count>30 AND IN AND byPower<= 255 THEN  Count:=0; State:=3; END_IF; (*Уменьшаем яркость*)
IF Count>100 THEN Count:=0; END_IF;

3:(*Уменьшаем яркость*)
State:=State;
IF Count>30 AND IN AND byPower<= 255 AND TON1.Q THEN
    IF byPower>10 THEN byPower:=byPower-1; END_IF;
    LAST_VALUE:=byPower;
END_IF;
IF Count>100 THEN Count:=0; END_IF;
IF F_TRIG.Q THEN State:=2; END_IF; (*Свет по прежнему горит*)

END_CASE;

TP(IN:=(byPower_old<>byPower), PT:=T#300ms); 
IF TP.Q THEN bStart:=TRUE; ELSE bStart:=FALSE; END_IF;

(*Блок записи на шине DALI*)
FB_DALIV2DirectArcPowerControl(
    bStart:= TON.Q, 
    nAddr:= Addr, 
    eAddrType:= eDALIV2AddrTypeShort, 
    eCommandPriority:= eDALIV2CommandPriorityHigh, 
    nArcPowerLevel:= byPower, 
    stCommandBuffer:= stComBuf, 
    bBusy=> , 
    bError=> , 
    nErrorId=> );

byPower_old:=byPower;(*Отлавливаю изменение уставки*)
END_FUNCTION_BLOCK