LabVIEWForum.de
VI durch anderes VI fernsteuern - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: VI durch anderes VI fernsteuern (/Thread-VI-durch-anderes-VI-fernsteuern)

Seiten: 1 2


VI durch anderes VI fernsteuern - joptimus - 11.11.2015 13:09

Hi,

ich habe ein VI, mit dem ich einen linearen Antrieb steuere. Da dieses VI Teil eines größeren Programms sein soll, möchte ich es durch ein übergeordnetes VI fernsteuern. Wären die übergebenen Werte statisch, würde ich einfach ein SubVI draus machen, aber das sind sie leider nicht:
Es gibt eine Schleife, die bei verschiedenen Ereignissen (Drücken eines Buttons oder Ändern eines Eingabewerts, z.B. für die Zielposition) Befehlsstrings in den Controller des Antriebs schreibt. Die Werte können und müssen sich ändern, während das VI läuft.

Ich habe ein separates kleines Test-VI zur Fernsteuerung gemacht, das auch wunderbar funktioniert. Dazu habe ich globale Variablen und Eigenschaftsknoten mit "signaling value" verwendet.
Aber in meiner Anwendung mit dem Antrieb will es einfach nicht funktionieren.

Ich habe die drei VIs aus meinem Test angehängt (ein aufrufendes, ein empfangendes und das VI mit den Variablen).
Auch das VI des Antriebs "Linear Y.vi" (nicht ausführbar wegen fehlender SubVIs und Controller, aber zum Reinschauen sollte es reichen) und mein aufrufendes Test-VI "linearachsen_test_fernsteuerung_2" dafür.
Kann jemand vielleicht bitte drüberschauen und mir einen Tip geben? Gibt es eine noch vernünftigere Möglichkeit, sich ändernde Daten zur Laufzeit von VIs zwischen VIs zu übergeben?

Danke und Gruß
Joe

Edit:
Ich habe es nun mit Benutzerereignissen hinbekommen Big Grin
Aber nun wüsste ich noch gerne, ob man mehrere dieser Ereignisse übersichtlich registrieren kann? So wie in diesem Bild hier:
https://lavag.org/uploads/monthly_01_2011/post-11742-0-93171400-1294174491.png

Mit ist da nicht klar, wo die Eingänge herkommen. Bei mir ist es eine globale Variable. In dieser würde ich gerne mehrere Ereignisse zusammenfassen, ich weiß aber nicht wie.


RE: VI durch anderes VI fernsteuern - IchSelbst - 11.11.2015 16:19

(11.11.2015 13:09 )joptimus schrieb:  Edit:
Ich habe es nun mit Benutzerereignissen hinbekommen Big Grin
Aber nun wüsste ich noch gerne, ob man mehrere dieser Ereignisse übersichtlich registrieren kann? So wie in diesem Bild hier:
Ganz schlecht ist, die neuen Erkenntnisse in den ursprünglichen Post zu schreiben. Das ließt doch keine mehr. Lieber einen neuen Post machen ...

Nicht ganz so schlecht ist das mit den Ereignissen. Huh

Ich aber nehme zum Fernsteuern von VIs Queues - da kannst du nämlich beliebig viele Befehle hinschicken. Such mal nach "Producer/Consumer-Verfahren".

Hab ich da was von "globalen Variablen" gelesen? Ich hab den Code jetzt nicht angekuckt. Ich hoffe ich habe das nur gelesen.


RE: VI durch anderes VI fernsteuern - joptimus - 11.11.2015 16:28

(11.11.2015 16:19 )IchSelbst schrieb:  
(11.11.2015 13:09 )joptimus schrieb:  Edit:
Ich habe es nun mit Benutzerereignissen hinbekommen Big Grin
Aber nun wüsste ich noch gerne, ob man mehrere dieser Ereignisse übersichtlich registrieren kann? So wie in diesem Bild hier:
Ganz schlecht ist, die neuen Erkenntnisse in den ursprünglichen Post zu schreiben. Das ließt doch keine mehr. Lieber einen neuen Post machen ...

Nicht ganz so schlecht ist das mit den Ereignissen. Huh

Ich aber nehme zum Fernsteuern von VIs Queues - da kannst du nämlich beliebig viele Befehle hinschicken. Such mal nach "Producer/Consumer-Verfahren".

Hab ich da was von "globalen Variablen" gelesen? Ich hab den Code jetzt nicht angekuckt. Ich hoffe ich habe das nur gelesen.

Mit Queues hab ich mich noch nie beschäftigt, das dauert mir für mein aktuelles Projekt zu lange, mich da einlesen.
Ja, es ist eine globale Variable dabei, wo die User Events (mehrere) drinstehen. Ich weiß, globale Variablen sind nicht gern gesehen (warum eigentlich, wenn es nur eine ist wie in meinem Fall?).

