# Validação

> A página de saúde da configuração: o que a estação verifica em procedimentos, lógica, dashboards e nas listas dos servidores e brokers dela, todo achado que ela pode informar e como ele é redigido, o que uma linha abre, o distintivo do trilho, e por que nada é reparado aqui.

A página Validação lista aquilo em que a estação não consegue se apoiar: um vínculo de canal, um intertravamento, um campo de automação, uma expressão, um script ou uma condição da Logic, ou um componente de dashboard que aponta para uma tag, uma variável, um procedimento ou um endereço que a estação não tem mais, uma expressão, um script ou uma condição da Logic escritos de um jeito que o editor deles recusa, uma ação do Process cuja papelada uma execução não conseguiria emitir como está configurada, e um procedimento que a partida de uma execução recusaria. Ela é a entrada **Validação** no pé do trilho de navegação, abre para uma identidade que tem a permissão **Ver validação**, e responde em `/validation`. Ela é uma página que rola, desenhada na largura inteira porque todo achado é uma frase. Ela é irmã da saúde do runtime na barra de status: aquela diz se a estação está lendo, esta diz se a configuração ainda resolve.

Ela também lista uma linha de uma lista pela qual a estação entrega os dados dela (a lista do servidor OPC UA, o mapa de registradores do servidor Modbus ou a lista de publicação de um broker MQTT) cuja origem foi excluída: uma linha assim continua na lista e não serve nem publica nada.

A página informa; ela nunca repara. Uma linha abre o editor que é dono da falha, na entidade que a guarda, e o reparo é a sua edição lá.

## O cartão de situação {#the-status-card}

O cartão no topo é a resposta inteira da página sobre a configuração, e o único lugar em que uma estação limpa é anunciada:

| Estado | Ponto | Título | Detalhe |
|---|---|---|---|
| Limpa | Verde | Nada a reparar | Toda referência nos procedimentos, na lógica, nos dashboards e no que a estação serve e publica resolve, todo procedimento partiria, e toda ação tem o que precisa para sair. |
| Achados | Âmbar | *N* itens a reparar ("Um item" para um) | Nada é reparado aqui. Uma linha abre o editor dono da falha, na entidade que a guarda. |

O cartão carrega o único comando da página, **Verificar de novo** (dica: "Verificar a configuração inteira de novo agora. A lista também se atualiza sozinha sempre que algo muda."). Ele fica cinza enquanto uma verificação corre. Como uma verificação que encontra a mesma coisa deixa a lista exatamente como ela estava, o desfecho é informado no feed de ações da barra de status: "Verificação concluída: nada a reparar.", "Verificação concluída: *N* itens a reparar." ou "A verificação falhou: *motivo*".

Você raramente precisa de Verificar de novo. O validador está sempre ligado, na estação, e verifica de novo sozinho 750 milissegundos depois de qualquer rajada de mudanças em qualquer das superfícies que ele lê: dispositivos, linhas e tags do Connector; modelos do Process; os recursos; variáveis, ações e alarmes da Logic; dashboards; modelos de etiqueta; layouts de relatório. A página e o distintivo do trilho acompanham o resultado. Uma verificação que o Connector atravessa enquanto move dispositivos para dentro ou para fora (uma atualização de driver, um dispositivo sendo acrescentado) é refeita quando o Connector se acalma, então uma referência nunca é chamada de quebrada só porque o dispositivo dela está em movimento.

Ele também lê as três listas pelas quais a estação entrega os dados dela: uma linha acrescentada, editada ou excluída no servidor OPC UA, no servidor Modbus ou no cartão Publicar de um broker verifica de novo do mesmo jeito, e o mesmo faz a exclusão da tag, da variável, do alarme ou do comando que uma linha nomeia.

## Os grupos {#the-groups}

Os achados são agrupados pela superfície que é dona deles, numa ordem fixa. Um grupo sem nada dentro não é desenhado, então uma estação com uma falha de dashboard mostra um grupo.

