UDP: Envio de dato float desde PLC a PC

  • 6 Respuestas
  • 4850 Vistas

GermanM

  • Novato
  • *
  • Mensajes: 15
UDP: Envio de dato float desde PLC a PC
« : julio 23, 2013, 17:32:48 pm »
Hola estimado, hay alguna forma de enviar un dato float a travez de UDP (un valor de tensión del ADC por ej)? Porque vi el uso del cast y las librerías de Pawn (Floating point support library) pero no logro hacerlo. El valor se transmitiría desde el PLC a la PC.

Muchas gracias
« Última Modificación: julio 23, 2013, 17:47:26 pm por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2144
  • Soporte Técnico
Re: UDP: Envio de dato float desde PLC a PC
« Respuesta #1 : julio 23, 2013, 17:44:38 pm »
Un dato float tiene 32-bits de informacion, que es lo mismo a 4-bytes. Por lo tanto hay que enviar el
float a traves de la red ethernet mediante 4 bytes. Luego desde la PC, tomar los 4 bytes
recibidos y ensamblarlos nuevamente en una variable de 32-bits. Finalmente con un cast,
transformarla a float.

El PLC mediante la funcion UdpSend() puede enviar los 4 bytes de una variable de 32-bits, si se pasa
el argumento Packed=true.

A continuacion se muestra un ejemplo para enviar un float de 32-bits mediante UDP en Pawn desde
el PLC y luego recibirlo en la PC desde la interfaz de programacion en Microsoft Visual C#.

Podes probar lo siguiente:

Desde el PLC (lenguaje Pawn):
Código: [Seleccionar]

// Variable para almacenar voltaje.
// Declaramos como un array para poder utilizar en UdpSend().
new Float: Volt[1]

// Especificar que el jumper 5 no esta colocado (rango 0 a 10 V).
VinJumper5UnSet()

// Leer entrada analógica VIN1 y almacenar en variable "Volt".
Volt = Float: VinReadVolt(1)

// Enviar dato UDP a dirección 192.168.1.15, puerto 4980.
// Utilizar Packed=true, asi se toma cada elemento del array como
// un valor de 32-bits, enviandose 4 bytes por la red.
// Especificar que el tamaño a enviar es de 4 bytes.
// El byte menos significativo se envia primero.

UdpSend(192,168,1,15, 4980, 4, Volt, true)

Desde la PC (lenguaje Visual C#):
Código: [Seleccionar]

byte[] Packet;
UInt32 Data;
float Volt = 0;

// Esperar 0.5 segundos por un paquete UDP, en puerto 4980.

if(PioBoard.Cmd.Udp.Receive(4980,0.5,out Packet) == UdpReceiveStat.Success)
{
   // PAQUETE RECIBIDO!!!

   // Convertir 4 bytes en un entero de 32-bits.
   // Recordar que el byte menos significativo llego primero.
   Data = (UInt32) Packet[0];
   Data |= ((UInt32) Packet[1] << 8);
   Data |= ((UInt32) Packet[2] << 16);
   Data |= ((UInt32) Packet[3] << 24);

   // Convertir entero de 32-bits a float.
   Volt = (float) Data;

   // Imprimir valor en ventana.
   MessageBox.Show(Volt.ToString(), "Voltage 1:", MessageBoxButtons.OK, MessageBoxIcon.Information);

}
else
{
   // NO SE RECIBIO NINGUN PAQUETE.
}

Avisame si te funciona o cualquier duda.

« Última Modificación: julio 23, 2013, 18:01:12 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2144
  • Soporte Técnico
Re: UDP: Envio de dato float desde PLC a PC
« Respuesta #2 : julio 23, 2013, 17:49:03 pm »
Si necesitas el ejemplo en lenguaje Ladder, avisame.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

GermanM

  • Novato
  • *
  • Mensajes: 15
Re: UDP: Envio de dato float desde PLC a PC
« Respuesta #3 : julio 23, 2013, 17:58:57 pm »
OK, en breve lo voy a probar y te respondo que resultados tuve, muchas gracias por la info.

Saludos,

GermanM

GermanM

  • Novato
  • *
  • Mensajes: 15
Re: UDP: Envio de dato float desde PLC a PC
« Respuesta #4 : julio 24, 2013, 16:52:54 pm »
Ok, está claro como implementarlo para Pawn y para el envío de 1 elemento, ya que la función UdpSend en Pawn admite como argumento un float.

UdpSend(192,168,1,15, 4980, 4, Volt, true)


Ahora en ladder, yo estoy enviando un arreglo de int32 (ahora empaquetado) al cual le voy a agregar un elemento para enviar el dato float. Pero el bloque SEND UDP no admite como argumento una variable float.

Como alternativa se me acurre, armar el siguiente script:

if(CurrentFlow)
{
   // Aqui puede escribir código que se ejecutará
   // cuando el flujo de corriente sea "1".
     
   gi_TEMP_INT = int: gf_TEMP_FLOAT    // donde gi_TEMP_INT pasaria a tener el valor en entero
                                                       // de gf_TEMP_FLOAT que es la temperatura en float.
}

Luego con un componente ladder de Operaciones aritmeticas con valores Int32 asignar a DATA_TX[5] el valor de TEMP_INT.


Si tenes algun ejemplo de implementación en ladder te lo agradecería.

GermanM




Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2144
  • Soporte Técnico
Re: UDP: Envio de dato float desde PLC a PC
« Respuesta #5 : julio 24, 2013, 18:49:10 pm »
Ya tenes el float con el valor a transmitir ?.

Si es asi, proba simplemente insertando el siguiente codigo Pawn antes de enviar:

Código: [Seleccionar]
// Copiar el valor "binario" del float al entero (sin cast).
gai_DATA_TX[5] = gf_TEMP_FLOAT

Esto permite copiar el formato o valor binario del float a el array Int32. Notar que el valor
resultante no puede ser leido como un entero, pero el contenido binario continua siendo "float".

Para insertar el codigo, podes utilizar el componente PawnQuickInsert.

Luego transmiti el array DATA_TX[] normalmente, con Packed=true. La cantidad
de bytes a enviar en este caso es 4 x Tamaño_del_Array.

Te paso el ejemplo en Ladder en la foto de abajo.

Avisame si tenes mas dudas.
« Última Modificación: julio 24, 2013, 19:16:56 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

GermanM

  • Novato
  • *
  • Mensajes: 15
Re: UDP: Envio de dato float desde PLC a PC
« Respuesta #6 : julio 24, 2013, 19:33:38 pm »
Muchas gracias por el soporte, quedo funcionando perfecto.

Saludos,

GermanM