Trendberechnung mit S7

MeisterLampe81

Level-1
Beiträge
513
Reaktionspunkte
118
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

heute stellte sich die Frage, ob eine Trendberechnung mit S7 möglich ist und vor allem wie.

Folgendes Szenario:

Der Füllstand zweier Maschinenbunkern wird mit einer Radarsonde überwacht. Die Analogwerte werden in der Steuerung eingelesen.

Maschine A hat einen Verbrauch von 300 kg Material in der Minute. Die Wegezeit Maschinenversorgung - Maschine beträgt 130 Sekunden.
Maschine B hat einen Verbrauch von 500 kg Material in der Minute. Die Wegezeit Maschinenversorgung - Maschine beträgt 170 Sekunden.

Z.Zt. geschieht die Materialanforderung mit einfachen Schaltpunkten. Es gibt eine Prioritätssteuerung, wodurch die Wegezeiten mit einbezogen werden. Die Schaltpunkte sind aber relativ starr gehalten. Der Bediener hat zwar die Möglichkeit die Schaltpunkte einzustellen, allerdings geschieht dies manuell. Der Materialverbrauch der Maschinen kann stark variieren. Die oben genannten 300 bzw. 500 kg dienen nur als Beispiel. Ich kann allerdings immer nur eine Maschine mit Material versorgen.

Ich würde die Schaltpunkte gerne optimieren bzw. automatisieren. Ich stelle mir eine Trendberechnung vor, bei der ich den Mittelwert des Materialverbrauches z.B. der letzten 30 Sekunden nehme und dann berechne, wo ich in 300 Sekunden bin. Somit kann ich -zumindest theoretisch- erkennen, wann Maschine A oder B leer ist und darauf meine Steuerung so ausrichten, das die Maschine welche zuerst leer ist, zuerst mit Material versorgt wird.

Habe beim suchen http://www.sps-forum.de/programmierstrategien/12268-trendberechnung-algorithmen.html gefunden. Hilft mir aber irgendwie nicht wirklich weiter. Kann man so etwas mit dem Regelbaustein FB 41 bzw. FB 42 machen?? Ich habe von der Regelungstechnik mit S7 nicht wirklich viel Ahnung. Wie kann man sonst an das Problem herangehen?? Kann man solch ein Problem mit dem "klassischen" Step7 lösen oder geht das nur in SCL o.ä.?

P.S. Als Steuerung habe ich je eine 315 2DP/PN mit WinCC V7 als Visualisierung.

Gruß
MeisterLampe81
 
Danke für die Antworten.

In der Oscat Bibliothek hatte ich gestern schon geguckt, allerdings noch nichts passendes gefunden. Den "Trend" Baustein hatte ich gesehen, aber der gibt mir nur ein Signal, ob es auf oder ab geht.
Nach einem Baustein für Lineare Interpolation werde ich mal suchen.

Ich habe mir heute überlegt, das ich ein Schieberegister mit 30 Werten (jede Sekunde einen) nehme, dann den letzten Wert vom ersten Wert subtrahiere, das ganze dann mit 10 multiplizierte (das Delta x 10 wg. 300 Sekunden) und dann mal gucke wie sich die Werte verhalten und ob es klappt. Der Vorteil ist, das der Füllstand des Bunkers fast linear abnimmt. Hierrüber kann ich dann mit einem Vergleicher einfluss auf die Prioritäten und die Schaltpunkte nehmen.

In meiner Phantasie klappt es, mal gucken was die Realität sagt..:cool:

Gruß
MeisterLampe81
 
Hallo MeisterLampe,

wenn ich's richtig verstanden habe, dann musst du den Wert über der Zeit integrieren. Daraus erhältst du als Ergebnis die Abnahme der Höhe bzw. des Gewichts in m/s oder kg/s oder wie auch immer.


Gruß, Onkel
 
Nabend,

also, die Oscat Bibliothek ist echt super. Da findet der faule Instandhalter, der nicht wirklich viel Ahnung von indirekter Adressierung hat sogar ein FiFo Baustein. Aber damit geht es schon los. Ich kriege den Baustein zwar zum laufen, allerdings wird immer nur der erste Speicherplatz im DB beschrieben, das FiFo Prinzip klappt nicht.

