Wasseruhr mit CPU 314C-2 DP

chefren_new

Level-1
Beiträge
138
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute

möchte gerne einen Wasserdurchflusszähler an meiner CPU 314C-2 DP anschliessen. Leider habe ich keine Ahnung wie das geht und was ich brauche.
Einen Durchflusszähler habe ich im Internet gefunden der 80 Impulse in der Minute liefert.
Wie kann ich das abgreifen? die Auswertung muss ja sehr schnell gehen.
Kann mir jemand Tipp geben wie ich da vorgehen kann.

DANKE


Gruß
 
80 Impulse in der Minute kann ja nur die Maximale anzahl sein. Du musst auch wissen, wieviele impulse pro was? (zB. 1 Imp = 1L oder 10 Imp = 1 m³)
Dann nimmst du deinen Eingang der SPS wo der Impuls drauf verdrahtet ist, und legst ihn im Programm am besten auf einen Addierer (EN). Den Addierer würde ich mit einem Doppelwort belegen und dann immer um 1 hochzählen lassen.
Dann kannst du noch das Doppelwort Skalieren indem du z.B. bei 1 Imp/L
duch 1000 Teilst um m³ ausgegeben zu bekommen.
 
Die Impule über einen Frequenzmesser , entweder Integriert bei den 3xxC-Modellen oder als externe Hardware, ist der sicherste Weg.
Wir haben schon viel Ärger mit dem Zählen über normale Eingänge bekommen, wenn z.B. die Impulse kürzer als die Zykluszeit sind. Da experimentierten wir mit Impulsverlängerungsrelais u.ä.
 
Die Impule über einen Frequenzmesser , entweder Integriert bei den 3xxC-Modellen oder als externe Hardware, ist der sicherste Weg.
Wir haben schon viel Ärger mit dem Zählen über normale Eingänge bekommen, wenn z.B. die Impulse kürzer als die Zykluszeit sind. Da experimentierten wir mit Impulsverlängerungsrelais u.ä.
Also bei 80 Impulse pro Minute komme ich auf 1,3 Impulse pro Sekunde.
Das sollte die CPU ja wohl noch können! *ROFL*
Und von der Funktion:
Genauso wie es online beschrieben hat.
Nur als Ergänzung > Mit dem Eingang eine Flanke bilden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zählimpuls zu kurz

Hallo,

das Problem bei der Impulszählung von Wasseruhren ist nicht die Frequenz, sondern das Tastverhältnis der
Impulse. Bei vielen Wasseruhren ist der 1-Impuls nur 1...10ms lang, also kürzer als die Zykluszeit.

Bei hochwertigen Wasserzählern kann die Impulslänge oft auf größere Werte (z.B. 100ms) parametriert werden.

Wenn das nicht geht, gibt es ein paar Möglichkeiten, die Impulse sicher zu erfassen
  • CPU mit Prozessalarm-fähigen integrierten Digitaleingängen, z.B. CPU 31xC
    Bei CPU 314C-2DP können alle 24 Digitaleingänge Prozessalarm auslösen
  • Digitaleingabebaugruppe mit Prozessalarm, z.B. 6ES7321-7BH01-0AB0 (16 Eingänge)
  • CPU mit integrierten schnellen Zählereingängen, z.B. CPU 31xC
    Die CPU 314C-2DP hat 4 Zählerkanäle.
  • schnelle Zählerbaugruppen, z.B. FM 350-2 6ES7350-2AH01-0AE0 (8 Kanäle)
  • externe Impulsverlängerungs-Elektronik, z.B. Murr MIB 6652320, Sabo SUM.350.XX,
    Phoenix Contact UEGM-OE/AV-24DC/24DC/100, Weidmüller DKZA 35 24VDC 150MS (802211),
    Weidmüller DKZ DK5 24VDC 0.1-1S (824378), Weidmüller MCZ TO 24VDC/150MS (828641),
    Rinck Electronic IPL4, ATR DM3/DM4, Koralewski IPF-3.1K, MP-Sensor MP-IV2, Beckhoff KL1232
  • S7-200 als Vorzähler, über MPI an die S7-300-CPU gekoppelt
    Hier kann die S7-300 mehrere Minuten in STOP sein und trotzdem geht kein Zählimpuls verloren.
    Bei ganz kurzen Impulsen < 1ms kann bei S7-200-CPU auch noch "Impulsabgriff" aktiviert werden.

