# Schrittketten überwachen



## mitchih (11 Oktober 2008)

Hallo,

entweder bin ich zu blöd die Suchfunktion zu benutzen oder das Thema gibt es hier noch nicht

Ich möchte meine Schrittketten überwachen, und zwar die Dauer der Schritte. Es handelt sich um eine vollautomatische Förderanlage.

Nun soll z.B. wenn S1 gestartet ist nach max. 10 s S2 aktiviert sein und nach 6 sec. S3 usw...

Programmiert habe ich die SK mit Sprungmarken


```
L Schrittnummer
L 1
==I
SPB S001
TAK
L 2
== I
SPB S002
SPA ENDE
 
S001: Aktionen Schritt 1
 
S002: Aktionen Schritt 2
```
 
Nun  möchte ich aber nicht für jede Schrittkette so viele Timer verwenden.
Hat jemand eine Idee dieses möglichst optimal zu lösen??


----------



## Ralle (11 Oktober 2008)

Na ja, für meine Schrittketten hat es bisher immer gereicht, die gesamte SK auf Maximalzeit zu überwachen, wobei ich noch eine Möglichkeit habe, in Schritten diese Überwachung anzuhalten, wenn ich auf etwas warten muß, z.Bsp. Material. In deinem Falle geht das so nicht. Ich würde mit einen kleinen FC bauen (ein Zähler tuts auch). Dieser wird einmal vor of´der hinter der SK aufgerufen. Als IN einen 100ms-Zakt von der SPS eine Freigabe, eine Zählwert-Variable, als INOUT eine Zählwertspeicher-Variable, eine Fehlervariable.

In deinen Schritten lädst du einfach einen Wert in die Zählwertvariable, z.Bsp. 100 für 10 Sekunden und schaltest die Freigabe auf True. Der FC macht folgendes:

1. Nachsehen, ob der Zählwert sich ändert
   wenn ja, Zählwert in Zählwertspeicher kopieren
   wenn nein, umspringen

2. mit jedem 100s-Takt und bei Freigabe 0 True, Zählwertspeicher um 1 
    runterzählen

3. Vergleichen, ob der Zählwertspeicher <=0 und Freigabe = True
   wenn ja, Fehlermeldung setzen
   wenn nein, umspringen

So in etwa vielleicht. Da brauchst du nicht mit Timern hantieren, in den Schritten lädst du nur die gewünschten Zeiten als X * 100ms -Integer und die Freigabe erlaubt dir, die Überwachung zu starten, stoppen, etc.

PS: Wenn du das mit den Sprüngen so machst, schu dir mal den Befehl SPL in Step7 an da geht das mit weniger Aufwand und m.E. schön übersichtlich.

Außerdem:

Aktionen:


```
S001: SET

mach was 1
mach was 2

L 100 (10 Sek)
T #Zählwertspeicher
S FRG_Zeit
SPA ENDE

S002: SET

mach was 1
mach was 2

L 100 (10 Sek)
T #Zählwertspeicher
S FRG_Zeit
SPA ENDE

ENDE: NOP 0
```


----------



## mitchih (11 Oktober 2008)

Ralle schrieb:


> Na ja, für meine Schrittketten hat es bisher immer gereicht, die gesamte SK auf Maximalzeit zu überwachen, wobei ich noch eine Möglichkeit habe, in Schritten diese Überwachung anzuhalten, wenn ich auf etwas warten muß, z.Bsp. Material. In deinem Falle geht das so nicht. Ich würde mit einen kleinen FC bauen (ein Zähler tuts auch). Dieser wird einmal vor of´der hinter der SK aufgerufen. Als IN einen 100ms-Zakt von der SPS eine Freigabe, eine Zählwert-Variable, als INOUT eine Zählwertspeicher-Variable, eine Fehlervariable.
> 
> In deinen Schritten lädst du einfach einen Wert in die Zählwertvariable, z.Bsp. 100 für 10 Sekunden und schaltest die Freigabe auf True. Der FC macht folgendes:
> 
> ...


 
Also mit SPL habe ich auch überlegt, mich aber aus folgendem Grund dagegen entschieden.
Ich habe immer mehrere Ebenen bei der Anlage in diesem Fall z.B. 6
wir nach Ebene 1 gefördert steht die SK immer im Schritt 1xx
Nach ebene 2 in 2xx 
so kann dann auch ein unerfahrener schnell was finden.
Ist aber wahrscheinlich auch ansichtssache.

