25.09.2010, 17:36
Beitrag #1
|
Chem_e
LVF-Neueinsteiger
Beiträge: 7
Registriert seit: Sep 2010
8.5
2010
de
Deutschland
|
Liste mit events abarbeiten
Hallo zusammen,
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?
Danke!
|
|
|
25.09.2010, 18:12
Beitrag #2
|
GerdW
______________
Beiträge: 17.480
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
Liste mit events abarbeiten
Hallo Chem,
"Kann mir da jemand helfen?"
Sicherlich. Und nachdem du mal ein VI hier einstellst, sicherlich auch viel effektiver...
"Oder hat jemand eine Idee, wie man so etwas realisieren könnte?"
Ja. Ohne StackedSequence. Dafür mit Producer-Consumer-Struktur...
|
|
|
25.09.2010, 18:22
(Dieser Beitrag wurde zuletzt bearbeitet: 25.09.2010 18:58 von jg.)
Beitrag #3
|
|
|
25.09.2010, 18:47
(Dieser Beitrag wurde zuletzt bearbeitet: 25.09.2010 18:49 von GerdW.)
Beitrag #4
|
GerdW
______________
Beiträge: 17.480
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
Liste mit events abarbeiten
Hallo Chem,
wow, what a mess...
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...
|
|
|
26.09.2010, 13:08
Beitrag #5
|
Chem_e
LVF-Neueinsteiger
Beiträge: 7
Registriert seit: Sep 2010
8.5
2010
de
Deutschland
|
Liste mit events abarbeiten
Hallo Gerd!
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?
|
|
|
26.09.2010, 14:28
Beitrag #6
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Liste mit events abarbeiten
' 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).
|
|
|
26.09.2010, 20:24
Beitrag #7
|
Chem_e
LVF-Neueinsteiger
Beiträge: 7
Registriert seit: Sep 2010
8.5
2010
de
Deutschland
|
Liste mit events abarbeiten
Super....das habe ich nun verstanden.
Ich muss folgendes regeln:
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?
|
|
|
27.09.2010, 08:30
Beitrag #8
|
GerdW
______________
Beiträge: 17.480
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
Liste mit events abarbeiten
Hallo Chem,
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!
|
|
|
28.09.2010, 19:38
Beitrag #9
|
Chem_e
LVF-Neueinsteiger
Beiträge: 7
Registriert seit: Sep 2010
8.5
2010
de
Deutschland
|
Liste mit events abarbeiten
Hallo zusammen,
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?
Danke!
|
|
|
28.09.2010, 20:19
|
|
|
| |