Beckhoff-Latenz optimieren - wie bekommt man stabil 100µs ?
Hallo,
ich arbeite zusammen mit "beta6" an dem genannten Problem, und möchte mich schon einmal für die umfangreiche Hilfe bisher bedanken!
Ich möchte zunächst noch einmal das übergeordnete Problem darstellen:
- Geplante Anwendung ist die Regelung einer Magnetführung im Rahmen eines universitären Forschungsprojektes im Maschinenbau / Fertigungstechnik bzw. die Ausbildung von Studenten Maschinenbau/Elektrotechnik/Technische Informatik.
- Im Moment versuchen wir erst einmal, ein EtherCAT-System mit einem Eingang (EL3702, A/D-Wandler) und einem Ausgang (EL4132, D/A-Wandler) zum Laufen zu bringen.
- In einer weiteren Ausbaustufe soll dann das System mind. 8 Eingänge (16bit analog), am besten zusätzlich noch 8 weitere Eingänge, also insgesamt 16 Eingänge, absolut zeitsynchron abtasten, daher brauchen wir die DC.
- Ausgegeben werden sollen dann 8 Analogausgänge, ebenfalls zeitsynchron (mit DC).
- Das ganze muss möglichst schnell gehen, daher die Bedeutung der Latenzzeit, da es sich um eine Regelung handelt. Deswegen MUSS UNBEDINGT ein zeitlicher Determinismus gewährleistet sein, d.h. es darf nicht passieren, dass eine Ausgabe mal "einen Zyklus zu spät" kommt, da dann der Regler möglicherweise instabil wird. Gleichzeitig sollte es ja theoretisch möglich sein, durch die DC den Jitter im zweistelligen ns-Bereichzu halten.
Die Regelung soll eigentlich mit 10kHz laufen, jedenfalls verspricht Beckhoff zumindest in Ihrer Werbung dass das geht ("absolut zeitsynchron mit 100µs", "Eingänge lesen und schreiben unter 100µs"). Wenn noch mehr mehr (15 kHz, 20 kHz) ginge wäre das zwar prinzipiell schön, nach meinem bisherigen Verständnis aber nicht machbar.
Ich weiß das die Hardware die 10 kHz prinzipiell hergibt (habe schon Implementationen auf nem Echtzeit-Linux gesehen), aber ich würde ungern auf Linux zurückgreifen und lieber in der Twincat/Windows-Welt bleiben
Status Quo:
Zykluszeit: 50µs, Task-Ausführungszeit: 50µs, neueste TwinCAT-Version installiert (Build 1328 ).
Wenn man nun ein Dreieckssignal in den A/D-Wandler einspeist, und das Programm eigentlich nur daraus besteht, Eingang 1 auf Ausgang 1 zu kopieren, dann hat man eine Signalverzögerung von 100µs mit relativ geringem Jitter... so weit, so gut.
Dabei kommt es aber vor, daß trotz CPU-Einstellung auf "90% für Twincat" und angeblicher Echtzeitauslastung von lediglich 25% (auf einem Core2Duo 2GHz) ab und zu "Glitches" auftauchen, sprich die Ausgabe einen Zyklus zu spät kommt. Dieses Phänomen wird deutlich häufiger, wenn man im Programm eine zweite Zeile hinzufügt und auch Eingang 2 auf Ausgang 2 kopiert. Die Echtzeit-Auslastung bleibt trotzdem bei ca. 25%. Programmiert ist das momentan über die SPS-Oberfläche in SPS-Code. Nur, wo ist da die deterministische "harte" Echtzeit? Die genannten "Glitches" dürften eigentlich nicht auftauchen. Da müssen wir noch irgendwas falsch gemacht haben...
Ein paar Fragen:
- Wann sampled der AD-Wandler, sofern keine DC benutzt werden? Direkt nach Paketeingang? Oder "gleichzeitig" zum Paketeingang? Sobald das Paket "durchfährt" müssen ja bereits Daten im Wandler liegen, und die Digitalisierung dauert ja auch ein paar µs.
- Ich nehme an, der DA_Wandler gibt das Signal aus sobald er es bekommt, wenn keine DC benutzt werden?
- Mit den DC solle es ja möglich sein, den Sampling-Zeitpunkt immer auf beispielsweise t=-10µs vor Paketeingang zu stellen, so daß das Paket aktuelle Daten zeitäquidistant einsammeln kann. Genauso sollte es ja gehen, daß der Ausgabewert der mit dem nächsten Paket übergeben wird beispielsweise auf t = t_sampling + 100µs gesetzt wird. Mit der Zykluszeit von 50µs sollte dann eine echt zeitlich-äquidistante Regelung mit t=100µs möglich sein, ganz so wie es die Werbung verspricht ?
- Ergänzend zu der Implementation in TwinCAT in der SPS wäre es ja noch denkbar, über TwinCAT R3IO oder ADS zu regeln. Hat da jemand schon einmal Erfahrung gesammelt? Im Prinzip wär das hochinteressant, da "konventionelle Programmierung" und entsprechend gut anpassbar an unseren Einsatzfall. WIe sieht das da mit den Latenzen aus? Das wass ich bisher gefunden habe besagt nur "über R3IO kann schnell auf das Prozessabbild zugegriffen werden, oder den Umweg über ADS zu gehen"... an anderer Stelle steht aber, daß dies nur über den Multimedia-Timer und damit NICHT in harter Echtzeit geht, und man die Task dann über ADS synchronisieren solle (?)
SO, das waren ne Menge Fragen & ne Menge Text, vielleicht findet sich ja jemand der zum einen oder anderen Thema was sagen kann, evtl. liest ja auch jemand von Beckhoff mit? Vielen Dank auf jeden Fall schon einmal für die Unterstützung!!!