Bonsoir à tous
Comme indiqué dans ma présentation, je suis en Ho, mais je me sens bien chez vous !
En quelques lignes mon projet : un réseau avec une boucle externe en os de chien et à l'intérieur les gares voyageurs, triages et stockage.
Mon but est d'automatiser la boucle externe (certains l'appelle voie de parade). Je vais essayer de calquer la réalité, mais parfois pour des raisons pratiques je flirterai avec elle ... Mon but n'est pas de reproduire fidèlement la réalité mais de m'en approcher le plus possible.
Mon, cahier des charges est relativement limité : Six cantons sur la boucle, 2 aiguillages de sortie, 2 aiguillage d'entrée et sur chaque deuxième voie des aiguillages une voie en provenance ou destination des gares internes. (cf PJ (si je peux) pour plus de compréhension ...). Les convois sont préparés sur les gares puis prépositionnés sur les voies d'entrée. L'automate les prend alors en charge ... A noter que pour ce projet les gares internes sont gérées manuellement.
Il est à noter que les voies de sortie et d'entrée devront être gérées en manuel et en automatique (détail dans la suite).
A cet instant je ne me suis pas décidé sur la technologie d'automatisation, pc + cartes d'interface ou pic / arduino ou autres "automates" et pour le Tco c'est itou : un écran de pc (tactile ?) ou un Tco classique avec bascules et poussoir ... Un point est sur je ne suis pas en digital mais bien en analogique dans le sens ou aucun décodeur n'existe dans les locomotives ou autres appareils de voie.
La détection d'occupation de canton ou zone sera réalisée à l'aide de détecteurs à consommation de courant de type DMARRION (cf Dominique sur ce forum) ou en double T (cf site amfn).
L'alimentation des cantons sera soit en PWM soit via des CNA ... Ces deux choix vont dépendre du choix pc ou "automate" ...
Je tiens à remercier tous les contributeurs de forum, site internet en France et à l'étranger chez qui j'ai "piqué" des idées, des trucs ...
Je vous présente l'avancé de mon projet fonction par fonction. Mon but ? Avoir vos remarques et mettre en exergue ce que j'ai pu omettre ...
Je ne vais pas poster en une seule fois tout le projet car le suivi en serait difficile pour tous.
Les fonctions et règles sont généralement explicitées en français (en littéral dirions nous) et parfois complété de pseudo code. Ce pseudo code, très orienté C permet de faire tourner les algorithme. Attention la traduction de certaines règles peuvent introduire des notions "poussées" de programmation.
D'autre part, je travaille souvent en boolean. Ainsi un canton est occupé ou non occupé. Ce qui est dans ma logique différent de occupé ou libre ... Enfin parfois, au lieu de faire des cascades de if, incompréhensibles, j'utilise volontiers les poids binaires (cf plus loin).
Ci-après le logique générale de l'automate (nom que je donne au système) :
Logique générale
Début
Initialisation
Tant que non fin demandée
Lire les détecteurs
Lire le Tco
Si non fin demandée
Mise à jour des signaux en fonction des détecteurs et du Tco
Action sur aiguillages, nécessaire et possible
Calculer les vitesses de consigne
Transmettre instruction au cartes hardware
Fin si
fin tant que
Sortie
Fin
Quelques hypothèses que j'ai pris :
Un canton est composé dans le sens de circulation de :
* un signal à l'entrée
* une zone pleine voie (zp)
* une zone d'arrêt (za)
un Za, Zp ou aiguillage est un segment. Tous les segments sont munis d'un détecteur de consommation de courant.
Les aiguillages pris en pointe font partie du canton qui le précède et c'est un segment après la Za. En théorie aucun convoi ne devrait y stationner
Les aiguillages pris en talon font partie du canton aval et c'est un segment qui précède la Zp. On peut considérer que la Zp est agrandie de la longueur de l'aiguillage.
Afin de vous présenter la suite, quelques explications sur les structures et les variables dans les logiques et pseudo codes (Orienté C of course).
const byte NB_CANTONS = 14;
const byte NB_SEGMENTS = 24;
const boolean OQP = true;
typedef struct {
numero int
etat boolean
} t_segment;
typedef struct {
aig t_segment
talon boolean // true = l'aiguille est prise en talon
devie boolean // true = l'aiguillage est dévié
suivant byte // numéro du canton dévié
} t_aiguillage
typedef struct {
rouge boolean
jaune boolean
vert boolean
} t_signal;
// la structure signal permet de garder le bit de la lampe à allumer
// elle permet d'envoyer directement les 3 bits (sans codage / décodage) vers une interface I/O TTL/CMOS)
typedef struct {
num byte
switch boolean //true c'est un aiguillage
aig t_aiguillage // si switch est vrai alors aig est renseigné
etat boolean // true si za ou zp occupée
za t_segment // zone arret
zp t_segment // zone pleine voie
signal t_signal
signal_svg t_signal
f_vitesse byte // permet de connaître l'algorithme de vitesse à appliquer au canton cf plus bas
} t_canton;
t_canton v_canton[ NB_CANTONS ];
boolean v_etat_detecteur[ NB_SEGMENTS ]; // les détecteurs sont numérotés. v_etat_detecteur[ 0 ] corespond au détecteur physiqe 0, 1 au 1 ...
// Explications sur les variables.
// t_signal
// Un signal est composé de 3 "lampes" Rouge, Jaune et vert. A voir si d'autres "lampes" sont nécessaires.
// Pour le moment, un boolean est affecté à une lampe : true allumée, false éteinte.
// v_etat_detecteur
// Chaque détecteur à un numéro "cablé" qui est le xème élément du tableau v_etat_detecteur.
// les détecteurs sont numérotés. v_etat_detecteur[ 0 ] corespond au détecteur physiqe 0, 1 au 1 ...
// La lecture des détecteurs met à jour ce tableau
// Dans le tableau v_canton, les membres za.num et zp.num font référence à ce numéro.
// Ce qui permet une "certaine" liberté dans le cablage et l'affectation des détecteurs aux Zp et Za des cantons
// f_vitesse : faire référence à la logique/fonction de gestion de la vitesse pour un canton :
// Note : Adapter indique augmenter ou diminuer ...
// ROUGE : indique que l'algorithme doit adapter la vitesse dans la Zp jusqu'à la vitesse de consigne feu ROUGE du canton ou la maintenir si elle est atteinte et mettre à 0 la ZA
// JAUNE : indique que l'algorithme doit adapter la vitesse des Zp et ZA à la vitesse de consigne feu JAUNE du canton ou la maintenir si elle est atteinte
// VERT : indique que l'algorithme doit adapter la vitesse des Zp et ZA à la vitesse de consigne feu VERT du canton ou la maintenir si elle est atteinte
// ARRET : indique que les Zp et Za du canton sont à 0
Initialisation : cette fonction initialise le réseau à un état connu et simple. C'est pourquoi une étape manuelle peut être nécessaire en cas de coupure brutale.
// **** STEP MANUEL
Chaque convoi doit être sur un et un seul canton et dont au moins un essieu (détectable) sur la Za
// ****
Tous les signaux sont positionné au Rouge
Toutes les fonctions f_vitesse sont à ARRET
Lire l'état de tous les détecteurs dans le tableau v_etat_detecteur (cf logique plus bas)
Mise à jour des signaux (cf logique plus bas)
Mise à jour des fonctions f_vitesse pour tous les cantons dont le signal n'est pas ROUGE
A la fin de l'initialisation, les convois sont détectés et les vitesses à 0, les signaux positionnés en fonction de l'occupation réelle.
// Sortie : cette fonction initialise le réseau à un état permettant un redémarrage sans intervention manuelle
Mettre les signaux à R selon possibilité (cf règle plus loin)
Tant que vitesse de consigne de tous les cantons différent de ARRET
Calculer les vitesses de consigne
Transmettre instruction au cartes hardware
fin tant que
//**** STEP MANUEL
Chaque convois doit être sur un et un seul canton et dont au moins un essieu (détectable) sur la Za
// ****
Je m'arrête pour ce soir car je m'aperçois que si ce début est clair dans ma tête, mon écris n'est pas aussi limpide ...
A bientôt pour la suite
Alain
J'ajoute le lien pour le plan du réseau :
https://servimg.com/view/18935398/4