881 + 750-650/0003 + Relay PW 20

IAG

Level-2
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe mir mit der 881 und entsprechenden Klemmen eine Heizungssteuerung aufgebaut, die auf unserem Bauernhof 6 Familien, einen Pelletkessel , einen Holzvergaser sowie die Solaranlage steuert und darstellt.
Hat ein bißchen gedauert, aber jetzt läuft sie sehr schön.

Nun will ich mit dieser Steuerung Zähler auslesen. Wärmemengenzähler, Wasserzähler etc.
Dazu habe ich mir gekauft bzw. runtergeladen:
Zähler mit MBus Anschluß (nicht nur die Vorbereitung), Relay PW 20, die Klemme 750-650/0003 sowie die Bibliothek MBus.lib.

Hinbekommen habe ich bis jetzt:
Auslesung der Adressen der (im Moment) 2 Wärmemengenzähler. Allerdings vom PW 20 über RS232 direkt in den PC.

Jetzt sterbe ich bei dem Versuch die Zähler über die Wago auszulesen.
Ich weiß zwar, dass ich dazu die Funktionsblöcke FbMBusMaster und FbMBus_Heat brauche.
Allerdings fehlt mir dazu, am besten, ein kleines Beispiel.

Perfekt wäre es, wenn mir jemand ein kleines Programm als Beispiel bzw. Vorlage schreiben könnte, wie man bei einem WMZ
mit der Adresse 33407404 6A4D 81 04 die einzelnen Werte auslesen kann.

Dann habe ich vermutlich, schon mal das Grundsystem verstanden.

Die Programmierung erfolgt bei mir in AS und ST. Eventuelle Vorschläge sollten dies nach Möglichkeit bitte beachten.

Vielen Dank im Voraus

Gruß Peter
 
Hier mal eine Lösung von mir. Adressierung über Primäradresse. Haben Deine Zähler die gleiche Primäradresse oder warum nimmst Du die Sekundäradresse?
Der Baustein M_Bus_Zaehler stammt von mir, kannst Du evtl durch was eigenes ersetzen

Code:
PROGRAM M_BUS
VAR
    Init_MBus            : M_Bus_Data_Input;
    M_Bus_Out        : M_Bus_Data_Output;
    task_counter        : WORD;
    Start_MBus        : BOOL;


    FbUnitConverte_Energy    : FbUnitConverter;        (*Konvertierung der Energie-Rohdaten in Wh*)
    FbUnitConverte_Power    : FbUnitConverter;        (*Konvertierung der Power-rohdaten in W*)
    FbUnitConverte_Volume    : FbUnitConverter;        (*Konvertierung des Absolutvolumens in m3*)
    FbUnitConverte_Flow        : FbUnitConverter;        (*konvertierung des Durchflusses in l/h*)
    FbUnitConverte_Flowtemp        : FbUnitConverter;    (*Konvertierung der Temperatur in °C*)
    FbUnitConverte_Returntemp        : FbUnitConverter;(*Konvertierung der Temperatur in °C*)
    FbUnitConverte_Difftemp    : FbUnitConverter;            (*Konvertierung der Temperatur in K*)
    MBus_Heat_1                : FbMBus_Heat;            (*M-Bus Zähler auslesen*)
    M_Bus_Zaehler_Netz1    : M_Bus_Zaehler;
    M_Bus_Zaehler_Netz2    : M_Bus_Zaehler;
    M_Bus_Zaehler_Motor    : M_Bus_Zaehler;
    M_Bus_Zaehler_GV        : M_Bus_Zaehler;
    M_Bus_Zaehler_Therme    : M_Bus_Zaehler;
    Netz1_WMZ                : M_Bus_Data_Output;
    Netz2_WMZ                : M_Bus_Data_Output;
    Motor_WMZ                : M_Bus_Data_Output;
    GV_WMZ                    : M_Bus_Data_Output;
    Therme_WMZ                : M_Bus_Data_Output;
    M_Bus_Info:typMbus;

    FbMBusMaster_INST: FbMBusMaster;        (*M Bus-Master FB*)

