# O espaço de endereços

> As sete raízes reservadas sob as quais todo ponto vive, como um endereço é escrito e higienizado, onde um ponto termina e um membro começa, o que a caixa de filtro reduz, e as três maneiras de digitar um endereço num editor.

Todo ponto que uma expressão, um script, um vínculo de dashboard ou uma ferramenta de agente pode nomear vive sob uma de sete raízes reservadas. Os seus próprios nomes sempre vivem sob uma raiz, então eles nunca colidem com as raízes em si. A coluna da página Logic desenha as mesmas raízes, separadas sob duas legendas, e o que a árvore mostra é exatamente o que você digita: o endereço de uma linha é o texto que uma expressão usa.

## As sete raízes {#the-seven-roots}

| Raiz | O que contém | Legenda na coluna | Editada |
| --- | --- | --- | --- |
| `System` | Quatro diagnósticos que a aplicação publica sobre si mesma | De outras páginas | Em lugar nenhum |
| `Server` | Quatro diagnósticos do servidor OPC UA embutido | De outras páginas | No [Connector](connector-opcua-server) |
| `Connector` | A árvore ao vivo de driver, pasta, dispositivo e tag | De outras páginas | Na página [Connector](connector) |
| `Variables` | As variáveis que você define aqui, nas pastas delas | Definidos aqui | Aqui |
| `Alarms` | O estado ao vivo dos alarmes que você define aqui, nas pastas deles | Definidos aqui | Aqui (o estado em si é somente leitura) |
| `Process` | As unidades de cada modelo: canais, estado da execução, produtividade, comandos, preparação | De outras páginas | Na página [Process](process) |
| `Assets` | As Imagens, os Ícones e as Cores da biblioteca, endereçáveis por nome | Definidos aqui, como a raiz Assets | Nos painéis de [Recursos](logic-assets) |

Actions e Triggers são seções da coluna, mas não raízes do espaço de endereços: eles são referenciados por identidade, não por endereço, e não carregam valor ao vivo. A raiz `Assets` existe para as expressões e para o seletor do Procurar…; na coluna, o lugar dela é ocupado pela raiz Assets da biblioteca, então a árvore nunca mostra duas raízes com esse nome. Os pontos fixos de `System` e `Server`, e o formato dos galhos `Connector` e `Process`, estão listados em [De outras páginas](logic-from-other-pages).

## Como um endereço é escrito {#how-an-address-is-spelled}

Um endereço é uma sequência de segmentos separados por ponto, enraizada numa raiz reservada: `Connector.Simulated.Air.CompressedAir.HeaderPressure`, `Variables.Forno.Setpoint`, `Alarms.HighLevel`, `System.Now`, `Assets.Colors.Red`. Nomes de exibição continuam texto livre; o endereço usa o segmento higienizado de cada nome: todo caractere que não é letra nem dígito vira `_`, e um nome que começa com dígito ganha um `_` na frente (`Forno de teste` responde por `Forno_de_teste`, `3rd zone` por `_3rd_zone`, e um nome vazio por `_`). Segmentos são sempre identificadores, então a forma com ponto sempre funciona; um segmento também pode ser escrito na forma com colchetes e um literal de texto, `Variables["Setpoint"]`, e o avaliador o lê como o mesmo endereço.

Onde o ponto termina e o acesso a membro começa depende da raiz. Endereços de `Connector` carregam os níveis de pasta do dispositivo entre o driver e o dispositivo (uma linha serial ou um broker MQTT não acrescenta nível), e `Variables` e `Alarms` carregam até três níveis de pasta antes do nome, então, sob essas raízes, o ponto é o prefixo mais longo que resolve, e o que vem depois dele é um membro (`.Value`, `.State()`). `Assets` está sempre dois segmentos abaixo da raiz; `Process` está a quatro num ponto comum, a seis num ponto de resumo de produtividade e a sete num ponto de saída de produtividade ou de procedimento. Uma cadeia mais curta do que a raiz dela permite é recusada como endereço incompleto.

Endereços em expressões e scripts precisam ser estáticos: cada segmento é um identificador ou um literal de texto, nunca um valor calculado. `Variables[someName]` é recusado na validação com "Os endereços precisam ser estáticos".

