Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Arbeit mit Wago Impulszählbaugruppe 750-638

gnassel
2006-08-16
2006-08-20
  • gnassel - 2006-08-16

    Hallo,

    ich möchte die Impule einer Durchflussmessung erfassen. Dazu verwende ich die Baugruppe 750-638.

    Bei 30 Impulsen soll eine Variable um einen Liter erhöht werden.

    if IMPZ1 >= 30 then

    summe:=summe+1;

    end_if

    Das funktioniert soweit ganz gut, nur muss ich anschlieĂźend einen RĂĽcksetzimpuls auf die Impulsbaugruppe geben. Und hier habe ich ein Problem.

    Folgende Anweisung funktioniert so natĂĽrlich nicht, da nur der letzte Befehl ĂĽbernommen wird.:

    RESETZĂ„HLER:=TRUE;

    RESETZĂ„HLER:=FALSE;

    jedoch möchte ich keinen weiteren Zyklus mit einer resetteten Zählbaugruppe abwarten, da mir Impulse verlohren gehen.

    Ich bin fĂĽr jede Idee dankbar

     
  • mwatermann - 2006-08-16

    wie siehts aus, wenn du den IMP zähler direkt nach der anweisung resettest?


    if IMPZ1 >= 30 then

    summe:=summe+1;

    IMPZ1 := 0;

    end_if


    oder möchtest du ihn auch wischendurch resetten können?

     
  • gnassel - 2006-08-16

    Vielen Dank fĂĽr die schnelle Antwort.

    "IMPZ1" ist das Ausgangsbyte der Zählbaugruppe.

    D.h. eine Zuweisung von "0" ist nicht möglich.

     
  • Benjamin - 2006-08-16

    Anstatt den Zähler zurückzusetzen, kannst du ja auch den letzten Wert abspeichern und diesen dann mit dem aktuellen Wert vergleichen.

    IF (IMPZ1 - ImpzAlt) >= 30 THEN

    summe = summe +1;

    ImpAlt := IMPZ1;

    END_IF

    NatĂĽrlich musst du dann noch den Fall eines WertĂĽberlaufs abfangen.

    Der Code könnte dann so aussehen:

    IF IMPZ1 >= ImpAlt THEN (kein Ăśberlauf)

    diff := IMPZ1 - ImpzAlt;

    ELSE (Impulszähler ist Übergelaufen)

    diff := 65535 - ImpzAlt + IMPZ1;

    END_IF

    IF diff >= 30 THEN

    summe := summe +1;

    ImpAlt = IMPZ1;

    END_IF

    ACHTUNG!

    Diesen Ausschnitt habe ich nur schnell heruntergehackt, ohne

    getestet zu werden

    die Baugruppe zu kennen

    oder sowas schon einmal verwendet zu haben.

    MFG

    Benjamin

     
  • Denkes - 2006-08-17

    Hallo,

    ich besitze diese Baugruppe zwar nicht, möchte mich aber an der Problemlösung beteiligen.

    Unter WAGO.COM>Gebäudetechnik-Portal>Downloads>Dokumentation>WAGO-System750>Sonderklemmen findest du das Handbuch zu dieser Baugruppe.

    Unter Punkt 2.1.1.7 Datentransfer ist zu lesen:

    Mit dem Steuer- und Statusbyte erfolgt die Steuerung des Zählers.

    • Zähler setzen:

    Wird Bit 5 im Steuerbyte gesetzt, wird der Zähler mit dem 16 Bit Wert der Ausgangsbytes 0 und 1 geladen. Solange das Bit gesetzt ist, wird der Zähler angehalten und der Ladewert bleibt erhalten. Das erfolgreiche Laden des Zählers wird mit Bit 5 im Status-byte gemeldet.

    Damit zu deinem Problem:

    if IMPZ1 >= 30 then

    summe:=summe+1;
    

    Bis dahin OK.

    Der Zähler 1 wird innerhalb der IF-Abfrage über das Steuerbyte C0 durch "Zähler setzen" auf Aktualwert-30 gesetzt. Damit dürften dann keine Impulse mehr verloren gehen.

    1. Den neuen Zählersetzwert in die Ausgangsdaten D0, D1 von Zähler 1 eintragen.

    D1 D0 (neu) := D1 D0 (alt) minus 30

    Weil immer nur Byte D0 verändert wird, reicht es, nur dieses zu aktualisieren.

    D0 := D0 – 30;

    1. Im Steuerbyte C0 mit Bit 5 (Zähler setzen) das Setzen anstoßen. Alle anderen Bit sind 0 und damit ist zu programmieren

    C0 := 32; ( entspricht 0010 0000 )

    END_IF;

    1. Im Statusbyte S0 Bit 5 erfolgt nun die Rückmeldung der Zählerklemme (Zähler 1 gesetzt).

    2. Danach Bit 5 (Zähler setzen) im Steuerbyte C0 zurücksetzen.

    Programm hierfĂĽr:

    IF S0 = 32 then C0 := 0; END_IF; ( entspricht RĂĽckmeldung 0010 0000 )

    Der gesetzte Zählerwert erscheint nun als Startwert, von dem aus weitergezählt wird, bis das ganze Spielchen neu beginnt.

    Damit ergibt sich das Gesamtprogramm zu:

    if IMPZ1 >= 30 then

    summe:=summe+1;
    
    D0 := D0 – 30;
    
    C0 := 32;
    

    END_IF;

    IF S0 = 32 then C0 := 0; END_IF;

    Ob und wie die Variablen C0, D0, D1 und S0 anders zu bezeichnen sind, weiss ich leider nicht. Notfalls WAGO fragen.

    Ansonsten toi, toi, toi

    GruĂź Norbert

     
  • gnassel - 2006-08-18

    Danke für die Lösungen!!

    ich werde sie alle in aller Ruhe mal durchspielen.

    Die Endloszählvariante ist wahrscheinlich eine gute Idee.


    if IMPZ1 >= 30 then

    summe:=summe+1;


    Dabei ist mir noch aufgefallen, dass diese Anweisung Quatsch ist. Denn wenn die Abfrage erst bei Zählerstand 33 erfolgt, hat die Erfassung 3 Impule unterschlagen.

    Der Mitarbeiter bei der WAGO Hotline konnte mir ĂĽbrigens auch nicht weiterhelfen.

    Es wäre viel einfacher gewesen, wenn die Baugruppe nur bei einer steigende Flanke ein Nullstellen durchführt.

     
  • Denkes - 2006-08-20

    Hallo,

    nochmal zu deinem Problem:

    1. Ob die Baugruppe mit Übertrag zählt oder nicht, kann über das Steuerbyte eingestellt werden (siehe Handbuch)

    Ich gehe mal davon aus, dass mit Übertrag gezählt wird.

    1. Die Variable IMPZ1 ist wahrscheinlich wirklich das Low-Ausgangsbyte der Baugruppe (in diesem wird gezählt von 0 ... 255)

    Unter diesen Voraussetzungen dürfte dein Problem mit folgendem Code gelöst sein:

    IF IMPZ1>IMPZ1alt THEN

    IF IMPZ1-IMPZ1alt >=30 THEN
    
        Summe := Summe+1;
    
        IMPZ1alt := IMPZ1;
    
    END_IF;
    

    ELSE

    IF IMPZ1 + 255 - IMPZ1alt >=30 THEN
    
        Summe := Summe+1;
    
        IMPZ1alt := IMPZ1;
    
    END_IF;
    

    END_IF;

    Vorteil: Es geht kein Impuls verloren!

    GruĂź Norbert

     

Log in to post a comment.