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!
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 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":
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?
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
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
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.
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
03.05.2007, 16:59 (Dieser Beitrag wurde zuletzt bearbeitet: 03.05.2007 18:18 von Lucki.)
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.
' 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.