ich bin seit wenigen wochen verantwortlicher für ein labor, in welchem mein vorgänger u.a. schrittmotoren mittels das1600 über viewdac (dos) angesteuert hatte. nun möchte ich die veraltete messtechnik aktualisieren und alles MATLAB-tauglich machen. dazu habe ich mir seine programme durchgesehen und bin dabei auf eine syntax gestoßen, mit der ich in matlab nicht weiter weiß. 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:
Code:
% Abgreifen des Eingabewertes aus dem Edit-Feld und Umwandeln in eine % Zahl
l = str2double(get(handles.input_strecke, 'String'))
% Multiplikation der Strecke in mm mit Schritten/mm ergibt Anzahl % Schritte
n = l * 316
% Schleife, welche drei 8-bit-outputs solange sendet, wie die Anzahl an % Schritten beträgt
ich wüsste gern, wie diese sendebefehle darzustellen sind. das programm viewdac stammt von mitte der 90er und hier werden nacheinander abzuarbeitende kommandos per drag&drop in ein kommandofenster gezogen und dann per häckchensetzen der ablauf festgelegt (und leider nicht, indem ich sie hintereinander schreibe). in einem durcheinander von blöcken, loops, buttons, i/o tasks...geht dann schon mal die übersicht verloren.
leider bin ich in diesem bereich absolut neu und die messtechnik ist auch nur mittel zum zweck, aber es sollte schon alles funktionieren, sonst vergraule ich mit dem dos noch die studenten (auch wenn es damit funktioniert).
Sorry, dass ich erst jetzt zum Antworten komme. Ich habe mittlerweile ein externes KUSB-Modul (Keithley Kusb3116) erhalten, mit welchem ich jetzt die Kommunikation über die gleiche Schnittstelle (37pin) versuche. Zu meinem Gerät gibt es einen DAQ-Adapter für Matlab, welchen ich gern nutzen möchte. Er nennt sich 'dtol'. Nun hätte ich gern obiges Senden vorgenommen. Begonnen habe ich wie folgt:
Code:
clc
dio = digitalio('dtol', 0);
hline = addline(dio, 0:2, 1, 'out');
vorlauf = 10;
schritte = 316 * 10;
for i =1:schritte
putvalue(dio.Line(1:3), [080]) end
Es funktioniert noch nicht. Ich beschäftige mich erst seit kurzem mit derartigen Ansteuerungen und bin für jede Hilfe dankbar, da ich es beruflich benötige. Kann mir da jemand helfen?
Meinen Code habe ich mittlerweile etwas abgeändert in:
Code:
clc clearall if(~isempty(daqfind))
stop(daqfind) end % Erzeugen eines digitalen I/O-Objektes mit dem verwendeten % KUSB-Matlab-Adapter und einer ID
dio = digitalio('dtol', 0)
% Zuordnung von Hardware-Zeilen zum Digitalen Objekt; addline(obj, ID der % Hardwarelines, Richtung "in" oder "out", Port 0 oder 1)
a = addline(dio, 0:3, 1, 'Out')
% Vorschub in mm
Vorschub = 10;
% Schrittzahl
Schritte = 316 * Vorschub;
Um die 8-bit-Outputs einzubeziehen (was in dem vorher geposteten Beispiel gar nicht passierte) müsste man es so machen. Es muss immer so viele lines wie binvec-Elemente geben.
Es dauert außerdem sehr lange, bis die for-Schleife durchgearbeitet ist. Gibt es da einen schnelleren Weg? Leider reagiert der Motor trotzdem noch nicht.
% Registering the Hardware Driver Adaptor
daqregister('C:/Programme/Keithley Instruments/DAQAdaptorforMATLAB/dtol.dll');
% Erzeugen eines digitalen I/O-Objektes mit dem verwendeten % KUSB-Matlab-Adapter
dio = digitalio('dtol');
% Definieren des Outputkanals für Drehrichtung (Pin 23 am DIO)
addline(dio, 3, 1, 'Out');
% Definieren des Outputkanals für Takt (Pin 35 am DIO)
addline(dio, 15, 1, 'Out');
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
Nun meine Frage, wie kann ich die Zeit festlegen, wie lange high bzw. low anliegen soll? Kann ich in irgendeiner Art meine Sendefrequenz ändern, also etwas schnelleres, als meine Schleife generieren?
Kannst du den ganzen Spaß auch auf C ummünzen? Für solche Schleifenanwenungen, wird nicht ungern eine Mex function geschrieben, das Matlab for Schleifen recht langsam sind. Wer von der C-Sprache zu matlab gewechselt ist, hat nicht selten viel Langeweile beim Programm testen .
danke für deine Antwort. Leider habe ich noch nie mit C gearbeitet. Dass die for-Schleifen in Matlab sehr langsam sind (while ist hier noch langsamer), habe ich auch immer wieder gelesen, aber ich wusste mir nicht anders zu helfen.
Gerade versuche ich es mit einer "TimerFcn", deren "TimerPeriod" für
[...]beim KUSB-3116 sind die DIOs 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?
Elapsed time is 0.059130 seconds.
Elapsed time is 0.012051 seconds.
Elapsed time is 0.009513 seconds.
Elapsed time is 0.008875 seconds.
Elapsed time is 0.009159 seconds.
Elapsed time is 0.008862 seconds.
Elapsed time is 0.009038 seconds.
Elapsed time is 0.008853 seconds.
Elapsed time is 0.008920 seconds.
Elapsed time is 0.008971 seconds.
Elapsed time is 0.009042 seconds.
Elapsed time is 0.009089 seconds.
Elapsed time is 0.008960 seconds.
Elapsed time is 0.008939 seconds.
Elapsed time is 0.009027 seconds.
Elapsed time is 0.009154 seconds.
Elapsed time is 0.009122 seconds.
Elapsed time is 0.008856 seconds.
Elapsed time is 0.009163 seconds.
Elapsed time is 0.009103 seconds.
wohingegen
Code:
for n = 1:10 tic
putvalue(pin22, 1)% 4 senden an 1792 (Takt, steigende Flanke rechtes Modul) toc tic
putvalue(pin22, 0)% 0 senden an 1792 (Takt, fallende Flanke rechtes Modul) toc end
Elapsed time is 0.003339 seconds.
Elapsed time is 0.004292 seconds.
Elapsed time is 0.003527 seconds.
Elapsed time is 0.003851 seconds.
Elapsed time is 0.003410 seconds.
Elapsed time is 0.004553 seconds.
Elapsed time is 0.003560 seconds.
Elapsed time is 0.004242 seconds.
Elapsed time is 0.003474 seconds.
Elapsed time is 0.004394 seconds.
Elapsed time is 0.003376 seconds.
Elapsed time is 0.004112 seconds.
Elapsed time is 0.003521 seconds.
Elapsed time is 0.003545 seconds.
Elapsed time is 0.003536 seconds.
Elapsed time is 0.004221 seconds.
Elapsed time is 0.003494 seconds.
Elapsed time is 0.004262 seconds.
Elapsed time is 0.003441 seconds.
Elapsed time is 0.004225 seconds.
liefert.
Hat nun vielleicht noch jemand eine Idee zur weiteren Beschleunigung? Geht es eventuell in einem Schritt, ähnlich dem hier (es funktioniert auch, dauert allerdings länger, als meine vorhergehende Variante):
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.