# Simulated

> Des signaux synthétiques internes à l'application, pour essayer, se former et construire des tableaux de bord sans matériel.

Le pilote Simulated produit des signaux synthétiques à l'intérieur de l'application, sans
matériel ni réseau. C'est un pilote à part entière, pas un raccourci : ses équipements
sont enrôlés, scrutés et mis en cache par exactement le même chemin d'exécution que du
matériel réel, si bien que les sous-graphiques, les types de donnée, les indicateurs de qualité et le
comportement en écriture fonctionnent comme sur le terrain. Employez-le pour essayer le modèle du
[Connector](connector), construire des tableaux de bord avant l'arrivée du matériel, ou préparer
une démonstration.

## Équipement {#device}

Un équipement simulé n'a aucun champ de connexion : seulement son nom et la
**Intervalle de scrutation (ms)** par défaut (1000 par défaut). Son URI de base est
`simulated://<équipement>` ; le segment d'équipement n'est qu'indicatif, parce que chaque
comportement vit sur les tags.

## Découverte {#discovery}

**Découvrir** n'a besoin d'aucune cible et liste le catalogue intégré : une instance prête à
ajouter de chaque archétype, tags compris. Décochez les voies dont vous ne voulez pas
avant d'ajouter.

| Modèle | Instance | Voies |
| --- | --- | --- |
| Universal Controller | UC-01 | ProcessValue (sinus), SetPoint (consigne inscriptible, 50 par défaut), Output (rampe), RunStatus (Run/Stop/Pause/Fault) |
| Electrical Power Meter | PM-01 | Voltage, Current, ActivePower et Frequency (marches aléatoires autour de 230, 10, 2300 et 60, scrutées à 250 ms), PowerFactor (sinus) |
| Production Counter | CNT-01 | Count (compteur Int32), Rate (marche aléatoire autour de 100), Running (booléen alterné) |
| Status Panel | STS-01 | State (Run/Stop/Pause/Fault), Alarm (booléen alterné), Uptime (compteur Int64) |
| Type Showcase | SHOW-01 | Une voie par type intégré OPC UA, quinze en tout, utile pour exercer chaque affichage de valeur |

