Hallo
Ich probiere mit KUKA.EthernetKRLXML über einen java socket server Abfragen auf eine Datenbank zu machen. Um das im Vorfeld zu testen, hab ich einen kleinen java server geschrieben, der einfach mal empfangen und senden soll.
Aus KUKA sicht klappt das Senden, empfangen kann ich aber nicht.
Wie im C# Beispiel von KUKA konvertiere ich den zu sendenden String erst in einen Byte Array.
Die Konsolenausgabe im Eclipse ist:
received: <mc>32</mc><mr>8</mr><ms>80</ms><s>select * from TJobData</s><t/>
sending: <sql><cr>1</cr><cc>1</cc><mr>1</mr><mc>1</mc><sd>blah</sd></sql>
...allerdings bleibt der KUKA in der Funktion: EKX_WaitForSensorData( ... ) stehen, beziehungsweise im "HALT" danach. Der KUKA wartet nicht auf das Timeout (10s) sondern fällt in den "HALT", nachdem der java server gesendet hat (nach der einen Sekunde Verweilzeit).
Ich habe probiert:
- ohne / mit der einen Sekunde Verweilzeit im java server
- ohne / mit input.close() / output.close() / output.flush() im java server
- mit newlines im zu sendenden String (zwischen den tags und am Schluss)
Da der KUKA den timeout nicht abwartet gehe ich davon aus, dass etwas ankommt, denn ohne die Verweilzeit im java server wartet er die vollen 10 Sekunden ab.
Falls ich mich mit HyperTerminal mit dem java server verbinde, bekomme ich den korrekten String
Falls sich jemand mit diesem TP auskennt, wäre für jede Hilfe dankbar.
Gruss, rob
Der Java Server:
package sql4automation;
import java.net.*;
import java.io.*;
public class Server {
ServerSocket server = new ServerSocket( 11006 );
Server() throws IOException{
while( true ){
Socket client = server.accept();
InputStream input = client.getInputStream();
OutputStream output = client.getOutputStream();
StringBuilder sb = new StringBuilder();
while( input.available()>0 ){
sb.append( (char)input.read() );
}
System.out.print( "received: " + sb.toString() );
System.out.flush();
long time = System.currentTimeMillis() + 1000;
while( time > System.currentTimeMillis() );
String out = "<sql><cr>1</cr><cc>1</cc><mr>1</mr><mc>1</mc><sd>blah</sd></sql>";
System.out.println( "\nsending: " + out );
byte[] outbyte = out.getBytes();
output.write( outbyte, 0, outbyte.length );
output.flush();
input.close();
output.close();
}
}
public static void main(String[] args) {
try{
Server server = new Server();
}catch( IOException e ){
System.out.println( "Error: " + e );
}
}
}
Alles anzeigen
Das KRL source file:
DEF sql4automation2( )
;==============
; declarations
;==============
timeout = 10000; ms
query[1].s[] = "<mc>32</mc>"
query[2].s[] = "<mr>8</mr>"
query[3].s[] = "<ms>80</ms>"
query[4].s[] = "<s>"
query[5].s[] = " "
query[6].s[] = "</s>"
query[7].s[] = "<t/>"
res[1].s[] = "sql4automation2.sql.cr"
res[2].s[] = "sql4automation2.sql.cc"
res[3].s[] = "sql4automation2.sql.mr"
res[4].s[] = "sql4automation2.sql.mc"
res[5].s[] = "sql4automation2.sql.sd"
res[6].s[] = "sql4automation2.sql"
target[] = "sql4automation2"
;test = TRUE
test = FALSE
query[5].s[] = "select * from TJobData"
;==================
; open the channel
;==================
nError = EKX_open( target[] )
EKX_handleerror( nError )
;===============
; data exchange
;===============
;WHILE test
WHILE TRUE
;===========
; send data
;===========
FOR i=1 TO 3
nError = EKX_write( target[], query[i].s[] )
IF nError == eioc_error THEN
HALT
ENDIF
ENDFOR
FOR i=4 TO 6
nError = EKX_write( target[], query[i].s[] )
IF nError == eioc_error THEN
HALT
ENDIF
ENDFOR
nError = EKX_write( target[], query[7].s[] )
IF nError == eioc_error THEN
HALT
ENDIF
IF test THEN
HALT
ENDIF
;==============
; receive data
;==============
IF NOT EKX_WaitForSensorData( 0, res[6].s[], timeout ) THEN
HALT ; *** hier bleibt er stehen ohne den timeout abzuwarten... ***
ENDIF
IF NOT EKX_GetIntegerElement( 0, res[1].s[], cr, bNew ) THEN
HALT
ENDIF
IF NOT EKX_GetIntegerElement( 0, res[2].s[], cc, bNew ) THEN
HALT
ENDIF
IF NOT EKX_GetIntegerElement( 0, res[3].s[], mr, bNew ) THEN
HALT
ENDIF
IF NOT EKX_GetIntegerElement( 0, res[4].s[], mc, bNew ) THEN
HALT
ENDIF
IF( (cr<>mr) OR (cc<>mc) ) THEN
HALT
ENDIF
sd = res[5]
bNew = TRUE
FOR r=1 TO mr
FOR c = 1 TO mc
IF NOT bNew THEN
HALT; WRONG COUNTERS !
ENDIF
IF NOT EKX_GetStringElement( 0, sd.s[], bNew ) THEN
HALT
ENDIF
WHILE NOT StrClear( result[r,c].s[] )
; this should never happen...
ENDWHILE
sdlen = StrLen( sd.s[] )
FOR i=1 TO sdlen
result[r,c].s[i] = sd.s[i]
ENDFOR; copy
ENDFOR; columns
ENDFOR ; rows
IF test THEN
HALT
ENDIF
ENDWHILE; test
;======================
; close the connection
;======================
IF NOT EKX_close( target[] ) THEN
HALT
ENDIF
END
Alles anzeigen
das dat:
DEFDAT sql4automation
CHAR target[40]
STRUC str CHAR s[81]
CONST INT query_size = 5
DECL str query[5]
CONST INT res_size = 2
DECL str res[2]
DECL str result
BOOL bNew
INT timeout
INT nError
INT i
BOOL test
ENDDAT
Alles anzeigen
und die entsprechende Emfangsstruktur:
<Elements>
<Element Tag="sql" Type="STRUCTTAG" Stacksize="5" />
<Element Tag="sql.cr" Type="INTEGER" Stacksize="5" />
<Element Tag="sql.cc" Type="INTEGER" Stacksize="5" />
<Element Tag="sql.mr" Type="INTEGER" Stacksize="5" />
<Element Tag="sql.mc" Type="INTEGER" Stacksize="5" />
<Element Tag="sql.sd" Type="STRING" Size="80" Stacksize="5" />
</Elements>