Używamy plików cookies (tzw. ciasteczka) by spersonalizować treść i ogłoszenia oraz by analizować ruch na stronie.  W sposób automatyczny dzielimy się informacjami o Twoim użyciu tego portalu z dostawcami ogłoszeń, którzy mogą połączyć te informacje z informacjami, które im udzieliłaś/łeś lub, które sami zebrali. Korzystanie z witryny bez zmiany ustawień dotyczących cookies oznacza, że będą one zamieszczane w Państwa urządzeniu końcowym.  Możecie Państwo dokonać w każdym czasie zmiany ustawień dotyczących cookies zmieniając opcje przeglądarki.

Komunikacja z rekuperatorem (MODBUS)

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.

Reku box

 

1. Moduł WAGO i druciki

RS485 wires 

Może fachowcy będą się śmiać, ale dla mnie wymyślenie, co podłączyć z czym, było wyzwaniem. Moduł 750-653/003 zakupiłem na allegro w dobrej cenie. Podłączenie go do sterownika oznaczało przesunięcie wszystkich adresów o kolejne 2 słowa, ale to nic nowego. Podłączenie do rekuperatora wymagało nabycie wtyczek RJ11, których nie miałem na stanie. Po stronie PLC są tradycyjne wtyki zaciskowe.

Kilka prób, stanów zniechęcenia oraz poszukiwania przykładów w sieci zaprowadziły mnie do podłączenia przewodów, jak na zdjęciu obok.

Jak widzicie wejścia Rx połączone są z Tx, jako że komunikacja odbywa się w half-duplex, czyli, jak rozumiem jednokierunkowo.  Przewód COM podłączony jest do 3. dziurki modułu RS. Po stronie rekuperatora jest łatwiej, we wtyczce RJ pierwszy przewód z lewej to COM, dwa wewnętrzne to A i B, skrajny prawy to 24V (niewykorzystany).

Odległość między rekuperatorem a sterownikiem WAGO to ok. 20m.  

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:

Reku visu1

Reku visu2

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:

Reku registers1   Reku registers2

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!