IO-Warrior 24 IowKitReadNonBlocking() Relaiskarte

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
Johann
Posts: 1
Joined: Mon Feb 23, 2009 9:23 pm

IO-Warrior 24 IowKitReadNonBlocking() Relaiskarte

Post by Johann »

Hallo,

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;
}

friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: IO-Warrior 24 IowKitReadNonBlocking() Relaiskarte

Post by friend-of-rq »

Hallo Johann,

vor dem IowKitReadNonBlocking()

eine Anweisung mit report-ID (255) senden
User avatar
Christoph Jung
Posts: 673
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IO-Warrior 24 IowKitReadNonBlocking() Relaiskarte

Post by Christoph Jung »

Zum einfachen Auslesen reicht ein ReaImmediate() völlig aus. ReadNonBlocking mit der ID 255 (0xFF) bewirkt das selbe, ist aber mehr für den IOW56 gedacht, da der kein ReadImmediate unterstützt.

Das Aufhängen kann ich mir nur so erklären, dass irgendwo etwas nicht abgefangen wird, falls ein Lesen oder Schreiben schief geht, also irgendwo ein if() fehlt.
Software developer
Post Reply