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 Frage:
Ist es möglich aus einem Task ein Kanal auszuwählen um den Kanal dann in einer FGV zu verwenden?
Die Idee ist, dass ich einen Task erstelle und dann z.B. bei einer Heizungs-FGV oder Klasse die Kanäle gebe, die die FGV/Klasse benutzen darf zum einlesen/ausgeben ihrer Daten.
Ich hab z.B. das Problem, dass ich im Moment in einer FGV die alten digitalen Ausgaben (alle Kanäle als Cluster) speichere und dann bei einer neuen Ausgabe, die alten abrufe und dann mit "Bundle by Name" die einzelnen Werte setze die ich möchte und dann wieder komplett alle Kanäle ausgebe.
Ist es irgendwie möglich wie bei einem Microchip die einzelnen Werte auf bestimmte Pins zu setzen?
- Warum packst du erst mehrere Kanäle in einen Task, wenn du sie einzeln benutzen möchtest?
- Warum bündelst du nicht die Ein-/Ausgabe-Operationen dieses Task an einer Stelle, statt sie auf verschiedene Instanzen zu verteilen?
Ich habe hier Geräte von NI, die 6 bis 7 Tasks haben können. Also Bündle ich alle AI in ein AI-Task, AO in AO-Task, DI in DI-Task, DO in DO-Task und dann z.B. 3 Counter Task und dann sind alle Tasks hin. Ich habe meist mehr Geräte als Tasks.
nun möchte ich gerne die angesteurten Geräte abstrahieren um z.B. bei einem Testversuch in dem ich dann plötzlich 2 Heizungen benötige, nur eine neue Instanz der Klasse machen müsste und der Instanz dann die Kanäle und die Tasks geben kann über die die Instanz handeln kann.
oder gibt es da andere Frameworks, die ich für DAQmx verwenden kann?
15.01.2013, 10:19 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2013 10:19 von GerdW.)
ich würde nicht erst Tasks anlegen, um diese dann später aufwändig zu zerpflücken...
Ich persönlich bevorzuge eine andere Herangehensweise:
- Task anlegen, in eigenen VIs Daten vom Task lesen und in eine FGV packen
- Andere VIs (hier: deine zwei Heizungs-Steuerungen) holen sich die Werte, die sie brauchen, aus der FGV
- gleiche Herangehensweise bei AO/DO-Tasks: diese lesen die zu setzenden Werte aus einer FGV, die von anderen VIs befüllt wird.
Prima Trennung von Daten und Tasks, alle können Daten aus FGVs lesen, alle können Daten in FGVs schreiben, FGV hält Daten konsistent, weitere Funktionalitäten in der FGV, und viele weitere Vorteile...
Genau so mache ich dies bereits. Das Problem das ich dann immer habe, ist, dass ich dann bei einer Änderung der Kanäle im Task, das jeweilige FGV abändern muss, und dann bei z.B. der Heizung überprüfen, ob die Datenherkunft noch stimmt.
Ich möchte ein Framework aufbauen, um bei verschiedenen Projekten einfach auf neue IO's reagieren kann.
Edit: Wie kann man die Labview Version bei einem Upload anhängen?
entweder man legt die Tasks nur mit den benötigten Kanälen an (sowas kann man dynamisch erledigen!) oder man nutzt alle zur Verfügung stehenden Kanäle und liest aus der FGV nur die, die einen interessieren (kann man auch dynamisch erledigen). ("Dynamisch" heisst "zur Laufzeit")
Das Problem ist, dass ich die Werte "schön" über ein "Unbundle by Name" auslesen können möchte (damit der Code besser verständlich ist).
D.h. bei einer Änderung im Kanal, muss ich das Cluster im FGV auch abändern. Nun weiss ich nicht, wie LabView die Referenz hält. Ich meine damit, dass wenn ich ein Control im Cluster lösche, dass die restlichen "Referenzen" beim "Unbundle By Name" noch stimmen.
Gibt es ein Property oder eine Referenz von so einem Clustercontrol, damit ich in einer Klasse z.B. diese mitgeben kann, worüber diese dann die Werte aus der FGV mit bestimmten Clstercontrol auslesen kann?
meine FGVs arbeiten mit dem Namen des Kanals, wie er in einer (Excel-)Konfigurationsdatei vergeben wird.
Man kann solche Dinge mit LookupTables oder mit Variant-Attributen erledigen. Mit Referenzen auf Cluster in irgendwelchen Speicher-VIs würde ich gar nicht erst anfangen...
Also du machst es so, dass ich der Klasseninstanz den Namen des Kanals übergebe, und dann im FGV nach dem Namen suche und entsprechend den Wert ausgebe?
Das würde ich im Textbasierten Programmieren mit einer MAP machen. Wie geht das in LabView?
Oder nein, du suchst nach dem Namen im Array von Signalverläufen?
"MAP" soll wohl das gleiche bedeuten wie "LookupTable"?
Such mal auf Google nach "LabVIEW red-black-tree", da bekommst du gute Erläuterungen, wie man LookupTables bequem mit Variant-Attributen ersetzen kann.
VIs kann ich hierzu nicht anbieten, das ist alles Firmen-"Eigentum"!