Database

Valores que um sistema da fábrica guarda numa tabela de banco de dados (SQL Server, PostgreSQL, MySQL e MariaDB, SQLite, ou qualquer banco de dados por ODBC) lidos como tags, e escritos de volta onde uma tag manda: os cartões Banco de dados e Entrada, uma tag que lê uma célula pela tabela, pela coluna e pela linha ou executa uma consulta própria, os dois jeitos de uma tag escrever, a varredura que oferece uma tag por coluna, quatro exemplos completos e o que o driver não faz.

Ver como Markdown

O driver Database lê os valores que um sistema da fábrica guarda numa tabela de banco de dados: a ordem de produção que o MES mantém, a receita ou o setpoint que o ERP guarda, o resultado que outro sistema de ensaio registrou. Cada tag lê um valor de uma tabela, e os valores chegam onde chegam os de toda outra tag: no Logic, nos dashboards, nas execuções de uma bancada de teste do Process. Onde uma tag manda, o driver também escreve de volta: na célula que a tag lê, ou por um comando próprio da tag.

SQL Server, PostgreSQL, MySQL e MariaDB, e SQLite são acessados sem nada instalado no computador. Qualquer outro banco de dados (Oracle, Access, Firebird e outros) é acessado pelo próprio driver ODBC, que precisa estar instalado no computador na versão de 64 bits.

Ler é o uso principal, e o caminho é curto: um dispositivo diz onde está o banco de dados e como a estação entra nele, a varredura oferece uma tag por coluna das tabelas, e toda tag nasce somente leitura. O que é de escrita só aparece numa tag depois que o acesso dela deixa a estação escrever.

Um dispositivo deste driver é um banco de dados: dois bancos de dados do mesmo servidor são dois dispositivos. Os dispositivos ficam sob o driver e podem ser arquivados em pastas, Driver → Pasta → Dispositivo → Tag, como em todo driver sem linha serial nem broker.

A página do driver

A linha sob o cabeçalho diz "Cada dispositivo lê um banco de dados. Acrescente um dispositivo, informe onde está o banco de dados dele e como a estação entra, e depois varra-o para acrescentar as colunas como tags." Para Configurar Connector, a página traz o cartão Escopo da varredura próprio do driver, com o dispositivo cujo banco de dados a varredura lê (veja Descoberta). Abaixo dele fica a tabela Dispositivos de qualquer driver (veja A tabela de dispositivos), que cresce com Acrescentar dispositivo, à direita do título; vazia, diz "Nenhum dispositivo ainda." A barra do driver traz Descobrir, cinza até o cartão Escopo da varredura estar completo. O driver aparece em Arquivos e bancos de dados, ao lado do driver File.

Dispositivo

Um dispositivo deste driver não tem cartão Conexão: o cartão Banco de dados fica no lugar dele, seguido do cartão Entrada em todo banco de dados menos o SQLite, que não tem entrada. O Intervalo de leitura (ms) do cartão Dispositivo, 1000 por padrão, diz de quanto em quanto tempo as tags leem o banco de dados, com cada tag podendo sobrescrevê-lo como em qualquer driver.

Um dispositivo novo é um SQL Server sem servidor: diz "Servidor ainda não informado", a página dele diz "A estação não alcança este dispositivo enquanto ele não disser onde está o banco de dados dele, então nada é lido dele ainda e não há erro a mostrar. Informe isso no cartão Banco de dados abaixo (o servidor e o nome do banco de dados, o arquivo ou a origem de dados) e a estação se conecta a ele." e nada é lido até ele dizer. A Base URI que o cabeçalho mostra é o endereço de runtime, que nunca traz o usuário nem a senha: database://sqlserver?server=mes-sql&instance=SQLEXPRESS&database=MES para uma instância do SQL Server, database://sqlite?file=C%3A%5CData%5Crecipes.db para um arquivo SQLite, database://odbc?source=ERP para uma origem de dados ODBC.

O cartão Banco de dados

Campo Aparece Significado Padrão
Tipo de banco de dados sempre SQL Server, PostgreSQL, MySQL / MariaDB, SQLite ou Outro (ODBC), que diz "Usa o driver ODBC de 64 bits instalado neste computador para esse banco de dados (Oracle, Access, Firebird e outros)." SQL Server
Servidor SQL Server, PostgreSQL, MySQL / MariaDB No SQL Server: "Um nome de host ou um endereço IP. SERVIDOR\INSTÂNCIA e SERVIDOR,PORTA são separados nos campos deles." Nos outros dois: "Um nome de host ou um endereço IP. Uma porta escrita depois de dois-pontos vai para o campo Porta." vazio
Porta os mesmos Vazia para a porta própria do banco de dados, que a caixa vazia mostra: 1433, 5432 ou 3306. Com uma instância do SQL Server e sem porta, a caixa não mostra nada e o SQL Server Browser do servidor diz a porta. vazio
Nome da instância SQL Server "Vazio para a instância padrão. Uma instância nomeada sem porta é encontrada pelo SQL Server Browser." Até 16 letras, dígitos, _ e $, começando por uma letra ou _. vazio
Nome do banco de dados SQL Server, PostgreSQL, MySQL / MariaDB O banco de dados do servidor que contém as tabelas, com até 128 caracteres. vazio
Arquivo do banco de dados SQLite "O caminho completo do arquivo SQLite, acessado com as permissões do Windows da conta em que a estação roda. Ele é aberto só para leitura, a não ser que uma tag escreva." A caixa mostra C:\Data\recipes.db como dica. O arquivo nunca é criado. vazio
Origem de dados ou texto de conexão Outro (ODBC) "O nome de uma origem de dados em Fontes de Dados ODBC do Windows (64 bits), ou um texto de conexão como Driver=;Dbq=C:\Data\plant.accdb. A senha vai no campo da senha, nunca no texto." vazio

