Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
um mehrere Instrumente per VISA zu steuern, habe ich ein LabView Programm geschrieben. In einer Timed loop sind alle Instrumente angesteuert, so dass man Sollwerte vorgeben und Meßwerte auslesen kann. Das fdunktioniert auch so weit.
Nun habe ich eine Liste erstellt, bei der die Sollwerte nach einer gewissen Zeit geändert werden. In einer stacked sequence lese ich die Sollwerte aus einer Tebelle aus und übergebe sie an die entsprechenden VIs in der timed loop. Leider geht das überhaupt nicht.
Kann mir da jemand helfen? Oder hat jemand eine Idee, wie man so etwas realisieren könnte?
Dein Problem könnte mit der Unmenge lokaler Variablen zusammenhängen. Leider ist mein Laptop-Bildschirm eher klein, und ich habe keine Lust ständig zu scrollen...
-Warum liest du aus lokalen Variable und schreibst den Wert direkt wieder in's Terminal zurück? Und dies für diverse Terminals? Warum nutzt du dann keine Controls statt Indicators? So kann die Datenübergabe per zweiter lokaler Variable gar nicht funktionieren - du hast dir nur eine RaceCondition geschaffen...
-Wieso arbeitest du mit lauter Einzelwerten? Dein VI wäre viel übersichtlicher, wenn du Arrays verwenden würdest (z.B. SP1-SP8 und MFC1-8 in jeweils ein Array)!
-Die Werte aus der Tabelle könnte man auch wesentlich übersichtlicher wandeln: erste Zeile indizieren, komplette Zeile nach Zahl wandeln, ein IndexArray, um die Einzelwerte zu erhalten...
-Wieso packst du Werte in ein Cluster, wandelst den Cluster nach Array, SubVI, Array nach Cluster wandeln, Cluster entbündeln? Warum nicht einfach BuildArray vor dem subVI und danach ein IndexArray? (Wenn du schon mit Arrays [s.o.] arbeiten würdest, könntest du dir hier viel Arbeit sparen...)
-Wozu die TimedWhileLoop, wenn sie nach genau einem Durchlauf wieder beendet wird? Schleife entfernen, eine Wartefunktion in die übergeordnete While-Loop packen...
Vielen Dank für deine Antwort! Ich habe deine Tipps umgesetzt (while-Schleife weg....Clusters...Controls statt indicators...)..... aber es geht immer noch nicht.
Und...ja, dass es eine mess ist gebe ich gerne zu.
Was ist eigentlich eine race-condition, die du erwähnt hast?
Oder die producer-consumer-Struktur?
Wie gesagt, die time-Schleife funktioniert und liest auch alle Werte aus, wenn ich die case-Struktur komplett weglasse. Aber wie könnte ich denn noch Werte in einer Tabelle vorgeben, die dann nach einer definierten Zeit innerhalb der time-Schleife übernommen werden?
' schrieb:Was ist eigentlich eine race-condition, die du erwähnt hast?
Frei definiert: Race Condition bedeutet, dass du keinen festen Ablauf deiner SubVIs programmiert hast, der dazu führen kann, dass dein Code fehlerhaft ausgeführt wird. D.h. es kann vorkommen, dass bei dir ein SubVI vor einem anderen ausgeführt wird oder dass du Werte zu früh in Variablen einliest. Was nicht der Fall sein darf, da sonst irgend etwas schief geht. D.h. du kannst - je nach Situation - z.B. den Anschluss des Error-Clusters verwenden, um eine definierte Ablaufreihenfolge zu bestimmen.
Oft treten Race-Condition dann auf, wenn irgendetwas parallel programmiert ist, was nicht parallel ausgeführt werden darf. Oder bei der Verwendung lokaler/globaler Variablen. Diese werden z.B. eingelesen und haben so einen altern Wert statt einen neuen. Wikipedia erklärt das Ganze ausführlicher.
' schrieb:Oder die producer-consumer-Struktur?
Die zu dt. Erzeuger-Verbraucher-Struktur besteht aus 2 parallelen Schleifen, die über Queues miteinander kommunizieren (in LabVIEW gibt es dafür eine Vorlage).
Beispiel: Es gibt eine Ereignisstruktur. Der dort auszuführende Code braucht recht lange und in der Zeit wäre die Oberfläche nicht benutzbar, da nicht auf neue Ereignisse reagiert werden kann.
Sauber programmiert geht das mit der angesprochenen Producer-Consumer-Struktur.
Die Erzeuger-Schleife enthält eine Ereignisstruktur und reagiert auf Benutzereingaben. Diese werden per Queues an die Verbraucherschleife weitergeleitet, die den eigentlichen Code ausführt. Da beide Schleifen parallel ablaufen, bekommt die Erzeuger-Schleife die Benutzeraingaben auch dann (für den Anwender sichtbar) mit, wenn die Verbraucher-Schleife noch arbeitet.
Näheres findest du z.B. auf ni.com (englisch).
8 Massenflussregler, 4 Ventile und 2 Temperaturkontroller müssen geregelt werden.
Die Meßwerte sollen alle 10 Sekunden in eine Datei gespeichert werden.
Und zusätzlich werden die Sollwerte in einer Tabelle vorgegeben, die dann zu einer definierten Zeit an die Geräte gesendet werden sollen.
Wie würden Sie das mit einer Ihrer beschriebenen Strukturen umsetzen?
wie wir das umsetzen würden, haben wir schon gesagt... Du erwartest doch wohl nicht, dass wir deine Haus-/Projektarbeit übernehmen?
Auf Arbeit habe ich einen FullHD-Monitor - trotzdem ist dein VI mehrere Bildschirme groß. Das Aufräumen kannst du gefälligst selbst übernehmen. Alles, was nicht in deiner Steuersequenz liegt, kommt übrigens ohne lokale Variablen aus - einfach mal ein paar Drähte ziehen! Dann LV-typische Funktionen verwenden (keine großen Case-Strukturen, wo auch einfache Select-Funktionen ausreichen...) Dann haben wir dich schon auf die Examples und Templates hingewiesen, selber reinarbeiten schadet da auch nicht...
Wenn du all das umgesetzt hast, bin ich gern bereit, mal wieder in dein VI reinzuschauen!
ich will keinesfalls, dass jemand hier meine Arbeit macht. Auch handelt es sich hier nicht um eine Hausarbeit, sondern um eine reale Steuerung meiner Forschungsanlage.
Ich habe alle Tipps von Gerd_W zwecks übersichtlicher machen, Variablen ändern....umgesetzt. Jedoch funktioniert das immer noch nicht.
Daher wäre meine Frage, wie ich so eine Producer/Consumer-Struktur am besten angehe....also die 2 Schleifen mit Daten-Queue habe ich schon....aber in welche Schleife muss ich die Sollwert-Tabelle, in welche die Steuer-VIs umsetzen?
Wenn ich dich richtig verstanden habe geht es um folgendes. Die versuchst mit P/C-Design deine Prozesssteuerung möglichst autonom und von allen Benutzeraktionen ungelöst laufen zu lassen. Die Steuerung benötigt aber Parameter, die du über die Zeit kontinuierlich nach irgendeinem Muster ändern bzw. anpassen musst. Diese neuen Parameter müssen somit der Prozesssteuerung mitgeteilt werden? Das heißt du produzierst Daten, welche mittels Queue dem Verbraucher übergeben werden. Konkret auf deinen Fall. Deine Steuer-VIs laufen relativ ungeachtet vor sich hin und bilden die Verbraucher. Der Produzent der Daten kann entwender ein Benutzer sein oder irgend ein anderer parallel laufender Prozess, der beispielsweise irgend ein Gerät ausliest, über eine Formel die neuen Sollwerte berechnet und anschließend diese in die Queue stopft. Die Verbraucher warten nun ständig auf neue Werte in der Queue und sollte einer getunnelt kommen wird deine Prozesssteuerung mit diesen neuen Parametern in Gang gesetzt. Richtig?