Vielleicht funktioniert mein VI - vielleicht aber auch nicht. Dazu später mehr.
Im Prinzip hast du recht, LabVIEW wird die 800ms warten bevor der nächste Frame ausgeführt wird. So beschreibt es NI und so sollte es ja eigentlich auch sein. Ähm - ich zweifle manchmal, ob das auch wirklich ganz exakt so ist. In deinem Fall solltest du diesbezüglich jedoch keinerlei Bedenken haben. Es gibt in dem Zusammenhang einen anderen Punkt. GenStart braucht etwas Zeit (du weist nicht, was diese API Funktion wirklich macht und wann der Funktionsgenerator wirklich startet. Auch die anderen beiden VIs könnten das ein klein wenig verzögern. Du brauchst eine Funktion mit der du prüfen kannst, ob die Daten alle ausgegeben wurden bevor du GenStop ausführst. Ich habe die Doku nur kurz überflogen - eventuell bekommst du diese Information über GenIsControllable(). Diese, bzw. eine dafür geeignete Funktion der API, fragst du in einer while schleife zyklisch ab (mit kurzen delays dazwischen und mit einem Timeout versehen) bis die Ausgabe vollständig erfolgt ist (oder der Timeout abgelaufen ist). Dann erst führst du GenStop() aus.
Jetzt noch etwas allgemeines:
Mein GenSetData ist genauso hingeklatscht, wie deine VIs. Das kann/darf/sollte nicht so bleiben. Alle VIs und Funktionen die Geräte oder irgendwelche Schnittstellen ansprechen haben am Eingang eine Referenz (bei dir das hDevice) links oben und einen Error Cluster links unten. Am Ausgang genauso (siehe VISA, TCP/IP, DAQmx usw.). Liegt am Eingang bereits ein Fehler an, dann macht das VI nichts weiter außer den Error Cluster durchzureichen. Genauso sollten auch deine VIs funktionieren. Wenn du das konsequent so machst und auch so verwendest, dann brauchst du keine Sequenz mehr. Außerdem wird ein brauchbares Fehlerhandling benötigt. Das wird in die einzelnen VIs fest integriert. Ich habe mein VI (ohne hübsches Icon und noch etwas unvollständig) mal entsprechend angepasst, damit etwas klarer wird, was ich gerade beschrieben habe.
GenSetData.vi (Größe: 11,22 KB / Downloads: 269)
Zum Schluss eine Anmerkung zu meinem ersten Satz.
Ich weis nicht genau, was GenSetData tatsächlich macht und die Doku gibt dazu auch nicht viel her oder ich habe es nicht gelesen.
Wenn GenSetData() die Daten sofort zum Gerät überträgt dann ist alles i.O.
Wenn GenSetData() die Daten in seinen eigenen Zwischenspeicher kopiert, dann ist auch alles i.O.
Falls GenSetData() den Pointer pBuffer und damit auch die Daten dazu verwendet um sie später nach und nach in kleineren Blöcken zum Gerät zu übertragen, dann merkst du jetzt noch gar nicht, dass es so nicht funktioniert. Wenn die Funktion GenSetData() beendet ist, dann ist der Pointer (und damit die Daten) nicht mehr gültig. LabVIEW wird bei dem derzeit noch einfachen Programm die Daten nicht sofort löschen und auch nicht überschreiben. Du würdest derzeit gar nicht merken, dass es so nicht funktioniert. Bei einem umfangreicheren Programm würde dir das ganz heftig um die Ohren fliegen - und du weist nicht wo und warum und kannst es auch nicht debuggen. Sollte GenSetData() so funktionieren, was ich nicht hoffe, dann wird es etwas komplizierter mit der Übergabe der Daten. Da musst du dann die Funktionen des LabVIEW Speichermanagers nutzen. Dies wollte ich dir noch mit auf den Weg geben. Es könnte ja sein, dass sich LabVIEW irgendwann häufig aber unregelmäßig mit oder auch ohne vorherige Meldung immer wieder verabschiedet. Das muss dann zwar nicht zwangsweise an GenSetData() liegen, aber es wäre denkbar.