INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi



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!

07.12.2009, 23:11
Beitrag #1

Dr. Jones Offline
LVF-Neueinsteiger


Beiträge: 5
Registriert seit: Nov 2009

8.6
-
de

10248
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
Hallo Leute,

vielleicht habe ich nur das richtige Stichwort noch nicht gefunden, aber ich habe bis jetzt trotz langer Suche keine schöne Lösung für mein Problem gefunden:

sagen wir ich möchte im Kern zwei parallele schleifen:

Die erste stellt eine Position (Zahl) ein und wartet darauf, das diese Position erreicht ist, bevor sie einen Messwert verarbeitet.

Die zweite sendet den Positionierbefehl an einen Schrittmotorcontroller und das OK zurück an die erste Schleife.

Wie mache ich das ordentlich (ohne z.B. eine Statusvariable zu pollen)?

Die Producer-Consumer Architektur sieht keine Rückmeldungen vor. Queues scheinen mir auch nicht dafür ausgelegt. Am liebsten wäre mir so etwas wie eine Ereignisstruktur, die auf die Änderung einer Statusvariablen reagiert. Da die besagten schleifen aber innerhalb eines großen VIs mit Ereignisstruktur und State-Machine sind führt das hinzufügen weiterer Ereignisstrukturen in meinem Hauptprogramm immer zum einfrieren des FP. (Das problem ist leider nur im Hauptprogramm, ein einfaches Bespiel-VI, das ich machen wollte, zeigt diesen fehler leider nicht).

Ich hoffe jemand hat meine Frage verstanden, vielen Dank für Tipps.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.12.2009, 23:53 (Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2009 23:54 von eg.)
Beitrag #2

eg Offline
LVF-SeniorMod


Beiträge: 3.868
Registriert seit: Nov 2005

2016
2003
kA

66111
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
Das geht mit Queues, Notifiers oder User Events. Ich bevorzuge Queues in solchen Fällen (beim Notifier kann die Bestätigung verloren gehen, dann wartet man vergeblich drauf).

Gruß, eg

Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.12.2009, 07:49
Beitrag #3

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
Du kannst ja auch zwei Queues verwenden. Eine zum Reinschreiben und eine zum Auslesen.

Gruß Markus

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.12.2009, 09:27 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2009 09:31 von Lucki.)
Beitrag #4

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
' schrieb:Du kannst ja auch zwei Queues verwenden. Eine zum Reinschreiben und eine zum Auslesen.
So würde ich es auch machen. Man muß sich dann aber überlegen, wie man die beiden Schleifen miteiander synchronisiert. Bei der klassichen Erzeuger-Verbraucher-Strukur ist es in der Regel so, daß beim Verbraucher auf das Eintreffen neuer Daten gewartet wird. Dadurch synchronisiert sich die Verbraucherschlaife mit der Erzeugerschleife.
Bei Datenaustausch in beiden Richtungung hat man das Problem: Wer synchronisiert wen? Eine (von mehreren) Möglichketen wäre, daß gar nicht synchronisiert wird, jede Schleife hat hat ihren eigenen Takt. Das Timout für den Datenenempfang aus den Queues wird auf Null vorgegeben. Die Timeoutfehler werden auf beiden Seiten aufgefangen.

Das Gegenargument ist dann aber: Die Synchronisation ist gerade der Vorteil von Queues. Wenn man keine Synchronisation braucht, dann kommt man man mit lokalen Variablen zum bidirektionalen Datenaustausch billiger.

Wenn eine Schleife die andere synchonisieren soll, dann ist vielleicht am besten, 1 Queue zu verwenden und für den Rückkanal lokale Variable. Beispielweise wäre es denkbar, daß für die OK-Meldung eine lokale Variable reicht.

Meine Gedanken sind etwas ungeordnet, aber vielleicht regt es die Diskussion an. (Und konkretere Vorschläge mit VI sind in er Regel nur bei Fragen mit angehängtem VI möglich)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.12.2009, 10:51 (Dieser Beitrag wurde zuletzt bearbeitet: 09.12.2009 20:39 von jg.)
Beitrag #5

