Mittelwertbildung SIWAREX U

petzi

Level-1
Beiträge
255
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

ich glaube ich brauche etwas Hilfe.

Ich habe hier eine Wägezelle, die an einem Siwarex U angeschlossen ist.

Zum Eintrag des Gewichts in einen Datenbaustein muss ja die SFC59 aufgerufen werden - das klappt soweit auch gut!


Nun soll aber eine Mittelwertbildung aus drei hintereinander folgenden Wiegungen erfolgen.

Dazu habe ich über Timer 3x eine Wartezeit und 3x einen Wiegestart programmiert.

Jetzt rufe ich die SFC59 über die 3x Wiegestarts 3x auf - also:

Code:
       U     "1. Wiegestart"
       S     M     39.6
       CALL  "RD_REC"                               // SFC59
       REQ    :=M39.6
       IOID   :=B#16#54
       LADDR  :=W#16#12A
       RECNUM :=B#16#1F
       RET_VAL:=MW156
       BUSY   :=M39.7
       RECORD :=P#DB6.DBX0.0 BYTE 10
      UN    M     39.7
      R     M     39.6

usw.

Ich könnte dann die drei Messwerte im DB6 addieren und durch 3 teilen und hätte meinen Mittelwert.

Frage:

Das Problem hierbei ist jedoch der Zeiger hinter RECORD - dieser Eintrag müsste ja bei jedem der drei Aufrufe anders sein, geht das?

Oder gibt es einen besseren Weg?

Vielen Dank!
 
Zuletzt bearbeitet:
Das Problem hierbei ist jedoch der Zeiger hinter RECORD - dieser Eintrag müsste ja bei jedem der drei Aufrufe anders sein, geht das?
Sicher geht das

Code:
       U     "1. Wiegestart"
       S     M     39.0
       CALL  "RD_REC"                               // SFC59
       REQ    :=M39.0
       IOID   :=B#16#54
       LADDR  :=W#16#12A
       RECNUM :=B#16#1F
       RET_VAL:=MW156
       BUSY   :=M39.1
       RECORD :=P#DB6.DBX0.0 BYTE 10
      UN    M     39.1
      R     M     39.0

       U     "2. Wiegestart"
       S     M     39.2
       CALL  "RD_REC"                               // SFC59
       REQ    :=M39.2
       IOID   :=B#16#54
       LADDR  :=W#16#12A
       RECNUM :=B#16#1F
       RET_VAL:=MW156
       BUSY   :=M39.3
       RECORD :=P#DB6.DBX10.0 BYTE 10
      UN    M     39.3
      R     M     39.2

       U     "3. Wiegestart"
       S     M     39.4
       CALL  "RD_REC"                               // SFC59
       REQ    :=M39.4
       IOID   :=B#16#54
       LADDR  :=W#16#12A
       RECNUM :=B#16#1F
       RET_VAL:=MW156
       BUSY   :=M39.5
       RECORD :=P#DB6.DBX20.0 BYTE 10
      UN    M     39.5
      R     M     39.4
Mit der negativen Flanke vom 3. BUSY (M39.5) addierste dann deine
3 Messwerte und bildest deinen Mittelwert.

Geht aber bestimmt auch eleganter ;)

Pylades
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort pylades, ja ok - so geht es!

Ich dachte halt eine FC1 zu basteln, in der die SFC59 enthalten ist.

Und dann:

Code:
U "1. Wiegestart"
SPB M001
 
U "2. Wiegestart"
SPB M002
 
U "3. Wiegestart"
SPB M003
 
M001: Call FC1
BEA
 
M002: Call FC1
BEA
 
M003: Call FC1

Und für den Wert RECORD halt jedesmal eine andere Deklaration verwenden...

So geht es wohl nicht, oder?
 
Zuletzt bearbeitet:
Warum willst du denn alles speichern.
Nur im DB6.DBW0 steht einzig und alleine das Gewicht.
Die Siwarex kannst du normal mitlaufen lassen.
Beim Wiegen speichert du halt die drei Werte in einem Db ab.
 
Und für den Wert RECORD halt jedesmal eine andere Deklaration verwenden...
Das hat ja pylades gemacht, immer um 10 Byte erhöht.

Ich dachte halt eine FC1 zu basteln, in der die SFC59 enthalten ist.

So geht es wohl nicht, oder?
Doch geht auch:

Code:
     U "1. Wiegestart"
     SPB M001
 
     U "2. Wiegestart"
     SPB M002
 
     U "3. Wiegestart"
     SPB M003
