IO Warrior 24 auslesen

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
hog3-17
Posts: 2
Joined: Mon Jul 07, 2014 2:28 pm

IO Warrior 24 auslesen

Post by hog3-17 »

Hallo Zusammen,

irgendwie bekommen ich es nicht auf die Reihe meinen meinen IO Warrior mit Java aus zu lesen.
Ich kann die Ports beschreiben aber am auslesen haperts.
Hat jemand nen Tip oder ein Stück Code wie das gehen soll.
Hier mal mein Code, wie gesagt schreiben geht lesen nicht. Das mit dem Return usw. habe ich weggelassen.
Mir reicht es wenn die Variable in der Methode sich ändert.

Danke Gruss
Andreas

void schreiben(long mhandle,int daten_modus, int daten_senden[])
{
System.out.println("Daten schreiben");
IowKit.write(mhandle,0,daten_senden);
}

void lesen(long mhandle,int daten_modus)
{
long daten_empfangen=0;
long a =0;

System.out.println("Daten lesen");
IowKit.read(mhandle,a,daten_empfangen);
System.out.println(daten_empfangen);
}
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IO Warrior 24 auslesen

Post by Christoph Jung »

Hallo hog3-17

Das liegt daran, das der Code falsch ist. So sollte es gehen:

Code: Select all

		int[] r_buffer = new int[3];
		long to_read = 3;
	
		System.out.println("Daten lesen");
		r_buffer = IowKit.read(handle, 0, to_read);
		
		System.out.println(r_buffer[0]); //Report ID
		System.out.println(r_buffer[1]); //IO-Port 0
		System.out.println(r_buffer[2]); //IO-Port 1
WICHTIG:
Die read()-Funktion wartet bis neue Daten anliegen. Wenn sich die gelesenen Daten nicht zu den letzten gelesenen unterscheiden, wartet read() bis neue / andere Daten ankommen. Das sieht dann immer so aus, als ob das Programm hängt.

Dazu muss die Funktion IowKit.setTimeout() einmal beim starten gesetzt werden, damit die Read-Funktion nach X-Sekunden abgebrochen wird.
Mit ist aber bei Java und Eclipse aufgefallen, dass nach eintreten des Timeout() eine Fehlermeldung erscheint und man java im Tastkmanager killen muss.

Um das zu vermeiden folgenden Code nutzen:

Code: Select all

 
		IowKit.setTimeout(handle, 1000);  //Sollte man immer setzen, zur sicherheit

		int[] buffer = new int[8];	// 0: report ID, 1-7: Data
		int[] r_buffer = new int[8];    // 0: report ID, 1-7: Data
		long to_read = 8; //8 bei IOW24 und 40 für Special Mode

		buffer[0] = 0xFF; //ReportID für Special Mode 0xFF
		IowKit.write(handle,  1,  buffer); //IO-Warrior sagen, dass er die aktuellen IO-Port Daten lesen soll

		r_buffer = IowKit.read(handle, 1, to_read); //Daten auslesen

		System.out.println(r_buffer[0]); //report ID
		System.out.println(r_buffer[1]); //Port 0
		System.out.println(r_buffer[2]); //Port 1
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
hog3-17
Posts: 2
Joined: Mon Jul 07, 2014 2:28 pm

Re: IO Warrior 24 auslesen

Post by hog3-17 »

Hallo Christoph,

danke super Tipp. Habe da ja völlig daneben gelegen. Konnte jetzt das auslesen in mein Programm aufnehmen :-).
Hätte aber trotzdem noch zwei Fragen:

1: Ich hatte für das Schreiben ein 3er Array genommen und für das Auslensen das 9er. Das hatte aber nicht funktioniert, keine Ahnung warum.
Irgenwie wurde das 9er Array beim lesen immer zerstört. Vor dem lesen waren alle 9 Stellen im Debugger zu sehen und nach dem lesen nur noch eine??

2: Nachdem ich mein Array für das Schreiben auf 9 umgestellt hatte konnte ich die Ausganänge nicht mehr auf high legen. Das heisst meine LED`s
waren immer an.(sind gegen plus geschaltet) Das hat erst wieder funktioniert als ich die Array Stelle 4 auf 0xff gesetzt hatte.(Datenblatt hatte mir
nicht viel genützt)

Jetzt gehts so wie ich mir das vorgestellt habe. Bin total happy. Benutze Java erst seit ein paar Wochen. Der IO-Warrior liegt schon etwas länger.

Vielen Dank!

Gruss
Andreas
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IO Warrior 24 auslesen

Post by Christoph Jung »

Ah ist ein Fehler von mir. Es ist nur ein 8er Array ! Aufgeteilt in das erste Byte als ReportID und 7 Weitere Für Daten.
Hab mich schlicht verzählt. Sorry. Ich Korrigiere es im vorherigen Post.

Das 3er Array zum schreiben und lesen auf den Enpoint '0' ist für den IO-Warrior24 ja auch korrekt.
den 8er Array braucht man, wenn man mit den Special-Modes arbeitet, da die mit Endpoint '1' arbeiten.
Der Endpoint ist beim write() und read() die zweite Variable.

Code: Select all

IowKit.write(HANDLE, ENDPOINT, DATEN)
ARRAY_GELESEN_DATEN = IowKit.read(HANDLE, ENDPOINT, ANZAHL DER BYTES)
Beim Lesen ist die Anzahl der Bytes für den IO-Endpoint:
IOW24: 3
IOW40: 5
IOW56: 7

Beim Special-Mode:
IOW24: 8
IOW40: 8
IOW56: 64
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Post Reply