9
« am: 08. April 2021, 07:37:45 »
I've problems with BLIND_NIGHT. This function block seems not to be working in my case. I've been connected to the PLC when the sunset comes and nothing happened
My code looks like this:
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
And here is the code:
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;
I also had a problem with the fact that after the power failure the blinds are going automatically up - I didn't want that is why I introduced the xInit global variable which is false by default and is set to true after the first PLC cycle. Thanks to this restart of the PLC is not moving the blinds up.
I was testing the whole code with IN := FALSE for BLIND_INPUT but it also didn't help, the BLIND_NIGHT was not working.
Do you see any obvious problems here?