Cuando hago pruebas con sistemas que no he utilizado antes, me gusta saber sus límites, así que he preparado un pequeño proyecto para poner a prueba vb.net y beckhoff. La idea es leer variables y medir el tiempo empleado. Como queremos poner el sistema al límite lo haremos con bucles. Resumiendo, leeremos un número de variables un determinado número de veces. En el programa de PLC declaramos una variable matriz y hacemos bucles igualmente para generar mucho trabajo con poco código.
Pasamos a la acción. Hoy no dejaré colgado el proyecto, si alguien lo quiere que lo pida. La idea es dejaros los pasos para hacerlo todo desde el principio.
Abrimos Visual Studio y pinchamos en nuevo.

Seleccionamos aplicación Windows form y ponemos el nombre barbaridades, por ejemplo.

En el Form1 ponemos los controles como en la siguiente figura:

El control GroupBox nos sirve para ordenar controles relacionados. Lo ponemos, lo dimensionamos y metemos dentro los dos label y los dos textbox. Cambiamos las siguientes propiedades:
Textbox1.Name à tbNRegistros
Textbox1.Text à 1000
Textbox1.TextAling à Right
Textbox1.Name à tbNVeces
Textbox1.Text à 10
Textbox1.TextAling à Right
El siguiente paso será importar la referencia a la librería para la comunicación con Beckhoff. En la pestaña explorador de soluciones click derecho sobre barbaridades y en el menú contextual agregar referencia.

Seleccionamos la pestaña examinar y buscamos C:\TwinCat\ADS Api\.NET\V2.0.XXXX\TwinCat.Ads. Doble click y ya tenemos la referencia a esta librería.

Hacemos click con el derecho en el form y seleccionamos ver código. Ya tenemos una referencia a la librería de beckhoff por lo que ya podríamos utilizarla llamando a las funciones con su ruta completa TwinCat.Ads.LaFuncionQueSea. Para evitar tener que poner todo esto añadimos al principio de nuestro código Imports TwinCat.Ads. He declarado una variable Dim Valor(200000) As Integer. Esta es una variable de matriz con 200.000 elementos de tipo integer. En esta variable almacenaremos las lecturas de las variables del PLC. Una variable conectado donde almacenamos el estado de conexión con el PLC.
Evento Form Load.
Si hacéis doble click sobre el form en la vista diseño se genera el gestor del evento Form1_Load. Este evento se ejecuta al iniciarse la aplicación. En este caso lo que he puesto es para ocultar el botón prueba. Más tarde, cuando se conecte al plc se hará visible.
Evento Button_Conectar.Click.
Para conectar al plc hacemos uso de la función conectar. Esta función intentará conectarse al PLC y nos devuelve un valor integer en función del resultado. Los posibles valores son:
1 Conexión realizada con éxito
-1 Error de conexión.
-2 Se conectó pero el PLC está en STOP.
¿Qué hace el código del evento? Lo primero que hacemos es comprobar si ya estamos conectados, en cuyo caso entendemos que el usuario quiere desconectarse. Se llama a la función desconectar, se pone la variable conectado en false, se oculta el botón probar, cambiamos el botón conectar por el texto conectar y salimos del evento.
En el caso de estar conectados la sentencia Exit Sub nos saca del gestor de eventos por lo tanto no llegará a leer la parte de código donde se realiza la conexión. De no ser así, y estar desconectado al PLC se lee Dim Resultado = Conectar(“192.168.0.2.1.1″), 801). Mediante esta línea de código llamamos a la función Conectar y recibimos el resultado en la variable de mismo nombre.
Bien, intentamos conectarnos y analizamos el resultado. Si es = 1 mostramos un cuadro de diálogo con el mensaje Conectado con éxito, ponemos la variable conectado = True, cambiamos el texto del botón por Desconectar y mostramos el botón probar. Si el resultado fuera -2 u otro mostramos el mensaje correspondiente.
Nótese que al llamar a la función Conectar tenemos que proporcionar dos parámetros, dirección y puerto que serán los correspondientes en cada caso.

La siguiente ilustración muestra las funciones que utilizamos para comunicar con el PLC. En este caso y a diferencia con el anterior post vamos a utilizar las funciones en la misma clase.

Lo primero que nos encontramos en la palabra clave Región que nos permite estructurar el código para que sea más fácil la lectura. Simplemente es para hacer separaciones pero no afecta en nada. Se trata de encerrar el código que queremos separar de esta manera:
#Región “Un nombre representativo”
‘El código que proceda
#End Region
Tenemos tres funciones, una para conectar al PLC, otra para leer marcas internas globales y la última para desconectar.
La función conectar:
Crea un cliente, se conecta y configura el TimeOut en 5000 ms, posteriormente comprueba si el estado del PLC está en RUN y devuelve un valor en función de esto. Si se produce una excepción (un error) nos devolverá -2.
La función leerM:
Nos pide una variable inicial y una cantidad de variables. La lectura de variables se realiza por flujos de datos. Este es un aspecto muy importante de esta comunicación. Supongamos una cadena donde hay eslabones negros y blancos. Un valor integer sería una cadena con 16 eslabones. Dos, una cadena con 32 eslabones y asi sucesivamente. Ahora cogemos la cadena y la metemos en una caja y dejamos la punta asomando. La caja es superdura y no la podemos abrir. Pues así de fácil, le pedimos al PLC cuatro variables de tipo integer y nos devuelve una caja con una cadena de 64 eslabones. Nosotros recepcionamos la caja, tiramos de la cadena y contamos eslabones, cuando contamos 16 miramos los colores y calculamos el valor y así seguiremos contando y calculando hasta completar la cadena. Con esta analogía el código quedaría así:
Prepara para recibir una cadena AdsStream
Prepara una caja para la cadena Read.
La cadena tiene un tamaño de Cantidad * 2 (Como lee Byte y nosotros queremos INT lo multiplicamos por 2, INT = 2 Byte)
PLC, por favor, prepárame una cadena empezando con el byte 16416 + VarInicio de longitud igual a Cantidad *2
Más tarde mediante un bucle For Next iremos leyendo la cadena y volcando los datos en una variable global llamada Valor.
Resumiendo, mediante esta función leemos una cantidad determinada de variables y las volcamos en una variable global en Vb.net. De esta manera para saber el valor de una variable en el PLC sólo tenemos que ver el Valor(i) donde i = M de PLC. Como leemos INT y en el PLC está en BYTE solo la i par tendrán valor.
Bueno pues en vb.net ya solo nos falta leer las variables:

Mediante la palabra clave Now vb.net nos devuelve el momento actual. Lo que hacemos en este evento es guardar el momento actual justo antes de leer las variables del PLC y justo después, leemos las variables del PLC tantas veces como le dijimos en el form, calculamos la diferencia de tiempos y lo mostramos en un cuadro de diálogo.
Esta es la variable global del PLC:

Y este es el programa:

Y este es el resultado:
No está nada mal 10.000 registros INT leídos 100 veces consecutivas en 205 milisegundos. Estos datos variarán en función del PC.