[COLOR=red]  L 0[/COLOR]
[COLOR=red]  T Zwischenergebnis[/COLOR]
 
M001: Call FC1
[COLOR=red]  UN M39.7[/COLOR]
[COLOR=red]  SPB End1 // Warten auf Busy Signal[/COLOR] 
[COLOR=red]  L Zwischenergebnis[/COLOR]
[COLOR=red]  L DB6.DBW 0[/COLOR]
[COLOR=red]  +I[/COLOR]
[COLOR=red]  T Zwischenergebnis[/COLOR]
[COLOR=red]End1:NOP 0[/COLOR]
     BEA
 
M002: Call FC1
[COLOR=red]  UN M39.7[/COLOR]
[COLOR=red]  SPB End2 // Warten auf Busy Signal [/COLOR]
[COLOR=red]  L Zwischenergebnis[/COLOR]
[COLOR=red]  L DB6.DBW 0[/COLOR]
[COLOR=red]  +I[/COLOR]
[COLOR=red]  T Zwischenergebnis[/COLOR]
[COLOR=red]End2:NOP 0[/COLOR]
     BEA
 
M003: Call FC1
[COLOR=red]  UN M39.7[/COLOR]
[COLOR=red]  SPB End3 // Warten auf Busy Signal [/COLOR]
[COLOR=red]  L Zwischenergebnis[/COLOR]
[COLOR=red]  L DB6.DBW 0[/COLOR]
[COLOR=red]  +I[/COLOR]
[COLOR=red]  T Zwischenergebnis[/COLOR]
[COLOR=red]  L 3[/COLOR]
[COLOR=red]  /I[/COLOR]
[COLOR=red]  T Mittelwert[/COLOR]
[COLOR=red]End3:NOP 0[/COLOR]
Vorraussetzung ist natürlich das dass Busy Signal nur ein Zyklus ansteht, aber das ist glaube ich auch so.
Sind aber glaube Doppelwörter, also die I & W werden D ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum willst du denn alles speichern.
Nur im DB6.DBW0 steht einzig und alleine das Gewicht.
Die Siwarex kannst du normal mitlaufen lassen.
Beim Wiegen speichert du halt die drei Werte in einem Db ab.

Hallo jabba,

glaube das ist mein Problem... wie kann ich beim Wiegen denn bestimmen, wo die Werte abgespeichert werden sollen? Wird nur ein Mal gewogen, so wird durch die SFC59 das Gewicht doch ín den DB6.DBW0 geschrieben. Wenn nun dreimal gewogen werden soll, so muss doch die SFC59 auch drei Mal aktiviert werden, oder verstehe ich das falsch?

@Paule: Ja ok, danke. Nicht so elegant, oder? Gibt es auch eine "schönere" Alternative für mein Vorhaben?
 
Zuletzt bearbeitet:
Ich verwende das Beispiel von Siemens, und da wird solange nicht geschrieben wird z.B. für Tara immer gelesen. Somit hat man immer den aktuellen Istwert der Waage im DBW0 als Integer liegen.
Wo geht denn dann das Ergeniss aus dem db6 hin, oder fängst du erst an mit der Siwarex?

Code:
      U     "Wiegen1"
      FP    M      xx.0
      SPBNB _00e
      L     DB6.DBW    0  // Istwert
      T     DB7.DBW    0  // Speicher 1
_00e: NOP   0
 
Ja, fange erst an mit der Siwarex.

Habe mir halt über Timer drei Merker gebastelt, die die drei Wiegungen anstoßen sollen.

Dazu muss doch drei Mal die SFC59 aufgerufen werden, oder nicht? Und unter RECORD steht ja in der SFC59 der Ablageort für das Gewicht.

NUR: Dann wird mein Ergebnis der ersten Wiegung ja von der zweiten überschrieben, usw.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Im Prinzip musst du erst einmal festlegen , ob du den Wert der Waage so wie du vorhast nur bei Bedarf abholst, oder so wie ich es mache immer.

Wenn man später den Istwert noch anzeigen will, z.B. auf einem Panel sollte man den Wert zyklisch abholen.

Danach ist es eigentlich ganz einfach. Lege einen DB an mit den drei Messwerten und dem Mittelwert.

Wenn die erste Messung erfolgen soll diese Abfragen, einen Puls bilden und aus dem DB6 den DBW0 in den DB7 DBW0 schieben.
Bei der zweiten Messung den DB6.DBW0 nach DB7.DBW2 usw.
Wenn alle durch sind, den Mittelwert berechnen.
 
Danke jabba,

was mir aber trotz Allem noch immer nicht klar ist:

