Im Großen und Ganzen mach ich das auch immer so: Alles, was es gibt - AI, CAN, Temp, DigiIn etc. etc. - läuft in einer eigenen Task ("parallele While-Schleife"). Gesteuert wird jede Task über eine Queue. Daten zwischen Tasks (und MainLoop) werden per Melder und/oder Queues ausgetauscht
' schrieb:Ich weiss nicht so recht wie ich ein gutes Timing fuer mein AI-Loop machen kann. Bzw. brauch ich das ueberhaupt?
Jede Loop läuft mit (z.B.) 50ms. Dass die Sample-Rate 10kHz beträgt, ist was anderes. Die AI-Task hat einen internen Puffer, der für mindestens 100ms reicht. Da er alle 50ms ausgelesen wird, ist 100% Reserve da.
Zitat:Ich wuerde die Messkarte auf kontinuierlich samplen mit 10kHz stellen und dann in meinem AI-Loop abhaenig von meiner gewuenschten Schreibfrequenz immer z.B. 100 Messwerte aus dem Puffer erfassen und verarbeiten. Sprich mitteln und in die Datei schreiben. Waere das OK oder hat das irgendwelche gravierenden Nachteile bzw. uebersehe ich hier was?
Auch diese Methode ist prinzipiell geeignet. Nachteile fallen mir auf die Schnelle keine ein.
Zitat:Die naechste Frage ist, wie schnell kann ich das CAN-Loop laufen lassen.
Ich hab die Channel-API von NI verwendet.
Kannst du auch zwei Loops machen? Eine zum Senden und eine zum Lesen? Lesen geht fast wie AI: Can-Read kennt einen Lesepuffer. Senden ist auch einfach: Einfach einen Datensatz schreiben. Raster geht bis 1ms.
Zitat:Ein Notifier wuerde ja immer haengen und warten bis die Daten da sind. Dabei laueft der Puffer ja sofort ueber. Deshalb muesste man ein Timeout fuer 'Wait on Notification setzen'. Aber wie lang macht man das? 1 ms? 5 ms? Eine lokale Variable scheint mir deshalb besser geeignet, da ich ja nur an einer Stelle (im CAN-Loop) in sie schreibe.
Nein, nimm keine Lokale Variable sondern einen Melder.
Ein Melder ist ja wie eine Lokale Variable. An einer Stelle wird er beschrieben, an allen anderen gelesen. Du kannst einen Melder kontinuierlich auslesen - wie eine lokale Variable.
Zitat:Ich moechte, dass diese Berechnung nur dann stattfindet, wenn der User auch wirklich etwas an den Controls geaendert hat.
Meine Loesung bisher fuer so etwas, war jeden Controlwert mit einem Shiftregister durchzuschleifen (oder halt einen Cluster) und fuer jeden Wert zu ueberpruefen ob sich etwas zum Wert zuvor geaendert hat (und dann eben fuer jeden Wert eine Case-Strukture). Das ist sehr unuebersichtlich und gefaellt mir nicht. Gibts da bessere Methoden?
Event-Struktur !