Wago 750-841 Kommunikation Helios Lüftungsanlage

Matze001

Level-3
Beiträge
2.814
Reaktionspunkte
573
Zuviel Werbung?
-> Hier kostenlos registrieren
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:

Code:
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:

Code:
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
 
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
 
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
 

Anhänge

  • Anschluss_Helios.JPG
    Anschluss_Helios.JPG
    144,7 KB · Aufrufe: 45
  • helios_externer_Kontakt.JPG
    helios_externer_Kontakt.JPG
    126,3 KB · Aufrufe: 45
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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 38126Anhang anzeigen 38127Anhang anzeigen 38128
Stefan
 

Anhänge

  • WAGO_Lueftung_Fehlerliste.JPG
    WAGO_Lueftung_Fehlerliste.JPG
    247,2 KB · Aufrufe: 52
  • WAGO_Lueftung_ModbusLIB_nicht_uebersetzt.JPG
    WAGO_Lueftung_ModbusLIB_nicht_uebersetzt.JPG
    310,5 KB · Aufrufe: 42
  • WAGO_Lueftung_ModbusLIB_nicht_uebersetzt_Fehler.JPG
    WAGO_Lueftung_ModbusLIB_nicht_uebersetzt_Fehler.JPG
    248,2 KB · Aufrufe: 43
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Hallo Stefan
Wie Markus schon schrieb die ethernet.lib hinzufügen
die mod_com.lib erneuern
Code:
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
 
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
 
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.

Programmfehler_WAGO20170817.JPG

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

Vielen Dank an Euch.
Gruß aus Oberbayern

Stefan
 
Zurück
Oben