Um campo que o tipo escolhido não lê não aparece, e guarda o valor para quando ler. Escolher outro tipo esvazia uma porta deixada na porta própria do banco de dados anterior, para que o novo seja acessado na dele. A caixa Servidor separa o que as ferramentas de banco de dados escrevem juntos:

Digitado em Servidor Vira
mes-sql\SQLEXPRESS (SQL Server) Servidor mes-sql, Nome da instância SQLEXPRESS
mes-sql,1433 (SQL Server) Servidor mes-sql, Porta 1433
10.0.0.5:5433 Servidor 10.0.0.5, Porta 5433

Enquanto o cartão não diz onde está o banco de dados, o dispositivo é salvo como está e aguarda, com o ponto cinza, nada lido e nenhum erro mostrado:

Tipo de banco de dados Aguarda O dispositivo diz
SQL Server, PostgreSQL, MySQL / MariaDB O servidor, depois o nome do banco de dados "Servidor ainda não informado", depois "Nome do banco de dados ainda não informado"
SQLite O arquivo "Arquivo do banco de dados ainda não informado"
Outro (ODBC) A origem de dados ou o texto de conexão "Origem de dados ainda não informada"

Uma configuração que o cartão não aceita é dita abaixo dos cartões, e o dispositivo não é salvo até ela ser corrigida:

Você informa O cartão diz
Um servidor com esquema, caminho ou espaço, como http://mes-sql "O servidor é só um nome de host ou um endereço IP: sem esquema, sem caminho e sem espaço. Uma instância do SQL Server e uma porta escritas junto vão para os próprios campos."
Um nome de instância com espaço ou com um sinal que não seja _ nem $ "O nome da instância tem até 16 letras, dígitos, sublinhados e cifrões."
Um nome de banco de dados com mais de 128 caracteres "O nome do banco de dados tem no máximo 128 caracteres, sem caracteres de controle."
Um arquivo que não é um caminho completo, como recipes.db "O arquivo do banco de dados é um caminho completo: uma unidade, uma pasta e o arquivo (C:\Data\receitas.db), ou um compartilhamento de rede (\server\data\receitas.db)."
Uma pasta, ou um caminho com *, ?, <, > ou aspas "Informe o caminho do próprio arquivo do banco de dados, não de uma pasta, sem * ? | < > nem aspas."
Um nome de origem de dados com colchete, chave, parêntese, vírgula, ponto e vírgula ou um de ? * ! @ \ O cartão pede o nome que a origem tem em Fontes de Dados ODBC, ou um texto de conexão.
Um texto de conexão que não são pares key=value, como uma chave deixada aberta "Um texto de conexão são pares key=value separados por ponto e vírgula; um valor que contém ponto e vírgula vai entre chaves."
Um texto de conexão com PWD= ou Password= "Tire a senha do texto de conexão e informe-a no campo da senha: o texto aparece na tela e é escrito no diário, e esse campo a guarda protegida."

O salvamento segue as mesmas regras, e o feed diz quando recusa uma: "O dispositivo 'MES' tem uma configuração de banco de dados que o driver não consegue usar. Abra-o e corrija o campo que o painel marca."

O cartão Entrada

Todo banco de dados menos o SQLite traz o cartão Entrada, com o usuário com que a estação entra.

Campo Aparece Significado Padrão
Entrar com a conta do Windows da estação SQL Server Ligado: "A estação entra no SQL Server com a conta do Windows em que roda; nenhum usuário ou senha é guardado." Desligado: "A estação entra no SQL Server com um usuário do banco de dados e a senha dele." desligado
Usuário um servidor em que se entra com usuário, e o ODBC, em que é opcional O usuário do banco de dados. vazio
Senha os mesmos A senha do usuário, guardada protegida como toda credencial de um driver: nunca é mostrada de novo, nunca é escrita no endereço nem no diário, e nunca é devolvida a um agente. vazio
Criptografia SQL Server Criptografada, certificado verificado: "A conexão é criptografada e o certificado do servidor é verificado contra os certificados em que este computador confia." Criptografada, qualquer certificado aceito: "A conexão é criptografada e qualquer certificado é aceito, como precisa um servidor de fábrica com certificado próprio. A identidade do servidor não é verificada." Sem criptografia: "Os valores e os comandos trafegam sem criptografia. Só para um servidor antigo que não oferece criptografia." Criptografada, certificado verificado

