# Simulated

> Sinais sintéticos gerados na própria aplicação, para testar, treinar e montar dashboards sem hardware.

O driver Simulated produz sinais sintéticos dentro da aplicação, sem nenhum
equipamento e sem nenhuma rede envolvida. Ele é um driver de primeira classe, não um
atalho: os dispositivos dele são integrados, lidos ciclicamente e cacheados pelo mesmo
caminho de runtime do hardware de verdade, então gráficos, tipos de dado, indicadores de
qualidade e comportamento de escrita funcionam como funcionariam em campo. Use-o para
experimentar o modelo do [Connector](connector), montar dashboards antes de o equipamento
chegar, ou preparar uma demonstração.

## Dispositivo {#device}

Um dispositivo simulado não tem campos de conexão: só o nome dele e o
**Intervalo de leitura (ms)** padrão (1000 por padrão). O Base URI dele é
`simulated://<device>`; o segmento do dispositivo é apenas informativo, porque todo
comportamento vive nas tags.

## Descoberta {#discovery}

O **Descobrir** não precisa de alvo e lista o catálogo embutido: uma instância pronta
para adicionar de cada arquétipo, tags incluídas. Desmarque os canais que você não
quiser antes de adicionar.

| Modelo | Instância | Canais |
| --- | --- | --- |
| Universal Controller | UC-01 | ProcessValue (senoide), SetPoint (setpoint gravável, padrão 50), Output (rampa), RunStatus (Run/Stop/Pause/Fault) |
| Electrical Power Meter | PM-01 | Voltage, Current, ActivePower e Frequency (caminhadas aleatórias em torno de 230, 10, 2300 e 60, lidas a cada 250 ms), PowerFactor (senoide) |
| Production Counter | CNT-01 | Count (contador Int32), Rate (caminhada aleatória em torno de 100), Running (booleano que alterna) |
| Status Panel | STS-01 | State (Run/Stop/Pause/Fault), Alarm (booleano que alterna), Uptime (contador Int64) |
| Type Showcase | SHOW-01 | Um canal por tipo embutido do OPC UA, quinze ao todo, úteis para exercitar toda exibição de valor |

