Auteur Sujet: Modlisation logicielle d'un rseau - le systme de Pierre59  (Lu 15628 fois)

Pierre59

  • Full Member
  • ***
  • Messages: 127
    • Voir le profil
Modlisation logicielle d'un rseau - le systme de Pierre59
« le: mai 31, 2015, 11:28:07 am »

Pierre59

  • Full Member
  • ***
  • Messages: 127
    • Voir le profil
Re : Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #1 le: juin 16, 2015, 05:23:56 pm »
class Zone {
  boolean etat; // etat de la Zone (libre ou occupee)
public:
  boolean libre() { return !etat; }
};

class Aiguille {
public:
  boolean directer() { /* commande de l'aiguille */ return true; }
  boolean devier()   { /* commande de l'aiguille */ return true; }
};

class Signal {
public:
  boolean ouvrir() { /* commande du signal */ return true; }
  boolean fermer() { /* commande du signal */ return true; }
} ;

Puis quelques variables :

TB iTB; TD iTD; BT iBT; DT iDT; // itineraires
Zone za,zb,zc; // zones
Aiguille a1,a2,a3; // aiguilles
Signal s1,s2,s3; // signaux
class Itineraire { // classe de base des itineraires
  byte etat; // l'etat de l'itineraire (libre, en attente, forme, ... )

public:
  boolean libre() { return etat==0; }
  boolean formation()    { if (formable()) return former(); else return false; }
  boolean destruction() { if (deformable()) return deformer(); else return false; }
   
protected:
  virtual boolean formable();
  virtual boolean former();
  virtual boolean deformable();
  virtual boolean deformer();
 
// methodes utilitaires
protected:
  boolean libre(Zone &a) { return a.libre(); }
  boolean libres(Zone &a,Zone &b) { return a.libre() && b.libre(); }
  boolean libres(Zone &a,Zone &b,Zone &c) { return a.libre() && b.libre()&& c.libre(); }
  boolean libres(Zone &a,Zone &b,Zone &c,Zone &d) { return a.libre() && b.libre() && c.libre() && d.libre(); }
  // ...
  boolean libre(Itineraire &a) { return a.libre();
  boolean libres(Itineraire &a,Itineraire &b) { return a.libre() && b.libre(); }
  boolean libres(Itineraire &a,Itineraire &b,Itineraire &c) { return a.libre() && b.libre()&& c.libre(); }
  boolean libres(Itineraire &a,Itineraire &b,Itineraire &c,Itineraire &d) { return a.libre() && b.libre() && c.libre() && d.libre(); }
   // ...
  };
class TC:public Itineraire { // un itineraire particulier de T vers C
  virtual boolean formable() { return
    libres(iTB,iTD,iBT,iDT) && // enclanchements entre itineraires
    libres(za,zb,zc); // enclanchements sur les zones
  }
  virtual boolean former() { return a1.devier() && a2.directer() && s1.ouvrir(); }
  virtual boolean deformable() { return libres(za,zb,zc); }
  virtual boolean deformer() { return s1.fermer(); }
};

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re : Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #2 le: juin 16, 2015, 07:45:28 pm »

Pierre59

  • Full Member
  • ***
  • Messages: 127
    • Voir le profil
Re : Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #3 le: juillet 06, 2015, 05:03:03 pm »

typedef unsigned int typeFeux;

enum Feu {E=0,Vl=1,A=2,S=4,C=8,R=16,RR=32,M=64,Cv=128,D=256};

   
class Signal {
protected:
  typeFeux feu=E; // 16 cas possibles (16 bits)
public:
  virtual boolean ouvrir() { /* commande du signal */ return true; }
  virtual boolean fermer() { /* commande du signal */ return true; }
  boolean aubiner() {  return fermer();  }

  boolean ferme() { return feu&(S|C|Cv); }
  boolean v30() { return feu&RR; } // vitesse 30
  boolean r30() { return feu&A|R; } // ralentissement a 30
  };

  virtual typeFeux feux() { return E; }
  virtual void maj() {}
 
