Beckhoff Steuerung per ADS mit 20kHz auslesen

Zuviel Werbung?
-> Hier kostenlos registrieren
Interessant, ein Input für eine Kommandozeile bzw. ein Sleep funktionieren also. Dann wird also durch das "Lockerlassen" von der ProgrammAusführung Zeit geschaffen, in der andere Aufgaben sich austoben und ggfs schneller reagieren können. Input und Sleep sind mit Sicherheit so programmiert, dass während ihrer eigentlichen HauptBeschäftigung - dem Warten - dem BetriebsSystem "idle" gemeldet wird. Eine While-Schleife hingegen, die intensiv mit NichtsTun beschäftigt ist, die aber nicht wissen kann, dass sie die Zeit völlig nutzlos verbrät, wird ihre Zeit nicht für andere Aufgaben zur Verfügung stellen und bremst damit andere Aufgaben aus.
 
Jeder Prozess oder Thread bekommt bei einem Multitasking Betriebssystem einen bestimmten Zeitschlitz zur Verfügung gestellt. Mit Sleep() nutzt du diese Zeit nicht komplett aus, sondern gibst dem Betriebssystem die Möglichkeit die restliche Zeit deiner Zeitschlitzes anderen Threads zur Verfügung zu stellen, d.h. nach Sleep kommt direkt ein anderer Prozess/Thread zur Ausführung. Unter Windows reicht dafür auch ein Sleep(0).

Wie stellst du denn die zeitliche Reihenfolge sicher, wenn über ADS die Daten so wie ich es verstanden haben erst im Server gepuffert werden? So wie ich das verstehe, kommen dann irgendwann Daten rein, aber du weist nicht von welchen Zeitpunkt die Daten sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das ist mir bewusst. Ich denke, dass das Problem wirklich war, dass der die while(true)-Schleife das System blockiert hat. Beim Eintreffen des ADS-Notification wird wahrscheinlich eine Art Interrupt ausgelöst und somit kann die Callback-Funktion schnell ausgelöst werden.
Die verschickten Daten besitzen einen Zeitstempel, wann sie aufgenommen werden. Dieser ist glaube ich auf 100 nano Sekunden genau. Außerdem werden die Daten in einer FIFO-Warteschlange gesichert, also ist die Reihenfolge von vorherein sicher.
 
Liest du die Daten über Netzwerk oder über localhost, d.h. auf dem gleichen Rechner?

Welche Python Bibliothek verwendest du denn genau? Es gibt da mehrere, ich habe mal mit adshli gearbeitet aber dort nur gepollt, adshli ist komplett in Python geschrieben. Ich vermute wichtiger ist, dass du dem Server mitteilst nicht jede Variablenänderung zu schicken sondern erst gepuffert nach einem Intervall. Falls jeder Wert wirklich zusätzlich zeitgestempelt wird, ist das schon eine nicht unerhebliche Datenmenge.
 
Ich lese über localhost, mit pyads. pyads benutzt über ctypes die TcAdsDLL. Also ich habe ausprobiert zehn verschiedene int Variablen (also 2 Byte) mit Notifications auszulesen. Das hat ohne Probleme gekappt. Ich habe aber natürlich im Callback nicht viel mit den Variablen gemacht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Über Localhost könnte es vermutlich sogar möglich sein wenn jede Änderung einzeln geschickt wird und du schnell genug abfragst, da die Latenzen vom Netzwerk und bei TCP für das ACK wegfallen. Würde mich mal interessieren ob das über eine Netzwerkverbindung im LAN mit 100 MBit/s auch noch so gut funktioniert.
 
Zurück
Oben