Thème
Registres Modbus — cahier/DABUS vs INIS-E16
Lecture de bits FC 0x01, écriture de mots FC 0x10. Le cahier des charges décrit l'INIS-E16 sur la table de base AVISS : la DABUS la suit, l'INIS-E16 s'en écarte sur le hors service point et enrichit la table d'échange de quatre tables de zones et de deux informations de synthèse qui lui sont propres.
1. Zone/DI « IHM »
INIS-E16 : une zone « IHM » et une ligne « DI IHM » propres à la centrale, en plus des seize zones physiques. DABUS : 128 zones, pas d'IHM.
Ces entités n'occupent pas la tête de toutes les tables — voir §2.1. Là où elles le font, l'adresse de base de la table est la même sur les deux types : sur INIS-E16 elle porte l'entité système, sur DABUS/AVISS la première unité physique.
2. Tables de lecture (FC 0x01)
Les adresses ci-dessous sont celles du premier bit de chaque table, telles que le cahier les porte.
| Table | DABUS/AVISS | INIS-E16 |
|---|---|---|
| Paramètres généraux | 1 (23 bits) | 1 (25 bits) |
| Hors service point | 1001 | 953 |
| Feu point | 2001 | 2001 |
| Défaut point | 3001 | 3001 |
| Hors service zone | 4001 | 4001 |
| Feu zone | 5001 | 5001 |
| Défaut zone | 6001 | 6001 |
| Essai zone | 7001 | 7001 |
| Évacuation | 8001 | 8001 |
| Émission | 8021 | 8021 |
| DM / extinction | 8041 | 8041 |
| Zones en neutralisation | — | 8061 |
| Zones en mode manuel seul | — | 8081 |
| Zones en arrêt d'urgence | — | 8101 |
| Zones en inhibition | — | 8121 |
Un écart et une extension :
- Hors service point : le cahier porte deux valeurs contradictoires — décimal
1001, hexadécimal0x03B9 = 953. DABUS répond à 1001, INIS-E16 à 953. - Tables d'exploitation étendues : neutralisation, mode manuel seul, arrêt d'urgence et inhibition n'existent que sur INIS-E16. Le profil AVISS laisse ces adresses nulles ; aucune région n'est alors lue et les états correspondants restent inactifs.
2.1. Position de tête, table par table
L'unité système n'occupe pas la tête de toutes les tables. Le cahier dimensionne les quatre tables de zones de base pour 999 zones — une entrée de tête y trouve sa place — mais les tables d'exploitation pour 16, soit exactement les seize zones physiques de l'INIS-E16. La position de la zone n° 1 se déclare donc par table, sur chaque incident du profil (IncidentDefinition.ZoneBitOffset / PointBitOffset), et non par un drapeau unique de profil. HasIhmZone / HasInisPoint disent seulement que la centrale expose ces entités, non quelles tables leur réservent une place.
L'adresse déclarée au profil est celle de la table, telle que le cahier la donne. L'unité physique n° 1 se trouve à adresse de table + décalage de tête — l'onglet Contrôle de l'éditeur affiche les deux.
| Table | Adresse de table | Tête | Zone / point n° 1 |
|---|---|---|---|
| HS / feu / défaut / essai zone | 4001 / 5001 / 6001 / 7001 | zone IHM | 4002 / 5002 / 6002 / 7002 |
| Évacuation / émission / DM | 8001 / 8021 / 8041 | aucune | 8001 / 8021 / 8041 |
| Neutralisation / manuel seul / arrêt d'urgence / inhibition | 8061 / 8081 / 8101 / 8121 | aucune | idem |
| HS point | 953 | DI IHM | 954 |
| Feu / défaut point | 2002 / 3002 | DI IHM | 2003 / 3003 |
Reste à trancher au banc : feu et défaut point. Le scan du 07/07/2026 a relevé 2002 et 3002 sur centrale réelle, sans distinguer la tête de table de la DI 1. L'essai E1 de la campagne de validation JBUS est fait pour cela : un bit levé à l'adresse de table donne le modèle du cahier, un bit levé à l'adresse suivante l'alignement actuel. L'essai E2 couvre de même les quatre tables étendues, dont aucune source documentaire ne donne l'adresse.
Les valeurs qui font foi sont celles de StandardPanelProfiles (dotnet/shared/Profiles/), relevées sur centrales réelles : le cahier décrit l'AVISS, dont l'INIS-E16 s'écarte. Toute confrontation au cahier passe par la campagne de validation JBUS (PLAN-ETATS-EXPLOITATION.md), pas par une réécriture des profils.
3. Écriture des commandes (FC 0x10, registre 500)
Trame [code] [table] [cible]. Codes identiques.
| Commande | Code | Cible DABUS/AVISS | Cible INIS-E16 |
|---|---|---|---|
| Hors service point | 1 | n | n + 1 |
| En service point | 2 | n | n + 1 |
| Hors service zone | 3 | n | n + 1 |
| En service zone | 4 | n | n + 1 |
| Essai zone | 5 | n | n + 1 |
| Mode manuel | 6 | — | n |
| Silence signaux | 10 | — | — |
| Réarmement | 11 | — | — |
Sur INIS-E16, la cible n + 1 vise la zone/point physique n (cible 1 = IHM). Le mode manuel (6) fait exception : cible directe (n = zone physique n).
La cible 1 — l'entité d'interface — n'est pas offerte pour la mise hors service et la remise en service de zone : mesuré sur centrale réelle, le firmware accepte la trame et n'en fait rien. Les mêmes commandes de ligne agissent en revanche bien sur la ligne DI IHM, et lui restent ouvertes. Ce choix se déclare par commande dans le profil (TargetsSystemEntity) : une centrale d'une autre génération qui répondrait à ces trames se paramètre sans toucher au code. Le serveur refuse la cible lorsque le profil ne la déclare pas — le verrou n'est pas seulement d'affichage.
4. Paramètres généraux (adresse 1)
La table compte 23 bits sur DABUS/AVISS, 25 sur INIS-E16.
| Adresse | Information | DABUS/AVISS | INIS-E16 |
|---|---|---|---|
| 1 à 8 | Synthèses maître (feu, dérangement, réseau, secteur, batteries, points HS, essai, système) | Actives | Actives |
| 9 à 16 | Défaut communication esclave 01 à 08 | Actives | Non utilisées |
| 17 | Dérangement liaison (unité de commande) | Active | Non utilisée |
| 18 | Diffuseur hors service (unité de commande) | Active | Non utilisée |
| 19 | Veille restreinte (unité de commande) | Active | Non utilisée |
| 20 | Alarme UGA (unité de commande) | Active | Non utilisée |
| 21 | Alarme restreinte (unité de commande) | Active | Non utilisée |
| 22 | Évacuation générale (unité de commande) | Active | Non utilisée |
| 23 | Défaut communication inter-coffret | Active | Active |
| 24 | Synthèse générale neutralisation | — | Active |
| 25 | Synthèse générale mode manuel seul | — | Active |
Les défauts esclaves (9 à 16) et les états d'unité de commande (17 à 22) sont décodés d'après le cahier ; leur position n'est confrontée à aucune centrale AVISS réelle. Le simulateur les injecte bit à bit, ce qui éprouve la chaîne de supervision sans lever ce doute.
Chaque centrale déclare les bits qu'elle sert dans la carte GlobalBits de son profil, qui reprend les colonnes ✔ du tableau ci-dessus : un bit non déclaré n'est ni lu, ni journalisé, ni affiché, et le simulateur ne l'expose pas non plus. Le nombre de bobines lues vient de TestConnectionCount.
Une centrale au firmware antérieur ne sert que les 23 bobines de base et répond « adresse illégale » au-delà. GlobalCoilReader lit de façon optimiste, mémorise la dégradation par centrale et se replie sur la table de base : la centrale reste connectée en mode dégradé, ses états de zone restent fiables, seules les deux synthèses générales deviennent indisponibles — ce qui se distingue d'un état inactif. Une exception esclave ne ferme jamais la connexion : c'est une réponse protocolaire, pas une panne de transport. L'essai E5 de la campagne de validation JBUS porte ce verdict : il lit la table de base puis l'extension, cette dernière étant autorisée à échouer.
5. Identité des états système
L'adresse d'un bit n'identifie pas l'état qu'il porte : deux centrales servent le même état à des bits différents, ou ne le servent pas. L'identité est la clé, déclarée une fois dans SystemFlagKeys (dotnet/shared/Profiles/) et reprise de bout en bout :
GlobalBits (clé → bit, par centrale)
→ SystemFlagDefinition (libellé, icône, son, priorité, index d'acquittement)
→ SystemFlagState (état lu d'une centrale)
→ supervision temps réel, indexée par cléUne définition dépourvue de décalage de bit décrit un état que la centrale ne sert pas : il n'est ni lu, ni journalisé, ni acquittable, ni exposé au frontend. C'est ce qui distingue « indisponible sur ce firmware » de « inactif ». La procédure d'ajout d'un état est décrite dans PLAN-ETATS-EXPLOITATION.md.