  virtual Signal* suivant() { return NULL; }
  virtual Signal* precedent() { return NULL; }
  virtual boolean occupe() { return false; } // occupation du canton

// methodes utilitaires
  Signal* selon(Aiguille &a,Signal &s1,Signal &s2) { return a.directe()?&s1:&s2; }

  boolean occupee(Zone &z) { return z.occupee(); }
  boolean occupees(Zone &z1,Zone &z2) { return z1.occupee() || z2.occupee(); }
  boolean occupees(Zone &z1,Zone &z2,Zone &z3) { return z1.occupee() || z2.occupee() || z3.occupee(); }
};

class CarreViolet:public Signal {
  boolean ouvrir() { feu=M;  /* commande signal */ return true; }
  boolean fermer() { feu=Cv;  /* commande signal */ return true; }
};

CarreViolet cv5;

class Carre:public Signal {
  boolean ouvrir() { feu=feux(); precedent()->maj(); /* commande signal */ return true; }
  boolean fermer() { feu=C; precedent()->maj(); /* commande signal */ return true; }

  typeFeux feux() { // feux a l'ouverture
    if (suivant()->ferme()) return A; else return Vl;
  }

  void maj() { typeFeux f; // appele par le signal suivant
    if (ferme()) return; // pas de propagation si pas de changement
    f=feux(); if (f!=feu) { feu=f; precedent()->maj(); }
  }
};

class C2:public Carre {
  virtual Signal* suivant() { return selon(a2,s1,s3); } // selon a2
  virtual Signal* precedent() { return &s1; }
};

class Semaphore:public Signal {
  boolean ouvrir() { feu=feux(); precedent()->maj(); /* commande signal */ return true; }
  boolean fermer() { feu=S; precedent()->maj(); /* commande signal */ return true; }

  typeFeux feux() { // feux a l'ouverture
    if (occupe()) return S; else // canton occupe ( precaution )
    if (suivant()->ferme()) return A; else return Vl;
  }

  void maj() { typeFeux f; // appele par le signal suivant
    if (ferme()) return; // pas de propagation si pas de changement
    f=feux(); if (f!=feu) { feu=f; precedent()->maj(); }
  }
};

class S2:public Semaphore {
  virtual Signal* suivant() { return &s2; }
  virtual Signal* precedent() { return &s1; }
  virtual boolean occupe() { return occupees(za,zb,zc); } // occupation du canton (3 zones)
};

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re : Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #4 le: juillet 10, 2015, 12:22:01 am »

Pierre59

  • Full Member
  • ***
  • Messages: 127
    • Voir le profil
Re : Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #5 le: juillet 11, 2015, 11:57:50 am »
Citer
chaque zone (ou canton, mais une zone peut inclure une aiguille, pas un canton normalement)
Citer
est-il possible de montrer un exemple simple ?
Citer

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re: Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #6 le: novembre 18, 2015, 06:55:55 pm »
Etape 1 : les classes prototypes (copier-coller du code de Pierre). ///////////// PROTOTYPE CLASSE AIGUILLE ////////////////////

class Aiguille {
private:
  byte index;             // 0.. MaxAIG-1
  boolean etat=true;      // directe (true) ou deviee false)
  Zone* zone;             // la Zone ou est l'aiguille

public:
 
  Aiguille(byte a_index, Zone* z) { // constructeur
    index = a_index;
    zone=z; 
  }
 
  boolean directer() {     // commande de l'aiguille en position directe
    this->etat=true;
    output.id = 0x40;
    output.length = 1;
    output.data.bytes[0] = this->index + 0xC0;
    Can0.sendFrame(output);
    return true;
  }
 
  boolean devier()   {     // commande de l'aiguille en position dvie
    this->etat=false;
    output.id = 0x40;
    output.length = 1;
    output.data.bytes[0] = this->index + 0x80;
    Can0.sendFrame(output);
    return true;
  }
 
  boolean directe() {     // demande d'tat
    return this->etat;
    } // mthode utilitaire};
};

////////////////// PROTOTYPE CLASSE ZONE ////////////////////

class Zone {
public:
  byte index;           // 0.. MaxZone-1
  boolean etat;         // libre ou occup
  Signal* signalPair;
  Signal* signalImpair; // les signaux ventuels de la zone

