# OPC DA

> Um cliente para servidores OPC Data Access clássicos sobre COM/DCOM, rodando num processo auxiliar de 32 bits, com endereçamento por ID do item e varredura dos servidores de uma máquina.

O driver **OPC DA** é um cliente para servidores OPC Data Access clássicos (versões 1.0, 2.05a e 3.0), os servidores COM pelos quais gateways de CLP mais antigos, sistemas SCADA e simuladores ainda publicam os seus dados. Um servidor é nomeado pela máquina em que roda e pelo seu ProgID, por exemplo `Matrikon.OPC.Simulation.1`, e cada tag pelo ID do item no servidor. Acrescente o driver e os seus dispositivos na página [Connector](connector).

## Dispositivo {#device}

| Campo | Significado | Padrão |
| --- | --- | --- |
| **Host ou IP** | O nome ou o endereço do computador em que o servidor OPC DA roda. Vazio quer dizer este computador, onde roda a maioria dos servidores clássicos. | vazio: este computador |
| **Servidor / Chave** | O ProgID do servidor, como o fabricante o registra no Windows, por exemplo `Matrikon.OPC.Simulation.1`. | `OPC.Server.1` |
| **Intervalo de leitura (ms)** | De quanto em quanto tempo a estação lê as tags do dispositivo, a menos que uma tag defina o seu próprio intervalo. | 1000 |

O endereço do dispositivo é montado com os dois, por exemplo `opc.da://localhost/Matrikon.OPC.Simulation.1`. Não há porta: o COM acha o servidor pelo próprio registro do Windows.

## Endereçamento da tag {#tag-addressing}

Uma tag é endereçada pelo seu **ID do item**, digitado como texto livre e enviado ao servidor exatamente como foi escrito, por exemplo `Random.Real8` ou `Channel1.Device1.Tag1`. Os IDs dos itens são do próprio servidor; a documentação dele ou uma varredura os lista. A estação acrescenta cada item a um grupo do dispositivo na primeira vez em que uma tag o lê, e o lê do equipamento, não do cache do servidor.

## Tipos de dado {#data-types}

O seletor de **Tipo de dado** oferece os tipos que um item OPC DA guarda: Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float, Double, String e DateTime. Toda leitura é convertida para o tipo da tag, então escolha o tipo que o servidor declara para o item, o mesmo que uma varredura propõe: um item real de 64 bits lido como Float perde precisão, e lido como Double a mantém. Um valor que o tipo da tag não comporta, como um texto que não é número ou um vetor, deixa a tag sem valor. No OPC DA uma data não traz fuso horário, e a estação a lê e a escreve como UTC.

Todo valor com que o servidor responde traz a sua qualidade. Um valor de qualidade boa (Good) chega à tag. Um de qualidade incerta (Uncertain) ou ruim (Bad) deixa a tag sem valor, e a linha do diário da leitura que falhou nomeia a qualidade com as palavras da especificação OPC DA, por exemplo `Bad: not connected (0x0008)` ou `Uncertain: last usable value (0x0044)`. Um item cuja leitura falha deixa a sua tag sem valor, e as outras tags do dispositivo continuam lendo.

## Descoberta {#discovery}

**Descobrir** lista os servidores OPC DA registrados num computador: digite o nome ou o endereço dele no alvo da varredura, ou deixe vazio para este computador. Cada servidor é oferecido como um dispositivo, e o seu espaço de endereços é percorrido: todo item que ele tem é oferecido como uma tag somente leitura, com o tipo que o servidor declara para ele: um real de 64 bits como Double, um inteiro de 16 bits sem sinal como UInt16, e assim por diante para cada tipo acima, com um valor monetário como Double. Um item que não declara tipo é oferecido como String, que lê qualquer valor; um item de um tipo que nenhuma tag lê, como um vetor, não é oferecido, e a varredura o conta entre o que deixou de fora. Veja [Descoberta](connector-discovery) para saber como os candidatos são escolhidos e acrescentados.

