# Step7 - Merker nur im ersten Zyklus setzen



## blue dun (15 Juni 2010)

Hallo zusammen,

habe mit Hilfe von Euch inzwischen einige Probleme lösen können - danke!
Es ist mir jedoch noch nicht gelungen, in Step7 einen Merker zu basteln, der nur im ersten Zyklus gesetzt ist, wie der Merker SM0.1 aus MicroWin. Irgendwo habe ich mal aufgeschnappt, man müsse einen OB dafür benutzen - allein das Wie ist mir noch verborgen geblieben. 

Gruß

blue dun


----------



## jabba (15 Juni 2010)

Such mal nach Anlaufmerker

ansonsten einfügen OB100
im OB100

```
Set
=M100.0  // oder ein anderer
```

Am Ende des OB1 als letzten Befehl

```
CLR
=M100.0
```


----------



## PN/DP (15 Juni 2010)

*Merker "ZYKLUS1"*

Ich schreibe bei mir immer im 1. Netzwerk des OB1:

```
L     #OB1_SCAN_1
      L     B#16#3          // Scan 2-n of OB1
      <>I   
      =     "ZYKLUS1"       // M0.2
```
So brauche ich keinen OB100 und kein Rücksetzen des Merkers.

Der Code funktioniert auch, falls die CPU Wiederanlauf oder Kaltstart 
kann und dann nicht OB100, sondern OB101 bzw. OB102 aufruft.

Gruß
Harald


----------



## liepa (15 Juni 2010)

oder einmalig Flanke erzeugen und den Hilfsmerker nicht löschen...


----------



## anne (15 Juni 2010)

PN/DP schrieb:


> Ich schreibe bei mir immer im 1. Netzwerk des OB1:
> 
> ```
> L     #OB1_SCAN_1
> ...


 
Hm, was macht denn #OB1_SCAN_1?

Ist dies eine deklarierte Variable im OB1?


----------



## Jochen Kühner (15 Juni 2010)

anne schrieb:


> Hm, was macht denn #OB1_SCAN_1?
> 
> Ist dies eine deklarierte Variable im OB1?



Ja, das ist eine Variable die der OB vom SPS Betriebssystem übergeben bekommt!

Und wenn da ein wert <> 3 drinnsteht, dann ist der zyklus kein freier Zyklus, sondern der letzte war kaltstart, neustart usw...

Steht in der Step 7 Hilfe zum OB1


----------



## anne (15 Juni 2010)

Danke Jochen!

1) Demzufolge muss diese Variable #OB1_SCAN_1 wohl auch *genau* so heißen, oder?

2) Anstatt "Zyklus1" könnte man doch auch *direkt* den Merker schreiben?

Sorry, hab' grad kein STEP7 hier, so dass ich nicht in die Hilfe schauen kann.


----------



## Jochen Kühner (15 Juni 2010)

anne schrieb:


> Danke Jochen!
> 
> 1) Demzufolge muss diese Variable #OB1_SCAN_1 wohl auch *genau* so heißen, oder?
> 
> ...



Wenn du die OBs aus den Standart Librarys nimmst, heissen die Variablen so. Ich denke aber der name ist nicht wichtig, sondern die Adresse, also die position in der Liste!

Ja, Zyklus1 ist ja eine lokalvariable!


----------



## MSB (15 Juni 2010)

OB1_Scan_1, ist ein Byte von 20 Byte Standard-Lokaldaten im OB1,
ganz präzise das Lokalbyte 1, also LB1

Zyklus1 ist der Symbolische Name des Merkers, hier laut Kommentar vermutlich M0.2

Mfg
Manuel


----------



## PN/DP (15 Juni 2010)

Ja, es ist genauso wie MSB mittlerweile für mich beantwortet hat:
*#OB1_SCAN_1* ist eine der Standard-Lokalvariablen des OB1, siehe Hilfe zum OB1
*"Zyklus1"* ist der symbolische Name meines globalen Merkers M0.2

Gruß
Harald


----------



## PN/DP (15 Juni 2010)

*Standard-TEMP-Variablen des OB1*

Wer grad' kein Step7 zur Hand hat:
S7-300/400 System- und Standardfunktionen

Zitat:



Gruß
Harald


----------



## anne (16 Juni 2010)

PN/DP schrieb:


> *"Zyklus1"* ist der symbolische Name meines globalen Merkers M0.2
> 
> Gruß
> Harald


 
Das würde aber bedeuten, dass das Ganze noch irgendwo *aufgerufen *werden muss, damit dann der Merker M0.2* übergeben* werden kann, oder nicht?


----------



## PN/DP (16 Juni 2010)

*Anwendung Merker "ZYKLUS1"*



anne schrieb:


> Das würde aber bedeuten, dass das Ganze noch irgendwo *aufgerufen *werden muss, damit dann der Merker M0.2* übergeben* werden kann, oder nicht?


Der Themenstarter blue dun möchte einen universell verwendbaren Merker haben


blue dun schrieb:


> der nur im ersten Zyklus gesetzt ist, *wie der Merker SM0.1 aus MicroWin.*


Dieser Merker M0.2 "ZYKLUS1" wird im 1. Netzwerk des OB1 in jedem Zyklus zugewiesen, wobei er nur im 1. Zyklus TRUE wird. 
Man kann ihn im gesamten Programm verwenden wie man will, z.B. irgendwo verknüpfen

```
O     "Taster_Quit"
      O     "ZYKLUS1"
      R     "Merker_Störungshupe"

      U     "ZYKLUS1"
      S     "Schrittkette_InitStep"
