Slicetex Electronics - Foro

PLC - DAQ => STX8092 => Mensaje iniciado por: cimx en octubre 17, 2017, 20:11:14 pm

Título: Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: cimx en octubre 17, 2017, 20:11:14 pm
Buenas tardes
Tengo un PLC CUBE STX8092, el cual quiero controlar y monitorear en modo DAQ.
Capturo el programa ejemplo que viene en el Manual de Usuario Modo DAQ en el apartado 5.3 Diseñar el Programa.

en la línea
-- PioBoard = new Stx8xxx("192.168.1.81", 0, Stx8xxxId.STX8081);

cambié por
-- PioBoard = new Stx8xxx("192.168.1.81", 0, Stx8xxxId.STX8092);

incluso, ejecuté el programa que viene de ejemplo en el archivo STX80XX-UM-DAQ-AX_BX_files

y no he tenido éxito.

Me manda el siguiente error:

"ErrorCmdUnsopportedInPLC"

Me podrías apoyar por favor?

Saludos cordiales.
Título: Re:Modo DAQ
Publicado por: Soporte en octubre 18, 2017, 10:29:37 am
Buenos días,

¿Que modelo de PLC tenés?.

El error ErrorCmdUnsopportedInPLC significa que el "comando no esta soportado en modo PLC", esto se debe a una de dos posibles causas:


En el primer caso, no podrias utilizarlo, sin embargo, si necesitas comunicarte con Visual C# en la red local en modo PLC, podes utilizar la transmisión/recepción de datos como explica la nota de aplicación AN001:

http://slicetex.com/docs/an/an001 (http://slicetex.com/docs/an/an001)

Se muestra en la nota un ejemplo para leer una entrada y para enviar datos al PLC para activar/desactivar una salida.