A varredura pede os servidores ao enumerador de servidores OPC (OpcEnum), pelas bibliotecas de proxy e stub do OPC DA registradas neste computador. Enquanto um deles falta, a varredura não lista nada e diz o que falta, com os passos de [Instalar os OPC Core Components](#installing-the-opc-core-components).

## Escritas {#writes}

Tags cujo **Acesso** é Leitura e escrita ou Somente escrita podem ser escritas, no mesmo item que a leitura usa. O valor é enviado no tipo em que o servidor guarda o item (no tipo da própria tag quando o servidor não o diz), convertido a partir do valor da tag sem passar por texto, de modo que uma estação em qualquer idioma envia o mesmo número. Um número inteiro fora da faixa do tipo do item é recusado antes que algo seja enviado, nunca cortado para o valor mais próximo que o tipo comporta. Uma escrita que o servidor recusa volta recusada, com o motivo quando é um que a estação sabe dizer (um item que não aceita escrita, um valor que o item não aceita, um item que o servidor não conhece, acesso recusado) e, fora isso, com o código de erro do servidor, por exemplo `OPC DA 0x80004005`; o diário guarda o código do servidor em todos os casos. O OPC DA não tem comandos: um dispositivo deste driver não oferece nenhum.

## O auxiliar de 32 bits {#the-32-bit-helper}

Os servidores OPC DA são alcançados por um cliente COM de 32 bits, que a estação de 64 bits não consegue carregar. Por isso o driver roda num processo auxiliar só dele, `Lab.Desktop.DriverBridge.exe`, que a estação inicia na primeira vez em que um dispositivo ou uma varredura OPC DA precisa dele, ou em que a estação confere os OPC Core Components, e fecha quando o Connector para. Nada muda no uso do driver: os seus dispositivos e tags são lidos, escritos, varridos e registrados no diário como os de qualquer outro.

Se o auxiliar parar, os seus dispositivos mostram o erro "O processo auxiliar de 32 bits do driver OPC DA parou. A estação o inicia de novo, e o dispositivo se reconecta por ele.", a página Eventos guarda o código de saída, e as suas tags perdem os valores. A estação inicia o auxiliar de novo, depois de uma pausa que cresce enquanto ele continua parando, e os dispositivos se reconectam por ele sozinhos. Uma escrita que estava a caminho quando o auxiliar parou volta com falha, dizendo que não se sabe se o valor chegou ao equipamento. Nenhum outro driver e nenhuma outra parte da estação para junto.

## Antes de começar {#before-you-start}

- A estação não instala nenhum componente OPC. O enumerador de servidores OPC (OpcEnum) e as bibliotecas de proxy e stub do OPC DA vêm com o servidor OPC DA, ou com os OPC Core Components. A estação confere sozinha se estão registrados e, enquanto um deles falta, diz como instalá-los: veja [Instalar os OPC Core Components](#installing-the-opc-core-components).
- Um servidor em outro computador é alcançado por DCOM, que os dois computadores têm de permitir para a conta do Windows com que a estação roda: permissões DCOM, regras de firewall e a mesma conta ou um domínio confiável. Essa configuração é feita no Windows, nunca na estação: veja [Preparar um servidor remoto](#prepare-a-remote-server).
- O driver roda só no Windows.

## Instalar os OPC Core Components {#installing-the-opc-core-components}

A estação confere sozinha, no auxiliar de 32 bits, se este computador tem o enumerador de servidores OPC
(OpcEnum) e as bibliotecas de proxy e stub do OPC DA registrados para programas de 32 bits: na primeira
vez em que a página do driver, a página de um dos seus dispositivos ou o agente pergunta, e de novo a cada
30 segundos enquanto um deles falta. Até o Connector iniciar, não se sabe se estão lá, e nada é dito
sobre isso. Enquanto um deles falta:

| Onde | O que diz |
| --- | --- |
| A página do driver | Um aviso de atenção, "Os OPC Core Components não estão neste computador", com os passos abaixo. O link dele abre a página da OPC Foundation no navegador do computador. |
| A página de cada dispositivo | O mesmo aviso, a não ser que o dispositivo esteja conectado. |
| Uma varredura | Não lista nada e diz o que falta: a linha que fecha a varredura aponta o aviso, e o `device_discover` do agente dá os passos em inglês. |
| O último erro de um dispositivo cuja conexão falha | O que falta e os mesmos passos, em inglês, como as causas do próprio driver são escritas. |
| O agente | O `driver_capabilities` os dá em `prerequisite`, com `installed` em false. |

Para instalar:

1. Execute de novo o instalador do seu servidor OPC DA: ele costuma instalá-los.
2. Senão, abra a página [Core Components](https://opcfoundation.org/developer-tools/samples-and-tools-classic/core-components/) da OPC Foundation e baixe os OPC Core Components Redistributables. Só um usuário registrado pode baixá-los: se a página disser que você não tem permissão para baixar o arquivo, entre com "Login" ou crie uma conta com "Create Account" na mesma página.
3. Use o `opc-core-components-redistributable-<version>-x86-x64.msi` num Windows de 64 bits, que traz também os componentes de 32 bits, e o que termina em `-x86.msi` só num Windows de 32 bits.
4. Execute-o como administrador e reinicie o computador se o instalador pedir.

Em até 30 segundos depois da instalação, o aviso some, a varredura lista os servidores OPC DA e os
dispositivos deste driver se conectam com a configuração que já têm, sem reiniciar o Ganter Lab.

## Preparar um servidor remoto {#prepare-a-remote-server}

Um servidor neste computador não precisa de mais nada. Um servidor em outro computador é alcançado
pelo DCOM, que não deixa entrar nada de outro computador até que os dois estejam preparados para
isso. A preparação é feita no Windows dos dois computadores, por um administrador de cada um, nunca
na estação:

1. Use a mesma conta do Windows com a mesma senha nos dois computadores (a conta com que a estação
   roda), ou uma conta de domínio que os dois conheçam.
2. No computador do servidor, rode o `dcomcnfg` e abra **Component Services > Computers > My
   Computer > Properties > COM Security**. Em **Access Permissions** e em **Launch and Activation
   Permissions**, tanto em **Edit Limits** quanto em **Edit Default**, dê a essa conta todos os
   direitos remotos. Em **Edit Limits** de **Access Permissions**, dê também **Remote Access** a
   ANONYMOUS LOGON, de que o enumerador de servidores OPC (OpcEnum) precisa.
3. Ali mesmo, em **My Computer > DCOM Config**, abra as Properties do servidor OPC e do OpcEnum
   e, na aba Security de cada um, personalize as três permissões com a mesma conta.
4. No computador da estação, rode também o `dcomcnfg` e, em **Edit Limits** de **Access
   Permissions**, dê **Remote Access** à conta com que o servidor OPC roda: o servidor chama a
   estação de volta.
5. No computador do servidor, no Firewall do Windows Defender, libere a entrada pela porta TCP 135 e
   os programas do servidor OPC e do OpcEnum (`OpcEnum.exe`), e confira em **Serviços** que o
   OpcEnum está rodando e inicia automaticamente.

**Edit Default** não muda nada enquanto **Edit Limits** nega o direito: ajuste os dois. O DCOM
atende na porta 135 e depois leva as chamadas por uma porta que o Windows escolhe, então um firewall
entre os dois computadores que abre só a 135 continua bloqueando o servidor.

| O que o Windows responde | O que a página do dispositivo diz |
| --- | --- |
| Acesso negado (0x80070005) | “*host* recusa esta estação pelo DCOM”, com a conta com que a estação roda e os passos 1 a 4 |
| O servidor RPC não está disponível (0x800706BA) | “*host* não responde ao DCOM”: o computador está desligado ou fora de alcance, o firewall dele bloqueia o DCOM, ou o OpcEnum não roda ali, com o passo 5 |

Cada aviso fica no lugar do erro do dispositivo e some sozinho assim que o servidor conecta. O
diário e o agente leem os mesmos passos em inglês. Um servidor neste computador nunca é dito assim.

Onde a instalação não permite DCOM, um wrapper ou túnel que serve o servidor OPC DA em OPC UA, no
computador do servidor, evita o DCOM de vez: a estação então lê o servidor com o driver
[OPC UA](driver-opc-ua).