1) Die drei Merker "1.Wiegestart", "2.Wiegestart" und "3.Wiegestart" müssen doch jedesmal die SFC59 aufrufen, oder nicht?

2) Und falls ja, dann muss am Ende der SFC59 doch immer das Schieben aus dem DB6.DBW0 in einen anderen DB stehen, oder?

3) Wie kann ich den Wert zyklisch abholen?

Der Mittelwert soll dann am Panel angezeigt werden!

Danke für die Hilfe...
 
Zuletzt bearbeitet:
Du kannst en SFC immer aufrufen, das heisst bei der Siwarex nicht das du eine Verwiegung machst , sondern nur das du den Istwert aus der Baugruppe abholst. Du kannst probehalber an den REQ mal ein High dranschreiben, dann wird im DB6.DBW0 immer der Istwert angezeigt.

Falls du eine sehr enge Zeitschiene für die Zykluszeit der SPS hast, könnte es eventuell Sinn machen den SFC nur aufzurufen wenn man ihn braucht. Ich mach mir da eher keinen Kopp drum, ich lasse den immer mitlaufen. Außer wenn ich die baugruppe beschreibe, z.B. für ein Tara.
Deine Vorgehensweise macht Sinn, wenn man mehr als z.B. nur das Bruttogewicht haben will. Wenn man aber einzig und alleine nur den einen Parameter der Siwarex lesen will, geht es so einfacher.

Anbei mal ein kleinen Bildchen wie das aussehen könnte. Ich gehe davon aus, das die Signale Wiegen1..3 über eine Flanke gesetzt werden und ich diese löschen wenn es erledigt ist.
 

Anhänge

  • siwarex.jpg
    siwarex.jpg
    52,9 KB · Aufrufe: 21
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank jabba!

"Waage1"-Brutto steht für den DB6.DBW0, oder?

"Werte"-Wert1 - 3 für den DB, wo das Gewicht hingeschoben werden soll, oder?

Für den Fall, dass man den SFC59 nur dann aufrufen möchte, wenn man ihn auch braucht, dann müssten die drei von mir "gebastelten" Merker "1.Wiegestart", "2.Wiegestart" und "3.Wiegestart" jedesmal den SFC aufrufen - im Grunde so wie Paule das aufgezeigt hat?
 
Genau
Waage1.brutto ist DB6.DBW0

Das programm macht den Aufruf sobald einer der Merker Wiegen1..3 gesetzt ist, und löscht diesen wenn der Wert abgeholt wurde. Du braucht also da nix zu ändern.
Nur bei deinen dreit Timern die die merker setzen muss eine Pulsbildung rein, damit dieser gelöscht werden kann wenn der Auftrag beendet wurde.
 
Nur bei deinen dreit Timern die die merker setzen muss eine Pulsbildung rein, damit dieser gelöscht werden kann wenn der Auftrag beendet wurde.

Ich hatte das so gelöst, dass immer der nachfolgende Merker den vorhergehenden rücksetzt; denke das sollte ja auch funktionieren.