```
oder einen Initialisierungsbaustein nur im 1. OB1-Zyklus aufrufen

```
U     "ZYKLUS1"       // nur im 1. OB1-Zyklus TRUE
      CC    FC1             // Initialisierungsbaustein bedingt aufrufen
```
Im Initialisierungsbaustein lösche ich z.B. alle Tastenbits, die von einem Panel oder einer Visu kommen.

Diesen globalen Merker muß man nicht an Bausteine übergeben (kann aber).

Gruß
Harald


----------



## anne (16 Juni 2010)

Ok, vielen Dank Harald.

Die Bezeichnung "ZYKLUS1" stammt von der *Symboltabelle*, richtig?


----------



## ssound1de (16 Juni 2010)

anne schrieb:


> Die Bezeichnung "ZYKLUS1" stammt von der *Symboltabelle*, richtig?


 
Ja. Wenn "symbolische Anzeige" ausgeschaltet wäre, würde an dieser Stelle der entsprechende Operand stehen (war hier ja M0.2).
Merker sind im System fest deklariert und global verwendbar.


----------



## JesperMP (16 Juni 2010)

Frage:
Wird OB1_SCAN_1 auch nach ein Warmstart auf "1" gesetzt ?

Der Kommentar zu OB1_SCAN_1 sagt "_1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)_".

Ich will das ich eine 1st_scan bit habe der aktiv ist nach ein Warmstart (*).
Dazu verwende ich heute OB100, aber überlege ob OB1_SCAN_1 besser/einfacher wäre.

*: Grund ist, wenn ich ein Program komplett geladen habe, und ich diverse Initialwerten setzen will durch den "1st_scan" bit, wird ein Warmstart durchgeführt, kein Kaltstart.


----------



## PN/DP (16 Juni 2010)

JesperMP schrieb:


> Frage:
> Wird OB1_SCAN_1 auch nach ein Warmstart auf "1" gesetzt ?


OB1_SCAN_1 kann folgende Werte haben (siehe Step7-OB1-Hilfe oder Referenzhandbuch S7-300/400 System- und Standardfunktionen):
• B#16#01: *Abschluß des Neustarts (Warmstarts)*
• B#16#02: Abschluß des Wiederanlaufs
• B#16#03: *Abschluß des freien Zyklus*
• B#16#04: Abschluß des Kaltstarts
• B#16#05: Erster OB1-Zyklus der neuen Master-CPU nach Master-Reserve-Umschaltung und STOP des bisherigen Masters

Bei den meisten S7-300 CPU kommen nur die Werte B#16#01 im ersten Zyklus und alle weiteren Zyklen B#16#03 vor.

Die anderen Werte kommen nur bei CPU vor, die die entsprechende Anlaufart unterstützen:
(siehe: Zielsystem > Baugruppenzustand > Leistungsdaten > Organisationsbausteine)
• *Wiederanlauf* können nur S7-400 (nicht S7-300 und nicht S7-400H)
• *Kaltstart* können nur CPU318-2 und S7-400 (und eventuell alte S7-300 ???)

Was ist der Unterschied zwischen Neustart (Warmstart), Kaltstart und Wiederanlauf bei einer S7-400 CPU?



JesperMP schrieb:


> Ich will das ich eine 1st_scan bit habe der aktiv ist nach ein Warmstart (*).
> Dazu verwende ich heute OB100, aber überlege ob OB1_SCAN_1 besser/einfacher wäre.


Ich finde die Anwendung eines 1st_scan bit übersichtlicher, weil ich den direkt in einem Netzwerk verknüpfen kann.
Wenn aber sehr viel zu initialisieren ist, dann könnte der Einsatz des OB100 besser sein. Ich glaube, da läuft die 
Zykluszeit-Überwachung noch nicht (finde aber jetzt keine Quelle dazu).

Gruß
Harald


----------



## JesperMP (16 Juni 2010)

Aha.

Aus der Kommentar für OB1_SCAN_1 in der Standard Bibliotek: "_1 (*Cold restart* scan 1 of OB 1), 3 (Scan 2-n of OB 1)_".

Aus der online Hilfe: "_B#16#01: completion of a *warm restart*_" und "_B#16#04: completion of a cold restart_".



Aber ich vertraue dir mehr als der Siemens Kommentar.
Wenn ich es verstanden habe, dann gibt OB1_SCAN_1 mir denselbe Ergebnis als OB100, das ein Warmstart durchgeführt wurde.


----------



## PN/DP (16 Juni 2010)

*Anlauf-Info in OB1_SCAN_1*

Ja Jesper, der Kommentar direkt am OB1_SCAN_1 im OB1 ist falsch, richtig ist es so:

```
STOP->RUN
 |
 |
 +--> warm restart (Neustart/Warmstart) --> OB100 --> OB1: OB1_SCAN_1 = 1 --+
 |                                                                          |
 +-->  hot restart (Wiederanlauf)       --> OB101 --> OB1: OB1_SCAN_1 = 2 --+
 |                                                                          |
 +--> cold restart (Kaltstart)          --> OB102 --> OB1: OB1_SCAN_1 = 4 --+
                                                                            |
                  +--> main cycle (freier Zyklus) --> OB1: OB1_SCAN_1 = 3 --+
                  |                                                         |
                  +---<----<----<----<----<----<----<----<----<----<----<---+