Vielleicht kannst du mir Sagen was das ausmacht anstelle von 50 Vergleichern eine SPL Leiste mit 50 einträgen zu haben??


----------



## Ralle (11 Oktober 2008)

mitchih schrieb:


> Vielleicht kannst du mir Sagen was das ausmacht anstelle von 50 Vergleichern eine SPL Leiste mit 50 einträgen zu haben??



Ich finde es einfach übersichtlicher, da man die ganzen anzuspringenden Sprungmarken einfach hinter dem SPS-Befehl runterschreibt. Auch das Einfügen von Schritten ist etwas leichter. Ob SPL effektiver ist, kann ich gar nicht sagen, darauf kommt es heute wahrscheinlich eh nicht mehr ganz so an. Der SPL-Befehl basiert auf einem Byte, daher kann man leider nur bis 255 Spünge programmieren, das wird mit deinem Sytem dann nicht gehen. Aber deine Version ist ja nicht schlecht, das wollte ich mit meinem Vorschlag nicht sagen .


----------



## mitchih (11 Oktober 2008)

Hallo Ralle,

habe das ganze jetzt mal in SCL gecodet um auch dort endlich mal merh zu machen. Zudem fande ich es dort sehr übersichtlich.

Jedoch eine kleine Ergänzung zu deinem Vorschlag.
Ich übergebe zusätzlich die Schrittnummer und Speichere mir diese ebenfalls als Altwert über ein INOUT weg.
Sonst hätte ich bei deinem Vorschlag das Problem, das in 2 aufeinanderfolgenden Schritten die Zeiten nie identisch sein dürften, da dann ja keine Zaehlwert Änderung erkannt wird.
Oder hattest du dafür was anderes gedacht. Zusätzlich musste ich mir ja noch eine Flanke basteln.

Aber wie gesagt ansonsten eine sehr gute Idee mal sehen ob der Kunde (mein Chef) damit zufrieden ist.

Wenn er noch weiter so Wünsche äußert brauche ich noch Jahre bis alles fertig ist.


----------



## zotos (11 Oktober 2008)

mitchih schrieb:


> Hallo Ralle,
> 
> habe das ganze jetzt mal in SCL gecodet um auch dort endlich mal merh zu machen. Zudem fande ich es dort sehr übersichtlich.
> ...



Sehr löblich. 
Hast dann aber hoffentlich zu einer Case Verzweigung gegriffen. Wenn Du das ganze in einen FB packst kannst Du auch sehr gut mit einer Schritt UDT arbeiten. In dieser UDT schreibt man dann den vorgännger Schritt und den Schritt in den gesprungen wurde und ggf. noch die Zeit der letzen abarbeitung... soviele Möglichkeiten ;o)


----------



## Ralle (11 Oktober 2008)

@mitchih

Yep, natürlich sollen aufeinanderfolgende Schritte auch gleiche Zeiten haben dürfen, sowas fällt einem dann spätestens auf, wenn man den Code schreibt/testet.


----------



## mitchih (11 Oktober 2008)

zotos schrieb:


> Sehr löblich.
> Hast dann aber hoffentlich zu einer Case Verzweigung gegriffen. Wenn Du das ganze in einen FB packst kannst Du auch sehr gut mit einer Schritt UDT arbeiten. In dieser UDT schreibt man dann den vorgännger Schritt und den Schritt in den gesprungen wurde und ggf. noch die Zeit der letzen abarbeitung... soviele Möglichkeiten ;o)


 
Was soll ich dort mit CASE machen???
Käse tu ich nur aufs Brötchen *ROFL*
Nein Scherz beiseite, ich habe es mit If then gelöst,

Wie würdest du es mit Case lösen??? Nachdem was ich in der Hilfe gelesen habe würde ich Case z.B. zum multiplexen benutzen oder so etwas ähnliches.

