# Occurrences

> Des conditions surveillées sur l'objet en essai, écrites comme une expression JavaScript sur les voies du modèle et jugées pendant un essai ou toujours.

Une **occurrence** enregistre que l'objet en essai a fait quelque chose de notable. Là où une alarme
surveille l'usine et les équipements, une occurrence appartient à la procédure : ses fronts restent
avec l'essai qui les a observés et entrent aussi dans la chronologie persistante des Occurrences de
la page Événements. Sa condition est une expression JavaScript sur les voies du modèle, avec un
anti-rebond sur les deux fronts et conditionnée par la qualité de ce qu'elle lit. Les occurrences
vivent sous Process > Modèles > modèle > Réglage > **Occurrences** et demandent la permission
**Modifier recettes et évaluations**.

## Le dossier Occurrences {#the-occurrences-folder}

Sélectionner la ligne **Occurrences** ouvre la page du dossier (« Les conditions surveillées sur
l'objet en essai. Chaque front reste avec son essai quand cela s'applique et entre aussi dans
l'historique persistant des occurrences. ») avec une carte par occurrence, par nom; cliquer sur une
carte l'ouvre et le X la retire. Sans aucune, la page indique « Aucune occurrence pour l'instant.
Ajoutez-en une. »

| Commande | Ce qu'elle fait | Grisée quand (situation) | Non dessinée quand (rôle) |
| --- | --- | --- | --- |
| **Nouvelle occurrence** (barre de détail, dossier sélectionné; clic droit **Ajouter une occurrence**) | Ajoute `Occurrence surveillée <n>` : gravité Avertissement, armée pendant une procédure, activée, aucun message, une condition vide. La ligne rejoint son groupe, mise en évidence et amenée dans la zone visible; sa carte l'ouvre. | Une unité détient un essai, ou le runtime est arrêté. | Sans Modifier recettes et évaluations. |

## La page de l'occurrence {#the-occurrences-page}

L'en-tête porte le nom, une pastille avec la gravité (dans la couleur propre à cette gravité) et une
pastille **Désactivée** quand l'occurrence est éteinte. Deux sortes d'avis peuvent se tenir en
dessous :

- Une note de prudence quand la condition enregistrée ne se valide pas (le brouillon est tout de même
  enregistré; la note dit ce qui ne va pas, voir plus bas).
- Un bandeau **Évaluation indisponible** par unité sur laquelle la condition en direct n'a pas pu
  être évaluée, sous la forme « `<unité>` : `<erreur>` ». Le diagnostic d'une unité est écrit une fois
  par erreur inchangée et effacé quand l'évaluation réussit de nouveau.

### Identité et comportement {#identity--behavior}

| Champ | Ce que c'est | Valeurs / défaut | Effet |
| --- | --- | --- | --- |
| **Nom** | Le nom de l'occurrence : la ligne de l'arbre, le libellé de l'événement dans le fichier d'essai, la chronologie des Événements et les rapports. | Texte libre; `Occurrence surveillée <n>` à la création. | Renomme la ligne et ce que la liste d'une procédure appelle ainsi. |
| **Gravité** | Le poids d'une activation. Le sélecteur montre chaque option dans l'encre que portera sa pastille. | **Information**, **Avertissement** (par défaut), **Critique**. | Colore la pastille et l'épisode partout où il est listé. Pendant un essai, l'activation d'une occurrence Avertissement ou Critique demande en plus une notification du système d'exploitation tant que l'application est masquée ou réduite; Information reste dans la fenêtre. |
| **Armée** | Quand la condition est jugée. | **Pendant une procédure** (par défaut) : seulement pendant qu'un essai d'une procédure qui l'arme est actif, sur les lignes enregistrées. **Toujours** : aussi hors essai, par un surveillant d'arrière-plan qui lit les liaisons de l'unité en direct. | Une occurrence Toujours n'a besoin d'aucune procédure pour l'armer; une occurrence Pendant une procédure n'est jugée que par les procédures qui la cochent. |
| **Retard à la montée (ms)** | Combien de temps la condition doit rester vraie avant qu'**Activée** soit confirmée, à la résolution des échantillons. | Un nombre de millisecondes; 0 par défaut. Le champ n'accepte pas de nombre négatif : la saisie est refusée, la note sous le champ le dit, et la valeur précédente revient. | Applique l'anti-rebond au front montant. |
| **Retard à la retombée (ms)** | Combien de temps la condition doit rester fausse avant que **Levée** soit confirmée. | Idem; 0 par défaut. | Applique l'anti-rebond au front descendant. |
| **Activée** | Si l'occurrence s'arme du tout. | Activée par défaut. | Une occurrence désactivée ne s'arme jamais, ni dans un essai ni hors essai, et ne bloque jamais le démarrage. |
| **Texte** | Le texte enregistré et annoncé avec une activation. | Texte libre; vide par défaut. | Voyage avec chaque front dans le fichier d'essai et dans le journal. |

### Condition surveillée {#condition}

« Une seule expression JavaScript renvoyant un booléen. » La carte porte un éditeur de code, la liste
des références que vous pouvez employer (« Références de voies disponibles : Channels.Ch_1,
Channels.Outlet_temperature, … ») et le rappel « Pendant un essai, la condition lit les colonnes
enregistrées du datalog; le surveillant Toujours lit les liaisons de l'unité en direct. La syntaxe,
les références manquantes et les échecs d'évaluation à l'exécution sont indiqués ici sans être
traités comme un faux ni comme une perte de signal. »

Une voie se référence sous la forme `Channels.<identifiant>`, où l'identifiant est le nom de la voie
assaini : les lettres et les chiffres survivent, tout autre caractère devient `_`, et un nom qui
commence par un chiffre reçoit un `_` devant. `Channels` ne contient que les voies du modèle et rien
d'autre, donc une voie nommée `Math`, `isNaN` ou `true` reste un nom de voie valide et ne cache aucun
global JavaScript. Un `NaN` présent et de bonne qualité est une donnée que vous pouvez tester avec
`isNaN(Channels.Pv)`. Exemples : `Channels.Outlet_temperature > 80`,
`Channels.Door_open && Channels.Heater_on`.

Le brouillon est validé à mesure que vous tapez, contre des valeurs d'exemple du type de chaque voie,
et la note de prudence sous l'en-tête dit ce qui échoue :

| Note | Sens |
| --- | --- |
| « Erreur de syntaxe : … » | L'expression ne s'analyse pas. |
| « La référence de voie « Channels.X » n'existe pas dans ce modèle. » | Une référence ne nomme aucune voie. |
| « Plus d'une voie correspond à « Channels.X ». » | Deux noms de voies s'assainissent en un même identifiant; renommez-en un dans le tableau Voies. |
| « La condition doit renvoyer un booléen, mais a renvoyé `<type>`. » | L'expression donne autre chose que vrai ou faux. |
| « Erreur d'évaluation : … » | L'expression lève une exception. |

Une condition non valide est tout de même enregistrée comme brouillon. Elle a des conséquences
ailleurs : une occurrence activée qui échoue à la validation et qu'une procédure arme (cochée dessus,
ou armée Toujours) bloque le démarrage de cette procédure, et la page de la procédure indique
« L'occurrence surveillée « *nom* » n'est pas valide : … »; une occurrence Toujours non valide ne démarre pas
son surveillant hors essai et laisse ici un diagnostic visible au lieu de le répéter à chaque
scrutation.

