OSCAT Forum

oscat.lib => Bestehende Module / Existing Modules => Thema gestartet von: Tom am 26. Oktober 2007, 17:52:24

Titel: PID-Regler
Beitrag von: Tom am 26. Oktober 2007, 17:52:24
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


Titel: Re: PID-Regler
Beitrag von: hugo am 26. Oktober 2007, 22:42:08
hmm werden wir die nächsten tage ansehen
Titel: Re: PID-Regler
Beitrag von: hugo am 29. Oktober 2007, 13:04:58
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.
Titel: Re: PID-Regler
Beitrag von: Tom am 30. Oktober 2007, 09:56:12
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


Titel: Re: PID-Regler
Beitrag von: hugo am 30. Oktober 2007, 18:08:45
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
Titel: Re: PID-Regler
Beitrag von: Tom am 31. Oktober 2007, 07:28:41
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.
Titel: Re: PID-Regler
Beitrag von: hugo am 31. Oktober 2007, 10:05:31
alle sagen immer die zeit ist das problem, ich sage das wollen ist das problem