Autor Thema: PID-Regler  (Gelesen 9121 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Tom

  • Newbie
  • *
  • Beiträge: 40
    • Profil anzeigen
PID-Regler
« 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



Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
Re: PID-Regler
« Antwort #1 am: 26. Oktober 2007, 22:42:08 »
hmm werden wir die nächsten tage ansehen

Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
Re: PID-Regler
« Antwort #2 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.

Offline Tom

  • Newbie
  • *
  • Beiträge: 40
    • Profil anzeigen
Re: PID-Regler
« Antwort #3 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


« Letzte Änderung: 30. Oktober 2007, 10:29:48 von Tom »

Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
Re: PID-Regler
« Antwort #4 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

Offline Tom

  • Newbie
  • *
  • Beiträge: 40
    • Profil anzeigen
Re: PID-Regler
« Antwort #5 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.

Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
Re: PID-Regler
« Antwort #6 am: 31. Oktober 2007, 10:05:31 »
alle sagen immer die zeit ist das problem, ich sage das wollen ist das problem