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 hoffe, hier kann mir jemand helfen, ich probiere schon seit Tagen rum und bekomme immer wieder den gleichen Fehler.
Ich habe ein HauptVI, mit dem ich aus 22 Kanälen Messdaten mit 1kHz auslese und mir graphisch anzeigen lasse. Das läuft fehlerlos. In einem SubVI, in dem sich eine for-schleife befindet, sollen alle Messdaten in eine Datei gespeichert werden. Wahrscheinlich ist diese Schleife das Problem, aber ich weiß nicht, wie ich das Speichern anders lösen kann. Wenn das SubVI aktiv ist und Werte abspeichert, tritt nach einigen Sekunden der Fehler -200279 (Pufferproblem) auf. Ich habe jeweils am DAQmx timer und -reader schon verschiedene Konstanten bei "Samples to read" angeschlossen, habe aber immer wieder diesen Fehler.
Hat jemand eine Idee, was ich dagegen tun kann?
Im Anhang findet Ihr beide VIs.
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
RE: Pufferproblem, error 200279
Deine Speicher-SubVIs fehlen.
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
1. Es ist überhaupt keine gute Idee, ein subVI vor dem Hochladen umzubenennen, da dann das HauptVI sein subVI nicht mehr findet...
2. Es ist keine gute Idee, "schöne" Datentypen wie Array of Waveform nach DDT umzuwandeln...
3. Es ist keine gute Idee, im subVI eine unnötige FOR-Loop zu verwenden. Überhaupt sollte hier viel aufgeräumt werden, ich habe mal ein paar Ansatzpunkte programmiert (s. Anhang).
4. Es ist überhaupt keine gute Idee, Dateioperationen in einer zeitkritischen Schleife (wie DAQ) zu erledigen. Dafür gibt es das Producer-Consumer-Schema!
danke für die Hinweise. Diesmal habe ich nichts umbenannt und alle SubVIs hochgeladen.
zu 2.: die Umwandlung in DDT habe ich gemacht, weil ich die Messwerte extrahieren will ohne bei allen Kanälen zusätzlich die Zeitstempel zu haben und sie in strings umzuwandeln, um sie letztendlich in eine csv-Datei zu speichern. Gehtr sicherlich auch anders, aber wie?
zu 3.: Danke, habe ich nun für alle Kanäle angepasst
Deinen 4. Punkt verstehe ich leider nicht. Kannst Du das bitte genauer erklären?
Auch mit aufgeräumtem SubVI habe ich leider noch den Fehler.
zu 2. Du bekommst ein Array of Waveforms vom DAQmxRead. Dieses kann man mit IndexArray in die einzelnen Signale zerlegen, dafür braucht man kein SplitSignal-ExpressVI. Mit GetWaveformComponents kannst du dir die Y-Daten ausgeben lassen - ohne dass du zwingend den t0-Zeitstempel benutzen musst...
zu 4. Dateioperationen sind Funktionen, deren Laufzeit nicht bekannt ist und die auch stark schwanken kann. Zusammen mit dem nicht unerheblichen Aufwand, den du beim Formatieren deiner Werte machst, wird also die DAQ-Schleife ausgebremst. Deshalb trennt man DAQ und Dateihandling üblicherweise in zwei parallele Schleifen auf und nutzt dafür das Producer-Consumer-Schema...
Mir erschließt sich nicht, was du mit dem SubVI "Aufzeichnung speichern 2(SubVI).vi" erreichen willst. Das läuft x-mal parallel (bzw. im System hintereinander, das nicht reentrant) und überschreibt das Chart sozusagen dauernd.
Probier doch mal das Speichern als TDMS. Das Format ist ausgelegt für das Handling vieler Daten, eine Schnittstelle zu Excel existiert ebenfalls, und du musst nicht diese grausame Formatierungs-Orgie durchführen, die du dir gerade antust.
Natürlich erfolgt das Speichern auch bei TDMS nicht in der Erfassungsschleife, wie Gerd schon erwähnt hat.
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!
danke für die Tipps. Das "Aufzeichnung speichern..." war noch ein Überbleibsel aus der alten Version, habe ich entfernt, hatte keine Aufgabe mehr. Mit TDMS habe ich auch schon rumprobiert, aber bis ich diese Dateien dann in Matlab analysieren kann, muss ich etliche Zwischenschritte machen, z.B. die Zeit umformatieren, in .xlsx umwandeln etc. Mit .csv kann ich in Matlab am einfachsten arbeiten.
Meine Frage zu den 2 parallelen Schleifen: ich habe ja das HauptVI in einer grossen Schleife mit einer state machine. Soll ich dazu parallel eine zweite Schleife laufen lassen, die sich mit der Speicherung befasst? Oder war das anders gemeint? Kennt Ihr dazu einfache Beispiele? Alles was ich dazu gefunden habe, ist gleich wieder so komplex.
ich habe nun ein producer-customer-Schema verwendet und habe folgende Frage dazu: die queues transportieren doch immer nur die Werte von einem Kanal, muss ich dann also für jeden Kanal ein queue anlegen? Oder gibt es eine Möglichkeit, alle in einem zu transportieren?
Gibt es sonst noch Verbesserungsvorschläge zu meinen VIs?
Gruß
Anja
27.11.2013, 09:02 (Dieser Beitrag wurde zuletzt bearbeitet: 27.11.2013 09:08 von GerdW.)
Zitat:die queues transportieren doch immer nur die Werte von einem Kanal, muss ich dann also für jeden Kanal ein queue anlegen?
Wenn man sowas hier absichtlich programmiert:
dann darf man sich auch nicht wundern, wenn die Queue nur die Werte eines einzigen Kanals (den ersten mit Index 0) transportiert!
Man kann eine Queue auch für ein Array of Waveforms erstellen und alle Kanäle in einer Queue übertragen...
Zitat:Gibt es sonst noch Verbesserungsvorschläge zu meinen VIs?
- IndexArray statt SplitSignal
- aufräumen
- OPC-Kommunikation in subVI erledigen (gehört mit zu Aufräumen...)
- 4fach "SetDynamicDataAttributes" durch eine FOR-Loop ersetzen...
- 4fach OPC-Read in eine Schleife packen...
- wieso packst du ein Tab-Control-Terminal in eine Disable-Struktur?
- DAQmx-Kanäle in einer FOR-Loop definieren...
- durchgängige ErrorCluster-Verdrahtung und -Auswertung...