![]() |
|
Tasks streaming - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Datenkommunikation (/Forum-Datenkommunikation) +---- Thema: Tasks streaming (/Thread-Tasks-streaming) |
Tasks streaming - Fuchs - Heute 09:15 Hallo zusammen, in letzter Zeit kommt es ab und zu vor, dass mein Programm zur Steuerung eines Prüfstandes abstürzt. Ursache hierfür scheint die Datenkommunikation mit dem cDaq-9188 bzw. DIO NI 9375 zu sein. Nach dem Abbruch ist die Kommunikation mit den Drucksensoren NI 9237 unterbrochen. Zumindest ist das die erste Fehlermeldung die mir das Programm anzeigt. Ein Neustart des 9188 ist notwendig. Ich habe für jeden einzelnen I/O Kanal einen Task im MAX angelegt. Im Hauptprogramm, welches auf Queued Messanger Handler basiert, ändere ich den Zustand nur durch ein schreiben oder lesen des Tasks. siehe "Kanal schreiben" Es fand in Vergangenheit kein Starten oder Beenden der I/O Tasks statt. Die Kanäle der Drucksensoren sind grundsätzlich anders und auch sauberer aufgebaut. Ansprechen, Konfigurieren, Kalibriertabelle einlesen.............starten........stoppen und löschen Zurück zu den I/Os! Mittlerweile weis ich auch, dass ist nicht so sauber Programmiert. Hat aber nie Probleme gegeben. "Never cange a running system" Jetzt würde ich das gerne besser machen und würde eure Meinung dazu wissen. Das ganze wird ziemlich unübersichtlich wenn ich für jeden Task ein eigenen Datenstrang anlege. Wenn ich zu Beginn über eine For-Schleife gehe kann ich jeden Task starten. Soweit ganz gut. siehe "Tasks starten" Wenn ich jetzt einen Kanal schreiben möchte, muss ich ihn aus dem Array entfernen und ändern. Frage: Muss ich ihn dann auch wieder in das Array zurückführen? Da ich mehrerer Queues habe (mehrere NVS) ist das beenden der Tasks auch wieder so ne Sache. Frage: Würde es reichen, alle Tasks beim Beenden in einer Nachrichtenverarbeitungsschleife zu beenden? Grüße Fuchs RE: Tasks streaming - Achim - Heute 09:31 Hi...ich mache immer einen Task pro Richtung...z.B. 1x DI, 1x DO, 1x AI Und in jedem dieser Tasks werden n Kanäle definiert. Der Task wird 1x gestartet und 1x beendet....halt immer dann wenn er gebraucht wird. Die Tasks laufen asynchron neben dem eigentlichen Programmablauf, und die Werte hole und sende ich über Queues. Gruß A. RE: Tasks streaming - Fuchs - Heute 11:32 Hallo Achim, starten und beenden wenn benötigt ist doch für Dinge die bei jeder Interation abgefragt werden auch nicht im Sinne des Erfinders, oder? Für Aktionen die nur zu bestimmten Zeiten oder durch eine andere Aktion ausgelöst werden evtl. ok. Wie separierst du den entsprechenden Kanal in der Queue? Wird der Datenstrang im Ablauf unterbrochen? Klar werden die Kanäle in den Speicher geladen und man kann sie einfach aufrufen. Das ist ja das was ich Programmiert habe. Ich würde gerne wissen ob das eine "Geht schon so - Lösung" ist oder ist es besser den Datenstrang nicht zu unterbrechen. VG Fuchs RE: Tasks streaming - Achim - Heute 15:04 (Heute 11:32 )Fuchs schrieb: starten und beenden wenn benötigt ist doch für Dinge die bei jeder Interation abgefragt werden auch nicht im Sinne des Erfinders, oder?Ich habe nichts über die Häufigkeit gesagt! Wenn benötigt, bleiben sie "an" (Heute 11:32 )Fuchs schrieb: Wie separierst du den entsprechenden Kanal in der Queue? Wird der Datenstrang im Ablauf unterbrochen?Mehrere Kanäle sind ein Array of Waveforms. RE: Tasks streaming - GerdW - Heute 15:40 Hallo Fuchs, Zitat:Wie separierst du den entsprechenden Kanal in der Queue? Wird der Datenstrang im Ablauf unterbrochen?Bleiben wir beim Beispiel der DO-Channels: - Du hast einen DO-Task, der alle Channels beinhaltet. - Du hast einen QMH, der sich um diesen Task kümmert. - Du schickst dem QMH eine Message, in der du den Wert eines Channels angibst. - Der QMH hat eine Tabelle, mit der er den Channel-Namen in eine Channel-Nummer umsetzt und das entsprechende Bit im DO-Task aktualisiert. - Der QMH hält intern den aktuellen Zustand aller DOs. Das gleiche Prinzip kannst du für alle anderen Tasks anwenden… (Jedenfalls solltest du weniger FGVs, locals, etc. einsetzen.) |