# Recettes

> Les consignes qu'un essai écrit : un jeu instantané appliqué au démarrage, ou un profil temporel d'échelons, de rampes et de paliers, chacun avec le bloc de finalisation que tout essai qui se termine écrit.

Une **recette** écrit les voies inscriptibles du modèle. Une recette **instantanée** est un jeu de
consignes appliqué une fois au démarrage d'un essai ; une recette **temporelle** est un profil
ordonné de segments Échelon, Rampe et Palier pilotés sur l'horloge propre de l'essai. Les deux
peuvent se terminer par un bloc de **finalisation**, l'état sûr écrit chaque fois que l'essai se
termine. Chaque écriture emprunte l'unique [canal d'écriture](logic#writing-values) journalisé et est
enregistrée dans le fichier d'essai telle qu'exécutée. Les recettes vivent sous Process > Modèles >
modèle > Réglage > **Recettes** et exigent la permission **Modifier recettes et évaluations**.

## Le dossier Recettes {#the-recipes-folder}

Sélectionner la ligne **Recettes** ouvre la page du dossier (« Les valeurs de consigne qu'une
procédure applique au démarrage d'un essai, écrites par l'entonnoir unique et enregistrées telles
qu'exécutées. ») avec une carte par recette, par son nom ; cliquer sur une carte l'ouvre et le X la
retire. Sans aucune, la page indique « Aucune recette pour l'instant. Ajoutez-en une. »

| Commande | Ce qu'elle fait | Grisée quand (situation) | Non dessinée quand (rôle) |
| --- | --- | --- | --- |
| **Nouvelle recette** (barre de détail, dossier sélectionné ; clic droit **Ajouter une recette**) | Ajoute `Recette <n>` : Instantanée, En cas d'échec Suspendre, aucune consigne. La ligne rejoint son groupe, mise en évidence et amenée dans la zone visible ; sa carte l'ouvre. | Une unité quelconque tient un essai, ou le runtime est arrêté. | Sans Modifier recettes et évaluations. |

## La page de la recette {#the-recipes-page}

L'en-tête porte le nom, la ligne « Les valeurs de consigne qu'une procédure applique au démarrage
d'un essai, écrites par l'entonnoir unique et enregistrées telles qu'exécutées. » et un badge avec le
type. Chaque champ s'enregistre automatiquement, et chaque modification redessine l'aperçu du profil.

### Définition {#definition}

| Champ | Ce que c'est | Valeurs / défaut | Effet |
| --- | --- | --- | --- |
| **Nom** | Le nom de la recette dans l'arborescence, dans le sélecteur Recette d'une procédure et dans le sélecteur Appliquer une recette d'un volet. | Texte libre ; `Recette <n>` à la création. | Renomme la ligne. |
| **Nature** | La forme de la recette. | **Instantanée** (défaut) : un jeu de consignes appliqué une fois au démarrage. **Temporelle** : un profil ordonné Échelon / Rampe / Palier sur son horloge propre. | Bascule la page entre les deux formes ci-dessous. Les consignes et les segments déjà saisis sont gardés ; seule la forme que le type lit est dessinée. Le bloc gardé n'est ni appliqué ni réservé : un essai écrit et verrouille seulement ce qu'écrit le type en vigueur. Une procédure n'admet qu'une recette dont le type convient à son mode. |
| **En cas d'échec** (temporelle seulement) | Ce que le profil fait quand une écriture échoue ou qu'une valeur dont il a besoin est illisible. | **Suspendre** (défaut), **Poursuivre**, **Interrompre** ; voir le tableau sous la forme temporelle. | La règle de la recette ; chaque segment peut passer outre. |
| **Remarques** | Texte libre pour qui lit la recette. | Multiligne ; vide par défaut. | Rien d'autre. |

### Valeurs {#values}

Les consignes et les cibles sont saisies comme du texte et analysées vers le type de la voie au
moment où elles sont appliquées, dans la culture invariante :

| Type de voie | Littéraux acceptés |
| --- | --- |
| Booléen | `true`, `false`, `1`, `0` |
| Entier | Un nombre entier, `.` jamais employé comme séparateur |
| Décimal | Un nombre avec `.` comme séparateur décimal (`12.5`, `1e-3`) ; sur une station qui écrit les décimales avec une virgule, le champ accepte aussi `12,5` et le conserve en `12.5` |
| Texte | N'importe quel texte, tel que saisi |
| Date et heure | Une date et une heure aller-retour (`2026-09-02T14:30:00+00:00`) |

Un littéral qui ne convient pas au type de la voie n'est jamais écrit : l'écriture est enregistrée
comme échouée dans le fichier d'essai et traitée par la règle d'échec. Chaque grille de lignes de
voie de cette page ne propose à une ligne que les voies inscriptibles que les autres lignes de la
même grille n'ont pas prises, donc une voie est écrite une fois par jeu et une fois par segment ;
quand toutes les voies inscriptibles sont prises, le bouton qui ajoute une ligne est grisé avec
« Chaque voie accessible en écriture a déjà une consigne ici. » (ou « … a déjà une cible dans ce
segment. »), et sans aucune voie inscriptible avec « Ce modèle n'a encore aucune voie accessible en
écriture. »

## Une recette instantanée {#an-instant-recipe}

Deux cartes indépendantes, chacune surmontée d'un bouton **Consigne** qui ajoute une ligne sur la
première voie inscriptible libre avec la valeur `0` :

| Carte | Ce qu'elle écrit |
| --- | --- |
| **Consignes (appliquées au démarrage)** | Écrites une fois, au démarrage, avant que l'essai n'enregistre quoi que ce soit. |
| **Finalisation (état sûr)** | « Écrite chaque fois que l'essai se termine : fin normale, arrêt ou interruption. » |

Les deux grilles partagent les mêmes colonnes :

| Colonne | Ce que c'est | Valeurs |
| --- | --- | --- |
| **Voie** | La voie inscriptible écrite, sous la forme `Ch<number> · <name>`. | Les voies en Écriture seule et en Lecture et écriture pas encore prises dans cette grille. |
| **Valeur** | Le littéral écrit. | Voir Valeurs. |
| Action de ligne | **Retirer** demande « Supprimer la consigne » : le nom de la voie, « Ceci retire la consigne de la recette. » Cette action est irréversible. | |

## Une recette temporelle {#a-temporal-recipe}

La forme temporelle dessine d'abord le profil, puis les segments à côté de celui qui y est choisi,
puis le bloc de finalisation.

### Profil temporel {#temporal-profile}

Le graphique est la recette elle-même : une série par voie numérique que les segments ciblent,
étiquetée `<name> [<unit>]`, dessinée comme la courbe par morceaux que les segments construisent (un
Échelon saute puis maintient, une Rampe monte depuis la valeur qu'elle a reçue, un Palier ou un
segment sans cible maintient), sur le temps cumulé en secondes. Une cible posée sur une voie qui
n'est pas numérique n'est pas dessinée. Le graphique porte la barre d'outils de tout graphique et
peut s'ouvrir dans sa propre fenêtre (voir [Graphiques](view-charts)) ; la page de la procédure
dessine le même profil sous son étape Appliquer.

### Segments de recette {#segments}

La liste est titrée **Segments de recette** et son bouton **Segment de recette** ajoute un Échelon de
60000 ms sans cible et le choisit. Cliquer sur une ligne l'ouvre dans la colonne **Cibles du
segment** ; sans rien de choisi, la colonne indique « Sélectionnez un segment pour tout modifier au
même endroit, avec les cibles qu'il pilote. »

| Colonne | Ce que c'est | Valeurs / défaut |
| --- | --- | --- |
| **Nature** | La forme que le segment pose sur le profil ; chaque option porte cette forme à côté de son nom. | **Échelon** (défaut), **Rampe**, **Palier**. |
| **Durée (ms)** | Combien de temps la recette reste dans le segment avant de passer au suivant. | Un nombre de millisecondes ; 60000 à la création. Le champ n'accepte pas un nombre négatif : la saisie est refusée, la note sous le champ le dit, et la valeur précédente revient. |
| **Comptage du temps** | À partir de quand ce segment compte son propre temps : une fois que l'équipement a pris les consignes, ou dès l'instant où elles lui sont remises. | **Attendre qu'elles atteignent l'équipement** · **Envoyer et continuer**. Un Échelon naît en attente, une Rampe naît en envoi ; changer la **Nature** du segment remet la valeur de naissance de la nouvelle nature, et ce qui est choisi ensuite tient. Un Palier n'écrit rien, sa case est donc vide et il n'y a rien à choisir. |
| **En cas d'échec** | Si un échec ici suit la règle de la recette ou l'une des règles propres à ce segment. | **(recette)** (défaut : hériter), **Suspendre**, **Poursuivre**, **Interrompre**. |
| **Cibles** | Ce vers quoi le segment pilote, sur une seule ligne : `<channel> = <value>, …`. Un Palier ne pilote rien, donc la case se lit vide. | En lecture seule ; modifiée dans la colonne. |
| Action de ligne | **Retirer** demande « Supprimer le segment » : `Segment n° <n> · <Type>`, « Ceci retire le segment et ses cibles de la recette. » Cette action est irréversible. | |

| Type de segment | Ce qu'il fait |
| --- | --- |
| **Échelon** | Écrit ses cibles au début du segment, puis attend pendant la durée (un Échelon peut attendre 0 ms). |
| **Rampe** | Pilote chaque voie ciblée linéairement depuis sa dernière valeur commandée (ou sa valeur actuelle quand rien n'a encore été commandé) jusqu'à la cible, sur la durée. Une rampe conduit sa voie entre deux lectures, aussi son sélecteur de cible n'offre-t-il que les voies qui portent un nombre : une voie de texte ou de date et heure reste dans la liste sans être choisissable, en disant qu'un échelon l'écrit une seule fois. |
| **Palier** | Maintient les dernières valeurs commandées pendant la durée ; il n'écrit rien et ne porte aucune cible. |

La colonne, titrée `Segment n° <n> · <Type>`, reprend les mêmes champs avec une légende et l'effet de
la valeur en vigueur sous chacun :

| Champ | Légende | Effet |
| --- | --- | --- |
| **Nature** | La forme à côté de chaque option. | |
| **Durée (ms)** | « Combien de temps la recette reste dans ce segment avant de passer au suivant. » | « S'exécute pendant 1 min 30 s. » (« aucune durée » pour 0). |
| **Comptage du temps** | « Quand ce segment commence à compter son propre temps. » | « Le temps ne court qu'une fois les consignes arrivées à l'équipement ; un refus ou un délai dépassé déclenche la règle de défaillance. » ou « Envoie et compte le temps ; ce que répond l'équipement est seulement enregistré. » |
| **En cas d'échec** | « Si un échec ici est traité comme la recette le dit, ou d'une autre façon que ce seul segment demande. » | « Suit la recette : Suspendre. » ou « Ce segment passe outre la recette : Interrompre. » |

Le comptage du temps appartient au segment et à rien au-dessus de lui : il n'y a pas de champ à
l'échelle de la recette, parce qu'un profil dont les segments comptent différemment est un profil
légitime et qu'un interrupteur unique sur l'ensemble ne serait qu'un deuxième endroit où dire la même
chose. Ce n'est pas non plus un réglage de défaillance. Ce qu'il décide, c'est l'horloge ; ce que fait
un échec relève de la règle **En cas d'échec**, plus bas. Le champ n'est pas dessiné du tout sur un
Palier.

En dessous, **CIBLES** tient les cibles du segment, avec un bouton **Cible** dans l'en-tête de la
colonne qui ajoute une ligne sur la première voie inscriptible que le segment ne pilote pas encore, à
`0`. Sur un Palier, la grille est remplacée par la ligne « Un palier maintient les valeurs que le
profil a déjà atteintes, donc il ne pilote aucune cible propre. » et le bouton est grisé, en disant
« Un palier maintient les valeurs déjà atteintes. Changez le type pour piloter une cible ici. » ; les
cibles qu'un Palier garde d'un type antérieur restent enregistrées et sont ignorées par l'essai,
l'aperçu du profil et la feuille de route également :

| Colonne | Ce que c'est |
| --- | --- |
| **Voie** | La voie inscriptible pilotée, proposée seulement parmi les voies que les autres cibles de ce segment n'ont pas prises. |
| **Cible** | Le littéral écrit (Échelon) ou atteint (Rampe). |
| Action de ligne | **Retirer** demande « Supprimer la cible » : le nom de la voie, « Ceci retire la cible du segment. » Cette action est irréversible. |

### En cas d'échec {#on-failure}

La règle d'échec s'applique à une recette temporelle quand une écriture est refusée ou qu'une valeur
dont elle a besoin est illisible :

| Règle | Ce que fait l'essai |
| --- | --- |
| **Suspendre** | Fige le profil sur la dernière consigne et attend que l'opérateur reprenne ou interrompe. Le datalog continue d'enregistrer. |
| **Poursuivre** | Enregistre l'échec tel qu'exécuté et continue ; la voie en échec est sautée pour le reste du segment. |
| **Interrompre** | Écrit le bloc de finalisation et termine l'essai comme interrompu. |

La règle répond d'un échec que la recette **connaît**, et ce que la recette connaît dépend de si elle
est restée pour entendre la réponse. Un problème qu'elle voit avant tout envoi est une connaissance
dans les deux modes ; un refus ou un silence de l'équipement n'en est une que là où le segment l'a
attendu :

| Ce que la recette apprend, et quand | Attendre qu'elles atteignent l'équipement | Envoyer et continuer |
| --- | --- | --- |
| Avant l'envoi : la voie n'est pas liée, la valeur ne convient pas au type de la voie, le tag n'est pas dans le runtime, un autre essai retient le tag, l'équipement est déjà connu comme déconnecté | La règle s'applique. | La règle s'applique tout autant : la recette le savait avant de lâcher prise. |
| L'équipement refuse la valeur sur le câble | La règle s'applique. | Pas un échec ici : enregistré tel qu'exécuté avec le motif, et journalisé. |
| L'équipement ne répond pas à temps | La règle s'applique. | Pas un échec ici : enregistré. |
| Une consigne qu'une écriture plus récente sur la même cible a dépassée avant l'envoi | Pas un échec. | Pas un échec. |

Une consigne remplacée n'est jamais un échec, dans un mode comme dans l'autre : la valeur la plus
récente pour cette cible est celle que reçoit l'équipement, et c'est celle qui compte. Une rampe
fonctionne ainsi à dessein, chaque pas remplaçant celui d'avant qui n'a pas encore quitté la file de
l'équipement.

### Finalisation (état sûr) {#finalization-safe-state}

La même carte que sur une recette instantanée, « Écrite chaque fois que l'essai se termine : fin
normale, arrêt ou interruption. », avec son propre bouton **Consigne** et sa grille.

## Où une recette est employée {#where-a-recipe-is-used}

| Surface | Ce qu'elle fait de la recette |
| --- | --- |
| L'étape **Appliquer** d'une procédure | Le sélecteur propose chaque recette du modèle ; une recette dont le type ne convient pas au mode de la procédure est listée « `<name>` (non compatible) », désactivée, avec le motif en infobulle. Une procédure Instantanée ou Contrôlée prend une recette instantanée ou aucune ; une procédure Temporelle prend une recette temporelle ou aucune, et son profil doit tenir dans la fenêtre. La ligne de l'étape dit ce que le choix écrit : « Écrit 4 consignes au démarrage. », « Écrit 4 consignes au démarrage et 2 consignes à la sortie. », « Pilote 3 segments sur 2 min 30 s et écrit 2 consignes à la sortie. », ou « Aucune consigne n'est écrite. » Voir [Procédures](process-procedures). |
| La carte **Commandes uniques** d'un volet | **Appliquer une recette** écrit une fois les consignes d'une recette instantanée, hors de tout essai, par le canal journalisé sous un verrou de courte durée ; aucun fichier d'essai n'est créé, le journal est la trace. Seules les recettes instantanées sont proposées. Voir [Volets](process-panels#the-card-catalogue). |

## Ce qu'un essai en fait {#what-a-run-does-with-it}

Au démarrage, l'essai prend possession de chaque source que la recette écrit pour toute sa durée,
donc un démarrage dont la recette écrit une source qu'un autre essai détient est refusé en la
nommant, et toute écriture venue d'ailleurs (un champ de tableau de bord, un script, un client
OPC UA) vers ces sources est refusée tant que l'essai les détient. Un jeu instantané est écrit une
fois au démarrage ; un profil temporel est parcouru segment par segment sur l'horloge de l'essai, et
une procédure Temporelle sans recette reçoit tout de même cette horloge, pour que chaque membre de la
fenêtre démarre, se répète et se termine ensemble. Suspendre fige l'horloge et Reprendre la relâche ;
le datalog continue d'enregistrer pendant une suspension. Chaque écriture est journalisée avec
l'essai comme source et enregistrée dans le fichier d'essai telle qu'exécutée, donc un lecteur
ultérieur voit ce qui a réellement été écrit, et quand.

Un segment, le jeu instantané et le bloc de finalisation remettent chacun **toutes leurs consignes
d'un coup**, et chacune part de là vers la file de son propre équipement. Une station dont les quatre
voies sont sur quatre équipements paie donc l'équipement le plus lent une fois, et non la somme des
quatre, et la Logique elle-même n'en attend aucun.

Ce que fait ensuite le segment, c'est le **Comptage du temps** qui le décide. Sur **Attendre qu'elles
atteignent l'équipement**, l'horloge propre au segment ne démarre pas tant que chaque consigne n'a pas
été prise par son équipement : pendant ce temps l'unité se lit « En attente de l'arrivée des consignes
à l'équipement » sur le mur de la [Conduite](process-operate#the-operate-page), la durée du segment n'a
pas commencé à s'écouler, et le datalog enregistre tout du long. Sur **Envoyer et continuer**,
l'horloge démarre à l'instant où les consignes sont remises, et les réponses qui reviennent ensuite
sont enregistrées, sans plus.

La recette instantanée du démarrage et le bloc de finalisation attendent toujours, sans champ ni
choix : un essai ne doit pas commencer avant que son état de départ ne soit réel, et ne doit pas être
rapporté clos avant que son état sûr ne le soit. Leurs refus sont enregistrés tels qu'exécutés et,
comme toujours, n'interrompent jamais l'essai.

Le bloc de finalisation est écrit chaque fois que l'essai **se termine** : fin normale, Arrêter ou
Interrompre. Il n'est pas écrit quand l'application elle-même est fermée en cours d'essai : l'essai
ne se termine pas, et il reprend suspendu à son segment et à son cycle persistés au lancement
suivant.

## Retirer la recette {#remove-recipe}

**Retirer la recette** se tient dans le groupe de danger de la barre de détail avec la recette
sélectionnée, sur son menu contextuel, et comme le X sur la carte de la page du dossier. Il demande
d'abord (« Supprimer la recette », « Ceci retire la recette du modèle. »). Chaque
procédure qui l'appliquait vide sa référence Recette et devient un essai sans recette. Il exige
Modifier recettes et évaluations et est grisé sous le verrou d'ingénierie et le runtime arrêté.

## Ce qu'une recette ne fait pas {#what-a-recipe-does-not-do}

- Elle ne lit rien et ne juge rien : les limites sont une [évaluation](process-evaluations).
- Elle n'écrit aucune valeur par unité. Chaque unité reçoit les mêmes littéraux sur ses propres
  sources liées.
- Elle ne retente jamais une écriture refusée ; la règle d'échec est toute la réponse.
- Une recette temporelle ne peut pas être déclenchée comme commande unique ; seule une procédure
  exécute un profil.
- L'aperçu du profil ne dessine que les voies numériques ; une cible de type Booléen ou Texte est écrite mais
  jamais dessinée.
