# Wago 750-841 Kommunikation Helios Lüftungsanlage



## Matze001 (30 April 2017)

Hallo Zusammen,

ein sehr spezielles Thema  Ich habe o.g. Konstellation bei mir im Einsatz und wurde nun von einigen
Leuten gefragt wie ich das ganze umgesetzt habe. Deshalb habe ich mir gedacht das es für andere auch interessant sein könnte.

Anbei mein Code, er ist nicht perfekt läuft aber nun seit > 1 Jahr sehr gut.

Info vorne Weg:

Folgende Variablen werden von der Anlage gelesen:

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

Folgende Variablen werden geschrieben:


      Lueftung_Plus: BOOL;
    Lueftung_Minus: BOOL;

Die zwei o.g. Bool steuern die Luefterstufe die dann an
die Lüftungsanlage gesendet wird


    Luefterstufe: BYTE; 


      Bypass_Min_Aussentemperatur: INT; 
    Bypass_Ablufttemperatur: INT; 
      Maximalwert_Temperatur_Aussen: REAL;

Bypass: 

Den Bypass kann man nicht direkt steuern, daher manipuliere ich
die beiden Schwellwerte.

Max. Außentemp: Ist es zu warm schaltet die Anlage ab,
da sonst das Haus zu sehr aufheizt.


Das mal im groben, anbei nun das Programm.
Fragen beantworte ich gern.


Deklaration:


```
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
```

Programm:


```
LUEFTUNGSANLAGE( 
strIP_ADDRESS:='192.168.51.40', 
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 

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 


(* 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 

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 


(* Temperatur Fortluft wurde empfangen v1064*) 
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 

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 


(* 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 

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 

(* 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
```

Grüße

Marcel


----------



## MarcoH (4 Mai 2017)

Hallo Marcel,

das klingt schon mal sehr interessant.  Ich suche schon seit längerem einen Weg, die Daten meiner KWL (zumindest) auszulesen. Allerdings fehlt mir da schon der "Hardware" Ansatz. Wie kann man die Daten abgreifen (KWL EC370 PRO, ohne easy-control).
Da ich vollkommen fachfremd bin - kannst du mir da auf die Sprünge helfen? Was schließe ich wo/wie an?

Gruß
Marco


----------



## Matze001 (4 Mai 2017)

Das heißt Du hast nur das Bedienelement mit dem kleinen Regler der blau leuchtet?
Keinen Ethernet-Anschluss?

Grüße

Marcel


----------



## MarcoH (5 Mai 2017)

Leider ja,

Komplettsteuerung wird da wohl nicht drin sein. Die Frage wäre, ob man irgendwelche Daten auslesen kann (Temperatur, Alarm). Das einzige was ich mir derzeit vorstellen kann, den externen Kontakt zur "Minimalsteuerung" zu nutzen. Da muss ich sicherlich ein 24V Relais anschließen?

Gruß
Marco


----------



## Bayernstefan (7 August 2017)

Servus, sehr tolle Sache, habe jetzt verzweifelt versucht das Programm in meines zu integrieren. Leider funktioniert das nicht.
Kann mir jemand sagen welches Problem ich hier habe.
Hab zusätzlich die ModbusEthernet_04.lib geladen um den Baustein "Ethernet_modbusmaster_TCP" aufzurufen. Leider bekomme ich unzählige Fehlermeldungen. Benötige ich hier noch eine lib?
Bin leider kein Profi. Somit denke ich, dass es sich um einen einfachen Fehler handelt.
Hat jemand eine Idee?

Vielen Dank schon mal
Gruß
Stefan


----------



## mnuesser (7 August 2017)

Naja, helfen können wir ja gerne, aber sei doch nicht so geizig mit deinen Infos... 
Pack mal nen Screenshot der Fehlermeldungen rein, damit man mal nach irgendwas suchen kann


----------



## Bayernstefan (8 August 2017)

Hallo Mnuesser,
danke, dass sich Profis für mein Thema annehmen. Also ich habe jetzt mal ein paar Screenshots gemacht.
Das Thema ist, wenn ich das Programm integriere, dass ich die Modbus04.lib benötige. Sobald ich diese implementiere kommen die Fehler. Wenn ich diese von der Übersetzung ausschließe bekomme ich nur den Fehler 3740 Unbekannter Typ Ehternet_MODBUSMASTER_TCP, was für mich auch logisch ist, da er diesen Baustein benötigt. Nachdem dieser ja ich der Modbus.lib integriert ist. Aber Warum bekomme ich den Fehler? 
Ich bedanke mich schon mal für Eure Bemühungen.

schöne Grüße aus Oberbayern.
Anhang anzeigen 38126
Anhang anzeigen 38127
Anhang anzeigen 38128

Stefan


----------



## Tiktal (8 August 2017)

Naja, da Du ja icht ganz neu bist im Programmieren wirst Dus sicher schon probiert haben.
Trotzdem: Lib löschen, "Alles bereinigen", Lib wieder einspielen. Schon probiert?

Gruß

Onno


----------



## Bayernstefan (8 August 2017)

Hallo Onno,

danke für den Tipp, hab ich probiert, leider ohne Erfolg. Kann es sein, dass es sich mit anderen lib´s nicht verträgt? Aber mit was und warum?
Gruß
Stefan


----------



## dast (8 August 2017)

Poste doch mal deine Projektdatei, dann könnte man es probieren nachzustellen ...


----------



## Bayernstefan (9 August 2017)

Servus zusammen, hier mal meine Projektdatei. Wäre der Hammer, wenn sich jemand mein Projekt ansehen könnte und die Lösung dazu weiß.

hier der link zu der Datei.

