Step 7 Wie programmiert man eine Laufzeit- Überwachung

RudiRatlos

Level-2
Beiträge
15
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr Lieben
In meiner Praxis bin ich häufig auf das Problem der Analogen Sensor-Prozessdatenüberwachung gestoßen.
In einem Beitrag über Hydraulikzylinder hatte hier im Forum jemand von wie "programmiert man eine Laufzeit- Überwachung" gesprochen.
Es handelt sich dabei um eine Art Trend-Analyse...
Der Druck im Zylinder oder die Temperatur am Lagerschild bewegt sich in einem stabilen Bereich. Irgendwann Steigt der Wert plötzlich steil an.
Ich möchte aber nicht einen Ausreißer detektieren, sondern eine gemittelte Abweichung. Wobei ich das nicht einmal mathematisch genau beschreiben kann.:rolleyes:

Gibt es dafür bereits frei zugängliche Bibliotheken bei denen man solche parametrierbare Standard-Funktionen herunter laden kann?
Habt Ihr eine Idee oder muss ich die Frage evtl. nur für Chat-GPT umformulieren?

Ich hoffe Ihr putz mich nicht gleich runter, danke!
 
willkommen im realen praktischen Leben...

Am Ende musst Dir überlegen, was Du jetzt genau wie schnell detektieren willst, bzw. was alles noch normal ist.

Ausreisser in analogen Messwerten kannst jetzt entweder über ne Mittelwertbildung eliminieren oder Du nimmt einfach nen Timer und alarmierst erst, wenn die Grenzwertverletzung länger als x Sekunden ansteht... wobei zweiteres meistens gemacht wird. (Bsp. Lagertemp.>100°C für 5 Sek.-> Alarm)

Bibliotheken dafür gibts nicht, das ist einfach die tägliche Arbeit eines Automatisierers sich zu überlegen, was und wie genau und möglichst einfach er jetzt tippen will...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte aber nicht einen Ausreißer detektieren, sondern eine gemittelte Abweichung. Wobei ich das nicht einmal mathematisch genau beschreiben kann.:rolleyes:
Ich fürchte für deine SPS wirst du es mathematisch beschreiben müssen ¯⁠\⁠_⁠(⁠ツ⁠)⁠_⁠/⁠¯
Kannst du Mal auf einem X/Y-Graph eine Kennline zeichnen, also incl. der Verlaufsänderung die du dedektieren willst.

Gibt es dafür bereits frei zugängliche Bibliotheken bei denen man solche parametrierbare Standard-Funktionen herunter laden kann?
Die Siemens LGF-Bibliothek könnte ein erster Anlaufpunkt sein.
Unter dem Abschnitt "Measurement operations" dürftest du evtl. was für die Auswertung finden.
Die Datenerhebung könntest du über ein Schieberegister oder einen FIFO realisieren, je nach Anforderung und Datenmenge.
Vllt wäre auch das Stichwort "Gradient" noch einen Blick wert.

Bitte dran denken:
verstehe erst dein Problem, bevor du versuchst es mit irgendwelchen zusammengeklaubten Funktionen tot zu prügeln ;)

Ich hoffe Ihr putz mich nicht gleich runter, danke!
Solange du nicht mit einer "denkt für mich & macht meine Arbeit"-Einstellung um die Ecke kommst, beißen wir nicht (⁠✿⁠^⁠‿⁠^⁠)
 
Hi Botimperator
Danke für diese detaillierte Antwort
Ich fürchte für deine SPS wirst du es mathematisch beschreiben müssen ¯⁠\⁠_⁠(⁠ツ⁠)⁠_⁠/⁠¯
Kannst du Mal auf einem X/Y-Graph eine Kennline zeichnen, also incl. der Verlaufsänderung die du dedektieren willst
Ein Kunde hatte zuletzt angemerkt das wir in unserer Gleitring-Temperaturüberwachungen nur feste Grenzen als Warn- und Alarmschwellwerte verwenden.
Er würde lieber die aktuelle Temperatur als Langzeitwert (gleitend oder arithmetisch !?) permanent wegspeichern und dann eine "kurzfristige" Temperaturerhöhung von Delta-T >= x Kelvin als Schwellwert melden.