Bzgl. FB, ich habe keine Lust auf 40 Instanz DB`s und gegen Multiinstanzen haben einige bei uns in der Firma was
Aber ich bin immer bereit für was neues


----------



## Ralle (11 Oktober 2008)

mitchih schrieb:


> Was soll ich dort mit CASE machen???
> Käse tu ich nur aufs Brötchen *ROFL*
> Nein Scherz beiseite, ich habe es mit If then gelöst,
> 
> ...



Aber Case bietet sich da tatsächlich an, funktioniert im Prinzip auch wie die SPL !


----------



## mitchih (11 Oktober 2008)

Hi,
die Funktion der Case Anweisung habe ich verstande, denke ich zumindest,
leider leuchtet mir in diesem Fall nicht ein was der Vorteil sein soll???

Ich  muss ja einen Wert ernidrigen und wenn er <= 0 ist ein Stoerbit setzen.

Das Case würde sich meiner Meinung als Verteiler für die Zeitwerte anbieten wenn diese z.B. aus einem DB anhand z.B. der Schrittnummer ermittelt werden würde, aber solange er als in Variable vorhanden ist und nur ein wert, sehe ich hier den sinn nicht, macht einfach mal ein beispiel.


----------



## zotos (11 Oktober 2008)

mitchih schrieb:


> ...
> Das Case würde sich meiner Meinung als Verteiler für die Zeitwerte anbieten wenn diese z.B. aus einem DB anhand z.B. der Schrittnummer ermittelt werden würde, aber solange er als in Variable vorhanden ist und nur ein wert, sehe ich hier den sinn nicht, macht einfach mal ein beispiel.



Erst mal ohne Watchdog:

```
CASE StepNum OF
  0:; (*Step: INIT*)
      (*Transition*)
      IF mitchih_hat_eine_frage THEN
        StepNum := 10;
      END_IF;

  10:;(*Step: Lehrermodus*)
      (*Action*)
      Ralle.Lehrermodus := TRUE;
      Zotos.Lehrermodus := TRUE;
      mitchih.Lernmodus := TRUE;
      (*Transition*)
      IF mitchih_will_lernen THEN
        StepNum := 11;
      ELSE
        StepNum := 20;
      END_IF;

  11:;(*Step: Unterricht*)
      (*Action*)
      IF StepNumImp  THEN
        mitchihs_wissen := mitchihs_wissen + 1;
      END_IF;
      (*Transition*)
      IF mitchih_hat_was_verstanden THEN
        StepNum := 12;
      END_IF;

  12:;(*Step: Unterrichtsende*)
      (*Action*)
      Ralle.Lehrermodus := FALSE;
      Zotos.Lehrermodus := FALSE;
      mitchih.Lernmodus := FALSE;
      (*Transition*)
      IF  TRUE THEN
        StepNum := 0;
      END_IF;

  20:;(*Step: Stop Unterricht*)
      (*Action*)
      mitchih.Lernmodus := FALSE;
      (*Transition*)
      IF TRUE THEN
        StepNum := 0;
      END_IF;

  ELSE (*Böse und sollte ausgewertet werden*)
      StepNum := 0;
  END_CASE; 
  StepNumImp := StepNum <> StepNumOld;
  StepNumOld := StepNum;
```


----------



## mitchih (11 Oktober 2008)

*Jetzt ist klar*

Achso,
jetzt haben wir aber aneinander vorbeigeredet.

Ich habe lediglich den Überwachungsbaustein in SCL gemacht!!

Meine SK sind in AWL und die sind schon fertig.

Ich wollte die auch wohl in AWL lassen,
sonst kommt weinen meine Kollegen wieder das ich alles verkompliziere ;-)

Wenn ich demnächst SK in SCL anstatt AWL mache, dann wäre es sicher eine gute Idee es so wie beschrieben zu lösen

Eine Frage stellt sich aber noch:

Wenn ich nun in Schritt 11 die Schrittnummer 12 zuweise (Transition erfüllt) läuft die SK dann sofort in Schritt 12 oder erst im nächsten Zyklus??


----------



## MW (11 Oktober 2008)

mitchih schrieb:


> Eine Frage stellt sich aber noch:
> 
> Wenn ich nun in Schritt 11 die Schrittnummer 12 zuweise (Transition erfüllt) läuft die SK dann sofort in Schritt 12 oder erst im nächsten Zyklus??



Nein, der Schritt 12 würde erst im nächsten Zyklus bearbeitet werden.


----------



## Ralle (11 Oktober 2008)

@zotos

Schickes Programm !


----------