  Zone(byte a_index, Signal* sp, Signal* si) { // constructeur
    index = a_index;
    signalPair=sp;
    signalImpair=si; }
   
   virtual Zone* suivantePaire() { return NULL; } // la zone suivante paire (ventuellement vide)
   virtual Zone* suivanteImpaire() { return NULL; } // la zone suivante impaire (ventuellement vide)

   virtual void actions() {} // les actions spcifiques faire en cas d'occupation
   virtual void desactions() {} // les actions spcifiques faire en cas de libration

   boolean occupee() { return etat; } // mthode utilitaire
   boolean libre() { return !etat; } // mthode utilitaire

   void occuper() { // appele par la rtrosignalisation
      // fait tout ce qu'il y a faire en cas d'occupation (actions communes toutes les zones)
      actions(); // fait les actions spcifiques une zone
   }
   void liberer() { // appele par la rtrosignalisation
      // fait tout ce qu'il y a faire en cas de libration (actions communes toutes les zones)
      desactions(); // fait les actions spcifiques une zone
   }

   Zone* selonAiguille(Aiguille* a,Zone* z1,Zone* z2) { return a->directe()?z1:z2; } // mthode utilitaire
};



////////////// HERITAGES CLASSES ZONES REELLES ////////////////////
// les zones reelles (hritages de Zone)

// 0 gare base loisirs (pair/droite= 1 impair/gauche=0=butoir)
class Z0 : public Zone { // 0 gare base loisirs (pair/droite= 1 impair/gauche=0=butoir)
public:
  Z0(byte ai, Signal* sp, Signal* si):Zone(ai,sp,si) {}
  virtual Zone* suivantePaire();
  virtual Zone* suivanteImpaire();
};
// 1 VV centre (pair/droite=2, impair/gauche=0)
class Z1 : public Zone { // 1 VV centre (pair/droite=2, impair/gauche=0)
public:
  Z1(byte ai, Signal* sp, Signal* si):Zone(ai,sp,si) {}
  virtual Zone* suivantePaire();
  virtual Zone* suivanteImpaire();
};
// 2 liaison VV-Hor (pair/droite=3siPdroite, impair/gauche=1+aiguillePdevi=4)
class Z2 : public Zone {
public:
  Z2(byte ai, Signal* sp, Signal* si):Zone(ai,sp,si) {}
  virtual Zone* suivantePaire();
  virtual Zone* suivanteImpaire();
};
// 3 gare centre (droite/pair=3=butoir, gauche/impair=2)
class Z3 : public Zone {
public:
  Z3(byte ai, Signal* sp, Signal* si):Zone(ai,sp,si) {}
  virtual Zone* suivantePaire();
  virtual Zone* suivanteImpaire();
};
etc

/////////////////// DECLARATIONS ZONES ////////////////////
// zones
Zone* z0=new Z0(0,NULL,s2);
Zone* z1=new Z1(1,NULL,s2);
Zone* z2=new Z2(2,NULL,NULL);
Zone* z3=new Z3(3,s2,NULL);
Zone* z4=new Z4(4,s2,c2);
Zone* z5=new Z5(5,s2,c2);
Zone* z6=new Z6(6,s2,c2);
Zone* z7=new Z7(7,s2,c2);
Zone* z8=new Z8(8,s2,c2);
Zone* z9=new Z9(9,s2,c2);
etc

const int MaxZone = 40;

Zone* listez[MaxZone]=  {
    z0, z1, z2, z3, z4, z5, z6, z7, z8, z9, z10, z11, z12, z13, z14, z15,
    z16, z17, z18, z19, z20, z21, z22, z23, z24, z25, z26, z27, z28, z29, z30,
    z31, z32, z33, z34, z35, z36, z37, z38, z39
  };