PostgreSQL e MySQL não têm o campo Criptografia: a conexão deles é criptografada sempre que o servidor oferece. Um SQL Server com certificado próprio, como costuma ser o de um servidor de fábrica, recusa a conexão com as palavras do banco de dados sobre uma cadeia de certificados emitida por uma autoridade em que não se confia: Criptografada, qualquer certificado aceito é a escolha que esse servidor pede.

Abaixo dos campos, o cartão diz que usuário pedir: "Peça ao administrador do banco de dados um usuário só com as permissões de que a estação precisa: leitura, e escrita só nas tabelas que as tags dela mudam." A estação lê e escreve os dados de outro sistema com tudo o que o usuário dela pode fazer, então esse usuário é o limite real do que a estação consegue mudar. Toda escrita é registrada no diário, como em todo driver.

Um servidor em que se entra com usuário, sem usuário informado ainda, diz em vez disso "Informe o usuário com que a estação entra. Até lá a estação não conecta este dispositivo." Não é uma recusa: o dispositivo é salvo, e o erro dele diz que nenhum usuário do banco de dados foi informado ainda, até o usuário estar lá.

Online, aguardando e offline

Situação O que o dispositivo e as tags dele fazem
O cartão Banco de dados não diz onde está o banco de dados O dispositivo aguarda, ponto cinza, nada lido e nenhum erro (veja acima).
Um servidor em que se entra com usuário, sem nenhum informado A estação não conecta o dispositivo; o erro dele diz que nenhum usuário do banco de dados foi informado ainda.
O servidor não responde, recusa a entrada, ou o arquivo SQLite não existe O dispositivo fica offline com a causa dada pelo próprio banco de dados, e a estação o conecta assim que puder. Uma conexão é esperada no máximo 10 s.
A conexão cai (o servidor reiniciou, a rede caiu) O dispositivo fica offline e se conecta de novo.
Uma instrução que o banco de dados recusa, ou que ainda está rodando depois de 10 s Leitura que falhou daquela tag, com as palavras do próprio banco de dados; o dispositivo continua lendo as outras tags.
Uma tag lê a linha mais recente de uma tabela que ainda não tem linha Essa tag aguarda, sem erro, e a saúde do dispositivo dela a deixa de fora até a primeira linha ser gravada: as outras tags do dispositivo dizem se ele está online. Uma tabela esvaziada depois que a tag leu dela não é essa espera: a tag mantém a última leitura, que conta como falha quando fica mais velha que o intervalo de leitura dela mais 10 s, como em todo driver.

Cada dispositivo tem uma conexão só dele, aberta quando ele se conecta e nunca compartilhada nem guardada num pool, então uma conexão que um servidor derrubou nunca é usada de novo.

Preparar o servidor

Os três bancos de rede vêm fechados a outro computador em instalações comuns. Cada um destes ajustes é feito no servidor, por quem o administra; a estação não muda nenhum deles.

Banco O que deixa a estação de fora Onde se muda
SQL Server TCP/IP desligado (o SQL Server Express e o Developer vêm assim) SQL Server Configuration Manager > SQL Server Network Configuration > Protocols for a instância: habilite o TCP/IP e reinicie SQL Server (a instância) em SQL Server Services
SQL Server Uma instância nomeada escuta numa porta que ela mesma escolhe TCP/IP > IP Addresses > IPAll: esvazie TCP Dynamic Ports e digite a porta em TCP Port, depois reinicie; ou deixe vazio o campo Porta do dispositivo e informe o nome da instância
SQL Server Uma instância nomeada sem porta é localizada pelo SQL Server Browser, que está parado ou bloqueado (erro 26) SQL Server Services: SQL Server Browser iniciado, Start Mode Automatic; UDP 1434 liberada no firewall do servidor
PostgreSQL listen_addresses é localhost, o valor de fábrica postgresql.conf: listen_addresses = '*', depois reinicie o PostgreSQL
PostgreSQL Nenhuma linha do pg_hba.conf deixa entrar o endereço desta estação (SQLSTATE 28000) pg_hba.conf: uma linha host para o banco, o usuário e o endereço desta estação, com scram-sha-256 (md5 para uma senha guardada com MD5), depois SELECT pg_reload_conf();
MySQL, MariaDB bind-address é 127.0.0.1, como muitos pacotes o definem, ou o skip-networking está ligado A seção [mysqld] do arquivo de configuração: bind-address = 0.0.0.0, skip-networking apagado, depois reinicie
MySQL, MariaDB Nenhuma conta para o endereço desta estação (erro 1130) CREATE USER para o usuário no endereço desta estação, e GRANT do que as tags precisam

