Comunicación Visual .Net con PLC (ex Modo DAQ)

  • 19 Respuestas
  • 517 Vistas

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1885
  • Soporte Técnico
Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
« Respuesta #15 : enero 29, 2018, 20:10:35 pm »
Te mando los programas, el del PLC (monIO) y el de VisualBasic (monIOBD).

Buenas tardes.

Estuve probando varias horas seguidas el programa en VisualBasic con el PLC, y no hubo errores en la comunicación.

La única parte que modifique porque me parecía que había un loop for innecesario fue la siguiente (en verde está lo comentado y en rojo lo modificado):

            If (PioBoard.Cmd.Udp.Receive(4980, 5, Packet) = UdpReceiveStat.Success) Then
                REM For i As Integer = 0 To (Packet.Length - 1)
                REM dataInt = CInt(Packet(4))
                REM Next

                dataInt = Packet(4)
                lblBitCiclo.Text = dataInt
                If dataInt = 0 Then
                    intTmr = intTmr + 1
                Else
                    tmrPLC.Enabled = False
                    If intTmr > 0 Then
                        Dim tm As TimeSpan = TimeSpan.FromSeconds(intTmr)
                        ListBox1.Items.Add(tm)
                    End If
                    Call Reset()
                    intTmr = 0
                End If
            Else
                MessageBox.Show("Intente Nuevamente...", "No se Recibieron Datos", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If


Por lo demás el programa conmutaba el rele en todo momento sin error.

Veo que es algo muy aleatorio, ¿tenés alguna forma de reproducir el error así me ocurre?.

También probaría no agregar elementos en el ListBox, ver línea:

ListBox1.Items.Add(tm)

Ya que es muy raro, pero a lo mejor al incrementarse los items, produce el desborde de memoria del programa.
Al menos para probar lo comentaría, y luego realizar nuevamente el ensayo.

Por otro lado, físicamente:

¿Estás conectando la salida del PLC a algún tipo de carga inductiva?.
¿El cable Ethernet desde el PLC a la computadora, es muy extenso?.

Saludos

« Última Modificación: enero 29, 2018, 20:12:12 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

cimx

  • Novato
  • *
  • Mensajes: 10
Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
« Respuesta #16 : enero 29, 2018, 20:50:23 pm »
Muy bien, muchas gracias.

En esta aplicación lo que hago es simular tiempo ciclo de una máquina.
-Cada que se cumple un ciclo(cierto tiempo), hago set un bit del PLC.
-La aplicación visual monitorea el estado de ese bit y cuando sea True, lo convierte en False.
-El Listbox lo pongo como testigo que me indica cada cuánto tiempo se está cumpliendo un ciclo.

-No tengo conectado nada a la salida del PLC, solo activo la salida para escuchar que está corriendo el programa.
-El cable del PLC a la PC es corto, todavía son pruebas y las hago de manera local.

Gracias por el soporte, probaré con las correcciones que me sugieres, muchas gracias!

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1885
  • Soporte Técnico
Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
« Respuesta #17 : enero 30, 2018, 11:41:15 am »
En esta aplicación lo que hago es simular tiempo ciclo de una máquina.
-Cada que se cumple un ciclo(cierto tiempo), hago set un bit del PLC.
-La aplicación visual monitorea el estado de ese bit y cuando sea True, lo convierte en False.

Si, la prueba que realicé tenia el mismo comportamiento.

-El Listbox lo pongo como testigo que me indica cada cuánto tiempo se está cumpliendo un ciclo.

Claro, decía de quitarlo del programa porque cada vez que agregás un elemento, ocupa memoria en una lista.
Luego repetir ensayo.

Solo es para descartar que el error no este por ese lado (en caso que la lista se haga extremadamente grande).

-No tengo conectado nada a la salida del PLC, solo activo la salida para escuchar que está corriendo el programa.
-El cable del PLC a la PC es corto, todavía son pruebas y las hago de manera local.

Bien, solo era para descartar algún ruido eléctrico.

Saludos
« Última Modificación: enero 30, 2018, 11:45:26 am por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

cimx

  • Novato
  • *
  • Mensajes: 10
Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
« Respuesta #18 : febrero 08, 2018, 02:06:27 am »
Muy bien!
La aplicación ya se estabilizó.
Ahora tengo otra cuestión; Quisiera leer el CV de un contador.

Dim Packet(8 ) As Byte
Dim dataInt(8 ) As Integer
        Try
            If (PioBoard.Cmd.Udp.Receive(4980, 9, Packet) = UdpReceiveStat.Success) Then
                For i As Integer = 0 To 8
                    dataInt(i) = CInt(Packet(i))
                Next
            Else
            End If
            lblIntCiclo.Text = dataInt(1)

        Catch ex As Exception

        End Try


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?

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1885
  • Soporte Técnico
Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
« Respuesta #19 : febrero 08, 2018, 10:30:27 am »
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[]):

Código: (Pawn) [Seleccionar]
// 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.

Código: (Visual Basic) [Seleccionar]
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



« Última Modificación: febrero 08, 2018, 10:37:54 am por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com