Chaque évaluation s'exécute dans un moteur contraint (une limite de 500 ms, un nombre d'instructions
borné et une mémoire bornée), donc une expression emballée fait échouer son évaluation plutôt que la
station.

## Comment une occurrence est jugée {#how-an-occurrence-is-judged}

Pendant un essai, la condition est jugée sur les lignes que le datalog enregistre, donc une voie que
le datalog de la procédure n'enregistre pas lui est indisponible. Une procédure qui arme une
occurrence sur une telle voie, ou qui en arme une et n'enregistre rien du tout, est refusée sur sa
propre page et au démarrage : l'occurrence ne jugerait jamais, et la note de prudence la nomme. Hors
essai, une occurrence Toujours est jugée par un surveillant qui lit les liaisons de l'unité en
direct. L'un comme l'autre juge conserve le dernier état confirmé tant qu'une voie référencée est
indisponible : seules une valeur manquante ou une mauvaise qualité suspendent le jugement, et une
valeur présente et de bonne qualité (un `NaN` compris) est une donnée évaluable. Le juge enregistre
quatre transitions : **Activée** (après le retard à l'activation), **Levée** (après le retard à la
levée), **Indisponible** (une voie référencée a perdu son signal) et **Rétablie** (chaque voie
référencée est revenue; la condition est jugée de nouveau et le retard applicable repart).