Im Moment würde ich dennoch gerne wissen, wie ich mit Benutzerereignissen und z.B. Clustern arbeiten kann. Ich hab nämlich keinen blassen Schimmer, wie ich die Elemente hier verbinden soll:
[attachment=54590]


RE: VI durch anderes VI fernsteuern - IchSelbst - 11.11.2015 16:38

(11.11.2015 16:28 )joptimus schrieb:  Mit Queues hab ich mich noch nie beschäftigt, das dauert mir für mein aktuelles Projekt zu lange, mich da einlesen.
DAS ist dein größter Fehler! No Der führt sofort zur Disqualifizierung. Queues sind grundlegende Bestandteile ...
Das Einlesen in die Queue-Geschichte und das Verwenden der Queue geht schneller, als hier zu posten und alles mit Ereignissen machen zu wollen.

Zitat:Ja, es ist eine globale Variable dabei, wo die User Events (mehrere) drinstehen. Ich weiß, globale Variablen sind nicht gern gesehen (warum eigentlich, wenn es nur eine ist wie in meinem Fall?).
Aus einer werden zwei, aus zwei vier ... Angel_not

Zitat:Im Moment würde ich dennoch gerne wissen, wie ich mit Benutzerereignissen und z.B. Clustern arbeiten kann. Ich hab nämlich keinen blassen Schimmer, wie ich die Elemente hier verbinden soll:
Was ist denn das für eine Logik: Musst dich in Ereignisse einlesen - dann kannst du dich gleich in Queues einlesen.


RE: VI durch anderes VI fernsteuern - joptimus - 11.11.2015 16:42

(11.11.2015 16:38 )IchSelbst schrieb:  
(11.11.2015 16:28 )joptimus schrieb:  Mit Queues hab ich mich noch nie beschäftigt, das dauert mir für mein aktuelles Projekt zu lange, mich da einlesen.
DAS ist dein größter Fehler! No Der führt sofort zur Disqualifizierung. Queues sind grundlegende Bestandteile ...
Das Einlesen in die Queue-Geschichte und das Verwenden der Queue geht schneller, als hier zu posten und alles mit Ereignissen machen zu wollen.

Zitat:Ja, es ist eine globale Variable dabei, wo die User Events (mehrere) drinstehen. Ich weiß, globale Variablen sind nicht gern gesehen (warum eigentlich, wenn es nur eine ist wie in meinem Fall?).
Aus einer werden zwei, aus zwei vier ... Angel_not

Zitat:Im Moment würde ich dennoch gerne wissen, wie ich mit Benutzerereignissen und z.B. Clustern arbeiten kann. Ich hab nämlich keinen blassen Schimmer, wie ich die Elemente hier verbinden soll:
Was ist denn das für eine Logik: Musst dich in Ereignisse einlesen - dann kannst du dich gleich in Queues einlesen.

Du missverstehst mich. Das mit den Ereignissen funktioniert schon, es ist im Block Diagramm nur etwas unübersichtlich. Und ich wüsste gerne, wie ich das in Verbindung mit Clustern besser zusammenpacke.
Nicht mehr und nicht weniger. Queues kann ich mir später immer noch anschauen.


RE: VI durch anderes VI fernsteuern - jg - 11.11.2015 16:51

1) Für den Cluster unbedingt eine Typ-Def anlegen, sonst ärgerst du dich bei Erweiterungen jedes mal.

2) "Unbundle by Name"
[attachment=54591]

Gruß, Jens

EDIT: Queues sind einfacher als du denkst/befürchtest. Je eher du dich damit befasst, umso glücklicher wirst du sein... Wink


RE: VI durch anderes VI fernsteuern - joptimus - 12.11.2015 09:49

(11.11.2015 16:51 )jg schrieb:  1) Für den Cluster unbedingt eine Typ-Def anlegen, sonst ärgerst du dich bei Erweiterungen jedes mal.

2) "Unbundle by Name"


Gruß, Jens

EDIT: Queues sind einfacher als du denkst/befürchtest. Je eher du dich damit befasst, umso glücklicher wirst du sein... Wink

Hi,

danke, das sieht gut aus.
Allerdings fehlt da nicht das Schreiben in die globale Variable mit den Benutzerereignissen. Wenn ich die hier weglasse, kann ich über mein aufrufendes VI die Buttons im aufgerufenen VI nicht steuern.
Die Ereignisse werden ja in einem anderen VI erzeugt (generate user VI). So sieht das dann bei mir aus:

[attachment=54598]
[attachment=54599]
[attachment=54600]

