我有 BLIND_NIGHT 的问题。这个功能块在我的情况下似乎不起作用。日落来临时我已经连接到 PLC 并且什么也没发生 我的代码如下所示:
FUNCTION_BLOCK Blind
VAR_INPUT
xBlindDown: BOOL;
xBlindUp: BOOL;
xAutoSunset: BOOL := FALSE;
xAutoSunrise: BOOL := FALSE;
tSunsetOffset: TIME;
tSunriseOffset: TIME;
END_VAR
VAR_OUTPUT
xBlindControlUp: BOOL;
xBlindControlDown: BOOL;
END_VAR
VAR
BlindInput: OSCAT_BUILDING.BLIND_INPUT := (SINGLE_SWITCH := FALSE, MAX_RUNTIME := T#25S, MANUAL_TIMEOUT := T#60M, MASTER_MODE := TRUE, IN := TRUE);
BlindControl: OSCAT_BUILDING.BLIND_CONTROL_S := (T_UP:=T#20S, T_DN:=T#18S);
BlindNight: OSCAT_BUILDING.BLIND_NIGHT;
BlindSecurity: OSCAT_BUILDING.BLIND_SECURITY;
SunTime: OSCAT_BASIC.SUN_TIME := (LATITUDE := rLatitude, LONGITUDE := rLongitude);
CurrentDateTimeUTC: DATE_AND_TIME;
CurrentDateUTC: DATE;
END_VAR
这是代码:
CurrentDateTimeUTC := FuGetDateAndTime();
CurrentDateUTC := TO_DATE(CurrentDateTimeUTC);
SunTime(UTC := CurrentDateUTC);
BlindInput(
POS:= BlindControl.POS,
S1:= xBlindUp,
S2:= xBlindDown,
);
//GVL.xInit is a global variable which is set to true after first PLC cycle
//this switch of IN state is required to stop moving of blinds after a power failure of PLC update
IF (GVL.xInit = TRUE) THEN
BlindInput.IN := FALSE;
END_IF
BlindNight(
UP := BlindInput.QU,
DN := BlindInput.QD,
S_IN := BlindInput.STATUS,
PI := BlindInput.PO,
DTIN := CurrentDateTimeUTC,
SUNRISE := SunTime.SUN_RISE,
SUNRISE_OFFSET := tSunriseOffset,
SUNSET := SunTime.SUN_SET,
SUNSET_OFFSET := tSunsetOffset,
E_NIGHT := xAutoSunset,
E_DAY := xAutoSunrise
);
BlindSecurity(
UP := BlindNight.QU,
DN := BlindNight.QD,
S_IN := BlindNight.STATUS,
PI := BlindNight.PO
);
// in order to stop moving blinds after a power failure or PLC update we need to check if PLC has been initialized
BlindControl(
UP := BlindSecurity.QU AND GVL.xInit,
DN := BlindSecurity.QD AND GVL.xInit,
S_IN := BlindSecurity.STATUS,
PI := BlindSecurity.PO
);
xBlindControlDown := BlindControl.MD;
xBlindControlUp := BlindControl.MU;
我还遇到了一个问题,即断电后百叶窗会自动升起——我不希望这就是为什么我引入了 xInit 全局变量,该变量默认为假,在第一个 PLC 循环后设置为真。由于 PLC 的重新启动并没有将百叶窗向上移动。我正在使用 IN := FALSE for BLIND_INPUT 测试整个代码,但它也没有帮助,BLIND_NIGHT 不起作用。
您在这里看到任何明显的问题吗?