-> Hier kostenlos registrieren
Hallo Zusammen,
da mir die Controller Library von TwinCat zu mächtig ist, wollte ich angelehnt an den PID Regler und P-T1 Strecke von OSCAT das "mal eben" abgespeckt selbst programmieren und simulieren. Scheitere aber schon an der Zeitdifferenz delta-t: Ta von Aufruf zu Aufruf.
GetSystemTime liefert mir UDINT timeLoDW und timeHiDW mit je digit 100ns. Soweit so gut. Nun möchte ich die Zeifdifferenz bilden da in PID und P-T1 verwendet.
Die Task ist auf 20ms gesetzt, die reale Zyklus-Zeit im Task Monitor wird mit Total 80..150us angezeigt. Wie kommt dieser riesen Wert unten bei TA im Screenshot zustande? Muss dazu sagen, dass das ganze in VirtualBox läuft.
PROGRAM Controller
VAR
T_PLC_100NS: GetSystemTime;
txl: UDINT;
txh: UDINT;
Ta: DWORD;
lastTa: DWORD;
END_VAR
CODE...
(*Get Systemtime*)
T_PLC_100NS();
txl:=T_PLC_100NS.timeLoDW;
txh:=T_PLC_100NS.timeHiDW;
Ta:=txl-lastTa;
hier stark vereinfacht ....
(*Regler*)
PID( u.a. VAR_INPUT Ta :dword;
e:=w-x;
esum:=esum+e;
y := KP * e + KI * DWORD_TO_REAL(Ta) * esum + KD * (e-ealt)/DWORD_TO_REAL(Ta);
ealt:=e;
);
(*Strecke*)
PT1( u.a. VAR_INPUT Ta :dword;
out := out + (y * K - out) * DWORD_TO_REAL(Ta) / TIME_TO_REAL(T) * 1.0E-6;
)
lastTa:=Ta;
Screenshot von den Werten. Die dritte Stelle von links sind Sekunden.
da mir die Controller Library von TwinCat zu mächtig ist, wollte ich angelehnt an den PID Regler und P-T1 Strecke von OSCAT das "mal eben" abgespeckt selbst programmieren und simulieren. Scheitere aber schon an der Zeitdifferenz delta-t: Ta von Aufruf zu Aufruf.
GetSystemTime liefert mir UDINT timeLoDW und timeHiDW mit je digit 100ns. Soweit so gut. Nun möchte ich die Zeifdifferenz bilden da in PID und P-T1 verwendet.
Die Task ist auf 20ms gesetzt, die reale Zyklus-Zeit im Task Monitor wird mit Total 80..150us angezeigt. Wie kommt dieser riesen Wert unten bei TA im Screenshot zustande? Muss dazu sagen, dass das ganze in VirtualBox läuft.
PROGRAM Controller
VAR
T_PLC_100NS: GetSystemTime;
txl: UDINT;
txh: UDINT;
Ta: DWORD;
lastTa: DWORD;
END_VAR
CODE...
(*Get Systemtime*)
T_PLC_100NS();
txl:=T_PLC_100NS.timeLoDW;
txh:=T_PLC_100NS.timeHiDW;
Ta:=txl-lastTa;
hier stark vereinfacht ....
(*Regler*)
PID( u.a. VAR_INPUT Ta :dword;
e:=w-x;
esum:=esum+e;
y := KP * e + KI * DWORD_TO_REAL(Ta) * esum + KD * (e-ealt)/DWORD_TO_REAL(Ta);
ealt:=e;
);
(*Strecke*)
PT1( u.a. VAR_INPUT Ta :dword;
out := out + (y * K - out) * DWORD_TO_REAL(Ta) / TIME_TO_REAL(T) * 1.0E-6;
)
lastTa:=Ta;
Screenshot von den Werten. Die dritte Stelle von links sind Sekunden.