Dr. Jones Offline
LVF-Neueinsteiger


Beiträge: 5
Registriert seit: Nov 2009

8.6
-
de

10248
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
Ich habe mal ein Beispiel gebastelt, mit zwei schleifen und einem Melder. Die Variante mit der Lokalen Variable wird später nicht funktionieren, da jede schleife ein SubVi werden soll, um das Programm möglichst modular zu halten ausßedem müsste man die dann entweder pollen oder eine ereignisstruktur einführen(?).

So wie es aussieht funktioniert das so (noch)... bin für jede Anregung dakbar, ob das auch solide funktioniert...

Sonstige .zip  2schleifen_1MelderLV_8.0.zip (Größe: 13,47 KB / Downloads: 429)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.12.2009, 20:24
Beitrag #6

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.700
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
' schrieb:Die Variante mit der Lokalen Variable wird später nicht funktionieren, da jede schleife ein SubVi werden soll, um das Programm möglichst modular zu halten
Genau, so ist das Vorgehen richtig.

Zitat:ausßedem müsste man die dann entweder pollen oder eine ereignisstruktur einführen(?).
Beides würde gehen.

Zitat:So wie es aussieht funktioniert das so (noch)... bin für jede Anregung dakbar, ob das auch solide funktioniert...
Solide wird es nicht funktionieren. Früher oder später wird dieses Verfahren mit Meldern zu so nicht lösbaren Problemen führen.

Nimm statt einem Melder lieber zwei Queues.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
09.12.2009, 21:41 (Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2009 07:40 von Lucki.)
Beitrag #7

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
' schrieb:sagen wir ich möchte im Kern zwei parallele schleifen:
Die erste stellt eine Position (Zahl) ein und wartet darauf, das diese Position erreicht ist, bevor sie einen Messwert verarbeitet.
Die zweite sendet den Positionierbefehl an einen Schrittmotorcontroller und das OK zurück an die erste Schleife.
Ist schon schon ein Weile her, daß ich auch mit Motorsteuerungen etwas postioniert habe habe, uind habe mal nachgechaut, wie ich es gemacht hatte.
Hier ein Beispiel:

   

Die Grau-Gelben SubVIs gehören zu einer LabVIEW-Bibliothekt der Fima ISEL, sie gehört zu einer Motorsteuerung "LS146". Mit dem ersten Sub-VI wird die neue Position an die Steuerung übergeben, mit dem zweiten wird der Status so lange gepollt, bis die Position erreicht ist. Also alles ist ganz simpel.
Ich weiß ja nicht, ob Du zu Deinem Motor eine komfotable Steuerelektronik hast, womöglich noch mit solchen LabVIEW- Treibern. Das würde die Sache natürlich enorm erleichtern. Aber auf jeden Fall würde ich vorschlagen daß Du Dir einen Satz so ähnlicher SubVIs erstellst. Damit kannst Du dann dein Problem lösen, ohne Dich hier in der Problematik des bidirektionelen Datenaustzauschen von 2 Schleifen zu verfangen.
Habe solche Bibliotheken für 2 verschiedene Motorsteuerungen da, wenn es Dir nützt kannst Du sie haben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.12.2009, 14:16
Beitrag #8

Dr. Jones Offline
LVF-Neueinsteiger


Beiträge: 5
Registriert seit: Nov 2009

8.6
-
de

10248
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
Ja, ich habe bei bedarf auch die Isel-LV Treiber, das ist glaubce ich nicht das Problem, die wesentlichen Funtionen mit Position Senden -> Auf Position warten habe ich. Mein Problem ist, das die neuen Positionsdaten in einer anderen schleife generiert werden sollen, die z.B. eine automatische nachregelung auf das Signalmaximum eines angeschlossenen Spektrometers durchführt. Diese muss aber warten, bis die Position erreicht ist. Sinn dieses Konstrukts soll sein, dass die Motorsteuerung leicht durch eine andere ersetzen werden kann, ohne tief in mehreren SubVi diese funktion tauschen zu müssen. (die routiene die die positionen generiert muss auch austauschbar sein, wenn ich alles nur einmal bräuchte würde ich nicht versuchen mir die mühe zu machen...)