Mit Direktzugriff auf den Instanz-DB auf "pw" kann ich den Speicherplatz bestimmen, aber das ist bestimmt nicht im Sinne des Erfinders. Ich verstehe den Baustein so, das der Wert vom "DIN" Eingang bei anlegen eines True-Signals auf "WR" den anstehenden Wert immer einen weiterschiebt.

Was mache ich falsch bzw. verstehe ich das falsch?

Die Interpolationsbausteine habe ich gesehen. Ich würde es aber gerne erstmal mit einem Schieberegister und der Delta-Änderung bezogen auf die Zeit versuchen.. wie gesagt.. Instandhalter :cool:

FiFo DB.jpgFiFo DB2.jpgFiFo Anleitung.jpg

Ist es eigentlich Erlaubt, den Code des Oscat Bausteins hier zu veröffentlichen?? Ist ja eigentlich für jeden zugänglich. Habe dazu ein Paar fragen..

Gruß
MeisterLampe81
 
Nabend,

also, die Oscat Bibliothek ist echt super.
...

Ist es eigentlich Erlaubt, den Code des Oscat Bausteins hier zu veröffentlichen??

Ist ja eigentlich für jeden zugänglich. Habe dazu ein Paar fragen..

Gruß
MeisterLampe81

Also erstmal freut es mich, wenn du mit deiner Aufgabenstellung weitergekommen bist.:D


Über Oscat kannst du dir HIER die Lizenzbedingungen anschauen, wo es u.a. heisst:
Code:
Die Verwendung der OSCAT Bibliothek ist [U]kostenfrei und kann ohne Lizenzvereinbarung [/U]für private oder gewerbliche Zwecke eingesetzt werden.
 
Eine [U]Verbreitung der Bibliothek ist ausdrücklich erwünscht[/U], hat aber kostenfrei und unter Hinweis auf unsere Webpage WWW.OSCAT.DE zu erfolgen.

Ich glaube, bei oscat ist für Fragen dort ein User-Forum eingerichtet, ich habe es aber noch nie benutzt.

Aber auch hier im Forum wirst du über die Suchfunktion einiges zu oscat finden.

.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ist der Code, zudem ich ein paar Fragen habe. Der Baustein wurde laut Information aus einer SCL Quelle generiert und ist komplett kommentarlos..


Code:
SET   
      SAVE  
      =     L      0.1   //Was bedeutet L 0.1?? Lokalvariable 0.1??
      U     #RST
      SPBN  A7d0
      L     #pr          //pr ist eine statische Variable, die immer auf null steht. Was hat dies für einen Zweck? 
      T     #pw        //pw gibt mir den Speicherplatz im FiFo an. Wenn ich denn über pr jeweils einen hoch zähle, habe ich ich in meinen Augen kein FiFo, sondern                               einen Speicherbaustein mit 32 Plätzen
      CLR   
      =     #FULL
      SET   
      =     #EMPTY
      L     DW#16#0
      T     #Dout
      SPA   A7d2
A7d0: CLR   
      U     #E
      SPBN  A7d2
      U     #EMPTY
      NOT   
      U     #RD
      SPBN  A7d3
      L     #pr      //Hier ist wieder der pr
      ITD   
      L     L#0
      +D    
      SPO   I007
      SPA   I008
I007: CLR   
      =     L      0.1    //Warum wieder L 0.1?
I008: L     L#32       //Warum jetzt 32 laden und..
      *D                  //...multiplizieren??
      SPO   I009
      SPA   I00a
I009: CLR   
      =     L      0.1   //Wieder die L 0.1
I00a: TAR2             //Akkutausch??
      +D                  //Warum addieren??
      SPO   I00b
      SPA   I00c
I00b: CLR   
      =     L      0.1