Im Grunde könnte ja an den ENO-Ausgang (#Wiegen3) auch noch das Startsignal für die Mittelwertbildung, oder?

Da du in dem angehängten Baustein IN/OUT Parameter verwendet hast, muss dieser Baustein ja aufgerufen werden, um Aktualwerte zu übergeben, stimmts?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, sorry wenn ich nochmals nerven muss - aber ich habe folgendes Problem:

Hab jetzt mal ein kleines Programm geschrieben, um die einzelnen Messwerte in einen DB2 zu transferieren - aber das will nicht klappen, die entsprechenden Felder (D_0, D_1, D_2) im DB zeigen immer den Wert 0 an - was mache ich nur falsch?

FC12/NW1

Code:
      U     E      1.0
      S     M     15.6                  // Anstoss Wiegen
 
      U     M     15.6
      L     "Timer-Zeiten".T14
      SE    T     14
      U     T     14
      S     M     15.0                  // Start 1. Waegung
      U     M     15.0
      L     "Timer-Zeiten".T15
      SE    T     15
      U     T     15
      S     M     15.1                  // Start 2. Wartezeit
      R     M     15.0
      U     M     15.1
      L     "Timer-Zeiten".T16
      SE    T     16
      U     T     16
      S     M     15.2                  // Start 2. Waegung
      R     M     15.1
      U     M     15.2
      L     "Timer-Zeiten".T17
      SE    T     17
      U     T     17
      S     M     15.3                  // Start 3. Wartezeit
      R     M     15.2
      U     M     15.3
      L     "Timer-Zeiten".T18
      SE    T     18
      U     T     18
      S     M     15.4                  // Start 3. Waegung
      R     M     15.3
      U     M     15.4
      L     "Timer-Zeiten".T19
      SE    T     19
      U     T     19
      S     M     15.5                  // Wiegen Ende
      R     M     15.4
      U     M     15.5
      L     "Timer-Zeiten".T20
      SE    T     20
      U     T     20
      R     M     15.5
      R     M     15.6


FC12/NW2

Code:
      O     #Wiegen_1
      O     #Wiegen_2
      O     #Wiegen_3
      =     #Lesen


FC12/NW3

Code:
       CALL  "WR_REC"
       REQ    :=M39.1
       IOID   :=B#16#54
       LADDR  :=W#16#12A
       RECNUM :=B#16#B
       RECORD :="Waage-DB_KKF".Befehl
       RET_VAL:=MW154
       BUSY   :=M39.2
       SET   
       R     M     39.1


FC12/NW4

Code:
       CALL  "RD_REC"
       REQ    :=#Lesen
       IOID   :=B#16#54
       LADDR  :=W#16#12A
       RECNUM :=B#16#1F
       RET_VAL:=#RET_VAL
       BUSY   :=#Busy
       RECORD :=P#DB6.DBX0.0 BYTE 10


OB1:

Code:
       CALL  FC12
       Wiegen_1  :=M15.0
       Wiegen_2  :=M15.2
       Wiegen_3  :=M15.4
       DB6_DBW10 :="Waage-DB_KKF".Brutto
       RET_VAL   :=MW156
       Messwert_1:="Gewicht-DB_KKF".D_0
       Messwert_2:="Gewicht-DB_KKF".D_1
       Messwert_3:="Gewicht-DB_KKF".D_2
       Busy      :=M39.3
 

Anhänge

  • FC12_NW5.jpg
    FC12_NW5.jpg
    18,8 KB · Aufrufe: 13
  • DB2.jpg
    DB2.jpg
    13,7 KB · Aufrufe: 6
Zuletzt bearbeitet:
Hallo,
ich habe das Ganze jetzt nur kurz überflogen.
Was mir da auffällt ist deine Kapselung - darüber solltest du unbedingt noch einmal nachdenken.
Du rufst den FC12 im OB1 auf - OK
Du übergibst dem FC12 die Merker deiner Schrittkette für die Wiegerei - Naja ...
Die Schrittmerker, die du dem FC12 übergibst sind als Schrittkette im FC12 verwendet ... ???? :confused::confused::confused:

Vielleicht bringst du das erstmal in eine "saubere" Struktur.
Dann die Frage - was funktioniert denn nicht ?

Gruß
LL
 
Was ist denn der Sinn der Mittelwertbildung?

Ich frage nur, weil man ja in der Siwarex die internen Mittelwertbildung einschalten kann.
Dann kann man sich das in der SPS ersparen.
Dann gibt es ja noch die zuschaltbaren Filter die auch recht gut gehen.

Ich habe noch nie eine Mittelwertbildung in der SPS benötigt (bei der Siwarex) - hängt aber ja evtl. von der zu lösenden Aufgabe ab.

cu
bernd
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi LL,
eigentlich sind es zwei FC's. Habe das Ganze der Einfachheit jetzt nur in einen FC geschrieben...

Was nicht funktioniert:

In der angehängten Datei ist ja unter anderem das NW5 abgebildet. Hier sollen eigentlich, je nach Bedingung, die gemessenen Werte aus dem DB6.DBW0 in die einzelnen "Felder" des DB2 (also D_0, D_1 und D_2) geschoben werden... das funzt aber nicht!


@Bernd: Da das Gewicht beim Aufhängen auf das Wägemodul schwingt, soll aus drei Werten ein Mittelwert berechnet werden.

Danke!
 
Zuletzt bearbeitet:
... da du mit dem Steuerbit "Wiegen" gleichzeitig das Lesen und das Übertragen ansteuerst könnte ich mir vorstellen, dass der Wert noch gar nicht gelesen wurde, den du transferieren möchtest. Vielleicht solltest du erst Einlesen und wenn eingelesen dann Übertragen - das Ganze dann jeweils mit Flanken-Merkern um sicher zu stellen, das du nur jeweils ein Mal diese Geschichte ausführst ...

Gruß
LL
 
Danke LL,

aber das Problem ist wohl der Eingang #Busy!

Weiß nicht warum, aber der ist permanent auf 0 - sollte der nicht während dem Wiegen 1 und erst nach Abschluss wieder 0 sein?
 
Zurück
Oben