Dabei hat natürlich niemand die Mittelwertbildung, die Dämpfung und die Dauer der Abweichung spezifiziert.

Da ich hier im Forum zufällig von der "Druckerhöhung am Zylinderhubende" gelesen hatte, sah ich die gleiche Problemstellung aufblitzen.

Die Funktion mit einem FiFo selber zu schreiben wäre nicht das Problem ...nur aufwendig, danke.

Meine Hoffnung ist das ihr bereits Erfahrung mit eurer Prozessüberwachung habt, und wie man das dann mathematisch korrekt abbildet, also...

Verwendet ihr
a) einen Ringpuffer zum Einlesen der Messwerte während einer parametrierbaren Zeitdauer
b) welche Mittelwertbildung wäre hier praktisch anzuwenden
c) verwendet man für den Ausreißertest erneut einen Ringspeicher mit Mittelwertbildung, damit nicht eine einzelne Fehlmessung sofort zu einer Abschaltung / Reaktion führt.


Es gibt ja immer viele Wege die nach Rom führen, aber ich frage vor Begin meiner Fahrt gerne die erfahrenen Mitstreiter welchen Weg für sie am besten war
 
Ja, ich hab viel Erfahrung mit Prozessautomatisierung und Prozessüberwachung. Und üblicherweise macht man das so, wie ich oben geschrieben hab, bzw. Wie Ihr das auch macht mit festen (aber vom Befiener einstellbaren) Grenzen und Verzögerungen. Zusätzlich Gradientenüberwachung ist auch häufig, aber der Sinn eher selten da.
Wenn der Kunde bei Dir für die Lagerüberwachung ne spezielle Sonderlocke will, warum auch immer, musst mit ihm zusammen konkret definieren, was er jetzt wie detektieren will.

Er würde lieber die aktuelle Temperatur als Langzeitwert (gleitend oder arithmetisch !?) permanent wegspeichern und dann eine "kurzfristige" Temperaturerhöhung von Delta-T >= x Kelvin als Schwellwert melden

Hört sich für mich ein bisschen nach Gradientenüberwachung an...


Ob eine Lagertemperatur sich jetzt im Fehlerfall wirklich "schlagartig" erhöht oder nicht doch eher eine schleichende aber stetige Erhöhung über einen längeren Zeitraum (Wochen) passiert, muss der Mechaniker entscheiden.

Wenn das Teil regelmässig für längere Zeit abgeschaltet wird, macht vielleicht ne Gradientenüberwachung Sinn. Wenn das Teil 10 Jahre ununterbrochen durchläuft, eher weniger...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein Kunde hatte zuletzt angemerkt das wir in unserer Gleitring-Temperaturüberwachungen nur feste Grenzen als Warn- und Alarmschwellwerte verwenden.
Er würde lieber die aktuelle Temperatur als Langzeitwert (gleitend oder arithmetisch !?) permanent wegspeichern und dann eine "kurzfristige" Temperaturerhöhung von Delta-T >= x Kelvin als Schwellwert melden.
Also ein Klassiker :D
Dauerläufer mit konstanter Last oder eine dynamische Anwendung?
Bei beiden Anwendungen müsstest du dir überlegen wie du die Temperaturänderung bei Starts oder Lastwechseln oder Umgebungstemperatur ausblenden kannst.
Hört sich für mich ein bisschen nach Gradientenüberwachung an...
Sehe ich ähnlich...

Möglicherweise würde es sich anbieten die Temperatur an sich mit einer "hohen" Abtastrate (Minütlich?) in einem Fifo zu speichern, bei Vollaufen des Fifos aus den gesammelten Daten den Mittelwert und die Regressionsgerade/Differenzquotient zu bilden.
Für die Historie könntest du die Daten des Bewertungsabschnitts in einem zweiten Fifo speichern.
Dieses "blockweise" arbeiten reduziert die Masse an einzelnen Datenpunkten
=> nicht unwichtig bei solchen mathematisch recht aufwändigen Funktionen die Performance im Blick zu halten.

Bausteine dafür findest du in der bereits erwähnten LGF-Bibliothek.
Dort findest du auch Templates für Enable- und Execute-Bausteine, die dürften zur Umsetzung des Gesamtkonstrukts ebenfalls einen Blick wert sein.

