# Simples C-Skript



## cyrix (23 November 2010)

Hi, da meine C-Programmier-Zeiten schon ne ganze Weile her sind muss ich euch bei diesem simplen C-Skript um Hilfe bitten ...

Ich habe eine Maschine, welche mit 4 versch. Betriebszuständen (1, 2, 3 und 4) laufen kann. Wenn ich über das OP einen anderen Zustand auswähle, z.B. von 2 auf 1, möchte ich das 2 resettet wird. Ist es jetzt am günstigsten sowas in einem OP zu realisieren, oder sollte sowas besser in dem AG passieren?

Könntet ihr mir einen Tipp geben, wie der entspr. Quelltext aussehen muss?


----------



## rostiger Nagel (23 November 2010)

Betriebsarten gehören in der Steuerung gegeneinander verriegelt.

Was hast du den für Hardware, das dein OP mit C projektiert wird?


----------



## cyrix (23 November 2010)

Sütron TP151T ... ich muss zugeben (mein Fehler!), dass ich mir das noch nicht genauer angesehen habe und da dort Skript steht habe ich auf C geschlossen!

hast du n Tipp für mich wie ich die gegeneinander verriegele und gleichzeitig so einstelle das es zu resetten geht?

Ich sollte evtl. dazusagen das ich hier nicht mit Schaltern, sondern mit Tastern auf dem OP arbeiten möchte!


----------



## Larry Laffer (23 November 2010)

Hallo,
unabhängig von der Programmiersprache würde ich diese Verriegelung erstmal in der Visu zu machen versuchen. Hast du ein Event oder etwas ähnliches, dass durch den Druck der jeweiligen Schaltfläche ausgelößt wird ? Schreibst du mit allen 4 Schaltflächen in die gleiche Variable oder unterschiedliche ?

Gruß
Larry


----------



## cyrix (23 November 2010)

Für jeden Modus gibt es ein eigenes Status-Bit und ich kann ein Skript auführen lassen, sobald die Taste gedrückt würd ... Allerdings scheitert es ja gerade an eben diesem ... 

also zu beidem "Ja" ...


----------



## BFlat (8 Dezember 2010)

*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


----------



## PN/DP (9 Dezember 2010)

*[CODE] ... [/CODE]-Tags*



BFlat schrieb:


> *sorry, mehrfache Leerzeichen oder gar ein TAB zur besseren Lesbarkeit der AWL läßt das Forum nicht zu


Dafür gibt es die [CODE]-Tags (im Beitrags-Editor mit dem #-Button einfügbar). Dann werden mehrfache Leerzeichen korrekt angezeigt und es wird automatisch die Schriftart Courier New verwendet, wo alle Zeichen gleich breit sind:

```
L     MW 10
      T     MW 20
```

Harald


----------