Gruß
PN/DP
 
Hallo

Danke für die rasche Antwort.

möchte die Wasseruhr gerne mit meiner 314c mit dem schnellen Zählereingan realisieren.

Wie könnte da ein Programmbeispiel aussehen ( FUP ) kann mir jemand helfen.

DANKE
 
Hallo

U E0.0 //Zählimpuls
FP M10.0 //Flankenmerker
SPBN m001 //Springe nicht zu m001
L 10 // z.B bei 10 Liter/Imp
L db1.dbd0 //Istwert Zähler
+I //draufaddieren
T db1.dbd0 //gibt neuen Istwert
m001: Nop0 //Sprungmarke

Machs in AWL in FUP werden selbst so simple Sachen wie dies unübersichtlich.

MfG
Paul
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Danke für die Hilfe
AWL kann ich aber nicht richtig lesen, hat jemand das ganze in FUP
bin ganz neu in diesem Bereich.

möchte die Werte für jeden Tag und das ganze 30 Tage Speichern wie kann man so etwas machen. Einen Werte Tag für Tag speichern? eventuell den Werte z.B 450 Liter inkl. Datum

kann jemand eine Beispiel in FUP.


DANKE


Gruß
 
schneller zählen als die Zykluszeit

Impulse an einem Digitaleingang im normalen OB1-Zyklus zählen geht wegen der sehr kurzen Zählimpulse ja gerade nicht.
möchte die Wasseruhr gerne mit meiner 314c mit dem schnellen Zählereingan realisieren.

Du mußt in der Hardware-Konfig der CPU314C einen Zähler-Kanal auf Endlos-Zählen parametrieren.
Dann im Programm den Zählerstand des Kanals auslesen. Wenn er sich gegenüber dem Zählerstand
vom letzten OB1-Zyklus geändert hat, dann die Differenz zum vorherigen Zählerstand auf Deinen
eigentlichen Impulszähler aufaddieren. Aber nicht im 1.OB1-Zyklus bei STOP->RUN !

S7-300 CPU 31xC Technologische Funktionen (CPU 312C, CPU 313C, CPU 314C)
SIMATIC S7-300 CPU 31xC und CPU 31x: Technische Daten

Ich finde, daß die Variante mit dem Prozessalarm wesentlich einfacher und sicherer zu programmieren ist.
In der Hardware-Konfig der CPU einstellen, welcher Eingang bei welcher Flanke Prozessalarm auslösen soll.
Dann im OB40 Deinen Impulszähler incrementieren.
Allerdings wirst Du um AWL nicht herumkommen.

Sorry, für ein fertiges Programmbeispiel habe ich gerade keine Zeit.

Gruß
PN/DP
 
@PN/DP
Ich finde, daß die Variante mit dem Prozessalarm wesentlich einfacher und sicherer zu programmieren ist.
In der Hardware-Konfig der CPU einstellen, welcher Eingang bei welcher Flanke Prozessalarm auslösen soll.
Dann im OB40 Deinen Impulszähler incrementieren.
Allerdings wirst Du um AWL nicht herumkommen.

Die Zykluszeit ist hier, denke ich, nicht das Problem.
Der Junge muss doch erstmal lernen wie zwei Werte einfach addiert werden.

Ich schau mal ob ich in FUP was einfaches hier einstellen kann, dauert aber ein bisschen, weil erstmal Besprechung angesagt ist.

MfG
Paul
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nicht einfache, sondern schnelle Zählung

Moin Paul,

das Problem bei der Impulszählung von Wasseruhren ist nicht die Frequenz, sondern das Tastverhältnis der
Impulse. Bei vielen Wasseruhren ist der 1-Impuls nur 1...10ms lang, also kürzer als die Zykluszeit.

chefren_new hat sich nun so entschieden:
möchte die Wasseruhr gerne mit meiner 314c mit dem schnellen Zählereingan realisieren.

Gruß
PN/DP
 
