TIA Durschnittswert aufzeichnen

JanP

Level-2
Beiträge
106
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Forum :D

Ich mache mir aktuell gedanken zu einem kleineren Problem an einer Kundenanlage und hoffe auf euere Ideen zur Umsetzung, aber fangen wir mal von vorne an.

Hardware:
- S7-1215C
- HMI KTP1200
- FU G120X

Funktion:
Ich zeichne mit hilfe des LGF Bausteins "LGF_FloatingAverage" die Stromaufnahme des G120X für einen Zeitraum von 10min auf. Der Baustein hat ein WindowSize von 1-100 und entsprechend werden die Werte nach dem FiFo Prinzip früher oder später überschrieben. Nun wünscht sich der Kunde jedoch das alle alle Werte im Messzeitraum aufgezeichnet und eingerechnet werden.
Nun stellt sich die Frage wie ich das am besten umsetze, ohne die CPU zu stark zu belasten. Eine Idee wäre den Baustein zu erweitern auf 600 Werte und im Aufzeichnungszeitraum jede Sekunde einen Wert zu triggern. Ob das Funktioniert schaue ich mir morgen im Büro am Test-Rack an.
Für Alternativen und Ideen wäre ich auch dankbar, man lernt ja nie aus (y)

Würde mich freuen von euch zu hören, Gruß,
Jan
 
Die CPU-schonendste Lösung wäre ein DB mit Array mit deinen Werten und mit "Blockmove" jeden gewünschten Takt von hinten an alle Werte um ein Element nach vorne zu schieben.
Das sollte auch mit erheblich mehr Werten klappen ohne die Zykluszeit wirklich zu beeinflussen - z.B. mit 6000 Werten.
Bleiben wir mal bei deinen 600 und ich gehe von einem Real aus.
Du schreibst deinen Istwert ständig ins Element XYZ[600] und schiebst je Takt mit einer Flanke die Werten von XYZ[1] Byte 2400 zu XYZ[0] Byte 2400.
Dann hast Du einen FIFO mit 600 Werten und dem kleinen Schönheitsfehler, dass der letzte Wert im Array dein aktuellster ist und in [0] der älteste Wert steht.

Deine Mittelwertberechnung läuft über eine laufende Summe je Takt, bei dem du das Element [599] addierst und das Element in [0] subtrahierst.
Du musst nur einmal eine "Nullsetzung" der Summe und des Arrays mit "Fill" und überschreiben jedes Wertes mit Null.

Die Lösung sollte praktisch keinen Einfluss auf die Zykluszeit haben.
Das einzige was Dich limitiert wäre die max Größe vom Blockmove auf der 1200er.

Probiers mal aus ;)
 
Du musst nur einmal eine "Nullsetzung" der Summe und des Arrays mit "Fill" und überschreiben jedes Wertes mit Null.
Das würde ich nicht machen, weil dann der Mittelwert 600 Werte lang (wie oft wird ein Wert aufgenommen = x Sekunden) von Null an hoch läuft.
Ich würde z.B. den ersten Meßwert nehmen und damit das gesamte Array füllen.

Ansonsten wie Harald schon schrieb: Mit einem Index ein umlaufendes Array.

Und Ressourcen kannst Du schonen, indem Du nicht immer alle Werte neu aufaddierst und dann teilst, sondern Dir die alte Summe wegspeicherst, vor dem Überschreiben der Speicherposition den Inhalt von der alten Summe abziehst und dann den neuen Wert aufaddierst.
Dann sparst Du Dir in jedem Zyklus die FOR x:=1 TO 600 Schleife. Stattdessen nur eine Subtraktion und eine Addition.
Damit könnte man sich theoretisch sogar das ganze Array sparen und dann auch entsprechend groß werden.
 
Zuletzt bearbeitet:
Dann sparst Du Dir in jedem Zyklus die FOR x:=1 TO 600 Schleife.
Das würde ich auf jeden Fall vermeiden und habe ich auch so nicht beschrieben.

Das würde ich nicht machen, weil dann der Mittelwert 600 Werte lang (wie oft wird ein Wert aufgenommen = x Sekunden) von Null an hoch läuft.
Ich würde z.B. den ersten Meßwert nehmen und damit das gesamte Array füllen.
Was aber dann auch nicht richtig ist und nur eine Verschleierung für z.B. die Visu.
Ja der Start mit Null ist unschön, aber wie oft macht man den? Ich lasse das normalerweise nur bei OB100-Anlauf oder manuell nach einer Änderung anstoßen. Ansonsten wird der Takt nur angestoßen, wenn der Prozess (hier Motor) läuft.


Noch viel mehr CPU-schonender ist es, wenn man das Array NICHT jeden Takt umspeichert, sondern als Ringpuffer organisiert.
Ich bin immer wieder überrascht, wie wenig die CPU ein Kopiervorgang eines großen, zusammenhängenden Bereiches interessiert.
S7 300 oder 400 mit SFC20 oder in der S7 1200 und 1500 mit "Move".

