Код:(* @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




Ответить с цитированием