Paul;216994Na ok Schauen wir mal ob wir ihn da durchführen können[/quote schrieb:
Also das ist ja jetzt nicht so das Problem. ;)
Das einzige komplizierte ist da wohl das richtig Alarmbit aus dem OB40 Stack rauszusuchen.

Code:
OB 40:
U AlarmBit  // Abfrage nur erforderlich falls noch ein Alarm generiert wird
SPBN M1
L 1 // Liter
L DB10.DBD 0
+D
T DB10.DBD 0
U AlarmBit 
R AlarmBit
M1
 
Zuviel Werbung?
-> Hier kostenlos registrieren
FUP-Beispiel

Paule ist aber schnell...:)

@ chefren_new

Schau mal in das Datenblatt Deines Wasserzählers, wie lang der Zählimpuls ist.

Wenn der Zählimpuls länger als Deine Zykluszeit ist, dann kannst Du im normalen
OB1-Programm so zählen:
Code:
        M124.0
       +-----+   +--------+                M124.0 Flankenmerker
       |  P  |   | ADD_DI |
E124.0-|     |---|EN      |                E124.0 Zähleingang
       +-----+   |        |
       DB10.DBD0-|IN1  OUT|-DB10.DBD0      DB10.DBD0 Zähler (DINT)
                 |        |
             L#1-|IN2  ENO|-
                 +--------+

Wenn der Zählimpuls kürzer als Deine Zykluszeit ist, dann MUSST Du entweder einen
schnellen Zähler-Kanal auf Endlos-Zählen parametrieren oder der SPS-Eingang muß
einen Prozessalarm auslösen, z.B. nur bei steigender Flanke.

Wenn dieser Eingang die einzige Prozessalarm-Quelle ist, dann kannst Du einfach
im OB40 programmieren:
Code:
          +--------+
          | ADD_DI |
      ...-|EN      |
          |        |
DB10.DBD0-|IN1  OUT|-DB10.DBD0
          |        |
      L#1-|IN2  ENO|-
          +--------+

Wenn es mehrere Prozessalarm-Quellen gibt, dann wird es komplizierter.
Das einzige komplizierte ist da wohl das richtig Alarmbit aus dem OB40 Stack rauszusuchen.
Es muß im OB40 zuerst festgestellt werden, welcher Eingang den Prozessalarm
ausgelöst hat. (siehe auch Onlinehilfe zum OB40)
Das geht dann aber wirklich nur noch in AWL vernünftig.

Gruß
PN/DP
 
Zuletzt bearbeitet:
OB40 Beispiel

Hier jetzt der komplette OB40-Code (allerdings nicht getestet)
wenn E124.0 nur bei steigender Flanke einen Prozessalarm auslöst:
Code:
//OB40
//prüfen, ob E124.0 den Prozessalarm ausgelöst hat
      L     #OB40_IO_FLAG
      L     B#16#54                     //Eingangsbaugruppe PE...
      <>I   
      SPB   ENDE

      L     #OB40_MDL_ADDR
      L     124                         //PEW124
      <>I   
      SPB   ENDE

      L     #OB40_POINT_ADDR
      UD    DW#16#1                     //00000000_00000000_00000000_00000001 = E124.0
      SPZ   ENDE

//E124.0 hat den Alarm ausgelöst
//Wasserzähler um 1 Einheit erhöhen
      L     DB10.DBD    0               //alter Zählerstand
      +     L#1                         //Zähleinheit addieren
      L     L#1_000_000_000             //max Zählumfang
      MOD                               //Wrap zu 0
      T     DB10.DBD    0               //neuer Zählerstand

ENDE: NOP   0
Der Zähler zählt einfach nur die Impulse vom Wasserzähler.
Der Zählerstand muß für eine Anzeige noch mit der Volumeneinheit/Impuls
multipliziert werden. Oder gleich im OB40 statt 1 einen anderen Faktor addieren.

Oft sind die Volumeneinheiten/Impuls glatte 10-er Potenzen, z.B. 10l/Imp.
Dann muß man sich nur irgendwo ein Dezimalkomma in den Zählerstand reindenken.
Beispiel:
10l/Imp und Komma 2 Stellen von hinten einfügen -> Anzeige 1234,56 m³

