Ich hatte einen endlichen Automaten für ein medizinisches Gerät konstruiert. Der FSM war über ein von mir definiertes XML-Format konfigurierbar.
Um eine Zustandsmaschine zu definieren, muss man sich auf die Erfahrung mit der Verwendung von Zustandsdiagrammen bei der Entwicklung digitaler Schaltungen stützen,
Sie müssen eine so genannte Turnpike Transition Map verwenden. An der Ostküste der Vereinigten Staaten tragen die meisten Autobahnen den Spitznamen Turnpikes. Die Mautbehörden geben eine Mautgebührenkarte heraus. Wenn ein mautpflichtiger Abschnitt 50 Ausfahrten hat, würde die Gebührenkarte eine Tabelle mit 50 Zeilen x 50 Spalten enthalten, in der die Ausfahrten sowohl in Zeilen als auch in Spalten vollständig aufgeführt sind. Um die Mautgebühr für die Einfahrt in die Ausfahrt 20 und die Ausfahrt 30 zu ermitteln, suchen Sie einfach den Schnittpunkt von Zeile 20 und Spalte 30.
Bei einem Zustandsautomaten mit 30 Zuständen wäre die Turnpike-Übergangskarte eine 30 x 30 Matrix, in der alle 30 möglichen Zustände zeilen- und spaltenweise aufgelistet sind. Wir entscheiden, dass die Zeilen die AKTUELLEN Zustände und die Spalten die NÄCHSTEN Zustände sein sollen.
Jede sich überschneidende Zelle würde den "Preis" für den Übergang von einem AKTUELLEN Zustand (Zeile) zu einem NÄCHSTEN Zustand (Spalte) auflisten. Anstelle eines einzelnen $-Wertes würde sich die Zelle jedoch auf eine Zeile in der Tabelle "Inputs" beziehen, die wir als "transition id" bezeichnen könnten.
In dem von mir entwickelten FSM für medizinische Geräte gab es Eingaben in Form von String, enums, int usw. Die Tabelle Eingänge listet diese Eingabestimuli spaltenweise auf.
Um die Eingabetabelle zu erstellen, müssen Sie eine einfache Routine schreiben, die alle möglichen Kombinationen von Eingaben auflistet. Aber die Tabelle wäre riesig. In Ihrem Fall hätte die Tabelle 4320 Zeilen und damit 4320 Übergangskennungen. Aber es ist keine langwierige Tabelle, weil Sie die Tabelle programmatisch erstellt haben. In meinem Fall habe ich ein einfaches JSP geschrieben, um die Eingabetabelle der Übergänge (und die Turnpike-Tabelle) im Browser aufzulisten oder als csv herunterzuladen, um sie in MS Excel anzuzeigen.
Es gibt zwei Möglichkeiten, diese beiden Tabellen zu erstellen.
-
die Entwurfsrichtung, in der Sie die Turnpike-Tabelle mit allen möglichen Übergängen konstruieren, wobei nicht erreichbare Übergänge ausgegraut werden. Dann erstellen Sie die Tabelle Eingänge mit allen erwarteten Eingängen für jeden erreichbaren Übergang, wobei die Zeilennummer als Übergangsnummer verwendet wird. Jede Transitions-ID wird in die entsprechende Zelle der Turnpike Transition Map übertragen. Da es sich bei der FSM jedoch um eine spärliche Matrix handelt, werden nicht alle Übergangskennungen in den Zellen der Turnpike-Übergangskarte verwendet. Außerdem kann eine Übergangskennung mehrfach verwendet werden, da dieselben Übergangsbedingungen für mehr als ein Paar von Zustandsänderungen gelten können.
-
die Testrichtung ist umgekehrt, wobei Sie die Tabelle Eingaben erstellen. Sie müssen eine allgemeine Routine für den erschöpfenden Übergangstest schreiben.
Die Routine würde zunächst eine Übergangssequenztabelle lesen, um die Zustandsmaschine in einen Eingangszustand zu bringen und einen Testzyklus zu starten. Bei jedem CURRENT-Zustand ist sie bereit, alle 4320 Übergangskennungen zu durchlaufen. In jeder Zeile der CURRENT-Zustände in der Turnpike-Übergangstabelle gäbe es eine begrenzte Anzahl von Spalten mit gültigen NEXT-Zuständen.
Sie möchten, dass die Routine alle 4320 Zeilen der Eingänge durchläuft, die sie aus der Tabelle Eingänge liest, um sicherzustellen, dass unbenutzte Übergangs-IDs keine Auswirkungen auf einen AKTUELLEN Zustand haben. Sie möchten prüfen, ob alle effektiven Übergangs-IDs gültige Übergänge sind.
Das ist jedoch nicht möglich, denn sobald ein effektiver Übergang eingefügt wird, ändert sich der Zustand der Maschine in einen NÄCHSTEN Zustand und Sie können die restlichen Übergänge nicht mehr auf den vorherigen AKTUELLEN Zustand testen. Sobald die Maschine den Zustand wechselt, müssen Sie mit dem Testen wieder bei Übergangskennung 0 beginnen.
Übergangspfade können zyklisch oder irreversibel sein oder eine Kombination aus zyklischen und irreversiblen Abschnitten entlang des Pfades aufweisen.
Innerhalb Ihrer Prüfroutine benötigen Sie für jeden Zustand ein Register, um die letzte in diesen Zustand gepumpte Übergangskennung zu speichern. Jedes Mal, wenn der Test eine wirksame Übergangskennung erreicht, wird diese in diesem Register gespeichert. Wenn Sie also einen Zyklus abschließen und zu einem bereits durchlaufenen Zustand zurückkehren, beginnen Sie mit der Iteration der nächsten Übergangs-ID, die größer ist als die im Register gespeicherte.
Ihre Routine müsste sich um die irreversiblen Abschnitte eines Übergangspfades kümmern. Wenn eine Maschine in einen Endzustand gebracht wird, startet sie den Test vom Eingangszustand aus neu und wiederholt die 4320 Eingaben der nächsten Übergangskennung, die größer als die für einen Zustand gespeicherte ist. Auf diese Weise könnten Sie alle möglichen Übergangspfade des Automaten erschöpfend ermitteln.
Glücklicherweise sind FSMs spärliche Matrizen effektiver Übergänge, da ein erschöpfendes Testen nicht die gesamte Kombination aus Anzahl der Übergangs-Ids x Anzahl der möglichen Zustände zum Quadrat verbrauchen würde. Schwierig wird es jedoch, wenn man es mit einem alten FSM zu tun hat, bei dem visuelle oder Temperaturzustände nicht in das Testsystem zurückgeführt werden können und man jeden Zustand visuell überwachen muss. Das wäre hässlich, aber wir haben trotzdem zwei Wochen damit verbracht, das Gerät zusätzlich visuell zu testen, indem wir nur die effektiven Übergänge durchlaufen haben.
Möglicherweise benötigen Sie keine Übergangssequenztabelle (für jeden Eintrittspunktzustand, den die Testroutine lesen muss, um die Maschine zu einem gewünschten Eintrittspunkt zu bringen), wenn Ihr FSM es Ihnen ermöglicht, einen Eintrittspunkt mit einem einfachen Reset zu erreichen und die Anwendung einer Übergangskennung ihn einfach zu einem Eintrittspunktzustand bringt. Eine Routine, die in der Lage ist, eine Übergangssequenztabelle zu lesen, ist jedoch nützlich, da man häufig in die Mitte des Zustandsnetzwerks gehen und die Prüfung von dort aus starten muss.
Sie sollten sich mit der Verwendung von Übergangs- und Zustandsdiagrammen vertraut machen, da es sehr nützlich ist, alle möglichen und nicht dokumentierten Zustände einer Maschine aufzuspüren und die Benutzer zu befragen, ob sie diese tatsächlich ausgegraut haben wollen (Übergänge unwirksam und Zustände unerreichbar gemacht).
Der Vorteil, den ich hatte, war, dass es sich um ein neues Gerät handelte und ich die Wahl hatte, den Zustandsautomaten so zu gestalten, dass er XML-Dateien lesen konnte, was bedeutete, dass ich das Verhalten des Zustandsautomaten so ändern konnte, wie ich es wollte, eigentlich so, wie es der Kunde wollte, und ich konnte sicherstellen, dass unbenutzte Übergangskennungen wirklich unwirksam waren.
Für das Java-Listing des Finite-State-Machine-Controllers http://code.google.com/p/synthfuljava/source/browse/#svn/trunk/xml/org/synthful . Testroutinen sind nicht enthalten.
0 Stimmen
Haben Sie zufällig schon All Pairs ausprobiert? Haben Sie eine andere Methode gefunden, die Ihren Ansprüchen genügt?
0 Stimmen
Leider ist mein Arbeitsplan im Moment ziemlich eng - ich sollte diese Woche etwas mehr Zeit haben, um mich damit zu befassen. Derzeit sieht die State Map wie die beste Lösung (h2g2java's), obwohl ich nicht vollständig in alle von ihnen noch untersucht haben.
0 Stimmen
Ich bin mir nicht sicher, ob ich das Konzept der Staatliche Karten (eigentlich habe ich am sicher, dass ich das nicht verstehe)