LabVIEWForum.de
Producer/Consumer Problem bei Refnum Übergabe - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Producer/Consumer Problem bei Refnum Übergabe (/Thread-Producer-Consumer-Problem-bei-Refnum-Uebergabe)



Producer/Consumer Problem bei Refnum Übergabe - baesi - 03.05.2007 14:49

Hallo zusammen

Ich hoffe es kann mir jemand weiterhelfen.

Ich habe eine Producer Consumer Struktur. Falls der Wert eines Frontpanelelemtes geändert wird übergebe ich das Refnum des dazugehörenden Elementes und lese alle notwendigen Werte via Property Node aus.
Zu meinem Problem:

Wenn ich die Referenz eines ersten Elementes (Drehregler) übergebe funktioniert alles einwandfrei. Beim zweiten Element (Bool) kommt immer Fehlermeldung 91(LabVIEW: Der Datentyp des Variant ist nicht kompatibel mit dem Datentyp, der mit dem Eingang verbunden ist)

Wenn ich beide Elemete lösche und in umgekehrter Reihenfolge wieder Aufbaue funktionierts mit dem Bool dafür nicht mehr mit dem Drehregler.

Für ein besseres Verständnis habe ich eine abgespeckte Version meines Vi angehängt.

Ich hoffe es kann mir jemand helfen.

Besten Dank

Gruss

Baesi
[attachment=6440]


Producer/Consumer Problem bei Refnum Übergabe - VDB - 03.05.2007 15:25

' schrieb:Hallo zusammen

Ich hoffe es kann mir jemand weiterhelfen.

Ich habe eine Producer Consumer Struktur. Falls der Wert eines Frontpanelelemtes geändert wird übergebe ich das Refnum des dazugehörenden Elementes und lese alle notwendigen Werte via Property Node aus.
Zu meinem Problem:

Wenn ich die Referenz eines ersten Elementes (Drehregler) übergebe funktioniert alles einwandfrei. Beim zweiten Element (Bool) kommt immer Fehlermeldung 91(LabVIEW: Der Datentyp des Variant ist nicht kompatibel mit dem Datentyp, der mit dem Eingang verbunden ist)

Wenn ich beide Elemete lösche und in umgekehrter Reihenfolge wieder Aufbaue funktionierts mit dem Bool dafür nicht mehr mit dem Drehregler.

Für ein besseres Verständnis habe ich eine abgespeckte Version meines Vi angehängt.

Ich hoffe es kann mir jemand helfen.

Besten Dank

Gruss

Baesi
[attachment=33031:test.vi]

Du must die References noch "casten", dazu benutzt man "To More Generic Class":

[attachment=6441]


VDB


Producer/Consumer Problem bei Refnum Übergabe - marker - 03.05.2007 15:30

Hallo Baesi,

ich hab nur mal kurz dein VI überflogen.
Da stellt sich mir sofort die Frage warum man so etwas macht.
Die Struktur (Producer/Consumer wie du sie nennst) ist ja ein guter Programmierstil, aber
alles über die Referenzen zu übergeben ist ja ziemlich unübersichtlich.
Wäre es nicht einfacher Cluster zu verwenden?

Gruß,
Marko


Producer/Consumer Problem bei Refnum Übergabe - jg - 03.05.2007 15:51

Hallo,

habe ebenfalls mal kurz einen Blick draufgeworfen. Was ich mich frage: Wieso steckst du die Ctrl-Refnum nochmal in einen Cluster? Ich hab's mal ohne Cluster probiert, sprich direkte Übergabe der Refnums, dann hat's gefunzt.

MfG, Jens


Producer/Consumer Problem bei Refnum Übergabe - baesi - 03.05.2007 16:21

' schrieb:Hallo,

habe ebenfalls mal kurz einen Blick draufgeworfen. Was ich mich frage: Wieso steckst du die Ctrl-Refnum nochmal in einen Cluster? Ich hab's mal ohne Cluster probiert, sprich direkte Übergabe der Refnums, dann hat's gefunzt.

MfG, Jens


Hallo zusammen

Besten Dank für die schnellen Antworten.

Habe die Lösung soeben selber gefunden:
http://wiki.lavag.org/index.php/Image:Type...notherclass.png

Warum der Cluster:
Das Bsp war natürlich abgespeckt. In meiner Applikation musste ich noch zusätzlich ein Enum übergeben Darum der Cluster.