END_VAR


(*Initialisierung der Zaehler*)
Netz1_MBus_Data_Input.Addr:=2;
Netz1_MBus_Data_Input.SND_NKE:=TRUE;

Netz2_MBus_Data_Input.Addr:=4;
Netz2_MBus_Data_Input.SND_NKE:=TRUE;

Motor_BHKW_MBus_Data_Input.Addr:=1;
Motor_BHKW_MBus_Data_Input.SND_NKE:=TRUE;

GV_MBus_Data_Input.Addr:=3;
GV_MBus_Data_Input.SND_NKE:=TRUE;

Therme_MBus_Data_Input.Addr:=0;
Therme_MBus_Data_Input.SND_NKE:=TRUE;


IF NOT Start_MBus THEN
    Start_MBus:=TRUE;
END_IF;

CASE task_counter OF

0:
    Init_MBus:=    Netz1_MBus_Data_Input;

1:
    Init_MBus:=    Netz2_MBus_Data_Input;

2:
    Init_MBus:=    Motor_BHKW_MBus_Data_Input;

3:
    Init_MBus:=    GV_MBus_Data_Input;

4:
    Init_MBus:=    Therme_MBus_Data_Input;


    END_CASE


(*Aufruf M-Bus_Master*)



FbMBusMaster_INST(
    bCOMPORT:=            SET_SERIAL_MODUL(ADR(M_BUS_Input_Roh), ADR(M_BUS_Output_Roh), 4, FbMBusMaster_INST.COMx),
    enumBAUDRATE:=     BAUD_2400,
    bRetries:=             3,
    tTimeout:=             t#1000ms,
    utMBus:=                 M_Bus_Info);


(*Abruf der Zähler*)

MBus_Heat_1(
    bPAdr:=        Init_MBus.Addr ,
    xSND_NKE:=    Init_MBus.SND_NKE ,
    utMBus:=         M_Bus_Info,
    xStart:=         Start_MBus
     );

FbUnitConverte_Energy(utMBRecord:=MBus_Heat_1.utEnergy , utUnit:=Wh , rValue=>M_Bus_Out.ENERGY , xError=>M_Bus_Out.Error_Konv );
FbUnitConverte_Power(utMBRecord:=MBus_Heat_1.utPower , utUnit:=W , rValue=>M_Bus_Out.POWER , xError=>M_Bus_Out.Error_Konv );
FbUnitConverte_Volume(utMBRecord:=MBus_Heat_1.utVolume , utUnit:=m3 , rValue=>M_Bus_Out.VOLUME , xError=>M_Bus_Out.Error_Konv );
FbUnitConverte_Flow(utMBRecord:=MBus_Heat_1.utFlow , utUnit:=lph , rValue=>M_Bus_Out.FLOW , xError=>M_Bus_Out.Error_Konv );
FbUnitConverte_Flowtemp(utMBRecord:=MBus_Heat_1.utFTemp, utUnit:=C , rValue=>M_Bus_Out.FLOWTEMP , xError=>M_Bus_Out.Error_Konv );
FbUnitConverte_Returntemp(utMBRecord:=MBus_Heat_1.utRTemp , utUnit:=C , rValue=>M_Bus_Out.RETURNTEMP , xError=>M_Bus_Out.Error_Konv );
FbUnitConverte_Difftemp(utMBRecord:=MBus_Heat_1.utDTemp , utUnit:=K , rValue=>M_Bus_Out.DIFFTEMP , xError=>M_Bus_Out.Error_Konv );