Die Funktion mit einem FiFo selber zu schreiben wäre nicht das Problem ...nur aufwendig, danke.
LGF-Bibliothek, Baustein "LGF_FIFO".
Den müsstest du ggf. noch auf remanent umbauen + der Baustein verwendet aus Performancegründen Umlaufzeiger
=> Bei der Reihenfolge der Daten im Puffer berücksichtigen.

a) einen Ringpuffer zum Einlesen der Messwerte während einer parametrierbaren Zeitdauer
Das wäre durchaus nicht unüblich.
Wobei ich bei so etwas eher über einen Weckalarm-OB nachdenken würde.
=> du hast es aus dem zyklischen Programm raus & immer eine stabile Abtastrate
b) welche Mittelwertbildung wäre hier praktisch anzuwenden
Kommt auf die Menge der Datenpunkte, Datenformat und benötigte Genauigkeit ab.
Und natürlich wie du deinen Code umsetzt und wie viel CPU-Leistung du aufwenden willst/kannst.
c) verwendet man für den Ausreißertest erneut einen Ringspeicher mit Mittelwertbildung, damit nicht eine einzelne Fehlmessung sofort zu einer Abschaltung / Reaktion führt.
Es würde auf jeden Fall Sinn machen jeden gelesenen Datenpunkt auf Plausibilität zu prüfen um schonmal zwischen Messwert und defektem Sensor unterscheiden zu können.
=> Wertstatus z.B.
Für Lagerversagen/-fressen könntest du die Regressionslinie einer Handvoll zuletzt eingelesener Werte betrachten.
Oder schlicht eine absolute Grenze im Bezug auf den Mittelwert als "Leitplanke" überwachen.
 
Falls es dich interessiert kann ich dir mal die Vorgehensweise von einem Gradienten rechner geben.
Das kann man gut in SCL dann nachprogrammieren.
Es gibt auch gleich eine Normierung an und zeigt wie man vorgeht.

Ja würde ich erst mal so machen.Eine gleitende Mittelwertbildung.
Die muss dann mit dem Gradientenrechner zusammenpassen.

A=K*T*(E/dt)+A0

K=die Verstärkung
A0=die Solltemperatur
T=Zeitkonstante
E=Eingangsgroesse(aktuelle Temperatur)

T kann man dann berechnen.

als Vorgabe braucht man dann die Solltemperatur
der Meßbereich des Transmitters 0..125 grad
der Meßbereich der Auswertung -5 bis +5 Grad Celcius als Bsp.
Meldung bei -2 bis +3 Grad Celcius
delta t 1min
Das Ausgangssignal ist dann 0..100% und bei Solltemperatur genau 50%.
 
naja, Gradientenberechnung kann man beliegig einfach oder kompliziert machen... Ein Temperatursensor hat ja normalerweise kein großes Rauschen und auch keine Ausreisser/Aussetzer, bzw. könnte mann ja auch in der HW-Konfig schon einen Filter einrichten...

einfachste Lösung:
- sekündlich (Flanke M0.5) die aktuelle Temperatur in eine statische Variable kopieren Temperatur_alt := Temperatur_aktuell;
- sekündlich die 2 Temperaturen subtrahieren Gradient := Temperatur_aktuell - Temperatur_alt;
- Alarm bilden wenn Gradient zu groß Alarm := Gradient > 1.0;

die Einheit vom Gradienten ist bei sekündlicher Berechnung automatisch K/s

Wenn die zu erwartende Temperaturänderung eher viel kleiner ist, dann vielleicht das alles nicht sekündlich machen sondern alle 10 Sek oder alle 100 Sek...

 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vom Prinzip her hast du schon recht.Wenn du aber einen normierten baustein hast kannst du
sagen ich beziehe mich auf 50% oder was auch immer vom Messbereich.Du musst ja die Abweichung vom Sollwert nehmen den die Dichtung hat und das wäre dann eingebbar.Das ist das A0.Das mit dem Mittelwert kann man erst mal weglassen.