| Grupo | Tipos de achado | A frase sob o título |
|---|---|---|
| Process | Vínculos (vínculos de canal, intertravamentos, automação), procedimentos e as ocorrências que eles armam, e papelada de ação | *N itens.* Vínculos de canal, intertravamentos e automação de unidade que nomeiam uma tag, uma variável ou um procedimento que a estação não tem mais, procedimentos que uma partida recusaria, e ações cuja papelada uma execução não conseguiria emitir do jeito que estão configuradas. |
| Logic | Variáveis de expressão, ações, alarmes | *N itens.* Expressões, scripts de ação e condições de alarme lendo um endereço que não resolve mais, ou escritos de um jeito que o editor deles recusa. |
| Dashboards | Componentes | *N itens.* Componentes cujas propriedades apontam para um endereço que não resolve mais. Eles desenham, mas não leem nada. |
| Connector | Linhas da lista do servidor OPC UA, do mapa de registradores do servidor Modbus e das listas de publicação dos brokers MQTT | *N itens.* Linhas da lista do servidor OPC UA, do mapa de registradores do servidor Modbus e das listas de publicação dos brokers MQTT cuja origem foi excluída. Elas continuam na lista, mas não servem nem publicam nada. |

## Uma linha {#a-row}

Toda linha é um achado, e ela diz do que se trata sem abrir nada:

- Um glifo para o tipo: uma unidade para um vínculo do Process, uma marca de impressão para papelada de ação, a marca de composição escrita para um procedimento, uma bandeira para uma ocorrência, as marcas de variável, ação e alarme da árvore da Logic, a marca de dashboard para um componente.
- O **nome** da entidade e, em seguida, o **tipo** dela quando o tipo diz algo que o nome não diz (um componente que o integrador nunca nomeou cai no tipo dele, e a linha não se lê "Medidor Medidor") e, depois, "em *local*" quando existe um.
- O achado: para um campo que nomeia um alvo, "*Campo* aponta para `referência`, que não existe mais." com a referência em monoespaçado; para um campo que o runtime não consegue usar, "*Campo*: *o que está errado*."
- Uma seta à direita: a linha abre alguma coisa. A dica da linha e o nome acessível dela são a frase inteira mais onde o clique cai ("Abrir a unidade no Process.", "Abrir a ação no Process.", "Abrir o procedimento no Process.", "Abrir a ocorrência no Process.", "Abrir o componente no editor.", "Abrir a variável na Logic.", "Abrir a ação na Logic.", "Abrir o alarme na Logic.").
- Para uma linha de uma lista de servidor, o glifo é a marca que a árvore do Connector desenha para o que guarda a lista (o servidor OPC UA, o servidor Modbus, o broker MQTT), e o clique cai onde a dica termina ("Abrir a linha no servidor OPC UA.", "Abrir a linha no servidor Modbus.", "Abrir a linha na página do broker MQTT.").

## Todo achado que a verificação pode produzir {#every-finding-the-scan-can-produce}

A redação abaixo é a da própria página. Um vínculo de canal guarda a chave da origem dele, então a linha dele nomeia a chave que não resolve mais; um intertravamento, uma origem de automação e um retorno guardam uma identidade que o operador nunca lê, então as linhas deles dizem que a tag ou a variável foi removida em vez de imprimi-la.

### Process: vínculos de canal {#process-channel-bindings}

Tipo "Vínculo de canal"; nome: o nome do canal (ou "(canal removido)"); local: "*Modelo* · *Unidade*". Abre a tela Canais do modelo, na unidade.

| Campo | Redação |
|---|---|
| Tag | aponta para a chave de tag guardada, que não existe mais |
| Variável | aponta para a chave de variável guardada, que não existe mais |

### Process: intertravamentos {#process-interlocks}

Tipo "Intertravamento"; nome: o nome da unidade; local: "*Modelo* · *Unidade*". Uma unidade é julgada pelo que ela de fato observa: a origem própria dela, ou o padrão do modelo quando ela segue o modelo. Abre a tela Automação do modelo, na unidade.