IF task_counter<4 AND NOT Start_MBus THEN

    CASE task_counter OF

    0:
        M_Bus_Zaehler_Netz1(
        m_Bus_In:=        M_Bus_Out ,
        Max_Versuche:=    4 ,
        V_m2:=            0.000001 ,
        Q_m2:=            0.0000000001 ,
        Fg:=                0.1 ,
        m_Bus_Out=>    Netz1_WMZ ,
        Error=>            Netz1_WMZ_Stoerung );

    1:
        M_Bus_Zaehler_Netz2(
        m_Bus_In:=        M_Bus_Out ,
        Max_Versuche:=    4 ,
        V_m2:=            0.000001 ,
        Q_m2:=            0.0000000001 ,
        Fg:=                0.1 ,
        m_Bus_Out=>    Netz2_WMZ ,
        Error=>            Netz2_WMZ_Stoerung );

    2:
        M_Bus_Zaehler_Motor(
        m_Bus_In:=        M_Bus_Out ,
        Max_Versuche:=    4 ,
        V_m2:=            0.000001 ,
        Q_m2:=            0.0000000001 ,
        Fg:=                0.1 ,
        m_Bus_Out=>    Motor_WMZ ,
        Error=>            Motor_WMZ_Stoerung );


    3:
        M_Bus_Zaehler_GV(
        m_Bus_In:=        M_Bus_Out ,
        Max_Versuche:=    4 ,
        V_m2:=            0.000001 ,
        Q_m2:=            0.0000000001 ,
        Fg:=                0.1 ,
        m_Bus_Out=>    GV_WMZ ,
        Error=>            GV_WMZ_Stoerung );


    4:
        M_Bus_Zaehler_Therme(
        m_Bus_In:=        M_Bus_Out ,
        Max_Versuche:=    4 ,
        V_m2:=            0.000001 ,
        Q_m2:=            0.0000000001 ,
        Fg:=                0.1 ,
        m_Bus_Out=>    Therme_WMZ ,
        Error=>            Therme_WMZ_Stoerung );
    END_CASE;

    task_counter:=task_counter+1;
ELSIF NOT Start_MBus THEN
    task_counter:=0;
END_IF


Netz1_Durchfluss                := Netz1_WMZ.FLOW;
Netz1_Q_ist                    := Netz1_WMZ.POWER;
Netz1_Temp_RL                :=REAL_TO_INT(Netz1_WMZ.RETURNTEMP);
Netz1_Temp_VL                :=REAL_TO_INT(Netz1_WMZ.FLOWTEMP);
Netz1_Therm_Arbeit            :=Netz1_WMZ.ENERGY;

Netz2_Durchfluss                := Netz2_WMZ.FLOW;
Netz2_Q_ist                    := Netz2_WMZ.POWER;
Netz2_Temp_RL                :=REAL_TO_INT(Netz2_WMZ.RETURNTEMP);
Netz2_Temp_VL                :=REAL_TO_INT(Netz2_WMZ.FLOWTEMP);
Netz2_Therm_Arbeit            :=Netz2_WMZ.ENERGY;

Motor_Durchfluss                := Motor_WMZ.FLOW;
Motor_Q_ist                    := Motor_WMZ.POWER;
Motor_Temp_RL                :=REAL_TO_INT(Motor_WMZ.RETURNTEMP);
Motor_Temp_VL                :=REAL_TO_INT(Motor_WMZ.FLOWTEMP);
Motor_Therm_Arbeit            :=Motor_WMZ.ENERGY;

GV_Durchfluss_Pri            := GV_WMZ.FLOW;
GV_Q_ist                        := GV_WMZ.POWER;
GV_Temp_RL                    :=REAL_TO_INT(GV_WMZ.RETURNTEMP);
GV_Temp_VL                    :=REAL_TO_INT(GV_WMZ.FLOWTEMP);
GV_Therm_Arbeit                :=GV_WMZ.ENERGY;

Therme_Durchfluss                := Therme_WMZ.FLOW;
Therme_Q_ist                        := Therme_WMZ.POWER;
Therme_Temp_RL                :=REAL_TO_INT(Therme_WMZ.RETURNTEMP);
Therme_Temp_VL                :=REAL_TO_INT(Therme_WMZ.FLOWTEMP);
Therme_Therm_Arbeit            :=Therme_WMZ.ENERGY;
 
Zuletzt bearbeitet:
Zurück
Oben