LabVIEWForum.de
Zeiger in Array speichern - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Zeiger in Array speichern (/Thread-Zeiger-in-Array-speichern)



Zeiger in Array speichern - mike8080 - 19.11.2010 11:38

Hallo Forum,

ich beschäftige mich seit kurzem mit LabVIEW 8.5 und stehe jetzt vor einem größeren Problem.
Im Augenblick versuche ich aus einer Messkarte Daten auszulesen dies gelingt mit allerdings nicht wie erwartet.

(Schleife1)
Die Daten werden durch den Befehlt IK220 ModeRAM (subVI des Herstellers) konstant in der Messkarte erfasst und in den Ram geschrieben.
Der Befehl muss nur einmalig aufgerufen werden die Karte Zeichnet dann konstant in einem Loop auf.

(Schleife 2)
Die Messwerte möchte ich anschließend über den Befehl „IK220 BurstRam“ (subVI des Herstellers) in ein Array schreiben.
Im Anhang befindet sich die Beschreibung zu dem SubVI „IK220BurstRam“.
Nun versuche ich über pData (Zeiger auf ein Array in welchem die Zählerwerte abgelegt werden) die Messwerte auszulesen und in einen Array zu schreiben. Dazu verwende ich die Funktion InsertIntoArray. Die Werte sollen dabei so lange in ein Array geschrieben werden bis ich den OK Butten drücke .

(Schleife 3).
Anschließend Will ich die Messwerte in eine Tabelle schreiben.


Wenn ich das Programm ausführe wird mein Array bei einem erneuten Aufruf nicht auf 0 gesetzt.
Ich hab zusätzliche Anzeigen eingebaut um mir die Größe der Arrays auszugeben.
Array Size1 gibt mir den richtigen Wert aus, es handelt sich dabei um die Größe der aktuell ausgelesenen Messwerte im jeweiligen Schleifendurchlauf.
Array Size2 gibt mir allerdings immer den Wert der letztmaligen Ausführung des Programms aus.
Somit funktioniert das Programm nur 1x.

In Schleife 3 werden mir allerdings auch nur die Messwerte ausgegeben, die zuletzt in IK220 Burst Ram ausgelesen wurden.

Die Karte Stellt einen Speicher von 8191 Messwerten zur verfügung, es wird jede Millisekunde ein Messwert erfasst.
Die Karte wird im Loop betrieben wenn dier Speicher voll ist wird wieder bei 1 begonnen.

Ich hoffe Ihr habt mein Problem verstanden
Gruß Mike


Zeiger in Array speichern - mike8080 - 19.11.2010 12:55

jetzt hab ich noch mal ne komische Frage.
Warum gibt mir LabView nur so viele Messwerte aus wie ich im Timer einstelle?
Wenn ich bei Timer 8191ms einstelle schreibt er mir das gesamte Array mit Messwerten voll.
Trage ich 10ms ein gibt er mir nur 10 Werte aus????
Bbei jedem Durchlauf holt er sich doch das Array neu und fügt es an??


Zeiger in Array speichern - Achim - 19.11.2010 13:30

Hi,
bei pData kommen schon die Daten raus, die du eigentlich willst! Die Jungs von Heidenhain haben für ihr VI einfach die Namen des Zeigers verwendet, mit denen man in C auf die Daten zugreifen müsste...aber in der unterlagerten DLL wird dieser Zugriff schon gemacht und dir die eigentlichen Werte zurückgegeben!

Diese kannst du mit BuildArray einfach bei jedem Durchlauf an die Daten des vorhergehenden Durchlaufs (siehe dein FeedbackNode) anhängen!

A.


Zeiger in Array speichern - RHeil - 19.11.2010 13:32

Ich versuche gerade zu verstehen, was da genau passiert.
Ist natürlich etwas theoretisch ohne die SubVIs.
Aber der Kern scheint das "ik220 BurstRam.vi" zu sein, dessen Kontexthilfe Du uns ja mitgeliefert hast.
Ich gehe mal davon aus, dass das VI in Wahrheit Double-Werte zurückliefert und keinen Zeiger. Das dürfte wohl eher ein Copy-Paste-Fehler beim Erstellen der Hilfe gewesen sein.

Zuerst fällt mir auf, dass das wie eine ungebremste Schleife aussieht.
Wieviele Werte bekommst Du denn pro Durchlauf zurück?
Werden das mehr, wenn Du eine Wartezeit (wenige ms) einbaust?
Das wäre vermutlich sinnvoll, um die CPU-Last in einem erträglichen Rahmen zu halten.

