TIA TIA PID-Regler in SCL

bossboss

Level-2
Beiträge
7
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte immer viel mit Regeltechnik in der SPS zu tun und war einfach nie zufrieden mit den Siemens Bausteine. Ich brauche PI-Regler für Drucksteuerung und PID für Temperaturreglungen. Hier ein paar Punkte die mich störten:


  • Unterschiedliche Bausteine unter verschidenen CPUs (z.B.: 300 zu 1200)
  • Nicht simulierbar
  • Nicht einsehbar und notfalls änderbar
  • Viel zu kompliziert mit hoher einarbeitung
  • Keine Portierbarkeit nach Codesys
  • Zu hohe Integration in TIA
  • Viel Basteln und testen bis endlich etwas funktionierte
  • Zyklische OBs und Globale DB waren zwingend nötig

Nach längerem Suchen habe ich keine Alternative gefunden. Aber in OSCAT eine Inspiration, da es eigentlich ziemlich simpel ist, habe ich die Funktionen neu geschrieben. Jetzt habe ich alles schon länger im produktiven Einsatz und wollte mal schauen was Ihr dazu meint. Hier ist der Quellcode:

https://pastebin.com/dTr1rPu8

Code:
// Beispiel PI-Regler
#Reglerantwort_Proportional := #ir_ProportionalVerstärkung * (#ir_Sollwert - #ir_Istwert);
#Reglerantwort_Integral += #ir_IntegralVerstärkung * (#ir_Sollwert - #ir_Istwert) * #VergangeneZeit;
#or_Reglerantwort := #Reglerantwort_Proportional + #Reglerantwort_Integral;
 
ich fand den Ansatz den Atmel für die µC mal gemacht hat interessant - ist halt ein PID:
https://homepages.uni-regensburg.de/~erc24492/PID-Regler/AVR221/IAR/doxygen/pid_8c.html
das lässt sich durchaus auch in eine SPS portieren :-)



  • Für was "#VergangeneZeit" - muss man einen Regler nicht ohnehin in äquidistanten Zeitintervallen aufrufen
    Da weiß man dann zum Konfigurationszeitpunkt sein Zeitintervall und übergibt es noch als paramter - Aufruf per Zeit Interrupt OB.
  • Ich würde bei beiden entweder die Differenz oder Soll & Ist wert übergeben - nicht einmal so und einmal so
  • Bei max I-Anteil würde ich den auch so in die Statische schreiben ohne die Rechnung die gemacht wird
  • Den Version's String würde ich in die Baustein Eigenschaften packen - dort wo momentan 0.1 steht :-)
  • Ich würde ach beide Bausteine vereinen zu einem - kleinere Call Struktur, geringer Schachtelungstiefe

Das war was ich auf die schnelle gesehen habe, aber Programmieren ist auch Geschmacks Sache - es gibt bestimmt noch andere Meinungen und Ansichten :-)
 
Zuletzt bearbeitet:
RedCali:
  • Nein, man muss den Regler nicht mit fester Zeit aufrufen. Er stellt die vergangene Zeit seit dem letzten Aufruf selbst fest. So kann der Regler in irgend welchen Pumpen FBs verschwinden und muss nicht Global behandelt werden. Ist möglich dank Bibliothek-Konformität. So fummeln mir dann auch nicht die Elektriker dran rum.
  • Sollwert, Istwert oder Diferenz. Das sind interne Daten. Von aussen werden nur Soll und Ist Übergeben.
  • Das mit dem I-Anteil ist nicht fest begrenzt. Die dynamische Anti Wind-Up Methode beachtet auch den Proportional-Wert.
  • Das mit den Strings kann man machen. Der Regler funktioniert und das war mir erstmal wichtig.
  • Der PID Regler ruft halt den PI Regler auf. Da ich zur Pumpenregler nur den PI Regler brauche, spar ich mir den Rest. Und muss so nur einmal den Code warten.

Dagobert:

  • Ist doch egal wie der Faktor heist. Je höher er ist, desto höher fällt die Integral-Regel-Antwort aus.
  • Code:
    #Reglerantwort_Integral += #ir_IntegralVerstärkung * (#ir_Sollwert - #ir_Istwert) * #VergangeneZeit

Wie gesagt habe ich mich von der OSCAT Bibliothek inspirieren lassen. Einfach in Google eingeben. Dank der Bibliothek habe ich viel gelernt. Da sind viele gute Ideen drinnen. Um ein portieren zu erschweren hat Siemens viel Energie eingesetzt um den IEC 61131-3 Standard zu verwässern, deshalb ist die Portierung nicht so einfach. Es existiert aber ein halb fertigen Port nach TIA.
 
