# Nós servidos

> A lista do que o servidor OPC UA embutido serve, e tudo o que ele serve: tags, variáveis da Logic, alarmes e comandos de dispositivo, cada um somente leitura até você liberar a escrita, onde um cliente encontra cada um e o que uma estação atualizada precisa fazer.

**Nós servidos** é o quarto cartão do painel do servidor OPC UA no Connector. O servidor serve esta lista e nada mais: um cliente que se conecta encontra as tags, as variáveis da Logic, os alarmes e os comandos de dispositivo listados aqui, e nenhum outro. O cartão diz isso sob o título: "O servidor serve esta lista e nada mais: cada linha é uma tag, uma variável da Logic, um alarme ou um comando de dispositivo. Uma linha fica somente leitura até você liberar a escrita. A escrita de um cliente segue então o mesmo caminho de qualquer outra e fica no diário com a sessão do cliente." Ver Connector lê o cartão; Configurar Connector o muda.

## Uma lista vazia {#an-empty-list}

A lista nasce vazia, numa estação nova e numa estação atualizada de uma versão que servia todo dispositivo inteiro. Enquanto ela está vazia, uma nota de cautela no cartão diz: "A lista está vazia, então o servidor não serve nada da estação: um cliente OPC UA não encontra tag, variável, alarme nem comando até você acrescentar linhas." O servidor continua escutando e continua aceitando as sessões que o [Acesso de clientes](connector-opcua-client-access) permite; elas percorrem um espaço de endereços sem nada da estação dentro. Um agente lê o mesmo no `server_status`, cujo `servesNothing` é verdadeiro enquanto a lista está vazia.

## A tabela {#the-table}

| Coluna | O que mostra |
| --- | --- |
| **Origem** | O que a linha serve, como o seletor o nomeia, ou "Sem origem ainda" enquanto a origem não foi escolhida. |
| **Acesso** | **Somente leitura** ou **Leitura e escrita**, e **Chamável** para um comando de dispositivo. |
| **Nó** | O endereço com que um cliente é configurado, na forma `nsu=<namespace>;s=<identifier>`; vazio enquanto a linha não serve nada. |

As linhas vêm por tipo (tags, variáveis, alarmes, comandos) e depois pelo nome. Sem nenhuma, a tabela diz "Nenhum nó é servido ainda. Adicione um com Nova linha." Clicar numa linha a seleciona e abre os campos dela sob a tabela; qual linha está selecionada pertence à janela em que você está.

| Comando | O que faz | Esmaecido quando (situação) | Não desenhado quando (papel) |
| --- | --- | --- | --- |
| **Nova linha** | Acrescenta uma linha somente leitura que ainda não serve nada e a seleciona, para a origem ser escolhida em seguida. O feed diz "Linha acrescentada à lista do servidor OPC UA. Escolha a origem dela." | Uma execução segura a estação, ou o runtime está parado. | Sem Configurar Connector. |
| **Excluir linha** (tinta de perigo) | Exclui a linha que a tabela tem selecionada, na hora e sem pergunta; a dica dele nomeia a origem que a linha serve, e o feed confirma. A origem não é tocada: um cliente deixa de encontrar o nó dela. | Nenhuma linha está selecionada ("Selecione uma linha da lista para excluí-la."), uma execução segura a estação, ou o runtime está parado. | Sem Configurar Connector. |

## Os campos de uma linha {#a-rows-fields}

Cada campo é guardado no momento em que muda, e o servidor serve a linha nova um instante depois, sem derrubar sessão nenhuma: ele lê a lista dez vezes por segundo.

