LabVIEWForum.de - PID-Regler fühlt sich unterbeschäftigt

LabVIEWForum.de

Normale Version: PID-Regler fühlt sich unterbeschäftigt
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe ein etwas komisches Problem:
(Ich arbeite mich Labview 2011 und versuche mich zum ersten Mal mit damit)

Ich habe einen PID-Regler für eine Druck-geregelte Zufuhr gebaut. Mit diesem kann ich auch immer die gewünschten Drücke erreichen. Nur nach Erreichen des Solldruckwertes gibt mir mein Druckmessgerät (Thermovac TM 21) völlig zufällig einen Wert aus, der mein eingestellter Solldruckwert - 0,01 (ja immer 0,01) entspricht. Wenn ich auf die Anzeige des Druckmessgerätes schaue taucht dieser Wert nie auf. Und wenn ich lediglich ein Programm laufen lasse, welches den Druck misst, tritt dieser Fehler auch nicht auf.
Ein Bsp. für den Druckverlauf ist angehängt. Bei dem x-Wert ~670 habe ich auf den Sollwert 0.07 gestellt. Man sieht bei ~720 und ~750 diesen 0,01 Sprung nach unten und den darauffolgenden Versuch des PID-Reglers diesen auszugleichen.
Interessanterweise tritt dieser Fehler häufiger bei niedrigeren Sollwerten auf. Der Fakt, dass der Druck stabiler bei höheren Drücken ist, ist ansich nicht verwunderlich, da der Zufuhrregler (Pr4000B) bei höheren Werten genauer arbeitet, aber ich sehe da keinen Zusammenhang zur Häufigkeit des Auftretens eines Lesefehlers.

Beim der Suche nach einer Lösung dieses Problems ist mir ein weiteres Problem aufgefallen. Ich habe eine Bedingung eingebaut, die einfach sagt: "Wenn der Wert des Druckmessers gleich dem Solldruckwert - 0.01 ist, nehme den Wert des Solldruckwertes". Dieser einfache Vergleich funktioniert beim Labview, aus irgendeinem Grund, aber nur bei bestimmten Zahlen. Bei z.b. 0.07-0.01 behauptet Labview es wäre nicht 0.06, aber bei 0.08-0.01 ist Labview mit 0.07 einverstanden. Habe dafür die Bedingung rausgeschrieben und 2 Beispiele angehängt. (Anhänge mit "Vergleich" im Namen).

Gruß
(02.10.2013 14:23 )ESB schrieb: [ -> ]Beim der Suche nach einer Lösung dieses Problems ist mir ein weiteres Problem aufgefallen. Ich habe eine Bedingung eingebaut, die einfach sagt: "Wenn der Wert des Druckmessers gleich dem Solldruckwert - 0.01 ist, nehme den Wert des Solldruckwertes". Dieser einfache Vergleich funktioniert beim Labview, aus irgendeinem Grund, aber nur bei bestimmten Zahlen. Bei z.b. 0.07-0.01 behauptet Labview es wäre nicht 0.06, aber bei 0.08-0.01 ist Labview mit 0.07 einverstanden.
Hierfür gibt es eine einfache Erklärung: Simpel gesagt, werden Zahlen im Computer immer als Summe von 2er-Potenzen gespeichert, wodurch sich dezimale Nachkommastellen sehr oft nur näherungsweise darstellen lassen. Mit anderen Worten: 0.07 ist intern eigentlich so etwas ähnliches wie 0.0700000000014 und wird nur gerundet als 0.07 geschrieben. Wenn du exakte Vergleiche willst, solltest du mit Ganzzahlen (Integern) arbeiten, ansonsten musst du Fehlerschwellen berücksichtigen und z.B. aus dem Vergleich 0.07-0.01=0.06 ein abs(0.07-0.01-0.06)<1E-10 oder ähnliches machen.
(02.10.2013 14:39 )THL schrieb: [ -> ]Simpel gesagt, werden Zahlen im Computer immer als Summe von 2er-Potenzen gespeichert, wodurch sich dezimale Nachkommastellen sehr oft nur näherungsweise darstellen lassen. Mit anderen Worten: 0.07 ist intern eigentlich so etwas ähnliches wie 0.0700000000014 und wird nur gerundet als 0.07 geschrieben. Wenn du exakte Vergleiche willst, solltest du mit Ganzzahlen (Integern) arbeiten, ansonsten musst du Fehlerschwellen berücksichtigen und z.B. aus dem Vergleich 0.07-0.01=0.06 ein abs(0.07-0.01-0.06)<1E-10 oder ähnliches machen.

in der Palette NUMERISCH gibt es die Konstante "Maschinengenauigkeit", die dir eben diese Unschärfe ausgibt, die es bei Vergleichen zu berücksichtigen gilt.


Gruß, Marko
Gut, hat sich wirklich so einfach lösen lassen Smile

Damit kann ich zumindestens das Symptom gut bekämpfen. Vielleicht löst sich das andere Problem noch irgendwann von selbst.

Vielen Dank für die Hilfe.

Gruß
Hallo ESB,

Zitat:keinen Zusammenhang zur Häufigkeit des Auftretens eines Lesefehlers.
Du solltest dieses ständige PortOpen und PortClose unterlassen. Normalerweise reicht es vollkommen aus, serielle Schnittstellen einmal bei Programmbeginn (vor der While-Loop) zu öffnen und einmal bei Programmende (nach der Loop) zu schließen. Wenn deine Geräte TermChars benutzen, kannst du auch auf BytesAtPort verzichten. (Tipp: Es gibt hier unzählige Threads zum Thema "serielle Schnittstelle", einfach dort mal nachlesen.)

Zum PID:
Muss es wirklich eine Simulationsschleife sein? Tut es nicht der BasicPID aus dem PID-Toolkit? Oder der noch einfachere SimplePID, der früher als Beispiel bei LabVIEW dabei war und den du durch Suchen entweder hier oder bei ni.com im Forum findest?
Referenz-URLs