Todos eles precisam também da porta do banco liberada no firewall do computador do servidor. Quando o servidor responde de um desses jeitos, a página do dispositivo diz qual ajuste é, com estes passos e os valores deste dispositivo (a porta, a instância, o endereço desta estação como o servidor o viu, a linha do pg_hba.conf e a conta do MySQL, cada um com um botão de copiar), no lugar do erro em inglês do banco. O aviso some sozinho quando o dispositivo conecta, ou quando o servidor responde de outro jeito. O registro e o agente leem os mesmos passos.

Endereçamento de tags

Como uma tag lê

Uma tag deste driver não tem caixa de endereço própria: o cartão Origem dela pergunta como ela lê.

Lê O que a tag mostra Os campos
Tabela e coluna Uma célula: a coluna do valor de uma linha de uma tabela. Tabela, Coluna do valor, Linha a ler e os campos da linha
Consulta própria A primeira coluna da primeira linha que um SELECT próprio devolve. Texto da consulta

Uma tag nova lê Tabela e coluna, pela chave, como Double. Os tipos oferecidos são Boolean, Int32, Int64, Float, Double, String e DateTime. Ao ler uma célula, uma tag de número inteiro recusa um valor com fração em vez de arredondá-lo (a escrita é o contrário, veja Escrita), e um texto só é lido como número quando é um. Toda tag nasce Somente leitura; o que a escrita acrescenta está em Escrita.

Tabela e coluna

Campo Aparece Significado Padrão
Tabela Tabela e coluna "Um nome, ou um esquema e um nome (dbo.Orders). Um nome com espaços ou maiúsculas vai entre aspas ou colchetes, como em [Order Lines]." vazio
Coluna do valor Tabela e coluna A coluna cuja célula é o valor da tag. vazio
Linha a ler Tabela e coluna Pela chave: "A linha cuja coluna-chave contém o valor-chave. As tags da mesma tabela e da mesma linha são lidas juntas numa só consulta." A mais recente: "A linha com o valor mais alto da coluna de data: uma data e hora, ou um número que só cresce. As tags da mesma tabela e da mesma linha são lidas juntas numa só consulta." Pela chave
Coluna-chave Pela chave A coluna que escolhe a linha, como OrderNo. vazio
Valor-chave Pela chave O que a coluna-chave contém na linha a ler, como 4711, digitado como texto: o banco de dados o lê como lê um valor daquela coluna. vazio
Coluna de data A mais recente A coluna cujo valor mais alto é a linha mais recente, como updated_at. vazio

Um nome é lido do jeito que o banco de dados o lê:

Escrito Lido como
Orders Um nome simples, lido como o banco de dados lê qualquer nome simples: o PostgreSQL em minúsculas, o Oracle em maiúsculas.
"Order Lines", [Order Lines] O nome exato, sejam quais forem as aspas que o próprio banco de dados aceita.
dbo.Orders Um esquema e uma tabela: um ponto fora das aspas separa os dois.

O driver põe cada parte de um nome entre as aspas que o banco de dados dele aceita, então um nome nunca é colado numa instrução como texto. Uma tag cujos campos não funcionam não é salva, e a página dela diz o que falta:

Você deixa ou informa A página da tag diz
Nenhuma tabela "Informe a tabela em que o valor está."
Uma tabela de três partes, ou uma aspa não fechada "A tabela é um nome, ou um esquema e um nome (dbo.Orders); ponha um nome com espaços entre aspas ou colchetes. Cada parte tem no máximo 128 caracteres."
Nenhuma coluna do valor "Informe a coluna do valor."
Uma coluna do valor de duas partes "A coluna do valor é um só nome; ponha um nome com espaços entre aspas ou colchetes."
Pela chave, sem coluna-chave "Informe a coluna-chave que escolhe a linha."
Pela chave, sem valor-chave "Informe o valor-chave: o que a coluna-chave contém na linha a ler."
A mais recente, sem coluna de data "Informe a coluna de data cujo valor mais alto é a linha mais recente."

A linha somente leitura Endereço de origem (barramento) mostra o que o driver recebe: row?table=dbo.ProductionOrders&column=Quantity&key=OrderNo&equals=4711 para uma linha pela chave, newest?table=recipe_setpoints&column=oven_temperature&by=updated_at para a linha mais recente.

Consulta própria

Campo Significado Padrão
Texto da consulta "Um SELECT que só lê; o valor é a primeira coluna da primeira linha. @now é a data e a hora da estação." Uma consulta que começa com WITH e só lê também é aceita. vazio

A consulta é lida do jeito que o banco de dados a lê: o que fica dentro de um texto entre aspas, de um nome entre aspas ou de um comentário não é palavra da instrução. Uma consulta que faz mais do que ler é recusada onde é digitada:

