'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.

Wiadomości - dawidr

Strony: [1]
1
Programowanie / Odp: OSCAT - kalibracja rolet
« dnia: 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:
  • Zapisuje wyjście POS z BLIND_CONTROL w VAR RETAIN PERSISTENT
  • W pierwszym cyklu zaraz po powrocie zasilania daje tą pozycję na wejście PI bloczku BLIND_CONTROL - dzięki temu jak odpali się kalibracja to roleta podjedzie do góry a następnie wróci w poprzedniej pozycij (właśnie tej wpisanej w PI). Prawie to co chiałem ale jeszcze nie do końca  :)
  • Aby zapobiec faktycznemu otwieraniu się rolet po powrocie zasilania wrzuciłem TON'a tak jak sugerowałeś
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;


2
Programowanie / Odp: OSCAT - kalibracja rolet
« dnia: 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.

3
Programowanie / Odp: OSCAT - kalibracja rolet
« dnia: 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...

4
Programowanie / Odp: OSCAT - kalibracja rolet
« dnia: 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ół.

5
Programowanie / OSCAT - kalibracja rolet
« dnia: 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;

6
Programowanie / Tablica wskaźników
« dnia: Stycznia 26, 2021, 10:56:49 pm »
Używam PFC200 do automatyki mojego domu. Jeszcze się nie przeprowadziłem do nowego miejsca ale mam już cześć rzeczy oprogramowane. Chciałem zrobić mały refactoring kodu ostatnio i zacząłem się zastanawiać czy aby zaoszczędzić trochę pamięci zamiast pakować zmienne do tabeli użyć wskażników do nich.

Zacząłem od czegoś takiego:

Deklaracja:

VAR
    Lighs: ARRAY [1..siTotalLightsCount] OF Relay;
END_VAR

Relay to jest moje POU które w środku ma WagoAppBuilding.FbLatchingRelay oraz kilka innych rzeczy

Inicjalizacja:

Lighs[1] := MainLightRelay;
Lighs[2] := WindowLightRelay;
Lighs[3] := IslandLightRelay;

Używam tego w metodzie pod POU w ten sposób:

FOR siCurrent := 1 TO siTotalLightsCount DO
    Lighs[siCurrent].xCentralOff := xCentralOffSignal;
END_FOR

No i zacząłem się zastanawiać czy może warto przerobić to na coś takiego

VAR
    Lighs: ARRAY [1..siTotalLightsCount] OF POINTER TO Relay;
END_VAR

Lighs[1] := ADR(MainLightRelay);
Lighs[2] := ADR(WindowLightRelay);
Lighs[3] := ADR(IslandLightRelay);

I użycie w metodzie:

FOR siCurrent := 1 TO siTotalLightsCount DO
    Lighs[siCurrent]^.xCentralOff := xCentralOffSignal;
END_FOR

Ma to jakiś sens? Wydzielonych pokoi mam 14, poza tymi POU mam też kilka innych. Niby nie dużo ale takie PLC to nie PC gdzie pamięc jest prawie nie ograniczona a i tak działa garbage collector i czyści co potrzeba.

7
Tematy ogólne / PFC200 - Przekaźniki
« dnia: Lipca 05, 2020, 09:13:22 pm »
Witam,

To mój pierwszy post na tym forum. Po długim zauroczeniu Arduino stwierdziałem, że nie chce robić druciarstwa w swojej szafie i postawię na sterownik PFC200 :)
Na budowie kable położone już jakiś czas temu, gwiazda, wszystko schdozi się w szafie. Elektryk wejdzie pewnie jakoś koniec sierpnia/wrzesień. W całym domu prawdopodobnie zdecyduję sie na włączniki dzwonkowe.
Poczatkowo jak myślałem jeszcze o zastosowaniu Arduino miałem plan użyć:
  • świtała - przekaźniki bistabilne dwutorowe (drugi tor do detekcji przez Arduino stanu przekaźnika)
  • rolety - elektromagnetyczne monostabilne przekaźniki

Chciałbym się dowiedzieć jakie przekaźniki stosujecie w przypadku PFC200? Jakie do świateł i jakie do rolet? Ktoś w ogóle bawi się w przekaźniki bistabilne?

Strony: [1]