| Campo | Redação |
|---|---|
| Origem | ele segue o modelo, cujo padrão não nomeia origem booleana nenhuma. |
| Origem | nenhuma origem booleana está configurada. |
| Origem | uma tag e uma variável estão selecionadas ao mesmo tempo. |
| Tag | a tag em que ele estava apontado foi removida. |
| Tag | uma tag DateTime não é convertível para booleano. (também tags Guid e ByteString) |
| Variável | a variável em que ele estava apontado foi removida. |
| Variável | uma variável do tipo data e hora não é convertível para booleano. (também imagem, ícone e cor) |

Os três primeiros só são informados enquanto o intertravamento de parada do modelo está habilitado.

### Process: automação {#process-automation}

Tipo "Automação"; nome: o nome da unidade; local: "*Modelo* · *Unidade*". Só uma automação **habilitada** é julgada: uma desligada não conduz nada e sai da lista. Abre a tela Automação do modelo, na unidade.

| Campo | Redação |
|---|---|
| Comandos | nenhuma origem de início está configurada. |
| Procedimento | o procedimento fixo não está disponível. (seleção fixa) |
| Seletor | um achado de origem (abaixo), para uma origem inteira |
| Código de seleção *n* | ele seleciona um procedimento que foi removido. |
| Origem do comando *Iniciar*, Origem do comando *Parar* e assim por diante, uma por origem de comando | um achado de origem, para uma origem booleana |
| Metadados | um mapeamento preenche um procedimento ou um campo que foi removido. |
| Metadado "*campo*" | um achado de origem (numérico para um campo numérico; booleano, inteiro, real, texto ou data para os demais), ou: este campo não aceita geração automática. |
| Retorno “Pronta”, Retorno “Ativa”, Retorno “Código selecionado”, Retorno “Resultado do comando” | a tag em que ele escreve foi removida. / a tag em que ele escreve não é escrevível. / ele exige uma tag booleana. (Pronta, Ativa) / ele exige uma tag inteira. (Código selecionado, Resultado do comando) |

Um achado de origem é um destes: "nenhuma origem está configurada.", "uma tag e uma variável estão selecionadas ao mesmo tempo.", "a tag que ele lê foi removida.", "a tag que ele lê não é legível." (a tag está desabilitada ou é somente escrita), "uma tag *tipo* não é compatível aqui.", "a variável que ele lê foi removida.", "uma variável do tipo *tipo* não é compatível aqui.". A compatibilidade segue o papel do campo: uma origem booleana precisa de uma tag ou variável booleana; uma origem inteira, de um tipo inteiro; uma origem numérica, de um tipo inteiro ou real; uma origem de metadados, de qualquer tipo booleano, inteiro, real, texto ou data.

### Process: procedimentos {#process-procedures}

Tipo "Procedimento"; nome: o nome do procedimento; local: o nome do modelo. O julgamento é o mesmo portão por onde a partida de uma execução passa, então um procedimento que esta lista chama de executável é um que a bancada aceita. Abre a página do próprio procedimento.

| Campo | Redação |
|---|---|
| Composição | Uma avaliação julga sobre linhas registradas. Este procedimento carrega uma, mas não tem datalog. |
| Composição | A ocorrência '*nome*' observa amostras registradas. Este procedimento a arma, mas não tem datalog. |
| Composição | Não há o que executar: este procedimento não referencia nem datalog nem receita. |
| Composição | O modo instantâneo precisa de uma receita instantânea (ou de nenhuma). Um perfil temporizado não tem um instante único. |
| Composição | O modo controlado precisa de uma receita instantânea (ou de nenhuma). Os setpoints são aplicados na partida e o estado seguro na parada. |
| Composição | O modo temporizado precisa de uma duração. Defina uma. |
| Composição | O modo temporizado precisa de uma receita temporizada (ou de nenhuma). Um conjunto instantâneo não tem linha do tempo. |
| Composição | O perfil da receita (*N* ms) é mais longo que a janela temporizada (*M* ms). |
| Composição | A ocorrência '*nome*' observa 'Channels.*canal*', que o datalog deste procedimento não registra. |
| Composição | Uma recusa sobre o que uma execução concluída contribui para a produção, ou sobre um valor de receita que não alcança o canal a que é dirigido, nas palavras do editor que é dono dela. |