Un équipement ajouté depuis le catalogue récupère depuis sa propre page une voie que vous avez retirée : **Découvrir les tags**, dans l'en-tête de sa carte **Tags**, liste les voies de son modèle pour lesquelles il n'a pas encore de tag. Un équipement créé à la main ne nomme aucun modèle et n'affiche pas Découvrir les tags (voir [Découvrir les tags d'un équipement](connector-discovery#discovering-a-devices-tags)).

## Tags {#tags}

Un tag simulé n'a pas d'adresse à taper : le nom du tag est le point. Chaque type de donnée
intégré OPC UA est disponible, ainsi que les trois modes d'accès. Ce que le tag produit
se choisit avec **Nature du signal** sur la carte Source de la valeur ; le sélecteur ne propose que les
formes compatibles avec le type de donnée du tag, et changer le type de donnée aligne une
forme incompatible vers une valeur par défaut sensée. Un tag dont l'accès autorise
l'écriture ne se voit proposer que les formes qui acceptent une écriture, Maintien de
consigne et Impulsion, et changer l'accès aligne la forme de la même manière.

| Type de signal | Produit | Types compatibles | Inscriptible |
| --- | --- | --- | --- |
| **Sinus** | Une onde lisse avec une légère ondulation, amorcée depuis le nom du tag, si bien que des tags aux noms différents bougent différemment et qu'un redémarrage reproduit la même courbe | numériques | non |
| **Rampe** | Une onde triangulaire (montée, puis descente), de période 10 à 59 s amorcée depuis le nom du tag | numériques | non |
| **Marche aléatoire** | Un bruit de capteur réaliste : des pas à partir de la dernière valeur avec un rappel vers la valeur par défaut (50 quand elle n'est pas réglée), d'un pas de 1 % du centre (0,5 au minimum) | numériques | non |
| **Compteur** | Un entier croissant : part de la valeur par défaut (0 quand elle n'est pas réglée) et ajoute 1 par lecture, si bien que la cadence suit la période de scrutation | numériques | non |
| **Booléen alterné** | Un booléen qui alterne chaque seconde | Boolean | non |
| **Texte énuméré** | Une chaîne qui parcourt une liste fixe d'états, d'un pas toutes les 3 s | String | non |
| **Horloge** | L'heure courante, échantillonnée à chaque lecture | DateTime | non |
| **GUID aléatoire** | Un nouveau Guid aléatoire par lecture | Guid | non |
| **Octets aléatoires** | Une charge utile aléatoire de 8 octets par lecture | ByteString | non |
| **Maintien de consigne** | Maintient une valeur par défaut jusqu'à une écriture ; une écriture remplace ce que répond chaque lecture suivante | tous | oui |
| **Impulsion** | Un point momentané : il repose sur une valeur de repos, et une écriture maintient la valeur écrite pendant un nombre de secondes annoncé avant de retomber d'elle-même | tous | oui |

Un tag créé sans type explicite reçoit une valeur par défaut vivante : les tags inscriptibles
deviennent **Maintien de consigne** (pour que les écritures tiennent), et les tags en lecture seule
reçoivent un générateur adapté au type (numérique → Sinus, Boolean → Booléen alterné, String →
Texte énuméré, DateTime → Horloge, Guid → GUID aléatoire, ByteString → Octets aléatoires).
**Impulsion** n'est jamais une valeur par défaut : un point qui rend une valeur écrite puis
l'abandonne est un choix délibéré.
L'exception est un tag en lecture seule dont l'adresse déclare une valeur `default` (par exemple `?default=true`) : il devient lui aussi **Maintien de consigne** et répond cette valeur, car un générateur l'ignorerait.

### Les paramètres du volet {#parameters-in-the-panel}

Deux paramètres se modifient directement sur la carte Source de la valeur :

| Champ | Affiché pour | Sens |
| --- | --- | --- |
| **Valeur par défaut** | Marche aléatoire, Compteur, Maintien de consigne | Le centre de la marche, la valeur de départ du compteur, ou la réponse de la consigne tant que rien n'est écrit. Le champ suit le type du tag (case pour Boolean, sélecteur de date pour DateTime, texte sinon). |
| **États** | Texte énuméré | La liste séparée par des points-virgules à parcourir, par exemple `Run;Stop;Pause`. Une liste vide ou sans membre retombe sur `Run;Stop;Pause`. |

### Les paramètres de signal avancés {#advanced-signal-parameters}

Les autres paramètres de forme voyagent en arguments de requête sur l'adresse conservée du
tag (par exemple `ProcessValue?min=20&max=80&period=30`). Le volet ne les modifie pas
mais les conserve à travers chaque modification ; les exemples amorcés les emploient, et
un agent peut les régler par les outils de tag de la surface [agent](agent).

| Argument | S'applique à | Sens | Quand il est absent |
| --- | --- | --- | --- |
| `min`, `max` | Sinus | La bande dans laquelle l'onde évolue ; la sortie y est écrêtée | Une bande amorcée depuis le nom du tag (amplitude de 10 à 49 autour d'un décalage de 20 à 49), sans écrêtage |
| `period` | Sinus | La période de l'onde en secondes | Une fréquence amorcée depuis le nom du tag (de 0,05 à 0,24 Hz) |
| `phase` | Sinus | Le décalage de phase en degrés | Amorcé depuis le nom du tag |
| `default` | Marche aléatoire, Compteur, Maintien de consigne | La même valeur que modifie le champ Valeur par défaut du volet | 50 / 0 / la valeur par défaut du type |
| `values` | Texte énuméré | La même liste que modifie le champ États du volet | `Run;Stop;Pause` |
| `baseline` | Impulsion | La valeur sur laquelle le point repose entre deux épisodes, interprétée selon le type du tag | La valeur zéro du type (l'heure courante pour DateTime, vide pour String) |
| `hold` | Impulsion | Combien de secondes dure un épisode écrit | 10 s |
| `warmup` | tous | Les secondes après la connexion avant que la première lecture ne réponde, comme un instrument qui doit se stabiliser ; la boucle de scrutation absorbe l'attente | aucune |
| `outage` | tous | Les secondes à la fin de chaque cycle pendant lesquelles le point échoue à ses lectures, comme un équipement qui cesse de répondre ; les autres tags de l'équipement continuent de répondre et les écritures arrivent toujours | aucune |
| `outageEvery` | tous | Combien de secondes dure un cycle de coupure, compté depuis la connexion : le point répond au début de chaque cycle et échoue pendant ses `outage` dernières secondes, et une coupure aussi longue que son cycle le laisse en échec | 60 s |

Un `outage` montre ce que fait un tag quand son équipement ne répond pas, sans aucun matériel : `?outage=5&outageEvery=30` répond pendant 25 s, échoue à ses lectures pendant 5 s, puis recommence. Le tag applique la politique qu'il a choisie, comme le décrit [L'équipement n'a pas répondu](connector-value-pipeline#the-device-did-not-answer), et la lecture en échec nomme la coupure déclarée comme sa cause.

## Écritures {#writes}

- **Maintien de consigne** accepte les écritures et répond ensuite avec la valeur écrite.
  La valeur maintenue vit en mémoire tant que l'équipement reste connecté ; elle n'est
  pas conservée dans la configuration, si bien que désactiver l'équipement ou redémarrer l'application
  ramène le point à sa valeur par défaut.
- **Impulsion** prend une écriture comme un épisode : elle répond avec la valeur écrite jusqu'à
  la fin du maintien, puis retombe sur sa valeur de repos. Une seconde écriture pendant un
  épisode le remplace entièrement, si bien que garder un bouton enfoncé relance le maintien au lieu
  d'en empiler deux.
- Tous les autres types refusent les écritures ; une écriture tentée est journalisée une fois par tag
  plutôt que d'inonder le journal à chaque scrutation.

Comme pour tout pilote, le champ d'écriture prend la valeur physique et la
[chaîne de conversion](connector-value-pipeline) est remontée avant que la valeur brute n'atteigne le signal.

## Des limites à connaître {#limits-worth-knowing}

- Les valeurs sont synthétisées par exécution. Les formes déterministes (Sinus, Rampe, Horloge)
  reproduisent la même courbe après un redémarrage ; celles qui portent un état (Compteur, Marche
  aléatoire, Maintien de consigne, Impulsion) repartent de zéro.
- Associer un type de signal à un type de donnée incompatible (possible seulement par
  configuration programmatique ; le volet contraint le sélecteur) fait échouer chaque lecture
  du tag, avec un avertissement journalisé une fois.
