Une station de comptage sur boucles avec un Siemens IOT2050

Les boucles inductives sciées dans la chaussée restent le capteur de référence pour compter les véhicules et mesurer l’occupation d’une voie : éprouvées, précises et peu coûteuses à exploiter. Elles ont leur propre usure, puisqu’elles vieillissent avec l’enrobé dans lequel elles sont installées, mais ce sont aussi les automates qui les lisent qui finissent par ne plus être maintenus. Nous avons dû renouveler un parc de 14 stations de comptage sur boucles, construites à l’origine autour de l’automate Orion de FARECO, un produit en fin de vie et qui n’est plus maintenu. Plutôt que de chercher un remplaçant à l’identique, nous avons conçu notre propre automate de comptage sur une passerelle industrielle Siemens SIMATIC IOT2050, avec un logiciel écrit en C qui prend en charge les fonctions de mesure du trafic du protocole DIASER (NF P 99-071).

Le besoin

Le chantier porte sur l’automate, pas sur le capteur : les boucles inductives sont déjà dans la chaussée. Le remplaçant doit donc se brancher sur les détecteurs existants et continuer à dialoguer, en DIASER, comme l’équipement qu’il remplace.

Car un superviseur de trafic ne veut pas des signaux bruts d’une boucle, il veut des compteurs : un nombre de véhicules et un temps d’occupation, qu’il interroge à son rythme et dont il tire lui-même les débits et les taux d’occupation. La station a donc deux métiers : transformer des fronts électriques en compteurs fiables, et exposer ces compteurs dans le dialogue normalisé du trafic, sans que le superviseur ait à savoir que l’automate a changé.

De la boucle à l’entrée numérique

Chaque boucle est reliée à un détecteur, qui bascule à l’arrivée d’un véhicule puis revient à l’état libre à son départ. La sortie du détecteur est raccordée à une entrée numérique de l’IOT2050. Deux fronts portent toute l’information :

  • le front montant : un véhicule entre sur la boucle ;
  • le front descendant : il la quitte. La durée entre les deux est son temps de présence.

Une station gère dix entrées, soit autant de boucles ou de voies à surveiller en parallèle.

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#eef0ff','primaryTextColor':'#27262b','primaryBorderColor':'#5c5adc','lineColor':'#8a8da8','secondaryColor':'#f4f5ff','tertiaryColor':'#f4f5ff','edgeLabelBackground':'#eef0ff','clusterBkg':'#f4f5ff','clusterBorder':'#5c5adc'}}}%%
flowchart TB
    B["Boucles inductives<br/>sciées dans l'enrobé"] --> D["Détecteurs de boucle"]
    D -->|"contacts · fronts montants / descendants"| IN
    subgraph IOT["Siemens IOT2050 · Debian"]
        IN["Entrées numériques"] --> TH["Un thread par entrée<br/>attente passive des fronts"]
        TH --> CP["Compteurs<br/>véhicules · occupation"]
        CP --> SRV["Serveur DIASER<br/>application M · UDP"]
    end
    SRV <-->|"questions / réponses"| SUP["Superviseur de trafic"]

Sur le terrain, la station tient dans une armoire installée en bordure de chaussée. Quant à la boucle, elle est invisible : une fois le sillon scié dans l’enrobé puis rempli, il n’en reste que le tracé.

Acquisition par événements

La tentation, avec des entrées numériques, est de les lire en boucle à intervalle fixe. Ce serait gaspiller le processeur et, surtout, risquer de rater un front court, par exemple celui d’une moto ou d’un véhicule rapide sur une petite boucle.

Le logiciel de la station procède autrement. Chaque entrée est exposée par le noyau Linux et configurée pour signaler les deux fronts. Un thread dédié par entrée s’endort sur un select(), donc sans consommer de CPU, et n’est réveillé que par un changement d’état. À ce moment seulement, il lit la nouvelle valeur et prend l’horloge. Un mutex protège l’état de chaque capteur, partagé avec le thread qui répond au superviseur.

Le résultat est une acquisition pilotée par les événements, qui ne dépend pas d’une période de scrutation et ne coûte rien tant qu’aucun véhicule ne passe.

Des compteurs bruts, comme le veut la norme

La norme DIASER fixe une règle simple et exigeante : la station ne transmet jamais de quotient, seulement des compteurs cumulatifs, non remis à zéro à la lecture. Le superviseur calcule le débit ou le taux d’occupation par différence entre deux relevés.