Pendant un essai, chaque transition est d'abord écrite dans le fichier d'essai puis copiée, avec son
contexte d'essai, dans le journal durable de la page [Événements](events-occurrences); hors essai, le
surveillant écrit dans le seul journal. Démarrer un essai abandonne le juge hors essai de l'unité, et
quitter l'essai en crée un neuf, donc aucune activation ne traverse une limite non observée. Les
modifications du nom, du message ou de la gravité ne touchent que les fronts ultérieurs; les
modifications de la condition, des retards, du mode d'armement ou de l'état d'activation démarrent
une observation neuve.

Les épisodes (de l'activation à la levée, avec tout intervalle de perte de signal compté à part) sont
dérivés de ces fronts partout où l'application les montre : la carte Occurrences d'un volet, la page
Événements, les historiques et les rapports. Le temps actif d'un épisode est exactement l'intervalle
entre les deux fronts conservés, donc il exclut le retard à l'activation et inclut le retard à la
levée : l'horloge démarre quand la condition s'est déjà maintenue pendant le retard à l'activation,
et elle ne s'arrête que quand la levée est écrite, après que le retard à la levée s'est écoulé. C'est
le nombre qu'un rapport remet à un tiers.

## Où une occurrence est employée {#where-an-occurrence-is-used}

La page d'une procédure porte la carte **Occurrences armées pendant cette procédure**, avec une
pastille « `<n>` armées » et une case à cocher par occurrence du modèle, par nom. En cocher une
l'arme pendant les essais de cette procédure; une occurrence armée **Toujours** surveille de toute
façon et n'a besoin d'aucune coche. Sans aucune occurrence dans le modèle, la carte indique « Aucune
occurrence dans ce modèle pour l'instant. Ajoutez-en sous les Occurrences du modèle. » Voir
[Procédures](process-procedures).

Renommer une voie réécrit les références `Channels.<identifiant>` de cette voie dans chaque condition
du modèle; cela ne touche ni les chaînes de caractères, ni les commentaires, ni une propriété du même
nom sur un autre objet.

## Retirer l'occurrence {#remove-occurrence}

**Retirer l'occurrence** se tient dans le groupe de danger de la barre de détail avec l'occurrence
sélectionnée, sur son menu contextuel, et sous forme de X sur la carte de la page du dossier. Elle
demande d'abord (« Supprimer l'occurrence », « Ceci retire l'occurrence du modèle. ») et désarme
l'occurrence de chaque procédure qui l'avait cochée. Elle demande Modifier recettes et évaluations et
est grisée sous le verrou d'ingénierie et sous le runtime arrêté.

## Ce qu'une occurrence ne fait pas {#what-an-occurrence-does-not-do}

- Ce n'est pas une alarme : elle ne s'acquitte pas, elle n'a pas de priorité et elle ne surveille pas
  de tags. Les alarmes de l'usine sont sur la page [Logic](logic-alarms).
- Elle ne déclenche rien. Une activation est enregistrée et annoncée; aucune action, aucune étiquette
  et aucun rapport n'y sont attachés.
- Elle ne peut rien lire d'autre que les voies du modèle : aucun tag, aucune variable, aucun autre
  modèle.
- Elle n'est pas jugée différemment par unité : une seule condition sert toutes les unités, sur les
  liaisons ou les lignes enregistrées propres à chacune.