| Campo | O que faz | Valores e padrão |
| --- | --- | --- |
| **Origem** | O que a linha serve. A lista abre com "(nenhum)", depois toda tag habilitada de um dispositivo habilitado, nomeada pelo driver, pelo dispositivo e por ela mesma ("Tag do Connector · Simulated · Oven · Temperature"), depois toda variável da Logic que guarda um valor, pelas pastas e pelo nome ("Variável da Logic · Oven / Setpoint"), depois todo alarme, nomeado do mesmo jeito ("Alarme da Logic · Oven / High temperature"), e por último todo comando de um dispositivo habilitado: os comandos declarados na página do dispositivo e os que um protocolo fixa, como os de um ponto de recarga ("Comando · OCPP · Charger · Reset"). Uma origem entra na lista uma vez só. A linha guarda a origem pela identidade, então renomear deixa a linha na mesma origem, que o servidor passa a servir sob o nome novo. Uma origem que a lista não oferece mais continua selecionada e nomeada, uma tag ou um comando desabilitado com o que o deixa de fora, e só uma origem que não existe mais aparece como ausente, com a identidade dela. O cartão [Usada por](connector-tags#the-used-by-card) de uma tag lista as linhas que a servem. | "(nenhum)" numa linha nova. |
| **Acesso** | Se um cliente pode escrever na linha. **Leitura e escrita** continua listado e esmaecido onde a origem não aceita escrita, com a dica "Esta origem não aceita escrita: só uma tag com acesso de escrita ou uma variável de memória aceita." Escolher um alarme devolve a linha a somente leitura. Num comando, o campo mostra **Chamável** como valor fixo, sem seletor, porque um comando é chamado, nunca lido nem escrito. | **Somente leitura** ou **Leitura e escrita**; **Chamável**, fixo, num comando. Somente leitura numa linha nova. |

Sob os campos, uma linha diz o que a linha da lista faz para um cliente:

| O cartão diz | Quando |
| --- | --- |
| "Esta linha ainda não serve nada: escolha a origem." | Nenhuma origem foi escolhida. |
| "A origem desta linha não existe mais, então o servidor não serve nada por ela." | A tag, a variável, o alarme ou o comando foi excluído. |
| "Um cliente pode ler este nó, mas não escrevê-lo." | Uma tag ou uma variável, somente leitura. |
| "Um cliente pode ler e escrever este nó: cada escrita fica no diário com a sessão do cliente." | Uma tag ou uma variável marcada como leitura e escrita. |
| "Um cliente lê Active, Acked, State, Priority e Message do alarme, e nunca os escreve." | Um alarme. |
| "Um cliente chama este comando como um método do dispositivo dele enquanto ele estiver na lista." | Um comando de dispositivo. |

Abaixo dessa linha, **Um cliente o encontra em** vem seguido do nó.

## O que uma linha recusa {#what-a-row-refuses}

Uma mudança que as regras da lista recusam não é guardada: o motivo aparece em vermelho acima dos campos da linha, a mudança continua na tela para você corrigir, e a linha continua servindo o que servia.

| O cartão diz | Quando |
| --- | --- |
| "Esta origem já está na lista: um cliente a encontra no nó que aquela linha serve." | A origem já está em outra linha. |
| "A origem não pode ser escrita: escolha uma tag com acesso de escrita ou uma variável de memória, ou deixe a linha somente leitura." | Leitura e escrita numa tag somente leitura, numa tag de um driver que nunca escreve, numa variável de expressão, num alarme, num comando ou numa origem que não existe mais. |
| "Uma linha que aceita escrita precisa da tag ou da variável que a recebe." | Leitura e escrita numa linha sem origem, o que só um agente consegue pedir. |
| "Esta linha da lista não existe mais. Recarregue e tente de novo." | A linha foi excluída em outro lugar, em outra janela ou por um agente, enquanto você a editava. |

Enquanto uma execução segura a estação ou o runtime está parado, uma mudança é recusada como toda mudança da página, com o motivo no feed de ações, e nada é guardado.

## Onde um cliente encontra cada origem {#where-a-client-finds-each-source}

| Origem | Onde fica | O que um cliente lê |
| --- | --- | --- |
| Tag | Onde sempre esteve: no namespace do dispositivo dela, `http://opcfoundation.org/UA/<driver>.<device>/`, sob o próprio nome da tag. Um cliente configurado antes de a lista existir a encontra no mesmo endereço. Um cliente que percorre o espaço de endereços a encontra na pasta `Devices` sob Objects, dentro do objeto com o nome do dispositivo dela. | O valor que o dispositivo respondeu, com a qualidade e o carimbo, como o Connector o lê. |
| Variável da Logic | Na pasta `Logic` sob Objects, dentro das próprias pastas da Logic, no namespace do servidor `http://opcfoundation.org/UA/EdgeTranslator/` sob o endereço dela na Logic (`Variables.Oven.Setpoint`). | O valor dela, tipado pela conversão única da estação: Boolean, Int64 para um Inteiro, Double para um Número decimal, String para um Texto e DateTime para uma Data e hora. Uma variável sem valor bom é lida como BadDataUnavailable. |
| Alarme | Na pasta `Alarms` sob Objects, dentro das próprias pastas da Logic, como um objeto sob o endereço dele na Logic (`Alarms.Oven.HighTemperature`). | Cinco membros somente leitura: Active e Acked (Boolean), State (Int32: 0 sem alarme, 1 ativo e não reconhecido, 2 ativo e reconhecido, 3 normalizado e não reconhecido), Priority e Message (String). Enquanto o alarme segura o estado durante uma qualidade ruim, Active, Acked e State são lidos como UncertainLastUsableValue. |
| Comando | Um método do dispositivo dele, ao lado das tags do dispositivo. | Chamado com os valores que o comando declara, responde com o que o equipamento respondeu. |

Todo dispositivo mantém o namespace dele seja o que for que a lista sirva dele, então o índice em que um cliente encontra um namespace não muda quando as tags de outro dispositivo entram na lista ou saem dela. Um dispositivo de que a lista não nomeia nada não tem nó nenhum.

## Escrita {#writing}

A escrita de um cliente só chega à estação numa linha marcada como leitura e escrita, e a lista é consultada de novo no instante em que a escrita chega, então uma linha que acabou de virar somente leitura nunca é escrita. A escrita numa tag vai para a fila de entrega do dispositivo dela como toda escrita de fora, e a resposta espera o equipamento; a escrita numa variável de memória passa pelo funil de escrita da Logic e é convertida para o tipo da variável. As travas de origem valem: uma origem que um Process em execução segura é recusada. Toda escrita fica no diário com o aplicativo e a sessão do cliente. Uma variável de expressão e um alarme nunca aceitam escrita, e o servidor responde BadNotWritable. Um comando é chamado, não escrito, e um cliente só chama um comando que está na lista.

## Uma estação atualizada {#an-updated-station}

Uma estação atualizada de uma versão sem a lista servia toda tag de todo dispositivo. A lista dela nasce vazia, então depois da atualização o servidor OPC UA dela não serve nada até a lista ser montada: acrescente uma linha para cada tag que um cliente lê, marque como leitura e escrita as que um cliente escreve, e acrescente os comandos que um cliente chama. Um cliente configurado antes da atualização encontra cada tag no endereço que ela tinha, então não precisa de mudança nenhuma.

## Com um agente {#with-an-agent}

```text
server_list_upsert(source: "Connector.Simulated.Oven.Temperature")
server_list_upsert(source: "Variables.Oven.Setpoint", access: "ReadAndWrite")
server_list_upsert(source: "Alarms.Oven.HighTemperature")
server_status()
```

Uma linha criada por um agente é somente leitura, a menos que `access` diga outra coisa, e `server_list_delete` exclui uma pelo id. As ferramentas estão descritas em [As ferramentas, área por área](agent-tools#connector--configure).

## O que a lista não faz {#what-the-list-does-not-do}

Ela não liga o servidor (o Habilitar da barra de comandos liga), não decide que cliente pode se conectar (o [Acesso de clientes](connector-opcua-client-access) decide) e não reconhece um alarme de fora: reconhecer continua sendo um comando do operador. Ela serve os valores acima e nenhum evento OPC UA de alarmes e condições. Uma variável que guarda uma imagem, um ícone ou uma cor não é oferecida, e uma constante da descrição de um dispositivo não é servida.