Eine Frage zu Queues/Melder: Eigentlich soll es bei meinem Programm niemals vorkommen, dass sich Meldungen aufstauen, da keine seite ohne Meldung der anderen weitermachen darf, wären dann nicht zwei melder sinnvoller als queues?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.12.2009, 14:52
Beitrag #9

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.700
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
' schrieb:Eine Frage zu Queues/Melder: Eigentlich soll es bei meinem Programm niemals vorkommen, dass sich Meldungen aufstauen, da keine seite ohne Meldung der anderen weitermachen darf, wären dann nicht zwei melder sinnvoller als queues?
Ich würde keine Melder verwenden.

Du willst doch bestimmt "eventgesteuert" arbeiten. Also sobald der "Trigger" vorhanden ist, soll was gemacht werden. Hierfür ist aber eine Queue das logischerere Mittel. Die Queue wird nämlich ausgelesen und dann ist das entsprechende Datum verschwunden aus der Queue. Um dieses Verhalten bei Meldern zu realisieren musst du zum Zeitpunkt des Aufrufens des MelderAbfragens sagen, dass die Historie ignoriert werden soll. Das Datum im Melder wird nämlich bei Auslesen nicht automatisch gelöscht. Und genau hier kommt es dann zu RaceConditions (also zu Problemen synchron-spezifischer Art) auf Melderebene.

Wenn es um Ablaufsteuerung geht, verwende ich immer eine Queue. Die zu steuernde Seite muss die Queue auslesen. Wenn es darum geht, einen Zustand allgemein bekannt zu geben, dann nehme ich Melder. Wer die Daten braucht soll sie auslesen.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.12.2009, 15:55 (Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2009 18:26 von Lucki.)
Beitrag #10

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Bidirektionaler Datenaustausch zwischen parallelen Schleifen / subVi
' schrieb:Mein Problem ist, das die neuen Positionsdaten in einer anderen schleife generiert werden sollen, die z.B. eine automatische nachregelung auf das Signalmaximum eines angeschlossenen Spektrometers durchführt. Diese muss aber warten, bis die Position erreicht ist.
So hatte ich es auch verstanden, und die einfache Löung ist doch: Für die Abfrage des Bewegungsstatus erstellt man ein SubVI, dieses wird nach der Übergabe der neuen Positionsdaten an der gleichen Stelle im Programm so lange in einer kleinen Schleife gepollt, bis sich sich der Motor nicht mehr bewegt. Mein Verständnis für das Aufbauschen dieses kleinen Problemchesn mittels paralleler Schleifen, Meldern, Queues hält sich in Grenzen.Mellow
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Datenaustausch zwischen 2 VI´s MarcoN 3 5.219 21.11.2019 18:50
Letzter Beitrag: GerdW
  Werte in SubVi entsprechen nicht Werten außerhalb des SubVi Philipp841 5 4.999 13.06.2018 15:12
Letzter Beitrag: GerdW
  Datenaustausch zwischen zwei Programmen Michael5 1 5.577 05.07.2016 20:13
Letzter Beitrag: GerdW
Question Welches "Protokoll" wählt man zum Datenaustausch zwischen mehreren PCs... PTBist 7 8.593 13.01.2014 13:11
Letzter Beitrag: Y-P
  Datenkomunikation zwischen parallelen Schleifen: Frage zu Queues JensLV 5 7.720 20.04.2012 08:18
Letzter Beitrag: JensLV
  Datenaustausch Duplex Martin82 14 14.560 13.01.2012 11:38
Letzter Beitrag: Martin82

Gehe zu: