Recibir datos via UDP

  • 4 Respuestas
  • 4155 Vistas

PabloGa

  • Avanzado
  • ***
  • Mensajes: 103
Recibir datos via UDP
« : octubre 15, 2015, 21:53:28 pm »
Hola Boris, disculpame que haga tantas consultas.

Estoy tratando de recibir en el PLC un paquete de datos (8 bytes) via UDP, y no lo consigo hacer funcionar.
Lo he implementado de la siguiente manera (pooleado, no por eventos):

- En powerOn, ejecuto UdpRxBufFlush() para vaciar buffer
- En un punto que se ejecuta cada 1 segundo, hago:
   if(UdpRxBufUnread() == 0)
      UdpRxDataRead(RxData,0,8,false)
      Y aqui asigno las variables a los distintos bytes de RxData
      Y ahora pongo en el display los valores de dichas variables
   endif

- Teóricamente, con esa programación, se deberían actualizar las variables SOLO cuando se reciba un paquete UDP. Por lo tanto, el display debería mostrar estáticamente el último valor de los bytes recibidos, correcto ?

- Pero no he podido recibir nunca ningún byte.

He probado a enviar paquetes UDP con un aplicativo Android (que funciona, porque el PawnUdpRx.exe Receiver me los muestra), y también probé a transmitir con el PawnUdpTx.exe. Con este último, la cosa es bastante errática, porque si presiono el botón Enviar "Hola Mundo", supuestamente sale (pero no llega). Sin embargo, si hago el envío de xx bytes, siempre obtengo el cartel de error ERROR_DISABLED. Es como que el PawnUdpTx.exe no me está funcionando...

Preguntas:
- Está bien planteado el esquema de programación arriba descripto?
- Cuál es el puerto en que el PLC "escucha UDP": 4950 verdad ??

Cualquier sugerencia muy bienvenida. Muchas gracias !
Pablo.
« Última Modificación: octubre 15, 2015, 22:32:02 pm por PabloGa »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re:Recibir datos via UDP
« Respuesta #1 : octubre 16, 2015, 20:09:44 pm »
Buenas tardes Pablo,

Te recomiendo utilizar la ultima versión de PawnUdpTx.exe del SDK.
¿ Esa utilizas ?

Según el manual, UdpRxBufUnread() devuelve "1" cuando hay datos sin leer, por lo tanto deberías hacer:

Código: [Seleccionar]
   if(UdpRxBufUnread() == 1)
   {
      UdpRxDataRead(RxData,0,8,false)
   }

El puerto UDP que el PLC utiliza es el 4950.

Citar
- Teóricamente, con esa programación, se deberían actualizar las variables SOLO cuando se reciba un paquete UDP. Por lo tanto, el display debería mostrar estáticamente el último valor de los bytes recibidos, correcto ?

Si, así es.

Por otro lado, el PLC recibe datos UDP con un cierto "formato" que incluyen el password del PLC, asi el mismo puede aceptarlos.

Las librerias C# que están disponibles, simplifican el armado del paquete para enviar datos al PLC.

Pero si lo haces desde algún otro programa o lenguaje, podes enviar al PLC pero debes agregar 10 bytes al paquete con informacion.

¿ Eso queres hacer ?

Decime y te paso el formato para el envio si no estas utilizando nuestra librería para C#.

Antes proba con PawnUdpTx.exe.

Quedo a disposición.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

PabloGa

  • Avanzado
  • ***
  • Mensajes: 103
Re:Recibir datos via UDP
« Respuesta #2 : octubre 16, 2015, 21:29:28 pm »
Hola Boris,

Muchas gracias por tu respuesta.
Desde ya te anticipo que ya lo hice andar !! (al menos, lo básico). Igualmente, aquí van las respuestas punto por punto.

1) Sí, estoy usando PawnudpTx.exe que está en el CD que vino con el equipo. Quizá no es la última versión. Pero al final sí me comenzó a funcionar. No sé qué fue lo que cambió, pero ya no me tira más el error que te mencioné mas arriba.

2) Ahora reimplementé las funcionalidades UDP utilizando @OnUdpRx(), o sea por eventos, porque veo que así parece ser el método preferido. Creo que este fue el punto o el punto 3) hicoeron que empiece a funcionar.

3) Con respecto a la función UdpRxBufUnread(), creo que la utilicé mal, porque seguí el ejemplo del manual que dice (página 209), quizá está mal ejemplo en el manual:
     // Comprobar si el buffer tiene nuevos datos sin leer.
     if(UdpRxBufUnread() == 0)
     {
     // Leer datos del Rx Buffer.
     }

4) Sobre el tema del formato de los paquetes UDP. Ahora entiendo !!! Por eso es que no me funciona enviando paquetes UDP desde un "programita cualquiera" que envía paquetes UDP. Es porque hay que enviarlos con cierto preámbulo o formato. Y por eso es que SI funciona si envío el paquete desde PawnudpTx.exe.
Efectivamente: yo voy a enviar paquetes UDP desde un dispositivo ESP8266, y por lo tanto sí necesitaría pedirte los datos de cómo hay que armar el "formato" de paquetes UDP, porque si no no lo voy a poder comunicar nunca :).
Encontré el siguiente thread, pero no sé si tenés alguna documentación más específica del protocolo CSP:
http://www.slicetex.com/foro/smf/index.php?topic=34.0

Citar
Por otro lado, el PLC recibe datos UDP con un cierto "formato" que incluyen el password del PLC, asi el mismo puede aceptarlos.
Pero si lo haces desde algún otro programa o lenguaje, podes enviar al PLC pero debes agregar 10 bytes al paquete con informacion.
¿ Eso queres hacer ?
Decime y te paso el formato para el envio si no estas utilizando nuestra librería para C#.

Muchísimas gracias,
Pablo.
« Última Modificación: octubre 17, 2015, 22:07:08 pm por PabloGa »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re:Recibir datos via UDP
« Respuesta #3 : octubre 19, 2015, 20:19:56 pm »
Citar
Sobre el tema del formato de los paquetes UDP. Ahora entiendo !!! Por eso es que no me funciona enviando paquetes UDP desde un "programita cualquiera" que envía paquetes UDP. Es porque hay que enviarlos con cierto preámbulo o formato. Y por eso es que SI funciona si envío el paquete desde PawnudpTx.exe.
Efectivamente: yo voy a enviar paquetes UDP desde un dispositivo ESP8266, y por lo tanto sí necesitaría pedirte los datos de cómo hay que armar el "formato" de paquetes UDP, porque si no no lo voy a poder comunicar nunca :).
Encontré el siguiente thread, pero no sé si tenés alguna documentación más específica del protocolo CSP:
http://www.slicetex.com/foro/smf/index.php?topic=34.0

Así es Pablo, en ese mensaje se explica como es el el encabezado para enviar datos UDP al PLC.

Básicamente, si queres enviar dos bytes (con valores 1 y 55), creas un array de bytes, por ejemplo Data[] y haces:

Código: [Seleccionar]

   // Configurar CSP Header

   // Clave (32-bits) - Es la clave configurada en el PLC de destino.
   Data[0] = 0   // LSB
   Data[1] = 0
   Data[2] = 0
   Data[3] = 0  // MSB

   // Proto version.
   Data[4] = 2

   // Type
   Data[5] = 0xFA

   // Argument size.
   Data[6] = 3  // 1 byte + 2 bytes
   Data[7] = 0

   // Código de comando (UdpRx())
   Data[8] = 6

   // Argument size.
   Data[9] = 2  // Cmd UdpRx Arg. Size (2 bytes)

   // Set data values.
   Data[10+1] = 1       // Value 1
   Data[10+2] = 55     // Value 2


Como podes ver, en el array Data cargas los bytes a enviar a partir del elemento 10.

  • En el elemento 9 la cantidad de bytes enviados.
  • En el elemento 6 la cantidad de bytes enviados + 1.
  • El resto de los elementos del array tienen valores constantes (a menos que cambies la clave del PLC, en ese caso debes cambiar la clave enviada en el paquete para que sea aceptada como validad)..

Esa es la forma mas simple de enviar datos al PLC con UDP, ya que hay otro modo donde se utiliza un "handshake" (que lo usa la librería y otros programas) y sigue un protocolo con respuestas y estados, y depende del campo "TYPE". Pero eso no lo tengo documentado y es mas complejo.

Cualquier duda avisame.



« Última Modificación: octubre 20, 2015, 10:41:44 am por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

PabloGa

  • Avanzado
  • ***
  • Mensajes: 103
Re:Recibir datos via UDP
« Respuesta #4 : octubre 20, 2015, 07:59:08 am »
Perfecto !
Sí, con este protocolo básico voy a andar bien. No creo que necesite handshake.
Mil gracias !
Pablo.

Citar
Sobre el tema del formato de los paquetes UDP. Ahora entiendo !!! Por eso es que no me funciona enviando paquetes UDP desde un "programita cualquiera" que envía paquetes UDP. Es porque hay que enviarlos con cierto preámbulo o formato. Y por eso es que SI funciona si envío el paquete desde PawnudpTx.exe.
Efectivamente: yo voy a enviar paquetes UDP desde un dispositivo ESP8266, y por lo tanto sí necesitaría pedirte los datos de cómo hay que armar el "formato" de paquetes UDP, porque si no no lo voy a poder comunicar nunca :).
Encontré el siguiente thread, pero no sé si tenés alguna documentación más específica del protocolo CSP:
http://www.slicetex.com/foro/smf/index.php?topic=34.0

Así es Pablo, en ese mensaje se explica como es el el encabezado para enviar datos UDP al PLC.

Básicamente, si queres enviar dos bytes (con valores 1 y 55) haces:

Código: [Seleccionar]

   // Configurar CSP Header

   // Clave (32-bits) - Es la clave configurada en el PLC de destino.
   Data[0] = 0   // LSB
   Data[1] = 0
   Data[2] = 0
   Data[3] = 0  // MSB

   // Proto version.
   Data[4] = 2

   // Type
   Data[5] = 0xFA

   // Argument size.
   Data[6] = 3  // 1 byte + 2 bytes
   Data[7] = 0

   // Código de comando (UdpRx())
   Data[8] = 6

   // Argument size.
   Data[9] = 2  // Cmd UdpRx Arg. Size (2 bytes)

   // Set data values.
   Data[10+1] = 1       // Value 1
   Data[10+2] = 55     // Value 2


Como podes ver, en el array Data cargas los bytes a enviar a partir del elemento 10.

  • En el elemento 9 la cantidad de bytes enviados.
  • En el elemento 6 la cantidad de bytes enviados + 1.
  • El resto de los elementos del array tienen valores constantes (a menos que cambies la clave del PLC, en ese caso debes cambiar la clave enviada en el paquete para que sea aceptada como validad)..

Esa es la forma mas simple de enviar datos al PLC con UDP, ya que hay otro modo donde se utiliza un "handshake" (que lo usa la librería y otros programas) y sigue un protocolo con respuestas y estados, y depende del campo "TYPE". Pero eso no lo tengo documentado y es mas complejo.

Cualquier duda avisame.