I00c: LAR1                          //[U]UND AB HIER HÖRT ES FÜR MICH ENDGÜLTIG AUF[/U]. Indirekte Adressierung ist für mich ein Böhmisches Dorf..
      L     DID [AR1,P#12.0]
      T     #Dout
      L     #pr
      T     LW     2
      L     32
      T     LW     4
      TAR2  LD     6
      UC    FC    53     //Warum soll ich in den FC53 springen und darf nicht mehr in meinen Ausgangsbaustein zurück?? Wenn ich wieder in meinen Ausgangsbaustein springe kriege ich einen Verschachtelungsfehler.
      LAR2  LD     6
      L     LW    10
      T     #pr
      L     #pr
      L     #pw
      ==I   
      =     #EMPTY
      CLR   
      =     #FULL
A7d3: CLR   
      U     #FULL
      NOT   
      U     #WD
      SPBN  A7d2
      L     #pw
      ITD   
      L     L#0
      +D    
      SPO   I00d
      SPA   I00e
I00d: CLR   
      =     L      0.1
I00e: L     L#32
      *D    
      SPO   I00f
      SPA   I010
I00f: CLR   
      =     L      0.1
I010: TAR2  
      +D    
      SPO   I011
      SPA   I012
I011: CLR   
      =     L      0.1
I012: L     #Din
      TAK   
      LAR1  
      TAK   
      T     DID [AR1,P#12.0]
      L     #pw
      T     LW     2
      L     32
      T     LW     4
      TAR2  LD     6
      UC    FC    53
 
      LAR2  LD     6
      L     LW    10
      T     #pw
      L     #pw
      L     #pr
      ==I   
      =     #FULL
      CLR   
      =     #EMPTY
A7d2: CLR   
      U     L      0.1
      SAVE  
      BE

Meine Hauptfrage ist eigentlich: Warum werden die Daten nicht durchgeschoben??

Gruß
MeisterLampe81
 
Meine Hauptfrage ist eigentlich: Warum werden die Daten nicht durchgeschoben??
Ein FIFO-Speicher muß nicht als Schieberegister realisiert werden. Man kann den FIFO auch als Ringpuffer implementieren, besonders wenn er groß ist. Man muß dann keine Daten schieben. Es reicht, wenn man sich mit Pointern merkt wo das Ende ist (zum Hinzufügen) und wo der Anfang ist (zum Entnehmen des ältesten Elements). Beim Hinzufügen und Entnehmen von Elementen werden dann nur die Pointer auf die neuen Anfangs- bzw. Ende-Adressen verstellt.

Im Normalfall versucht niemand ein SCL-Kompilat komplett zu verstehen, besonders wenn man den SCL-Quelltext hat. Es muß schon extrem wichtig sein, aus einem Kompilat den nicht (mehr) vorhandenen Quelltext zu rekonstruieren. Der SCL-Compiler erzeugt nicht besonders verständlichen Code, am Besten garnicht hinsehen ...

Beim flüchtigen Überfliegen Deines vom SCL-Compiler erzeugten AWL-Codes würde ich meinen, die Variablen #pw und #pr sind die Write- und Read-Pointer eines Ringpuffers. Wenn #pw und #pr gleich sind, dann ist der Puffer leer. Wenn ein Element hinzugefügt wird, dann wird es an der Adresse hinzugefügt, auf die der Write-Pointer #pw zeigt und danach wird #pw auf die nächste freie Adresse verstellt. Beim Entnehmen eines Elements wird das Element von der Adresse entnommen, auf die der Read-Pointer #pr zeigt und danach wird #pr auf das neue Ende des Puffers verstellt.
FC53 scheint ein Kopierbaustein zu sein, mit dem Daten in den Ringpuffer geschrieben oder gelesen werden.

Das L0.1 in dem SCL-Kompilat ist eine intern vom Compiler benutzte freie Lokaldaten/TEMP-Adresse für das OK-Flag, mit dem am Ende des Bausteins über das BIE-Bit (Ausgang ENO in FUP/KOP) signalisiert wird, ob bei der Bearbeitung des Codes ein Fehler aufgetreten ist.

Harald
 
Zurück
Oben