Dein eigentliches Problem liegt aber wohl in der Datenhaltung.
Verstehe ich deine Absicht richtig? Du möchtest einfach alle Messwerte eines Programmablaufs aneinanderhängen und dann gemeinsam darstellen?

Ein grundlegender Fehler besteht darin, dass Du die Feedback Nodes nicht initialisierst. Deshalb behalten sie ihren Inhalt zwischen den einzelnen Durchläufen.

Außerdem vermute ich, dass sich Deine Absicht wesentlich einfacher umsetzen lässt, indem Du einfach ein "Build Array" verwendest (nicht vergessen einen Rechtsklick darauf zu machen und "Concatenate Inputs" anzuhaken!).

Ich persönlich würde das lieber mit einem Shift Register umsetzen als mit einem Feedback Node, aber das ist letztlich Geschmackssache.

Schau Dir mal das angehängte VI an, ich hoffe das klärt einiges.

Mit etwas mehr Wissen über die Randparameter könnte man die Datenhaltung sicher noch weiter optimieren (z.B. indem man das Array zu Beginn allokiert), allerdings sollte man sich hier die Frage stellen, ob das im konkreten Fall den Aufwand wert ist.

Lv85_img


Zeiger in Array speichern - mike8080 - 19.11.2010 15:04

Danke für die schnelle Antworten!!!

OK den Timer habe ich jetzt eingebaut.
Komischerweise bekomme ich immer ungefähr die Anzahl Werte übergeben was ich auch als Wartezeit eintrage.
Ich habe den Timer jetzt auf 100ms eingestellt.

Und nach der Initialisierung meines Feedback Nodes funktioniert es jetzt auch :-)
Ich muss dir recht geben mit Build Array ist es viel einfach,
hatte des auch erst versucht aber "Concatenate Inputs" war der Trick an der Sache!

Kannst du mir jetzt noch sagen wie ich den Speicher allokieren kann?

DANKE noch mal, ich hab jetzt 2 Tage an dem S.... rum gemacht :-)
jetzt kann das Wochenende kommen!


Zeiger in Array speichern - RHeil - 22.11.2010 09:10

' schrieb:OK den Timer habe ich jetzt eingebaut.
Komischerweise bekomme ich immer ungefähr die Anzahl Werte übergeben was ich auch als Wartezeit eintrage.
Ich habe den Timer jetzt auf 100ms eingestellt.
Das hängt davon ab, wie das Treiber-VI intern funktioniert.
Gut möglich, dass das selbst auf die nötigen Werte wartet - dann hat die äußere Wartezeit keinen Effekt.
Tipp: Rechne Dir theoretisch aus, wie lange ein Schleifendurchlauf ca. dauern sollte (Anzahl Werte / Rate) und wähle eine Wartezeit, die etwa halb so groß ist. Damit sollten dann auch Fehlerfälle abgedeckt sein, ohne dass die Schleife amokläuft.

' schrieb:Kannst du mir jetzt noch sagen wie ich den Speicher allokieren kann?
Allokieren im Voraus ist natürlich nur dann richtig sinnvoll, wenn Du vorher bereits weißt, wieviele Werte Du insgesamt lesen wirst (oder zumindest eine feste Obergrenze definieren kannst).
Deshalb verwendet das angehängte Beispiel auch eine For-Schleife statt der While-Schleife (es geht aber natürlich auch mit while).

Was passiert da genau?
Zuerst rechnen wir aus, wieviele Werte es werden und legen ein Array der entsprechenden Größe an.
Als Element verwende ich hier NaN (NotANumber). Das hat den Vorteil, dass es im Graphen transparent (bzw. nicht) gezeichnet wird. Außerdem ist es die korrekte Codierung für "ungültiger Wert".

Dieses Array bleibt dann die ganze Zeit über im Shift Register.
In jedem Durchlauf wird ein Teil des Arrays mit den neuen Werten überschrieben.
Wenn Du Dir den Graphen anschaust, siehst Du, dass die X-Achse bereits zu Beginn die volle Wertezahl zeigt, da das Array bereits diese Länge hat.

Lv85_img


Zeiger in Array speichern - mike8080 - 23.11.2010 12:32

Ok hab es jetzt eingebaut Danke nochmal für die Hilfe
Big Grin