Une passerelle DIASER / LCR pour panneaux à messages variables
Les panneaux à messages variables (PMV) que nous exploitons dialoguent en LCR, le langage de commande routier, sur TCP. Notre superviseur de trafic, lui, dialogue en DIASER, sur UDP. Entre les deux, il faut un traducteur : une passerelle applicative. Celle que proposait le fabricant des panneaux nous a posé des problèmes de fiabilité. Nous avons donc écrit la nôtre, en C, pour la faire tourner dans un boîtier industriel Teltonika TRB140.
Le besoin
Le superviseur de trafic commande un panneau comme il commande n’importe quel équipement du réseau de régulation : par des transactions DIASER, courtes, en texte, avec acquittement. Il décrit un panneau en termes de lignes, de caractères, de durée de validité, d’état et de défauts.
Le panneau, lui, attend des commandes LCR : un message par ligne, avec ses attributs de clignotement, d’alternance, de durée de validité et d’éclairage, et il répond à des interrogations d’état, de cellules photosensibles et de pixels. Les deux protocoles ne se ressemblent ni dans leur transport, ni dans leur vocabulaire. La passerelle doit donc faire plus que relayer des octets : elle traduit, tient un état et surveille le panneau.
Pourquoi une passerelle maison
Une passerelle est un maillon critique. Quand elle défaille, le superviseur perd la main sur le panneau, et un message d’alerte peut rester affiché, ou ne jamais s’afficher. Les problèmes de fiabilité rencontrés avec la passerelle du fabricant nous ont décidés à reprendre la maîtrise de la chaîne.
Écrire la passerelle nous-mêmes a donné trois choses :
- un comportement connu : nous savons ce qu’elle fait à chaque transaction, et nous pouvons le tracer ;
- un logiciel qui se corrige : un défaut observé sur le terrain se traite directement, sans attendre un tiers ;
- un déploiement simple : le même programme sert pour tous les panneaux, paramétré à son lancement.
Architecture
La passerelle est un unique programme en C, découpé en trois fils d’exécution (threads) qui ne se bloquent pas les uns les autres.
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#eef0ff','primaryTextColor':'#27262b','primaryBorderColor':'#5c5adc','lineColor':'#8a8da8','secondaryColor':'#f4f5ff','tertiaryColor':'#f4f5ff','edgeLabelBackground':'#eef0ff','clusterBkg':'#f4f5ff','clusterBorder':'#5c5adc'}}}%%
flowchart TB
SUP["Superviseur de trafic"] <-->|"DIASER · UDP"| GW
subgraph TRB["Boîtier industriel Teltonika TRB140"]
GW["Fil DIASER<br/>répond au superviseur"] <--> ETAT[("État du panneau<br/>en mémoire")]
ETAT <--> LCR["Fil LCR<br/>dialogue avec le panneau"]
ETAT <--> DEF["Fil défauts<br/>analyse des réponses"]
end
LCR <-->|"LCR · TCP"| PMV["Panneau à messages variables"]
style PMV fill:#fff4e0,stroke:#e9a23b,color:#27262b
style ETAT fill:#e3f5ea,stroke:#2fb37a,color:#27262b
- Le fil DIASER écoute les transactions du superviseur en UDP, les décode, met à jour l’état du panneau en mémoire et répond aussitôt.
- Le fil LCR tient une connexion TCP permanente avec le panneau, lui envoie les messages à afficher et l’interroge régulièrement.
- Le fil défauts lit les réponses du panneau, en extrait les défauts, les cellules photosensibles et la synthèse de l’état technique, compare l’affichage réel au message demandé, et met à jour l’état en mémoire.
Le point clé est l’état tenu en mémoire. Tant que le panneau répond, le superviseur n’attend jamais lui : sa transaction est traitée à partir de ce que la passerelle sait déjà, et la réponse part immédiatement. Et quand le panneau ne répond plus, ou n’affiche pas ce qui lui est demandé, la passerelle ne répond plus non plus : c’est le silence qui avertit le superviseur (voir plus bas).
Les fonctions DIASER prises en charge
Les fonctions prises en charge couvrent l’application « Panneaux » de DIASER, identifiée par la lettre P. Une fonction de lecture se note en majuscule, sa forme d’écriture en minuscule.
| Fonction | Forme | Code | Traduction côté panneau |
|---|---|---|---|
| Identification | lecture | Z | Répondue par la passerelle, sans dialogue avec le panneau |
| Horodate | lecture | Y | Heure de la passerelle |
| Configuration du panneau | écriture / lecture | a / A | Mémorise les temporisations (clignotement, alternance, durée de validité) |
| Commande de veille | écriture | b | Met le panneau en veille |
| Luminosité | écriture | c | Choix de l’éclairage : jour, nuit, surbrillance ou automatique |
| Message fixe | écriture | e | Affichage d’un message, ligne par ligne |
| Message clignotant | écriture | f | Même message, avec clignotement |
| Message alterné | écriture | g | Deux messages qui alternent |
| Contrôle d’état du panneau | lecture | D / d | État, luminosité, cellules ; la forme d signale un changement |
| Défauts en cours | lecture | P | Défauts de pixel, d’alimentation, de cellule, fin de validité |
Les fonctions qui n’ont pas de sens pour un panneau reçoivent le code d’erreur normalisé « code fonction non reconnu », plutôt qu’un silence qui laisserait le superviseur attendre.
Du message DIASER à la commande LCR
Un message à afficher arrive en DIASER sous la forme d’une durée de validité, d’un nombre de lignes, d’un nombre de caractères par ligne et du texte. La passerelle le découpe ligne par ligne et construit une commande LCR d’affichage, avec les attributs que le superviseur a demandés. Voici un exemple pour un panneau de deux lignes de quinze caractères, les points figurant des espaces (valeurs d’exemple) :
DIASER Pe 0A 2 0F BOUCHON........RALENTISSEZ....
LCR PA ID=... AM=1.1 AF="BOUCHON " CL=0 DV=00:10:00 EC=AU
AM=1.2 AF="RALENTISSEZ " CL=0 DV=00:10:00 EC=AU
Chaque ligne du panneau devient un message adressé (AM), avec son texte (AF), son clignotement (CL), sa durée de validité (DV) et son éclairage (EC). Un message alterné ajoute l’alternance (AT), avec les deux textes et leurs durées d’affichage.
Le message est envoyé une seule fois, avec sa durée de validité : c’est le panneau qui gère l’échéance. Si la passerelle ou le réseau devait s’interrompre, le panneau retire de lui-même le message à l’issue de sa durée de validité, au lieu de rester bloqué sur une information périmée.
Surveiller le panneau
Quand aucun message n’est en attente, le fil LCR ne reste pas inactif : il interroge le panneau, environ une fois par seconde, en alternant cinq questions. Elles s’appuient sur des commandes propres au fabricant du panneau, comme la commande ST STR, qui renvoie la synthèse de l’état technique.
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#eef0ff','primaryTextColor':'#27262b','primaryBorderColor':'#5c5adc','lineColor':'#8a8da8','secondaryColor':'#f4f5ff','tertiaryColor':'#f4f5ff','edgeLabelBackground':'#eef0ff','clusterBkg':'#f4f5ff','clusterBorder':'#5c5adc'}}}%%
flowchart TB
MSG["Message à afficher<br/>reçu du superviseur"] --> LCR
LCR["<b>Fil LCR</b> · une requête par seconde<br/>affichage, si un message est en attente<br/>sinon une interrogation à tour de rôle :<br/>défauts · état technique · cellules · pixels · affichage"] -->|"LCR · TCP"| PAN
PAN["Panneau à messages variables"] -->|"réponses"| DEF
DEF["<b>Fil défauts</b> · analyse des réponses<br/>pixels · alimentation · cellules<br/>fin de validité · affichage réel"] --> ETAT
ETAT[("État du panneau en mémoire<br/>lu par le superviseur")]
style LCR fill:#eef0ff,stroke:#5c5adc,color:#27262b
style PAN fill:#fff4e0,stroke:#e9a23b,color:#27262b
style ETAT fill:#e3f5ea,stroke:#2fb37a,color:#27262b
Le fil défauts exploite les réponses :
- Défauts de pixel : le panneau indique la position des pixels défaillants, que la passerelle convertit en défauts DIASER avec leur position.
- Synthèse technique : la réponse à la synthèse de l’état technique donne notamment l’état de l’alimentation. Un défaut de batterie ou d’alimentation devient un défaut DIASER d’alimentation.
- Fin de durée de validité : signalée au superviseur, pour qu’il sache qu’un message s’est éteint de lui-même.
- Cellules photosensibles : leurs mesures donnent le niveau de luminosité de jour, de nuit ou de surbrillance, que le superviseur lit dans l’état du panneau quand l’éclairage est laissé en mode local.
Dès que le nombre de défauts change, la passerelle lève un indicateur de changement : la prochaine lecture de l’état répond par la forme « changement », et le superviseur vient lire la liste des défauts. Il n’a pas besoin d’interroger les défauts en permanence pour ne rien rater.
Vérifier que le panneau affiche ce qui est demandé
Un panneau qui acquitte une commande ne prouve pas qu’il affiche le message : une erreur de module, une coupure d’alimentation ou une commande locale peuvent laisser un autre texte à l’écran. Un acquittement ne suffit donc pas, la passerelle doit relire l’affichage.
Elle mémorise le message demandé par le superviseur, puis, dans sa rotation d’interrogations, relit l’affichage réel du panneau avec la commande PE AM=*, qui renvoie une ligne par module avec son texte. La relecture est comparée au message attendu, ligne à ligne, en ignorant les espaces de fin.
- Concordance : rien à faire, le compteur de tentatives repart de zéro.
- Discordance : après un court délai laissé au panneau pour afficher, la passerelle renvoie le message, jusqu’à trois fois.
- Discordance persistante : si le panneau n’affiche toujours pas ce qui est demandé, la passerelle coupe la communication DIASER, comme pour une liaison perdue, et continue de renvoyer le message. Dès que l’affichage est conforme, la communication reprend d’elle-même.
Pourquoi couper plutôt que répondre par une erreur ? Parce que le fonctionnement est asynchrone : la réponse DIASER part avant que le panneau ait eu le temps d’afficher, on ne peut donc pas la conditionner à la relecture. En revanche, quand la discordance est établie, le silence est un signal que le superviseur sait déjà lire : la station est indisponible, il ne doit pas croire qu’un message est affiché.
Trois cas ne sont pas comparés, pour éviter les fausses alertes : un message dont la durée de validité est écoulée, un message alterné dont l’affichage change à chaque instant, et une lecture dont le nombre de modules ne correspond pas à la taille du panneau.
Quand le panneau ne répond plus
La liaison TCP avec le panneau peut tomber : coupure réseau, redémarrage du panneau, boîtier qui perd sa liaison. Plus insidieux encore, la connexion peut rester ouverte alors que le panneau ne répond plus. La passerelle surveille donc la date de la dernière réponse du panneau, quelle qu’elle soit.
Au-delà d’un délai de dix secondes sans réponse, la liaison est déclarée perdue. La passerelle fait alors deux choses :
- elle cesse de répondre aux transactions DIASER, sans les traiter et sans renvoyer de code d’erreur. Le superviseur interprète l’absence de réponse comme une station injoignable, ce qu’elle est : mieux vaut un silence franc qu’une réponse rassurante qui décrirait un état que la passerelle ne peut plus vérifier ;
- elle reconstruit la connexion : elle ferme la socket, attend cinq secondes, puis se reconnecte et reprend ses interrogations.
Dès que le panneau répond de nouveau, les transactions DIASER sont traitées comme avant, sans intervention.
Un banc d’essai pour tout voir
Une passerelle se met au point en regardant les trois acteurs en même temps : celui qui commande, celui qui exécute et celui qui traduit. Notre banc d’essai les met côte à côte.
Dans le journal de la passerelle, on suit chaque échange : la transaction DIASER reçue, la réponse renvoyée au superviseur, puis les requêtes envoyées au panneau et leurs acquittements. Quand le message commandé à gauche s’affiche à droite sur la page du panneau, la chaîne est validée.
Dans un boîtier Teltonika TRB140
Le programme est embarqué dans une passerelle industrielle Teltonika TRB140, un produit pensé pour héberger ce type d’application au plus près de l’équipement. Il se paramètre à son lancement : port d’écoute DIASER, adresse et port LCR du panneau, identifiant de la station, nombre de lignes et de caractères par ligne, niveau de journalisation. Le même programme sert donc pour des panneaux de tailles différentes.
Un mode bavard, activable au lancement, journalise chaque transaction DIASER et chaque échange LCR avec un horodatage à la milliseconde. C’est l’outil qui rend un défaut observé sur le terrain reproductible : on voit ce que le superviseur a demandé, ce que la passerelle a envoyé et ce que le panneau a répondu.
Technologies
C (threads POSIX, sockets UDP et TCP), Linux embarqué, boîtier industriel Teltonika TRB140, DIASER (UDP, application panneaux), LCR (TCP, NF P 99-341), panneaux à messages variables.