08.04.2011, 20:34
Beitrag #1
|
Tobs
LVF-Grünschnabel
Beiträge: 17
Registriert seit: Mar 2011
2010
2010
EN
|
Signal in "echtzeit" in eine lokale Variable schreiben.
Hallo liebes Forum,
ich habe ein Programm geschrieben welche ein analoges Spannungssignal einliest, es verarbeitet und einen 1Bit digitalen Wert wieder ausgibt. Das Einlesen und das Ausgeben der Werte habe ich momentan mit dem DAQ assistent realisiert und jeweils das ein und auslesen in zwei while schleifen gepackt wo der DAQ assistent lediglich die Daten in eine lokale Variable schreibt bzw. aus einer lokalen Variable liest. Die beiden DAQ assistent sind auf (1 Sample (on demand)) eingestellt. Die Schleifen sollten also so schnell wie moeglich durchlaufen und immer einen neuen Wert in die lokalen Variablen schreiben bzw. lesen
Da mein Programm sehr schnell laufen muss habe ich die Zeiten fuer einen Schleifendurchlauf gemessen. Dieser liegt jeweis bei ca. 2ms, was noch wesentlich zu langsam ist.
Ich habe die Karte NI PCIe-6321. Diese sollte im Stande sein mit 250 kS/s pro 16 Kanaele ein analoges Signal zu erfassen und mit 1 MHz ein digitales Signal auszugeben. Die Hardware muesste also schnell genug sein.
Ich habe auch schon versucht herauszufinden wie der DAQ asisstent funktioniert um ihn zu vereinfachen, allerdings hat das nicht viel gebraucht.
Wie kann ich die Daten in "echtzeit" in mein Labviewprogramm in eine lokale Variable schreiben?
Danke schonmal.
Tobs
|
|
|
09.04.2011, 20:29
Beitrag #2
|
|
|
11.04.2011, 08:43
Beitrag #4
|
IchSelbst
LVF-Guru
Beiträge: 3.689
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
RE: Signal in "echtzeit" in eine lokale Variable schreiben.
(08.04.2011 20:34 )Tobs schrieb: ich habe ein Programm geschrieben welche ein analoges Spannungssignal einliest, es verarbeitet und einen 1Bit digitalen Wert wieder ausgibt.
Das ist eine Regelung.
Das wird in ganz normalem LabVIEW nicht funktionieren. Nicht weil du lokale Variablen verwendest, sondern weil ein PC-System für sowas nicht geeignet ist. Hier stören dich so Sachen wie Betriebssystem (Multitasking, Prozesslevel etc) viel, viel mehr. Regeln kann man nur mit den geeigneten Mittels. Für dich geeignet wäre möglicherweise ein Echtzeitsystem oder noch besser eine Hardware-Lösung.
(11.04.2011 00:09 )Tobs schrieb: Hier das Problem:
Hast du mal ausgerechnet, welche Genauigkeit in µs du haben willst?
Eine Möglichkeit sehe ich schon:
Wenn die Motordrehzahl feststeht (und konstant ist), kannst du parallel zur Ausgabe der Motor-PWM auch das Lasersignal ausgeben. Du musst ja nicht unbedingt eine Regelung für den Laser nehmen. Du kannst ja auch durch eine mathematische Berechnung festlegen, zu welchen Zeiten der Laser eingeschaltet werden muss. Da du das Tiefpassverhalten des Motor kennst, kannst du vorhersagen, zu welcher Zeit welcher Winkel anliegt. Dann kannst du einen digitalen Datenstream ausgeben lassen, was durch eine entsprechende Karte auch in einem PC möglich ist.
Diese Berechnung ist zwar nicht trivial, aber besser als mit Software-Regelung.
Eine richtige Regelung ist natürlich vorzuziehen - geht aber wohl nur mit entsprechender Hardware.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
12.04.2011, 08:07
Beitrag #6
|
IchSelbst
LVF-Guru
Beiträge: 3.689
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
RE: Signal in "echtzeit" in eine lokale Variable schreiben.
(11.04.2011 23:17 )Tobs schrieb: Eine Hardwareloesung moechte ich erstmal noch nicht in betracht ziehen, solange ich nicht meine resorcen bis jetzt ausgeschoepft habe.
Bedenke aber (bereits im voraus), dass du viel Potential verschwendet haben wirst, wenn du später doch auf eine hardwarenähere Variante umsteigst.
Zitat:"streaming output"
Genau.
Theorie:
Auch ein Output, Kanal genannt, ist immer an ein Sampleraster gebunden. Wenn zu z.B. ein Raster von 10µs festlegst, macht das pro Sekunde 1E5 Werte (pro Kanal), die ausgegeben werden müssen. Diese Werte ergeben sich aus einer mathematischen Berechnung. Da beide Kanäle synchron laufen sollen, brauchen sie den selben Startzeitpunkt, das selbe Raster und die selbe Länge (und umgekehrt: haben sie alles drei gleich, laufen sie synchron). Durch entsprechende Mechanismen kann man einen Datensatz wiederholen lassen. D.h. die einmal für z.B. 1 Sekunde berechneten Werte gelten für alle weiteren Sekunden.
Erster Schritt zur Praxis:
In deinem Falle würde ich jetzt folgendes überlegen: Das Signal für den Laser ist ein digitales und das für den Motor auch. Du könntest also beide Kanäle in eine Task legen. Das hat den Vorteil: Es gibt nur eine Task und alles, was in einer Task liegt, läuft mit dem selben Raster. (Es ginge auch mit zwei Tasks. Nachteil: zwei Tasks, die auch noch synchronisiert werden müssen, was aber geht.)
Zweiter Schritt:
Raster festlegen. Reichen 2ms aus, so wage ich zu behaupten, dass die Samples mit einer While-Loop auf Applikationsebene ausgegeben werden können. Vorteil: Eine einfache Karte ist ausreichend. Liegt die Auflösung besser als 1000µs, muss du wohl eine Karte verwenden, die einen entsprechend großen Puffer hat. Die beiden Kanäle werden dann in die Karte geschrieben und die Karte übernimmt die schnelle Ausgabe (das geht dann aber bis zur maximalen Abtastrate).
...
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
12.04.2011, 09:43
(Dieser Beitrag wurde zuletzt bearbeitet: 12.04.2011 11:27 von Lucki.)
Beitrag #7
|
Lucki
Tech.Exp.2.Klasse
Beiträge: 7.699
Registriert seit: Mar 2006
LV 2016-18 prof.
1995
DE
01108
Deutschland
|
RE: Signal in "echtzeit" in eine lokale Variable schreiben.
Habe mir den Thread mal angesehen. Ich sehe hier nirgendwo eine Regelung.
Es laufen hier zwei unabhängige Aufgaben:
- Die Bewegung des Motors.
Hierzu wird einfach eine Rechteckspannung auf den Motor gegeben, wegen der Trägheit führt das zu einer annähernd sinusförmigen Bewegung. Der vorhandene Positionssensor wird nicht dazu benutzt, die Position zu kontrollieren. Unklar ist, wie man das langsame Wegdriften der Position verhindern will. Das ist ein zweifach integrierendes System ( 1. Integration: Motorstrom --> Drehzahl, 2. Integration: Drehzahl --> Winkelposition). Es handelt sich hier um keine Regelung. Und wegen der fehlenden Regelung wird die Position unvermeidlich driften.
- Ein-und Ausschalten des Lasers.
Bei bestimmten Positionen, gemessen mit dem Winkelencoder, soll der Laser ein- oder ausgeschalten werden. Das hat ebenfalls nichts mit eine Regelung zu tun. Hier ist lediglich eine schnelle und deterministische Reaktion gefragt, die allerdings mit dem normalen Windows-Labview eher nicht zu schaffen ist.
Das ganze Problem ist übrigens 1000fach gelöst, es gibt Firmen, die von Laserscannern leben. Als Motore dienen hier Galvanometer mit angeflanschtem Spiegel. Ein solches Galvanometer ist ein DC-Motor ohne Kommutator, der sich nur im Winkelbereich von typisch +- 22.5 deg drehen kann.
|
|
|
12.04.2011, 17:08
Beitrag #8
|
Tobs
LVF-Grünschnabel
Beiträge: 17
Registriert seit: Mar 2011
2010
2010
EN
|
RE: Signal in "echtzeit" in eine lokale Variable schreiben.
Besten Dank nochmal fuer eure Antworten!
(12.04.2011 08:07 )IchSelbst schrieb: Erster Schritt zur Praxis:
In deinem Falle würde ich jetzt folgendes überlegen: Das Signal für den Laser ist ein digitales und das für den Motor auch.
Ok... das hab ich erstmal so verstanden. Allerdings habe ich fuer den Motor ein analoges und fuer den Laser ein digitales (an/aus) Signal. Geht das dann auch so? Ich kann wenn es sein muss aber auch mit einem analogen Ausgang ein TTL Signal erzeugen, dass dann vom Laser wie ein digitales gewertet wird. Oder ist das dann langsamer? Der Laser muss naemlich wesentlich schneller geschaltet werden als der Motor!
(12.04.2011 09:43 )Lucki schrieb: Bei bestimmten Positionen, gemessen mit dem Winkelencoder, soll der Laser ein- oder ausgeschalten werden. Das hat ebenfalls nichts mit eine Regelung zu tun. Hier ist lediglich eine schnelle und deterministische Reaktion gefragt, die allerdings mit dem normalen Windows-Labview eher nicht zu schaffen ist.
Also kommt vermutlich doch nur der „Streaming output“ in Frage wenn ich Labview weiter verwenden moechte?!?
(12.04.2011 09:43 )Lucki schrieb: Das ganze Problem ist übrigens 1000fach gelöst, es gibt Firmen, die von Laserscannern leben. Als Motore dienen hier Galvanometer mit angeflanschtem Spiegel. Ein solches Galvanometer ist ein DC-Motor ohne Kommutator, der sich nur im Winkelbereich von typisch +- 22.5 deg drehen kann.
Genau. Das ganze ist nur auf eine etwas spezifischere Anwendung ausgelegt... naemlich auf ein Lasermicroskop wo die Optic noch etwas aufwendiger ist. Der einfachheithalber hab ich das bis jetzt noch nicht geschrieben.
Wer es genau wissen moechte:
Ich verwende auch eine Galvanometer mit angeflanschtem Spiegel zum scannen. Da man einen Laser auch nicht einfach so schnell aus und an schalten kann wird statdessen die Amplitude mithilfe eines Akustooptischen Modulators (AOM) moduliert. Ich schalte also mit Labview nicht direkt den Laser An und Aus, sondern den AOM, der dann den Laser fuer mich An und Aus schaltet. Am Ende soll eine gitterfoermige Beleuchtung einer Biologischen Probe mit einer Gitterkonstatnte von ca. 10 µm herauskommen bei dem ich die Phase, die Gitterkonstante und den prozentualen Anteil der Beleuchtung einstellen kann. Das alles soll dazu dienen die Aufloesung eines 3D Lichtschichtmikroskopes zu verbessern.
Danke.
Tobs
|
|
|
12.04.2011, 17:28
Beitrag #9
|
IchSelbst
LVF-Guru
Beiträge: 3.689
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
RE: Signal in "echtzeit" in eine lokale Variable schreiben.
(12.04.2011 17:08 )Tobs schrieb: Allerdings habe ich fuer den Motor ein analoges und fuer den Laser ein digitales (an/aus) Signal.
Hab ich da was falsch interpretiert?
Wer steuert denn den Motor an? Machst du das von LabVIEW aus oder ist das komplett extern?
Ich bin bisher davon ausgegangen, dass du den Motor von LV aus ansteuerst. Nur dann wäre es machbar, wie ich es beschrieben habe: Nur wenn du das Motoransteuersignal kennst, würdest du auch den Laser ansteuern können - beide sollen ja synchron laufen. (Kennst du die MotorANSTEUERUNG nicht, musst du natürlich die aktuelle MotorPOSITION einlesen, um den Laser zu steuern).
Hast du denn jetzt mal eine Berechnung gemacht, wie genau die Steuerung des Lasers sein muss? Bei einer Ungenauigkeit von 100µs würde ich einer PC-Lösung ja noch verstehen. Bei 10µs erlaubter Ungenauigkeit würde ich aber zu einer Hardware-Lösung raten.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
12.04.2011, 18:01
|
Tobs
LVF-Grünschnabel
Beiträge: 17
Registriert seit: Mar 2011
2010
2010
EN
|
RE: Signal in "echtzeit" in eine lokale Variable schreiben.
Ich habe uebrigens diese Karte hier...
http://sine.ni.com/nips/cds/view/p/lang/en/nid/207405
Kann ich da ueberhaupt das streaming machen?
Besten Dank.
Tobias
|
|
|
| |