Você informa A página da tag diz
Nada "Informe a consulta: um SELECT cuja primeira coluna da primeira linha é o valor."
Uma instrução que não é um SELECT, como UPDATE ou DELETE "A consulta começa com SELECT ou WITH. Para escrever, deixe o acesso da tag escrever e use um comando de escrita."
Um SELECT que muda o banco de dados: SELECT ... INTO, FOR UPDATE, ou um que contém INSERT, UPDATE, EXEC "A consulta mudaria o banco de dados (INSERT, UPDATE, SELECT INTO, FOR UPDATE, EXEC e afins). Uma consulta só lê."
Duas instruções "A consulta tem mais de uma instrução. Deixe um só SELECT."
Uma aspa, um colchete ou um comentário não fechado "Uma aspa, um colchete ou um comentário da consulta não está fechado."
Um valor que não seja @now, como @order "Uma consulta só aceita @now, a data e a hora da estação. Escreva qualquer outro valor no texto."

O endereço de barramento de uma tag de consulta é query?sql= seguido da consulta, codificada em porcentagem.

Leitura

Uma tag que lê Como é lida
Pela chave A coluna dela, na linha cuja coluna-chave é igual ao valor-chave; o valor-chave é entregue ao banco de dados como parâmetro.
A linha mais recente A coluna dela, na linha cuja coluna de data tem o valor mais alto daquela coluna (WHERE ... = (SELECT MAX(...) FROM ...)), uma forma que todo banco de dados e o ODBC leem igual; quando duas linhas empatam, a primeira é lida.
Várias tags da mesma tabela e da mesma linha Uma consulta por passada para todas as colunas delas, para que o banco de dados da fábrica não seja consultado uma vez por tag. Se o banco de dados recusar essa consulta (uma coluna que a tabela não tem), a coluna da própria tag é lida sozinha e aquela linha passa a ser lida coluna por coluna: uma coluna errada custa só a tag dela.
A consulta própria A consulta como está escrita, com @now entregue como parâmetro.
O banco de dados responde A tag
Um valor de um tipo que a tag lê Lê o valor.
Uma célula vazia (NULL) Falha a leitura.
Nenhuma linha com o valor-chave, ou mais de uma Falha a leitura: uma tag lê uma linha.
A linha mais recente de uma tabela que ainda não tem linha Aguarda, sem erro.
Uma consulta que não devolve nenhuma linha Falha a leitura.
Um valor que o tipo da tag não lê (um texto numa tag Int32, uma fração numa tag de número inteiro) Falha a leitura, com o motivo.

Uma leitura que falhou mantém a última leitura da tag, que conta como falha quando fica mais velha que o intervalo de leitura dela mais 10 s, como em todo driver. O banco de dados é consultado a cada leitura: uma mudança que outro programa faz é vista na leitura seguinte, nunca no instante em que é feita.

Escrita

Uma tag só escreve depois que o Acesso dela é Leitura e escrita ou Somente escrita. O cartão Origem dela então acrescenta o que uma escrita faz:

Campo Aparece Significado Padrão
Uma escrita a tag escreve Muda a célula que lê: "Muda a célula que esta tag lê, numa só linha. Um valor mais novo ainda à espera substitui um mais antigo." Executa o comando de escrita dela: "Executa o comando de escrita abaixo. Toda escrita conta: nenhuma ainda à espera é descartada por uma mais nova." Uma tag que lê a consulta própria não tem célula para mudar, e recebe só Executa o comando de escrita dela. Muda a célula que lê
Comando de escrita Executa o comando de escrita dela "Um UPDATE com o WHERE dele, um INSERT, ou a chamada de um procedimento armazenado. @value é o valor escrito e @now a data e a hora da estação; o valor é sempre um parâmetro, nunca colado no texto." A caixa vazia mostra INSERT INTO results (result, recorded_at) VALUES (@value, @now) como dica. vazio

Uma tag Somente escrita que executa o comando de escrita dela não lê nada, então o cartão Origem dela traz só a escrita.

Uma escrita Como acontece
Muda a célula que lê Um UPDATE que põe a coluna do valor em @value na linha da tag, dentro de uma transação desfeita a não ser que exatamente uma linha tenha mudado: um valor-chave que nenhuma linha tem, ou que duas linhas têm, não escreve nada e diz isso. Um valor mais novo ainda à espera substitui um mais antigo, como em qualquer setpoint.
Executa o comando de escrita dela O comando roda uma vez por escrita, com o valor como @value e a data e a hora da estação como @now. Toda escrita conta: dois INSERTs são duas linhas, e uma escrita ainda à espera nunca é descartada por uma mais nova. Um procedimento armazenado é chamado com EXEC, CALL ou o {call ...} do ODBC.
Um valor com fração, numa tag de número inteiro Arredondado, não recusado: um valor com fração escrito numa tag de número inteiro (Int32 ou Int64) sem Escala nem Calibração é arredondado ao número inteiro mais próximo antes de chegar ao banco de dados, e as metades vão para longe do zero (2,5 grava 3, -2,5 grava -3). Recusar a fração é o jeito de ler uma célula, não de escrever um valor.
Resposta Feita, ou recusada com as palavras do próprio banco de dados: uma permissão que falta ao usuário, uma restrição que a linha viola, um valor que a coluna não aceita.

