Betriebsarten
Für den Fall, dass es in der SPS programmiert werden soll und es hier nicht 'off topic' ist:
Betriebsarten eines Systems, bei dem nur eine aktiv sein darf programmiere ich am liebsten als Zeiger auf ein Bitfeld. Im ersten Teil des Programms setze ich die Nummer der Betriebsart in ein Merkerwort, dann lösche ich das ganze Bitfeld und schließlich schreibe ich eine logische 1 in das gerade aktive Betriebsmerkerbit.
Wenn die Betriebsart wechselt so wird lediglich das "neue" Bit gesetzt, um das löschen des "alten" Bits braucht man sich nicht zu kümmern, da es beim Löschen des gesamten Bitfelds ohnehin gelöscht wurde.
STEP 7 bietet zwar den Vorteil, dass die Bits und die Worte gemeinsam sind (z.B. jedes MW hat 16 Merker). Leider hat sich SIEMENS aber der von INTEL eingeführten Umkehrung von Highbyte und Lowbyte unterworfen, was die einfachste Sache der SPS Welt etwas undurchsichtig macht:
Im Zentrum steht ein Wort in dem jeder Betriebsart eine Nummer zugeordnet wird. Das könnte z.B. auch jene gemeinsame Variable sein, in die alle 4 Buttons ("Radiobuttons?") geschrieben werden, wie Larry Laffer schreibt
z.B. MW 8:
1 = Hand
2 = Halbautomatik
3 = Vollautomatik
4 = Einrichtbetrieb
.. etc.
Nun legt man die Betriebsartmerker in gleicher Ordnung an, allerdings im HighByte. Im Interesse eines fairen Programmierstils reserviert man die "freien" Bits des unteren Bytes Also z.B.:
M 10.0 Reserve 8
M 10.1 Reserve 9
M 10.2 Reserve 10
M 10.3 Reserve 11
M 10.4 Reserve 12
M 10.5 Reserve 13
M 10.6 Reserve 14
M 10.7 Reserve 15
M 11.0 Reserve 0
M 11.1 Hand
M 11.2 Halbautomatik
M 11.3 Vollautomatik
M 11.4 Einrichtbetrieb
.. etc.
Zunächst schreibt man eine Sequenz mit Netzwerken in denen der jeweilige Betriebszustand gesetzt wird. Wenn Larry Laffer's "Radiobuttons" möglich sind, sinnvoll, wenn manche Betriebszustände nur unter besonderen Voraussetzungen erreichbar sein sollen (z.B. "Chargenende" nur aus Automatikbetrieb heraus). Besonders gut lesbar, wenn solche Verriegelungen in KOP oder FUP geschrieben werden.
Da in einer Wortzelle nur eine Nummer stehen kann, steht am Ende dieser Sequenz fest, welches die aktive Nummer ist, also welche die aktive Betriebsart ist.
Nun werden alle Betriebsmerker zurückgesetzt:
L KW 0 //sämtliche 16 Bits des Akkus auf Null setzen
T MB 10 //die 16 Nullen in das Bitfeld kopieren,
//also alle Betriebsmerker löschen
und gleich darauf eine log. 1 relativ auf den indizierten Betriebsmerker schreiben:
L MW 8 //Betriebsartnummer als Zeiger in das Bitfeld der Betriebsartenmerker
LAR1 //Adressregister 1 als Index für den folgenden Schreibzugriff
SET //Bitakku (VKE) auf 'high' setzen
= M[AR1, P#10.0]
(*)
Falls beim Umschalten der Betriebsart Zustände (z.B. Zeiten und Zähler) zurückgesetzt werden sollen, so kann direkt vor dem Rücksetzen der Betriebsmerker eine Sequenz eingefügt werden, die einen Wechsel der Betriebszustandsnummer erkennt und die Zustände löscht.
Konsistenz:
Die kurze Unterbrechung zwischen dem Löschen der Betriebsmerker und dem relativen Setzen des aktuellen Betriebszustandsmerkers werden von allen Programmen der gleichen Task (z.OB 1) nicht "bemerkt".
Problematisch kann das bei parallel laufenden Tasks, wie z.B. Interrupt oder OB 30 werden.
Falls man in diesen Parallelprogrammen überhaupt auf Betriebsmerker zugreifen muß kann man sich mit Spiegelmerkern behelfen:
Das oben vorgeschlagene Merkerfeld von M 10.0 bis M 11.7 ist lediglich ein internes (Spiegel-) Merkerfeld. Das allgemeingültige Merkerfeld befindet sich z.B. von M 20.0 bis M 21.7.
Direkt nach der letzten Anweisung im obigen Beispiel wird umkopiert:
L MW 10
T MW 20
Schlägt nun ein Interrupt genau zwischen den beiden obigen Anweisungen zu so "sieht" er noch den alten Zustand der Betriebsmerker.
Kommt der Interrupt während der Anweisung T MW 20, so muß er warten bis die Anweisung fertig ausgeführt ist und "sieht" dann den neuen Zustand der Betriebsmerker. Es wird aber nie geschehen, dass keiner der Betriebsmerker gesetzt ist, während des Interruptprogramms
Der ganz große Vorteil dieser Programmiermethode ist, dass man vorwärts orientiert schreiben kann, und dass man die Netzwerke freihält von internen Querverriegelungen. Da z.B. nur entweder "Hand" oder "Auto" sein kann, sind gegenseitige Verriegelungen überflüssig. Ebenso kann nachträglich relativ einfach ein neuer Betriebszustand z.B. "Schichtende" eingefügt werden: Es genügt nur, das Netzwerk zu programmieren, das zu diesem Betriebszustand führt, und dann die entsprechende Nummer in MW8 schreibt.
Ein besonderer Vorteil besteht für Freunde der S7 "SPL" Anweisung: Das Byte zur Steuerung der Sprungliste steht bereits in MB 9!
Nun habe ich einige kryptische Dinge geschrieben, 'mal sehen ob überhaupt Interesse an einer weiteren Erläuterung besteht... *gähn* morgen ist ein Arbeitstag und ich muß in die Falle.
bis demnächst,
BFlat
der bald flach liegt
*sorry, mehrfache Leerzeichen oder gar ein TAB zur besseren Lesbarkeit der AWL läßt das Forum nicht zu