https://www.dropbox.com/s/lyyuowvvipkhtoo/2017_08_09_WAGO8202.zip?dl=0

danke schon mal 

Gruß Stefan


----------



## mnuesser (9 August 2017)

Also, wenn du mal schaust dann meckert er zum Beispiel einen Typen an "ETHERNET_SERVER_OPEN"
was mich dann erstmal zum überlegen bringt wo wir das herbekommen... 
Ein schnelles GOOGLEN bestätigt dann meine vermutung, dass dir schon mal die Ethernet.lib von Wago fehlt.
Versuch mal ob du damit weiter kommst, wenn du noch mehr Fehlermeldungen bekommst,
welche du nicht lösen kannst, schreib nochmal hier rein


----------



## Bayernstefan (9 August 2017)

Hallo, hier mal meine Projektdatei, würd mich freuen, wenn jemand eine zündende Idee dazu hat.

https://www.dropbox.com/s/lyyuowvvipkhtoo/2017_08_09_WAGO8202.zip?dl=0

hier der Link zur Dropbox wo die Datei liegt.

Beste Grüße
Stefan


----------



## mnuesser (9 August 2017)

das letzte ist wohl eher ein doppelpost oder?


----------



## wolfi-sps (9 August 2017)

Hallo Stefan,

welche CoDeSys Version hast du? Ab  2.3.9.42 - gaub ich - kannst Du den Modbus-Master-Konfigurator verwenden. Ist in der Steuerungskonfiguration drin.
Mit dem lese ich meinen Fröhling P4 Kessel aus (RS232). Geht aber auch TCP/IP.

Wolfgang


----------



## holgermaik (10 August 2017)

Hallo Stefan
Wie Markus schon schrieb die ethernet.lib hinzufügen
die mod_com.lib erneuern

```
LUEFTUNGSANLAGE(
strIP_ADDRESS:='192.168.178.30',
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
);
```
Parameter mit Komma trennen, kein Symikolon.
Durchlauf: 0 - Fehler, 18 Warnungen
Licht Keller - Eingang nicht verbunden
FB Rollo Status Eingang nicht verbinden...

Anmerkung:
Task PLC_PRG als Freilaufend definieren.

Holger


----------



## Bayernstefan (11 August 2017)

Erst mal vielen Dank an Holger für die Zeit die Du investiert hast.
Werde am Wochenende alles testen. Soweit scheint es zu funktionieren. 
An Wolfgang hätte ich noch eine Frage... gibt es eine Beschreibung wie man mit dem Modbus-Kofigurator eine Verbindung erstellt?
Bzw. ein paar Screenshots würden evtl. schon helfen. 
Vielen Dank nochmal.
Gruß Stefan


----------



## wolfi-sps (13 August 2017)

Hallo Stefan,

hir ist der Modbus-Master Konfigurator beschrieben.
http://www.wago.de/suche/index.jsp?_ts=1502650019774&action=dym&q=Modbus+master+konfigurator

Wolfgang


----------



## Bayernstefan (18 August 2017)

Servus, 
ich habe jetzt am Wochenende die Anschaltung  getestet.
Habe beim Programm übersetzten und Programm bereinigen keine nennenswerten Fehler gehabt.
Jedoch konnte ich dann das Programm nicht vollständig übertragen. Habe von der Fehlermeldung einen Screenshot gemacht.
Als ich dann das Helios Programm vom Übersetzten ausgeschlossen habe, funktionierte der Rest wieder.
Hat wer eine Idee was das sein kann?
@Holger und Rainer, Eure Anmerkungen habe ich beachtet und korrigiert. Danke nochmals dafür.

https://www.dropbox.com/s/cq8th8vyb3v7moc/2017_08_18_WAGO8202.zip?dl=0

hier meine Projektdatei, vielleicht hat jemand Zeit es anzusehen.




und hier die Fehlermeldung, vielleicht hat jemand eine zündende Idee.

Vielen Dank an Euch.
Gruß aus Oberbayern

Stefan


----------



## Bayernstefan (24 August 2017)

Servus, 

keiner im Forum unterwegs, der mir weiterhelfen kann? 
Würd mich freuen, wenn mir jemand helfen könnte.
Besten Gruß
Stefan


----------



## Sagas (24 August 2017)

Servus,

die Fehlermeldung sagt meiner Meinung nach aus das du eine .lib eingebunden hast die nicht zur Hardware passt. 
Ggf. gibt es diese .Lib in verschiedenen Versionen.

Grüße
Sagas


----------



## dingo (24 August 2017)

...umpf..
ich habe mal kurz in Dein Programm geschaut....

Du hast ein PFC200 laufen, verwendest nicht die passenden/ aktuelle Libs für den PFC200, 
z.B.: Fb750_493_Master3Phase_IPC ist für IPC, 
die aktuelle HVAC.lib ist 03, hier ist 01
In dem Ordner InHomeAmp4 liegt die Ethernet_01.lib, hast aber bereits ModbusEthernet04 drin.

...


----------



## holgermaik (25 August 2017)

Du solltest nur die Lib in ein seperates Verzeichnis kopieren, die du zusätzlich für dein Projekt brauchst. Die Systemlibs sucht sich Codesys aus dem Ordner der zur Steuerung passt. Bei dir also PFC200. Bei den zusätzlichen Libs prüfen ob sie für den PFC 200 geeignet sind.

Allgemein
Du Adressierst absolut. 



Das hat den Nachteil das deine Konfig an den physikalischen Aufbau des Knotens gebunden ist. Ändert sich dieser passt deine gesamte Adressierung nicht mehr.

Besser wäre symbolisch zu Adressieren.



Holger


----------

