(18.11.2015 11:36 )m.werle schrieb: Strikttypisierte Referencen kriege ich gerade nicht hin.
Muss ich später (am Tag) kucken ...
Zitat:Mh, wie berechne ich denn nun beispielshaft den AVG-Wert über einen bestimmten Zeitraum dt ?
Bei einer Updaterate von 200 Hz (Datenpakete pro Sekunde) und einem dt von 10s müsste ich also 2000 Datenpakete mit jeweils m Samples verrechnen.
Bei einer Updaterate von 200 Hz würde ich diesen AVG Wert alle 5ms neu berechnen, jeweils mit dem neusten Datenpaket und den 1999 davor.
Jawohl, genau so kannst du das machen.
Eine Abtastrate von 200Hz (5ms) ist doch recht langsam. Da könntest du fast mit Einzelwerten arbeiten: 1 Wert aus dem DAQmx lesen, 1 Wert in die Historie für AVG aufnehmen etc. Die Mittelwertbildung könntest du wie folgt machen. Erstelle einen Cluster myAVG, der folgendes enthält: Ein Array "Values" der Länge 2000, einen Integer "Anzahl" und einen Integer "Index". myAVG verwendest du als Ringpuffer. Resettet wird der Ringpuffer, indem alles, Index, Anzahl und Array, auf Null gesetzt wird. Summe über "Values" / "Anzahl" ergibt AVG. Hinzufügen geht so: Values[index]=newValue; index=index+1; if (index>=2000) index=0; Anzahl=Anzahl+1; if (Anzahl>2000) Anzahl = 2000;
Zitat:Speicher ich die Daten also in eine Queue und lese hierfür die neusten 2000 Datenpakete aus? Die Anzeige liest dann ebenfalls die Daten mit einer relativ niedrigen Frequenz als großes Bündel aus der Queue und ergänzt das Diagramm?
In die Queue (bzw. in den Melder) schreibst du nur das, was in einem anderen VI verwendet werden soll. Du kannst hier wieder einen Cluster machen, der z.B. AVG enthält und die gemessenen Daten.
Noch ein Wort zu den gemessenen Daten:
Die "gemessenen Daten" entstehen ja in Folge einer Addition aller einzelnen Auslesungen aus dem DAQmx. Diese Daten ergeben also ein Array (bzw. einen Datenstream). Die Frage ist nun, wer verwaltet diesen Stream. Schließlich muss der resettet und aufaddiert werden. Es gibt zwei Möglichkeiten:
- Entweder wird diese Arbeit vom Sample-VI gemacht. Dann wird das komplette Array per Melder (nicht per Queue) verschickt. Dieses Verfahren geht aber nur, wenn der Stream eine bestimmte Größe nicht überschreitet. Diese Größe kann aber durchaus bei 20MB liegen. Auch sollte die Zeit für einen Zyklus (= Streamgröße) einen bestimmten Wert nicht überschreiten (ca. 3 Minuten).
- Oder diese Arbeit wird vom Anzeige-VI erledigt. Dann werden die einzelnen, gelesenen DAQ-Daten per Queue (nicht per Melder) verschickt. Dieses Verfahren muss man anwenden, wenn die Zyklusdauer groß oder gar "unendlich" ist.