Introducción
En este documento se pretende
asentar las bases del Software, de lectura y escritura, sobre todo, teniendo en
cuenta que se quiere escribir y/o a o de una base de datos SQL.
De manera que tendremos un simulador
de un servidor OPC (QuickClient de KepServer) que enviará señales mediante este
protocolo al OPCRouter, nuestro objetivo es tomar estos datos y transferirlos a
una base de datos de SQL (o bien a un txt), esto se puede hacer de varias
formas, formatos y utilizando varias herramientas, en esta nota técnica se
pretende comunicar mediante varios Softwares desde OPC a SQL u otros archivos
para almacenar datos.
Para guiar al usuario que lea
este archivo se ha propuesto realizar un archivo con varios ejemplos de
aplicación para que el cliente pueda interpretar y utilizar el que le sea más
útil en sus aplicaciones o desarrollo.
En esta nota técnica se trata de
dar respuesta mediante varios ejemplos a distintas configuraciones de las
conexiones para escribir en varios tipos de archivos para acabar escribiendo en
una base de datos de SQL, en concreto esta nota técnica se centra en escritura
a Excel, CSV y como pasar estos datos a formato de. json, entre otras
configuraciones.
NOTA: Se recomienda consultar el
ANEXO I del archivo si no se ha utilizado OPCRouter o se ha trabajado poco con
este Software.
Escritura desde OPC a SQL
En este ejemplo vamos a tomar una serie de datos de un
simulador de OPC para introducirlos en una base de datos creada para hacer
estas pruebas (SQL Server Management Studio > Databases > Runtime >
Tables > dbo.TEST).
En primer lugar, debemos crear la conexión mediante los
objetos que nos facilita el Software, mediante el drag&drop podemos ir
diseñando nuestras conexiones.
De manera que para escribir datos desde OPC (un PLC, por
ejemplo) a nuestro SQL debemos crear un diseño de conexión parecido a lo que
podréis ver ahora:
Ilustración 1. Diseño de conexión OPC-SQL para
escritura en BBDD SQL.
En la ventana de Runtime podremos
analizar los datos obtenidos, ver si se están transfiriendo de forma correcta,
además de una representación gráfica que tenemos de los puntos tomados y si
estos se han tomado de forma correcta (Verde o Azul) o de forma errónea (rojo):
Ilustración 2. Datos tomados mediante Trigger
"manual" de los datos OPC y confirmación de que se han tomado datos (círculo
rojo).
De manera que obtendremos los
siguientes resultados en la base de datos que hayamos seleccionado para
insertar/update estos datos:
Ilustración 3. Datos obtenidos en SQL tras realizar un Trigger
de los datos de la ilustración 1.
De manera que con dos objetos muy
simples podemos realizar una escritura en base de datos SQL sin problema, tal y
como se ve en las capturas realizadas, en mi caso las variables son simuladas.
En este caso No vamos a escribir
en SQL, sino en un formato txt debido a que no podemos tratar los datos en
formato json en SQL, de manera que hemos buscado una alternativa para explicar
la captura y almacenamiento de estos datos.
En este caso vamos a realizar un
esquema algo distinto al del caso anterior, de manera que vamos a tratar de
escribir en un txt con formato json utilizando variables internas del
OPCRouter, esto resulta muy útil para organizar los datos y su representación
como queramos, además de permitirnos utilizar scripting y variables internas
del propio Software, lo cual permite diseños más complejos y con scripting.
De manera que para realizar una
escritura de datos en formato json a un txt realizaremos la siguiente
configuración en la conexión (o algo similar):
Ilustración 4. Diseño de conexión archivos en formato json en
un txt.
Los datos obtenidos se pueden
visualizar de la siguiente manera en el archivo .txt:
Ilustración 5. Resultados obtenidos en un archivo
creado para los datos en formato json.
En
este ejemplo vamos a tratar de leer, escribir y manipular datos mediante Excel
y SQL. En el primero de los casos, el de la escritura, podemos crear una
conexión similar al esquema de conexiones que hay a continuación:
Ilustración 6. Escritura de datos a Excel desde
OPC.
En el caso anterior, tenemos
datos OPC que llegan a Excel, y que posteriormente pueden escribirse en SQL
(también se pueden modificar los datos en las celdas de Excel antes de enviar
los datos a SQL):
Ilustración 7. Escritura y manipulación de datos
mediante Excel para posteriormente enviarlos a la BBDD.
De manera que podemos manipular
estos datos antes de introducirlos en la base de datos.
Y los datos que se introducen en
la base de datos son únicamente los que hayamos seleccionado, es decir, los
manipulados en mi caso (Bloque “Database” de la derecha de la imagen anterior).
Ilustración 8. Prueba de la conexión diseñada
aplicando una suma a los valores de +1 y dejando los strings igual.
Y los resultados se introducen en
la base de datos sin problema, solamente los que hemos seleccionado como datos
a introducir, es decir, los datos de la columna J del Excel.
Ilustración 9. Resultados obtenidos en BBDD tras
modificar los datos mediante Excel.
Esto se puede hacer en dirección
inversa en caso de que sea necesario, es decir, introducir datos de un Excel (u
otro Pluggin) al PLC, esto resulta muy útil, ya que es habitual que se quieran
modificar tags del PLC en función de un evento que ocurra en el sistema, por
ejemplo, un booleano que me active algún tag del PLC, para generar un informe.
De manera que el diseño lo
haremos de forma inversa:
Ilustración 10. Diseño conexión para traer datos
desde Excel al PLC.
Escritura desde OPC a CSV o TXT
En este último
caso vamos a añadir una variable interna del sistema, un Timestamp por si no lo
hemos configurado antes, y nos aporta mucha información, ya que nos indica
En este ejemplo vamos a escribir
directamente en CSV, pero como paso previo vamos a reorganizar los datos para
que nos aparezcan de forma ordenada, y añadiremos un timestamp (medida de
tiempo y fecha del dato tomado) con una variable interna del sistema.
Ilustración 11.
Diseño escritura de OPC a CSV con Timestamp (medida de tiempo y fecha).
Esta variable
interna es el SystemTimeUTC, y está definida por defecto en el software, de
manera que la podemos utilizar siempre que queramos sin definir nada ni
configurarla.
Ilustración 12. Variables internas del sistema.
De manera que mediante un diseño
similar al presentado podremos introducir datos con su correspondiente medida
de tiempo y fecha en un archivo txt de forma muy sencilla, permitiendo con una
configuración muy simple el registro de datos de producción de forma sencilla,
cómoda y simple.
Y los datos se obtienen tal y
como se muestra en el siguiente archivo utilizado para las pruebas:
Ilustración 13. Pruebas de escritura en CSV
mediante objeto File Write utilizando timestamp.
Ejemplos adicionales de conexiones:
En este apartado vamos a añadir
un par de ejemplos adicionales para ayudar al cliente a diseñar sus propias
aplicaciones. Adicionalmente, se detallan dos casos similares a los estudiados,
pero ampliando la funcionalidad de la aplicación, a continuación, se detalla
más sobre lo comentado en este párrafo.
1) Variables intermedias entre los datos
OPC y la escritura en un txt:
Ilustración 14. Variables internas intermedias,
por ejemplo, para almacenar datos o scripting.
2) Introducción de valores en base de datos
mediante varios registros:
En este segundo ejemplo adicional vamos a tratar el tema de añadir más de un registro de señales por cada Trigger, en este caso podríamos pensar en diseñar la siguiente conexión:
Ilustración 15. Runtime de entorno con varias escrituras en una
misma base de datos (y misma tabla), añadiendo una constante creada
previamente.
Y los resultados
obtenidos en la base de datos son:
Ilustración 16. Datos obtenidos tras realizar los Triggers de la
Ilustración 15, como podéis ver se crea un registro por cada obtejo de
“Database” que tengamos en el diseño de la conexión creada.
Como se puede observar en la
captura de pantalla de la Ilustración 16, los datos que no contiene el objeto
no se traspasan a la base de datos, de manera que para introducir más de un
registro o fila por cada Trigger, debemos seleccionar qué elementos queremos en
ambos objetos del “OPC Data Access” esto puede ser de utilidad en según qué
aplicaciones, además se pretende evitar errores de diseño cuando se empieza a
trabajar con el Software, que es poco intuitivo en algunos campos.
De manera que
para introducir más de un registro sin que aparezcan datos en "NULL" debemos
realizar la siguiente configuración:
Ilustración 17. Diseño para introducir más de un registro por
cada trigger.
De manera que obtendremos un
resultado NULL por cada elemento del cual no hayamos tomado datos des del
objeto OPC Data Access, es decir, en el caso de la imagen anterior, tendremos
los mismos valores para todos los “Tags” excepto en el segundo registro que se
introduce en la BBDD, en el cual el valor de Cosntant = NULL debido a que no
hay dato asignado a este “Tag” de la BBDD.
Y los resultados obtenidos en la
base de datos son los siguientes:
Ilustración 18. Resultados tras lanzar el Trigger de la
Ilustración 17.
ANEXO I. Consideraciones generales de OPCRouter
1) Siempre que
sea posible utilizar carpetas fuera del disco C: (pueden requerir permisos
adicionales o simplemente no funcionar si están ubicadas aquí) y añadir
permisos a las carpetas que sean necesarios (lectura, escritura…).
2) El sistema
tiene varias variables internas, como por ejemplo el SystemTimeUTC (para el
Timestamp) para añadir funcionalidad y comodidad a ciertas configuraciones de
las conexiones
3) Se tienen
variables internas en OPCRouter, para guardas valores o scripting, también nos
sirven para organizar los datos como se verá en los ejemplos planteados por
esta nota técnica…
4) OPCRouter
funciona mediante Triggers en Producción para la toma de datos, de manera que
en primer lugar siempre hay que configurar el tipo de Trigger, para hacer
pruebas se puede aplicar un Trigger manualmente:
Ilustración
19. Trigger
manual de las conexiones en Runtime.
1) Existe entorno
de desarrollo y de Runtime (Production), la versión Demo incluye 2 horas, y se
puede resetear el servicio para volver a tener 2 horas, y así mientras se
desarrolla todas las veces que queramos:
i) Entorno de desarrollo / diseño de la conexión:
Ilustración
20. Interfaz de desarrollo de las conexiones (drag&drop de los pluggins y
objetos que nos ofrece el Software).
ii) Entorno de producción de la conexión diseñada:
Ilustración
21. Interfaz de producción del Software OPCRouter V5. De color rojo se marca el
botón de producción (parte izquierda de la imagen), además de la vista de los
datos tomados en Runtime (la bolita azul representa que se han tomado datos en
esa hora y con los datos que se pueden ver en la captura.
ANEXO II. Triggers en OPCRouter
Para la toma de datos de forma
automática se utilizan Triggers, de manera que estos objetos toman los datos
cada x tiempo, cada vez que cambia un valor, o por ejemplo cada día a la misma
hora para sacar algún informe o resultado.
De manera que podemos configurar
un gran número de Triggers distintos según la aplicación que queramos, o según
las necesidades del cliente o de la aplicación a diseñar:
Ilustración 22. Distintos objetos de "trigger" que
tenemos en el Software OPCRouter.
Podemos configurar los siguientes Triggers:
1) Triggers de
cambios de datos:
Ilustración 23. Triggers que detectan cambios en datos o tags.
2) Triggers
periódicos tiempo (cada X tiempo, o cada día a una hora):
Ilustración 24. Triggers de tiempo que tiene el Software.
3) Triggers
mediante scripting o variables internas:
Ilustración 25. Scripting o Variable Trigger.
Nota Importante: Esta Nota Técnica se entrega “as is”, es decir, como complemento a la documentación del producto, pero no incluido dentro del ámbito del Soporte Técnico. Por tanto, cualquier mal funcionamiento derivado del contenido de esta nota técnica no es responsabilidad de Becolve Digital.