# Simulated

> Señales sintéticas dentro de la aplicación, para probar, capacitar y construir paneles de control sin hardware.

El driver Simulated produce señales sintéticas dentro de la aplicación, sin ningún
equipo y sin ninguna red de por medio. Es un driver de primera clase, no un atajo:
sus dispositivos se incorporan, se sondean y se guardan en caché por exactamente el
mismo camino del runtime que el hardware real, así que los trazados, los tipos de
dato, los indicadores de calidad y el comportamiento de escritura funcionan igual
que en campo. Úselo para probar el modelo del [Connector](connector), construir
paneles de control antes de que llegue el equipo, o preparar una demostración.

## El dispositivo {#device}

Un dispositivo simulado no tiene campos de conexión: solo su nombre y el
**Intervalo de sondeo (ms)** predeterminado (1000 al inicio). Su URI base es
`simulated://<dispositivo>`; el segmento del dispositivo es solo informativo, porque
todo el comportamiento vive en los tags.

## El descubrimiento {#discovery}

**Descubrir** no necesita ningún destino y lista el catálogo integrado: una
instancia lista para agregar de cada arquetipo, con sus tags. Desmarque los canales
que no quiera antes de agregarla.

| Modelo | Instancia | Canales |
| --- | --- | --- |
| Universal Controller | UC-01 | ProcessValue (senoidal), SetPoint (consigna escribible, 50 al inicio), Output (rampa), RunStatus (Run/Stop/Pause/Fault) |
| Electrical Power Meter | PM-01 | Voltage, Current, ActivePower y Frequency (paseos aleatorios alrededor de 230, 10, 2300 y 60, sondeados a 250 ms), PowerFactor (senoidal) |
| Production Counter | CNT-01 | Count (contador Int32), Rate (paseo aleatorio alrededor de 100), Running (booleano alterno) |
| Status Panel | STS-01 | State (Run/Stop/Pause/Fault), Alarm (booleano alterno), Uptime (contador Int64) |
| Type Showcase | SHOW-01 | Un canal por cada tipo integrado de OPC UA, quince en total, útil para ejercitar todas las formas de mostrar un valor |