Wenn der Baustein diese periodendauer berechnet, müsste man ein Standarddifferennzierer nehmen können wo man normiert(0..100%)
das Signal draufgibt und die berechnete Zeitkonstante.Ich habe es aber noch nicht ausprobiert.
Der Baustein oben spuckt dann normierte Werte aus die aus physikalischen Werten berechnet werden.Wenn ich dann eben Solltemperatur 75% will gebe ich das am Baustein ein.Ich gebe dir aber recht es ist nicht ganz trivial.
 
Das dE/dT muss man wohl so wie du schreibst erzeugen.
allerdings hat man dann halt je nach Vorgabewerte unterschiedliche Zeitkonstanten.
Die wo man eben nach der Formel oben berechnet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat jemand so einen Baustein im TIA?
welchen Baustein?
Meine 3 Zeilen?:unsure:
einfachste Lösung:
- sekündlich (Flanke M0.5) die aktuelle Temperatur in eine statische Variable kopieren Temperatur_alt := Temperatur_aktuell;
- sekündlich die 2 Temperaturen subtrahieren Gradient := Temperatur_aktuell - Temperatur_alt;
- Alarm bilden wenn Gradient zu groß Alarm := Gradient > 1.0;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein.Meines Wissens gibt es einen Gradientenbaustein in TIA.

Was denn für ein Baustein? Der Gradient ist dx/dt, also diskret (x_n+1-x_n)/(t_n+1-t_n).
Wäre mir auch nei, dass es von Siemens einen fertigen Baustein zum Ermitteln eines Gradienten gibt.
(Zum Generieren einer Kennlinie mit definiertem Gradient gibts natürlich entsprechende Bausteine)

einfachste Lösung:
- sekündlich (Flanke M0.5) die aktuelle Temperatur in eine statische Variable kopieren Temperatur_alt := Temperatur_aktuell;
- sekündlich die 2 Temperaturen subtrahieren Gradient := Temperatur_aktuell - Temperatur_alt;
- Alarm bilden wenn Gradient zu groß Alarm := Gradient > 1.0;
Ich denke um weiter sinnvoll über Lösungen diskutieren zu können wäre es erst einmal wichtig zu wissen welche Dynamiken und Kennlienen erkannt werden sollen.
Bei ein paar meiner Anwendungen würde die einfachste Lösung von @ducati entweder laufend Fehlalarme schmeißen oder gar nicht auslösen.
Für einen Dauerläufer ohne nennenswerte dynamische Belastung wäre sie jedoch zweckdienlich ¯\_(ツ)_/¯

@RudiRatlos könntest du uns mal ein paar Kennlinien malen, die du erkennen möchtest + das tatsächliche Temperaturverhalten wenn alles Ok ist (Langzeittrace wenn möglich).
 
Bei ein paar meiner Anwendungen würde die einfachste Lösung von @ducati entweder laufend Fehlalarme schmeißen oder gar nicht auslösen.
Für einen Dauerläufer ohne nennenswerte dynamische Belastung wäre sie jedoch zweckdienlich
Wenn die zu erwartende Temperaturänderung eher viel kleiner ist, dann vielleicht das alles nicht sekündlich machen sondern alle 10 Sek oder alle 100 Sek...
ja, Betonung lag ja auf Einfachste, für den Gradienten. Und ich hab auch noch dazu geschrieben, den Filter für den Messwert in der HW-Konfig zu aktivieren... Die komplette Lagerüberwachung ist aber mit dem alleinigen Gradienten noch nicht fertig.

Die Realität ist meistens komplizierter als die Theorie im Büro...
 
He Jungs, Timing für den Langzeittrend ist gerade blöd gewählt, ich arbeite z. Z. Nicht auf einer Anlage...
Aber die von Euch angestoßen Verfahren sind das was ich hier anwerfen wollte.
Wenn ich aus dem Urlaub zurück bin, werde ich mal einige Durchläufe codieren und die Ergebnisse vergleichen. Ich gebe dann gerne hier auch ein Feedback.

Aber ihr habt schon recht, die Konstruktion macht es sich immer sehr einfach... "Programmier das mal und dann können wir uns wieder darüber unterhalten"
Darum erst einmal bis hierhin DANKE!
 
Zurück
Oben