Verfasst am: 07.12.2011, 08:50
Titel: Ansteuerung DIO ME 4670i
Liebe Leute,
ich habe für mein Labor vor Kurzem eine Mess- und Steuerkarte von Meilhaus electronic gekauft, Typ ME4670i (PCIe). Mit dieser möchte ich gern Schrittmotoren einer Traversierung ansteuern ("Sende 1 und 0 in einer Schleife an Pin x!"). Bevor ich die Bestellung auslöste, erkundigte ich mich beim Vertrieb, ob die Karte mit Matlab angesteuert werden kann, was bejaht wurde. Nun habe ich die Karte und bei meinen Matlab-Rückfragen wurde mir mitgeteilt, dass der für die Treiberprogrammierung zuständige Mitarbeiter inzwischen nicht mehr in der Firma ist. Ich wollte die Karte aber in meine vorhandene Matlab-Applikation integrieren. (Eine Rücksendung kommt aus verwaltungstechnischer Sicht nicht in Frage.)
Soweit zum Vorwort. Nun habe ich mich mit der Syntax beschäftigt und es hinbekommen, dass erste Funktionen laufen. Nur die beiden wichtigsten verstehe ich nicht. Unter
könnt ihr das Handbuch zur Programmierung einsehen (in C#). Dort auf Seite 104 - 114 werden die beiden Funktionen (meIOSingleConfig und meIOSingle)) beschrieben, die ich für das DIO benötige. Leider verstehe ich nicht ganz, wie diese zu bestücken sind.
Meine bisheriges Testscript sieht so aus:
Code:
%% ACHTUNG! ZUR KORREKTEN AUSFÜHRUNG DARF DAS POWER LAB3 NICHT GESTARTET
%% SEIN!
% Anzahl der vom Treibersystem erkannten Geräte (hier: 1 ) [err, NoDev] = meIDS.meQueryNumberDevices();
if NoDev == 0 return;
end
% Funktion ermittelt den Index des ersten verfügbaren Subdevices, das dem % gesuchten Typ entspricht (hier: DIO, also Subdevice 2). Die Suche beginnt stets bei dem Subdevice mit dem Index <iStartSubdevice>
iDev = NoDev-1;
[err, iSubDev] = meIDS.meQuerySubdeviceByType(iDev, 0, meIDS.ME_TYPE_DIO, meIDS.ME_SUBTYPE_SINGLE);
if err ~= 0 return;
end
% Funktion ermittelt die Anzahl der Kanäle eines Subdevice (hier: 8 ) [err, Anzahl_Kanaele_Subdevice] = meIDS.meQueryNumberChannels(iDev,iSubDev);
% Subdevice wird rückgesetzt (setzt DIO auf "Eingang")
err = meIDS.meIOResetSubdevice(iDev, iSubDev, meIDS.ME_IO_RESET_DEVICE_NO_FLAGS);
if err ~= 0 return;
end
% PIN zur Taktgebung des Schrittmotors M1 auf Kanal 7
Channel_Takt_M1 = 7;
% Konfigurieren des DIO Subdevices
meIDS.meIOSingleConfig(iDev, iSubDev, Channel_Takt_M1, meIDS.ME_SINGLE_CONFIG_DIO_OUTPUT, meIDS.ME_REF_NONE, meIDS.ME_TRIG_CHAN_DEFAULT, meIDS.ME_TRIG_TYPE_SW, meIDS.ME_VALUE_NOT_USED, meIDS.ME_IO_SINGLE_CONFIG_NO_FLAGS)
%%Bis hierhin funktioniert es, aber ab hier weiß ich nicht weiter
% Erstellung eines structs mit zwei Zeilen, welche 1 und 0 enthalten
meIOSingle_t = {iDev, iSubDev, Channel_Takt_M1, meIDS.ME_DIR_OUTPUT, 1, meIDS.ME_VALUE_NOT_USED, meIDS.ME_IO_SINGLE_TYPE_NO_FLAGS, 0; iDev, iSubDev, Channel_Takt_M1, meIDS.ME_DIR_OUTPUT, 0, meIDS.ME_VALUE_NOT_USED, meIDS.ME_IO_SINGLE_TYPE_NO_FLAGS, 0}
for n = 1:100 [err] = meIDS.meIOSingle(meIOSingle_t, {10}, 2, meIDS.ME_IO_SINGLE_NO_FLAGS);
end
Die Frage "Kann man diese Karte mit MATLAB benutzen" ist ebenso kritsch wie die entsprechenden Antworten.
Es gibt verschiedene Produkte von MathWorks, die mit Hardware arbeiten, z.B. die Data Acquisition Toolbox. Zu diesen den anderen Produkten gibt es jeweils einen WebLink zu unterstützter Hardware:
Es ist also jetzt die Frage welches Produkte hier eingesetzt wird. Selber so was zu schreiben kann SEHR aufwändig sein. Da würde ich eher in Erwägung ziehen die Hardware zurückzugeben.
vielen Dank für deine Antwort. Es gibt ja einen Treiber für Matlab und ich habe ja den Großteil der Funktionen bereits zum Laufen bekommen (z. B. meIDS.meQueryNumberChannels() oder meQuerySubdeviceByType() ). Nur ist mir unklar, was es mit dem ersten Parameter der Funktions-Deklaration:
Zitat:
int meIOSingle(meIOSingle_t *pSingleList, int iCount, int iFlags)
auf sich hat.
Wie setze ich das in Matlab um?
Die Firma schrieb mir hierzu:
Zitat:
In Zeile 35 Ihres Scripts initialisieren Sie eine Liste (ein Array meIOSingle_t) mit 2 Elementen.
Jetzt müssen Sie der Funktion meIOSingle dieses Array übergeben. Das wird mit einem Zeiger erledigt. Das heißt, die Funktion meIOSingle im ME-iDS bekommt die Adresse auf das Array übergeben. In der Datei meIDS.m wird die Ermittlung der Adresse auf das Array mit der Matlab-Funktion libpointer erledigt (ab Zeile 481 bis 499).
Leider verstehe ich das mit den Zeigern nicht. Kann mir diesbezüglich jemand helfen? Ich scheine kurz vor dem Abschluss zu stehen.
sorry, ich war jetzt schon lange nicht mehr hier. ich poste mal folgenden code, mit dem es damals m. e. funktionierte, habe aber gerade nicht die möglichkeit, es zu testen:
Code:
%% ACHTUNG! ZUR KORREKTEN AUSFÜHRUNG DARF DAS POWER LAB3 NICHT GESTARTET
%% SEIN! format long
clc;
meIDS.meOpen(meIDS.ME_OPEN_NO_FLAGS);
% Anzahl der vom Treibersystem erkannten Geräte (hier: 1) [err, NoDev] = meIDS.meQueryNumberDevices();
if NoDev == 0 return;
end
% Funktion ermittelt den Index des ersten verfügbaren Subdevices, das dem % gesuchten Typ entspricht (hier: DIO, also Subdevice 2). Die Suche beginnt stets bei dem Subdevice mit dem Index <iStartSubdevice>
iDev = NoDev-1;
[err, iSubDev] = meIDS.meQuerySubdeviceByType(iDev, 0, meIDS.ME_TYPE_DIO, meIDS.ME_SUBTYPE_SINGLE);
if err ~= 0 return;
end
% Funktion ermittelt die Anzahl der Kanäle eines Subdevice (hier: [err, Anzahl_Kanaele_Subdevice] = meIDS.meQueryNumberChannels(iDev,iSubDev);
% Subdevice wird rückgesetzt (setzt DIO auf "Eingang")
err = meIDS.meIOResetSubdevice(iDev, iSubDev, meIDS.ME_IO_RESET_DEVICE_NO_FLAGS);
if err ~= 0 return;
end
% Funktion ermittelt die besonderen Eigenschaften eines Subdevices, welche % im Parameter <piCaps> der Funktion meQuerySubdeviceCaps() zurückgegeben werden.
%piCaps = 2(eigentlich hexadezimal 0x00000002 bedeutet: Richtung je Byte (8bit Block) konfigurierbar
[err, piCaps] = meIDS.meQuerySubdeviceCaps(iDev, iSubDev)
% PIN zur Taktgebung des Schrittmotors M1 auf Kanal 7
Channel_Takt_M1 = 7;
% Schleife mit Schreibbefehl von 1 und 0 im Wechsel for n = 1:20 [err, pSingleList] = meIDS.meIOSingle(meIOSingle_t, 1, meIDS.ME_IO_SINGLE_NO_FLAGS)
wait(0.001) [err, pSingleList] = meIDS.meIOSingle(meIOSingle_t, 2, meIDS.ME_IO_SINGLE_NO_FLAGS)
wait(0.001) end
bitte melde dich, ob es bei dir gefunzt hat. wenn nicht, muss ich im labor nochmal nachprüfen.
beste grüße
pfeili
Einstellungen und Berechtigungen
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.