Jestem już na takim etapie, że nowe urządzenie w domu ciekawi mnie tylko na tyle, na ile da się je podłączyć do automatyki domowej. Rekuperator powodował ekscytacje z maksymalnego krańca skali przez wbudowany port RS485 i możliwość komunikacji po MODBUSie. Oto, jak postępowało podłączenie i konfiguracja.
1. Moduł WAGO i druciki
2. Parametry komunikacji
Gdy udało mi się odczytać pierwsze komunikaty prostym programem, pobawiłem się trochę prędkością. Najwyższą, przy której komunikacja przebiega bezproblemowo jest 19 200 kbps. Pozostałe ustawienia to: parity: none, stop bit: 1, byte size: 8, flow control: 4.
3. Program w CoDeSys
W definicjach:
VAR MasterEx: MODBUS_EXTENDED_MASTER; query : typModbusExtendedQuery; reply: typModbusResponse; start: BOOL:=TRUE; queryFinished: F_TRIG; queryPending : SEMA; TimeOut : TIME := t#1s; QueryType : BYTE := 0; (*variables holding recu states*) T_ROOM_FROM, T_ROOM_TO, T_OUTSIDE_FROM, T_OUTSIDE_TO: INT; T_ROOM_SET, MODE : BYTE; HUMIDITY, FAN1, FAN2, ByPass_POS: WORD; CoilStates: ARRAY [0..2] OF WORD; Registers250: ARRAY [0..49] OF WORD; Registers300: ARRAY [0..41] OF WORD; END_VAR
W programie:
queryFinished(CLK := start); queryPending(CLAIM := start, RELEASE := queryFinished.Q); IF queryFinished.Q THEN (* Check if the reply is right and correct *) IF MasterEx.MB_Error = 0 THEN (*parse the reply!!*) CASE QueryType OF 0: (*alarms, bit status*) FOR w := 0 TO 2 DO CoilStates[w] := reply.Data[w]; END_FOR; QueryType := 1; (*move to the next query*) 1: (*temperatures, fan speeds, mode*) T_ROOM_FROM:= reply.Data[3]; T_ROOM_TO:= reply.Data[0]; T_OUTSIDE_FROM:= reply.Data[9]; T_OUTSIDE_TO:= reply.Data[6]; HUMIDITY := reply.Data[13]; FAN1 := reply.Data[15]; FAN2 := reply.Data[16]; ByPass_POS := reply.Data[24]; T_ROOM_SET := WORD_TO_BYTE(reply.Data[21]) MODE := WORD_TO_BYTE(reply.Data[20]); QueryType := 2; (*move to the next query*) 2: FOR i:=0 TO 49 DO Registers250[i] := reply.Data[i]; END_FOR; QueryType := 3; (*move to the next query*) 3: FOR i:=0 TO 41 DO Registers300[i] := reply.Data[i]; END_FOR; QueryType:= 0; (*move to the first query*) END_CASE; END_IF; ELSE QueryType := QueryType + 1; (* if error try the next query*) IF QueryType > 2 THEN QueryType := 0; END_IF; END_IF; END_IF; (*Prepare data for communication with modbus slave*) IF NOT queryPending.BUSY THEN query.SlaveAddress := 1; CASE QueryType OF 0: query.FunctionCode := 1; query.Read_StartAddress := 0; query.Read_Quantity := 45; 1: (*read inputs = WORD variables *) query.FunctionCode := 4; query.Read_StartAddress := 0; query.Read_Quantity := 40; 2: (*read inputs = WORD variables *) query.FunctionCode := 3; query.Read_StartAddress := 250; query.Read_Quantity := 50; 3: (*read inputs = WORD variables *) query.FunctionCode := 3; query.Read_StartAddress := 300; query.Read_Quantity := 41; END_CASE; start := TRUE; END_IF; (*Define function block for communication with slave*) MasterEx(ExtQuery :=query, Response := reply, bCOM_PORT:=3, cbCOM_BAUDRATE:=1920, cpCOM_PARITY:=0, csCOM_STOPBITS:=1, cbsCOM_BYTESIZE:=8, cfCOM_FLOW_CONTROL:=4, tTIME_OUT:=TimeOut, StartFunction:=start );
4. Sterowanie
Rozszerzyłem mój Dashboard o kolejny moduł, przez który mam dostęp do głównych funkcji i ustawień rekuperatora. Zrzuty z ekranu będą najlepszym opisem:
Nie wszystkie stany alarmowe są dla mnie jasne, ale widać z nich np. że filtry wymagają już wymiany. Planuję jeszcze napisać funkcję wysyłania do mnie maila przy załączeniu się kontrolki 'Filtr'.
Dorobiłem też dostęp do pozostałych parametrów konfiguracyjnych, wykorzystując dokumentację, jaką dostałem od instalatorów. Jest tam mnóstwo pozycji, które aż kuszą by je poprzełączać. Zamieszczam je poniżej by pokazać, jak wiele możliwości ustawień daje komunikacja po MODBUSie. Jeśli ktoś z czytelników potrafiłby wytłumaczyć, czego dokładnie dotyczą pozycje z rozszerzeniem :Kp i :Ki, będę bardzo wdzięczny:
Aktualizacja 02.2016
Otrzymałem wyjaśnienia niektórych funkcji konfiguracyjnych:
Odnośnie oznaczeń Kp i Ki
są to:
Kp - wzmocnie członu proporcjonalne
Ki - wzmocnienie członu całkującego
są to człony regulacyjne sterownika PI (proporcjonalno-całkującego). Gdyby był jeszcze człon różniczkujący D (Kd) to byłby to sterownik PID (proporcjonalno-całkująco-różniczkujący). Może to być też sterownik PID z czasem różniczkowania (Td) ustawionym na 0.
Widoczne na zdjęciu opcje są najpewniej regulatorami temperatury. Nazwy należy interpretować, jako [nazwa regulatora]:[nazwa członu], czyli np. RoomPI:Kp -> nazwa regulatora: RoomPI ; nazwa członu: Kp (człon proporcjonalny)
Bardzo dziękuję za pomoc!