Forum: Digitale Signalverarbeitung / DSP / Machine Learning Matlab: for-Schleife beschleunigen


von pfeili (Gast)


Lesenswert?

Liebe Leute,

ich bin seit wenigen Monaten Verantwortlicher für ein Labor, in welchem 
mein Vorgänger Schrittmotoren mittels DAS1600-Karte (Firma Keithley) 
über das Programm Viewdac (DOS) angesteuert hatte. Nun möchte ich die 
Messtechnik aktualisieren und alles MATLAB-tauglich machen. Dazu habe 
ich mir das KUSB3116 von Keithley angeschafft, seine Programme 
durchgesehen und versucht in Matlab zu übertragen. Es geht um das Senden 
von 8bit-Output in einer Schleife. Ich gebe vielleicht gleich mal ein 
beispiel an, welches in der callback eines start-pushbuttons auftauchen 
sollte:
1
if (~isempty(daqfind))
2
    stop(daqfind)
3
end
4
5
% Registering the Hardware Driver Adaptor
6
daqregister('C:/Programme/Keithley Instruments/DAQAdaptorforMATLAB/dtol.dll');
7
8
% Erzeugen eines digitalen I/O-Objektes mit dem verwendeten
9
% KUSB-Matlab-Adapter
10
dio = digitalio('dtol');
11
12
% Definieren des Outputkanals für Drehrichtung (Pin 23 am DIO)
13
addline(dio, 3, 1, 'Out');
14
% Definieren des Outputkanals für Takt (Pin 35 am DIO)
15
addline(dio, 15, 1, 'Out');
16
17
% Winkel abgreifen
18
winkel = str2double(get(handles.rotedit, 'String'));
19
20
% Schrittzahl
21
schritte = 32 * winkel;
22
23
% Drehrichtung ändern
24
putvalue(dio.line(1), 1)
25
26
for n =1:schritte
27
    putvalue(dio.line(2), 1)        % Takt, steigende Flanke (high)
28
    putvalue(dio.line(2), 0)        % Takt, fallende Flanke (low)
29
end
30
31
delete (dio);
32
clear dio;

Der angesprochene Schrittmotor dreht in die entsprechende Richtung, aber 
im Vergleich zur DOS-Ansteuerung zu langsam. Nun habe ich sowohl bei der 
DOS-Ansteuerung als auch bei meinem Matlab-Programm mit dem Oszi die 
Sendesignale (Rechteckimpulse) gemessen und festgestellt:

- beim Matlab-Skript: 4.5ms high und 4.5ms low-Signale
- im Vergleich dazu beim DOS-Programm: 2ms high und nur 0.8ms 
low-Signale ("Nadelimpulse")

Nun meine Frage, wie kann ich die Zeit festlegen, wie lange high bzw. 
low anliegen soll? Kann ich in irgendeiner Art meine Sendefrequenz 
erhöhen, also etwas schnelleres, als meine Schleife generieren?

Für Unterstützung wäre ich sehr dankbar.

Mit freundlichen Grüßen

Felix Rothe

von lowlevel (Gast)


Lesenswert?

Halli Hallo,

das könnte schwer werden, da du in deiner momentanen schleife keinerlei 
timing drin hast. Also keine wartezeit zwischen den ausgaben. das heisst 
das der treiber mit seiner max. geschwindigkeit arbeitet und das sind 
4.5ms. da müsstest du mal schauen wie der treiber genau arbeitet.

Gruß Stephan Storm ;-D

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo!

Matlab ist kein Echtzeit-System. Unter DOS sah die Lage etwas anders 
aus, da ein Programm da mangels Multitasking die CPU für sich alleine 
hatte. Wenn Du das Echtzeitfähig machen willst, sehe ich nur 2 Lösungen:
1.) Matlab xPC Target auf einem Slave-PC verwenden
2.) Eine externe Hardware (µC) einsetzen, die du über eine DLL aus 
Matlab ansprechen kannst.

