ich verwende die Relaiskarte von GWR-Elektronik die den IO-Warrior 24 verwendet (10 Relais).
Ich habe mir mit Hilfe von Simple I/O ein Programm in C geschrieben, welches mittels Übergabeparameter ein Relais setzen oder eben nicht setzen soll.
Dazu lese ich den aktuellen Status aus, dieser wird dann Bitweise so maskiert, das ein Bit (=Relais) gesetzt oder nicht gesetzt wird. (z.B. 11111110 bedeutet bei dieser Relaiskarte alles OFF, Relais 1 ON). Anschließend wird für die Überprüfung nochmals gelesen.
1. Versuch: Habe mit IowKitReadNonBlocking() Status ausgelesen, danach geschrieben, wieder mit IowKitReadNonBlocking() gelesen. Problem war hier, das bei dem ersten IowKitReadNonBlocking() KEINE daten zurückgekommen sind (0x00), nach dem Schreiben hat das zweite IowKitReadNonBlocking() den aktuellen Zustand richtig zurückgegeben.
2. Versuch: Habe mit IowKitReadImmediate() gelesen (hat den aktuellen Zustand richtig ausgelesen), danach geschrieben und mit IowKitReadNonBlocking() gelesen.
Soweit funktionierte der 2. Versuch, allerdings habe ich, wenn ich das Programm mehrere Male hintereinander aufrufe (versch. Relais setze oder nicht setze) irgendwann ein Problem: IowKitReadImmediate() bleibt "hängen", Programm hängt sich auf. Leider läßt sich nicht eruieren, warum sich das Programm bei oftmaligem anwenden aufhängt (man kann nicht sagen, dass es sich nach einer bestimmten Operation, Relais oder einer bestimmten Anzahl an Versuchen aufhängt).
Meine Fragen sind:
- habe ich beim 1. Versuch beim ersten IowKitReadNonBlocking() etwas falschgemacht (event. bei der Initialisierung), weil ich keine Werte erhalte
- kann ich das "hängenbleiben" des Programms beim 2.Versuch verhindern (habe etwas mit IowKitSetTimeout() gelesen, kann ich hier eine Zeit festlegen, nachdem es trotzdem "weitergeht" bzw. muss ich dann IowKitRead() verwenden)? Könnte ein "Überlauf" zum Hängenbleiben führen?
Danke für jegliche Hilfe!
lG,
- Johann
Hier noch mein Code:
Code: Select all
//
// ioblink.cpp - Blinking LEDs sample
//
#include "stdafx.h"
#include "time.h"
#include "iowkit.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
// value = lower Byte, value2 = higher Byte
BOOLEAN WriteSimple(IOWKIT_HANDLE devHandle, DWORD value, DWORD value2)
{
IOWKIT56_IO_REPORT rep;
// Init report
memset(&rep, 0xff, IOWKIT56_IO_REPORT_SIZE);
rep.ReportID = 0;
switch (IowKitGetProductId(devHandle))
{
// Write simple value to IOW40
case IOWKIT_PRODUCT_ID_IOW40:
rep.Bytes[3] = (BYTE) value;
return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT40_IO_REPORT_SIZE) == IOWKIT40_IO_REPORT_SIZE;
// Write simple value to IOW24
case IOWKIT_PRODUCT_ID_IOW24:
rep.Bytes[0] = (BYTE) value;
rep.Bytes[1] = (BYTE) value2;
return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT24_IO_REPORT_SIZE) == IOWKIT24_IO_REPORT_SIZE;
case IOWKIT_PRODUCT_ID_IOW56:
// Write simple value to IOW56
rep.Bytes[6] = (BYTE) value;
return IowKitWrite(devHandle, IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT56_IO_REPORT_SIZE) == IOWKIT56_IO_REPORT_SIZE;
default:
return FALSE;
}
}
int main(int argc, char* argv[])
{
int relay = atoi(argv[2]); // relais nummer (1-10)
char* todo = argv[1]; // befehl (s(et), u(nset))
// HARDWARE-TEIL
IOWKIT_HANDLE iows[IOWKIT_MAX_DEVICES];
int i, j;
ULONG bits;
ULONG bits2;
int numIows;
IOWKIT56_IO_REPORT rep;
WCHAR sn[9];
ULONG rc;
DWORD pid;
IOWKIT_HANDLE devHandle;
int sleeptime;
DWORD odata;
DWORD data;
DWORD data2;
sleeptime = 500;
DWORD dummy;
int dummy2;
char* bitdar;
// #################### was ist zu tun? ######################
printf("befehl: %s; relais: %i\n", todo, relay);
// Open device
devHandle = IowKitOpenDevice();
if (devHandle == NULL)
{
printf("Failed to open device\n");
goto out;
}
// Get number of IOWs in system
numIows = IowKitGetNumDevs();
printf("%d IOWs in system\n", numIows);
// Get all IOW handles
for (i = 0; i < numIows; i++)
{
// Get device handle and init object
iows[i] = IowKitGetDeviceHandle(i + 1);
// Get serial number
IowKitGetSerialNumber(iows[i], sn);
pid = IowKitGetProductId(iows[i]);
printf("%d PID %x, S/N \"%ws\"\n\n\n", i + 1, pid, sn);
}
Sleep(sleeptime);
// ###################### STATUS AUSLESEN ####################
if (IowKitReadImmediate(devHandle, &data))
printf("relay: %i todo1=%c\n\n", relay, todo[0]);
printf("original-data: %04x %i\n", data, data);
odata = data;
data = (BYTE)(data%256);
data2 = (BYTE)(odata/256);
printf("data: %02x %i\n", data, data);
printf("data2: %02x %i\n\n", data2, data2);
Sleep(sleeptime);
// ###################### BITOPERATIONEN ####################
switch(relay)
{
case 1:
dummy2 = 1;
break;
case 2:
dummy2 = 2;
break;
case 3:
dummy2 = 4;
break;
case 4:
dummy2 = 8;
break;
case 5:
dummy2 = 16;
break;
case 6:
dummy2 = 32;
break;
case 7:
dummy2 = 64;
break;
case 8:
dummy2 = 128;
break;
case 9:
dummy2 = 1;
break;
case 10:
dummy2 = 2;
break;
default:
dummy2 = 0;
}
if (todo[0]=='s') { // ### SET ### XOR= "^" ; OR= "|";
if (relay<=8)
dummy = (data)^0xff; // XOR mit 0xff = INV
else
dummy = (data2)^0xff; // XOR mit 0xff = INV
printf("data XOR 0xff: %02x %i\n",dummy,dummy);
dummy = dummy|dummy2; // OR
printf("dummy OR dummy2: %02x %i\n",dummy,dummy);
dummy = dummy^0xff; // XOR mit 0xff = INV
}
if (todo[0]=='u') { // ### UNSET ###
if (relay<=8)
dummy = (data)|dummy2;
else
dummy = (data2)|dummy2;
}
printf("dummy: %02x %i\n",dummy,dummy);
// ###################### SCHREIBEN ##########################
// bits=247;
if (relay<=8) {
bits = dummy;
bits2 = data2;
}
else {
bits = data;
bits2= dummy;
}
rc = WriteSimple(iows[0], bits, bits2);
// Check for error
if (!rc)
printf("Cannot write, err %d\n", GetLastError());
Sleep(sleeptime);
// ###################### STATUS AUSLESEN ####################
// Init report
// Report ID 0 is for writing to 32 input/output pins
rep.ReportID = 0;
// Read non blocking
// Init report
memset(&rep, 0, IOWKIT56_IO_REPORT_SIZE);
rc = IowKitReadNonBlocking(iows[0], IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT24_IO_REPORT_SIZE);
printf("ReadNonBl(): rc=%u bits=", rc);
for (j = IOWKIT24_IO_REPORT_SIZE - 1; j >= 0; j--)
printf("%02x", rep.Bytes[j]);
printf("\n\n\n");
Sleep(sleeptime);
// Close device
IowKitCloseDevice(devHandle);
//system("PAUSE");
out:
return 0;
}