Dans mes scripts j'ai imaginé les méthodes suivantes pour animer les trains, méthodes que j'ai appelées "consignes" :

  • Train qui "Stationne" : ce train ne bouge pas il est là pour le décor.
  • Train qui "Tourne" : ce train quitte son stationnement puis tourne indéfiniment.
  • Train qui "Passe" : ce train quitte son stationnement puis tourne jusqu'à l'heure de son arrivée en gare.
  • Train "Dépôt" : Ce train quitte son stationnement, va en gare à l'heure dite puis revient à son stationnement.

Chaque train est géré par une fonction du type automate, régie par une variable qui lui est propre.

Cette variable "trainAutomate" peut prendre les valeurs suivantes :

  • 0 : garage.
  • 1 : Accélère.
  • 2 : En route (vitesse stabilisée).
  • 3 : Ralentit (en vue d'un arrêt en gare).
  • 4 : en gare.
  • 5 : accélère.
  • 6 : en route.
  • 7 : ralentit (en vue d'un arrêt au garage).

Ainsi un train dont la consigne est "Tourne" va passer par les états suivants : 0 > 1 > 2 puis rester en 2.

Un train dont la consigne est "Passe" va passer par les état suivants : 0 > 1 > 2 > 3 > 4 > 1 > 2 puis revenir en 3 et 4 si un nouvel arrêt est prévu.

Un train dont la consigne est "Dépôt" va passer pour tous les états de l'automate : 0 > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 0 puis rester au garage.

script

Dans le script ci dessus on voit que le convoi 23 est utilisé deux fois, une fois sous le numéro de train 2365 et une autre fois sous le numéro 2398. La première fois il est programmé en "Passe", la seconde en "Dépôt" de sorte à le renvoyer au garage. D'une façon générale cela n'a pas de sens de laisser tourner les convois aussi je termine toujours la programmation d'un train par une ligne en mode "Dépôt".

Ceci m'amène à dire qu'en fait je n'envisage pas réellement d'utiliser le mode "Tourne". Cela ne coûte rien de le prévoir quand même.

Traitement de l'accélération.

Afin de réaliser des accélération assez douces, l'accélération est gérée à l’aide d’un pas temporel réglée à 2 secondes (constante ajustable au besoin).

A chaque pas de deux secondes la valeur de commande électrique augmente d’une unité jusqu’à atteindre la vitesse maximum définie dans le script (par défaut la valeur 8). Le train est alors dans l’état « en route » et reste à cette valeur jusqu’à ce qu’il soit nécessaire de le ralentir pour gérer une arrivée.

Traitement de la décélération.

Le même pas temporel de 2 secondes est utilisé cependant la décélération est nettement plus complexe à gérer.

En effet, le ralentissement doit être prévu en fonction de la distance à l’arrivée afin de se produire ni trop tôt ni trop tard. Rien ne serait plus moche qu’un train qui s’arrête brutalement.

Lors de la phase de gestion des arrivées, la procédure gérerArrivée dispose de la distance à l’arrivée qui est calculée par la fonction chercheChemin.

Il est souhaitable d’arriver avec une vitesse de l’ordre de 10 cm/sec (quand cela est possible, cela dépend des machines et de leur capacité à fonctionner au grand ralenti).

En fait on va analyser la table des vitesses et retenir la plus petite vitesse disponible, non nulle, pour effectuer l’arrivée.

Par exemple si la table des vitesses est la suivante :

  • convoisDisponiblesConfig(4, 4) = "12"
  • convoisDisponiblesConfig(4, 5) = "25"
  • convoisDisponiblesConfig(4, 6) = "37"
  • convoisDisponiblesConfig(4, 7) = "50"
  • convoisDisponiblesConfig(4, 8) = "62"
  • convoisDisponiblesConfig(4, 9) = "85"
  • convoisDisponiblesConfig(4, 10) = "100"
  • convoisDisponiblesConfig(4, 11) = "120" 'vitesse max en cm/s

La vitesse de 12 cm/sec convient parfaitement. Elle sera appliquée pendant un temps égal à 2 secondes lors de l'arrivée mais juste avant, la vitesse supérieure sera utilisée pendant le même temps, et ainsi de suite.

Si nous sommes au pas de commande « n » (valeur de la commande au moment de l'évaluation de la distance d'arrêt) nous savons évaluer la distance de freinage.

La distance parcourue sera :

  • 2sec x Vmin (le résultat est en cm)
  • 2sec x Vn-2
  • 2sec x Vn-1
  • 2sec x Vn

Nous aurons quelque chose comme :

    For i = min to n

      Distance = 2secondes * V(i)

    Next

A l’aide de ce résultat, comparé à la distance au point d'arrêt, je sais programmer le début de la décélération.

A partir du moment où il est décidé de ralentir, la commande de vitesse est diminuée d'une unité toute les 2 secondes. Autant pour l'accélération il était possible d'aller jusqu'à la vitesse max sans se poser de question, autant ici il ne faut pas aller jusqu'à la commande V1 sans se poser de question. En effet la plupart des convois n'avancent pas à V1. Il faut donc chercher dans la table du convoi la plus petite commande pour laquelle il avance encore, c'est ce que j'appelle Vmin.

Voila comment faire "bouger" mes trains.

La prochaine fois nous reviendrons sur les dispositions qui permettent de protéger un train d'un autre qui le suit.

PhB