Um comando que o driver não consegue executar é recusado na página da tag:

Você informa A página da tag diz
Nada "Informe o comando de escrita: um UPDATE, um INSERT ou a chamada de um procedimento armazenado com @value."
Um comando que começa com outra palavra, como DELETE "O comando de escrita começa com UPDATE, INSERT, EXEC ou CALL."
Duas instruções "O comando de escrita tem mais de uma instrução. Deixe uma, ou chame um procedimento armazenado."
Uma aspa, um colchete ou um comentário não fechado "Uma aspa, um colchete ou um comentário do comando de escrita não está fechado."
Sem @value "Ponha @value onde vai o valor escrito: ele é sempre um parâmetro, nunca colado no texto."
Um valor que não seja @value nem @now, como @line "Um comando de escrita só aceita @value, o valor escrito, e @now, a data e a hora da estação."
Um UPDATE sem WHERE "Um UPDATE sem WHERE muda todas as linhas da tabela. Acrescente o WHERE que escolhe a linha."

Os nomes com @@, as funções do SQL Server, e os nomes de argumento de um EXEC (@speed = @value) não são valores e ficam como estão escritos. O salvamento segue as mesmas regras, e o feed diz quando recusa uma tag: "A tag 'Order quantity' não diz onde está o valor dela no banco de dados, ou tem uma consulta ou um comando de escrita que o driver recusa. Abra-a e corrija o campo que o painel da tag marca."

O endereço de barramento acrescenta a escrita: row?table=recipes&column=setpoint&key=code&equals=R-100&write=cell para uma célula, none?write=command&command= seguido do comando para uma tag Somente escrita que executa o comando dela.

Descoberta

O cartão Escopo da varredura

Para Configurar Connector, a página do driver traz o cartão Escopo da varredura, sob a linha "Entra como o dispositivo entra e oferece uma tag para cada coluna das tabelas dele, na linha mais recente ou na linha da menor chave."

Campo Significado Padrão
Dispositivo a varrer Um dispositivo do driver, pelo nome. Um banco de dados só é varrido por meio de um dispositivo, que guarda a entrada dele; uma edição do dispositivo ainda à espera de ser salva é salva primeiro. o primeiro dispositivo pelo nome
Tabelas "Vazio para todas as tabelas, ou um nome ou um padrão em que * vale por quaisquer caracteres, como Receita*." vazio

Um driver sem dispositivo traz só "Um banco de dados é varrido por meio de um dispositivo, que guarda a entrada dele. Acrescente um dispositivo deste driver e diga onde está o banco de dados dele." O que ainda falta ao escopo é dito em vermelho abaixo do cartão, e Descobrir continua cinza até ele estar completo:

O escopo O cartão diz
Um dispositivo que não diz onde está o banco de dados, ou que tem uma configuração que o driver não consegue usar "O dispositivo 'Recipes' ainda não diz onde está o banco de dados dele, ou tem uma configuração que o driver não consegue usar. Complete primeiro o cartão Banco de dados."
Um padrão com esquema, aspas, colchete ou ponto e vírgula, como dbo.Recipe* "'dbo.Recipe*' não é um nome nem um padrão de tabela. Escreva um nome, ou um padrão em que * vale por quaisquer caracteres, sem esquema nem aspas."
Um dispositivo que não existe mais "O dispositivo escolhido para varrer não existe mais. Escolha outro dispositivo a varrer."

Quando o dispositivo a varrer tem uma edição que não pode ser salva, a varredura não começa: "A descoberta não começou porque a edição do dispositivo a varrer não pôde ser salva."

O que a varredura oferece

A varredura entra como o dispositivo entra, lê a lista que o próprio banco de dados tem das tabelas e das views dele (sem as do sistema) e das colunas delas, e diz que tabela lê, como "Lendo as colunas de recipes…". Ela oferece um candidato, o próprio dispositivo, marcado como Já configurado: o cartão dele lista, marcadas, as colunas que nenhuma tag do dispositivo lê ainda, e Acrescentar tags, antes de Abrir, acrescenta as marcadas ao dispositivo, somente leitura.

A tabela As tags candidatas dela
Tem uma coluna de data e hora Uma por coluna, lendo a linha mais recente pela primeira coluna desse tipo.
Não tem Uma por coluna menos a chave, lendo a linha do menor valor da chave primária (ou da primeira coluna, numa tabela sem chave): mude o Valor-chave da tag para ler outra linha.
Não tem, e não tem linha Fica de fora.
Uma coluna que nenhum tipo de tag lê (dados binários, uma geometria) Fica de fora, e é contada na linha que fecha a varredura.

