Step7 - Merker nur im ersten Zyklus setzen

Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
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:
Code:
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:
Code:
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"

...
 
Zuletzt bearbeitet:
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 ?
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

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..

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

Ja, muss :)
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
Zurück
Oben