En la posición Packet(1), quisiera leer el valor del contador pero en esta instrucción veo que lo hacemos en Byte, es decir, cuando el CV del contador que quiero leer excede de '255', se resetea mi lectura y yo quisiera leer valores del orden de los miles, X000 o más.
¿Cómo puedo leer estos valores?
Buenos días.
Lo que debes hacer es desde el
PLC enviar la variable de 32-bits pero separada en 4 bytes, para luego unirla nuevamente desde
Visual Basic cuando recibas los bytes.
Por ejemplo, supongamos que tenés dos variables de 32-bits en
Pawn llamadas "
Contador1" y "
Contador2" con el valor de las cuentas. Antes de enviarla por la red, debes separarlas en 4 bytes y copiarla al paquete de transmisión (por ejemplo
Packet[]):
// Variable con cuenta de 32-bits
new Contador1, Contador2
// Array con paquete de transmisión.
new Packet[8]
// Separamos en 4 bytes a Contador1 y Contador2 mediante desplazamientos de bits y preservando solo 8-bits resultantes.
// Notar que en primer byte, colocamos los 8 bits menos significativos y en el ultimo byte los más significativos.
Packet[0] = (Contador1 & 0xFF)
Packet[1] = (Contador1 >> 8) & 0xFF
Packet[2] = (Contador1 >> 16) & 0xFF
Packet[3] = (Contador1 >> 24) & 0xFF
Packet[4] = (Contador2 & 0xFF)
Packet[5] = (Contador2 >> 8) & 0xFF
Packet[6] = (Contador2 >> 16) & 0xFF
Packet[7] = (Contador2 >> 24) & 0xFF
Luego desde
Visual Basic cuando lo recibís en array
Packet() podes utilizar el método
BitConverter.ToInt32 para recuperar el entero de 32-bits.
Dim Packet(8) As Byte
' Primer variable de 32-bits, bytes 0 a 3.
Dim Contador1 As Integer = BitConverter.ToInt32(Packet, 0)
' Segunda variable de 32-bits, bytes 4 a 7.
Dim Contador2 As Integer = BitConverter.ToInt32(Packet, 4)
No utilizo
Visual Basic, por lo que puede haber un error de sintaxis, pero esa es la idea.
Nota: Es importante que desde el PLC se transmita primero el byte menos significativo, así al recibirlos en la PC, Visual Basic los pueda unir correctamente, caso contrario, se debe invertir el orden de los bytes antes de usar el método
BitConverter.ToInt32 de conversión, para que tenga el formato esperado (algunas computadoras no basadas en arquitectura Intel pueden requerirlo, esto se llama
Endianness).
Saludos