Edit:
Ach ja:
Wenn ich das aufgerufende VI zuerst ausführe und dann erst das Caller-VI, funktioniert alles.
Andersherum aber nicht, dann haben die Buttons keinen Effekt?

Dann habe ich - weil es ja letztendlich so sein soll - das "Slave-VI" mit einer Invoke Node im Caller-VI aufgerufen. Beim allerersten Ausführen des Caller-VIs funktioniert die Fernsteuerung der LEDs, aber beim nachfolgenden Aufruf nicht?
Ich habe die drei VIs angehängt in einer Zip Datei. Was stimmt hier nicht?


RE: VI durch anderes VI fernsteuern - IchSelbst - 12.11.2015 11:25

(12.11.2015 09:49 )joptimus schrieb:  Wenn ich das aufgerufende VI zuerst ausführe und dann erst das Caller-VI, funktioniert alles.
Andersherum aber nicht, dann haben die Buttons keinen Effekt?
Grundsätzlich gilt: Du musst das VI, das die Benutzerreferenz (nicht das Benutzerereignis) erzeugt, zuerst ausführen. Nachdem die Referenz erstellt ist, kannst du sie in allen anderen VIs verwenden (eben per globaler Variablen).

Zitat:Beim allerersten Ausführen des Caller-VIs funktioniert die Fernsteuerung der LEDs, aber beim nachfolgenden Aufruf nicht?
Du brauchst die Funktion "Benutzerreferenz erzeugen" natürlich nur ein einziges mal machen. Wenn du in irgendeinem VI ständig neue Referenzen erzeugt, müsstest du die Referenzen auch ständig an alle anderen VIs verschicken (per globaler Variablen). Das würde schon funktionieren (vom Löschen der nicht mehr verwendeten Referenzen mal abgesehen). Du musst aber bedenken: Läuft dein "aufgerufenes Programm" kontinuierlich ab, oder beendet es sich im selben Raster wie das Caller-VI? Wenn es kontinuierlich läuft (wovon ich eigentlich ausgehe), dann ist dieses VI nicht in der Lage, die neue Referenz zu übernehmen. Die "alte" Referenz wird ja in der While-Schleife verwendet. Zum übernehmen der neuen Referenz müsste die While-Schleife beendet werden ...


RE: VI durch anderes VI fernsteuern - joptimus - 12.11.2015 13:57

(12.11.2015 11:25 )IchSelbst schrieb:  
(12.11.2015 09:49 )joptimus schrieb:  Wenn ich das aufgerufende VI zuerst ausführe und dann erst das Caller-VI, funktioniert alles.
Andersherum aber nicht, dann haben die Buttons keinen Effekt?
Grundsätzlich gilt: Du musst das VI, das die Benutzerreferenz (nicht das Benutzerereignis) erzeugt, zuerst ausführen. Nachdem die Referenz erstellt ist, kannst du sie in allen anderen VIs verwenden (eben per globaler Variablen).

Zitat:Beim allerersten Ausführen des Caller-VIs funktioniert die Fernsteuerung der LEDs, aber beim nachfolgenden Aufruf nicht?
Du brauchst die Funktion "Benutzerreferenz erzeugen" natürlich nur ein einziges mal machen. Wenn du in irgendeinem VI ständig neue Referenzen erzeugt, müsstest du die Referenzen auch ständig an alle anderen VIs verschicken (per globaler Variablen). Das würde schon funktionieren (vom Löschen der nicht mehr verwendeten Referenzen mal abgesehen). Du musst aber bedenken: Läuft dein "aufgerufenes Programm" kontinuierlich ab, oder beendet es sich im selben Raster wie das Caller-VI? Wenn es kontinuierlich läuft (wovon ich eigentlich ausgehe), dann ist dieses VI nicht in der Lage, die neue Referenz zu übernehmen. Die "alte" Referenz wird ja in der While-Schleife verwendet. Zum übernehmen der neuen Referenz müsste die While-Schleife beendet werden ...

Hm okay.
Mir ist nicht so ganz klar, was genau ich dann zwischen den VIs übergeben muss bzw. wie ich das Erstellen und Erzeugen eines Benutzerereignisses
(siehe hier: http://zone.ni.com/reference/de-XX/help/371361K-0113/lvhowto/creating_user_events/ )
auf meine beiden VIs verteilen muss.

P.S.
Welche Funktion meinst du mit "Benutzerreferenz erzeugen"? Die gibt es laut dem Tutorial im Link oben gar nicht bzw. heißt anders.


RE: VI durch anderes VI fernsteuern - IchSelbst - 12.11.2015 20:03

Du kannst ja mal folgendes probieren.