La station entretient donc deux familles de compteurs :

  • le comptage : un véhicule détecté sur le front montant, c’est une unité ajoutée ;
  • l’occupation : le temps pendant lequel la boucle est occupée, cumulé par pas de 0,25 s, l’unité d’échange de la norme.

Chaque compteur est échangé sur un octet et boucle donc à 256. Ce n’est pas un défaut : le superviseur travaille par différence, y compris au passage du zéro, à condition d’interroger la station assez souvent pour que le compteur ne fasse jamais plus d’un tour entre deux relevés. C’est une contrainte de dimensionnement à garder en tête, côté période de scrutation comme côté trafic attendu.

Le choix d’un compteur sans remise à zéro rend aussi le système tolérant : si un relevé est perdu, rien n’est perdu avec lui, le suivant rattrape la différence.

Le dialogue DIASER

Toute la station se pilote par l’application « Mesure du trafic » de DIASER, identifiée par la lettre M. Chaque transaction est une question suivie d’une réponse, encadrée par les caractères de début et de fin de trame et un caractère de contrôle, avec des valeurs codées en hexadécimal ASCII. Le logiciel de la station répond en UDP.

Les fonctions prises en charge couvrent le cycle de vie complet d’une station. Une fonction de lecture se note en majuscule et sa forme d’écriture en minuscule, comme le veut DIASER.

Fonctions communes à toutes les applications (*)

Fonction Forme Code DIASER Remarques
Identification lecture Z Identifiant de la station, version de configuration, constructeur, modèle et version du logiciel
Horodate lecture Y Date et heure de la station, au dixième de seconde, avec le jour de la semaine
Horodate écriture y Mise à l’heure par le superviseur, refusée si une source de référence a recalé l’horloge depuis moins de 12 heures

Fonctions de l’application Mesures (M)

Fonction Forme Code DIASER Remarques
Configuration mesures lecture B Relecture de la configuration d’un compteur, pour vérifier ce que la station a retenu
Configuration mesures écriture b Occupation (A), comptage de couloir sur 1 à 9 entrées (B) et vitesse sur couple de boucles (C), pour 32 compteurs au plus. Les comptages N, N+ et 2N-1 (D, E, H) sont refusés
RàZ configuration mesures écriture d Libère tous les compteurs, acquittement M!
Lecture mesures (temps réel) lecture A / a Valeurs cumulatives de tous les compteurs configurés, sur un octet, avec indication de changement de défauts
Lecture défauts en cours lecture P Défauts en cours de la station

Les autres fonctions de l’application Mesures, comme la classification, les comptages différés ou la lecture multiple, ne sont pas encore prises en charge. La station y répond par le code d’erreur normalisé « code fonction non reconnu » plutôt que de rester muette, ce qui permet au superviseur de le détecter proprement.

Voici un échange typique, où le superviseur déclare un compteur de comptage sur la première entrée, puis le lit (valeurs données à titre d’exemple) :

Question  Mb 00 B1 00      déclare le compteur 0 : comptage, 1 entrée, entrée 0
Réponse   M!               acquittement
Question  MA               lecture des compteurs
Réponse   MA 02 1F 0C      2 compteurs : le premier à 0x1F, le second à 0x0C

La configuration et les valeurs des compteurs sont enregistrées dans des fichiers et restaurées au démarrage : un redémarrage de la passerelle ne fait ni perdre la programmation reçue du superviseur, ni repartir les compteurs de zéro.

Industrialiser la passerelle

Le logiciel se compile directement sur la passerelle, qui embarque son propre compilateur sous Debian. Pour déployer, nous préparons une image de référence une fois, puis nous la clonons sur la mémoire eMMC de chaque station en réglant l’ordre de démarrage dans le chargeur de démarrage. Une nouvelle station est ainsi prête sans reconfiguration manuelle, ce qui compte quand on en multiplie le nombre.

Intérieur d'une armoire de station de comptage : rails de montage avec disjoncteurs, alimentation, passerelle Siemens IOT2050 en haut à droite et borniers de raccordement
L'intérieur d'une station : protections, alimentation, passerelle IOT2050 en haut à droite et raccordements.

La suite : le débit classifié