```
So kann die Anlauf-Info in OB1_SCAN_1 mit PLCSIM getestet werden:



Die Anlauf-Art "hot restart (Wiederanlauf)" muß in HW-Config der CPU eingestellt werden:



Dann kann mit dem PG die CPU gesteuert werden:



Gruß
Harald


----------



## JesperMP (16 Juni 2010)

So verstehe ich es auch.
Problem ist nur das OB101 und OB102 gibt es gar nicht bei S7-300. 
Also, bei S7-300 wird nur ein Warmstart erkannt. Und ich verwende nur S7-300.

Ich verwende jetzt ein nicht-remanente Merker um ein Kaltstart zu erkennen.


----------



## Flux (15 Januar 2015)

*STOP->RUN erkennen mit PCS 7 und AS410*

Hallo Leute,

ich stehe nun auch vor der Aufgabe mein Programm nach einem STOP->RUN Übergang zu initialisieren. Ich arbeite mit PCS 7 V8 und einer AS410 (unterstützt OB100 (Neu-/Warmstart) und OB102 (Kaltstart)).

Von dem was ich so gelesen hab scheinen folgende Methoden sich etabliert zu haben:

 SFC 6 "RD_SINFO": TOP_SI.NUM =100 oder 102 --> setze Ausgang "FirstCycle" 
*oder*
 OB1_SCAN_1 <> 3 (freier Zyklus) --> setze Ausgang "FirstCycle"

Meine Frage ist:
Mein Programm ist verteilt auf OB1 und diverse OB3x. Angenommen ich schreibe nun mit SCL einen FB "StartUp", der über einen der beiden o. g. Wege seinen Ausgang "FirstCycle" setzt, platziere besagten FB am Anfang von OB1 und verschalte seinen Ausgang "FirstCycle" mit den zu initialisierenden Programmteilen des OB1 sowie der OB3x er: 
Laufe ich nicht Gefahr, dass der OB1 (in dem "StartUp" aufgerufen würde) nach Übergang STOP->RUN startet und wieder abgearbeitet ist, *BEVOR* der erste OB3x überhaupt aufgerufen wird? Dann hätten die OB3x er Programmteile keine Chance den STOP->RUN-Übergang mitgeteilt zu kriegen.
Oder andersherum: Könnte OB3x nach dem STOP->Run-Übergang zuerst kommen, und damit der OB1 den Übergang nicht mitbekommen?

Wie gehe ich damit am besten um?

Klar könnte ich "FirstCycle" lange genug ausschaltverzögern, aber was wäre die sauberste Lösung?

Alternativ könnte ich für jeden OB nen Merker definieren (also "OB1_FirstCycle", "OB32_FirstCycle", ...), der von "StartUp" in OB1 gesetzt würde, das Rücksetzen des jeweiligen Merkers aber am Ende eines OB1/3x geschieht.

Was meint Ihr dazu?


Danke


----------



## Flux (15 Januar 2015)

Nachtrag: Aus dem Support-Artikel entnehme ich, dass nach dem jeweiliegen Anlauf-OB (100, 102) auf jeden Fall zuerst der OB1 folgt. Was aber egal ist für folgendes Konzept. Ich würde nun wie folgt vorgehen:

Zunächst der FB:

```
FB "StartUP"
{S7_tasklist = 'OB100', 'OB102'}

RD_SINFO (..)

[FONT=arial]CASE BYTE_TO_INT(TOP_SI.NUM) OF

100, 102: FirstCycle := 1; //Aufruf von FB "StartUp" in Anlauf-OB[/FONT]