Un dispositivo agregado desde el catálogo recupera desde su propia página un canal que usted quitó: **Descubrir tags**, en el encabezado de su tarjeta de tags, lista los canales de su modelo para los que todavía no tiene tag. Un dispositivo creado a mano no nombra ningún modelo y no muestra Descubrir tags (vea [Descubrir los tags de un dispositivo](connector-discovery#discovering-a-devices-tags)).

## Los tags {#tags}

Un tag simulado no tiene ninguna dirección que escribir: el nombre del tag es el
punto. Están disponibles todos los tipos de dato integrados de OPC UA, y los tres
modos de acceso. Lo que produce el tag se elige con **Tipo de señal** en la tarjeta
Fuente; el selector ofrece solo las formas compatibles con el tipo de dato del tag, y
cambiar el tipo de dato ajusta una forma incompatible a un valor razonable. A un tag
cuyo acceso permite escribir solo se le ofrecen las formas que aceptan una escritura,
Retención de consigna y Pulso, y cambiar el acceso ajusta la forma de la misma manera.

| Tipo de señal | Produce | Tipos compatibles | Escribible |
| --- | --- | --- | --- |
| **Senoidal** | Una onda suave con un rizado ligero, sembrada a partir del nombre del tag, así que dos tags con nombres distintos se mueven distinto y un reinicio reproduce la misma curva | numéricos | no |
| **Rampa** | Una onda triangular (sube y luego baja), de periodo entre 10 y 59 s sembrado a partir del nombre del tag | numéricos | no |
| **Paseo aleatorio** | Ruido realista de un medidor: pasos desde el último valor con reversión a la media hacia el valor predeterminado (50 si no se puso ninguno), con un paso del 1 % del centro (mínimo 0.5) | numéricos | no |
| **Contador** | Un entero que crece de forma monótona: arranca en el valor predeterminado (0 si no se puso ninguno) y suma 1 por lectura, así que el ritmo sigue al intervalo de sondeo | numéricos | no |
| **Booleano alterno** | Un booleano que alterna cada segundo | Boolean | no |
| **Texto enumerado** | Un texto que recorre una lista fija de estados, un paso cada 3 s | String | no |
| **Reloj** | La hora actual, muestreada en cada lectura | DateTime | no |
| **GUID aleatorio** | Un Guid aleatorio nuevo por lectura | Guid | no |
| **Bytes aleatorios** | Una carga aleatoria de 8 bytes por lectura | ByteString | no |
| **Retención de consigna** | Mantiene un valor predeterminado hasta que se escriba; una escritura reemplaza lo que contestan todas las lecturas siguientes | cualquiera | sí |
| **Pulso** | Un punto momentáneo: descansa en una línea base, y una escritura mantiene el valor escrito durante un número declarado de segundos antes de caer solo | cualquiera | sí |

Un tag creado sin un tipo explícito recibe un valor predeterminado con vida: los tags
escribibles se vuelven **Retención de consigna** (para que las escrituras se queden),
y los de solo lectura reciben un generador adecuado a su tipo (numérico → Senoidal,
Boolean → Booleano alterno, String → Texto enumerado, DateTime → Reloj, Guid → GUID
aleatorio, ByteString → Bytes aleatorios). **Pulso** nunca es el predeterminado:
un punto que devuelve un valor escrito y después lo abandona es una decisión
deliberada.
La excepción es un tag de solo lectura cuya dirección declara un valor `default` (por ejemplo `?default=true`): también se vuelve **Retención de consigna** y responde ese valor, porque un generador lo ignoraría.

### Los parámetros del panel {#parameters-in-the-panel}

Dos parámetros se editan directamente en la tarjeta Fuente:

| Campo | Se muestra en | Significado |
| --- | --- | --- |
| **Valor predeterminado** | Paseo aleatorio, Contador, Retención de consigna | El centro del paseo, el valor inicial del contador, o la respuesta de la consigna hasta que se escriba algo. La entrada coincide con el tipo del tag (casilla para Boolean, selector de fecha para DateTime, texto en los demás casos). |
| **Estados** | Texto enumerado | La lista separada por punto y coma que se recorre, por ejemplo `Run;Stop;Pause`. Una lista en blanco o sin miembros cae en `Run;Stop;Pause`. |

### Los parámetros avanzados de la señal {#advanced-signal-parameters}

Los demás parámetros de forma viajan como argumentos de consulta en la dirección
guardada del tag (por ejemplo `ProcessValue?min=20&max=80&period=30`). El panel no
los edita, pero los conserva a lo largo de cada edición; los ejemplos sembrados los
usan, y un agente los puede poner con las herramientas de tag de la superficie de
[acceso de agente](agent).

| Argumento | Se aplica a | Significado | Cuando falta |
| --- | --- | --- | --- |
| `min`, `max` | Senoidal | La banda por la que corre la onda; la salida se recorta a ella | Una banda sembrada a partir del nombre del tag (amplitud de 10 a 49 alrededor de un desplazamiento de 20 a 49), sin recortar |
| `period` | Senoidal | El periodo de la onda en segundos | Una frecuencia sembrada a partir del nombre del tag (de 0.05 a 0.24 Hz) |
| `phase` | Senoidal | El desfase en grados | Sembrado a partir del nombre del tag |
| `default` | Paseo aleatorio, Contador, Retención de consigna | El mismo valor que edita el campo Valor predeterminado del panel | 50 / 0 / el predeterminado del tipo |
| `values` | Texto enumerado | La misma lista que edita el campo Estados del panel | `Run;Stop;Pause` |
| `baseline` | Pulso | El valor en el que descansa el punto entre episodios, interpretado como el tipo del tag | El valor cero del tipo (la hora actual para DateTime, vacío para String) |
| `hold` | Pulso | Cuántos segundos dura un episodio escrito | 10 s |
| `warmup` | cualquiera | Segundos después de conectar antes de que conteste la primera lectura, como un instrumento que necesita estabilizarse; el lazo de sondeo absorbe la espera | ninguno |
| `outage` | cualquiera | Segundos al final de cada ciclo durante los que el punto falla sus lecturas, como un dispositivo que deja de contestar; las otras etiquetas del dispositivo siguen contestando y las escrituras siguen llegando | ninguno |
| `outageEvery` | cualquiera | Cuántos segundos dura un ciclo de corte, contados desde la conexión: el punto contesta al principio de cada ciclo y falla en sus últimos `outage` segundos, y un corte tan largo como su ciclo lo deja fallando | 60 s |

Un `outage` muestra qué hace una etiqueta cuando su dispositivo no contesta, sin ningún equipo de por medio: `?outage=5&outageEvery=30` contesta durante 25 s, falla sus lecturas durante 5 s y vuelve a empezar. La etiqueta aplica la política que eligió, como describe [El dispositivo no respondió](connector-value-pipeline#the-device-did-not-answer), y la lectura fallida nombra el corte declarado como su causa.

## Las escrituras {#writes}

- **Retención de consigna** acepta escrituras y contesta con el valor escrito de ahí
  en adelante. El valor retenido vive en memoria mientras el dispositivo siga
  conectado; no se guarda en la configuración, así que desactivar el dispositivo o
  reiniciar la aplicación devuelve el punto a su valor predeterminado.
- **Pulso** toma una escritura como un episodio: contesta con el valor escrito hasta
  que se agota la retención, y luego cae a su línea base. Una segunda escritura
  durante un episodio lo reemplaza entero, así que mantener presionado un botón
  reinicia la retención en lugar de apilar dos.
- Todos los demás tipos rechazan las escrituras; un intento de escritura se registra
  una vez por tag en lugar de inundar el diario técnico en cada sondeo.

Como con cualquier driver, el campo de escritura toma el valor de ingeniería y la
[cadena de conversión](connector-value-pipeline) se deshace antes de que el valor bruto llegue a la señal.

## Límites que conviene conocer {#limits-worth-knowing}

- Los valores se sintetizan por corrida de la aplicación. Las formas deterministas
  (Senoidal, Rampa, Reloj) reproducen la misma curva después de un reinicio; las que
  llevan estado (Contador, Paseo aleatorio, Retención de consigna, Pulso) empiezan de
  cero.
- Emparejar un tipo de señal con un tipo de dato incompatible (posible solo con
  configuración programática; el panel restringe el selector) hace que el tag falle
  en todas las lecturas, con una advertencia registrada una sola vez.
