OPC UA
Um cliente OPC UA para servidores de terceiros, com confiança condicionada a certificado, endereçamento por node id e descoberta do espaço de endereços.
O driver OPC UA é um cliente para servidores OPC UA de terceiros (CLPs, gateways,
historiadores, outros sistemas SCADA) sobre opc.tcp. Ele é a contraparte de saída do
servidor OPC UA embutido que publica o espaço de endereços desta estação (descrito em
Configurações); os dois compartilham a identidade de aplicação da
estação, mas confiam nos seus pares de forma independente.
Dispositivo
| Campo | Significado | Padrão |
|---|---|---|
| Host | Nome DNS, endereço IPv4 ou IPv6 do servidor. | localhost quando deixado vazio |
| Porta | Porta TCP do endpoint. | 4840 (um 0 configurado recai em 4840) |
| Caminho do recurso | O caminho de endpoint que alguns servidores exigem depois do host e da porta, produzindo opc.tcp://host:port/path. Deixe vazio quando o servidor responde na raiz. |
vazio |
| Segurança da sessão | Desligada, a sessão vai assinada e criptografada e um equipamento que não oferece nada melhor é recusado. Permitir sessão sem segurança abre a sessão mesmo assim, em claro, para um equipamento que não anuncia nenhum endpoint seguro. | desligada |
| Usuário / Senha | A identidade de usuário da sessão. Usuário vazio significa sessão anônima. A senha fica protegida em repouso pela DPAPI do Windows por usuário e só pode ser lida na máquina e na conta do Windows que a digitaram. | anônima |
| Intervalo de leitura (ms) | Taxa de leitura padrão para as tags que não a sobrepõem. | 1000 |
Segurança e certificados
Conectar começa pela lista de endpoints do servidor: o cliente escolhe o endpoint mais seguro que o servidor anuncia e autentica a aplicação com o certificado da própria estação, a mesma identidade de aplicação OPC UA que o servidor embutido usa. Muitos servidores exigem que esse certificado seja confiável do lado deles antes de aceitarem a sessão; esse passo acontece no equipamento.
Um equipamento que não anuncia nada melhor do que um endpoint sem segurança é recusado,
e o dispositivo diz por quê. Aquela sessão levaria as leituras e a identificação em claro e
não provaria a identidade do equipamento, então ela só abre onde você pediu isso naquele
dispositivo: Segurança da sessão, Permitir sessão sem segurança, no cartão de
conexão. A escolha pertence àquele dispositivo, viaja no endereço dele como
?security=none e vale tanto para a sessão de leitura quanto para a navegação da
descoberta. Ligá-la nunca rebaixa um equipamento que oferece segurança: o endpoint mais
seguro anunciado continua sendo o escolhido.
No outro sentido, a confiança é fechada por padrão e explícita. O certificado do equipamento é conferido antes de a sessão abrir:
- Um certificado que esta estação nunca aprovou é recusado, registrado para revisão, e o painel do dispositivo mostra um aviso nomeando a aprovação que ele espera: o dispositivo não está "offline", ele está esperando uma decisão.
- Você revisa certificados em Configurações → Acesso de equipamentos, a metade de saída da confiança em certificados: um certificado registrado fica em Aguardando aprovação até você Aprovar (sessões novas podem abrir) ou Bloquear (recusado sem levantar avisos repetidos). Esta é a lista de equipamentos; o Acesso de clientes, na mesma página, é o outro sentido, quem pode conectar de fora ao servidor da própria estação.
- Revogar aprovação, numa linha aprovada, encerra as sessões vivas que rodam sobre aquele certificado e o devolve à lista de revisão, para que a próxima conexão pergunte de novo.
- Um equipamento que apresenta nenhum certificado não prova nada sobre quem respondeu, então não há o que aprovar e a sessão é recusada, com o endereço dela escrito no diário. Ele só conecta sob o mesmo Permitir sessão sem segurança, que passa a ser o que faz as vezes da aprovação.
Aprovar o servidor de um equipamento nunca autoriza aquele certificado a conectar de fora ao servidor da própria estação: os dois sentidos mantêm depósitos separados de propósito.
Comportamento da sessão
As tags são lidas ciclicamente: cada leitura pergunta ao servidor o valor atual do nó. O veredicto do próprio servidor viaja com toda amostra: um valor carimbado como Bad ou Uncertain é recusado e a tag lê qualidade ruim, então uma origem duvidosa nunca é lavada e transformada numa leitura boa. Um nó que não existe mais no servidor lê como sem valor, em vez de fazer o dispositivo inteiro falhar.
A sessão é supervisionada por keep-alives; depois de três keep-alives perdidos, o cliente inicia uma reconexão automática e segue em frente. O laço de tentativas em segundo plano da aplicação é dono da conexão inicial, então um servidor inalcançável não custa nada na inicialização.
Endereçamento da tag
Uma tag é endereçada pelo Node id dela, digitado como texto livre e enviado literalmente. As formas aceitas são as notações padrão do OPC UA:
| Exemplo | Significado |
|---|---|
ns=2;s=Temperature |
Identificador de texto no índice de namespace 2 |
i=2258 |
Identificador numérico no namespace 0 (aqui: o CurrentTime do servidor) |
ns=3;i=1042 |
Identificador numérico no índice de namespace 3 |
nsu=urn:vendor:app;s=Line1.Speed |
Forma expandida, que nomeia o namespace por URI em vez de índice, robusta contra mudanças de índice entre reinícios |
A tag lê e escreve o atributo Value do nó.
Tipos de valor
| Tipos oferecidos |
|---|
| Boolean, Byte, Int16, Int32, Int64, Float, Double, String (oito ao todo) |
Os valores são apenas escalares: vetores, estruturas e outros valores complexos são recusados como ilegíveis em vez de achatados num número enganoso, e a tag lê qualidade ruim. Uma tag assim falha sozinha; as outras tags do dispositivo seguem lendo, e nada é reconectado por causa dela. Um texto vazio é um valor, não uma falha. Tipos fora do conjunto oferecido (larguras sem sinal, DateTime, Guid, ByteString) não estão disponíveis neste driver.
Uma varredura de um servidor, portanto, oferece menos canais do que o servidor guarda: um nó que declara uma lista de valores, e um nó cujo tipo está fora do conjunto oferecido, ficam de fora. Eles não são descartados em silêncio, porém. A varredura os conta e a mensagem final dela diz quantos e de qual tipo, por exemplo "5 canal(is) ficaram de fora: 3 do tipo UInt32, 2 que guardam uma lista de valores em vez de um valor único.", para que uma lista curta seja lida como uma lista curta, e não como um controlador vazio.
Escritas
Uma tag gravável escreve o atributo Value do nó pelo serviço Write do OPC UA. A resposta do servidor é o veredicto: uma escrita rejeitada aparece como falha, e o valor cacheado só avança quando ela é aceita. Como em todo lugar, o campo de escrita recebe o valor de engenharia e a cadeia de valor é revertida antes de o valor bruto ser enviado.
Descoberta
O comando Descobrir recebe um alvo no campo ao lado dele: um endereço de servidor
OPC UA como opc.tcp://plc-host:4840. A varredura tem dois estágios, e a
linha de progresso nomeia o que está rodando:
- Endpoints: o serviço de descoberta padrão do alvo é consultado e toda URL de descoberta anunciada vira um endpoint candidato. Portas e caminhos de servidor personalizados vão e voltam nos campos de conexão do candidato.
- Canais: o espaço de endereços de cada candidato é navegado a partir da pasta Objects para baixo, e toda variável legível é listada como tag candidata com o tipo e o acesso dela. As áreas de diagnóstico do servidor são puladas.
A navegação entra anonimamente (com a mesma escolha do endpoint mais seguro, a mesma recusa de uma sessão sem segurança e a mesma condição do certificado do equipamento). Um servidor que recusa sessões anônimas, um servidor que não anuncia nenhum endpoint seguro, ou uma navegação que falha por qualquer motivo, ainda deixa o endpoint disponível para adicionar, com zero tags: adicione-o, defina as credenciais e a segurança da sessão no dispositivo e configure as tags à mão. Nada é persistido até você Adicionar um candidato, e cancelar mantém os candidatos que já estavam completos.
Limites que vale conhecer
- As leituras são consultas cíclicas ao atributo Value; o driver não cria assinaturas no servidor remoto.
- Só valores escalares: uma tag não consegue endereçar um elemento de vetor nem um campo de estrutura.
- A condição de aprovação vale por certificado: um equipamento que troca o certificado volta à lista de revisão e espera por uma decisão nova.