02 - Primer Proyecto Paso a Paso (TC Vision)
Video: https://youtu.be/_CVu0NbfSXw
#PLC #TwinCAT3 #Beckhoff #Vision #Industrial_Automation
Table of Contents:
A)
Bienvenidos a este segundo vídeo del curso de TwinCat Vision, en el que vamos a hacer un primer proyecto con TwinCat Vision paso a paso. Vamos a empezar con el proceso de instalación. Para usar TwinCat Vision, primero debemos tener instalado evidentemente TwinCat 3. Tanto para descargar uno como para descargar el otro.
Vamos a la página de Beckoff.com o Beckoff.es, veremos que tenemos un apartado de descargas en Download y Software, y hay una carpeta llamada TwinCat 3. Aquí podemos ver el TwinCat 3 Engineering y aquí podemos descargar la última versión disponible de TwinCat 3, actualmente estamos con la 4024.10. Mejor si tenemos la última versión actualizada para usar TwinCat Vision. Una vez tengamos TwinCat 3 instalado, tendremos que instalar la funcionalidad de TwinCat Vision, que tiene su propio instalador aparte. Para ello vamos a la carpeta Functions y dentro tenemos el apartado TF7000 de TwinCat Vision.
Aquí tenemos el enlace para descargar el instalador de TwinCat Vision. Cuando tengamos descargado el paquete, tenemos que tener en cuenta que tenemos que ejecutar el instalador con permisos de administrador. Entonces hacemos clic en el botón derecho, y nos aparecerá en el menú una opción llamada Ejecutar como administrador.
Siempre es conveniente instalar TwinCat 3 y cualquier funcionalidad de TwinCat 3 con privilegios de administrador. Creación de un proyecto y preparativos previos. Vamos a empezar a crear un proyecto con TwinCat Vision.
Ahora tenemos Visual Studio abierto y dentro de Visual Studio vamos a crear un nuevo proyecto, File, New Project, y vamos a hacer un TwinCat Project. Una aplicación típica de TwinCat. Llamaremos a TwinCat Vision Primer Proyecto, por ejemplo.
Bien, ya tenemos creada la plantilla del proyecto y antes de ir por faena vamos a hacer algunos ajustes previos necesarios para trabajar con TwinCat Vision. Empezaremos configurando el interfaz Ethernet. Ahora tenemos un PC en el que vamos a ejecutar TwinCat Vision, en este caso es mi portátil, pero podría ser un PC industrial.
En cualquier caso, tendremos una cámara conectada a dicho PC y tenemos que establecer esa comunicación. Para ello es necesario tener instalado en el interfaz Ethernet, en la tarjeta Ethernet, el driver de Realtime Ethernet, que también se usa para Ethercat. ¿Esto cómo se hace? Pues tenemos que ir a la opción TwinCat, Show Realtime Ethernet Compatible Devices.
Aquí se van a listar los adaptadores de Ethernet que tengamos en nuestro equipo. Aquí tengo un montón de adaptadores virtuales incompatibles y adaptadores varios. Básicamente debemos tener un adaptador en Compatible Devices.
Ahora yo no tengo ninguno porque tengo uno donde ya está instalado el driver, pero antes de haberlo instalado me aparecía colgando de Compatible Devices. Simplemente lo que hay que hacer es seleccionar el adaptador y apretar el botón Install. Entonces después de unos segundos se habrá instalado el driver y me aparecerá tal como me aparece ahora en Install Ready to Use Devices.
Esto significa que este adaptador de Ethernet ya tiene el driver apropiado instalado para poder usar tanto Ethercat como en este caso hacer una comunicación con TwinCat Vision. Hay otros pasos previos que tenemos que hacer. Por ejemplo iremos a System, Realtime, hacemos doble clic aquí y aquí tenemos este parámetro que es el Router Memory.
Lo llaman Router Memory pero en realidad es la memoria de la que va a disponer TwinCat en tiempo real y es un parámetro que podemos configurar como en TwinCat Vision trabajamos con imágenes que tienen un tamaño considerable y podemos estar trabajando con varias imágenes a la vez en diferentes procesos. Este parámetro usualmente lo tendremos que subir. Entonces por ejemplo le puedo poner un valor de 512.
Luego esto podemos supervisar realmente cuánta memoria está consumiendo la aplicación que evidentemente siempre va a tener que ser un número inferior a este. En caso de que lo supere nos daría un error de alocatamiento de memoria. Aparte de la ampliación de la memoria disponible para TwinCat también tenemos que configurar los núcleos accesibles para la aplicación.
Con este botón Read from Target podremos leer cuántos núcleos tiene la CPU con la que estamos trabajando. En este caso tengo seis núcleos. Cuatro de ellos están compartidos con Windows y dos de ellos están aislados.
Esto significa que Windows no tiene acceso a estos núcleos y eso me permite poder usarlos al 100% de su capacidad. Esta configuración de núcleos aislados la podemos cambiar con este botón set on target. Aquí podemos seleccionar los núcleos compartidos y los núcleos aislados para TwinCat.
Pero lo voy a dejar tal como está. Si cambiamos esto tendremos que reiniciar el equipo para que el cambio tuviera efecto y lo que voy a hacer es simplemente seleccionar qué núcleos quiero que estén disponibles para TwinCat. En este caso voy a seleccionar sólo este núcleo, uno de los núcleos aislados.
De momento vamos a usar uno solo, después ya veremos cómo usar diferentes núcleos con TwinCat Vision, pero con uno ahora ya me basta. Esto en principio sería todo en cuanto a la configuración de RealTime de momento. Otro aspecto que tenemos que tener en cuenta es que necesitamos aquí que aparezca el nodo de Vision, que por defecto está oculto y para ello debemos ir aquí a la solución, al proyecto, hacer clic con el botón derecho y con esta opción Show Hidden Configurations, aquí podremos hacer que aparezca el campo de Vision.
Ya lo tenemos aquí. Luego tenemos aquí muchos otros que no vamos a usar, por ejemplo este lo podemos esconder, Safety lo podemos esconder. No molestan, pero si no lo van a usar pues mejor los ocultamos.
Configuración de la cámara. Vamos a empezar a configurar la conexión con la cámara, que realmente ya tengo conectada por Ethernet, en este caso una conexión punto a punto de la cámara a mi PC. Entonces vamos a ir al apartado Vision, vamos a hacer clic con el botón derecho y hacemos Add New Item.
Dejamos este nombre por defecto, por ejemplo, Aplicación 1. Y ahora de este elemento de Aplicación 1 vamos a volver a hacer Add New Item y vamos a seleccionar una JIC y Vision Camera. Antes de crear la conexión con la cámara tenemos que seleccionar un stack UDP IP que irá asociado a un dispositivo Ethernet. Ahora no tenemos ninguno creado, pero vamos a crear uno nuevo haciendo New y tenemos que seleccionarlo con el dispositivo.
Hacemos New otra vez. Ahora aquí me ha detectado un dispositivo Ethernet con el driver instalado, que es lo que hemos hecho en el apartado anterior. Lo puedo seleccionar y puedo dar OK.
Ya tengo creado el dispositivo, si os fijáis aquí en la mano izquierda en Devices se me ha creado un dispositivo Realtime Ethernet del cual cuelga un IP stack. Pues ahora vamos a darle a OK y ahora con esta ventana me permite hacer una exploración a nivel de IP de las cámaras para encontrarlos automáticamente. Hacemos Discover Devices y efectivamente he encontrado la cámara que tengo conectado a mi dispositivo Ethernet.
Aquí aparece la IP y le doy a OK. Ahora ya tenemos la cámara creada y aquí la tengo seleccionada, cámara 1, y en esta pestaña general vemos que tenemos conectividad con la cámara, estamos online, está disponible la cámara. Estamos ahora en modo config, no hemos activado configuración ni nada, pero ya tenemos comunicación con la cámara.
Si vamos a la pestaña Configuration Assistant, aquí podremos hacer una adquisición de las imágenes de la cámara. Si damos aquí a este botón Start Adquisition, ahora estoy recibiendo imágenes directamente de la cámara. Aquí veis mi mano, aquí veis como estas letras que tengo aquí puestas las puedo modificar.
Ahora cuando esté ya la aplicación en modo run y haciendo la adquisición hacia el programa de PLC no tendremos esta opción, pero en modo config sí que tenemos la opción de ver directamente la adquisición de la cámara. En modo run también podremos, pero por otros medios, no mediante esta ventana, sino de otra manera que ya explicaremos más adelante. Pero esta ventana nos puede ser de utilidad pues para ajustar la cámara, para ajustar el foco y ver si el encuadre es el correcto y ajustar lo que haga falta.
Aquí también tenemos algunas opciones como el debayering, esto es una cámara en color y ahora estamos interpretando adecuadamente el formato de la imagen. Si le doy a debayering entonces sí que interpretará el color de los píxeles y aquí también tenemos un campo para ver el valor de cada color, de cada píxel y también para ver la posición del cursor. Aquí también tenemos algunas opciones como para seleccionar un ROY, una región de interés que queramos visualizar de la imagen total.
Si le damos aquí nos permitirá seleccionar una región para visualizar y con este botón la podemos resetear. Aquí tenemos algunas opciones de calidad, de escala y en la parte derecha tenemos acceso a los parámetros de la cámara que son accesibles a través del protocolo de JIG y Vision, por ejemplo aquí podemos ver información de la cámara pero también hay parámetros que podemos modificar, por ejemplo este es el ancho y la altura de la imagen, esto por ejemplo podría venir aquí y modificarlo a un 500. Cuando tengo un parámetro seleccionado en la parte inferior me aparece la información relativa a ese parámetro y para que este cambio sea efectivo le doy a writeValue.
Veis cómo ha cambiado el tamaño de la imagen que me está enviando la cámara y ahora lo que voy a hacer es volver a escribir el mismo valor que había originalmente, 1024. Después por aquí arriba tenemos algunas opciones, opción experto para ver más parámetros todavía, vamos a dejarlo en beginner y aquí tenemos un botón de configuración donde tenemos algunas opciones más para leer los parámetros de la cámara de nuevo, para aborcar los cambios locales y esta opción write initialization commands es importante porque esto nos permite crear una lista de parámetros que será cargada en la cámara en la inicialización. Ahora he creado esta lista de parámetros y aquí tengo un error que me da con dos de ellos por algún motivo pero no tiene demasiada importancia, simplemente le decimos que cree esta lista de parámetros, el write initialization commands, que lo haga de todas formas.
Proyecto básico de PLC con TwinCAD Vision. Para empezar con TwinCAD Vision vamos a hacer un primer proyecto de PLC muy sencillito, simplemente para visualizar la adquisición de la imagen de la cámara. Para agregar el proyecto de PLC vamos aquí al campo PLC, hacemos add new item, standard PLC project y le damos un nombre.
Hasta aquí todo igual que en un proyecto de TwinCAD PLC normal. Ya tenemos creada la plantilla del proyecto de PLC y lo primero que necesitaremos en el proyecto de PLC es agregar la referencia de la librería de TwinCAD Vision. Para ello vamos aquí a references, hacemos add library y ya la vemos aquí directamente, Vision, TwinCAD 3 Vision.
Ahora sobre el propio POUMain he copiado el código de un proyecto muy sencillito que vamos a ir comentando paso a paso. Vamos a ver las variables que tenemos aquí declaradas. En principio tenemos una variable que se llama HR y es del tipo HResult.
Esto es así porque todas las funciones de TwinCAD Vision devuelven este tipo de dato, un HResult, que indica si la función se ha ejecutado correctamente, entonces devolvería un código de éxito o bien devolverían un código de error. Básicamente son estas dos posibilidades. Después tenemos una función block que le hemos llamado fbCamera y es del tipo SimpleCameraControl.
Este es el prefijo que indica la función block de TwinCAD Vision. La función block SimpleCameraControl sirve para gestionar la comunicación con la cámara, gestionar su estado y hacer la adquisición de imagen, básicamente. Entonces con esta función block crearemos una máquina de estados que ahora comentaremos, que será prácticamente idéntica en todos los proyectos de TwinCAD Vision que hagamos.
CamState es una variable de este tipo y sirve para recibir el estado de la cámara. Esto sería un enumerador con una serie de estados posibles. Después tenemos una variable de tipo IPImageIn, que sería un InterfacePointer a una imagen.
De la cámara vamos a recibir una imagen y esa imagen la vamos a referenciar en el proyecto con este objeto IPImageIn. Después tenemos otro objeto IPImageInDisp, que es del tipo DisplayableImage. Tenemos básicamente dos tipos de imágenes, objetos tipo Image y objetos tipo DisplayableImage.
Los objetos Image sirven para procesar las imágenes pero no para visualizarlos. En cambio las DisplayableImage sirven para visualizar las imágenes. Entonces en el momento en que queramos visualizar el resultado de un proceso de una imagen tenemos que hacer una conversión de un tipo a otro.
Esto ya lo veremos. Bien, entonces ¿qué hacemos en este código básico de gestión de la cámara? Pues lo primero que haremos es llamar al método getState del FBCamera, que recordaremos es del tipo SimpleCameraControl. Y esto nos devuelve el valor de la variable de estado camState.
Sobre esta variable camState es sobre la que construimos la máquina de estados para gestionar la comunicación con la cámara. Entonces básicamente lo que haremos es hacer una serie de estados posibles, estado inicial, opening, opend y startAdquisition. En cualquiera de estos estados lo que hacemos es llamar al método startAdquisition para que la cámara nos empiece a enviar imágenes.
FBCamera.startAdquisition. Como vemos esto nos devuelve el HR, que es de tipo HResult. Esto siempre lo vamos a supervisar este código que nos devuelve una función. Se lo vamos a pasar siempre a la siguiente función que llamemos para comprobar si seguimos ejecutando la cadena de funciones o si la interrumpimos.
El Trinket Vision funciona de esta manera. Siempre una función supervisa el resultado de la función anterior. Bueno esto lo veremos mejor en otro ejemplo que no en este, porque aquí simplemente llamamos a funciones en diferentes estados, pero cuando hagamos un procesamiento sobre una imagen sí que llamaremos a diferentes funciones en el mismo ciclo de scan y entonces sí que nos interesará esto mismo.
Bueno resumiendo, en cualquiera de estos estados llamamos a startAdquisition con el objeto de cambiar el estado de la cámara al estado de adquisición, acquiring. Esto significa que la cámara ya está en estado de adquisición, ya nos está enviando imágenes periódicamente. ¿Y qué hacemos en este estado? Pues en este estado llamamos al método fbCamera.getCurrentImage y le pasamos el interface pointer ipImageIn.
Cuando hayamos recibido una imagen nueva entonces esta variable apuntará a dicha imagen y el resultado, el hResult, será exitoso. Eso lo comprobamos con la función succeeded, la función succeeded le pasamos el código de resultado y succeeded nos dirá falso si no hemos tenido éxito o true si hemos tenido éxito en la última función que hemos llamado. Y por último una doble comprobación.
Miramos que el ipImageIn sea diferente de cero para comprobar que este puntero esté apuntando a una dirección diferente de cero. En este momento si hemos tenido éxito en el getCurrentImage significa que ya tenemos una imagen disponible en el ipImageIn pero esta imagen no la podemos visualizar porque es una imagen tipo image. Solo podemos procesarla pero no podemos visualizarla.
Entonces lo que hacemos aquí es copiar esta imagen en una imagen que podamos visualizar, una displayable image. Y aquí le pasamos los dos parámetros, copy into displayable image, la source image, la imagen original sería la imageIn, que la copiamos y la transformamos en una imagen de tipo displayable, ipImageInDisp. Y si os fijáis aquí le pasamos también como parámetro el resultado de la operación anterior.
¿Y esto por qué se hace así? Pues porque esta función comprobará el resultado de la función anterior. Si fuera un resultado erróneo entonces esta función directamente no se ejecutaría, volvería a reportar el mismo error que le hemos metido como entrada, esto es un parámetro de entrada, nos lo devolvería como el resultado de la propia función. O sea, yo no hago nada y te devuelvo el mismo resultado que dio la función anterior.
Esto es un poco el principio de funcionamiento de TwinCat Vision. Entonces, bueno, esto ya lo tendríamos, este código básico. También me he olvidado mencionar que si en algún momento el getState nos devolviera un CameraState con valor error, entonces lo que haríamos sería llamar al fdeCamera.Reset para hacer un reset de la cámara.
Esta es la estructura básica que siempre vamos a tener que implementar cuando estemos interactuando con una cámara y luego, aparte de eso, ya tendríamos nuestro propio procesamiento de la imagen, que para ello podríamos hacer una variable de estado independiente, una máquina de estados independiente, o podríamos hacerlo todo en un único ciclo de scan aquí mismo, dependiendo del tipo de proceso que sea. Ahora lo que voy a hacer es compilar este proyecto. Vamos aquí, vamos a hacer un build.
Vemos que hemos tenido éxito en la compilación. Y un paso importante es vincular esta función block fdeCamera con la cámara física, con esta cámara de aquí. ¿Cómo hacemos esto? Pues lo hacemos a través de un parámetro que se crea en la instancia del proyecto de PLC.
Este sería el código de PLC que hemos compilado. Una vez lo compilamos se crea una instancia del proyecto que podemos ver aquí, PLCVisionInstance. Entonces si vamos aquí a PLCVisionInstance, esto tiene que ser después de haber compilado de forma exitosa, y vamos a la pestaña SymbolInitialization Aquí vemos el Main.fbCamera.oid.tcvnImageProvider. Tenemos que indicarle a esta fbCamera de dónde tiene que sacar la imagen.
Tenemos que pasarle un identificador del objeto que le va a proporcionar la imagen. Esto lo hacemos aquí. Vemos que tenemos un ImageProvider disponible.
Este es el OID. Lo seleccionamos y con esto lo tenemos vinculado. ¿De dónde sale este identificador? Pues si vamos a la cámara y la desplegamos, vemos que la cámara tiene varios subapartados y este es el ImageProvider.
Cámara 1 ImageProvider. Si vamos aquí a Objet, este sería el OID del ImageProvider de esta cámara. Al haberlo introducido aquí en Instance, hemos vinculado la fbCamera que tenemos aquí creada con esta cámara que tenemos en la configuración.
Ahora nos quedaría activar la configuración. Estamos en modo local. Vamos a activar la configuración.
La configuración de la cámara actual creará diferentes comandos de inicialización. Este error que me sale a mí es debido a que hay dos parámetros que no logra escribirlos y siempre me sale este mensaje. ¿Quieres crearlo ahora? Le voy a decir que sí, aunque bueno ya está creada, pero le voy a decir que sí de todas formas.
Ahora me volverá a dar el mismo error de antes. Lo creamos de todas formas y ya está. La siguiente vez, ¿está TwinketSystem en el modo local? Le voy a decir que sí.
Posiblemente aquí sea cuando os pida la licencia. Si no la habéis añadido antes, ya sea en la versión trial o en la versión definitiva, o sea si hacéis una activación definitiva de la licencia. Voy a dar a cancelar y lo voy a mostrar.
Vamos a System, License. Aquí veis que tenemos ya unas licencias añadidas que son las necesarias para el proyecto que estamos haciendo. La GKeyVisionConnectorBase para conectar con la cámara y TwinketVisionBase que es la licencia básica de TwinketVision.
En este caso ya las tenía previamente activadas, las licencias de prueba de 7 días. Si no, simplemente es volver a activarlas. De todas formas, esto nos lo pediría en caso de ser necesario, no nos lo pediría en el momento de activar.
Voy a volver a activar otra vez.
(Este archivo es más largo que 30 minutos. Actualizar a Ilimitado en TurboScribe.ai para transcribir archivos de hasta 10 horas.)
Z) 🗃️ Glossary
File | Definition |
---|
Uncreated files | Origin Note |
---|---|
Next Part 🔜 | 02 - Primer Proyecto Paso a Paso (TC Vision) |
Next Part 🔜 | 02 - Primer Proyecto Paso a Paso (TC Vision) |