### Process: ocorrências {#process-occurrences}

Tipo "Ocorrência"; nome: o nome da ocorrência; local: o nome do modelo. Só é lida a ocorrência que um procedimento arma, e ela é lida uma vez só por mais procedimentos que a armem, porque a condição é uma e o reparo também. Abre a página da própria ocorrência.

| Campo | Redação |
|---|---|
| Condição | A recusa da própria condição, nas palavras do editor de ocorrências: uma referência de canal que este modelo não tem, uma condição que não é analisável, uma que devolve algo que não é booleano, ou dois canais que dão no mesmo nome. Ela também é escrita em inglês. |

Uma condição que para em pé sozinha e mesmo assim não pode ser julgada, porque o datalog do procedimento deixa de fora o canal que ela observa, é um achado naquele procedimento: o datalog é a escolha do procedimento.

### Process: papelada de ação {#process-action-paperwork}

Tipo "Ação"; nome: o nome da ação; local: o nome do modelo. O julgamento é o mesmo de que a página da própria ação tira o aviso "Precisa de revisão" dela, então uma ação chamada de pronta lá está pronta aqui. Abre a página da própria ação.

| Campo | Redação |
|---|---|
| Comandos | Acrescente um comando: esta ação ainda não emite nada. |
| Comando *n* · Etiqueta (Início), Comando *n* · Relatório (Conclusão) e assim por diante | A primeira observação sobre aquele comando e, em seguida, "(mais *k* neste comando)" quando há mais. Um comando com várias observações continua sendo um reparo, feito numa página, então ele é uma linha. |

As observações que um comando pode carregar, na ordem em que são reparadas:

- Selecione ao menos um veredito de conclusão. (um comando na Conclusão sem veredito marcado)
- Escolha um relatório. / O relatório selecionado não existe mais.
- Escolha um modelo de etiqueta. / O modelo foi limpo ou excluído; os mapeamentos guardados são preservados. / O modelo global selecionado não existe mais.
- O modelo selecionado ainda não tem comandos de impressora; escreva-os ou importe-os antes que uma execução chegue a este comando.
- Não foi possível ler os marcadores do modelo: *erro*
- `{{marker}}` precisa de uma origem. / `{{marker}}` está mapeado mais de uma vez.
- `{{marker}}`: escolha uma origem / esta origem não está disponível no início / selecione um campo do catálogo de metadados deste modelo / selecione um critério de uma das avaliações deste modelo / defina um ciclo explícito, contado do zero, de 0 a *n* / remova as casas decimais desta origem de data e hora / use o formato padrão para esta origem numérica / as casas decimais precisam ficar entre 0 e 9 / remova a formatação numérica ou de data desta origem de texto
- `{{marker}}` foi removido do modelo atual; remova o mapeamento guardado dele.

### Logic {#logic}

Sem local: os tipos da Logic são de primeiro nível. Uma linha por endereço distinto que não resolve, com o endereço escrito como a expressão o escreve. Só variáveis de expressão são verificadas; uma variável de memória não tem expressão para ler. Quando todo endereço de um texto resolve, o texto também é julgado como o editor dele o julga, e um texto que o editor recusa é uma linha, com a própria mensagem do editor como redação: um alarme salvo como `!Variables.Start` diz "'Variables.Start' é o próprio ponto, não o valor dele: como condição ele sempre conta como verdadeiro. Leia o valor dele com Variables.Start.ValueToBool()." O julgamento deixa de fora a avaliação de teste do editor sobre os valores atuais, então uma linha nunca aparece e some com uma leitura, e um texto vazio não é listado: é uma definição ainda não escrita.

