Sonstiges PCS7 SFC-Typ nach CPU Neustart fortsetzen

Astralavista

Level-1
Beiträge
799
Reaktionspunkte
112
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe ein spezielles Anliegen mit PCS7 SFC-Typen:
Wunsch ist es, dass ein SFC-Typ nach einem Neustart bzw. STOP/RUN Übergang der CPU mit seinem letzten Status weiter läuft.
Das funktioniert allerdings nur bedingt, da nach einem Neustart der zwingend der Operator eingreifen und folgende Aktionen ausführen muss: (Ist anscheinend von Siemens so gewollt):

1. Setzen der Betriebsart auf Hand
2. Fortsetzen der Schrittkette bestätigen
3. Setzen der Betriebsart auf Automatik

Ich habe herausgefunden wie die SFC-Visualisierung die Bits in der Variable SFC_CONTROL im Instanzdatenbaustein setzt und kann den Wiederanlauf auch über eine Variablentabelle steuern, indem ich das Steuerwort gleich setze wie beim Vorgang des Operators.

Mein geplantes Vorgehen einen Baustein zu schreiben um ihn auf den Eingang zu verschalten ist denke ich nicht zu machen, da ansonsten der Eingang des SFC ja permanent beschrieben wird. Standardmäßig ist der IN_OUT SFC_CONTROL auch nicht per CFC verschaltbar, wahrscheinlich aus genau dem Grund.

Meine Frage:
Bin ich mit meinem Vorgehen und dem SFC_CONTROL vielleicht auf dem Holzweg oder kennt ihr eine Möglichkeit die Variable über einen selbstgeschriebenen Baustein zu manipulieren? Die Instanz-DB Nummer ist ja unbekannt, an die komme ich ja auch nicht ran.
Gibt es vielleicht eine einfachere Methode die Schrittkette automatisiert wieder zum Anlaufen zu bringen?

Danke für eure Mühe und Tips.

Gruß
 
So, ich habe mir einen Baustein geschrieben der die Schrittkette automatisch wieder fortsetzt.
Dazu manipuliere ich die Variable SFC_CONTROL des SFC-Typs über einen OUT-Anschluss eines selbstgeschriebenen FB's. Das funktioniert soweit.
Leider beschreibt jetzt mein Baustein, bedingt durch die Verschaltung in CFC, permanent diese Variable. Deswegen kann meine Visualisierung nicht mehr darauf schreiben.
Wie kann ich dieses letzte Problem in CFC umgehen? Jemand eine Idee?
 
Wenn du die Variable als InOut Parameter verwendest und dann nur z.B. bei Warmstart auf diese schreibst, dann sollte es funktionieren.
Zumindest in 99,9% der Fälle, denn bei der S7-400 mit Kommunikation im Zyklus hast du das mögliche Problem, dass der Wert vom Bediener in der Steuerung landet wenn gerade dein Baustein bearbeitet wird. Dann müsste er ggf. ein zweites Mal bedienen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann leider keinen InOut mit einem InOut verbinden. :confused:
Hier mal ein Screenshot der mein derzeitiges Problem zeigt. Ich habe mir jetzt zusätzlich noch einen FC geschrieben, den ich über den EN Eingang einfach nicht abarbeite um zu testen was passiert.
Ergebnis: Obwohl der FC überhaupt nicht abgearbeitet wird und definitiv nicht auf die Verschaltung schreibt, wird der Wert überschrieben. Das liegt am Aufruf des SFC-Typen. Ich denke fast mein Problem ist nicht lösbar.
DWORD_SFC.jpg
 
Der Ausgangswert des DWORD_MOVE landet vermutlich auf einer Variable im Pool-DB, die dann weiter auf den Parametereingang geht. Das kann man sehen wenn man die generierte SCL-Quelle anschaut. Dann bringt es nicht viel den FC nicht aufzurufen.

Lösbar wäre es nur wenn du auf die Instanz-Daten der SFC Instanz schreibst. Damit das noch halbwegs sauber bleibt, würde ich mir dazu einen Baustein schreiben, den du über einen Parameter vom Typ Any mit einer beliebigen Variable der SFC-Instanz verschaltest. Dann ermittelst du den Instanz-DB der Any-Variable und kannst dann auf diese eine Variable schreiben.
 
OK, die Idee ist grundsätzlich. Daran hatte ich nicht gedacht bzw. auch noch nie gemacht, aber das kriege ich hin.
Weiteres Problem ist, dass diese Funktion an über 100 verschiedenen SFC-Typen nachprogrammiert werden soll. Da es sich bei dem SFC_CONTROL um einen InOut handelt, ist der Offset im Instanz-DB in fast jedem SFC-Typ unterschiedlich.
Wie du bereits geschrieben hast, es sollte halbwegs sauber bleiben. Ich bin eigentlich gegen solche Art von "Schweinereien", gerade im PCS7-Umfeld. Den Offset herauszufinden wird wohl nicht möglich sein oder hast du da noch eine Idee?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hängt davon ab an welcher Stelle du deine eigenen Parameter einfügst. Wenn du selber dem SFC-Baustein auch InOut hinzufügst wird es schwierig.
Ansonsten könntest du die Any-Verschaltung auf die letzte Out-Variable des SFC-Bausteins vornehmen, evtl. auch eine Dummy-Variable von besonderem Datentyp (z.B. DATE) immer an letzter Stelle. Diese verschaltest du dann mit deinem Modifizierungsbaustein, und prüfst dann auch noch den Datentyp im Any-Pointer auf 9=Date, und weißt dann zumindest schon einmal die Startadresse des InOut-Bereichs. Das ist dann die Adresse des Any + sizeof(DATE).
 
Hallo Thomas,
das waren die entscheidenden Hinweise. Habe es hinbekommen. Der Baustein und die Visu funktionieren gleichzeitig und alles tut was es soll.
Ich werde das ganze jetzt noch ins Reine bringen, kommentieren und eine Fehlerauswertung der Verschaltung rein bringen. Dann gehe ich ins Wochenende :cool:
Vielen Dank für die Hilfe. Wirklich sehr gut. :)
 
Zurück
Oben