As tags recebem o nome da tabela e da coluna (recipes.oven_temperature), o tipo da coluna, e toda uma é Somente leitura. Uma varredura lê no máximo 100 tabelas e 500 valores; uma cortada ali diz "A varredura de Recipes parou antes. Uma varredura lê no máximo 100 tabelas e 500 valores: informe um nome de tabela ou um padrão para ver os outros." O resto do comportamento da varredura está em Descoberta.

A própria página de um dispositivo faz o mesmo sem a página do driver: Descobrir tags, no cabeçalho do cartão de tags dele, entra como o dispositivo entra, varre o banco de dados dele como ele está salvo e oferece só as colunas para as quais ele ainda não tem tag (veja Descobrir as tags de um dispositivo).

Exemplo: uma ordem de produção do SQL Server

O MES guarda as ordens de produção no SQL Server, na tabela dbo.ProductionOrders do banco de dados MES, uma linha por número de ordem:

  1. Na página do driver, Acrescentar dispositivo; dê o nome MES. No cartão Banco de dados mantenha SQL Server, informe Servidor mes-sql (ou mes-sql\SQLEXPRESS para uma instância nomeada), deixe Porta vazia e informe Nome do banco de dados MES.
  2. No cartão Entrada informe Usuário station_reader e a Senha dele, ou ligue Entrar com a conta do Windows da estação. Para um servidor de fábrica com certificado próprio, escolha Criptografada, qualquer certificado aceito.
  3. Acrescentar tag Order quantity, Int32: Tabela dbo.ProductionOrders, Coluna do valor Quantity, Linha a ler Pela chave, Coluna-chave OrderNo, Valor-chave 4711. O endereço de barramento dela é row?table=dbo.ProductionOrders&column=Quantity&key=OrderNo&equals=4711.
  4. Acrescentar tag Product, String, na mesma tabela e na mesma linha, Coluna do valor ProductCode: as duas tags são lidas numa só consulta.

Com as ferramentas:

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

Exemplo: um setpoint de receita do PostgreSQL

O sistema de receitas acrescenta uma linha a recipe_setpoints toda vez que um setpoint muda, datada na coluna updated_at:

  1. Acrescentar dispositivo; dê o nome Recipes, Tipo de banco de dados PostgreSQL, Servidor recipes-db, Porta vazia (a 5432 do PostgreSQL), Nome do banco de dados recipes, e depois Usuário e Senha no cartão Entrada.
  2. Acrescentar tag Oven setpoint, Double: Tabela recipe_setpoints, Coluna do valor oven_temperature, Linha a ler A mais recente, Coluna de data updated_at.

Cada linha nova é lida na leitura seguinte da tag. O PostgreSQL lê um nome simples em minúsculas, então uma coluna criada com maiúsculas, como OvenTemp, é escrita entre aspas: "OvenTemp". Com as ferramentas:

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

Exemplo: uma linha de resultado escrita como INSERT

O sistema de qualidade quer uma linha por peça medida na tabela test_results dele:

  1. No dispositivo desse banco de dados, Acrescentar tag Result, Double, Acesso Somente escrita.
  2. Uma escrita Executa o comando de escrita dela, e no Comando de escrita escreva INSERT INTO test_results (result, recorded_at) VALUES (@value, @now), que acrescenta a linha.

Cada valor que o Logic escreve em Result vira uma linha própria, com a data e a hora da estação ao lado; escritas que vêm uma atrás da outra são todas mantidas, em ordem, nenhuma descartada por uma mais nova. Uma tag Leitura e escrita que lê uma célula mudaria, em vez disso, a única linha dela a cada escrita. Com as ferramentas:

tag_upsert device=Quality name=Result opcUaType=Double accessType=WriteOnly databaseWriteMode=Command databaseCommand="INSERT INTO test_results (result, recorded_at) VALUES (@value, @now)"

Exemplo: Access e Oracle por ODBC

Banco de dados Neste computador No dispositivo
Microsoft Access O Access Database Engine da Microsoft, de 64 bits Tipo de banco de dados Outro (ODBC), Origem de dados ou texto de conexão Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\Data\plant.accdb, sem usuário
Oracle O driver ODBC de 64 bits da Oracle, e uma origem de dados ERP criada para ele em Fontes de Dados ODBC (64 bits) Tipo de banco de dados Outro (ODBC), Origem de dados ou texto de conexão ERP, Usuário e Senha no cartão Entrada

Quando a origem de dados ou o driver que um dispositivo indica existe só para programas de 32 bits (um Access de um Office de 32 bits, uma origem de dados criada em Fontes de Dados ODBC (32 bits)), ou não existe neste computador, o painel do dispositivo diz qual dos dois casos é, com o nome que o dispositivo deu, e dá a instrução inteira enquanto o dispositivo está ligado e não conecta. O erro do dispositivo diz o mesmo em inglês, e o driver_capabilities também, no prerequisite do driver Database (perDevice true):

