LabVIEWForum.de - Mehrere baugleiche Geräte verwenden

LabVIEWForum.de

Normale Version: Mehrere baugleiche Geräte verwenden
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,
ich will mich in Labview einarbeiten und habe dazu ein kleines Projekt mit 2x Velleman K8055 und ein Redlab 1208LS als Hardware. Ein einzelnes Gerät funktioniert einwandfrei. Wenn ich 2 verwende funktioniert die Kommunikation auch, allerdings extrem langsam. Woran könnte das liegen? Ich vermute das einfache kopieren wie ich es gemacht habe ist keine gute Idee?
Meine Labview Version ist 2022 Q3
Hallo Achim,

herzlich willkommen im LabVIEW-Forum!

Zitat:Meine Labview Version ist 2022 Q3
Kleiner Tipp/Hinweis vorneweg: du erreichst ein größeres Publikum, wenn du deine VIs für eine ältere LabVIEW-Version bereitstellst (File->Save for previous). Nicht alle können/wollen auf die neuesten LabVIEW-Versionen umstellen.
(Ich bevorzuge LV2019…)

Zitat:Wenn ich 2 verwende funktioniert die Kommunikation auch, allerdings extrem langsam. Woran könnte das liegen? Ich vermute das einfache kopieren wie ich es gemacht habe ist keine gute Idee?
Nein, eher nicht…
Du musst dann beachten, dass die VIs möglichst reentrant ausgelegt sind, um zwei gleiche Geräte parallel bedienen zu können!
(22.03.2023 13:59 )Achim2 schrieb: [ -> ]Hallo zusammen,
ich will mich in Labview einarbeiten und habe dazu ein kleines Projekt mit 2x Velleman K8055 und ein Redlab 1208LS als Hardware. Ein einzelnes Gerät funktioniert einwandfrei. Wenn ich 2 verwende funktioniert die Kommunikation auch, allerdings extrem langsam. Woran könnte das liegen? Ich vermute das einfache kopieren wie ich es gemacht habe ist keine gute Idee?
Meine Labview Version ist 2022 Q3

Ich habe eine ältere Version hochgeladen[attachment=62504][attachment=62504]
Hallo Achim,

danke für das Konvertieren!

Zitat:Wenn ich 2 verwende funktioniert die Kommunikation auch, allerdings extrem langsam. Woran könnte das liegen?
Dein VI bedurfte etwas "Aufräumen":
[attachment=62506]

Bitte merken:
- Anstatt einzelner Buttons/LEDs kann man auch ein Array verwenden! Dann entfällt das Bauen/Indizieren vorher/nachher!
- Bitte nicht ArrayToCluster+Unbundle verwenden, um die Elemente eines Arrays zu indizieren! Dafür gibt es IndexArray… (Und schon gar nicht mit ArrayToCluster in Standardeinstellung!!!)
- Keine unnötigen Sequenzen, schon gar nicht gestapelte. Immer "THINK DATAFLOW" beachten…

Zu deiner Frage:
- Was bedeutet "extrem langsam"?
- Die Velleman-DLL-Aufrufe finden alle im UI-Thread statt und der begrenzt damit die Geschwindigkeit: NICHTS findet parallel statt…

Hast du mal den Herrn Rendall gefragt, ob man das auch ändern könnte? Immerhin bietet er doch Hilfe an!
Ja stimmt, wirklich aufgeräumt war es nicht :-) Mit langsam meine ich eine Verzögerung von mehreren Sekunden. Es könnten 5 sein. Ich schalte einen Ausgang in Labview, das K8055 etwa 5s später, das gleiche beim Eingang in die andere Richtung. Wenn ich nur eine Karte wie im Beispiel verwende gibt es keine Verzögerung.

Danke an euch für die Hilfe! ich bin die Tage unterwegs und versuche mich mal weiter einzuarbeiten
Hallo Achim,

Zitat: Ich schalte einen Ausgang in Labview, das K8055 etwa 5s später, das gleiche beim Eingang in die andere Richtung. Wenn ich nur eine Karte wie im Beispiel verwende gibt es keine Verzögerung.
Was passiert, wenn du die beiden Karten nacheinander bedienst? D.h. per DATAFLOW (=error wire) die Reihenfolge der DLL-Aufrufe festlegen?

Was passiert, wenn du die DLL-Aufrufe in eine Schleife packst und die Inputs/Outputs über autoindizierende Tunnel in die Schleife gibst? (Das sichert dann gleich den DATAFLOW…)
Hallo Achim,

das kann mit zwei dieser Boards so überhaupt nicht funktionieren.

Die DLL ist nicht dafür ausgelegt. Dazu müsste OpenDevice einen Handle oder etwas in der Art liefern welche dann von allen anderen Funktionen verwendet wird. Anstatt eines Handles oder Pointers könnte auch die Adresse des Boards verwendet werden. Aber egal: Alle Funktionen müsste eindeutig wissen, auf welches Board sich der Aufruf bezieht. Das ist aber bei dieser DLL gar nicht der Fall.

Die Lösung hat Gerd schon angesprochen). Du musst erst das erste Board mit OpenDevice öffnen, die Ausgaben/Abfragen durchführen und am Ende das erste Board mit CloseDevice() wieder schließen. Anschließend kannst du das gleiche mit dem zweiten Board machen.

Evtl. gibt es noch eine etwas andere Variante, die aber auch nur die sequenzelle Ausführung erlaubt:
Die DLL hat eine Funktion mit dem Namen SetCurrentDevice(). Du hast die Hardware und kannst es ausprobieren. Eventuell kannst du erst einmal beide Boards mit OpenDevice öffnen. Vor dem Schreiben/Lesen von einem der Boards müsstest du dann mit SetCurrentDevice() auf das gewünschte Board umschalten.
Vielleicht verwendet eines der Beispiele diese Funktion ...


Im übrigen haben ein paar der Funktionen einen Return Wert, den du auch auswerten solltest.
Referenz-URLs