# Wago 750-841 Modbus TCP Master vs. HELIOS KWL



## Matze001 (25 Mai 2016)

Hallo zusammen,

ich bin gerade dabei eine Wago 750-841 mit einer Helios KWL (KWL EC 300W R IGE4) via Modbus TCP zu verheiraten.
Mit einem Testtool am PC habe ich die Modbuskommunikation am Laufen, und ich kann entsprechend der Anleitung von
Helios (hier zu finden: https://www.heliosselect.de/cms/front_content.php?idart=21&idcat=17&artnr=04232 ) Daten austauschen.
Abgesehen davon, dass ich das Prinzip etwas... nervig finde... funktioniert das.

Wenn ich nun mit der Wago dran gehe, bekomme ich mit dem Bauteil MODBUS_ETHERNETMASTER_TCP die Fehlernummer 3 - Laut Doku 0x0003 – Illegal data value. Okay... now what? Damit kann ich leider wenig anfangen.

Anbei Bilder von meinem Programmtest. Vielleicht hat jemand spontan eine Idee:

Infos:

IP der Helios KWL : 192.168.51.40
Port: 502
Slave ID 180
Register 1 fortfolgend

Sendedaten müssen etwa so aussehen:

string: v00004null

byte hex: 76 30 30 30 30 34 00
byte dez: 118 48 48 48  48 52
registers: 7630 3030 3034 0000


Sowohl nur schreiben oder nur lesen habe ich probiert ... immer brav mit Fehler.
Was ich leider nicht genau nachvollziehen kann, ist wo der Fehler her kommt und ob die Register auch wirklich so 
"zusammengesetzt" werden wie ich mir das vorstelle, oder ob ich da einen Denkfehler habe.

Es wäre super wenn jemand eine Idee für mich hätte 

Grüße

Marcel


----------



## HMIman (25 Mai 2016)

Hi!
Modbus ist eigentlich ganz einfach. Modbus kennt eigentlich nur 2 Datentypen. Das ist ein Register (16 Bit) und Bool (1 Bit). Ob gelesen oder geschrieben wird bestimmt der s.g. Funktions-Code (z. Bsp 0x03 für ein Register lesen, 0x04 für ein Register lesesn/schreiben usw.). Vorsicht! Beim Funktions-Code muss man immer darauf achten, ob man in der Protokoll-Schicht arbeitet oder in der Applikations-Schicht. Bei den WAGO-Bausteinen arbeitet man meiner Meinung nach in der Applikationsschicht.

Bei Deinem Bild fällt mir folgendes auf: Die Unit-ID 180 ist ungewöhnlich. Eigentlich ist der Slave mit der IP-Adresse schon eindeutig adressiert. Wenn trotzdem eine Unit-ID mitgeschickt wird (ist noch ein überbleibsel von Modbus RTU) ist das in der Regel die Unit-ID 1. Nur wenige Modbus TCP-Geräte werten wirklich die Unit-ID aus.
Funktions-Code 0x17. Das ist ein s.g. Multiple Funktion. Du liest oder schreibst mehrere Register am Stück. Funktioniert das mit Deiner PC-Software? Welche Funktions-Codes verwendest Du dort? Wenn der Datenblock nicht konsistent ist (nicht alle Adressen vorhanden) den Du lesen/schreiben möchtest, geht der Multiple-Befehl schief!
Ich würde zunächst mal probieren nur ein Register zu lesen/schreiben. Wenn das funktioniert, dann weiter heran tasten.
Bohr mal das Timeout auf! 500 ms sind knapp. Ruhig 3 s eintragen.

Gruß
HMIman


----------



## MSB (25 Mai 2016)

Naja, also was auf jeden Fall auffällt, im Word 0 der Sendedaten hast du "118" stehen, was aber auf gar keinen Fall nicht 16#7630 entspricht.

Als FC wird im Handbuch FC3 sowie FC16 verwendet.


----------



## PN/DP (25 Mai 2016)

Sendedaten ist ein Byte-Array
Dezimal: 118 48 48 48 ... = B#16#76 30 30 30 ... = W#16#7630 3030 ...

Harald


----------



## Matze001 (25 Mai 2016)

Danke für die schnellen Antworten!

Unit-ID 180 ist pflicht, mit ID 1 geht es mit der PC-Software auch nicht. Dazu steht etwas im Kapitel 1.3 der Doku (Angehängt).
Bei der PC Software schreibe ich erst (16#10) und lese dann holding Register. Das Foto ist bei einem Test entstanden, das ganze habe ich bereits ausprobiert.

Der Doku ist auch zu entnehmen, dass man in den Register 1 eine Anforderung schreibt, und dann die Register liest, und dort die Antwort eingefügt wird.

Grüße

Marcel


----------



## MSB (25 Mai 2016)

@PN/DP
Hab ich dann auch noch gesehen, nur ich wäre mir jetzt trotzt halbwegs passabler Kenntnis von Wago, 
nicht sicher ob vom Speicheralignment her bei einem Array of Byte, 2 Byte 1 Wort oder 2 Worte belegen.

Imho geht das bei Codesys sogar soweit, das dass letzten Endes vom Prozessor im Zielsystem abhängt.


----------



## Matze001 (25 Mai 2016)

Bingo! Mit nem Array of Word und den passenden Werten tut es.

Danke! Manchmal fehlt einem der letzte kleine Tick ...

Grüße

Marcel


----------



## Matze001 (3 Januar 2020)

Hallo Zusammen,

ich hab eine PM zum Helios bekommen, und wollte die Fragen und vor allem Antworten hier online stellen, da ich finde das diese auch anderen nutzen können.

Frage1: Wo bekomme ich die Modbus Lib her?

Antwort1: Hier: https://www.wago.com/de/d/16154

Frage2: Kann man den Bypass unabhängig der Einstellungen ein/aus schalten

Antwort2: Leider nein -> Ich hatte mir damit beholfen die Grenzwerte für die Temperaturen so zu verstellen, dass die passenden Bedingungen erfüllt wurden.
Dazu habe ich mit den Werten gespielt und wir an Ahhängigkeiten gebaut die immer zutreffen.

Frage 3: Kann man die Lüftungsanlage in Ruhebetrieb versetzen.

Antwort3: Da ich nur die 300er habe habe ich die Steuerung auf Manuell gestellt und die Lüfterstufe auf 0 gestellt.

Ich hoffe die Antworten helfen, bei Rückfragen einfach melden.

Grüße

Marcel


----------



## Matze001 (20 Januar 2020)

Hallo Zusammen,

hier mein Code von meiner 841er. Er ist nicht toll - aber er funktioniert 
Darf gern optimiert werden - würde es heute auch anders machen...

Grüße

Marcel


```
PROGRAM LUEFTUNG_ALLGEMEIN
VAR

    LUEFTUNGSANLAGE: ETHERNET_MODBUSMASTER_TCP;
    Lueftung_Empfangsdaten: ARRAY[0..19] OF BYTE;
    Lueftung_Sendedaten: ARRAY[0..9] OF WORD;
    Lueftung_Sendedaten_Puffer: ARRAY[0..5,0..9] OF WORD;
    Lueftung_Senden_Start: BOOL;
    Lueftung_Reset: BOOL;


    Temperatur_Aussen: REAL;
    Temperatur_Zuluft: REAL;
    Temperatur_Fortluft: REAL;
    Temperatur_Abluft: REAL;
    Filterwechsel_Restlaufzeit_Tage: DINT;

      Lueftung_Plus: BOOL;
    Lueftung_Minus: BOOL;


    SK1_NR: INT;
    SK1_NR_ALT:INT;
    R_TRIG_SENDEN: R_TRIG;
    TON_TIMEOUT_SENDEN: TON;
    TON_AUSSENTEMP_MAX: TON;
    R_TRIG_AUSSENTEMP: R_TRIG;
    F_TRIG_AUSSENTEMP: F_TRIG;
    TON_CLK:TON;
END_VAR

VAR RETAIN PERSISTENT
    Luefterstufe: BYTE;
      Bypass_Min_Aussentemperatur: INT;
    Bypass_Ablufttemperatur: INT;
      Maximalwert_Temperatur_Aussen: REAL;
END_VAR

VAR_TEMP
    TMP_ZEHNERSTELLE: INT;
    TMP_EINSERSTELLE:INT;
    TMP_CNT_I:INT;
END_VAR
VAR_INPUT
    ueftung_Sendedaten_Puffer: BOOL;
END_VAR
```



```
LUEFTUNGSANLAGE(
strIP_ADDRESS:='192.168.XXX.YYY',
wPORT := 502,
bUNIT_ID := 180,
bFUNCTION_CODE := 16#17,
wREAD_ADDRESS := 1,
wREAD_QUANTITY := 10,
ptREAD_DATA := ADR(Lueftung_Empfangsdaten),
wWRITE_ADDRESS := 1,
wWRITE_QUANTITY := 10,
ptSEND_DATA := ADR(Lueftung_Sendedaten),
xSTART := (Lueftung_Senden_Start),
xRESET :=Lueftung_Reset,
tTIME_OUT := t#3s
);

TON_TIMEOUT_SENDEN(IN:= Lueftung_Senden_Start, PT:= t#5s);
R_TRIG_SENDEN(CLK:=LUEFTUNGSANLAGE.xREADY);

(* Sendepuffer verwalten *)
(* ########################################################### *)

(* Wenn etwas im Sendepuffer steht dies senden *)
IF Lueftung_Sendedaten_Puffer[0,0] <> 16#00 THEN
Lueftung_Sendedaten[0] := Lueftung_Sendedaten_Puffer[0,0];
Lueftung_Sendedaten[1] := Lueftung_Sendedaten_Puffer[0,1];
Lueftung_Sendedaten[2] := Lueftung_Sendedaten_Puffer[0,2];
Lueftung_Sendedaten[3] := Lueftung_Sendedaten_Puffer[0,3];
Lueftung_Sendedaten[4] := Lueftung_Sendedaten_Puffer[0,4];
Lueftung_Sendedaten[5] := Lueftung_Sendedaten_Puffer[0,5];
Lueftung_Sendedaten[6] := Lueftung_Sendedaten_Puffer[0,6];
Lueftung_Sendedaten[7] := Lueftung_Sendedaten_Puffer[0,7];
Lueftung_Sendedaten[8] := Lueftung_Sendedaten_Puffer[0,8];
Lueftung_Sendedaten[9] := Lueftung_Sendedaten_Puffer[0,9];
Lueftung_Senden_Start  := TRUE;
END_IF;



(* Wenn Daten erfolgreich gesendet wurden diese löschen *)
IF R_TRIG_SENDEN.Q THEN

    Lueftung_Senden_Start   := FALSE;

    Lueftung_Sendedaten[0] := 16#00;
    Lueftung_Sendedaten[1] := 16#00;
    Lueftung_Sendedaten[2] := 16#00;
    Lueftung_Sendedaten[3] := 16#00;
    Lueftung_Sendedaten[4] := 16#00;
    Lueftung_Sendedaten[5] := 16#00;
    Lueftung_Sendedaten[6] := 16#00;
    Lueftung_Sendedaten[7] := 16#00;
    Lueftung_Sendedaten[8] := 16#00;
    Lueftung_Sendedaten[9] := 16#00;

(* Puffer aufrücken *)
FOR TMP_CNT_I:=0 TO 4 DO
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),0];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),1];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),2];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),3];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),4];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),5];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),6];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),7];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),8];
    Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := Lueftung_Sendedaten_Puffer[(TMP_CNT_I+1),9];

END_FOR

    (* Letzten Puffereintrag löschen *)
    Lueftung_Sendedaten_Puffer[5,0] := 16#00;
    Lueftung_Sendedaten_Puffer[5,1] := 16#00;
    Lueftung_Sendedaten_Puffer[5,2] := 16#00;
    Lueftung_Sendedaten_Puffer[5,3] := 16#00;
    Lueftung_Sendedaten_Puffer[5,4] := 16#00;
    Lueftung_Sendedaten_Puffer[5,5] := 16#00;
    Lueftung_Sendedaten_Puffer[5,6] := 16#00;
    Lueftung_Sendedaten_Puffer[5,7] := 16#00;
    Lueftung_Sendedaten_Puffer[5,8] := 16#00;
    Lueftung_Sendedaten_Puffer[5,9] := 16#00;

END_IF;

(* Bei Timeout senden zurücksetzen *)
IF TON_TIMEOUT_SENDEN.Q THEN
    Lueftung_Senden_Start   := FALSE;
END_IF;

(* Takt erzeugen für zyklische Abfragen *)
TON_CLK(IN:=NOT TON_CLK.Q,PT:=t#10s);

(* SK1 NR Wegsichern und erhöhen mit jedem Takt *)
SK1_NR_ALT := SK1_NR;
IF TON_CLK.Q THEN
    SK1_NR:=SK1_NR + 10;
END_IF;

(* Wenn die SK1_NR zu groß ist diese zurücksetzen *)
IF SK1_NR > 60 THEN
    SK1_NR:=0;
END_IF;

(* Timer für Auswertung ob Außentemperatur über Grenzwerk ist *)
TON_AUSSENTEMP_MAX(IN:=(Temperatur_Aussen < Maximalwert_Temperatur_Aussen), PT:=t#30s);
R_TRIG_AUSSENTEMP(CLK:=TON_AUSSENTEMP_MAX.Q);
F_TRIG_AUSSENTEMP(CLK:=TON_AUSSENTEMP_MAX.Q);


(* Sendedaten aufbereiten *)
(* ########################################################### *)


(* Sendetelegramm - Temperatur Aussen  v00104*)

IF SK1_NR = 0 AND SK1_NR <> SK1_NR_ALT THEN

    FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3031;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3034;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

    END_FOR;

END_IF;


(* Sendetelegramm - Temperatur Zuluft  v00105*)
IF SK1_NR = 10 AND SK1_NR <> SK1_NR_ALT THEN

    FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3031;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3035;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

    END_FOR;

END_IF;


(* Sendetelegramm - Temperatur Fortluft  v00106*)
IF SK1_NR = 20 AND SK1_NR <> SK1_NR_ALT THEN

    FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3031;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3036;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

    END_FOR;

END_IF;


(* Sendetelegramm - Temperatur Abluft  v00107*)
IF SK1_NR = 30 AND SK1_NR <> SK1_NR_ALT THEN

    FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3031;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3037;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

    END_FOR;

END_IF;


(* Sendetelegramm - Filterwechsel Restlaufzeit in Minuten  v01033*)
IF SK1_NR = 40 AND SK1_NR <> SK1_NR_ALT THEN

    FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3130;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3333;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

    END_FOR;

END_IF;


(* Sendetelegramm - Bypass min. Temperatur Aussentemperatur  v01036*)
TMP_ZEHNERSTELLE := (Bypass_Min_Aussentemperatur / 10);
TMP_EINSERSTELLE := (Bypass_Min_Aussentemperatur -  (TMP_ZEHNERSTELLE * 10));

IF FALSE AND SK1_NR = 50 AND SK1_NR <> SK1_NR_ALT THEN

    FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3130;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3336;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := 16#3D30 + TMP_ZEHNERSTELLE;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#3000 + (TMP_EINSERSTELLE * 256);
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

    END_FOR;

END_IF;

(* Sendetelegramm - Bypass min. Temperatur Aussentemperatur  v01035*)

TMP_ZEHNERSTELLE := (Bypass_Ablufttemperatur / 10);
TMP_EINSERSTELLE := (Bypass_Ablufttemperatur -  (TMP_ZEHNERSTELLE * 10));

IF FALSE AND SK1_NR = 60 AND SK1_NR <> SK1_NR_ALT THEN

    FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3130;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3335;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := 16#3D30 + TMP_ZEHNERSTELLE;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#3000 + (TMP_EINSERSTELLE * 256);
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

    END_FOR;

END_IF;


(* Sendetelegramm - Lüfterdrehzahl verstellen  v00102*)

IF Lueftung_Plus THEN
Luefterstufe := Luefterstufe + 1;
END_IF;

IF Lueftung_Minus THEN
Luefterstufe := Luefterstufe - 1;
END_IF;

IF Luefterstufe < 0 THEN
Luefterstufe := 0;
END_IF

IF Luefterstufe > 4 THEN
Luefterstufe := 4;
END_IF


(* Wenn die Aussentemperatur unter die Max Temperatur gefallen
    ist die Belüftung wieder auf die eingestellte Stufe einschalten     *)
IF R_TRIG_AUSSENTEMP.Q OR Lueftung_Plus OR Lueftung_Minus THEN

Lueftung_Plus := FALSE;
Lueftung_Minus := FALSE;



(*
FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3031;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3032;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := (16#3D30 + Luefterstufe);
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

END_FOR;
*)
END_IF;

(* Wenn die Aussentemperatur über die Max Temperatur gestiegen
    ist die Belüftung abschalten     *)
IF FALSE AND F_TRIG_AUSSENTEMP.Q THEN


FOR TMP_CNT_I:=0 TO 5 DO

    IF Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] = 16#00 THEN
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,0] := 16#7630;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,1] := 16#3031;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,2] := 16#3032;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,3] := 16#3D30;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,4] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,5] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,6] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,7] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,8] := 16#0000;
        Lueftung_Sendedaten_Puffer[TMP_CNT_I,9] := 16#0000;
        EXIT;
    END_IF;

END_FOR;

END_IF;






(* Auswertung der Empfangsdaten *)
(* ########################################################### *)


(* Temperatur Aussen wurde empfangen v104*)
IF
Lueftung_Empfangsdaten[2] = 16#31 AND
Lueftung_Empfangsdaten[3] = 16#30 AND
Lueftung_Empfangsdaten[4] = 16#34 AND
Lueftung_Empfangsdaten[5] = 16#30
THEN
    (* Wenn der Messwert einstellig ist gibt es einen anderen Bereich *)
    IF Lueftung_Empfangsdaten[9] = 16#2E THEN

    Temperatur_Aussen :=
    (
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[06] - 48) * 01.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[08] - 48) * 00.1)
    )
    ;


    ELSE

    Temperatur_Aussen :=
    (
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[06] - 48) * 10.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[09] - 48) * 01.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[11] - 48) * 00.1)
    )
    ;

    END_IF;

END_IF


(* Temperatur Zuluft wurde empfangen v105*)
IF
Lueftung_Empfangsdaten[2] = 16#31 AND
Lueftung_Empfangsdaten[3] = 16#30 AND
Lueftung_Empfangsdaten[4] = 16#35 AND
Lueftung_Empfangsdaten[5] = 16#30
THEN

(* Wenn der Messwert einstellig ist gibt es einen anderen Bereich *)
    IF Lueftung_Empfangsdaten[9] = 16#2E THEN

    Temperatur_Zuluft :=
    (
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[06] - 48) * 01.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[08] - 48) * 00.1)
    )
    ;


    ELSE
    Temperatur_Zuluft :=
    (
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[06] - 48) * 10.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[09] - 48) * 01.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[11] - 48) * 00.1)
    )
    ;
END_IF
END_IF


(* Temperatur Fortluft wurde empfangen v106*)
IF
Lueftung_Empfangsdaten[2] = 16#31 AND
Lueftung_Empfangsdaten[3] = 16#30 AND
Lueftung_Empfangsdaten[4] = 16#36 AND
Lueftung_Empfangsdaten[5] = 16#30
THEN
(* Wenn der Messwert einstellig ist gibt es einen anderen Bereich *)
    IF Lueftung_Empfangsdaten[9] = 16#2E THEN

    Temperatur_Fortluft :=
    (
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[06] - 48) * 01.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[08] - 48) * 00.1)
    )
    ;


    ELSE
    Temperatur_Fortluft :=
    (
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[06] - 48) * 10.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[09] - 48) * 01.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[11] - 48) * 00.1)
    )
    ;
END_IF
END_IF


(* Temperatur Abluft wurde empfangen v107*)
IF
Lueftung_Empfangsdaten[2] = 16#31 AND
Lueftung_Empfangsdaten[3] = 16#30 AND
Lueftung_Empfangsdaten[4] = 16#37 AND
Lueftung_Empfangsdaten[5] = 16#30
THEN
(* Wenn der Messwert einstellig ist gibt es einen anderen Bereich *)
    IF Lueftung_Empfangsdaten[9] = 16#2E THEN

    Temperatur_Abluft :=
    (
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[06] - 48) * 01.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[08] - 48) * 00.1)
    )
    ;


    ELSE
    Temperatur_Abluft :=
    (
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[06] - 48) * 10.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[09] - 48) * 01.0) +
    (BYTE_TO_REAL(Lueftung_Empfangsdaten[11] - 48) * 00.1)
    )
    ;
END_IF
END_IF

(* Restlaufzeit bis Filterwechsel wurde empfangen v1033*)
IF
Lueftung_Empfangsdaten[2] = 16#30 AND
Lueftung_Empfangsdaten[3] = 16#31 AND
Lueftung_Empfangsdaten[4] = 16#33 AND
Lueftung_Empfangsdaten[5] = 16#33
THEN

Filterwechsel_Restlaufzeit_Tage :=
(
(
(BYTE_TO_DINT(Lueftung_Empfangsdaten[06] - 48) * 00100000) +
(BYTE_TO_DINT(Lueftung_Empfangsdaten[09] - 48) * 00010000) +
(BYTE_TO_DINT(Lueftung_Empfangsdaten[08] - 48) * 00001000) +
(BYTE_TO_DINT(Lueftung_Empfangsdaten[11] - 48) * 00000100) +
(BYTE_TO_DINT(Lueftung_Empfangsdaten[10] - 48) * 00000010) +
(BYTE_TO_DINT(Lueftung_Empfangsdaten[13] - 48) * 00000001)
)
/60
/24
)
;

END_IF
```


----------



## Günne (21 Januar 2020)

Hallo Matze,

danke... dann werde ich mein Spiel nochmals von vorne beginnen....


----------



## Günne (22 Januar 2020)

Hallo Marsel,

erstmal vielen Dank für dein Projekt.... Dank dir konnte meine Wago die ersten Werte der Lüftungsanlage empfangen... 

warum hast du eigentlich den Taktgeber von 10 sec gewählt??? könnte man da nicht automatisch den nächsten Sende Befehl geben nachdem der letzte erfolgreich Empfangen wurde??

LG
Günther


----------



## Matze001 (23 Januar 2020)

Freut mich, dass es geklappt hat!

Ich hoffe Du optimierst noch einiges, der Code ist eher so ... lala... 
Das war ne Aktion Abends um 22Uhr und wurde seit dem nicht mehr angefasst...
weil... ihr wisst ja... es läuft schon 

Ich habe das gemacht, weil die Helios abgekackt ist wenn ich sie per Modbus zugespammt habe. 
Da die Werte nicht wirklich zeitkritisch sind (Temperaturen in Räumen bzw. im Außenbereich ändern sich nicht alle 100ms) 
habe ich mich auf 10 Sek eingeschossen. Es könnte auch nur alle 2min passieren...

Grüße

Marcel


----------

