La semana pasada te contaba qué es ViSnap7.
Pues ahora, es la hora de presentarte el Framework de ViSnap7.
Y creo que te va a gustar (o eso espero).
Básicamente se trata de una variación en pequeño de la plantilla incluida en el curso de HMI con VB.NET y Snap7, ya que a día de hoy, con la plantilla se pueden hacer muchas más cosas (gestión de usuarios, gráficas, recetas, alarmas…) cosa que con ViSnap7, no se puede de saque.
Framework ViSnap7
La idea de este framework es ayudarte a realizar HMI en VB.Net de una forma lo más sencilla y limpia posible:
- No depender de DLL
- Fácil de configurar y usar los controles
- Fácil de añadir nuevos controles
ViSnap7.org
Todo este proyecto lo he subido en una nueva página: https://visnap7.org
Ahí podrás encontrar la información disponible del proyecto. El código, lo podrás encontrar ahí, o bien en su repositorio de Github https://github.com/igutiez/ViSnap7
Para los alumnos del curso de HMI con Snap7 tendrán nuevos vídeos que empezaré a grabar en breve, para así que sepan cómo usarlo.
También será el nuevo curso de Guorker.com
Te lo cuento todo, en el siguiente vídeo:
¿Qué te parece?
Espero que te haya gustado y le puedas ver interesante.
Realizarlo está siendo muy gratificante, pero lleva mucho, pero que mucho tiempo desarrollarlo hasta el punto en el que está.
En contraprestación, una vez tienes el control, y el motor, se puede trabajar tantas veces como quieras con ello.
Espero tus comentarios y contribuciones de todo tipo.
Enseño a programar PLC de Siemens a través de mis cursos.
Más información sobre mi aquí
Puedes seguirme en cualquiera de las siguientes redes sociales.
19 Comentarios
Hola Iñigo:
He visto tu aporte, que me parece bien, además de entender el trabajo que realizas, teniendo en cuenta que los traductores de C a NET no son del todo correctos, tiene mucho mérito traducir un código de 5200 líneas desde C a NET.
Ahora te comento una primera cosa, para ello realizo este vídeo, en el que expongo la comunicación por IP, o bien por puerto serie, ¿es esto posible con tu sistema?.
https://youtu.be/z35-5Islgow
Ahora la segunda cosa, has hecho los controles exclusivos para tu aplicación, que está muy bien lo de parametrizarlos con el PLC, luego la cuestión es, ¿lo puedes hacer con los controles de NET que no sean exclusivos?, para ello mira este vídeo:
https://youtu.be/bY9COHR9td0
Dependiendo de esas cuestiones, podré orientarte de una forma u de otra.
Saludos.
No, solo se puede hacer sobre TCP, que es donde se monta en este caso el enlace S7.
Repecto a controles, claro, de hecho uno de los controles es un control creado por mi con 8 leds simulando los 8 bits de un byte de una tarjeta, bien de entradas o de salidas.
Por eso no hay problema. La gracia precisamente está ahí, en que te crees precisamente tus propios controles. Otra cosa es que empiece por los más básicos y que más va a usar todo el mundo por su generalidad.
Luego si ya te quieres hacer tu mismo uno que sirva para controlar variadores de Schneider (por decir algo) es cosa tuya.
Buenas de nuevo Iñigo:
A ver si yo me entero:
Sólo funciona por IP y no por puerto serie.
Los controles que debes usar son los creados por ti y no puedes usar los propios de NET.
El lector que has creado de los 8 bits SOLO se puede usar a través de la tarjeta enlazada.
Te pongo un ejemplo de uso:
¿Se puede cambiar cualquier bit desde cualquier botón de los que tú has creado, una vez compilado el programa, cuando el usuario use el programa en su PC?, o, una vez enlazado el botón X con el bit X ya no se puede cambiar de ninguna forma, y por lo tanto el botón X sólo actúa sobre el bit X.
En caso de que se pueda cambiar de alguna forma, ¿sería con cualquier botón o sólo con los preconfigurados por ti?.
Saludos.
A ver.
Lógicamente puedes usar todos los controles de Visual Studio. Estaríamos buenos si no se pudiera.
Respecto a los botones que he creado yo, puedes crear tantos botones como te de la gana con direcciones diferentes. Igualmente con el resto de controles.
Es una clase que heredada de Button a la que yo le añado el código para que funcione con el motor que se conecta a los PLC.
Puedes cambiarle la dirección cuando te de la gana, vuelves a compilar y cogerá esa nueva dirección. Lo que no puedes hacer es en tiempo de ejecución cambiar las propiedades del botón, porque la que puedes liar sería buena.
Lógicamente las funcionalidades del PLC, solo lo tienen los controles que están programados a dicho efecto. De ahí que puedas ir creando nuevas clases y controles que hagan lo que tú quieras y que en el siguiente proyecto solo tengas que arrastrar y soltar.
Es básicamente un intento de WinCC Flexible, pero con Visual Basic.Net
Buenas Iñigo, parece que ya voy entendiendo la forma de trabajar en tu proyecto.
Respecto a tu respuesta, ya sé que se pueden crear tantos Button como quieras, que puedes crear tus propios controles o clases etc, etc, pero todo esto que tú creas, tienes que condicionarlo a la variable que sea de tu PLC, no pudiendo en tiempo de ejecución modificar la variable que se enlazó antes de compilar.
Lógicamente, eso limita la aplicación a lo que hay en el PLC, no pudiendo hacerlo a la inversa, es decir, hacer los cálculos en NET para después pasar el resultado al PLC, que en este caso, lo único que tendría el programa del PLC sería los bit puestos sin programar, únicamente para activar las salidas , tal como aprecias al fondo en este vídeo que he grabado porque como tu dices, en un vídeo se ve más claro:
https://youtu.be/_C1EXOe9n18
De todas formas, lo que yo quería entender de tu sistema, lo que mas me ha gustado de tu invento, es la tarjeta de 8 bits que has creado, me parece muy interesante crear clases propias. pero OJO, no con la idea de un botón solamente, sino cómo idea de una MACRO que sería tu tarjeta de 8 bit pero que se pueda cambiar lo que tenga enlazado en tiempo de ejecución , en definitiva, que arrastrando, soltando igual que tú has hecho con tus 8 bit de la tarjeta, esta se pueda usar la MISMA tarjeta de 8 bit para cualquier PLC en TIEMPO DE EJECUCION, sin tener que hacer otro proyecto y sin volverlo a compilar.
Como ves imaginación no me falta, voy a analizar tu código de los 8 bit de las tarjetas, aunque sé que tenemos 4 sistemas diferentes en este caso, tú con Siemens, yo con Schneider, tu clase en VB NET, la mía en C, no obstante lo miraré, si consigo sacar algo interesante lo comentaremos por aquí.
¿Me crees capaz de hacer lo comentado?.
Gracias por tu aportación.
Saludos.
Se puede hacer todo lo que quieras hacer. Si quieres realizar cálculos en tiempo de ejecución y mandarlo al PLC, no hay problema tampoco. Existe un control no gráfico que se escribe desde el código.
El único requerimiento para usar los controles, leer y escribir de forma que no tengas que hacer nada, es declararlo en el backend.
Si lo que quieres es leer y escribir en el tiempo de ejecución, también lo puedes hacer usando el core usando la lectura y escritura normal que soporta Snap7 (y en este caso ViSnap7.
Puedes hacer lo que quieras. Pero evidentemente, no se puede pretender que arrastrando y soltando, el programa sepa dónde vas a querer escribir o leer, si no se lo has dicho previamente.
De hecho, en las pantallas de Siemens, no hay un solo control que no hayas tenido que darle las direcciones. Pues esto es lo mismo.
A partir de ahí, pues picando código puedes hacer lo que quieras.
Y un HMI, al menos de los que yo he manejado y conozco, no se da las direcciones nunca en tiempo de ejecución, ya que son para manejar la máquina.
Si lo que quieres es visualizar una señal en concreto, tendrías que hacer un control, plantilla o como lo quieras llamar para hacer lectura y escritura uno a uno, ya que no se conoce previamente. Pero por poder, podrías.
Pero en ese berenjenal no me voy a meter, porque no lo he tenido que usar en 20 años. si quieres visualizar una variable o la quieres manejar, lo suyo es que sea parte del HMI y fijo, no que te tengas que saber dónde leer o escribir, o peor, dejar a cualquiera que pueda escribir en una dirección a su antojo.
Pero como digo, por poder, se puede. Pero no por ViSnap7, sino por cómo es Snap7
Hola Iñigo:
https://youtu.be/XYTjbwmrbEY
Creación de controles con clases heredadas, arrastrando, soltando, y que se configuran en tiempo de ejecución, tal como comentamos ayer, en un principio este es un primer paso, ahora seguiré analizando esta historia para bueno o para malo, ya veremos que se puede hacer, gracias por tus aportes.
Espero tu opinión al respecto.
Saludos.
Como digo, todo es posible, incluyendo un control de arrastrar y soltar y que haga lo que comentas: https://www.linkedin.com/posts/igutiez_visnap7-activity-6836778403161493504-2ZGu
Hola Iñigo:
https://youtu.be/5q1TChKdPbQ
Sigue las otras partes.
Me gusta la programación como hobby, por este motivo hice mi canal, que cómo sabrás es un canal cuyo fin es demostrar a la gente hasta donde se puede llegar, a estudiantes, a universitarios, a los autodidactas, incluso a gente cómo tú, para muestra, el FACTORY IO lo conocí aquí en este tu blog, pues ya ves en mi canal todo lo que da FACTORY IO de si, pues los ejercicios que hay realizados con el no tienen par.
Ahora, vamos a seguir inventando nuevos controles basándome en tu fabulosa idea, por cierto, no tengo Linkedin, me gustaría que los vídeos los subieses por aquí, pero más detallados, ya me entiendes.
En definitiva, de lo que se trata es, de programar como un hobby.
Saludos.
Hola Iñigo:
Pilotos de señal, llenado de depósitos, trackbar:
https://youtu.be/HVAjtT4lWKw
Graficando:
https://youtu.be/lD2qt815FPQ
Todo ello arrastrando y soltando, ten en cuenta mi detalle de la configuración a través del nombre, pues facilita mucho las cosas.
Seguiremos investigando gracias a Visnap7
Gracias de nuevo por tus aportes.
Saludos.
Has realizado la prueba de carga? Meterle 300-400 controles y en qué tiempo refresca? Porque ahí es donde suelen estar los problemas si realizas de uno en unos las lecturas (que no sé si es el caso).
Si son 10 controles, puedes hacerlo como quieras. El tema es cuando tienes que leer, como es en un horno, 1000 lazos de control, cientos de estados de alarmas etc.
Respecto a los nombres, es una forma, aunque no me gusta, porque cuando luego en el programes trates con ello en el código para trabajar con ello, ver el código Booleano15 (me lo invento), no dice absolutamente nada de lo que es. Bajo mi punto de vista, una cosa es la dirección de memoria en un PLC, que pueden ser varios PLC conectados a la vez, y otra el nombre del control.
Es más interesante ver, y me lo invento, FinalCarreraSeguridad que LeerBooleana12. De hecho, luego cuando estés programando a más bajo nivel, que sea el booleano1, 3 o 7, me da igual. Lo que me importa para poder identificar al control con el que quiero trabajar es su nombre. Porque además, si quiero replicar el HMI para otra máquina, y por lo que sea, necesitas que tenga otra dirección de memoria… mientras que un nombre, siempre es un nombre, no un bit que hoy puede ser la entrada E100.0 y mañana, en otro proyecto la E110.6
Hola Iñigo, yo no he probado a meterle 300-400 controles porque sé que no podría hacerlo, para eso ya hay varios sistemas que yo nunca podré realizar, ahora bien, yo creo que si esos 300-400 controles se los metes a Visnap7 tampoco puede, por lo tanto no es comparable.
A ver, este proyecto ha sido idea tuya, no mía, yo lo que hago es aprender a programar porque me gusta y nada más, he visto tu idea, me ha gustado pues la pongo en práctica, en este caso, analizando cómo podría enlazar sin mucha complicación pues se me ha ocurrido leer el número final del nombre.
Dicho esto, si en vez de poner Booleana20, pues ponemos, si quieres FinalCarreraSeguridad20, al final NET lee el número no el concepto, y si replicas en otra máquina, pues cambias los nombres desde reemplazo rápido, de todas formas da igual, porque como ya digo se trata de aprender nada más, no obstante mañana voy a hacer un vídeo con dos formas de recargar valores, de una forma parpadeará, de la otra no, obviamente si parpadea está recargando, si no parpadea no recarga, de dicha forma sólo recarga las variables que cambien, con lo cual el sistema va mucho más rápido.
Mañana lo vemos, gracias de nuevo.
Saludos
Ahí radica la gracia de cómo en Visnap7 hace la lectura, y de ahí que esté programado como lo está. Te dejo un enlace en Linkedin donde maneja 1500 controles en 0,5 segundos de refresco. Además, está pensado para que puedas interaccionar sin hacer nada especial con todos los PLC que metas. Evidentemente todo tiene un límite, pero es muy alto.
Lo he colgado nuevamente en Linkedin. Aquí haré más vídeos en otros momentos más elaborados: https://www.linkedin.com/posts/igutiez_visnap7-activity-6837493456223404032-bBlO
Y aquí con colores en función del valor: https://www.linkedin.com/posts/igutiez_y-ahora-los-1500-controles-pero-con-coloricos-activity-6837497989615886336-5QhZ
En este último, metiéndole más caña: https://www.linkedin.com/posts/igutiez_visnap7-activity-6837501793254043648-4tp8
Ya sé que el proyecto ha sido cosa mia. Pero la idea del proyecto es hacer algo mas que reutilizar controles donde puedas arrastrar y soltar un control, sino que sea lo más eficiente posible.
En el curso de Snap7 en donde empecé con todo esto. Y claro, hay muchas variables a tener en cuenta: que admita varios PLC, y que si añades 100 controles, que tampoco son tantos, no se ralentice. Que puedas añadir los controles en cualquier formulario del proyecto, no solo en el principal…
Ahora con ViSnap7 quiero dar el siguiente paso, es usar los smart tags, y que sea más fácil añadir controles al listado para terceras personas.
En números contenidos como 100 controles, hablamos de unos pocos milisegundos: https://www.linkedin.com/posts/igutiez_visnap7-activity-6837504539533307904-rDjP
Hola Iñigo, la plataforma NET lee muchos controles en medio segundo, los recorre, hace lo que tenga que hacer para devolver el resultado, en este vídeo recorriendo 1500 controles, puede al mismo tiempo escribir, leer, comparar, detener el reloj a la vez que manda un msbox:
Este vídeo lo acabo de hacer:
https://youtu.be/zKovDyFmVjs
En estos vídeos, se ve la velocidad con la que comunica con el PLC:
En este lee cada pixel negro del dibujo, calculando su posición a la vez que conecta con Factory:
https://www.youtube.com/watch?v=ciMfXQMgA34
En este cada punto del trayecto escogido, observa que todos los valores los va pasando al PLC:
https://www.youtube.com/watch?v=gxpDx5XETsU
En este otro, recorre todos los puntos en rojo de la figura, que también los va pasando al PLC:
https://www.youtube.com/watch?v=Xmil8VX-if4
De todas formas, me gustaría que tus vídeos fuesen más detallados, que se vea cómo empieza la comunicación, que se vea el autómata, que se vea cómo calcula, en definitiva, que se vean los detalles y no sólo una tabla que cambia los colores o que cambia muy rápido, ya que de esa forma para mi no significa nada, es decir, que yo quiero ver el sistema funcionando, no sólo una tabla, sino algo más.
Gracias de nuevo.
Saludos.
No se trata de representar muchos controles, sino que cada control sea una dirección de memoria diferente. Si pones 1500 enteros, que sean 1500 enteros diferentes, con sus direcciones diferentes. No 1500 controles que tienen 10direcciones realmente físicas (por lo que he visto). Y que puedas cambiar los DB, que no siempre las direcciones estén seguidas.
Por lo que yo he entendido, tienes 10 direcciones de memoria repetidas un montón de veces. No es el punto. El punto es tener 1000 controles con 1000 direcciones diferentes de memoria y leerlas en 500ms estando estas direcciones en 10 DB, por ejemplo.
En el ejemplo que te he pasado antes, cuando se leen 1500 controles hablamos de que se están leyendo 3000 bytes, y hay que hacerlo que no se dilate demasiado en el tiempo.
Esto es un problema que se tiene si se hace una lectura por control, de ahí que haya que agrupar la lectura de los controles. Porque si haces 1500 peticiones de lectura, el HMI es inservible.
Estás mezclando la capacidad de refresco de los controles cuando estos controles son miles, que eso depende del propio PC y de lo que le estés pidiendo, con el leer del PLC miles de variables.
Ambas dos cosas son un problema, pero hablamos fundamentalmente de leer miles de variables del PLC en un tiempo razonable, que debería estar por debajo de 1 segundo.
En definitiva, lo que estás haciendo con lo que yo pretendo, no es lo mismo.
Leer 10 variables del PLC, evidentemente es muy rápido.
Luego jugar con esos 10 es trivial. La dificultad, insisto, es en que las direcciones de memoria no están repetidas.
Finalmente, en el ejemplo que pones claramente no hace las operaciones en 500ms ya que ve a simple vista que tarda bastante más en recorrer los 1500 controles. Poner un temporizador a 500ms no implica que se ejecute todo ello en ese tiempo. Calcula el tiempo desde que arranca hasta que finaliza, y verás que no son 500ms. Yo tomo la hora del reloj en milisegundos cuando arranca las operaciones, y paro el reloj cuando terminan. Esa es la verdadera cuenta, no como configures un timer.
Hola Iñigo, yo me he limitado a hacer lo que veo en tu vídeo, pues yo no he visto en tu vídeo leer 1500 controles en diferentes direcciones, por otra parte, cada ticks del timer es de 200 milisegundos, si lo ponemos menos, se bloquea pues lo he probado, esto significa que le da tiempo a leer una variable aleatoria de entre 10, recorrer los 1500 controles, si coinciden lo pone amarillo y si no le da otro valor, escribiendo en la palabra que lee aleatoria el valor leído en dicha palabra haciendo la suma comparándolas hasta que todas coincidan, llegado el momento finaliza, tal como ves en el vídeo.
De todas formas me gustaría ver tus vídeos más detallados sobre el tema, si puedes hacer alguno, lo pones por aquí que yo lo vea para que lo podemos comentar.
Saludos.
Sí, haré esta semana si puedo un vídeo explicando el tema de las cargas de variables.
Saludos
Buena tarde, antes que nada saludarte soy alumno de la clase de visnap y vb.net, no logro encontrar un video que tenias como dataloger donde almacenabas datos leidos mediante visnap yvb.net y lo guardabas en un csv en un excel… o soñe el video ???
saludos!
¿te refieres a snap7 y esta entrada? https://programacionsiemens.com/como-registrar-valores-de-un-plc-desde-un-pc-en-5-min/