Auteur Sujet: sous-programme répétitifs  (Lu 8718 fois)

PB

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
sous-programme répétitifs
« le: février 23, 2022, 03:46:52 pm »
Bonjour
j'ais un réseau HO géré par arduino en analogique; ce reseau est constitué de 19 cantons que je peux piloter indépendamment avec différentes commandes et capteurs:
- ajuster la vitesse avec 1 potar
- choisir le sens de circulation ou mettre a l'arret avec interrupteur on/of/on
- des ILS détectent l'arrivée, la sortie et la zone de freinage des trains

j'ais donc 19 fois le meme programme mais avec des capteurs différents!!!!
Serait'il possible d'appeler 1 seul programme avec les capteurs correspondants au cantons
Merci de vos retours

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1717
    • Voir le profil
Re : sous-programme répétitifs
« Réponse #1 le: février 23, 2022, 04:44:43 pm »
Bonjour,

Difficile de répondre sans en savoir un peu plus. Les capteurs se matérialisent comment ? Un numéro de broche ?

Pouvez vous mettre ci-dessous une paire d'exemplaire de vos 19 bouts de programme ? (sans oublier les balises code)
Cordialement

PB

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : sous-programme répétitifs
« Réponse #2 le: février 23, 2022, 05:14:39 pm »
Voici mon programme avec les sous programmes repetitifs aux variables prés

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1717
    • Voir le profil
Re : sous-programme répétitifs
« Réponse #3 le: février 23, 2022, 06:06:55 pm »
Merci

Bon c'est quand même tout à plat tout ça. Il n'y a pas de mystère. Pour moins dupliquer du code, il faut normaliser les données et sans doute passer les constantes en données.

La première chose que je ferais c'est de définir une struct ou une class (mieux) décrivant les objets que vous utilisez. Par exemple certains canton ont un feu rouge donc :

class Feu {
    byte rouge;
    byte orange;
    byte vert;

...
};


Pour les cantons :

class Canton {
    boolean circuler; //memoire inter "autorisation de circuler canton"
    boolean arret; //memoire pas inter "autorisation de circuler canton"
    byte potar;//consigne de vitesse canton
    unsigned long datetempovitesse;
    ...
public:
    Canton(const byte inPotar, ...) : circuler(false), arret(false), potar(inPotar), datetempovitesse(0), ...
    ...
};

Ensuite on instancie autant de cantons que nécessaire.

Canton G1(A0, ...);
Canton C1(A1, ...);

Mutualiser les interruptions doit être faisable mais il faudrait savoir de quelle broche vient l'interruption (ie l'avoir en donnée). Il faudrait faire une version modifiée de PinChangeInt car la version commune fait exactement ce que vous ne voulez pas : distribuer une interruption commune à 8 pins sur 8 fonctions alors qu'il faudrait  récupérer le canton correspondant à la pin et avec un seul code traiter le canton en question.

Une fois les objets canton créés, c'est facile de mutualisme le code des lignes 312 à 419 mais je vois des irrégularité dans l'init du grafcet
438 à 450, idem

Les aiguilles je sais pas, la topologie de votre réseau est câblée en dur dans le code.

Idem, il semble qu'il ait des cas particuliers dans la gestion de chaque canton (j'ai diagonalisé, il y a plus de 1000 lignes de code) mais les différents cantons appartiennent-il à des catégories en nombre limité ? Si oui, en utilisant une classe de base Canton avec une ou plusieurs méthodes virtuelles et une classe dérivée par catégorie permet  de mutualiser la structure du code et d'en écrire un minimum.
« Modifié: février 23, 2022, 06:08:33 pm par Jean-Luc »
Cordialement

PB

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Re : sous-programme répétitifs
« Réponse #4 le: février 23, 2022, 06:27:12 pm »
merci beaucoup Jean LUC
Mais je ne suis pas un "expert" ; il me faudra un peu de temps pour digérer tes explications, je reviens vers toi dés que j'ai absorber ton développement !!!!