ELSE FirstCycle := 0; //Aufruf von FB "StartUp" in OB1/OB3x
```

Diese würde ich an das Ende jedes OB1/OB3x platzieren (damit das Rücksetzen des Ausgangs erst geschieht, nachdem jeder relevante Programmteil den Anlauf mitbekommen hatte).

Dann verstehe ich den Ablauf wie folgt:

```
Ereignis:     Aktion:
---------------------

STOP->RUN    

OB100/102     Alle "StartUp"-Intanzen setzen ihren Ausgang "FirstCycle"

OB1           "StartUp"-Instanz am Ende von OB1 rücksetzt ihren Ausgang "FirstCycle" (ggf. kommt vorher nen Weckalarm OB3x)

OB3x          "StartUp"-Instanz am Ende von OB3x rücksetzt ihren Ausgang "FirstCycle"

...
```


----------



## bike (15 Januar 2015)

Ich würde mir die Schnittstelle des OB1 genauer anschauen.
Da gibt es schon das was du brauchst. 
Stichwort "FirstRun".


bike


----------



## Flux (15 Januar 2015)

bike schrieb:


> Ich würde mir die Schnittstelle des OB1 genauer anschauen.
> Da gibt es schon das was du brauchst.
> Stichwort "FirstRun".



Ok, aber wie stelle ich sicher, dass auch alle OB3x er Programmteile das mitbekommen, bevor FirstRun wieder 0 ist ?


----------



## bike (15 Januar 2015)

Sorry muss first cycle heissen. habe kein Step7 gerade.
Du kannst doch aus der Schnittstelle das Signal nehmen, in einen Merker übertragen und dann am Ende des ersten Cyklus den Merker zurücksetzen.
ich verstehe dein Problem nicht so ganz.
Kann dein Programm in den OB3x ablaufen, oder ist es das Standardprogramm im OB1?
Wo willst bzw kannst du die Grenze ziehen?
Ich habe bei PCS7 den Ablauf im OB35 und wenn kein OB1 da ist, wird nur dieser verwendet.
Ist ein OB1 da, dann wird der abgearbeitet, der auch von dem OB35 unterbrochen werden kann.

Daher die Frage, kann sowohl im OB1 oder OB35 initialisiert werden?


bike


----------



## Flux (15 Januar 2015)

bike schrieb:


> Kann dein Programm in den OB3x ablaufen, oder ist es das Standardprogramm im OB1?



Im Ablaufeditor kannst du deine Ablaufgruppen (Pläne) jedem beliebigen OB zuordnen. Ich verwende wie gesagt sowohl OB1 als auch diverse OB3x er für mein Programm.



bike schrieb:


> Ist ein OB1 da, dann wird der abgearbeitet, der auch von dem OB35 unterbrochen werden *kann*.



Der OB35 würde den Anlaufmerker aber wie oben geschildert nur mitkriegen, wenn der OB1 bis dahin nicht schon durchgelaufen ist..



bike schrieb:


> Daher die Frage, kann sowohl im OB1 oder OB35 initialisiert werden?



Ja, muss


----------



## Larry Laffer (15 Januar 2015)

Flux schrieb:


> Ok, aber wie stelle ich sicher, dass auch alle OB3x er Programmteile das mitbekommen, bevor FirstRun wieder 0 ist ?



... in dem du für jeden verwendeten OB einen eigenen "FirstRun"-Merker hernimmst und den dann im jeweiligen OB wieder zurücksetzt, wenn er (der OB) das erkannt hat ...

Gruß
Larry


----------



## bike (15 Januar 2015)

Zuerst wird der OB1 gestartet.
Dann einen Merker setzen.
Im OB3x diesen Merker abfragen.
Jeweils einen Merker setzen OB3x bis OB3y durchlaufen.
Am Ende des OB1 prüfen, sind alle OB3x -3y fehlerfrei durchlaufen, dann den Startmerker rücksetzen.

So würde ich es machen.

Und ja, ich kann PC7 und weiß was Pläne sind und wo und wie diese aufgerufen werden ;-)


bike


----------



## Flux (17 Januar 2015)

So, ich habe mein Konzept nun wie oben beschrieben implementiert und (mit PLC-Sim) getestet. Funktioniert wunderbar!
Rein interessehalber, wie würde das Auslesen der Standard-Lokaldaten des OB 1 in SCL funktionieren? Habe dazu diesen FAQ gefunden 
http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW

Problem an der Sache ist,  dass PCS7 vden OB1 bei jedem Übersetzungsvorgang neu generiert und damit mein Code überschrieben würde. 
Das einzige was mir dazu als Abhilfe einfällt,  wäre beim Übersetzen das Häkchen "SCL-Quelle generieren" zu setzten und dann jedesmal das Strukt in Temp einzufügen etc..

Kennt jemand nen besseren Weg?


----------

