# Conrad Relaiskarte



## SvenFromGermany (22. Mrz 2006)

Hallo,

ich bin eigentlich absoluter Java Neuling, versuche allerdings gerade die 8-fache, serielle Relaiskarte von Conrad mit Java anzusteuern. 

Das habe ich bisher geschrieben: 



```
import javax.comm.*;
import java.io.*;

public class Relais {
	
	 static CommPortIdentifier portID; 
	  static InputStream ins;
	  static OutputStream out;
	  static SerialPort serss;


	public static void main(String[] args) {
		
		// COMM oeffnen
		
		 try{
			 
			 portID = CommPortIdentifier.getPortIdentifier("COM1");
	         serss = (SerialPort) portID.open("COM1",2000); 
	         
		 }
		 catch(Exception exc)
		 {
			 System.out.println("Fehler :"+exc);
			
		 }
		 
		  
		  System.out.println("Relais schalten\n---------------------------");
		  
		  System.out.println("COM1 geoeffnet !");
		  
		  try 
		  {
			  ins = serss.getInputStream();
			  OutputStream os = serss.getOutputStream();
			  BufferedOutputStream bos = new BufferedOutputStream(os);
			  
			  byte Aktion=1;
			  
			  byte Adr=0;
			  
			  bos.write(1);
			  bos.write(Adr);
			  bos.write(0);
			  
			  bos.write(3);
			  bos.write(Adr);
			  bos.write(1);
			  
			  
			 
			  bos.write(Adr);
			  
			 
			  
			  
		
		  }
		  
		  catch (Exception e) { System.out.println("Fehler: "+e);}
		  
		  serss.notifyOnDataAvailable(true);
		  
		  try 
		  {
			  serss.setSerialPortParams(19200,
              SerialPort.DATABITS_8,
              SerialPort.STOPBITS_1 ,
              SerialPort.PARITY_NONE);
			  
		  }
		  
		  catch (UnsupportedCommOperationException e) {}
		
		  
		

	}

}
```

Allerdings rührt sich bis jetzt noch gar nichts an der Relais Karte.

In dem Handbuch der Karte steht das folgende QBasic Programm:


```
CLS : CLEAR
DIM inbuff(800)
DIM outbuff(8)
OPEN "com1:19200,n,8,1,bin,cs,ds" FOR RANDOM AS #1

COM(2) ON
ON ERROR GOTO BADCOM
ON COM(2) GOSUB GETFRAME

PRINT "Initialize borad"
outbuf(0) = 1: outbuf(1) = 1: outbuf(2) = 0: GOSUB sendframe
FOR delay = 1 TO 100000: NEXT: CLS

teststart:
r = 1
rt:
outbuf(0) = 3: outbuf(1) = 1: outbuf(2) = r: GOSUB sendframe
FOR delay = 1 TO 100000: NEXT: CLS
r = r * 2: IF r < 256 THEN GOTO rt
GOTO teststart

GETFRAME:

         inbuf(bz) = ASC(INPUT$(1, #1))
         bz = bz + 1
                 IF bz = 4 THEN GOTO checkframe
                 RETURN

checkframe:

ERROR$ = "ERROR"

IF inbuf(0) XOR inbuf(1) XOR infbuf(2) = inbuf(3) THEN ERROR$ = "OK"

bz = 0: PRINT "Empfangen: "; " "; inbuf(0); " "; inbuf(1); " "; inbuf(2); " "; inbuf(3); " ", ERROR$

PRINT "---------------------------------": RETURN

sendframe:
outbuf(3) = outbuf(0) XOR outbuf(1) XOR outbuf(2)
send$ = CHR$(outbuf(0)) + CHR$(outbuf(1)) + CHR$(outbuf(2)) + CHR$(outbuf(3))
PRINT #1, send$
PRINT "gesendet !"; outbuf(0); outbuf(1)
RETURN


BADCOM:

PRINT "---- DATA ERROR ---- "
RESUME

RETURN

ende:

END
```

Vielleicht könnt ihr mir sagen, ob ich die COM Schnittstelle jetzt mit Java richtig geöffnet habe oder ob da schon ein Fehler drin ist.

Was und wie ich jetzt die Befehle an die Karte senden soll ist mir nicht klar.  ???:L 

 :### Das Handbuch zur Karte gibt es hier:

http://www2.produktinfo.conrad.com/...7720-an-01-de-Relaisplatine_8fach_seriell.pdf

