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!
Nachträglich programmatisch Kanäle im Task reduzieren
Hallo zusammen,
ich habe ein vermutlich triviales Problem: Ich möchte gerne aus einem bestehenden (im NI-MAX erzeugten) globalen Task mit 16 Kanälen programmgesteuert durch den Benutzer nur einen Bereich der Kanäle auswählen lassen (bspw. nur Kanal 0-3 o.ä.).
Wie muss ich vorgehen? Ich habe das bereits über Eigenschaftsknoten versucht und dachte, das richtige gefunden zu haben: Über die Eigenschaft "Zu lesende Kanäle" kann ich nur einen Kanal auswählen, allerdings nicht mehrere (was der Plural der Eigenschaft eigentlich suggeriert). Warum ist die Eigenschaft hier nicht ebenfalls als Array ausgeführt? Auch ein mehrfacher Aufruf per Schleife o.ä. führt dazu, dass nur der letzte gewählte Kanal genutzt wird.
RE: Nachträglich programmatisch Kanäle im Task reduzieren
Eine Lösung habe ich nun schon selbst gefunden: Das VI "Kanal-String serialisieren" war der Schlüssel zum Erfolg. Warum das Ganze erschließt sich mir nicht, und ob das die gescheiteste Lösung ist, weiß ich auch nicht.
ich hoffe, es ist okay, wenn ich diesen alten Thread noch einmal reaktiviere. Ich hänge schon seit geraumer Zeit vor genau dem gleichen Problem: Ich möchte gerne den Kanälen eines Tasks, den ich zuvor global im NI MAX erstellt habe, eine benutzerdefinierte Skalierung zur Laufzeit zuweisen können. Außerdem sollen die tatsächlich genutzten ( = "Zu lesenden Kanäle") zur Laufzeit vom Benutzer festgelegt werden können. Letzteres funktioniert auch soweit.
Zur Zuweisung der benutzerdefinierten Skalierungen... folgendes funktioniert NICHT (siehe relevanten Blockdiagramm-Ausschnitt): In der Schleife behandle ich die Kanäle einzeln und weise ihnen die vom Benutzer gewählte Skalierung zu (die Berechnungsformeln passen so, sind also nicht das Problem). Der Eigenschaft "Aktive Kanäle" im 1. Eigenschaftsknoten (habe auch schon versucht, diese Eigenschaft mit im 2. Knoten zu setzen - kein Unterschied) weise ich in jedem Schleifendurchlauf den Namen eines einzelnen Kanals zu (im Debugging überprüft - werden auch korrekt übergeben). Offensichtlich wird das aber komplett ignoriert, stattdessen erhalten am Ende immer alle Kanäle des Tasks (auch die nicht zu lesenden!) die Skalierung des letzten Schleifendurchlaufs! Warum ist das so? Was mache ich falsch?
Gibt es eine andere Möglichkeit, konkret jedem einzelnen Kanal eines bereits existierenden Tasks mit virtuellen Kanälen eine individuelle Skalierung zuzuweisen? Das grundsätzliche Verfahren, die Kanäle über den zuvor im MAX erstellten Task zu wählen, möchte ich aber gerne beibehalten, um nicht dem Benutzer einen Dialog zur Auswahl der Hardware-Kanäle präsentieren zu müssen (sind immerhin 16). Ich weiß, wenn die virtuellen Kanäle zur Laufzeit dynamisch erstellt werden, funktioniert das mit den individuellen Skalierungen. Das habe ich schon mehrfach gemacht. Aber es muss doch auch so gehen!?!
das hat in meinen Augen einen klaren Nachteil: entweder muss ich wie oben geschrieben dem Benutzer die Auswahl der physikalischen Kanäle überlassen oder ich mache das "festverdrahtet" im Programm mit dem großen Manko, dass ich das auf dem Zielsystem oder bei geänderter Hardware jeweils wieder anpassen muss.
Verstehe das einfach nicht, ich möchte doch nur die Skalierung eines bzw. jedes bereits existierenden virtuellen Kanals innerhalb eines Tasks ändern. Das muss doch gehen. Wofür sind die beschreibbaren Eigenschaftsknoten sonst da?
Gruß Dirk
02.06.2021, 19:02 (Dieser Beitrag wurde zuletzt bearbeitet: 02.06.2021 19:04 von GerdW.)
ich habe deine Beiträge wieder zusammengefasst, erscheint mir sinnvoller als einen 14 Jahre alter Thread wiederzuerwecken…
Deine ursprüngliche Frage:
Zitat:Ich möchte gerne aus einem bestehenden (im NI-MAX erzeugten) globalen Task mit 16 Kanälen programmgesteuert durch den Benutzer nur einen Bereich der Kanäle auswählen lassen (bspw. nur Kanal 0-3 o.ä.).
Jetzt heißt es:
Zitat:muss ich wie oben geschrieben dem Benutzer die Auswahl der physikalischen Kanäle überlassen
Du willst doch, dass der User sich die Messkanäle (und deren Skalierung) auswählen kann, oder!?
Da ist es meiner Meinung nach deutlich einfacher, einen Task nach Bedarf neu anzulegen als einen bestehenden aus MAX zu modifizieren!
Vorteile:
- Du bist bisher von einer korrekten Definition des Tasks in MAX abhängig, das fälllt dadurch weg. Was machst du, wenn der User diesen Task mutwillig verändert/löscht/umbenennt?
- Wo ist der Unterschied im Aufwand, einen Task neu zu definieren oder die gleichen Properties bei einem bestehenden Task zu verändern?
- Die nötige DAQ-Hardware kann man auch programmatisch abfragen und so Typbezeichnungen und Seriennummern herausfinden…
Zitat:das hat in meinen Augen einen klaren Nachteil: … ich mache das "festverdrahtet" im Programm mit dem großen Manko, dass ich das auf dem Zielsystem oder bei geänderter Hardware jeweils wieder anpassen muss.
Wo ist der Nachteil? Wenn sich deine DAQ-Hardware ändert, musst du den Task auch in MAX anpassen…
Der Nachteil ist mMn eher, dass die MAX-Database auf jedem Zielrechner anders aussehen kann - auch da musst du den Task (in MAX) jedesmal korrekt definieren…
@GerdW: Vielen Dank für's Zusammenfassen und Deine Antwort!
Meine beiden Zitate widersprechen sich nicht. Es geht um folgenden Konfigurationsdialog für die Kanäle:
Die Auswahl der Geräte habe ich jetzt nachträglich hinzugefügt, damit ich die benötigten virtuellen Kanäle darauf basierend dynamisch aufbauen kann. Ich hätte das gerne weggelassen. Die Situation ist folgende: Ich werde den/die Messrechner einrichten (somit bei Bedarf auch die Tasks im NI-MAX anlegen etc.), danach sollte das Programm am besten einfach laufen. Die Benutzer werden nur meine Anwendung starten und sehen, insofern dürfen die Tasks im NI-MAX als unveränderlich betrachtet werden.
Leider ist es so aber den Anwendern im Programm direkt möglich, die physikalischen(!) Kanäle - auch falsch - auszuwählen, was ich gerne verhindert hätte! Zudem sagen die Kanal- / Gerätenamen den Anwendern hier im Hause meist nichts.
Insofern: Ich frage mich weiterhin, WARUM es nicht möglich ist, die Skalierung eines bereits bestehenden virtuellen Kanals zu verändern? Oder noch besser: Wer hätte eine programmatische Lösung hierfür? Warum gibt es diese Eigenschaftsknoten, wenn die zugewiesenen Werte ignoriert werden?
Beste Grüße
Dirk
07.06.2021, 10:06 (Dieser Beitrag wurde zuletzt bearbeitet: 07.06.2021 10:06 von GerdW.)
Zitat:Leider ist es so aber den Anwendern im Programm direkt möglich, die physikalischen(!) Kanäle - auch falsch - auszuwählen, was ich gerne verhindert hätte!
Wie kann der User in deinem VI Kanäle "falsch" auswählen? Du zeigst doch gerade diesen Dialog zum Auswählen der Kanäle an?
Warum verhinderst du nicht programmatisch eine "falsche" Auswahl?
Zitat:Zudem sagen die Kanal- / Gerätenamen den Anwendern hier im Hause meist nichts.
Warum zeigst du dann diese Gerätenamen dem User überhaupt an?
Irgendwie verstehe ich deine Problematik nicht…
Du zeigst Gerätenamen zur Auswahl an, obwohl der User damit nichts anfangen kann!?
Du bietest eine Kanalauswahl an, in der User dann Kanäle "falsch" auswählen können!?
Zitat:Insofern:…
Ich finde es immer noch deutlich einfacher, einen Task programmatisch anzulegen als einen vorhandenen hinterher (korrekt) zu modifizieren:
Die Prüfstände hier erlauben bis zu 128 AI-Kanäle verschiedenen Typs…
Hm, vielleicht reden wir aneinander vorbei oder ich habe einen generellen Denkfehler
Ich benötige doch, um virtuelle Kanäle zu definieren die Angabe eines physikalischen Kanals, auf dem das laufen soll. Richtig?
OK, dann habe ich m.W. 2 Möglichkeiten: Entweder ich reserviere die entsprechenden Kanäle im NI-MAX und definiere dort einen Task oder ich mache das im Programm. Woher bekomme ich im Programm die passenden Gerätenamen auf verschiedenen Systemen, wenn ich sie nicht im Programm zur Auswahl anbiete? Klar, ich kann die Namen der vorhandenen Geräte auch abfragen, aber woher weiß ich, welches das "richtige" ist?