Warum die Referenzen:
Mit der Applikation werden in Zukunft indirekt diverse FahrzeugSteuergeräte via CAN CCP ferngesteuert werden können. Weil die FP Elemte dynamisch via einer a2l Datei (Steuergeräte Beschreibungsdatei) konfiguriert werden müssen und eine allfälige Erweiterung ohne grossen Programmieraufwand möglich sein muss, habe ich den Weg mit den Refnums gewählt. Bei früheren Applikationen habe ich auch mit Clustern gearbeitet. Aber ich denke (kann sein, dass ich mich irre) dass in ich mir in diesem Fall bei einer zukünftigen Erweiterung Zeit spare.

Nochmals Danke

Falls Ihr anderer Meinung seid lasse ich gerne belehren.

Gruss

Baesi


Producer/Consumer Problem bei Refnum Übergabe - Lucki - 03.05.2007 16:59

Habe mir das VI auch mal angesehen, und glaube da eine grundsätzliche Schwachstelle dieser Konstruktion zu erkennen (hat aber mit dem Fehler nichts zu tun).
Die Sinn einer solchen Konzeption ist eigentlich, daß über die Queue (Wobei hier ein Melder auch ausgereicht hätte) die Daten zwischen Producer Consumer ausgetauscht werden. Das ist aber hier gar nicht der Fall, die Queue enthält gar kein Daten. Du hast lediglich ein Element in der Queue mit "Daten" bezeichnet, welches nur eine Referenz ist.
D.h. wenn Du in der Consumer-Schleife (oder dem Consumer-VI) die Daten wirklich empfängst - bei Dir ist das ja gar nicht der Fall - dann mußt Du sie Dir über die Referenzen, die in der Queue stehen, besorgen. Das ist aber ineffektiver, weil langsamer, als wenn sie in der Queue selbst stehen würden.

Ich habe mal eine Änderung gemacht, die ganz ohne Referenzen auskommt. Die Information, um welchen Datentyp es sich bei dem Variant handelt, wird über das Enum-Element übertragen. Anstelle des Elementes "Change" enthält es die beiden Elemente "Knob" und "Boolean".

Edit: Natürlich ist es kein direkter Fehler, wenn man über die Queue nur Referenzen schickt und keine Daten. Wenn man das aber tut, dann ist die Konvertierung von Referenz zu Cluster zu String zu Variant und wieder zurück überflüssig wie ein Kropf, und die Bezeichnung des Clustern mit "Daten" klassifiziert das Ganze dann noch als Mogelpackung. Dein VI mit Wertübergabe über Referenzen - wie gesagt nicht zu empfehlen - würde in abgespeckter Form so aussehen wie das zweite VI.


Producer/Consumer Problem bei Refnum Übergabe - baesi - 04.05.2007 12:55

' schrieb:Habe mir das VI auch mal angesehen, und glaube da eine grundsätzliche Schwachstelle dieser Konstruktion zu erkennen (hat aber mit dem Fehler nichts zu tun).
Die Sinn einer solchen Konzeption ist eigentlich, daß über die Queue (Wobei hier ein Melder auch ausgereicht hätte) die Daten zwischen Producer Consumer ausgetauscht werden. Das ist aber hier gar nicht der Fall, die Queue enthält gar kein Daten. Du hast lediglich ein Element in der Queue mit "Daten" bezeichnet, welches nur eine Referenz ist.
D.h. wenn Du in der Consumer-Schleife (oder dem Consumer-VI) die Daten wirklich empfängst - bei Dir ist das ja gar nicht der Fall - dann mußt Du sie Dir über die Referenzen, die in der Queue stehen, besorgen. Das ist aber ineffektiver, weil langsamer, als wenn sie in der Queue selbst stehen würden.

Ich habe mal eine Änderung gemacht, die ganz ohne Referenzen auskommt. Die Information, um welchen Datentyp es sich bei dem Variant handelt, wird über das Enum-Element übertragen. Anstelle des Elementes "Change" enthält es die beiden Elemente "Knob" und "Boolean".

Edit: Natürlich ist es kein direkter Fehler, wenn man über die Queue nur Referenzen schickt und keine Daten. Wenn man das aber tut, dann ist die Konvertierung von Referenz zu Cluster zu String zu Variant und wieder zurück überflüssig wie ein Kropf, und die Bezeichnung des Clustern mit "Daten" klassifiziert das Ganze dann noch als Mogelpackung. Dein VI mit Wertübergabe über Referenzen - wie gesagt nicht zu empfehlen - würde in abgespeckter Form so aussehen wie das zweite VI.


Besten Dank für die Inputs. Ich übergebe nun nicht mehr die Refnums sondern direkt die Werte und andere Parameter in einem Cluster. Der Code wurde dadurch sogar übersichtlicher.

Gruss

Baesi