## Colisões de endereço {#address-collisions}

Um nível de uma seção é um espaço de nomes de segmento compartilhado pelas pastas e pelas definições arquivadas ali. Duas variáveis chamadas `Setpoint` em pastas diferentes são aceitas; uma variável e uma pasta que higienizam as duas para `Forno` no mesmo nível não são, e `Pump 1` e `Pump_1` lado a lado também não. Os editores recusam um nome assim enquanto você digita, nomeando o que já responde pelo endereço: "'Pump 1' já responde a 'Variables.Pump_1'. Nomes arquivados em uma mesma pasta precisam virar segmentos distintos." Os recursos seguem a mesma regra dentro de cada categoria: duas imagens, dois ícones ou duas cores suas não podem compartilhar um segmento, e um ícone ou uma cor de usuário cujo segmento coincide com uma entrada de sistema a sobrepõe no endereço.

## Digitar um endereço {#entering-an-address}

Três maneiras de digitar um endereço numa [expressão](logic-expressions), numa condição ou num script:

- **Digitar.** O editor completa símbolos de endereço: nomes de raiz num símbolo isolado (`Con` oferece `Connector`), depois os filhos do caminho digitado até ali, casados por prefixo sem diferenciar maiúsculas de minúsculas, e os membros legíveis de um ponto assim que o símbolo nomeia um ponto. Cada candidato substitui o símbolo inteiro.
- **Procurar…** abre um seletor sobre a árvore, até o nível de membro, de toda raiz, incluída a raiz `Assets`. Selecione uma linha e pressione **Inserir**, ou clique duas vezes nela, para colocar o endereço dela no cursor. O rodapé mostra o texto que a linha selecionada insere, ou "Clique duas vezes (ou Inserir) para adicionar ao editor." enquanto nada está selecionado.
- **Copiar de um ponto.** Selecionar qualquer ponto na coluna abre o [painel do ponto](logic-from-other-pages#the-point-panel), cujo campo Endereço é texto somente leitura que você pode selecionar e copiar, ao lado do valor ao vivo, da qualidade e do carimbo de tempo dele. Um editor de variável ou de alarme ecoa o próprio endereço sob o campo Nome.

Abaixo de um ponto, o seletor lista os membros legíveis dele (`Value`, `ValueToReal()`, `State()` e assim por diante). Um membro não é um endereço próprio: ele é o que você acrescenta ao endereço do ponto. [Expressões](logic-expressions#the-read-surface-of-a-point) lista essa mesma superfície, com o que cada membro devolve.

## A caixa de filtro {#the-filter-box}

A caixa **Filtrar…**, acima da coluna, reduz a árvore às linhas cujo nome contém o texto digitado, sem diferenciar maiúsculas de minúsculas. Um ponto sobrevive só quando ele casa; uma pasta sobrevive quando ela casa ou quando algum descendente casa, e se abre até os acertos dela. As seções Actions e Triggers listam só as linhas cujo nome casa (o nome delas mantém a seção listada, porém vazia); a raiz Assets se reduz às categorias cujo nome casa (digitar `Col` deixa Colors, o nome que a linha da árvore mostra) e vem inteira quando só o nome dela casa; uma raiz do espaço de endereços cujo próprio nome casa continua listada e carrega o galho dela quando expandida. Membros nunca fazem parte da vista filtrada, e o filtro pertence só à sua janela: outro navegador na mesma estação mantém o dele.

## O que o espaço de endereços não faz {#what-the-address-space-does-not-do}

Ele não publica nada de um dispositivo desabilitado, de um dispositivo cujas tags não estão materializadas no Connector, nem de um canal do Process sem vínculo (um canal assim é listado, mas não oferece membros). Os nomes não são traduzidos: o endereço é o nome de exibição higienizado, então renomear uma variável, um alarme, uma pasta, um dispositivo, uma tag ou uma imagem é uma mudança de endereço, que a aplicação reescreve em toda referência pela renomeação segura ([Variáveis](logic-variables#name-and-address), [Pastas de dispositivos](connector-folders)).
