Database
Valores que un sistema de la fábrica guarda en una tabla de base de datos (SQL Server, PostgreSQL, MySQL y MariaDB, SQLite, o cualquier base de datos por ODBC) leídos como tags, y escritos de vuelta donde un tag lo indica: las tarjetas Base de datos e Inicio de sesión, un tag que lee una celda por su tabla, su columna y su fila o ejecuta una consulta propia, las dos maneras en que un tag escribe, el escaneo que ofrece un tag por columna, cuatro ejemplos completos y lo que el driver no hace.
El driver Database lee los valores que un sistema de la fábrica guarda en una tabla de base de datos: la orden de producción que mantiene el MES, la receta o la consigna que guarda el ERP, el resultado que registró otro sistema de ensayo. Cada tag lee un valor de una tabla, y sus valores llegan donde llegan los de cualquier otro tag: a Logic, a los paneles de control, a las corridas de un banco de pruebas de Process. Donde un tag lo indica, el driver también escribe de vuelta: en la celda que lee el tag, o mediante un comando propio del tag.
SQL Server, PostgreSQL, MySQL y MariaDB, y SQLite se alcanzan sin instalar nada en la computadora. Cualquier otra base de datos (Oracle, Access, Firebird y otras) se alcanza a través de su propio driver ODBC, que tiene que estar instalado en la computadora en su versión de 64 bits.
Leer es el uso principal, y su camino es corto: un dispositivo indica dónde está su base de datos y cómo inicia sesión la estación, el escaneo ofrece un tag por columna de sus tablas, y todo tag nace de solo lectura. Lo que tiene que ver con la escritura solo aparece en un tag cuando su acceso deja escribir a la estación.
Un dispositivo de este driver es una base de datos: dos bases de datos del mismo servidor son dos dispositivos. Los dispositivos cuelgan del driver y pueden archivarse en carpetas, Driver → Carpeta → Dispositivo → Tag, como en cualquier driver sin línea serie ni broker.
La página del driver
La línea bajo el encabezado dice "Cada dispositivo lee una base de datos. Agregue un dispositivo, ingrese dónde está su base de datos y cómo inicia sesión la estación, y después escanéelo para agregar sus columnas como tags." Para Configurar el conector, la página contiene la tarjeta Alcance del escaneo propia del driver, con el dispositivo cuya base de datos lee el escaneo (vea Descubrimiento). Debajo está la tabla Dispositivos de cualquier driver (vea La tabla de dispositivos), que crece con Agregar dispositivo, a la derecha de su título; vacía, dice "Todavía no hay dispositivos." La barra del driver lleva Descubrir, en gris hasta que la tarjeta Alcance del escaneo está completa. El driver aparece en Archivos y bases de datos, junto al driver File.
Dispositivo
Un dispositivo de este driver no tiene tarjeta Conexión: en su lugar está la tarjeta Base de datos, seguida de la tarjeta Inicio de sesión en toda base de datos salvo SQLite, que no tiene inicio de sesión. El Intervalo de sondeo (ms) de la tarjeta Dispositivo, 1000 por defecto, indica cada cuánto leen los tags la base de datos, y cada tag puede sustituirlo como en cualquier driver.
Un dispositivo nuevo es uno de SQL Server sin servidor: dice "Servidor aún sin indicar", su página dice "La estación no llega a este dispositivo mientras no indique dónde está su base de datos, así que todavía no se lee nada de él y no hay ningún error que mostrar. Ingréselo en la tarjeta Base de datos de abajo (el servidor y el nombre de la base de datos, el archivo o el origen de datos) y la estación se conecta a ella."
y no se lee nada hasta que lo indica. La Base URI que muestra el encabezado es la dirección de ejecución,
que nunca lleva el usuario ni la contraseña:
database://sqlserver?server=mes-sql&instance=SQLEXPRESS&database=MES para una instancia de SQL
Server, database://sqlite?file=C%3A%5CData%5Crecipes.db para un archivo SQLite,
database://odbc?source=ERP para un origen de datos ODBC.
La tarjeta Base de datos
| Campo | Se muestra | Significado | Predeterminado |
|---|---|---|---|
| Tipo de base de datos | siempre | SQL Server, PostgreSQL, MySQL / MariaDB, SQLite u Otra (ODBC), que dice "Usa el driver ODBC de 64 bits instalado en esta computadora para esa base de datos (Oracle, Access, Firebird y otras)." | SQL Server |
| Servidor | SQL Server, PostgreSQL, MySQL / MariaDB | En SQL Server: "Un nombre de host o una dirección IP. SERVIDOR\INSTANCIA y SERVIDOR,PUERTO se separan en sus casillas." En los otros dos: "Un nombre de host o una dirección IP. Un puerto escrito después de dos puntos va a la casilla Puerto." | vacío |
| Puerto | los mismos | Vacío para el puerto propio de la base de datos, que la casilla vacía muestra: 1433, 5432 o 3306. Con una instancia de SQL Server y sin puerto, la casilla no muestra nada y el SQL Server Browser del servidor indica el puerto. | vacío |
| Nombre de la instancia | SQL Server | "Vacío para la instancia predeterminada. Una instancia con nombre y sin puerto se encuentra a través de SQL Server Browser." Hasta 16 letras, dígitos, _ y $, empezando por una letra o _. |
vacío |
| Nombre de la base de datos | SQL Server, PostgreSQL, MySQL / MariaDB | La base de datos del servidor que contiene las tablas, de hasta 128 caracteres. | vacío |
| Archivo de base de datos | SQLite | "La ruta completa del archivo SQLite, al que se accede con los permisos de Windows de la cuenta con la que se ejecuta la estación. Se abre solo para lectura salvo que un tag escriba." La casilla muestra C:\Data\recipes.db como sugerencia. El archivo nunca se crea. |
vacío |
| Origen de datos o texto de conexión | Otra (ODBC) | "El nombre de un origen de datos en Orígenes de datos ODBC de Windows (64 bits), o un texto de conexión como Driver=;Dbq=C:\Data\plant.accdb. La contraseña va en la casilla de la contraseña, nunca en el texto." | vacío |
Un campo que el tipo elegido no lee no se muestra, y conserva su valor para cuando lo lea. Elegir otro tipo vacía un puerto que quedó en el puerto propio de la base de datos anterior, para que la nueva se alcance en el suyo. La casilla Servidor separa lo que las herramientas de bases de datos escriben junto:
| Escrito en Servidor | Queda |
|---|---|
mes-sql\SQLEXPRESS (SQL Server) |
Servidor mes-sql, Nombre de la instancia SQLEXPRESS |
mes-sql,1433 (SQL Server) |
Servidor mes-sql, Puerto 1433 |
10.0.0.5:5433 |
Servidor 10.0.0.5, Puerto 5433 |
Mientras la tarjeta no indica dónde está la base de datos, el dispositivo se guarda tal como está y espera, con el punto gris, sin leer nada y sin mostrar ningún error:
| Tipo de base de datos | Espera | El dispositivo dice |
|---|---|---|
| SQL Server, PostgreSQL, MySQL / MariaDB | El servidor, después el nombre de la base de datos | "Servidor aún sin indicar", después "Nombre de la base de datos aún sin indicar" |
| SQLite | El archivo | "Archivo de base de datos aún sin indicar" |
| Otra (ODBC) | El origen de datos o el texto de conexión | "Origen de datos aún sin indicar" |
Un ajuste que la tarjeta no admite se indica bajo las tarjetas, y el dispositivo no se guarda hasta que se corrige:
| Usted indica | La tarjeta dice |
|---|---|
Un servidor con esquema, ruta o espacio, como http://mes-sql |
"El servidor es solo un nombre de host o una dirección IP: sin esquema, sin ruta y sin espacios. Una instancia de SQL Server y un puerto escritos con él van a sus propias casillas." |
Un nombre de instancia con un espacio o un signo que no sea _ ni $ |
"El nombre de la instancia tiene hasta 16 letras, dígitos, guiones bajos y signos de dólar." |
| Un nombre de base de datos de más de 128 caracteres | "El nombre de la base de datos tiene como máximo 128 caracteres, sin caracteres de control." |
Un archivo que no es una ruta completa, como recipes.db |
"El archivo de base de datos es una ruta completa: una unidad, una carpeta y el archivo (C:\Data\recetas.db), o un recurso compartido de red (\server\data\recetas.db)." |
Una carpeta, o una ruta con *, ?, <, > o comillas |
"Ingrese la ruta del propio archivo de base de datos, no la de una carpeta, sin * ? | < > ni comillas." |
Un nombre de origen de datos con un corchete, una llave, un paréntesis, una coma, un punto y coma o uno de ? * ! @ \ |
La tarjeta pide el nombre que tiene el origen en Orígenes de datos ODBC, o un texto de conexión. |
Un texto de conexión que no son pares key=value, como una llave que queda abierta |
"Un texto de conexión son pares key=value separados por punto y coma; un valor que contiene un punto y coma va entre llaves." |
Un texto de conexión con PWD= o Password= |
"Saque la contraseña del texto de conexión e ingrésela en la casilla de la contraseña: el texto se muestra y se escribe en el diario técnico, y esa casilla la guarda protegida." |
El guardado sigue las mismas reglas, y el registro de acciones lo dice cuando rechaza una: "El dispositivo 'MES' tiene un ajuste de base de datos que su driver no puede usar. Ábralo y corrija el campo que marca su panel."
La tarjeta Inicio de sesión
Toda base de datos salvo SQLite lleva la tarjeta Inicio de sesión, con el usuario con el que inicia sesión la estación.
| Campo | Se muestra | Significado | Predeterminado |
|---|---|---|---|
| Iniciar sesión con la cuenta de Windows de la estación | SQL Server | Activado: "Se inicia sesión en SQL Server con la cuenta de Windows con la que se ejecuta la estación; no se guarda usuario ni contraseña." Desactivado: "Se inicia sesión en SQL Server con un usuario de la base de datos y su contraseña." | desactivado |
| Nombre de usuario | un servidor en el que se inicia sesión con un usuario, y ODBC, donde es opcional | El usuario de la base de datos. | vacío |
| Contraseña | los mismos | La contraseña del usuario, guardada protegida como toda credencial de un driver: nunca se vuelve a mostrar, nunca se escribe en la dirección ni en el diario técnico, y nunca se devuelve a un agente. | vacío |
| Cifrado | SQL Server | Cifrada, certificado verificado: "La conexión va cifrada y el certificado del servidor se verifica con los certificados en los que confía esta computadora." Cifrada, se acepta cualquier certificado: "La conexión va cifrada y se acepta cualquier certificado, como necesita un servidor de fábrica con su propio certificado. No se verifica la identidad del servidor." Sin cifrar: "Los valores y los comandos viajan sin cifrar. Solo para un servidor antiguo que no ofrece cifrado." | Cifrada, certificado verificado |
PostgreSQL y MySQL no tienen el campo Cifrado: su conexión va cifrada siempre que el servidor lo ofrece. Un SQL Server con un certificado propio, como suele tenerlo un servidor de fábrica, rechaza la conexión con las palabras de la base de datos sobre una cadena de certificados emitida por una entidad que no es de confianza: Cifrada, se acepta cualquier certificado es la opción que pide ese servidor.
Bajo sus campos, la tarjeta dice qué usuario pedir: "Pida al administrador de la base de datos un usuario con solo los permisos que la estación necesita: lectura, y escritura solo en las tablas que cambian sus tags." La estación lee y escribe los datos de otro sistema con todo lo que su usuario puede hacer, así que ese usuario es el límite real de lo que la estación puede cambiar. Toda escritura queda en el diario técnico, como en cualquier driver.
Un servidor en el que se inicia sesión con un usuario, sin usuario indicado todavía, dice en su lugar "Ingrese el usuario con el que la estación inicia sesión. Hasta entonces la estación no conecta este dispositivo." No es un rechazo: el dispositivo se guarda, y su error dice que todavía no se ha indicado ningún usuario de la base de datos, hasta que el usuario esté ahí.
En línea, en espera y fuera de línea
| Situación | Lo que hacen el dispositivo y sus tags |
|---|---|
| La tarjeta Base de datos no indica dónde está la base de datos | El dispositivo espera, punto gris, sin leer nada y sin error (vea arriba). |
| Un servidor en el que se inicia sesión con un usuario, sin ninguno indicado | La estación no conecta el dispositivo; su error dice que todavía no se ha indicado ningún usuario de la base de datos. |
| El servidor no responde, rechaza el inicio de sesión, o el archivo SQLite no existe | El dispositivo queda fuera de línea con la causa que da la propia base de datos, y la estación lo conecta en cuanto puede. Una conexión se espera como máximo 10 s. |
| La conexión se pierde (el servidor se reinició, la red se cortó) | El dispositivo queda fuera de línea y se vuelve a conectar. |
| Una instrucción que la base de datos rechaza, o que sigue en marcha pasados 10 s | Lectura fallida de ese tag, con las palabras de la propia base de datos; el dispositivo sigue leyendo sus otros tags. |
| Un tag lee la fila más reciente de una tabla que todavía no tiene filas | Ese tag espera, sin error, y el estado de salud de su dispositivo no lo cuenta hasta que se escribe la primera fila: los otros tags del dispositivo dicen si está en línea. Una tabla que se vacía después de que el tag leyó de ella no es esa espera: el tag conserva su última lectura, que cuenta como fallida cuando es más antigua que su intervalo de sondeo más 10 s, como en cualquier driver. |
Cada dispositivo tiene una conexión propia, abierta cuando se conecta y nunca compartida ni guardada en un pool, así que una conexión que un servidor cortó nunca se vuelve a usar.
Preparar el servidor
Las tres bases de datos de red vienen cerradas a otra computadora en instalaciones habituales. Cada uno de estos ajustes se hace en el servidor, por quien lo administra; la estación no cambia ninguno.
| Base de datos | Qué deja fuera a la estación | Dónde se cambia |
|---|---|---|
| SQL Server | TCP/IP desactivado (SQL Server Express y Developer vienen así) | SQL Server Configuration Manager > SQL Server Network Configuration > Protocols for la instancia: habilite TCP/IP y reinicie SQL Server (la instancia) en SQL Server Services |
| SQL Server | Una instancia con nombre escucha en un puerto que elige ella misma | TCP/IP > IP Addresses > IPAll: vacíe TCP Dynamic Ports y escriba el puerto en TCP Port, luego reinicie; o deje vacía la casilla Puerto del dispositivo e indique el nombre de la instancia |
| SQL Server | Una instancia con nombre sin puerto se localiza con el SQL Server Browser, que está detenido o bloqueado (error 26) | SQL Server Services: SQL Server Browser iniciado, Start Mode Automatic; UDP 1434 permitido en el firewall del servidor |
| PostgreSQL | listen_addresses es localhost, su valor predeterminado | postgresql.conf: listen_addresses = '*', luego reinicie PostgreSQL |
| PostgreSQL | Ninguna línea de pg_hba.conf deja entrar la dirección de esta estación (SQLSTATE 28000) | pg_hba.conf: una línea host para la base de datos, el usuario y la dirección de esta estación, con scram-sha-256 (md5 para una contraseña guardada con MD5), luego SELECT pg_reload_conf(); |
| MySQL, MariaDB | bind-address es 127.0.0.1, como lo definen muchos paquetes, o skip-networking está activado | La sección [mysqld] del archivo de configuración: bind-address = 0.0.0.0, skip-networking borrado, luego reinicie |
| MySQL, MariaDB | Ninguna cuenta para la dirección de esta estación (error 1130) | CREATE USER para el usuario en la dirección de esta estación, y GRANT de lo que necesitan los tags |
Todas necesitan además el puerto de la base de datos permitido en el firewall de la computadora del servidor. Cuando el servidor responde de una de estas formas, la página del dispositivo dice qué ajuste es, con estos pasos y los valores de este dispositivo (el puerto, la instancia, la dirección de esta estación tal como la vio el servidor, la línea de pg_hba.conf y la cuenta de MySQL, cada uno con un botón para copiar), en lugar del error en inglés de la base de datos. El aviso desaparece solo en cuanto el dispositivo se conecta, o cuando el servidor responde de otra forma. El registro y el agente leen los mismos pasos.
Direccionamiento de tags
Cómo lee un tag
Un tag de este driver no tiene casilla de dirección propia: su tarjeta Fuente pregunta cómo lee.
| Lee | Lo que muestra el tag | Sus campos |
|---|---|---|
| Tabla y columna | Una celda: la columna del valor de una fila de una tabla. | Tabla, Columna del valor, Fila que leer y los campos de la fila |
| Consulta propia | La primera columna de la primera fila que devuelve un SELECT propio. | Texto de la consulta |
Un tag nuevo lee Tabla y columna, por su clave, como Double. Los tipos que se ofrecen son Boolean, Int32, Int64, Float, Double, String y DateTime. Al leer una celda, un tag de número entero rechaza un valor con decimales en vez de redondearlo (la escritura es al revés, véase Escritura), y un texto solo se lee como número cuando lo es. Todo tag nace de Solo lectura; lo que agrega la escritura está en Escritura.
Tabla y columna
| Campo | Se muestra | Significado | Predeterminado |
|---|---|---|---|
| Tabla | Tabla y columna | "Un nombre, o un esquema y un nombre (dbo.Orders). Un nombre con espacios o mayúsculas va entre comillas o corchetes, como [Order Lines]." | vacío |
| Columna del valor | Tabla y columna | La columna cuya celda es el valor del tag. | vacío |
| Fila que leer | Tabla y columna | Por su clave: "La fila cuya columna clave contiene el valor clave. Los tags de la misma tabla y fila se leen juntos en una sola consulta." La más reciente: "La fila con el valor más alto de la columna de fecha: una fecha y hora, o un número que solo crece. Los tags de la misma tabla y fila se leen juntos en una sola consulta." | Por su clave |
| Columna clave | Por su clave | La columna que elige la fila, como OrderNo. |
vacío |
| Valor clave | Por su clave | Lo que contiene la columna clave en la fila que leer, como 4711, escrito como texto: la base de datos lo lee como lee un valor de esa columna. |
vacío |
| Columna de fecha | La más reciente | La columna cuyo valor más alto es la fila más reciente, como updated_at. |
vacío |
Un nombre se lee como lo lee la base de datos:
| Escrito | Leído como |
|---|---|
Orders |
Un nombre simple, leído como la base de datos lee cualquier nombre simple: PostgreSQL en minúsculas, Oracle en mayúsculas. |
"Order Lines", [Order Lines] |
El nombre exacto, sean cuales sean las comillas que admite la propia base de datos. |
dbo.Orders |
Un esquema y una tabla: un punto fuera de las comillas los separa. |
El driver pone cada parte de un nombre entre las comillas que admite su base de datos, así que un nombre nunca se pega en una instrucción como texto. Un tag cuyos campos no pueden funcionar no se guarda, y su página dice lo que le falta:
| Usted deja o indica | La página del tag dice |
|---|---|
| Ninguna tabla | "Ingrese la tabla en la que está el valor." |
| Una tabla de tres partes, o unas comillas sin cerrar | "La tabla es un nombre, o un esquema y un nombre (dbo.Orders); ponga un nombre con espacios entre comillas o corchetes. Cada parte tiene como máximo 128 caracteres." |
| Ninguna columna del valor | "Ingrese la columna del valor." |
| Una columna del valor de dos partes | "La columna del valor es un solo nombre; ponga un nombre con espacios entre comillas o corchetes." |
| Por su clave, sin columna clave | "Ingrese la columna clave que elige la fila." |
| Por su clave, sin valor clave | "Ingrese el valor clave: lo que la columna clave contiene en la fila que leer." |
| La más reciente, sin columna de fecha | "Ingrese la columna de fecha cuyo valor más alto es la fila más reciente." |
La línea de solo lectura Dirección de origen (bus) muestra lo que recibe el driver:
row?table=dbo.ProductionOrders&column=Quantity&key=OrderNo&equals=4711 para una fila por su clave,
newest?table=recipe_setpoints&column=oven_temperature&by=updated_at para la fila más reciente.
Consulta propia
| Campo | Significado | Predeterminado |
|---|---|---|
| Texto de la consulta | "Un SELECT que solo lee; el valor es la primera columna de la primera fila. @now es la fecha y la hora de la estación." También se admite una consulta que empieza por WITH y solo lee. | vacío |
La consulta se lee como la lee la base de datos: lo que está dentro de un texto entre comillas, de un nombre entre comillas o de un comentario no es una palabra de la instrucción. Una consulta que hace algo más que leer se rechaza donde se escribe:
| Usted indica | La página del tag dice |
|---|---|
| Nada | "Ingrese la consulta: un SELECT cuya primera columna de la primera fila es el valor." |
Una instrucción que no es un SELECT, como UPDATE o DELETE |
"La consulta empieza con SELECT o WITH. Para escribir, deje que el acceso del tag escriba y use un comando de escritura." |
Un SELECT que cambia la base de datos: SELECT ... INTO, FOR UPDATE, o uno que contiene INSERT, UPDATE, EXEC |
"La consulta cambiaría la base de datos (INSERT, UPDATE, SELECT INTO, FOR UPDATE, EXEC y similares). Una consulta solo lee." |
| Dos instrucciones | "La consulta contiene más de una instrucción. Deje un solo SELECT." |
| Unas comillas, un corchete o un comentario sin cerrar | "Unas comillas, un corchete o un comentario de la consulta no están cerrados." |
Un valor que no sea @now, como @order |
"Una consulta solo admite @now, la fecha y la hora de la estación. Escriba cualquier otro valor en el texto." |
La dirección de bus de un tag de consulta es query?sql= seguido de la consulta, codificada con
porcentajes.
Lectura
| Un tag que lee | Cómo se lee |
|---|---|
| Por su clave | Su columna, en la fila cuya columna clave es igual al valor clave; el valor clave se entrega a la base de datos como parámetro. |
| La fila más reciente | Su columna, en la fila cuya columna de fecha tiene el valor más alto de esa columna (WHERE ... = (SELECT MAX(...) FROM ...)), una forma que toda base de datos y ODBC leen igual; cuando dos filas empatan, se lee la primera. |
| Varios tags de la misma tabla y fila | Una consulta por pasada para todas sus columnas, para no preguntar a la base de datos de la fábrica una vez por tag. Si la base de datos rechaza esa consulta (una columna que la tabla no tiene), la columna del propio tag se lee sola y esa fila se lee columna por columna desde entonces: una columna equivocada solo le cuesta a su propio tag. |
| Su consulta propia | La consulta tal como está escrita, con @now entregado como parámetro. |
| La base de datos responde | El tag |
|---|---|
| Un valor de un tipo que el tag lee | Lo lee. |
| Una celda vacía (NULL) | Falla su lectura. |
| Ninguna fila con el valor clave, o más de una | Falla su lectura: un tag lee una fila. |
| La fila más reciente de una tabla que todavía no tiene filas | Espera, sin error. |
| Una consulta que no devuelve ninguna fila | Falla su lectura. |
| Un valor que el tipo del tag no lee (un texto en un tag Int32, decimales en un tag de número entero) | Falla su lectura, con el motivo. |
Una lectura fallida conserva la última lectura del tag, que cuenta como fallida cuando es más antigua que su intervalo de sondeo más 10 s, como en cualquier driver. A la base de datos se le pregunta en cada lectura: un cambio que hace otro programa se ve en la lectura siguiente, nunca en el instante en que se hace.
Escritura
Un tag solo escribe cuando su Acceso es Lectura y escritura o Solo escritura. Su tarjeta Fuente agrega entonces lo que hace una escritura:
| Campo | Se muestra | Significado | Predeterminado |
|---|---|---|---|
| Una escritura | el tag escribe | Cambia la celda que lee: "Cambia la celda que lee este tag, en una sola fila. Un valor más nuevo que aún espera reemplaza a uno más antiguo." Ejecuta su comando de escritura: "Ejecuta el comando de escritura de abajo. Cada escritura cuenta: ninguna que aún espera se descarta por otra más nueva." Un tag que lee su consulta propia no tiene celda que cambiar, y solo se le ofrece Ejecuta su comando de escritura. | Cambia la celda que lee |
| Comando de escritura | Ejecuta su comando de escritura | "Un UPDATE con su WHERE, un INSERT o la llamada a un procedimiento almacenado. @value es el valor escrito y @now la fecha y la hora de la estación; el valor siempre es un parámetro, nunca se pega en el texto." La casilla vacía muestra INSERT INTO results (result, recorded_at) VALUES (@value, @now) como sugerencia. |
vacío |
Un tag de Solo escritura que ejecuta su comando de escritura no lee nada, así que su tarjeta Fuente contiene solo la escritura.
| Una escritura | Cómo se hace |
|---|---|
| Cambia la celda que lee | Un UPDATE que pone la columna del valor en @value en la fila del tag, dentro de una transacción que se deshace salvo que haya cambiado exactamente una fila: un valor clave que no tiene ninguna fila, o que tienen dos, no escribe nada y lo dice. Un valor más nuevo que aún espera sustituye a uno más antiguo, como en cualquier consigna. |
| Ejecuta su comando de escritura | El comando se ejecuta una vez por escritura, con el valor como @value y la fecha y la hora de la estación como @now. Cada escritura cuenta: dos INSERT son dos filas, y una escritura que aún espera nunca se descarta por otra más nueva. Un procedimiento almacenado se llama con EXEC, CALL o el {call ...} de ODBC. |
| Un valor con decimales, en un tag de número entero | Redondeado, no rechazado: un valor con decimales escrito en un tag de número entero (Int32 o Int64) sin Escala ni Calibración se redondea al número entero más cercano antes de llegar a la base de datos, y las mitades van lejos de cero (2.5 escribe 3, -2.5 escribe -3). Rechazar los decimales es la forma de leer una celda, no de escribir un valor. |
| Respuesta | Hecha, o rechazada con las palabras de la propia base de datos: un permiso que le falta al usuario, una restricción que la fila incumple, un valor que la columna no admite. |
Un comando que el driver no puede ejecutar se rechaza en la página del tag:
| Usted indica | La página del tag dice |
|---|---|
| Nada | "Ingrese el comando de escritura: un UPDATE, un INSERT o la llamada a un procedimiento almacenado que contenga @value." |
Un comando que empieza por otra palabra, como DELETE |
"El comando de escritura empieza con UPDATE, INSERT, EXEC o CALL." |
| Dos instrucciones | "El comando de escritura contiene más de una instrucción. Deje una, o llame a un procedimiento almacenado." |
| Unas comillas, un corchete o un comentario sin cerrar | "Unas comillas, un corchete o un comentario del comando de escritura no están cerrados." |
Sin @value |
"Ponga @value donde va el valor escrito: siempre es un parámetro, nunca se pega en el texto." |
Un valor que no sea @value ni @now, como @line |
"Un comando de escritura solo admite @value, el valor escrito, y @now, la fecha y la hora de la estación." |
| Un UPDATE sin WHERE | "Un UPDATE sin WHERE cambia todas las filas de la tabla. Agregue el WHERE que elige la fila." |
Los nombres con @@, las funciones de SQL Server, y los nombres de argumento de un EXEC
(@speed = @value) no son valores y se dejan como están escritos. El guardado sigue las mismas reglas,
y el registro de acciones lo dice cuando rechaza un tag:
"El tag 'Order quantity' no indica dónde está su valor en la base de datos, o tiene una consulta o un comando de escritura que su driver rechaza. Ábralo y corrija el campo que marca el panel del tag."
La dirección de bus agrega la escritura: row?table=recipes&column=setpoint&key=code&equals=R-100&write=cell
para una celda, none?write=command&command= seguido del comando para un tag de Solo escritura que
ejecuta su comando.
Descubrimiento
La tarjeta Alcance del escaneo
Para Configurar el conector, la página del driver lleva su tarjeta Alcance del escaneo, bajo la línea "Inicia sesión como lo hace el dispositivo y ofrece un tag por cada columna de sus tablas, en la fila más reciente o en la fila de la clave más pequeña."
| Campo | Significado | Predeterminado |
|---|---|---|
| Dispositivo que escanear | Un dispositivo del driver, por su nombre. Una base de datos solo se escanea a través de un dispositivo, que guarda su inicio de sesión; una edición del dispositivo que aún espera guardarse se guarda primero. | el primer dispositivo por nombre |
| Tablas | "Vacío para todas las tablas, o un nombre o un patrón en el que * vale por cualquier carácter, como Receta*." | vacío |
Un driver sin dispositivos contiene solo "Una base de datos se escanea a través de un dispositivo, que guarda su inicio de sesión. Agregue un dispositivo de este driver e indique dónde está su base de datos." Lo que todavía le falta al alcance se dice en rojo bajo la tarjeta, y Descubrir sigue en gris hasta que está completo:
| El alcance | La tarjeta dice |
|---|---|
| Un dispositivo que no indica dónde está su base de datos, o que tiene un ajuste que su driver no puede usar | "El dispositivo 'Recipes' aún no indica dónde está su base de datos, o tiene un ajuste que su driver no puede usar. Complete primero su tarjeta Base de datos." |
Un patrón con esquema, comillas, corchete o punto y coma, como dbo.Recipe* |
"'dbo.Recipe*' no es un nombre ni un patrón de tabla. Escriba un nombre, o un patrón en el que * vale por cualquier carácter, sin esquema ni comillas." |
| Un dispositivo que ya no existe | "El dispositivo elegido para escanear ya no existe. Elija otro dispositivo que escanear." |
Cuando el dispositivo que escanear tiene una edición que no se puede guardar, el escaneo no empieza: "El descubrimiento no se inició porque no se pudo guardar la edición del dispositivo que se va a escanear."
Lo que ofrece el escaneo
El escaneo inicia sesión como lo hace el dispositivo, lee la lista que la propia base de datos tiene de sus tablas y vistas (sin las del sistema) y de sus columnas, y dice qué tabla lee, como "Leyendo las columnas de recipes…". Ofrece un candidato, el propio dispositivo, marcado como Ya configurado: su tarjeta lista, marcadas, las columnas que ningún tag del dispositivo lee todavía, y Agregar tags, antes de Abrir, agrega las marcadas al dispositivo, de solo lectura.
| La tabla | Sus tags candidatos |
|---|---|
| Tiene una columna de fecha y hora | Uno por columna, leyendo la fila más reciente según la primera columna de ese tipo. |
| No tiene | Uno por columna salvo su clave, leyendo la fila del valor más pequeño de su clave primaria (o de su primera columna, en una tabla sin ella): cambie el Valor clave del tag para leer otra fila. |
| No tiene, y no tiene filas | Se deja fuera. |
| Una columna que ningún tipo de tag lee (datos binarios, una geometría) | Se deja fuera, y se cuenta en la línea que cierra el escaneo. |
Los tags llevan el nombre de su tabla y su columna (recipes.oven_temperature), el tipo de la columna,
y todos son de Solo lectura. Un escaneo lee como máximo 100 tablas y 500 valores; uno cortado
ahí dice
"El escaneo de Recipes se detuvo antes de tiempo. Un escaneo lee como máximo 100 tablas y 500 valores: ingrese un nombre de tabla o un patrón para ver los demás."
El resto del comportamiento del escaneo está en Descubrimiento.
La propia página de un dispositivo hace lo mismo sin la página de su driver: Descubrir tags, en el encabezado de su tarjeta de tags, inicia sesión como el dispositivo, escanea su base de datos tal como está guardado y ofrece solo las columnas para las que todavía no tiene tag (vea Descubrir los tags de un dispositivo).
Ejemplo: una orden de producción de SQL Server
El MES guarda sus órdenes de producción en SQL Server, en la tabla dbo.ProductionOrders de la base de
datos MES, una fila por número de orden:
- En la página del driver, Agregar dispositivo; llámelo
MES. En la tarjeta Base de datos mantenga SQL Server, ingrese Servidormes-sql(omes-sql\SQLEXPRESSpara una instancia con nombre), deje Puerto vacío e ingrese Nombre de la base de datosMES. - En la tarjeta Inicio de sesión ingrese Nombre de usuario
station_readery su Contraseña, o active Iniciar sesión con la cuenta de Windows de la estación. Para un servidor de fábrica con certificado propio, elija Cifrada, se acepta cualquier certificado. - Agregar tag
Order quantity, Int32: Tabladbo.ProductionOrders, Columna del valorQuantity, Fila que leer Por su clave, Columna claveOrderNo, Valor clave4711. Su dirección de bus esrow?table=dbo.ProductionOrders&column=Quantity&key=OrderNo&equals=4711. - Agregar tag
Product, String, en la misma tabla y fila, Columna del valorProductCode: los dos tags se leen en una sola consulta.
Con las herramientas:
device_upsert name=MES driver=Database databaseKind=SqlServer host="mes-sql\SQLEXPRESS" databaseName=MES username=station_reader password=<password> databaseEncryption=TrustServerCertificate
tag_upsert device=MES name="Order quantity" opcUaType=Int32 databaseTable=dbo.ProductionOrders address=Quantity databaseRow=Key databaseKeyColumn=OrderNo databaseKeyValue=4711
tag_upsert device=MES name=Product opcUaType=String databaseTable=dbo.ProductionOrders address=ProductCode databaseRow=Key databaseKeyColumn=OrderNo databaseKeyValue=4711
Ejemplo: una consigna de receta de PostgreSQL
El sistema de recetas agrega una fila a recipe_setpoints cada vez que cambia una consigna, fechada en
su columna updated_at:
- Agregar dispositivo; llámelo
Recipes, Tipo de base de datos PostgreSQL, Servidorrecipes-db, Puerto vacío (el 5432 de PostgreSQL), Nombre de la base de datosrecipes, y después Nombre de usuario y Contraseña en la tarjeta Inicio de sesión. - Agregar tag
Oven setpoint, Double: Tablarecipe_setpoints, Columna del valoroven_temperature, Fila que leer La más reciente, Columna de fechaupdated_at.
Cada fila nueva se lee en la siguiente lectura del tag. PostgreSQL lee un nombre simple en minúsculas,
así que una columna creada con mayúsculas, como OvenTemp, se escribe entre comillas: "OvenTemp".
Con las herramientas:
device_upsert name=Recipes driver=Database databaseKind=PostgreSql host=recipes-db databaseName=recipes username=station password=<password>
tag_upsert device=Recipes name="Oven setpoint" opcUaType=Double databaseTable=recipe_setpoints address=oven_temperature databaseRow=Newest databaseDateColumn=updated_at
Ejemplo: una línea de resultado escrita como INSERT
El sistema de calidad quiere una fila por pieza medida en su tabla test_results:
- En el dispositivo de esa base de datos, Agregar tag
Result, Double, Acceso Solo escritura. - Una escritura Ejecuta su comando de escritura, y en Comando de escritura escriba
INSERT INTO test_results (result, recorded_at) VALUES (@value, @now), que agrega la fila.
Cada valor que Logic escribe en Result se convierte en una fila propia, con la fecha y la hora de la
estación al lado; las escrituras que llegan seguidas se conservan todas, en orden, ninguna descartada
por otra más nueva. Un tag de Lectura y escritura que lee una celda cambiaría en su lugar su única
fila en cada escritura. Con las herramientas:
tag_upsert device=Quality name=Result opcUaType=Double accessType=WriteOnly databaseWriteMode=Command databaseCommand="INSERT INTO test_results (result, recorded_at) VALUES (@value, @now)"
Ejemplo: Access y Oracle por ODBC
| Base de datos | En esta computadora | En el dispositivo |
|---|---|---|
| Microsoft Access | El Access Database Engine de Microsoft, de 64 bits | Tipo de base de datos Otra (ODBC), Origen de datos o texto de conexión Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\Data\plant.accdb, sin usuario |
| Oracle | El driver ODBC de 64 bits de Oracle, y un origen de datos ERP creado para él en Orígenes de datos ODBC (64 bits) |
Tipo de base de datos Otra (ODBC), Origen de datos o texto de conexión ERP, Nombre de usuario y Contraseña en la tarjeta Inicio de sesión |
Cuando el origen de datos o el driver que nombra un dispositivo existe solo para programas de 32 bits
(un Access de un Office de 32 bits, un origen de datos creado en Orígenes de datos ODBC (32 bits)), o no
existe en esta computadora, el panel del dispositivo dice cuál de los dos casos es, con el nombre que dio el
dispositivo, y da la instrucción completa mientras el dispositivo está activado y no se conecta. El
error del dispositivo dice lo mismo en inglés, y también driver_capabilities, en el prerequisite
del driver Database (perDevice true):
| Parte | Qué dice |
|---|---|
| Qué falta | Un driver ODBC de 64 bits para ese origen de datos o ese driver: Ganter Lab es un programa de 64 bits y solo ve los drivers ODBC de 64 bits y los orígenes de datos creados con ellos, y no puede incluir el driver de otro fabricante |
| Dónde obtenerlo | Del fabricante de la base de datos; para Access, la página de Microsoft "Download and install Microsoft 365 Access Runtime", cuyo runtime trae el Access Database Engine |
| Cuál elegir | La versión de 64 bits (para Access, el botón de descarga de 64 bits de su idioma), nunca la de 32 bits |
| Cómo instalarlo | Como administrador; después, para un dispositivo que nombra un origen de datos, crearlo en Orígenes de datos ODBC (64 bits) con el mismo nombre y la misma base de datos |
| Tropiezo conocido | Para Access en una computadora con Office: la página de Microsoft dice que el Access Runtime instalado corresponde al Office ya instalado y que no es compatible con un Office instalado con Windows Installer, y la página de Microsoft sobre cómo elegir entre la versión de 64 bits y la de 32 bits de Office dice que una versión se desinstala antes de instalar la otra |
| Después | En su siguiente intento de conexión, el dispositivo se conecta con la configuración que tiene, sin reiniciar Ganter Lab |
El aviso termina con los drivers ODBC de 64 bits que tiene esta computadora, con el nombre que lleva
Driver={...}. Un origen de datos o un driver que existe en 64 bits y que aun así falla muestra el
error propio del administrador de controladores.
Por ODBC, un nombre simple se lee como lo lee la base de datos (en mayúsculas en Oracle) y un nombre entre comillas tal cual; las fechas y horas se envían al segundo entero, lo más fino que admite todo driver ODBC. Con las herramientas:
device_upsert name="Plant book" driver=Database databaseKind=Odbc databaseOdbc="Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\Data\plant.accdb"
device_upsert name=ERP driver=Database databaseKind=Odbc databaseOdbc=ERP username=STATION password=<password>
Herramientas del agente
driver_capabilities describe este driver en database: el camino sencillo, cada base de datos
con sus campos y su puerto propio, las opciones de cifrado, las dos maneras en que lee un tag y las dos
en que escribe, la regla de que un valor solo entra en una instrucción como @value o @now, los
tipos, los tiempos de espera, el consejo sobre el usuario de la base de datos, el descubrimiento y
cuatro ejemplos completos. device_upsert driver=Database admite databaseKind (SqlServer, el
predeterminado, PostgreSql, MySql, Sqlite u Odbc), y para un servidor host (un
server\INSTANCE o server,port de SQL Server se separa), port, databaseName, y en SQL Server
databaseInstance, databaseWindowsSignIn y databaseEncryption (Verified,
TrustServerCertificate u Off); databaseFile para SQLite, databaseOdbc para ODBC; username y
password, que nunca se devuelve. Un dispositivo que devuelve lleva database, con la dirección y si
el dispositivo aún espera su usuario. tag_upsert admite la columna del valor como address,
databaseSource (Fields o Query), databaseTable, databaseRow (Key o Newest),
databaseKeyColumn, databaseKeyValue, databaseDateColumn, databaseQuery, y cuando el
accessType escribe, databaseWriteMode (Cell o Command) y databaseCommand; un tag nuevo es de
solo lectura y Double salvo que opcUaType diga otra cosa. device_discover driver=Database admite
databaseDevice, el nombre de un dispositivo configurado del driver, y opcionalmente
databaseTables, un nombre de tabla o un patrón con *; los tags que le faltan al dispositivo se
agregan con tag_upsert. connector_browse devuelve el databaseKind de cada dispositivo. Las demás
herramientas están en Herramientas del agente.
Límites que conviene conocer
- El driver lee y escribe los valores de sus tags, un valor por tag. No registra las corridas de la estación en una base de datos: una fila por corrida con su número de serie, su veredicto y sus medidas no es algo que escriba este driver.
- El producto no incluye ningún driver ODBC. Oracle, Access, Firebird y cualquier base de datos que no sea una de las cuatro que se alcanzan directamente necesitan su propio driver ODBC de 64 bits instalado en la computadora; uno de 32 bits no se ve.
- El dispositivo no guarda ninguna contraseña de Windows: el inicio de sesión de Windows en SQL Server, y un archivo SQLite en un recurso compartido de red, usan la cuenta con la que se ejecuta la estación, así que la base de datos o el recurso compartido tienen que dejar entrar a esa cuenta.
- Una consulta solo lee. Lo que cambia la base de datos es una escritura, y una escritura solo ocurre en un tag cuyo acceso escribe.
- Un valor nunca entra en el texto de una instrucción: el valor escrito es siempre el parámetro
@value, la fecha y la hora de la estación@now, y un valor clave también es un parámetro. Una instrucción que nombra cualquier otro valor se rechaza. - Una escritura de celda cambia exactamente una fila; un comando UPDATE necesita su WHERE.
- A la base de datos se le pregunta en cada lectura: un cambio que hace otro programa se ve en la lectura siguiente, y a una base de datos con muchos tags de una misma fila se le pregunta una vez por pasada por todos ellos.
- Una columna binaria no se lee.