Lösung 1 dürfte ausserhalb von Universitäten schon an den Lizenzkosten 
scheitern, falls die entsprechenden Toolboxen nicht schon vorhanden 
sind. Lösung 2 erfordert u.U. etwas mehr Programmierkenntnisse. Aber die 
scheinen ja vorhanden zu sein.

Ich habe wärend meiner Zeit an der RWTH Treiber für den Einsatz von 
Adlink DAC/ADC-Karten für xPC entwickelt, würde aber trotzdem Lösung 2 
bevorzugen. Für Labview haben wir hier schon für einen Kunden eine 
Wrapper-DLL gebaut, die den Zugriff auf unseren 
USB-Schrittmotorcontroller so gekapselt hat, dass man das Ding unter 
Labview ansteuern kann.

Mit freundlichen Grüßen
Thorsten Ostermann

von pfeili (Gast)


Lesenswert?

Danke für eure Anworten.

@Stephan: Wo genau kann ich das einsehen? Was kann ich daran ändern? 
Scheinbar sind 4.5ms wirklich das höchste der Gefühle, obwohl mir das 
unerklärlich ist: ein 3,4 GHz Prozessor mit 2 GB Ram verliert gegen 
einen Dos-Rechner mit vielleicht 33 MHz und 16 MB RAM.

@Thorsten: Was kannst du mir für MikroController empfehlen. Ich habe 
mich schon mal auf eurer HP umgesehen, habe aber keine Erfahrungen mit 
MikroControllern. Problem ist natürlich (wie überall) das beschränkte 
Budget. Kaufen könnte man alles, aber ich muss eben aus der vorhandenen 
Technik das Beste herausholen. Ich könnte ja auf Dos-Ebene 
weiterarbeiten, halte das allerdings in heutiger Zeit für umständlich. 
Es schreckt die Studenten wahrscheinlich teilweise sogar ab. ;)

Für eure Antworten bin ich euch sehr dankbar.

Beste Grüße

pfeili

von Artur R. (artur2000)


Lesenswert?

Versuch mal im Taskmanager den Matlab Task die Priorität "Echtzeit" 
einzustellen.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Das Problem ist nicht die for-Schleife, die ist mehr als schnell genug, 
sondern der DLL-Aufruf bzw. das was die DLL tut.

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo Pfeili!

Welchen Controller du nimmst ist eigentlich egal. Es reicht ja, wenn der 
eine serielle Schnittstelle und ein paar I/Os hat. Da tut's jeder kleine 
AVR, PIC oder 8051 (wenn man sich die noch antun will).

Mit freundlichen Grüßen
Thorsten Ostermann

von pfeili (Gast)


Lesenswert?

Hallo Leute,

danke wiederum für eure Antworten.


@Artur: Das habe ich schon probiert, brachte jedoch keinen Erfolg.

@Andreas: Habe ich eine Chance daran etwas zu ändern bzw. die DLL zu 
beschleunigen?

@Thorsten: Danke. Ich schau mich mal um.


Beste Grüße

pfeili

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Also in Ubuntu mit RTAI Kernelmodul kann man Schrittmotoren gerade so 
ansteuern, allerdings direkt über den Parallelport. Ich schaffe damit an 
meinem PC eine Taktfrequenz von 36kHz für die Schrittsignale (hab danach 
noch einen Schrittmotorcontroller). Unter Windows kann ich mir nicht 
vorstellen, dass das auch nur ansatzweise funktionieren kann. Niemand 
garantiert einem dort die zeitnahe Ausführung von Prozessen.

Das nächste Problem ist, dass USB nicht dafür gedacht ist und viele 
Treiber nur auf Millisekundenbasis Blöcke senden.

Eine Lösung mit externem Mikrocontroller ist dagegen sehr einfach, 
solange man das Niveau der Datenübertragung vom PC dorthin hoch hält. 
Damit meine ich z.B. Anfragen wie "fahre Position 32Grad mit 
Maximalgeschwindigkeit 50Grad/Sekunde und Rampen von 25Grad/Sekunde² an"

Grüße,

Peter

von Thorsten Ostermann (Gast)


Lesenswert?