Ich habe die Variante mit Pointer (Classic) oder Index-Adressierung im Array (TIA) auch schon öfters gemacht, aber das ist mit IBN und immer anwendungsspezifischer Auswertung, Aufbereitung und Pointer-Konfiguration meistens viel zeitaufwändiger als das Schieberegister. Das passiert in einem Netzwerk.
Ich spreche aber hier immer nur von Einzelwerten und nicht von einem Array of UDT/Struct mit z.B. 100.000 Byte.
Außerdem brauche ich immer mal wieder verschiedene Zeitpunkte oder Werte zu genau einem Zeitpunkt. Das ist mit variabler Adressierung schlechter zu lösen.

Ich lasse mich gerne aber auch von etwas Anderem überzeugen ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mal angefangen mir die Sache anzusehen und folgendes Problem tritt nun auf. Der Kunde wünscht das 24 Stunden lang jede Sekunde ein Wert aufgenommen wird und das für Strom, Spannung, Frequenz, Leistung, CosPhi und Drehzahl. Das Sprengt mir den Arbeitsspeicher der CPU mit über 1300% und ist somit nicht möglich. Eine Möglichkeit wäre es alle 10sec zu messen, dann passt alles in den RAM, entspricht aber nicht dem Wunsch des Kunden.

Was also tun?
 
Was soll denn mit den Meßwerten über 24h passieren? Mehr als nur Mittelwertbildung?

Die Mittelwertbildung könntest Du wie oben beschrieben ohne viel Speicher machen.

Wenn Du die einzelnen (historischen) Werte benötigst, ist die Frage, was damit passieren soll...
 
Zuletzt bearbeitet:
Der Sinn dieser Anforderung ergibt sich mir auch nicht! Ich würde einen Mittelwert mit FiFo sogar als besser erachten, da dadruch "Störgrößen" wie Anlaufstrom etc. aus dem Mittelwert herausfallen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab oben natürlich Blödsinn geschrieben, fällt mir gerade auf... :censored:

Was aber eventuell gehen würde: Du bildest mehrere Mittelwerte bilden:
Du bildest z.B. über eine viertel Stunde Mittelwerte.
Die Mittelwerte sammelst Du und bildest darüber über 24h einen Mittelwert. Dann hast Du zwei Arrays: ein 900er und ein 96er. Sind 996 Real-Zahlen anstatt 24x60x60 = 86400 Real-Zahlen.

Du wirst für den Moment etwas ungenauer, weil sich der Wert nur alle viertel Stunde ändert, aber an der Genauigkeit über 24h dürfte sich nichts ändern.
 
Ich habe mal angefangen mir die Sache anzusehen und folgendes Problem tritt nun auf. Der Kunde wünscht das 24 Stunden lang jede Sekunde ein Wert aufgenommen wird und das für Strom, Spannung, Frequenz, Leistung, CosPhi und Drehzahl. Das Sprengt mir den Arbeitsspeicher der CPU mit über 1300% und ist somit nicht möglich. Eine Möglichkeit wäre es alle 10sec zu messen, dann passt alles in den RAM, entspricht aber nicht dem Wunsch des Kunden.

Was also tun?

Dem Kunden mitteilen, dass man das gerne machen kann, aber mit der vorhandenen CPU nicht lösbar (und nicht bei der Projektierung geplant).
Bei dem Preis einer neuen CPU mit mehr Speicher und den aktuellen Lieferzeiten für CPUs ist der Wunsch meistens schnell wieder weg, da gar nicht so wichtig.

Ansonsten wie bereits vorgeschlagen abspecken und in einem anderen Zeitintervall mitteln und speichern. Vielleicht noch irgendwelche Min/Max-Werte mit Zeitstempel je Stunde oder so.

Oder im KTP1200 zwei Grafikanzeigen mit den Werten anlegen über 1h + 24h. (Evtl laufenden Mittelwert alle Sekunde über 2 Minuten bilden und darstellen lassen, dann hat man indirekt auch jede Sekunde verarbeitet / KTP kann 999 Werte je Graph und 999 x 2min = 33,3h)

Man könnte auch im KTP auf USB protokollieren. Dann liegt auf dem USB eine CSV-Datei mit Werten.

Die Frage stellt sich eher nach dem tieferen Sinn und was man mit den Daten macht oder wie oft man so eine Auswertung fahren will.
 
Zuletzt bearbeitet:
Die Frage wäre, was mit der Aufzeichnung erreicht werden soll, geht es um Maximalwerte, Mittelwerte um einen Trend zu erkennen oder was auch immer?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe dem Kunden nun mitgeteilt zwar mehr als die bisherigen 100 Werte aufzeichnen zu können, aber das es für eine 24 Stunden protokolierung mehr braucht als "nur" eine S7-1200. Sollte er also weiterhin solche aufwendigen Protokolle fahren möchten, werde ich wohl einen PC neben die Anlage stellen und mir eine Lösung mit Excel überlegen. Dann kann ich ja Werte von der SPS an den PC senden und dort speichen, verarbeiten usw.

Immer wieder spannend, welche Vorstellungen Kunden haben und was tatsächlich gebraucht wird :ROFLMAO:

Danke!
 
Zurück
Oben