# Simulated

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

Le pilote Simulated produit des signaux synthétiques à l'intérieur de l'application, sans
aucun équipement et sans aucun réseau. C'est un pilote de plein droit, pas un raccourci : ses
équipements sont mis en service, scrutés et mis en cache par exactement le même chemin
d'exécution que du vrai matériel, 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), bâtir des tableaux de bord avant l'arrivée de
l'équipement, ou préparer une démonstration.

## Équipement {#device}

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

## Découverte {#discovery}

**Découvrir** ne demande 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 (sinusoïde), 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 (sinusoïde) |
| Production Counter | CNT-01 | Count (compteur Int32), Rate (marche aléatoire autour de 100), Running (booléen qui bascule) |
| Status Panel | STS-01 | State (Run/Stop/Pause/Fault), Alarm (booléen qui bascule), Uptime (compteur Int64) |
| Type Showcase | SHOW-01 | Une voie par type natif d'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 aucune adresse à taper : le nom du tag est le point. Chaque type de donnée
natif d'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 n'offre que les formes
compatibles avec le type de donnée du tag, et changer le type de donnée ramène une forme
incompatible vers une valeur par défaut raisonnable. Un tag dont l'accès permet l'écriture
ne reçoit que les natures qui acceptent une écriture, Maintien de consigne et Impulsion, et
changer l'accès ramène la nature de la même façon.

| Nature du signal | Produit | Types compatibles | Inscriptible |
| --- | --- | --- | --- |
| **Sinus** | Une onde régulière avec une légère ondulation, amorcée à partir du nom du tag, si bien que des tags nommés différemment 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 à partir du nom du tag | numériques | non |
| **Marche aléatoire** | Un bruit de compteur réaliste : des pas depuis la dernière valeur avec un rappel vers la valeur par défaut (50 quand elle n'est pas posée), un pas valant 1 % du centre (au moins 0,5) | numériques | non |
| **Compteur** | Un entier qui croît continûment : il part de la valeur par défaut (0 quand elle n'est pas posée) et ajoute 1 par lecture, si bien que la cadence suit l'intervalle de scrutation | numériques | non |
| **Booléen alterné** | Un booléen qui alterne chaque seconde | booléen | non |
| **Texte énuméré** | Un texte qui parcourt une liste fixe d'états, un cran toutes les 3 s | texte | 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** | Conserve 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 base, et une écriture conserve la valeur écrite pendant un nombre de secondes annoncé avant de retomber d'elle-même | tous | oui |

Un tag créé sans nature 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, booléen → Booléen alterné, texte →
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 la 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 dans le volet {#parameters-in-the-panel}

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

| Champ | Montré 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. La saisie suit le type du tag (case pour un booléen, 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`. |

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

Les autres paramètres de forme voyagent comme arguments de requête dans l'adresse enregistré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 semés les emploient, et un agent peut
les poser 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 ramenée | Une bande amorcée à partir du nom du tag (amplitude de 10 à 49 autour d'un décalage de 20 à 49), sans bornage |
| `period` | Sinus | La période de l'onde, en secondes | Une fréquence amorcée à partir du nom du tag (de 0,05 à 0,24 Hz) |
| `phase` | Sinus | Le déphasage, en degrés | Amorcé à partir du nom du tag |
| `default` | Marche aléatoire, Compteur, Maintien de consigne | La même valeur que 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 le champ États du volet | `Run;Stop;Pause` |
| `baseline` | Impulsion | La valeur sur laquelle le point repose entre deux épisodes, interprétée comme le type du tag | La valeur zéro du type (l'heure courante pour DateTime, vide pour un texte) |
| `hold` | Impulsion | Combien de secondes dure un épisode écrit | 10 s |
| `warmup` | tous | Les secondes qui suivent 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é à partir de 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 conservée vit en mémoire aussi longtemps que l'équipement reste connecté; elle
  n'est pas enregistré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 pour un épisode : il répond avec la valeur écrite jusqu'à la fin
  du maintien, puis retombe sur sa valeur de base. Une deuxième écriture pendant un épisode le
  remplace en entier, si bien que maintenir un bouton enfoncé relance le maintien au lieu d'en
  empiler deux.
- Toute autre nature refuse 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 bonnes à 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 une nature de signal à un type de donnée incompatible (possible seulement par une
  configuration programmatique; le volet contraint le sélecteur) fait échouer chaque lecture du
  tag, avec un avertissement journalisé une seule fois.