Thomas: Für dich gibt es ja die fertigen Regler von Siemens. Nur da kannst du nicht rein schauen und auch nichts ändern.

Meine Intention war nicht jeden glücklich zu machen, sondern etwas zurück zugeben. Ich habe dank offener Libs (OSCAT) viel gelernt und es währe nicht richtig, wenn ich jetzt für immer auf meinen Sourcen sitzen bleibe. Jeder darf mit meinem Regler machen was er will, oder auch nicht. Fall jemand Fehler findet oder es irgend wie noch besser hin bekommt, nur zu.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte dasselbe Problem am Anfang. In Step7 habe ich immer direkt die Werte im Instanzbaustein überschrieben. Nun habe ich einfach einen DB dazwischen damit ich die Werte einfach ändern kann.

Code:
Instance_Temp1(COM_RST := TemperatureDB.circuit[1].restart,
           LMNR_HS := TemperatureDB.pid[1].output_UL,
           LMNR_LS := TemperatureDB.pid[1].output_LL, 
           LMNS_ON := TemperatureDB.circuit[1].manual,
           PVPER_ON := TemperatureDB.pid[1].mode_act_value,
           SP_INT := TemperatureDB.circuit[1].spec_temp_r,
           PV_IN := TemperatureDB.circuit[1].act_temp_r);

In etwa so sieht ein Aufruf bei mir aus. Die Werte im DB können einfach über ein HMI verändert werden ohne das der PID mühsam mit TIA übertragen werden muss.
 
Für was "#VergangeneZeit" - muss man einen Regler nicht ohnehin in äquidistanten Zeitintervallen aufrufen
Natürlich, wenn man die "#VergangeneZeit" als Kostante eingeplant hat, statt sie als Variable zu behandeln.
Es macht sicherlich keinen Sinn, die "#VergangeneZeit" in einem grossen WerteBereich zu verändern.
Aber macht es Sinn, sie auf einen konstanten Wert festzunageln, den man dann auch mit aller Gewalt exakt einhalten muss, um brauchbare Ergebnisse zu erhalten?

Ich würde auch beide Bausteine vereinen zu einem - kleinere Call Struktur, geringer Schachtelungstiefe
Ich finde es durchaus sinnvoll, nicht um jeden Preis eine eierlegende Wollmilchsau programmieren zu wollen, mit der man alle Eventualitäten erschlagen kann.
Aber, angewendet auf PI- vs. PID-Regler, sehe ich das gaaanz anders.
PI-Regler gehören in die Tonne getreten. Die braucht keiner, denn sie machen genau die Probleme, die man sich durch das Weglassen des D-Anteils überhaupt erst schafft.
Wer trotzdem der Überzeugung ist, er brauche einen PI-Regler, der möge (auf eigene Gefahr ;o) den PID-Regler so parametrieren, dass ihm der D-Anteil nicht aus der Patsche helfen kann.

Gruss, Heinileini
 
Da der Regler keine Verbindung nach aussen braucht, kann er tief in andere Bausteine gesteckt werden. Geht aber nur wenn die vergangene Zeit auf gültigkeit geprüft wird.
Code:
#VergangeneZeit := LREAL_TO_REAL(RUNTIME(#StaticZyklusZeit_Aux));
IF #VergangeneZeit > 0 AND #VergangeneZeit < 0.1 THEN
Auf 300er kann eventuell mit "SFC64"(TIMETICK) gearbeitet werden.

Ich verwende PI-Regler für Pumpen. Da ist eine gemütliche Reglung genau richtig. Ein Schwingen der Regelung könnte grossen Schaden verursachen. Ich verwende Pumpen von 1 bis 8 kW und für Wasser 0-10bar und 0-50bar für Leichtlauföl.

Der PI-Regler arbeitet frei laufend und benutzt zur Berechnung des Integrators die Trapezregel für höchste Genauigkeit und optimale Geschwindigkeit.
Eine verfeinerte Anti Wind-Up Maßnahme benutzt ein Verfahren das den Ausgangswert des Integrators auf einen Wert begrenzt der zusammen mit den anderen Regelanteilen exakt zu dem Ausgangslimit führt. Dieses Verfahren hat den Vorteil das bei Eintritt in den Arbeitsbereich der Regler ohne Zeitverzug sofort Einsatzfähig ist und reagieren kann.
 
Zuletzt bearbeitet:
Zurück
Oben