Parte O que diz
O que falta Um driver ODBC de 64 bits para essa origem de dados ou esse driver: o Ganter Lab é um programa de 64 bits e só enxerga os drivers ODBC de 64 bits e as origens de dados criadas com eles, e não pode incluir o driver de outro fabricante
Onde obter Com o fabricante do banco de dados; para o Access, a página da Microsoft "Download and install Microsoft 365 Access Runtime", cujo runtime traz o Access Database Engine
Qual escolher A versão de 64 bits (para o Access, o botão de download de 64 bits do seu idioma), nunca a de 32 bits
Como instalar Como administrador; depois, para um dispositivo que indica uma origem de dados, criá-la em Fontes de Dados ODBC (64 bits) com o mesmo nome e o mesmo banco de dados
Tropeço conhecido Para o Access num computador com Office: a página da Microsoft diz que o Access Runtime instalado corresponde ao Office já instalado e não é compatível com um Office instalado pelo Windows Installer, e a página da Microsoft sobre escolher entre a versão de 64 bits e a de 32 bits do Office diz que uma versão é desinstalada antes de a outra ser instalada
Depois Na próxima tentativa de conexão o dispositivo conecta com a configuração que tem, sem reiniciar o Ganter Lab

O aviso termina com os drivers ODBC de 64 bits que este computador tem, pelo nome que o Driver={...} leva. Uma origem de dados ou um driver que existe em 64 bits e mesmo assim falha mostra o erro do próprio gerenciador de drivers.

Pelo ODBC, um nome simples é lido como o banco de dados o lê (em maiúsculas no Oracle) e um nome entre aspas exatamente; datas e horas são enviadas no segundo inteiro, o mais fino que todo driver ODBC aceita. Com as ferramentas:

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>

Ferramentas do agente

driver_capabilities descreve este driver em database: o caminho simples, cada banco de dados com os campos e a porta própria, as escolhas de criptografia, os dois jeitos de uma tag ler e os dois de escrever, a regra de que um valor só entra numa instrução como @value ou @now, os tipos, os tempos de espera, o conselho sobre o usuário do banco de dados, a descoberta e quatro exemplos completos. device_upsert driver=Database aceita databaseKind (SqlServer, o padrão, PostgreSql, MySql, Sqlite ou Odbc), e para um servidor host (um server\INSTANCE ou server,port do SQL Server é separado), port, databaseName, e no SQL Server databaseInstance, databaseWindowsSignIn e databaseEncryption (Verified, TrustServerCertificate ou Off); databaseFile para o SQLite, databaseOdbc para o ODBC; username e password, que nunca é devolvida. Um dispositivo que ele devolve traz database, com o endereço e se o dispositivo ainda aguarda o usuário. tag_upsert aceita a coluna do valor como address, databaseSource (Fields ou Query), databaseTable, databaseRow (Key ou Newest), databaseKeyColumn, databaseKeyValue, databaseDateColumn, databaseQuery, e quando o accessType escreve, databaseWriteMode (Cell ou Command) e databaseCommand; uma tag nova é somente leitura e Double, a menos que opcUaType diga outra coisa. device_discover driver=Database aceita databaseDevice, o nome de um dispositivo configurado do driver, e opcionalmente databaseTables, um nome de tabela ou um padrão com *; as tags que faltam ao dispositivo são acrescentadas com tag_upsert. connector_browse devolve o databaseKind de cada dispositivo. As outras ferramentas estão em Ferramentas do agente.

Limites que vale conhecer

  • O driver lê e escreve os valores das tags dele, um valor por tag. Ele não registra as execuções da estação num banco de dados: uma linha por execução com o número de série, o veredito e as medidas não é algo que este driver escreve.
  • Nenhum driver ODBC vem com o produto. Oracle, Access, Firebird e todo banco de dados que não seja um dos quatro acessados diretamente precisam do próprio driver ODBC de 64 bits instalado no computador; um de 32 bits não é visto.
  • O dispositivo não guarda senha do Windows: a entrada no SQL Server com a conta do Windows, e um arquivo SQLite num compartilhamento de rede, usam a conta em que a estação roda, então o banco de dados ou o compartilhamento precisa deixar essa conta entrar.
  • Uma consulta só lê. O que muda o banco de dados é uma escrita, e uma escrita só acontece numa tag cujo acesso escreve.
  • Um valor nunca entra no texto de uma instrução: o valor escrito é sempre o parâmetro @value, a data e a hora da estação @now, e um valor-chave também é um parâmetro. Uma instrução que nomeia qualquer outro valor é recusada.
  • Uma escrita de célula muda exatamente uma linha; um comando UPDATE precisa do WHERE dele.
  • O banco de dados é consultado a cada leitura: uma mudança que outro programa faz é vista na leitura seguinte, e um banco de dados com muitas tags de uma mesma linha é consultado uma vez por passada para todas elas.
  • Uma coluna binária não é lida.