/////////////////// DECLARATIONS AIGUILLES //////////////////// 
// aiguilles
Aiguille* a0=new Aiguille(0,z26);  //A
Aiguille* a1=new Aiguille(1,z26);  //B
Aiguille* a2=new Aiguille(2,z15);  //C
Aiguille* a3=new Aiguille(3,z26);  //D
Aiguille* a4=new Aiguille(4,z15);  //E
Aiguille* a5=new Aiguille(5,z14);  //F
Aiguille* a6=new Aiguille(6,z14);  //G
Aiguille* a7=new Aiguille(7,z12);  //H
Aiguille* a8=new Aiguille(8,z12);  //I
Aiguille* a9=new Aiguille(9,z29);  //J
Aiguille* a10=new Aiguille(10,z38); //K
Aiguille* a11=new Aiguille(11,z29); //L
Aiguille* a12=new Aiguille(12,z39); //M
Aiguille* a13=new Aiguille(13,z6); //N
Aiguille* a14=new Aiguille(14,z35); //O
Aiguille* a15=new Aiguille(15,z2); //P
Aiguille* a16=new Aiguille(16,z4); //Q
Aiguille* a17=new Aiguille(17,z17); //R
Aiguille* a18=new Aiguille(18,z24); //S
Aiguille* a19=new Aiguille(19,z37); //T TJD demi a5 vers deviation
Aiguille* a20=new Aiguille(20,z37); //U TJD demi a6 vers deviation

const int MaxAig = 21;
 
Aiguille* listea[MaxAig]= {
  a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
  a12, a13, a14, a15, a16, a17, a18, a19, a20
};

selonAiguille(Aiguille* a,Zone* z1,Zone* z2) { return a->directe()?z1:z2; }
et cela donne :

///////////////////// METHODES PARTICULIERES DES ZONES ///////////////////////
// les methodes des zones

// Z0 gare base loisirs (pair/droite= z1 impair/gauche=butoir)
Zone* Z0::suivantePaire() { return z1; }
Zone* Z0::suivanteImpaire() { return NULL; }

// 1 VV centre (pair/droite=2, impair/gauche=0)
Zone* Z1::suivantePaire() { return z2; }
Zone* Z1::suivanteImpaire() { return z0; }

// 2 liaison VV-Hor (pair/droite=3, impair/gauche=1+aiguillePdevi=4)
Zone* Z2::suivantePaire() { return selonAiguille(a15,z3,NULL); }
Zone* Z2::suivanteImpaire() { return selonAiguille(a15,z1,selonAiguille(a16,NULL,z4)); }

// 3 gare centre (droite/pair=3=butoir, gauche/impair=2)
Zone* Z3::suivantePaire() { return NULL; }
Zone* Z3::suivanteImpaire() { return z2; }

// 4 GC Hor Ext (pair=6+aiguilleQdevi=2, impair=17)
Zone* Z4::suivantePaire() { return selonAiguille(a16,selonAiguille(a13,NULL,z7),selonAiguille(a15,NULL,z3)); }
Zone* Z4::suivanteImpaire() { return selonAiguille(a17,NULL,z16); }

// 5 GC Hor Int (pair=6, impair=17)
Zone* Z5::suivantePaire() { return selonAiguille(a13,z7,NULL); }
Zone* Z5::suivanteImpaire() { return selonAiguille(a17,z16,NULL); }

// 6 sortie GC Hor (pair=7, impair=5+aiguilleNdevi=4) - Normalement pas utilis
Zone* Z6::suivantePaire() { return z7; }
Zone* Z6::suivanteImpaire() { return selonAiguille(a13,z5,selonAiguille(a16,z4,NULL)); }

etc..

Tests et Simulations

- menus Aiguilles :  je peux positionner chaque aiguille

zonedepart = 5;
        Show("5 ");
        zindex = 5;
        for (int i=0; i<10; i++)  {
          zt = senstrain? listez[zindex]->suivantePaire() : listez[zindex]->suivanteImpaire();
          if (zt == NULL) break;
          zindex = zt->index;
          tft.print(zindex);
          tft.print(" ");
        }

« Modifié: mai 07, 2016, 06:30:23 pm par Dominique »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re : Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #7 le: novembre 18, 2015, 07:05:39 pm »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re : Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #8 le: mars 11, 2016, 12:48:07 pm »
Pour illustrer l'article de Pierre : " http://www.locoduino.org/spip.php?article154suivantePaire() et suivanteImpaire()PRS1_DB1 v0.1 du 11 mars 2016
Toutes les aiguilles sont droites
aiguilles 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
          1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
