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 versuche einen feedback loop zu implementieren, der jededsmal, wenn ein neuer wert berechnet wurde diesen via eines cDAQ-9188 ausgeben soll. Dise funktioniert meistens auch recht gut, nun habe ich aber ein komisches verhalten beobachtet:
im angehängten test-vi sende ich bei jedem durchlauf des loops ein 1d-array mit nullen an das daq. im schnitt braucht der loop ca 35ms um einmal durchzulaufen. von zeit zu zeit stockt er aber und braucht für einen durchlauf viel länger, nämlich ca 270ms, bevor er dann mit dem nächsten wieder auf 35ms runter kommt.
ich hab dann die zeitpunkte, zu denen das passiert etwas genauer angeschaut und bemerkt, dass dieses stocken immer genau alle 10 sekunden (oder ein vielfaches davon, also 20 / 30 / etc sekunden) auftritt. und wenn man die absolute zeit anschaut, zu der das passiert, fällt auf, dass die stocker immer zur selben zeit auftreten. also z.b. um 13:21:41.8 und 13:21:51.8 und 13:22:11.8 (hh:mm:ss). auch wenn das vi dazwischen gestoppt und neu gestartet wird. wenn ich das daq aber vom computer trenne und wieder neu anschliesse ändert sich diese absolute zeit (dann z.b. 13:25:07.4 & 13:25:17.4 etc)
das ganze ist grösstenteils unabhängig davon wieviele channels ich sende und ob ich im loop noch ein "wait ms" einfüge. bei vielen channels und ohne wartezeit stockt der loop einfach jede 10 sekunden, bei weniger channels und/oder mit wait auch mal erst nach 20 oder 30 sekunden. aber immer zum gleichen absoluten zeitpunkt und immer nach vielfachen von 10 sekunden.
hat irgendjemand eine idee woran das liegen könnte?
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
RE: daqmx ao stockt
Bitte LVF-Regeln beachten.
Vor allem den Abschnitt mit der Groß- und Kleinschreibung.
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
26.07.2012, 07:13 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2012 07:21 von Lucki.)
Da du die Konfiguration im MAX vorgenommen hast, kann man sie leider nicht sehen. Ich gehe aber mal davon aus, dass die Einstellung "kontinuierlich" und "nicht regenerierend" ist. Puffergröße leider unbekannt.
Was stört Dich überhaupt an diesen Pausen? Es wird doch bei jedem Schleifendurchlauf nur der Puffer nachgefüllt. Entscheidend ist doch nicht die Frage, ob die Pufferauffüllung, sondern ob die Datenausgabe kontinuierlich erfolgt. Dazu müsstest Du die ausgegebene Spannung beobachten. Voraussetzung ist da natürlich, dass du ein strukturiertes Muster ausgibst, wenn es lauter Nullen sind, merkt man nicht, ob die Ausgabe läuft oder ob sie stockt.
Also, ich hab mir das mal angeschaut. Via Property-nodes bekomm ich raus, dass regeneration erlaubt ist und Buffer Grössen hab ich zwei verschiedene gefunden: Die OutputBufferSize ist 0 und die OnboardBufferSize ist 8191. Leider weiss ich nicht, was der Unterschied zwischen den beiden ist und woher die Einstellungen genau kommen. Wo und wie ich nachschauen kann, ob die Einstellung auf kontinuierlich gesetzt ist, weiss ich nicht. Aber da das vi eigentlich so lange läuft bis ich Stop drücke, gehe ich davon aus, dass es kontinuierlich ist.
Das Problem mit den Pausen ist, dass ich ein Feedback System implementiere. Grob gesagt sieht das ganze Programm so aus, dass in einem paralell laufenden Loop Daten gemessen werden und diese dann im Feedback-Loop verarbeitet und die Kontrollvariabeln neu gesetzt werden. Das heisst ich messe z.B. alle 40ms und will noch vor der nächsten Messung die Kontrollparameter neu anpassen. Das funktioniert auch, solange der Feedback-loop in 35ms einmal durchläuft. Wenn er aber plötzlich stecken bleibt, werden im Mess-loop immer noch alle 40ms Daten aquiriert, die sich dann in einem Buffer stauen und warten bis der Feedback-loop wieder zur verfügung steht. Ist dies dann wieder der Fall bekommt die Feedback-Berechnung in den nächsten paar Durchläufen Daten, die überhaupt nicht auf die Änderungen reagieren, die vom Feedback gemacht wurden, da sie ja schon vorher aufgezeichnet worden sind. Irgendwann hat der Feedback-loop dann den Mess-loop wieder eingeholt und kann sich wieder beruhigen. Aber jedesmal, wenn dieser Delay passiert "verschluckt" sich mein ganzes Feedback halt.
Also eigentlich will ich keinen Buffer haben, sondern jeden Wert, den ich setzte auch sofort ausgeben.
Zu den Betriebsarten "regenerativ" und "non regenerativ"
Bei "regenerativ" werden nur einmal Daten in den Buffer geschriiben. Die Ausgabe wiederholt sich dann unendlich, das VI DAQmxWrite wird nur ein einziges Mal aufgerufen.
Bei "non regenerativ" ist das nicht so. Es muss dann mit DAQmxWrite laufend der Buffer nachgefüllt werden, bevor er leer ist.
Was passiert, wenn man die Betriebsart "regenerativ" wählt und dann trotzden laufend Daten in den Puffer nachschiebt, das weiß ich ehrlich selbst nicht. Es passt aber nicht zusammen.
Was Du eigentlich genau willst, kann man am VI auch nicht erkennen, denn wenn Du nur Nullen ausgibt, ist es ja ein Nopnsens-VI - das Ganze entspricht der Ausgabe des Einzelwertes "0"
Auf meinen Vorschlag, den Ausgang Dir mal anzuscheuen, bist Du auch nicht eingegangen. Fehlt es an einem Oszilliskop oder was ist sonst der Grund?