Grundlegender Zugriff auf IO-Warrior 56 (oder 40) aus C++

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
daniel2009
Posts: 9
Joined: Tue Feb 28, 2012 9:10 am

Grundlegender Zugriff auf IO-Warrior 56 (oder 40) aus C++

Post by daniel2009 »

Mahlzeit!

Nachdem ich total gescheitert bin, stelle ich hier das Codebeispiel von Herrn Jung ein, dass er mir freundlicherweise per Email zukommen lassen hat:

Zwischen dem IO-Warrior40 und 56 gibt es einige Unterschiede. Zum einenn können Sie nicht IOWKIT40_IO_REPORT_SIZE , IOWKIT40_IO_REPORT nicht für den IO-Warrior56 verwenden. Der 56er hat mehy Bytes und die Datenstruktur ist anders Beim IO-Warrior24 und 40 sind die values DWORDs, also 4Byte lange variablen. Der IO-Warrior56 hat aber 7Byte, also müsste na dort ein LWORD nutzen. Dies ist aber nicht sehr geläufig und vor allem unübersichtlich.

Sie müssen also IOWKIT56_IO_REPORT_SIZE und IOWKIT56_IO_REPORT verwenden. Verwenden Sie anstelle des Report.value die Report.Bytes[] zum setzen der Pins.

z.B. schreiben auf die IO-Pins

IOWKIT_HANDLE ioHandle;
IOWKIT56_IO_REPORT report;
memset(&report, 0x00, IOWKIT56_IO_REPORT_SIZE);

ioHandle = IowKitOpenDevice();

report.ID = 0x00; //oder 0
report.Bytes[0] = 0x01; //Dies ist der erste Port des IO-Warriors, also Pin 0.0 bis 0.7
report.Bytes[1] = 0xAA; //Dies ist der zweite Port des IO-Warriors, also Pin 1.0 bis 1.7
report.Bytes[2] = 0xFF; //Dies ist der dritte Port des IO-Warriors, also Pin 2.0 bis 2.7
//usw

IowKitWrite(ioHandle, IOW_PIPE_IO_PINS, (PCHAR) &report, IOWKIT56_IO_REPORT_SIZE);

IowKitCloseDevice(ioHandle);

So ist der Vorgang, wie man auf den IO-Warrior56 die Pins setzt.


Desweiteren kann man mit dem IowKitOpenDevice() Befehl nicht die angeschlossenen IO-Warrior ansteuern. Dies dient dazu, die DLL zu laden und das drum rum zu initialisieren. Wenn man mehr als einen IO-Warrior angeschlossen hat bekommt man dort zufällig einen als HANDLE heraus, je nachdem welcher von Windows als erster angewählt wurde.Dafür muss man die im Beispiel aufgeführen Befehle ausführen:

IOWKIT_HANDLE iows[IOWKIT_MAX_DEVICES];
WCHAR sn[9];
int numIows;

//Count of all IO-Warriors
numIows = IowKitGetNumDevs();

// Get all IOW handles
for (int i = 0; i < numIows; i++)
{
// Get device handle and init object
iows = IowKitGetDeviceHandle(i + 1);
// Get serial number
IowKitGetSerialNumber(iows, sn);
}


Nun sind alle angeschlossenen IO-Warrior in der Variable iows[] hinterlegt und man kann sie einzeln abfragen. Das Auseinanderhalten läuft über die Seriennummer, die der entsprechende IO-Warrior hat.

Ich hoffe ich konnte Ihnen weiterhelfen.

Mit freundlichen Grüßen
Christoph Jung
Post Reply