Hallo Peter!

Das geht unter Windows auch. Allerdings muss man dann, ähnlich wie bei 
RT-Linux, dem Windows-Kernel einen echtzeitfähigen Scheduler 
unterschieben. Kommerzielle CNC-Programme, die das so machen, sind 
WinPCNC (light/economy) und Mach3. Andere Anbieter setzen dagegen auf 
externe µC, z.B. bei pcdreh für Windows.

Mit freundlichen Grüßen
Thorsten Ostermann

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Das mit dem Echtzeit-Scheduler unter Windows hab ich noch nicht gewusst.
Trotzdem kann ich mir nicht vorstellen, dass das über eine GPIO-Karte, 
die über USB angeschlossen ist, flüssig funktioniert. Da müsste der 
USB-Treiber auch noch echtzeitgeeignet sein.

Grüße,

Peter

von pfeili (Gast)


Lesenswert?

Hallo Leute,

hier einmal die Antwort vom Hersteller:

"[...]beim KUSB-3116 sind die DIO’s rein Software gesteuert. Es gibt 
leider keine Möglichkeit diese schneller anzusteuern, als über eine 
Softwareschleife. Eine Taktvorgabe ist also nicht möglich. Das die 
Ansteuerung über DOS schneller ist, liegt einfach daran das DOS deutlich 
weniger Ressourcen beansprucht als Windows. Folge: Schleifen laufen 
deutlich schneller .[...]"

Diese Antwort stimmt mich natürlich nicht optimistisch. Scheinbar kann 
ich mich davon verabschieden, die Schrittmotoren auf diese Weise 
ordentlich angesteuert zu bekommen, was mich den enormen 
Anschaffungspreis des Geräts sehr in Frage stellen lässt. Natürlich kann 
ich das Gerät für andere Sachen gut gebrauchen, aber ich dachte eben, 
dass ich damit flexibel an verschiedenen Versuchsständen arbeiten kann.

Wäre ich mit einer PCI-DIO-Variante besser gekommen, also würde sie 
schneller arbeiten?

Hat noch jemand eine Idee? Kann ich die DLL evtl. noch beschleunigen?

Beste Grüße

pfeili

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo Pfeili!

Mit einer PCI-I/O Karte sollte das deutlich schneller gehen. Echte 
Echtzeit (sprich Frequenzen im 2-stelligen kHz Bereich und niedrigen 
Jitter) wirst du aber auch damit nicht hinbekommen. Schau mal bei 
Acceed.de, die haben solche Karten, die zu den guten alten 8255 
kompatibel sind. Mit den Karten von Adlink (z.B. PCI-7224) habe ich auch 
gute Erfahrungen gemacht, auch mit xPC Target.

Alternativ geht es weiterhin über USB, aber dann mit high-level 
Fahrbefehlen. Da hätte ich ein passendes Produkt für bis zu 4 Achsen 
incl. DLL im Programm. Bitte melde Dich bei Bedarf, eine 
Matlab-Anwendung haben wir bisher noch nicht gemacht, das wäre eine 
schöne Referenz.

Mit freundlichen Grüßen
Thorsten Ostermann

von l0wside (Gast)


Lesenswert?

pfeili schrieb:
> Liebe Leute,
>
> ich bin seit wenigen Monaten Verantwortlicher für ein Labor, in welchem
> mein Vorgänger Schrittmotoren mittels DAS1600-Karte (Firma Keithley)
> über das Programm Viewdac (DOS) angesteuert hatte. Nun möchte ich die
> Messtechnik aktualisieren und alles MATLAB-tauglich machen. Dazu habe
> ich mir das KUSB3116 von Keithley angeschafft, seine Programme
> durchgesehen und versucht in Matlab zu übertragen.

Warum belässt Du nicht den alten PC und machst nur die Drehzahl- bzw. 
-richtungsvorgabe in Matlab? Läuft ungefähr auf die µC-Lösung hinaus und 
braucht minimal bis keine Zusatzhardware/Bastelei. Ist nur ein bisschen 
groß und "unmodern".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.