Da steht im Kapitel 4, wie die Karte angesteuert werden soll. unter 4.5 steht, welche Kommandos gesendet werden sollen.

Vielen vielen Dank für euere Hilfe.

Gruß

Sven


----------



## Murray (22. Mrz 2006)

Zwei Dinge fallen mir auf:
1. Wenn Du eine Byte-Folge über den BufferedOutputStream geschrieben hast, könnte es helfen, den Stream explizit zu flushen:

```
bos.flush();
```

2: In der Basic-Sequenz

```
sendframe:
outbuf(3) = outbuf(0) XOR outbuf(1) XOR outbuf(2)
send$ = CHR$(outbuf(0)) + CHR$(outbuf(1)) + CHR$(outbuf(2)) + CHR$(outbuf(3))
PRINT #1, send$
PRINT "gesendet !"; outbuf(0); outbuf(1)
RETURN
```
wird an die drei Bytes noch ein viertes (eine Art Prüfsumme?) angehängt, das sich ergibt, indem man die ersten drei Bytes XOR-verknüpft.


----------



## SvenFromGermany (22. Mrz 2006)

Also muss ich statt


```
bos.write(<byte>);
```

das hier:


```
bos.flush(<byte>);
```

schreiben ?

Und dann als Prüfsumme die Summe der ASCII Werte anhängen ? Wie mache ich das mit den ASCII Werten am besten ?

Außerdem habe ich eine Software gefunden, die in Delphi geschrieben wurde:

http://www.smartprogramming.de/modules.php?name=Downloads&d_op=getit&lid=2

Da ist eine DLL drin. Ich weiß allerdings nicht, wie ich herausfinden soll, wie ich die verwenden kann ... :bahnhof: 

Sven


----------



## Murray (22. Mrz 2006)

SvenFromGermany hat gesagt.:
			
		

> Also muss ich statt
> 
> 
> ```
> ...



Nein, angenommen Du willst drei Bytes b1, b2 und b3 sowie die XOR-Prüfsumme über alle drei Bytes schreiben, dann machst Du:

```
bos.write( b1);
bos.write( b2);
bos.write( b3);
bos.write( b1 ^ b2 ^ b3); //--- XOR
bos.flush();
```


----------



## SvenFromGermany (22. Mrz 2006)

ok. Ich probiert das mal.

Aber kann man nicht irgendwie die DLL verwenden ?

Wie kann ich rausfinden, welche Funktionen darin deklariert wurden und wie ich die aufrufen kann ?

Danke

Sven


----------



## Murray (22. Mrz 2006)

SvenFromGermany hat gesagt.:
			
		

> Wie kann ich rausfinden, welche Funktionen darin deklariert wurden und wie ich die aufrufen kann ?



Welche Funktionen in einer DLL stecken, kann man mit geeigneten Tools (z.B. DLL Export Viewer) auslesen.
Hier sind es

```
ClosePort	0x0045cfc4	0x0005cfc4	1 (0x1)	RelaisCtrlSE.dll	C:\home\work\060322\RelaisCtrlSE.dll	
GetDLLVersion	0x0045c840	0x0005c840	8 (0x8)	RelaisCtrlSE.dll	C:\home\work\060322\RelaisCtrlSE.dll	
Initcard	0x0045cad0	0x0005cad0	4 (0x4)	RelaisCtrlSE.dll	C:\home\work\060322\RelaisCtrlSE.dll	
OpenConfig	0x0045c94c	0x0005c94c	6 (0x6)	RelaisCtrlSE.dll	C:\home\work\060322\RelaisCtrlSE.dll	
OpenPort	0x0045c9a0	0x0005c9a0	5 (0x5)	RelaisCtrlSE.dll	C:\home\work\060322\RelaisCtrlSE.dll	
PortNr	0x0045c858	0x0005c858	7 (0x7)	RelaisCtrlSE.dll	C:\home\work\060322\RelaisCtrlSE.dll	
RecvRelaisSetting	0x0045ccf0	0x0005ccf0	2 (0x2)	RelaisCtrlSE.dll	C:\home\work\060322\RelaisCtrlSE.dll	
Send	0x0045cb74	0x0005cb74	3 (0x3)	RelaisCtrlSE.dll	C:\home\work\060322\RelaisCtrlSE.dll
```

So einfach kann man diese DLL aber nidht von Java aus nutzen, vermutlich braucht man noch eine Wrapper-DLL, die die Funktionen gemäss der JNI-Konventionen zur Verfügung stellt.


----------

