Schönen guten Morgen alle zusammen.
Ich habe ein kleines Problem. Ich habe von NI eine USB 6259 Karte und möchte nun die 48 DO´s ausgeben. Dies ist an und für sich kein Problem. Ich gebe auf das DAQmx Write ein Feld mit meinen Werten (insgsamt 48 mal 0 oder 1) und setze so die Ausgänge. Nun möchte ich aber ganz gerne die Ausgänge zeitverzögert setzen. Z.B. Ausgang 1 soll 100 ms und Ausgang 2 soll 500 ms verzögert erst gesetzt werden. Alle anderen Ausgänge sollen direkt gesetzt werden, wenn ich den Befehl in meinem Programm gebe. Ich möchte also meine Ausgänge über mein Array setzen und ich habe noch ein 2. Array mit meinen jeweiligen Zeiten. Wie kann ich diese Zeiten in meine DAQ einbinden?
Hat jemand eine Idee, wie ich so etwas realisiere?
Bin für jede Hilfe dankbar!
Danke Herbert
Ups, das ganze sollte in die Rubrik DAQ! Kann man das wohl irgendwie verschieben?
Hoffe Trotzdem, das mir jemand helfen kann!
Gruss Herbert
Schon passiert.
' schrieb:Ups, das ganze sollte in die Rubrik DAQ! Kann man das wohl irgendwie verschieben?
Hallo Herbert,
in Bezug auf Deine PN (die ich nicht beantworten konnte, vgl. Bug Report):
Leider kenne ich mit DAQ nicht so berauschend aus, da ich damit noch nichts zu tun hatte, außer mal kurz bei einem NI-Lehrgang. Aber da wird Dir schon jemand anderes weiterhelfen können.
Gruß Markus
' schrieb:Ups, das ganze sollte in die Rubrik DAQ! Kann man das wohl irgendwie verschieben?
Hoffe Trotzdem, das mir jemand helfen kann!
Gruss Herbert
Ok, danke!
Dann will ich mal weiter hoffen, dass hier jemand ne gute Idee hat!
Schönen Tag noch, Herbert
' schrieb:Ok, danke!
Dann will ich mal weiter hoffen, dass hier jemand ne gute Idee hat!
Schönen Tag noch, Herbert
hmm, also eigentlich bin ich ja für DAQ zuständig, aber ich kann mit der Aufgabenstellung irgendwie nicht so recht was anfangen.
Möchtest du auf irgendwelche Events reagieren (z.B. Button gedrückt) und dann eine bestimmten Signalverlauf auf den Kanälen ausgeben, oder sollen die Kanäle einzeln angestoßen werden?
Im Moment klingt das für mich nach einer kontinuierlichen Ausgabe mit einem vorher festgelegten Signalverlauf. Damit bekommst du das Timing am genauesten hin ...
Ok, ich versuche es nochmals etwas genauer zu beschreiben!
Also, ich habe 48 DIO. Hiermit möchte ich eine Maschine simulieren um eine Steuerung für die Maschine zu testen. Nun lese ich in einer Sequenz die Eingänge (von der Maschine) ein. Und in der folgenden Sequenz nutze ich die DIO als Ausgänge der Maschine. Nun ist es aber so, dass die Maschine (Aufgrund von mechanischen Bauteilen) träge ist und manche Ausgänge z.B. 100 Millisekunden später erst gesetzt werden. Andere allerdings kommen sofort. Ausserdem ist ein weiteres Problem, dass wenn ich 1 Sek auf die Ausgänge warte, ich ja in dieser Zeit die Eingänge nicht einlesen kann, weil ich ja in der "schreiben" Sequenz bin!
Nun ist meine Frage, wie ich diesem Problem entgegenwirken kann?!? Ich müsste pro Zyklus die Eingänge einmal einlesen und die Zykluszeit darf nicht von den Verzögerungen der Ausgänge abhängig sein!
Ich hoffe, dass ich jetzt mein Problem etwas besser beschrieben habe und wäre über eine Hilfe sehr dankbar! Sollten noch weitere Fragen sein, bitte einfach melden!
Gruss Herbert
Hi,
du solltest "Lesen" und "Schreiben" in unterschiedlichen (parallel laufenden) Schleifen unterbringen. Alternativ könntest du auch zwei unabhängig voneinander laufende VI's erstellen. Das ist aber alles nur "quasi-parallel", dein Rechner wird auf jeden Fall die unterschiedlichen Aufgaben nacheinander abarbeiten. Eine Verzögerung deiner Signale, die tatsächlich völlig unabhängig von Programmen etc. ist, die auf deinem Rechner laufen, müsste aber auf jeden Fall extern erfolgen (SPS, µC). Wenn's nicht soooo genau sein muss, sollte aber das trennen von lesen und schreiben weiterhelfen. Eine genaue zeitliche Abfolge wirst du mit den LV-eigenen Wartezeiten aber vermutlich nicht hinbekommen, weil wie gesagt ja auch andere Vorgänge auf deinem Rechner ablaufen. Funktionieren könnte das aber mit LV RT, oder evtl. mit "Timed Loops", also über die HW. Da hab ich aber keine Ahnung von...
Gruss
Achim
Nun gut, mit LV RT was zu machen hört sich ja ganz gut an. Allerdings habe ich vorher noch nie was mit RT gemacht! Kann mir jemand mal ein kleines Beispiel "stricken" in dem ich z.B. jede Millisekunde einmal die Eingänge und dann einmal die Ausgänge schalte?!?
Danke Herbert
Hallo Herbert,
Ich gehe mal davon aus, dein jetztiges Problem steht im Zusammenhang mit deiner SPS-Simulation in LV.
Wie Achim ja schon gesagt hat, sind genau Zeiten auf LV-Ebene unter Windows sowieso nicht garantiert. Wenn dir Zeiten im Raster von 25ms mit einer Genauigkeit von 10ms allerdings ausreichen, dann sollte das aber doch gehen.
Warum macht du dir in deinen simulierten SPS-Ablauf nicht einfach eine Zeit hinein? Im Prinzip ist eine Zeit nichts weiter als zwei Merker, eine Dauer und ein aktueller Wert (Zähler). Der eine Merker startet die Zeit, der andere Merker besagt, ob die Zeit abgelaufen ist. Dann gibt es ein Hindergrundprogramm, dass den Zeitablauf bearbeitet. z.B. wie folgt: Schritt 1: Startmerker gesetzt => Zähler resetten, Startmerker und Fertig-Merker löschen, wenn Zähler=0 dann Fertig-Merker setzen. Schritt 2: Wenn Zähler=0 => Zähler erniedrigen und bei Null Fertig-Merker setzen. usw.
Alles, was du brauchst - Eingänge lesen, Liste abarbeiten, Zeiten bearbeiten, Ausgänge ausgeben - sollte innerhalb von 25 ms geschehen sein. (Ich bin sogar der Meinung, dass das in 10ms gehen müsste).
Frage:
Reichen dir 25ms Raster aus oder brauchst du unbedingt eine Millisekunde? Bei einer Millisekunde bleibt dir sowieso nichts anderes übrig als ein Echtzeitsystem zu nehmen - also SPS oder LVRT.