En el segundo caso, si tenes un modelo A1 o A2, en StxLadder  (http://slicetex.com/ladder)desde menú "PLC > Configurar PLC > Pestaña Otros", debes seleccionar Modo DAQ y reiniciar el dispositivo.

Saludos
Título: Re:Modo DAQ
Publicado por: cimx en octubre 18, 2017, 11:39:28 am
Muchas gracias por el pronto soporte.
Efectivamente, tengo un PLC CUBE STX8092 D1

Intentaré con la solución que me brindaste, reitero mi agradecimiento y te felicito por la cantidad y calidad de soporte que tienes para el producto.

Saludos cordiales.
Título: Re:Modo DAQ
Publicado por: Soporte en octubre 18, 2017, 13:18:05 pm
Perfecto, gracias, quedamos a disposición.
Título: Re:Modo DAQ
Publicado por: cimx en noviembre 01, 2017, 11:34:21 am
Buenos días

Intenté con comunicarme con los ejemplos como explica la nota de aplicación AN001 en la red local en modo PLC, y logré comunicarme con éxito para transferirle datos desde PC-->PLC

Para recibir datos de PC<--PLC , ejecuté los programas ejemplo Prueba2 VB.NET, tanto la aplicación Visual como el programa del PLC y me manda el siguiente error X Intente nuevamente!.

Modifiqué las respectivas IPs y el modelo del PLC
PioBoard = New stx8xxx.Stx8xxx("192.168.1.81", 0, Stx8xxxId.STX8092)

Me podrías apoyar por favor?
Título: Re:Modo DAQ
Publicado por: Soporte en noviembre 01, 2017, 13:24:46 pm
Para recibir datos de PC<--PLC , ejecuté los programas ejemplo Prueba2 VB.NET, tanto la aplicación Visual como el programa del PLC y me manda el siguiente error X Intente nuevamente!.

Modifiqué las respectivas IPs y el modelo del PLC
PioBoard = New stx8xxx.Stx8xxx("192.168.1.81", 0, Stx8xxxId.STX8092)

Buenos días,

Al PLC debes cargarle el ejemplo del proyecto Udp_Tx de la Nota de Aplicación.

Asegurate que tengas definida la IP de tu PC en el proyecto del PLC. Esto se hace en la línea Pawn:

Código: (Pawn) [Seleccionar]
      // Enviar paquete UDP a dirección 192.168.1.15, puerto 4980.
      UdpSend(192,168,1,15, 4980, 5, Data, false)

En el caso anterior, la PC tiene la IP: 192.168.1.15.
Asegúrate que sea la IP de tu PC en la red local la que coloques.

Al ejecutar el programa "Prueba2" en Visual C# o Basic.Net, seguramente Windows te pedirá autorización para que el programa acceda al firewall de Windows y así permitir recepción de datos por red, como muestra la siguiente imagen:

(http://foro.slicetex.com/index.php?action=dlattach;topic=288.0;attach=608)

Si no te pide, puede que lo hayas bloqueado en otra ejecución.

En ese caso, debes ir al Panel Control y navegar hasta "Firewall de Windows" como sigue:

Panel de control > Sistema y seguridad > Firewall de Windows

En ese lugar, tocar la opción "Permitir una aplicación o una característica a través de Firewall de Windows".

Vas a entrar en una ventana, tocar el botón "Cambiar la configuración" (te va a pedir clave de administrador si estas como usuario).

Luego en la lista buscar Prueba2. Hacer click en el mismo y seleccionar "Quitar" con el botón de abajo.
Si hay otro item en la lista con el mismo nombre, también seleccionar y quitar.

Finalmente para salir hace click en "Aceptar".

Luego ejecutar nuevamente el programa y cuando te pida acceso al Firewall, lo habilitas.

Fíjate si así te funciona.

Saludos
Título: Re:Modo DAQ
Publicado por: cimx en noviembre 01, 2017, 15:28:19 pm
Excelente!
Era cuestión del firewall.

Si quisiera monitorear estatus de I/Os del PLC en la PC, tienes algún ejemplo?

Saludos
Título: Re:Modo DAQ
Publicado por: Soporte en noviembre 01, 2017, 17:45:13 pm
Si quisiera monitorear estatus de I/Os del PLC en la PC, tienes algún ejemplo?

Tengo un ejemplo de un proyecto que realizamos hace un tiempo para un cliente.

Es una aplicación en C# que monitorea las entradas/salidas del PLC y lo registra en un archivo de texto (LOG).

El proyecto original era para un PLC STX8060 (http://slicetex.com/hw/stx8060) más un módulo de expansión STX570 (http://slicetex.com/hw/stx570), donde se leen las I/O del PLC y del Módulo, en total 18 entradas y 16 salidas.

Te adjunto el proyecto modificado (rápidamente) para el PLC STX8092 (http://slicetex.com/hw/stx8092), leyendo 12 DIN y controlando 12 DOUT, sin módulo de expansión.

El programa del PLC escucha conexión desde la PC y continuamente reporta el estado de las I/O. Si una entrada DIN se activa, la correspondiente salida DOUT se activa también. Al desactivarse la DIN, la salida se mantiene activada por algunos segundos de más.

Es un ejemplo del cual podes partir, es un poco avanzado porque tiene mucho código del lado de C# ya que contempla errores, genera un log, crea una tarea en segundo plano, etc.

Para probarlo, carga el código en el PLC, luego ejecuta el programa C# en Windows, ejecuta opción "Activar" y observa la pestaña "Entradas" cuando colocas un nivel alto en alguna DIN. También observa la pestaña "Salidas" y "Log".

Saludos
Título: Re:Modo DAQ
Publicado por: cimx en diciembre 21, 2017, 19:14:51 pm
Qué tal.

Ejecuté este programa que me enviaste.
Por el lado del PLC todo funciona OK, las salidas reaccionan a su entrada correspondiente, sin embargo en la aplicación visual, al presionar el botón azul me manda el error que adjunto en la imagen.

Por otro lado, sigo contemplando el viaje a Argentina para las consultas que tengo con respecto a la marca y los modelos que manejan, sería a después del 25 de enero, aunque, habría la posibilidad e hacer sesiones virtuales vía skype o team viewer en estos días? desde luego con los respectivos honorarios que esto genere.

Saludos cordiales.
Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: Soporte en diciembre 22, 2017, 20:04:14 pm
Buenas tardes,

Ejecuté este programa que me enviaste.
Por el lado del PLC todo funciona OK, las salidas reaccionan a su entrada correspondiente, sin embargo en la aplicación visual, al presionar el botón azul me manda el error que adjunto en la imagen.

Eso ocurre cuando corres el programa desde Visual C# en modo "Depuración" o "Debug".

Básicamente dice que no puede llamarse a un control desde un proceso diferente al proceso que creó el control (objeto gráfico).
Si corres el programa en modo "Release", generando desde menú "Depurar > Generar solución" el ejecutable y luego buscas el archivo "EXE" generado por el compilador en la carpeta "bin\Release" del proyecto; lo ejecutas y no tenés el problema.

En .Net no se recomienda llamar de esa manera a un control, es decir, el programa crea un proceso en segundo plano para escuchar comunicaciones desde el PLC, y cuando recibe los datos, altera textos de la ventana principal (otro proceso independiente).

Esto se debe hacer con "delegados" y otras cuestiones para hacerlo "seguro", pero para una aplicación simple como el ejemplo no es necesario.
Así que no le des mucha importancia.

Por otro lado, sigo contemplando el viaje a Argentina para las consultas que tengo con respecto a la marca y los modelos que manejan, sería a después del 25 de enero, aunque, habría la posibilidad e hacer sesiones virtuales vía skype o team viewer en estos días? desde luego con los respectivos honorarios que esto genere.

La semana siguiente es una semana un tanto complicada, acá en Argentina llega esta época de fin de año y hay más presión para terminar pedidos, por los feriados festivos, por lo que es complicado hacerlo bien con tiempo.

No dispongo para darte una asistencia en este momento por Skype o Team Viewer (pero se puede ver en otra oportunidad).

Sin embargo, más a mediado de semana, si tenes alguna consulta que no puedas resolver, podemos ver de un llamado telefónico por WhatsApp, como para aclararte algún panorama o cuestión en lo cual tengas dudas.

Si querés podes avisarme antes sobre que tema es la consulta, así estoy mejor preparado y aprovechamos mejor el tiempo.

Avísame si te parece y coordinamos teniendo en cuenta el horario que manejan en México.

Saludos.

Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: cimx en diciembre 23, 2017, 20:37:08 pm
Bien! ejecuté el programa como me mencionas, el .exe y funciona perfectamente.
Lo quería ejecutar en modo debug para ir depurando y entendiendo qué hace el programa, tanto el del PLC como el de la PC.
Este ejemplo se acerca mucho a lo que necesitamos hacer, es decir, leer estados de algunos registros del PLC y ir alimentando nuestra Base de Datos SQL.

Si nos pudieras apoyar con la llamada vía Whats App en estos días, queremos una aplicación que registre:


Reitero, creo que este ejemplo que nos compartiste nos sirve perfectamente, sólo habría que entenderlo al 100% de nuestra parte para hacer las adecuaciones correspondientes a nuestras necesidades, es decir, tal vez no leer todas las I/0's, tal vez sólo 1 ó 2, y más bien leer registros booleanos, enteros, string, creados y programados desde el PLC.

Quedo a la espera de tus comentarios.
Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: Soporte en diciembre 26, 2017, 10:49:01 am
Si nos pudieras apoyar con la llamada vía Whats App en estos días, queremos una aplicación que registre:

  • Lecturas de una entrada física que nos indicará cada cuando se efectúa un ciclo en una máquina.
  • Si la máquina ha estado detenida por cierto tiempo que la máquina no arranque hasta que no se haya capturado el motivo de de dicho paro.
  • Intervalos de tiempo de cada Ciclo.

Reitero, creo que este ejemplo que nos compartiste nos sirve perfectamente, sólo habría que entenderlo al 100% de nuestra parte para hacer las adecuaciones correspondientes a nuestras necesidades, es decir, tal vez no leer todas las I/0's, tal vez sólo 1 ó 2, y más bien leer registros booleanos, enteros, string, creados y programados desde el PLC.

Muy bien, entonces repaso el código del programa para darte una idea general sobre como funciona, así podés modificarlo.

Habilitamos WhatsApp para esta oportunidad en el número de la empresa: +54-9-351-3423793 (http://tel:+5493513423793)

Envíanos un mensaje así tenemos tu contacto telefónico.

El jueves 28/12 podríamos hacer la llamada.

Te propongo a las 14 hs (México) que serían las 17 hs (Argentina). Hay 3 horas de diferencia.

Avísame si te queda bien ese día y horario.

Saludos
Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: cimx en enero 26, 2018, 03:54:40 am
Desarrollé una pequeña aplicación para control y monitoreo de registros del PLC desde una PC en Visual Basic .NEt
El PLC Setea un Registro Booleano en True, la PC monitorea mediante un tmr cada segundo y cuando detecta el registro booleano en True, la PC lo hace False.

La aplicación corre perfectamente durante unos minutos, pero después de cierto tiempo me manda errores, a veces a los 10min, a veces a los 30min, a veces a las 2 horas.

Adjunto imágenes del error que me manda mi aplicación. Nos podrías apoyar?

Saludos cordiales 
Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: Soporte en enero 28, 2018, 19:05:16 pm
Buenas tardes.

Aparentemente por el tipo de error que te tira en la captura de pantalla: "System.StackOverflowException"

Tenés un loop o bucle infinito del cual no sale nunca porque la condición para entrar en el mismo se torna "verdadera" siempre. Dentro de este loop seguramente haces uso de memoria creando variables u objetos, lo cual al tornarse infinito produce un "desborde de memoria" o "Stack Overflow", generando la excepción que te muestra.

Puede ser un loop o algo recursivo (que se llama a si mismo infinita veces) como te sugiere el cartel de error.

Revisa en el código, cerca del error, en que parte tenés algún loop, y verifica que la condición de "salida" no se vuelva siempre falsa o que tenga algún mecanismo para salir en caso de error.

Fíjate si podes identificarlo o compartime parte del código para ver.

Saludos


Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: cimx en enero 29, 2018, 00:33:30 am
Te mando los programas, el del PLC (monIO) y el de VisualBasic (monIOBD).

Gracias por el apoyo
Saludos
Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: Soporte en 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

Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: cimx en 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!
Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: Soporte en 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
Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: cimx en 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?
Título: Re:Comunicación Visual .Net con PLC (ex Modo DAQ)
Publicado por: Soporte en 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 (https://es.wikipedia.org/wiki/Endianness)).

Saludos