PID-Regler

Begonnen von Tom, 26. Oktober 2007, 17:52:24

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 5 Gäste betrachten dieses Thema.

Tom

Hallo,

ich schon wieder. Der PID-Regler lässt bei mir die PLC auf stop gehen, Fehlermeldung "Division durch 0!". Das Problem scheint im "FT-deriv" zu liegen. Beim ersten Aufruf wird last=tx gesetzt, in der Formel

    out := (in - old) / DWORD_TO_REAL(tx - last) * 1000000.0 * K;

ensteht dann durch tx-last eine  Division durch 0. Eventuell mit

    IF run AND NOT init THEN

die Berechnung beim ersten Aufruf nicht durchführen?


Gruß,

Tom



hugo

hmm werden wir die nächsten tage ansehen

hugo

und schon wieder hast du recht.
das problem tritt auch dann auf wenn ein system zykluszeiten < 1ms hat.
es wird selbstverständlich in rev 2.3 korrigiert sein.

Tom

#3
Zitat von: hugo in 29. Oktober 2007, 13:04:58
das problem tritt auch dann auf wenn ein system zykluszeiten < 1ms hat.

Wegen T_PLC_US, da ja im Prinzip 1ms die kleinste Auflösung ist,oder?

Da ist noch etwas: Hab mal bissel mit dem Regler rumgespielt. Ich brauche ein Ausgangssignal mit unterem Limit von 0. Feine Sache, dachte ich, nimmste limit_L, dann brauchste keine externe Beschaltung. Funktioniert leider nicht, da dann bei einem Istwert außerhalb von int_band der Ausgang generell auf 0 geht. Das Problem ist, dass der Integrator korrekt auf 0 gesetzt ist, die Zusammenrechnung der PID-Teile in der ELSE-Verzweigung dadurch aber nicht mehr bearbeitet wird (integ.Out = limit_L).

IF integ.Out >= (limit_H - Offset) / KP THEN
      Y := limit_H;
      overflow := TRUE;
   ELSIF integ.Out <= (limit_L - offset) / KP THEN
      Y := limit_L;
      overflow := TRUE;

   ELSE
      Y := KP * (integ.Out + deriv.out + diff) + offset;
      overflow := FALSE;
   END_IF;


Vielleicht sollte bei IF und ENDIF auch noch int_band abgefragt werden.


Und dann wäre noch persönlicher Wunsch. Betrifft den Baustein "blind_control": Der "blind_actuator" wird ja nicht mehr gebraucht, da vom "blind_control" direkt aufgerufen. Das Problem ist, dass ich die Lockout-Zeit nicht mehr verändern kann. Meine Antriebe sind mit 500ms angegeben. Wäre nicht schlecht, wenn man den Wert im "blind_control" ändern könnte.




Gruß

Tom



hugo

das mit dem pid regler muss ich mir in aller ruhe ansehen.

der blind control wird die setup variable t_lockout natürlich bekommen.
das mit dem div0 im pid haben wir schon behoben

Tom

Zitat von: hugo in 30. Oktober 2007, 18:08:45
das mit dem pid regler muss ich mir in aller ruhe ansehen.

Nur keine Hektik. Ich frag mich sowieso, wo du die Zeit für so ein Projekt hernimmst.

hugo

alle sagen immer die zeit ist das problem, ich sage das wollen ist das problem