LabVIEWForum.de - Sub VIs synchron?

LabVIEWForum.de

Normale Version: Sub VIs synchron?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe folgendes Problem und hoffe jemand kann mir helfen:

Ich habe eine Anlage mit einem DC-Motor (AO Board#1), zwei Winkelmessern und einem DMS (AI Board #2). Die Boards sind leider nicht von NI, daher sind keine Express VIs verfügbar. Ist aber soweit auch kein Problem gewesen, da es von der Firma (Measurement Computing) VIs gibt, die die Boards steuern können.
Ich soll nun den Motor um bestimmte Winkel drehen (oberer Winkelmesser entscheidend zum Auslesen) und alle Daten in einem Global VI speichern. Ich habe daher mehrere Sub VIs gemacht, die für die Steuerung, Datenlesung, Speicherung, etc. zuständig sind. Wenn ich allerdings probiere die Lesung synchron zur Steuerung zu machen, stoße ich immer auf Probleme. Zuerst bewegt sich gar nichts, dann dreht sich der Motor bis zum Anschlag. Geht es nicht, das man mehrere Sub Vis gleichzeitig laufen lässt und die Daten sobald sie erfasst worden sind zu den anderen VIs weitergegeben werden? Oder läuft erst das VI solange durch, bis keine Daten mehr erfasst werden und gibt den kompletten Block weiter?

Danke für eure Antworten, ich hoffe, ich stell mich nicht zu blöd an und es ist klar was ich meine.

Björn
' schrieb:Geht es nicht, das man mehrere Sub Vis gleichzeitig laufen lässt
Doch das geht schon. Man muss es aber entsprechend richtig programmieren. Die SubVIs müssen hierzu prinzipiell parallel laufen, d.h. also ohne "Datenfluß-Verbindung". (Möglicherweise sind weitere Dinge zu beachten.)

Zitat:und die Daten sobald sie erfasst worden sind zu den anderen VIs weitergegeben werden?
Auch das ist selbstverständlich möglich - z.B. mit Queues, Melder, Benutzerereignissen etc.

Kannst du mal einen Sourcecode posten (VI oder Bild), aus dem das hervor geht, von dem du glaubst, dass es nicht funktioniert?
Ich hoffe ich habe das richtig verstanden:
Du hast mehrer sub vis die von einem globalen aus synchron laufen sollen?
Hast du es schon mal mit einer globalen variablen probiert?
Oder mit einer referenz zu synchronisieren?
Da es ja ein projekt ist sollte eigentlich eine referenzierte variable funktionieren.
Bitte entschuldige die hingeworfenen Ausdrücke, ich schreibe aus der erinnerung des LVB2 Kurses.
mfg
hannes
' schrieb:Ich hoffe ich habe das richtig verstanden:
Du hast mehrer sub vis die von einem globalen aus synchron laufen sollen?
Hast du es schon mal mit einer globalen variablen probiert?
Oder mit einer referenz zu synchronisieren?
Da es ja ein projekt ist sollte eigentlich eine referenzierte variable funktionieren.
Bitte entschuldige die hingeworfenen Ausdrücke, ich schreibe aus der erinnerung des LVB2 Kurses.
mfg
hannes


@altissimus: Hallo Hannes,

nein, ein Projekt habe ich bisher noch nicht erstellt.Wo ist der Vorteil? Ich habe bisher ein Hauptprogramm (Motorcontrol.vi) und drei Sub Vis. Arbitrary.vi zum Steuern, Scan.vi zum Einlesen und Trigger.vi zum Starten des Scan.vi. Ich lade die mal hoch, dann ist es vielleicht offensichtlicher. Sind bisher in LV 7.1, habe aber auch 8.2 und 8.5.

Danke für die schnelle Antwort,

Björn

@IchSelbst:
ZITAT: Die SubVIs müssen hierzu prinzipiell parallel laufen, d.h. also ohne "Datenfluß-Verbindung". (Möglicherweise sind weitere Dinge zu beachten.)

Daran liegt es, nur wie kann ich das ändern ohne alles in ein VI zu stopfen?
Ich habe synchroised time strucre starts gefunden unter strukturen /timed strucktures
das sollte das problem lösen
schau dir das beispiel an da laufen die dinge in loops genau paralell.
hannes
' schrieb:Wenn ich allerdings probiere die Lesung synchron zur Steuerung zu machen, stoße ich immer auf Probleme. Zuerst bewegt sich gar nichts, dann dreht sich der Motor bis zum Anschlag.
So wie du das beschreibst, laufen hier zwei abhängige Systeme - Steuern aufgrund von einzulesenden Daten - in einer "Datenfluß-Verbindung" ab.

Sehe ich das richtig, dass die Steuerung von der Lesung abhängig ist?

Egal wie es ist, ich würde folgendes machen: Ein SubVI, das die komplette Steuerung übernimmt. Dieses SubVI enthält dann eine Statemachine. Gesteuert wird dieses SubVI von außen mittels einer Queue, über die eben entsprechende Befehle bzw. Daten zum Steuerungsablauf hereinkommen. Dieses SubVI enthält alles, was zu Steuern notwendig ist. Hinweis: Das Einlesen von Daten ist nicht zwangsläufig zum Steuern notwendig. Notwendig sind lediglich die Daten. Wo die herkommen, steht auf einem anderen Blatt. Weiterer Hinweis: Dieses SubVI hat praktisch kein Frontpanel respektive wird das nie dargestellt. Dieses SubVI läuft ständig im Hintergrund, auch wenn gerade nicht gesteuert werden soll.
Ein zweites SubVI, das prinzipiell genauso aufgebaut ist wie das erste, macht das Datenlesen. Die gelesenen Daten werden per Melder zur Verfügung gestellt. Diesen Melder kann z.B. das Steuer-SubVI lesen und damit eben den Motor steuern.

Mit deinen VIs konnte ich leider nicht viel anfangen. Wohl weilich deinen Anwendungsfall noch nicht ganz durchschaut habe.

Von globalen Variablen zum Datenaustausch zwischen VIs rate ich ab. Und zum Synchronisieren gibt es entsprechende Elemente.

Ich an deiner Stelle würde auf LV 8.5 umsteigen.
' schrieb:So wie du das beschreibst, laufen hier zwei abhängige Systeme - Steuern aufgrund von einzulesenden Daten - in einer "Datenfluß-Verbindung" ab.

Sehe ich das richtig, dass die Steuerung von der Lesung abhängig ist?

Ja, genau so!

' schrieb:Egal wie es ist, ich würde folgendes machen: Ein SubVI, das die komplette Steuerung übernimmt. Dieses SubVI enthält dann eine Statemachine. Gesteuert wird dieses SubVI von außen mittels einer Queue, über die eben entsprechende Befehle bzw. Daten zum Steuerungsablauf hereinkommen. Dieses SubVI enthält alles, was zu Steuern notwendig ist. Hinweis: Das Einlesen von Daten ist nicht zwangsläufig zum Steuern notwendig. Notwendig sind lediglich die Daten. Wo die herkommen, steht auf einem anderen Blatt. Weiterer Hinweis: Dieses SubVI hat praktisch kein Frontpanel respektive wird das nie dargestellt. Dieses SubVI läuft ständig im Hintergrund, auch wenn gerade nicht gesteuert werden soll.

Das wäre Arbitrary.vi. Das Frontpanel hatte ich nur nicht ausgeschaltet. Das Frontpanel von Motorcontrol.vi wird nur genutzt, welches durch ein Menü aufgerufen wird.

' schrieb:Ein zweites SubVI, das prinzipiell genauso aufgebaut ist wie das erste, macht das Datenlesen. Die gelesenen Daten werden per Melder zur Verfügung gestellt. Diesen Melder kann z.B. das Steuer-SubVI lesen und damit eben den Motor steuern.

Das wäre in meinem Fall Scan.vi.

Ich werde mal probieren das Ganze in LV8 zu übernehmen und eine timed loop zu benutzen.

Danke für die Hilfe soweit,

Björn
' schrieb:Ja, genau so!
Die beiden VIs sind in Motorcontrol.vi sequenziert. Das bringt aber ein prinzipielles Problem mit sich: Solange die liest, kannst du nicht steuern. Da beide VIs eine While-Schleife enthalten, muss das eine immer solange aussetzen, bis das andere fertig ist. (Diese Zeit ist theoretisch - weil eben eine While-Schleife - unendlich.) Dieser Konflikt geht auch mit Synchronisation nicht lösen. Du müsstest Lesen und Steuern in eine While-Schleife machen.

Ich hab noch folgende Punkte:

Globale Variablen haben diverse Nachteile (Speichermanagement, Synchronisationsprobleme). Wenn schon, dann lieber eine "Funktionale Variable". Das ist ein SubVI, das hauptsächlich eine While-Schleife mit Schieberegister enthält, in dem die "Globalen Daten" liegen.

Man soll jede Operation sequenzieren: Auch das Resetten der globalen Variablen mit der Sequenzstruktur in MotorControl.VI.

Auch wenn es gemäß Styleguide heißt, kein BD größer als der Bildschirm, so geht die Lesbarkeit doch vor. Ich beziehe die Größe immer auf "zusammenhängenede Strukturen". Eine While-Schleife (oder For-Schleife oder Case-Seqeunz) alleine darf nicht größer sein als der Bildschirm. Hab ich aber mehrere zusammenhängenede Strukturen hintereinander, so darf jede für sich eine Bildschirmseite füllen. Was mir bei deinen VIs gar nicht gefällt, sind nämlich die rückwärtslaufenden Verbindungen in Arbitrary.vi. Ich würde die lieber gerade machen, auch wenn zwei Bildschirmseiten benötigt werden. Der Einwand nun, dass man beide Teile in ein SubVI auslagern könnte und dann halt drei hätte die Styliguide-konform sind, ist eine Milchmädchenrechnung: Die Lesbarkeit ist mit drei SubVIs schlechter als mit einem über zwei Bildschirmseiten. Es ist schneller und einfacher mit der Maus geschoben, also mit Alt-Tab aus mehreren Fenstern auf Windowsbasis das richtige ausgewählt.
Referenz-URLs