Avec un couple de boucles par voie, on peut aller plus loin que le simple comptage et ranger chaque véhicule dans une classe de vitesse ou de longueur. C’est le développement que nous étudions, et la norme comme l’automate que nous remplaçons en fixent le principe.

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#eef0ff','primaryTextColor':'#27262b','primaryBorderColor':'#5c5adc','lineColor':'#8a8da8','secondaryColor':'#f4f5ff','tertiaryColor':'#f4f5ff','edgeLabelBackground':'#eef0ff','clusterBkg':'#f4f5ff','clusterBorder':'#5c5adc'}}}%%
flowchart LR
    V(["Véhicule<br/>sens de circulation"]) ==> P
    subgraph VOIE["Une voie de mesure"]
        direction LR
        P["Boucle principale<br/>entrée n"] ==>|"distance inter-boucles"| A["Boucle associée<br/>entrée n+1"]
    end
    A ==> F(["Fin de zone"])
    style V fill:#fff4e0,stroke:#e9a23b,color:#27262b
    style F fill:#f4f5ff,stroke:#8a8da8,color:#27262b
    style P fill:#e3f5ea,stroke:#2fb37a,color:#27262b
    style A fill:#eef0ff,stroke:#5c5adc,color:#27262b
  • La vitesse découle du temps séparant les deux fronts montants, sur la boucle principale puis sur la boucle associée, rapporté à la distance qui les sépare.
  • La longueur découle du temps de présence sur la boucle principale, combiné à cette vitesse.
  • La prise en compte du véhicule se déclenche sur le front descendant de la boucle principale : c’est à cet instant que le compteur est incrémenté et que la classe est déterminée.
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#eef0ff','primaryTextColor':'#27262b','primaryBorderColor':'#5c5adc','lineColor':'#8a8da8','secondaryColor':'#f4f5ff','tertiaryColor':'#f4f5ff','edgeLabelBackground':'#eef0ff','clusterBkg':'#f4f5ff','clusterBorder':'#5c5adc'}}}%%
flowchart LR
    subgraph SV["1 · Mesure de la vitesse"]
        direction TB
        T1["t1<br/>front montant<br/>boucle principale"] --> T2["t2<br/>front montant<br/>boucle associée"]
        T2 --> VIT["Vitesse<br/>distance ÷ (t2 - t1)"]
    end
    subgraph SL["2 · Mesure de la longueur"]
        direction TB
        T3["t3<br/>front descendant<br/>boucle principale"] --> LON["Longueur<br/>présence × vitesse"]
    end
    SV ==> SL
    SL ==> PRI(["3 · Prise en compte<br/>compteur + 1<br/>classe de vitesse<br/>classe de longueur"])
    style T1 fill:#e3f5ea,stroke:#2fb37a,color:#27262b
    style T2 fill:#e3f5ea,stroke:#2fb37a,color:#27262b
    style T3 fill:#fde8e8,stroke:#e5484d,color:#27262b
    style VIT fill:#eef0ff,stroke:#5c5adc,color:#27262b
    style LON fill:#eef0ff,stroke:#5c5adc,color:#27262b
    style PRI fill:#fff4e0,stroke:#e9a23b,color:#27262b

Le superviseur ne déclare que l’entrée principale, l’entrée associée étant par convention la suivante. Il programme ensuite des histogrammes : chacun est rattaché à un compteur source et à un critère, classe de vitesse en km/h ou classe de longueur en décimètres, avec des bornes croissantes, la dernière classe n’ayant pas de limite haute. Le superviseur lit ces histogrammes en continu ; comme les compteurs de classes sont cumulatifs, il en tire le débit par classe par différence entre deux relevés, exactement comme pour le comptage simple.

Deux points de conception se dégagent :

  • Les paramètres physiques restent locaux. La distance inter-boucles et la longueur de boucle ne passent pas par DIASER : l’automate d’origine les fait saisir dans son outil de programmation, par point de mesure. Notre station doit donc offrir sa propre configuration locale pour ces deux valeurs.
  • La géométrie est un compromis. Une boucle longue améliore la précision, mais si elle est trop longue, deux véhicules qui se suivent de près l’occupent en même temps et faussent la mesure.

Une dernière particularité vaut d’être notée : la norme n’est pas parfaitement cohérente avec elle-même sur le codage du nombre de classes, selon qu’on lit le texte ou son exemple, et les automates du marché ont chacun leur convention. Une station de remplacement doit donc être validée contre le superviseur réel, en relisant systématiquement la configuration qu’il vient d’écrire.

Technologies

Siemens SIMATIC IOT2050, Debian (aarch64), C (threads POSIX, select(), sockets UDP), boucles inductives et détecteurs, DIASER (NF P 99-071, application Mesure du trafic).

Me contacter


← Tous les articles


Haut de page

Site propulsé par Just the Docs, un thème Jekyll. · Mentions légales