Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Mon petit train train
Mon petit train train
Publicité
Archives
Newsletter
18 décembre 2013

Description du réseau.

La modélisation de la voie est un élément essentiel et critique.

  • Essentiel car le logiciel doit savoir où se  trouve un train et comment le piloter pour le mener où il doit se rendre.
  • Critique car l'analyse des positions et la commande de pilotage doivent être réalisées en permanence et en temps réel. "Temps réel" signifie dans un délai suffisamment bref pour savoir réagir au processus réel qui est en train de se dérouler.

Pour ce qui est du temps réel j'expérimente la cadence de 100 ms, c'est à dire que toutes les informations gérées par l'automatisme seront analysées et traitées toutes les 100 ms soit dix fois par secondes. Cela semble ambitieux mais nos machines actuelle sont des monstres de puissance et j'ai bien l'impression que cela tient la route.

Il convient donc de trouver une façon de décrire la voie qui soit facile et rapide à analyser. Je pars sur une solution avec des indexs dans tous les sens et en particulier sur une table renseignée dans le code qui décrit les cantons uns par uns.

Sauf exception, chaque canton a un canton qui le précède et un qui le succède. De plus, un aiguillage peut s'interposer entre deux cantons.

Chaque canton reçoit donc la description suivante :

  • 'PARAM0 : numéro aiguillage (chaque aiguillage à deux numéro, un pour chaque branche)
  • 'PARAM1 : canton suivant
  • 'PARAM2 : numéro aiguillage
  • 'PARAM3 : canton suivant
  • 'PARAM4 : numéro aiguillage
  • 'PARAM5 : canton précédent (vers l'arrière)
  • 'PARAM6 : numéro aiguillage
  • 'PARAM7 : canton précédent (vers l'arrière)
  • 'PARAM8 : longueur du canton (en centimètres)
  • 'PARAM9 : index du LineShape dans ShapeContainer !
  • 'PARAM10 : état du canton
  • 'PARAM11 : symbole début
  • 'PARAM12 : symbole fin

Vers l’avant comme vers l’arrière, un canton peut aller vers deux autres du fait d'un aiguillage il y a donc quatre possibilités décrites dans cette table.

Par convention :

  • S'il n'y a pas d'aiguillage, le numéro d'aiguillage est 0.
  • S'il n'y a pas de canton, le numéro de canton est 0 (voie sans issue).
  • Si l'aiguillage ne donne pas de choix (voir exemple ci après) les mêmes paramètres sont répétés deux fois.

Exemple :

aiguillage

Nous aurons :

Canton 1.

  • 'PARAM0 : aig1
  • 'PARAM1 : canton 2
  • 'PARAM2 : aig 1
  • 'PARAM3 : canton 2
  • 'PARAM4 : 0
  • 'PARAM5 : 45
  • 'PARAM6 : 0
  • 'PARAM7 : 45

Canton 2.

  • 'PARAM0 : 0
  • 'PARAM1 : canton 3
  • 'PARAM2 : 0
  • 'PARAM3 : canton 3
  • 'PARAM4 : aig 1
  • 'PARAM5 : 1
  • 'PARAM6 : aig 2
  • 'PARAM7 : 90

Cet exemple illustre bien les trois possibilités :

  • Pas d'aiguillage.
  • Un aiguillage vers un seul canton.
  • Un aiguillage vers deux cantons.

Le paramètre 8 décrit la longueur du canton en cm, il permet de faire une simulation réaliste de l'avancement des trains, en effet, j'ai chronomètré la vitesse réelle de mes trains et je la décrit dans les paramètres de description des convois. Ainsi le moteur de simulation peut faire avancer les trains d'une façon réaliste.

Le paramètre 9 permet de contourner une difficulté de VB.NET. Dans les versions VB6, il était très aisé d'indexer des objets puis de travailler sur leur index. Depuis vb.NET c'est beaucoup plus délicat. Je suis obligé de constituer lors de l'initialisation du programme une table de correspondance entre le nom de mes symboles et l'index interne attribué à l'objet par le générateur de VB. Ceci est d'autant plus difficile avec des symboles de type "Shape" (les lignes qui représentent ma voie) qui sont contenus dans des "ShapeContainer" masqués.

