1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#region TimeOut
// Affichage en cas de défaut
private delegate void MonText(String textDefaut, Color c);
private void AfficheDefaut(String textDefaut, Color c)
{
tbInfo.Clear();
tbInfo.ForeColor = c;
tbInfo.AppendText(textDefaut + "\n");
}
private Boolean TimeOut(object wd) // Retourne true si le temps est dépassé
{
WatchDog w = (WatchDog)wd;
return w.Elapsed;
}
#endregion TimeOut
#region Etape1 Grafcet
private void Etape1(bool[] etat)
{
bool chgtEtat = false;
WatchDog wd = new WatchDog(5000); // Lance un timer de 5 secondes
while (!chgtEtat && !TimeOut(wd))
{
if (e1) // variable entrée N°1
{
chgtEtat = true;
etat[1] = true;
}
s1 = true; // variable sortie n°1
etat[0] = true; // état sortie activée
}
if (TimeOut(wd))
etat[2] = true; // état temps dépassé
etat[3] = true; // état terminé
AffichageLed(); // Visualisation des leds entrées sorties
wd.Kill(); // arrêt timer
}
#endregion Etape1
#region Etape2
private void Etape2(bool[] etat)
{
// idem étape 1 avec des entrées sorties différentes
}
#endregion Etape2
//Boucle du cycle
private Thread[] Etape = new Thread[10]; // Déclaration tableau de 10 thread
private void GestionCycle()
{
stopCycle = false;
while (!stopCycle)
{
// Départ Cycle
if (departCycle) // Si condition de départ
{
departCycle = false;
// J'ai besoin de votre analyse sur cette partie region Etape 1 & 2
#region Etape 1 & 2
// Thread Etape 1
bool[] etat1 = new bool[4]; // tableau état de la méthode Etape1
Etape[1] = new Thread(() => { Etape1(etat1); });
Etape[1].Start();
//Etape 2
bool[] etat2 = new bool[4];
Etape[2] = new Thread(() => { Etape2(etat2); });
Etape[2].Start();
while (!etat1[2] && !etat1[3]) { } // attente de la fin de lexécution étape 1
while (!etat2[2] && !etat2[3]) { } // attente de la fin de lexécution étape 2
Etape[1].Abort(); // Suppression thread
Etape[2].Abort(); // Suppression thread
// Affichage si défaut
if (etat1[2])
Invoke(new MonText(AfficheDefaut), "Erreur Etape 1 !!", Color.Red);
if (etat2[2])
Invoke(new MonText(AfficheDefaut), "Erreur Etape 2 !!", Color.Red);
#endregion Etape 1 & 2
// et ainsi de suite pour les autres étapes. ..........................
}
Thread.Sleep(100); // attente 100 ms
} |
Partager