Gruß
PN/DP
 
Zuletzt bearbeitet:
Hallo

Danke für die Bemühungen

mein Durchflusszähler:
80 Impulse / Liter
Durchsatz 0,5-50 Liter/Min

Es sollte für jeden Tag die Liter gespiechert werden und das 30 Tage,
also man sollte immer einen Rückblick von 30 Tage haben.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tagesverbräuche einen Monat lang speichern

Also bei max 50 Liter/Minute und 80 Impulsen/Liter müssen die Tagesdurchsätze als DINT
oder REAL gespeichert werden.
1 Tag = 1440 Minuten * 50 l/Minute = 72.000 l/Tag * 80 Imp/l = 5.760.000 Imp/Tag

Ich würde den Impulszähler endlos laufen lassen (NICHT um Mitternacht auf 0 setzen).
Bei einem Zählumfang von 0 bis 999.999.999 ist ca. 1x im Jahr mit einem Wrap zu rechnen.
(Zähler springt von 999.999.999 zu 0, Tages-Differenz wird dann negativ!)

Tagesverbräuche einen Monat lang speichern

DB mit den Tagesdurchsätzen und Hilfsvariablen anlegen
Code:
//Pseudocode!
STRUCT
Tagesdurchsatz       : ARRAY[1..31] OF DINT ; //Tagesdurchsätze je Kalendertag in Liter
Zaehlerstand_gestern : DINT ;                 //Zählerstand gestern um 23:59 Uhr
Tag_gestern          : BYTE ;                 //Datum.Tag beim letzten Speichern
END_STRUCT ;
Es wird kein Zeitstempel gespeichert, der Tag des Monats ist der Index in das Array!

Immer um Mitternacht (für's Index-Rechnen besser um 23:59 Uhr) oder anderer fester Zeitpunkt
folgender Ablauf in Pseudocode:
Code:
* Datum/Uhrzeit als DATE_AND_TIME mit SFC1 "READ_CLK" in #Temp_DuT lesen
  LAR1 P##Temp_DuT
  Tag_jetzt    := LB [AR1, P#2.0] (in BCD!) und mit BTI zu 1..31dez wandeln
  Stunde_jetzt := LB [AR1, P#3.0] (in BCD!)
  Minute_jetzt := LB [AR1, P#4.0] (in BCD!)
* Ist es 23:59 Uhr? (Stunde_jetzt == B#16#23 AND Minute_jetzt == B#16#59)
  AND Heute noch nicht gespeichert? (Tag_jetzt <> DB.Tag_gestern)
* OK, um 23:59 Uhr 1x Tagesverbrauch speichern
    * DB.Tag_gestern := Tag_jetzt //damit nur 1x gespeichert wird
    * Tagesdurchsatz[Tag_jetzt] //in Liter// := (Zählerstand_jetzt - DB.Zählerstand_gestern) / 80
      falls (Zählerstand_jetzt - DB.Zählerstand_gestern) negativ, dann 1.000.000.000 addieren
      falls Liter-Bruchteile exakt gerundet werden sollen, dann in REAL rechnen
    * DB.Zaehlerstand_gestern := Zählerstand_jetzt

Die CPU-Uhr sollte mit einer geeichten Uhr synchronisiert werden, z.B. mit einem NTP-Server.
Die CPU-Uhr sollte immer auf Winterzeit stehen.

Gruß
PN/DP
 

Anhänge

  • Liste31.AWL.txt
    4,5 KB · Aufrufe: 72
Zuletzt bearbeitet:
aktueller Tagesdurchsatz

Soll der aktuelle Tagesdurchsatz (in Liter) seit Mitternacht angezeigt werden:
Tagesdurchsatz_heute in Liter := (Zählerstand_jetzt - DB.Zählerstand_gestern) / 80

Gruß
PN/DP
 
Hallo

Danke

für eine Programmbeispiel wäre ich sehr dankbar, kann leider die Theorie noch nicht in ein Programm umsetzten, und das ich nur FUP lesen kann macht die Sache nicht einfacher.

wie kann ich 30 Tage speichern, wird das in DBs gemacht die ich mit Wincc Flex auslesen kann?

Gruß
 
Zurück
Oben