Le paramètre 10 contient l'information, canton alimenté (1) ou non alimenté (0), ceci en fonction de la position des aiguillages.

Les paramètres 11 & 12 contiennent les informations de symbole début - symbole fin. En effet un canton est en général dessiné par plusieurs symboles (plusieurs segments) dans la Form "Pilot". Ceci afin de réaliser des courbes à peu près jolies. Le paramètre 11 contient le premier symbole de représentation du canton et le paramètre 12 le dernier. Lors de la mise à jour de l'état du canton le logiciel réalise une boucle sur ces valeurs afin de mettre à jour tous les symboles du canton.

La méthode descriptive est lourde mais extrêmement rapide lors du calcul car elle est gérée à l'aide d'un simple index qui se déplace dans la table de descritption des cantons.

J'ai simplifié à 43 cantons qui doivent être renseignés un par un !

Table d'état des cantons.

J'ai mis en oeuvre deux variables supplémentaires indexées sur le numéro de canton. Elle auraient pu se trouver dans le tableau précédent mais par souci de lisibilité du code j'ai préféré ouvrir de nouvelles variables ce qui ne gène en rien.

Occupation des cantons. Chaque canton reçoit une valeur d'occupation définie ainsi :

  • Valeur 99 si le canton est libre.
  • Valeur de l'index du train qui l'occupe si le canton est occupé.

Cela permet de savoir à tout moment qui est où.

Mais comme un train ne doit jamais en rattraper un autre, il faut aussi ajouter une variable d'état du canton. J'ai défini les états suivants :

  • Canton sans contrainte.
  • Canton ralenti.
  • Canton arrêté.

A l'arrière d'un train, je le protège en déclarant le canton précédent comme arrêté et celui qui précède encore comme "ralenti". 

Lorsqu'un train atteint un canton ralenti, mais n'est en fait pas encore complètement dessus, il doit ralentir de sorte à ne pas atteindre le canton arrêté.

Lorsqu'un train atteint un canton arrêté il doit stopper immédiatement. Ceci ne devrait pas se produire si la stratégie de ralentissement est convenable.

Sur un canton sans restriction il n'y a pas de contrainte.

Représentation des cantons.

J'ai choisi les conventions suivantes afin de visualiser facilement l'état de mon réseau.

En l'absence de convoi, les cantons sont :

  • Verts si alimentés.
  • Rouge - rose si non alimentés.

Les cantons occupés par les trains sont bleu ou mauve selon la nature de l'alimentation du train (voie ou caténaire). La variable occupationCanton permet de savoir, indépendamment de l'état du canton, si un train est présent. Si un train est présent les couleurs "ralenti" ou "arrêté" ne sont pas appliquées.

  • Les cantons arrêtés sont rouge sombre.
  • Les cantons ralentis sont jaunes.

Sur la figure suivante nous voyons toutes ces couleurs.

fenetrePilot

Cette figure mérite une petite explication.

Le train 25, stationné voie 2 a sa représentation complète. C'est un train court qui n'occupe que le canton 22, le canton 21 est arrêté (rouge) le canton d'avant est ralenti (jaune).

Par contre le train 34 qui est stationné au garage 3 n'est pas alimenté, les aiguillages isolent sa portion de voie, aussi les cantons de protection ne sont pas activés sans quoi la voie qui en fait est libre serait affectée par ce train en stationnement. De même pour les trains 58 (voie 1) et 23 (garage 9).

A cause de cela, la gestion des aiguillages est un véritable casse tête qui n'est pas encore complètement testé. J'y reviendrai.

La prochaine fois nous verrons la table des aiguillages et celle des capteurs.

PhB

Publicité
Publicité
Commentaires
Publicité