summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/automate/grafcet.cc
diff options
context:
space:
mode:
Diffstat (limited to '2003/i/buzz/src/automate/grafcet.cc')
-rw-r--r--2003/i/buzz/src/automate/grafcet.cc83
1 files changed, 82 insertions, 1 deletions
diff --git a/2003/i/buzz/src/automate/grafcet.cc b/2003/i/buzz/src/automate/grafcet.cc
index b2af52e..045b61f 100644
--- a/2003/i/buzz/src/automate/grafcet.cc
+++ b/2003/i/buzz/src/automate/grafcet.cc
@@ -29,7 +29,7 @@ Grafcet::Grafcet (const char *filename)
// Destructeur.
Grafcet::~Grafcet ()
{
- for (vector<GrafcetElem>::iterator i = m_grafcet.begin ();
+ for (vector<Elem>::iterator i = m_grafcet.begin ();
i != m_grafcet.end (); ++i)
{
switch (i->type)
@@ -50,5 +50,86 @@ Grafcet::~Grafcet ()
}
}
+// Lance l'execution d'un pas, c'est à dire, retourne le plus vite
+// possible.
+void
+Grafcet::run (void)
+{
+ // Parcours le programme et évalue les receptivitées.
+ int e = 0; // Étape courante.
+ vector<Elem>::const_iterator i;
+ for (i = m_grafcet.begin (); i != m_grafcet.end ();)
+ {
+ switch (i->type)
+ {
+ case etape:
+ e = i->elem.etape->num;
+ ++i;
+ break;
+ case receptivite:
+ if (m_active_etapes[e] == active && i->elem.receptivite->test ())
+ {
+ m_active_etapes[e] = stop;
+ for (++i; i != m_grafcet.end () && i->type == transition; ++i)
+ {
+ int g = i->elem.transition->num;
+ m_active_etapes[g > 0 ? g : -g] = g > 0 ? start : stop;
+ }
+ }
+ break;
+ case action:
+ case transition:
+ ++i;
+ break;
+ }
+ }
+ // Arète les actions en stop.
+ for (i = m_grafcet.begin (); i != m_grafcet.end ();)
+ {
+ if (i->type == etape)
+ {
+ e = i->elem.etape->num;
+ if (m_active_etapes[e] == stop)
+ {
+ for (++i; i != m_grafcet.end () && i->type == action; ++i)
+ i->elem.action->stop ();
+ }
+ m_active_etapes[e] = inactive;
+ }
+ else
+ ++i;
+ }
+ // Initialise les actions pour les etapes en start.
+ for (i = m_grafcet.begin (); i != m_grafcet.end ();)
+ {
+ if (i->type == etape)
+ {
+ e = i->elem.etape->num;
+ if (m_active_etapes[e] == start)
+ {
+ for (++i; i != m_grafcet.end () && i->type == action; ++i)
+ i->elem.action->start ();
+ }
+ m_active_etapes[e] = active;
+ }
+ else
+ ++i;
+ }
+ // Fait fonctionner les actions.
+ for (i = m_grafcet.begin (); i != m_grafcet.end ();)
+ {
+ if (i->type == etape)
+ {
+ e = i->elem.etape->num;
+ if (m_active_etapes[e] == active)
+ {
+ for (++i; i != m_grafcet.end () && i->type == action; ++i)
+ i->elem.action->run ();
+ }
+ }
+ else
+ ++i;
+ }
+}
} // namespace Automate