Foro sobre Java SE > Java, comunicacion
¿Qué tipo de sensor es ese?. Como todo dispositivo hardware, tendrá algunas especificaciones de comunicación.
Es un sensor de posición, tipo láser. marca IFM OJ5014
Adjunto el link por si quieres echar un vistazo:
http://www.ifm.com/products/es/ds/OJ5014.htm
Necesitas un interface hardware que permita la comunicación entre el sensor y el ordenador.
En los enlaces siguientes puedes ver algunas posibles soluciones:
http://www.controlanything.com/Relay/Relay/CONTACT_CLOSURES
http://www.portwell.com/products/IO.asp
Quizás lo más interesante sería, puesto que usarás Java, que la comunicación con el ordenador se realice mediante RS232, para lo que existen API en Java:
http://www.oracle.com/technetwork/java/index-jsp-141752.html
http://java.sun.com/products/javacomm/reference/docs/API_users_guide_3.html
Muchas gracias por la aportación.
El caso es que estoy trabajando con Windows 7 y la Java Communications 3.0 API no esta disponible para este sistema operativo. He estado leyendo otros foros y por lo visto haciendo algunas modificaciones podría funcionar aunque a mucha gente le ha dado errores. La verdad es que estoy ahora muy perdido, buscando mucha información. El sensor del que hablo esta conectado a un PLC de la marca Allen-Brandley por medio del programa TwinCAT. Ahora estudiare si desde ahí se puede conseguir algo.
Échale un ojo a ésto:
http://infosys.beckhoff.com/espanol.php?content=../content/1034/tcsample_webservice/html/webservice_sample_java.htm&id=11607
Gracias, me ha sido de gran ayuda, parece una muy buena librería. Ahora me surgen mas dudas, jeje......
El caso es que tengo comunicación DeviceNet, con una tarjeta FC 5201 de Beckhoff, hablando con un profesor me recomendó utilizar esa tarjeta para comunicarme con el PC y PLC vía Socket. Entonces, ahora estoy en un punto en el que creo que hay muchas formas de hacerlo. He estado leyendo y si no he entendido mal, añadiendo esa librería a mi proyecto en Java podre tener acceso a ese sensor.
Con respecto a la comunicación sockect entre el PLC y el PC no lo tengo tan claro la verdad.
Por lo que he visto hasta ahora, dado que ya usas TwinCat, no veo la necesidad de otro tipo de procedimiento de comunicación, puesto que el mismo Twincat (si he entendido bien) te permite el acceso a cualquier dispositivo de la red DeviceNet, y de una manera mucho más sencilla que usar sockets.
De todos modos, podrías ponerte en contacto con Beckhoff, explicándoles detalladamente el proyecto que tienes en marcha (cuanto más detallado, mejor), y solicitándoles consejo.
Los fabricantes (casi) siempre echan una mano, puesto que cuantas más personas conozcan sus productos, mejor para sus oportunidades de negocio ;)
Respecto a comunicaciones directas entre PC y PLC, busca información sobre ModBus, como por ejemplo ésto, para empezar:
http://en.wikipedia.org/wiki/Modbus
No sé si los PLC de Allen Bradley lo usan, pero seguro que puedes comprobarlo con facilidad, en la propia documentación de Allen Bradley.
Sé solo por referencias que existen implementaciones en Java para ModBus.
Hola de nuevo!!!
Finalmente he conseguido configurar Java y Twincat pero ahora tengo varios problemas
Tengo el codigo en java que proporciona Beckhoff el cual esta likeado arriba, pero no termino de entenderlo. Lo tengo adaptado a mi caso pero me da el siguiente error:
may 25, 2012 12:41:37 PM ADS_communication.AdSWebServiceSample main
Grave: null
java.lang.NullPointerException
at ADS_communication.TcAdsSOAP.SOAPCall(TcAdsSOAP.java:264)
at ADS_communication.TcAdsSOAP.SOAPCall(TcAdsSOAP.java:199)
at ADS_communication.TcAdsSOAP.ReadBool(TcAdsSOAP.java:43)
at ADS_communication.AdSWebServiceSample.main(AdSWebServiceSample.java:20)
El código ejemplo es el siguiente:
public class AdSWebServiceSample
{
public static void main(String args[])
{
TcAdsSOAP tcSoap = new TcAdsSOAP("http://192.168.0.2/TcAdsWebService/TcAdsWebService.dll");
try
{
String netId = "192.168.0.2.1.1";
int port = 801;
int offset = 16416;
/* write bool */
boolean testBool = true;
if (tcSoap.WriteBool(netId,port,offset,0,testBool))
System.out.println("Boolean "+testBool+" Written");
/* write int */
int testInt = 1234;
if (tcSoap.WriteInt(netId,port,offset,1,testInt))
System.out.println("Integer "+testInt+" Written");
/* write string */
String testString = "Hello Automation";
if (tcSoap.WriteString(netId,port,offset,3,testString ))
System.out.println("String "+testString+" Written");
/* read bool */
System.out.println(String.valueOf(tcSoap.ReadBool( netId,port,offset,0) ));
/* read int */
System.out.println(String.valueOf(tcSoap.ReadInt(n etId,port,offset,1) ));
/* read string */
System.out.println(tcSoap.ReadString(netId,port,of fset,3,81));
}
catch(Exception ex)
{
System.out.println(String.valueOf(ex));
}
}
}
Si alguien entiende el código o lo ha utilizado antes y puede explicarme algo sobre el se lo agradecería.
Un saludo y gracias!!!
¿Qué hay en esta línea: TcAdsSOAP.java:264?
Se encuentra esto:
if(data.length()==0)
Y aquí esta la clase a la que pertenece, es un poco larga lo siento:
private DataInputStream SOAPCall(String netId, int port, long group, long offset, int cblen, boolean swap)
{
String data = new String();
String soapResponse = new String();
HttpURLConnection connection = null;
try
{
URL u = new URL(soapTargetUrl);
URLConnection uc = u.openConnection();
connection = (HttpURLConnection) uc;
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
connection.setRequestProperty("SOAPAction", soap_read);
connection.setRequestProperty("Expect", "100-continue");
connection.setRequestProperty("Connection", "Keep-Alive");
OutputStream out = null;
out = connection.getOutputStream();
Writer wout = new OutputStreamWriter(out);
wout.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
wout.write("<soap:Envelope ");
wout.write( "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" ");
wout.write( "xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" ");
wout.write( "xmlns:tns=\"http://beckhoff.org/wsdl/\" ");
wout.write( "xmlns:types=\"http://beckhoff.org/wsdl/encodedTypes\" ");
wout.write( "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ");
wout.write( "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">");
wout.write( "<soap:Body soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">");
wout.write( "<q1:Read xmlns:q1=\"http://beckhoff.org/message/\">");
wout.write( "<netId xsi:type=\"xsd:string\">"+netId+"</netId>");
wout.write( "<nPort xsi:type=\"xsd:int\">"+port+"</nPort>");
wout.write( ""+group+"");
wout.write( ""+offset+"");
wout.write( "<cbLen xsi:type=\"xsd:int\">"+cblen+"</cbLen>");
wout.write( "</q1:Read>");
wout.write( "</soap:Body>");
wout.write("</soap:Envelope>");
wout.flush();
wout.close();
InputStream in = null;
in = connection.getInputStream();
int c;
while ((c = in.read()) != -1) soapResponse=soapResponse+(char)c;
in.close();
}
catch (Exception e)
{
error = e;
return null;
}
data = parseSOAPString(soapResponse);
if(data.length()==0)
return null;
else
{
try
{
//swap the decode and Swap the stream
byte[] b64 = new byte[2];
byte[] b64r = new byte[2];
b64 = Base64.decode(data.toCharArray());
if (swap)
{
int x=1;
for (int i=0; i<2; i++)
{
b64r[x]=b64[i];
x--;
}
}
else b64r = b64;
//reinterpret binary data
ByteArrayInputStream bAis = new ByteArrayInputStream(b64r);
DataInputStream diS = new DataInputStream(bAis);
return diS;
}
catch (Exception e)
{
error = e;
return null;
}
}
}
El error proviene de aquí:
data = parseSOAPString(soapResponse);
justo en la línea anterior.
Ese método devuelve null.
Creo que deberías usar un Debugger, para comprobar si ese parámetro es null, o es el método parseSOAPString quién devuelve null, aunque ese parámetro no lo sea.
Pues el método data = parseSOAPString(soapResponse); me da algo como esto:
"<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://beckhoff.org/message/"><SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>An ADS Error has occurred.</faultstring><detail><errorcode xmlns='http://beckhoff.org'>1861</errorcode ><errorinfo xmlns='http://beckhoff.org'></errorinfo></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>"
Ni idea
Y data me da null
¿Eso es el contenido de soapResponse?.
Si es así, y data es null, es ese método quién devuelve el valor null.
¿Tienes acceso al código fuente de ese método?
Hola a todos,
Soy estudiante universitario y estoy desarrollando un proyecto relacionado con el procesamiento de imágenes.
El reconocimiento de la imagen y su procesamiento lo he conseguido ya. El programa lo que hace es que toma una fotografía, la procesa y da un resultado. Hasta ahí bien, lo que pasa es que todo eso tiene que ser automatizado, es decir, "alguien" tiene que decirle al programa cuando tiene que tomar esa fotografía (que hasta ahora se hace pulsando un botón). Tengo un sensor que es el que enviara una señal al programa para que lo haga. Mis dudas son, como me comunico con el sensor, es decir, hay alguna Api, necesito algún tipo de Software. Cualquier aportación es bienvenida.
Un saludo y gracias de antemano!!