| Tipo | Campo | Redação |
|---|---|---|
| Variável de expressão | Expressão | aponta para `endereço`, que não existe mais |
| Ação | Script | aponta para `endereço`, que não existe mais |
| Alarme | Condição | aponta para `endereço`, que não existe mais |
| Variável de expressão | Expressão | a mensagem com que o editor recusa o texto ([O que a validação recusa](logic-expressions#what-validation-refuses)) |
| Ação | Script | a mensagem com que o editor recusa o texto ([O que a validação recusa](logic-actions#what-validation-refuses)) |
| Alarme | Condição | a mensagem com que o editor recusa o texto ([O que a validação recusa](logic-expressions#what-validation-refuses)) |

### Dashboards {#dashboards}

Tipo: o tipo do componente como o editor o nomeia (Medidor, Gráfico de linha, Valor…); nome: o nome digitado para o componente, ou a legenda dele, ou o que o editor deriva; local: o nome do dashboard. Uma linha por campo de endereço, então um componente cujo valor e cuja cor leem dois pontos removidos são dois reparos.

| Campo | Redação |
|---|---|
| Endereço, Ponto de cor, Série 2 › Endereço, e todo outro campo de endereço do tipo, cada um pelo rótulo que o painel de propriedades do editor lhe dá (uma lista aninhada se lê como o caminho dela) | aponta para `endereço`, que não existe mais |

Só campos de endereço são lidos, e só um valor que seja analisado como endereço com raiz e ao menos um segmento: um rótulo com "Process.Prensa 1.Temperatura" é texto, não referência, e nunca é informado. O mesmo endereço no mesmo campo é um achado. Telas definidas num modelo do Process são puladas: elas vinculam canais por um espaço reservado de unidade, e nenhum ponto responde aqueles endereços até uma unidade abrir a tela.

### Connector {#connector}

Uma linha da lista do servidor OPC UA, do mapa de registradores do servidor Modbus ou da lista de publicação de um broker MQTT guarda a origem dela (uma tag, uma variável, um alarme e, no servidor OPC UA, também um comando de um dispositivo) pela identidade: renomear nunca a quebra, e excluir deixa a linha de pé, nomeando o que ela perdeu. Uma linha assim é listada aqui, a mesma que a própria tabela dela mostra como ausente. Uma origem que a estação ainda tem e não oferece (uma tag desabilitada, uma tag de um dispositivo desabilitado, uma variável de um tipo que nenhum registrador carrega) não é listada: os próprios campos da linha dizem o que a deixa de fora. A linha guarda uma identidade que o operador nunca lê, então ela diz que tipo de origem sumiu em vez de mostrá-la.

| Tipo | Nome | Local | Campo | Redação |
|---|---|---|---|---|
| Nó servido | Tag ausente, Variável ausente, Alarme ausente ou Comando ausente | Servidor OPC UA | Origem | a tag servida foi removida. / a variável servida foi removida. / o alarme servido foi removido. / o comando servido foi removido. |
| Linha do mapa de registradores | o lugar da linha como o mapa o lê (a classe de registrador e o registrador dela) | Servidor Modbus | Origem | a tag servida foi removida. / a variável servida foi removida. / o alarme servido foi removido. |
| Tópico publicado | o tópico da linha | o nome do broker | Origem | a tag publicada foi removida. / a variável publicada foi removida. / o alarme publicado foi removido. |

A página não exclui nem muda nada, e cada servidor continua fazendo com a linha o que fazia: o servidor OPC UA não serve nada por ela, o servidor Modbus responde com a exceção 04 a um cliente que lê os registradores dela, e o broker guarda a última mensagem que reteve no tópico. O reparo é feito no cartão da linha: outra origem escolhida, ou a linha excluída.

## O que uma linha abre {#what-a-row-opens}

| Tipo | Abre | Onde ele cai |
|---|---|---|
| Componente | O dashboard em modo de edição (`/d/{dashboard}?edit=true&focus={component}`) | Com o componente selecionado e as propriedades dele à mostra, onde o endereço é redigitado. Editar precisa da permissão Editar dashboards; sem ela, o dashboard abre para visualização. |
| Vínculo de canal | O workspace do Process (`/process?focus={unit}&screen=channels`) | A tela Canais do modelo, com a linha daquela unidade escolhida e toda pasta acima dela expandida. |
| Intertravamento, Automação | O workspace do Process (`/process?focus={unit}&screen=automation`) | A tela Automação do modelo, com a linha daquela unidade escolhida. |
| Papelada de ação | O workspace do Process (`/process?focus={action}&screen=action`) | A página da própria ação, na coluna. |
| Procedimento | O workspace do Process (`/process?focus={procedure}&screen=procedure`) | A página do próprio procedimento, na coluna. |
| Ocorrência | O workspace do Process (`/process?focus={occurrence}&screen=occurrence`) | A página da própria ocorrência, na coluna. |
| Variável de expressão, Ação, Alarme | A página Logic (`/logic?focus={id}`) | A entidade selecionada no editor dela, com a seção dela do espaço de endereços expandida. |
| Nó servido, Linha do mapa de registradores, Tópico publicado | O Connector (`/connector?focus={row}`) | O servidor OPC UA, o servidor Modbus ou o broker selecionado na árvore, com a linha selecionada no cartão Nós servidos, Mapa de registradores ou Publicar dele e os campos dela abertos sob a tabela, onde outra origem é escolhida ou a linha excluída. |

Abrir leva você até a falha; a página de destino então aplica as permissões dela à edição (Gerenciar o Process nas telas do Process, Configurar a lógica na Logic, Configurar Connector no Connector). Uma entidade que não resolve mais quando a página chega (excluída nesse meio-tempo) é ignorada, e a página abre onde abriria normalmente.

## O distintivo do trilho {#the-rail-badge}

A entrada Validação no trilho veste uma pílula de cautela com o número de itens a reparar, "99+" acima de noventa e nove, e nenhuma pílula enquanto a configuração está limpa. A contagem é a do próprio validador, mantida atual em segundo plano pela mesma verificação que a página acompanha, então ela se mexe conforme você edita em qualquer página, sem esta página estar aberta. Abrir esta página e verificar de novo nela também atualizam a contagem, então a pílula nunca lê um número diferente do da lista.

## O que a página nunca faz {#what-the-page-never-does}

- Ela não repara nada: nenhum revínculo, nenhuma exclusão, nenhuma renomeação. Toda linha é um "abrir"; não há outra ação numa linha, e não há ação em lote.
- Ela nunca julga o runtime: um dispositivo que não está comunicando é a saúde da barra de status, não um achado daqui. Uma referência a uma tag que existe mas lê com qualidade ruim resolve.
- Ela nunca informa uma automação desabilitada, uma tela definida num modelo, texto livre que parece um endereço, uma variável de memória, ou uma segunda observação e as seguintes do mesmo comando de ação (a contagem diz quantas mais esperam naquela página).
- Ela nunca lê uma ocorrência que procedimento nenhum arma, e nunca lista a mesma ocorrência armada duas vezes por mais procedimentos que a armem: uma condição é um reparo.
- Ela nunca verifica enquanto o Connector está em transição; ela espera e mede uma vez.
- Ela é a mesma lista em toda tela, na janela da estação e num navegador do mesmo jeito, e a mesma para toda identidade que possa abri-la: a permissão libera a página, não as linhas dela.
- Enquanto o runtime está parado, a página dá lugar ao aviso de pausa como toda página; o distintivo mantém a última contagem dele.
- Ela nunca exclui uma linha de uma lista de servidor nem muda o que um servidor faz com ela, e nunca lista uma origem que a estação ainda tem mas não oferece (uma tag desabilitada, uma variável de um tipo que nenhum registrador carrega): isso o próprio cartão da linha diz.
