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!
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
Anzeige
17.11.2009, 15:32 (Dieser Beitrag wurde zuletzt bearbeitet: 17.11.2009 17:49 von dimitri84.)
Eine Kurze Frage noch zum Initialisieren. Nach dem Datenflussprinzip geht es an einem Knoten ja erst weiter wenn alle angeschlossenen Eingänge einen Wert liefern können:
Ich will jetzt die beiden Register mit sovielen Elementen initialiseren wie ich auch Kanäle habe. Wie viele Kanäle ich habe, weiß ich aber erst nach dem Initialisieren des DAQmx Tasks oder spätestens wenn ich den Datenstrom habe. Ich dachte jetzt nach dem Datenflussprinzip hat die lokale Variable (rot markiert) erst einen Wert, wenn das dazugehörige FP Element (auch rot markiert) den Wert das erste Mal erhält. Pustekuchen. Die Initialisierung erfolgt direkt am Anfang des VI-Starts, obwohl diese lokale Variable den Wert doch noch eigentlich garnicht wissen kann.
Was steht denn da in dieser Lokalen Variable für ein Wert, wenn das dazugehörige FP Element noch garnicht bedient worden ist?
Wie kann ich diese Initialisierung erst dann erfolgen lassen, wenn die Anzahl der Kanäle wirklich bekannt ist?
„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
17.11.2009, 16:01 (Dieser Beitrag wurde zuletzt bearbeitet: 17.11.2009 16:01 von Achim.)
Ja aber was soll denn drin stehen? Wie du schon sagst...es geht von links nach rechts! Du kannst doch nicht heute einen Wert wissen den du dir erst morgen erzeugst...
Es steht also in der Variable der Default-Wert des Anzeigeelementes drin! Lokale Variable "boykottieren" das Datenflussprinzip, deswegen kriegst du auch immer Warnungen zu hören, diese nicht unbedacht einzusetzen, weil du damit sogenannte "race conditions" ("wer darf zuerst?!) provozierst!
Kriegst du die Anzahl nicht irgendwie beim Initialisieren des Tasks mit? Sorry...ich hab den Thread nicht durchgelesen...
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
' schrieb:Kriegst du die Anzahl nicht irgendwie beim Initialisieren des Tasks mit?
100% ACK. Bei DAQmx musst du irgendwann mal angegeben haben, wieviele Kanäle du liest! Diesen Wert anschließen.
Für bessere Vorschläge, bitte VI hochladen, zwecks der vielen Case-Strukturen.
Und dann noch ein Wort zu lokalen Variablen: i2dx hat das mal schön ausgedrückt: Lokale Variable kann man sich eher als Funktionsaufruf vorstellen ("gib mir mal den Momentanwert"). Und der Momentanwert bei Programmstart eines numerischen Control ist halt Null.
Gruß, 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 jetzt das VI nicht da. Werd's morgen früh hochladen.
Also ich habe an dem Defaultwert nichts verändert (müsste also Null sein), und trotzdem wird das array mit der richtigen Anzahl an Elemente initialisiert, nämlich 5.
Wo ich nicht drauf komme ist, wie initialisiere ich ein Schieberegister von einer Schleife, wenn ich die dazu nötige Information (Anzahl der Elemente) erst in der selbigen Schleife erhalte.
„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Anzeige
17.11.2009, 17:25 (Dieser Beitrag wurde zuletzt bearbeitet: 17.11.2009 17:27 von Achim.)
' schrieb:Also ich habe an dem Defaultwert nichts verändert (müsste also Null sein), und trotzdem wird das array mit der richtigen Anzahl an Elemente initialisiert, nämlich 5.
LV merkt sich den letzten Wert, solange du LV nicht komplett schließt. Wenn du LV komplett beendest, steht da wieder "0" bzw. der Default-Wert drin.
Zitat:Wo ich nicht drauf komme ist, wie initialisiere ich ein Schieberegister von einer Schleife, wenn ich die dazu nötige Information (Anzahl der Elemente) erst in der selbigen Schleife erhalte.
Geht nicht! Aber wie schon gesagt, du musst doch beim Task-Init festlegen, wieviele Kanäle du lesen willst...und dann hast du doch die Anzahl! Ich nehme mal an, dein Task-Init steckt in False-Fall...dann musst du den Init eben da raus nehmen und vor die Schleife packen!
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
' schrieb:Aber wie schon gesagt, du musst doch beim Task-Init festlegen, wieviele Kanäle du lesen willst...und dann hast du doch die Anzahl! Ich nehme mal an, dein Task-Init steckt in False-Fall
Ja, die Init ist in einem der Cases.
' schrieb:...dann musst du den Init eben da raus nehmen und vor die Schleife packen!
Das würde mir nicht so gut passen, weil die spätere Exe auch auf Rechner ohne DAQmx laufen soll, da das Programm nicht nur zum Erfassen des Signals dient. Ich möchte da keine unnötigen Fehlermeldungen provozieren.
„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
' schrieb:Ja, die Init ist in einem der Cases.
Das würde mir nicht so gut passen, weil die spätere Exe auch auf Rechner ohne DAQmx laufen soll, da das Programm nicht nur zum Erfassen des Signals dient. Ich möchte da keine unnötigen Fehlermeldungen provozieren.
Dann pack in den Init-Case auch das Initialisieren des Shift-Register! Wenn der Ablauf deiner "State-Machine" (wobei man das nicht unbedingt mit True-False-Cases machen sollte) so ist, dass immer erst der Init-Case kommt, ist das kein Problem.
Hierzu ein Muster (ohne weitere Funktion), aber ich hoffe, das Prinzip wird klar:
Case 0 wird auf jeden Fall als erstes durchgeführt, somit ist ab diesem Zeitpunkt das Shift-Register korrekt initialisiert.
Gruß, 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!