>
> A 0
aiguilles 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
          0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
> I 13
Itineraires sens horaire a partir de 13->15->16->17->5->6->7->8->9->10->11->12->13->boucle

I n < (ret) : idem en sens inverse (anti-horaire)
> I 13 <
Itineraires sens trigo a partir de 13->12->11->10->9->8->7->6->5->17->16->15->13->boucle
> I 40
Itineraires sens horaire a partir de 40->0->1->2->3->41->fin
« Modifié: mars 11, 2016, 12:57:18 pm par Dominique »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re : Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #9 le: mars 11, 2016, 10:52:27 pm »
http://forum.locoduino.org/index.php?topic=91.msg650#msg650

// 0 gare quai droit (zone paire = z2 si a0 droite, impaire = z5 si a1 droite)
Zone* Z0::suivantePaire() { return selonAiguille(a0,z2,NULL); }
Zone* Z0::suivanteImpaire() { return selonAiguille(a1,z5,NULL); }
/* si on accepte de passer les aiguilles en entrant par un talon, quelle que soit leur position
 * alors on peut dfinir ces methodes comme :
 * Zone* Z0::suivantePaire() { return z2; }
 * Zone* Z0::suivanteImpaire() { return z5; }
 */

// 1 gare quai gauche (zone paire = z2 si a0 devie, impaire = z5 si a0 dvie)
Zone* Z1::suivantePaire() { return selonAiguille(a0,NULL,z2); }
Zone* Z1::suivanteImpaire() { return selonAiguille(a1,NULL,z5); }
/* si on accepte de passer les aiguilles en entrant par un talon, quelle que soit leur position
 * alors on peut dfinir ces methodes comme :
 * Zone* Z1::suivantePaire() { return z2; }
 * Zone* Z1::suivanteImpaire() { return z5; }
 */

// 2 aiguille a0 (zone paire = z3, impaire = z0 si a0 droite ou z1 si a0 devie)
Zone* Z2::suivantePaire() { return z3; }
Zone* Z2::suivanteImpaire() { return selonAiguille(a0,z0,z1); }

// 3 boucle est (zone paire = z4, impaire = z2)
Zone* Z3::suivantePaire() { return z4; }
Zone* Z3::suivanteImpaire() { return z2; }

// 4 boucle ouest (zone paire = z5, impaire = z3)
Zone* Z4::suivantePaire() { return z5; }
Zone* Z4::suivanteImpaire() { return z3; }

// 5 aiguille a1 (zone paire = z0 si a1 droite ou z1 si a1 dvie, impaire = z4)
Zone* Z5::suivantePaire() { return selonAiguille(a1,z0,z1); }
Zone* Z5::suivanteImpaire() { return z4; }

Pierre59

  • Full Member
  • ***
  • Messages: 127
    • Voir le profil
Re: Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #10 le: octobre 04, 2016, 10:18:48 am »
http://www.locoduino.org/spip.php?article172http://forum.locoduino.org/index.php?topic=119.15 ), pour plus d'informations sur le TCO.

Bon amusement.

Pierre59
« Modifié: octobre 04, 2016, 10:24:02 am par Pierre59 »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil

DDEFF

  • Sr. Member
  • ****
  • Messages: 460
    • Voir le profil
Re: Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #12 le: octobre 06, 2016, 12:53:28 pm »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1524
  • 100% Arduino et N
    • Voir le profil
Re: Modlisation logicielle d'un rseau - le systme de Pierre59
« Réponse #13 le: décembre 06, 2016, 06:17:22 pm »
suivantePaire() et suivanteImpaire() des objets Zone.

jusqu'au bouthttp://www.locoduino.org/spip.php?article153 :
C'est vraiment le chef d'orchestre en haut de son estrade qui dirige les musiciens ! :
http://www.locoduino.org/spip.php?article154
http://www.locoduino.org/spip.php?article167
http://www.locoduino.org/spip.php?article172loopLa loop contiendra donc un grand switch pour traiter tous les cas, et on sait bien que l'on peut facilement rajouter d'autres cas par la suite : quelle souplesse cet Arduino !

Pierre59

  • Full Member
  • ***
  • Messages: 127
    • Voir le profil