'Inteligenty' dom ze sterownikiem PLC

Główna => Programowanie => Wątek zaczęty przez: dawidr w Lutego 12, 2021, 09:20:59 pm

Tytuł: OSCAT - kalibracja rolet
Wiadomość wysłana przez: dawidr w Lutego 12, 2021, 09:20:59 pm
Używam bloków BLIND_INPUT oraz BLIND_CONTROL_S. Po zrobieniu prostego przykładu i odpaleniu PLC (albo po zaniku zasilania) zgodnie z dokumentacją odpala się kalibracja rolet:

BLIND_CONTROL_S
The module supports automatic calibration, which can cause, after a
power failure, to move up all blinds, which is undesired some times in your
absence. Therefore, in case of your absence the desired position of the
blinds should be given to the input PI. The blinds move to up position for
calibration, and then automatically move into the desired position. The automatic
calibration however can be prevented if both inputs UP and DN
are FALSE.


Teoretycznie można ustawić PI i roleta po kalibracji powinna wrócić do tej pozycji ale chciałbym to całkowicie wyłaczyć. Komuś udało się to zrobić? Chciałbym aby po zaniku i powrocie napięcia rolety zostały w tym miejscu w którym były przez zanikiem napięcia.


VAR
   GarageBlindInput: OSCAT_BUILDING.BLIND_INPUT := (SINGLE_SWITCH := FALSE, PI := 10, MAX_RUNTIME := T#25S, MANUAL_TIMEOUT := T#60M, MASTER_MODE := TRUE);
   GarageBlindControl: OSCAT_BUILDING.BLIND_CONTROL_S := (T_UP:=T#20S, T_DN:=T#18S);
END_VAR

GarageBlindInput(
   POS:= GarageBlindControl.POS,
   S1:= xBlindUp,
   S2:= xBlindDown,
);

GarageBlindControl(
   UP := GarageBlindInput.QU,
   DN := GarageBlindInput.QD,
   S_IN := GarageBlindInput.STATUS,
   PI := GarageBlindInput.PO
);

xBlindControlDown := GarageBlindControl.MD;
xBlindControlUp := GarageBlindControl.MU;
Tytuł: Odp: OSCAT - kalibracja rolet
Wiadomość wysłana przez: dawidr w Marca 26, 2021, 11:27:31 am
Ktoś jeszcze ma podobny problem? Próbowałem już chyba wszystkiego ale bez skutku.

Zrobienie czegoś takiego jak sugeruje dokumentacja:

GarageBlindControl(
   UP := GarageBlindInput.QU,
   DN := GarageBlindInput.QD,
   S_IN := GarageBlindInput.STATUS,
   PI := GarageBlindInput.PO
);

GarageBlindControl.UP := GarageBlindInput.QU
GarageBlindControl.DN := GarageBlindInput.QD

Faktycznie powoduje wyłączenie kalibracji ale wtedy przestają działać przyciski góra/dół.
Tytuł: Odp: OSCAT - kalibracja rolet
Wiadomość wysłana przez: dar3k w Kwietnia 27, 2021, 11:00:35 am
Trochę dookoła ale może zadziałać.
OUT1 := Control_Blind.MU AND NOT BLOK

A zmienną BLOK ustaw jako TON np.
BLOK(IN:=TRUE,PT:=T#1m)

Wtedy kalibracja się wykona a roleta nie ruszy, minus taki, że według sterownika wszystkie rolety będą w stanie max do góry i jeżeli dodałeś sobie zabezpieczenie przeciw załączaniu wyjścia dla rolety już podniesionej to nie podniesiesz jej będziesz musiał kliknąć "dół" poczekać i dopiero góra. Ta kalibracja jest po to aby sterownik znał położenie rolety, którego nie da się na stałe zapisać (aby zostało w pamięci po utracie zasilania, dlatego przy starcie się wykonuje).
Tytuł: Odp: OSCAT - kalibracja rolet
Wiadomość wysłana przez: dawidr w Kwietnia 28, 2021, 10:25:49 pm
Ta kalibracja jest po to aby sterownik znał położenie rolety, którego nie da się na stałe zapisać (aby zostało w pamięci po utracie zasilania, dlatego przy starcie się wykonuje).

@dar3k Masz rację z tą kalibracją. Wiem, że jest potrzebna ale moim celem jest aby po zaniku zasilania nie było potrzeby kalibracji. Wrzuciłem BLIND_CONTROL_S do VAR RETAIN PERSISTENT ale to nie pomogło. Dodatkowo zapamiętuje również wyjście POS z BLIND_CONTROL_S które następnie jest podawane na POS w BLIND_INPUT. A wiec teoretycznie po powrocie zasilania BLIND_INPUT powinien wiedzieć w jakiej pozycji była roleta po zaniku zasilania.

Ale nic z tego, za każdym razem rolety jadą w górę. Mogą wrócić do wcześniejszego miejsca jeżeli w BLIND_INPUT w PI tam tą zapamiętaną pozycję ale nadal jadą do góry...
Tytuł: Odp: OSCAT - kalibracja rolet
Wiadomość wysłana przez: dar3k w Kwietnia 29, 2021, 07:41:09 am
To jak mogą wrócić do poprzedniego miejsca to zablokuj wyjście sterownika (logicznie) na ok minutę czy dwie po powrocie zasilania to otwarcie i ponowne zamknięcie zostanie wykonane ale bez "1" na wyjściu.
W przykładzie co dodałem poprzednio nie powinno być negacji bo z negacja działa odwrotnie.
Tytuł: Odp: OSCAT - kalibracja rolet
Wiadomość wysłana przez: dawidr w Kwietnia 29, 2021, 07:58:26 am
Blokada wyjścia to jest jakieś rozwiązanie i jeżeli nic innego nie znajdę to pewnie się na nie zdecyduje. Zastanawiam się tylko czy po prostu da się coś więcej zapamiętać w VAR RETAIN PERSISTENT co by spowodowało, że kalibracja byłaby nie potrzebna.
Tytuł: Odp: OSCAT - kalibracja rolet
Wiadomość wysłana przez: dawidr w Kwietnia 30, 2021, 11:20:40 am
to zablokuj wyjście sterownika (logicznie) na ok minutę czy dwie po powrocie zasilania to otwarcie i ponowne zamknięcie zostanie wykonane ale bez "1" na wyjściu.

Ostatecznie zrobiłem tak:
A więc ostatecznie BLIND_CONTROL robię "wirtualną kalibrację". Rolety niby jadą do góry a potem wracają do poprzedniej pozycji ale fizycznie stoją w miejscu.

Kod wygląda mniej więcej tak (zbędne linijki wywalone):

FUNCTION_BLOCK Blind
VAR_INPUT
    xBlindDown: BOOL;
    xBlindUp: BOOL;
    xAutoSunset: BOOL := FALSE;
    xAutoSunrise: BOOL := FALSE;
    tMaxRuntime: TIME := T#32S;
    tTimeUp: TIME := T#30S;
    tTimeDown: TIME := T#30S;


END_VAR
VAR_OUTPUT
    xBlindControlUp: BOOL;
    xBlindControlDown: BOOL;
END_VAR
VAR_IN_OUT
    PersistentData: BlindData; //this data is stored in VAR RETAIN PERSISTENT in the PLC_PRG
END_VAR
VAR
    _oBlindInput: OSCAT_BUILDING.BLIND_INPUT := (MAX_RUNTIME := tMaxRuntime, MANUAL_TIMEOUT := T#2M);
    _oBlindNight: OSCAT_BUILDING.BLIND_NIGHT;
    _oBlindSecurity: OSCAT_BUILDING.BLIND_SECURITY;
    _oBlindControl: OSCAT_BUILDING.BLIND_CONTROL_S;   
    _xInitPosition: BOOL := FALSE;
    _byBlindControlPosition: BYTE;
    _calibrationBlocker: TON;
    _xMasterMode: BOOL := FALSE;       
END_VAR

_calibrationBlocker(IN := TRUE, PT := T#90S);


_oBlindInput(
    POS:= PersistentData.byCurrentPosition,
    S1:= xBlindUp,
    S2:= xBlindDown,
    MASTER_MODE := _xMasterMode
);


_oBlindNight(
    UP := _oBlindInput.QU,
    DN := _oBlindInput.QD,
    S_IN := _oBlindInput.STATUS,
    PI := _oBlindInput.PO,
    DTIN := _dtCurrentDateTimeUTC,
    SUNRISE := _oSunTime.SUN_RISE,
    SUNSET := _oSunTime.SUN_SET,
    E_NIGHT := xAutoSunset,
    E_DAY := xAutoSunrise
);


_oBlindSecurity(
    UP := _oBlindNight.QU,
    DN := _oBlindNight.QD,
    S_IN := _oBlindNight.STATUS,
    PI := _oBlindNight.PO,
);


IF (NOT _xInitPosition) THEN
    // in the first cycle lets read last position saved before the power failure and set it to _oBlindControl PI input
    // this will casue the _oBlindControl to move to last position after calibration
    // we are reading the position only onece - in the first cycle after the power is back
    _byBlindControlPosition := PersistentData.byCurrentPosition;
END_IF


IF (_calibrationBlocker.Q) THEN
    // then, after calibration, just read the position from previous block (standard behaviour)
    _byBlindControlPosition := _oBlindSecurity.PO;
   
    // switch master mode back to true, initially it is false because we need to transfer PersistentData.byCurrentPosition change to all
    // the block (when the _oBlindControl is calibrating)   
    _xMasterMode := TRUE;
END_IF


_xInitPosition := TRUE;


_oBlindControl(
    T_UP := tTimeUp,
    T_DN := tTimeDown,
    UP := _oBlindSecurity.QU,
    DN := _oBlindSecurity.QD,
    S_IN := _oBlindSecurity.STATUS,
    PI := _byBlindControlPosition,
    POS => PersistentData.byCurrentPosition
);


// set outputs after the calibration (when _calibrationBlocker.Q is TRUE after 90 seconds)
// we don't need real calibration as we are saving last know position (before the power failure/full download) in PersistentData.byCurrentPosition
xBlindControlDown := _oBlindControl.MD AND _calibrationBlocker.Q;
xBlindControlUp := _oBlindControl.MU AND _calibrationBlocker.Q;

Tytuł: Odp: OSCAT - kalibracja rolet
Wiadomość wysłana przez: dar3k w Kwietnia 30, 2021, 09:53:18 pm
Chyba inaczej tego nie ogarniesz bo kalibracja wstępna jest zaszyta w bibliotece i tego chyba się nie przeskoczy.