Um dispositivo adicionado pelo catálogo recupera pela própria página um canal que você tirou: **Descobrir tags**, no cabeçalho do cartão **Tags** dele, lista os canais do modelo dele para os quais ele ainda não tem tag. Um dispositivo criado à mão não nomeia modelo nenhum e não mostra Descobrir tags (veja [Descobrir as tags de um dispositivo](connector-discovery#discovering-a-devices-tags)).

## Tags {#tags}

Uma tag simulada não tem endereço a digitar: o nome da tag é o ponto. Todo tipo de dado
embutido do OPC UA está disponível, e os três modos de acesso também. O que a tag produz
é escolhido no **Tipo de sinal**, no cartão Origem; o seletor oferece só as formas
compatíveis com o tipo de dado da tag, e mudar o tipo de dado ajusta uma forma
incompatível para um padrão sensato. Uma tag cujo acesso permite escrita recebe só as
formas que aceitam escrita, Setpoint mantido e Pulso, e mudar o acesso ajusta a forma
do mesmo jeito.

| Tipo de sinal | Produz | Tipos compatíveis | Gravável |
| --- | --- | --- | --- |
| **Senoide** | Uma onda suave com uma ondulação leve, semeada pelo nome da tag, então tags com nomes diferentes se movem de forma diferente e um reinício reproduz a mesma curva | numéricos | não |
| **Rampa** | Uma onda triangular (sobe e depois desce), período de 10 a 59 s semeado pelo nome da tag | numéricos | não |
| **Passeio aleatório** | Ruído realista de medidor: passos a partir do último valor com reversão à média em direção ao valor padrão (50 quando não definido), com passo de 1% do centro (no mínimo 0,5) | numéricos | não |
| **Contador** | Um inteiro que só cresce: começa no valor padrão (0 quando não definido) e soma 1 a cada leitura, então a taxa acompanha o intervalo de leitura | numéricos | não |
| **Booleano alternado** | Um booleano que alterna a cada segundo | Boolean | não |
| **Texto de enumeração** | Um texto que percorre uma lista fixa de estados, um passo a cada 3 s | String | não |
| **Relógio** | A hora atual, amostrada a cada leitura | DateTime | não |
| **GUID aleatório** | Um Guid aleatório novo a cada leitura | Guid | não |
| **Bytes aleatórios** | Um payload aleatório de 8 bytes a cada leitura | ByteString | não |
| **Setpoint mantido** | Mantém um valor padrão até ser escrito; uma escrita substitui o que toda leitura seguinte responde | qualquer um | sim |
| **Pulso** | Um ponto momentâneo: descansa numa linha de base, e uma escrita mantém o valor escrito por um número declarado de segundos antes de cair de volta sozinho | qualquer um | sim |

Uma tag criada sem tipo explícito recebe um padrão animado: tags graváveis viram
**Setpoint mantido** (para que as escritas fiquem), e tags somente leitura recebem um gerador
adequado ao tipo (numérico vira Senoide, Boolean vira Booleano alternado, String vira Texto de
enumeração, DateTime vira Relógio, Guid vira GUID aleatório, ByteString vira Bytes
aleatórios). O **Pulso** nunca
é padrão: um ponto que devolve um valor escrito e depois o abandona é uma escolha
deliberada.
A exceção é uma tag somente leitura cujo endereço declara um valor `default` (`?default=true`, por exemplo): ela também vira **Setpoint mantido** e responde esse valor, porque um gerador o ignoraria.

### Parâmetros no painel {#parameters-in-the-panel}

Dois parâmetros são editados diretamente no cartão Origem:

| Campo | Mostrado para | Significado |
| --- | --- | --- |
| **Valor padrão** | Passeio aleatório, Contador, Setpoint mantido | O centro da caminhada, o valor inicial do contador, ou a resposta do setpoint até algo ser escrito. A entrada acompanha o tipo da tag (caixa de seleção em booleano, seletor de data em DateTime, texto nos demais casos). |
| **Estados** | Texto de enumeração | Lista separada por ponto e vírgula a percorrer, por exemplo `Run;Stop;Pause`. Uma lista em branco ou sem membros recai em `Run;Stop;Pause`. |

### Parâmetros avançados do sinal {#advanced-signal-parameters}

Os demais parâmetros de forma viajam como argumentos de consulta no endereço guardado da
tag (por exemplo `ProcessValue?min=20&max=80&period=30`). O painel não os edita, mas os
preserva em toda edição; os exemplos semeados os usam, e um agente pode defini-los pelas
ferramentas de tag na superfície de [agente](agent).

| Argumento | Aplica-se a | Significado | Quando ausente |
| --- | --- | --- | --- |
| `min`, `max` | Senoide | A faixa em que a onda corre; a saída é aparada nela | Uma faixa semeada pelo nome da tag (amplitude de 10 a 49 em torno de um deslocamento de 20 a 49), sem aparo |
| `period` | Senoide | Período da onda em segundos | Uma frequência semeada pelo nome da tag (0,05 a 0,24 Hz) |
| `phase` | Senoide | Deslocamento de fase em graus | Semeado pelo nome da tag |
| `default` | Passeio aleatório, Contador, Setpoint mantido | O mesmo valor que o campo Valor padrão do painel edita | 50 / 0 / padrão do tipo |
| `values` | Texto de enumeração | A mesma lista que o campo Estados do painel edita | `Run;Stop;Pause` |
| `baseline` | Pulso | O valor em que o ponto descansa entre episódios, interpretado como o tipo da tag | O valor zero do tipo (a hora atual em DateTime, vazio em String) |
| `hold` | Pulso | Quantos segundos dura um episódio escrito | 10 s |
| `warmup` | qualquer um | Segundos depois de conectar antes de a primeira leitura responder, como um instrumento que precisa estabilizar; o laço de leitura absorve a espera | nenhum |
| `outage` | qualquer um | Segundos no fim de cada ciclo durante os quais o ponto falha suas leituras, como um dispositivo que para de responder; as outras tags do dispositivo continuam respondendo e as escritas continuam chegando | nenhum |
| `outageEvery` | qualquer um | Quantos segundos dura um ciclo de queda, contados a partir da conexão: o ponto responde no começo de cada ciclo e falha nos últimos `outage` segundos dele, e uma queda tão longa quanto o ciclo o deixa falhando | 60 s |

Um `outage` mostra o que uma tag faz quando o dispositivo dela não responde, sem equipamento nenhum: `?outage=5&outageEvery=30` responde por 25 s, falha as leituras por 5 s e recomeça. A tag aplica a política que escolheu, como descreve [O dispositivo não respondeu](connector-value-pipeline#the-device-did-not-answer), e a leitura que falhou nomeia a queda declarada como causa.

## Escritas {#writes}

- O **Setpoint mantido** aceita escritas e responde com o valor escrito dali em diante.
  O valor mantido vive em memória enquanto o dispositivo continuar conectado; ele não
  é guardado na configuração, então desabilitar o dispositivo ou reiniciar a aplicação
  devolve o ponto ao padrão dele.
- O **Pulso** recebe uma escrita como um episódio: ele responde com o valor escrito até
  a retenção acabar e então cai de volta na linha de base. Uma segunda escrita durante um
  episódio o substitui por inteiro, então segurar um botão reinicia a retenção em vez de
  empilhar duas.
- Todo outro tipo recusa escritas; uma escrita tentada é registrada uma vez por tag, em
  vez de inundar o log a cada leitura.

Como em qualquer driver, o campo de escrita recebe o valor de engenharia e a
[cadeia de valor](connector-value-pipeline) é revertida antes de o valor bruto chegar ao sinal.

## Limites que vale conhecer {#limits-worth-knowing}

- Os valores são sintetizados por execução. Formas determinísticas (Senoide, Rampa, Relógio)
  reproduzem a mesma curva depois de um reinício; as que guardam estado (Contador,
  Passeio aleatório, Setpoint mantido, Pulso) recomeçam.
- Combinar um tipo de sinal com um tipo de dado incompatível (possível só por
  configuração programática; o painel restringe o seletor) faz a tag falhar em
  toda leitura, com um aviso registrado uma vez.
