Funktionsaufruf und StateMachine

HarryHirn

Member
Beiträge
15
Punkte Reaktionen
2
Zuviel Werbung?
->Hier kostenlos registrieren
Hi,

als erstes muss ich gestehen, dass ich absoluter Noob bin :)
Ich habe quasi die Programmierung einer S7-1200 aufs Auge gedrückt bekommen.
Das ganze im TIA 11.

Nun zum Problem, welches wohl eher der Sache geschuldet ist dass ich normalerweise C und C# programmiere:

Ich habe eine Maschine, welche ein paar Achsen in ein Gehäuse einpresst.
Dafür durchläuft das Ding einen gewissen Zyklus (Ventil 1 auf, Ventil 1 zu, Ventil 2 auf, Motor verfahren, etc...).

Intuitiv dachte ich nun an eine StateMachine, welche "einfach" nur die einzelnen Zustände durch tackert.
Dafür habe ich mir einen FB in FUP mit einer Reihe von TON und ein paar Merkern erstellt, welches in definierten Zeitabständen meinen "Token" durch die Merker reicht.

Aus der OB1 aufgerufen mit

Code:
IF "IN0" = TRUE THEN  // Statement section IF


"PressFit_DB"();


END_IF;

Funktioniert auch, allerdings nur solange wie IN0 TRUE ist.
Klar, steht ja auch da, allerdings dachte ich, dass die Funktion zuende ausgeführt wird, so wie man das von C kennt.

Da kommt nun mein Fachnichtwissen zum Einsatz...
Die Timer in der FB hören auf zu laufen, wenn IN0 = FALSE.
Habe hier schon ein wenig rum gelesen, läuft die S7 zyklisch durch OB1 und führt die FB nicht mehr aus, wenn sie unerreichbar ist vom Code, auch wenn die FB eigentlich noch nicht "zuende" gelaufen ist?

Wie macht man so etwas klassischer Weise?
Ich hatte versucht in der IF Schleife einen Merker zu setzen FB_ACTIVE und dann in einer WHILE Schleife die FB aufzurufen bis FB_ACTIVE = FALSE.
Ist wohl eher eine schlechte Idee...
Wie könnte ich dann nach dem Ende der FB den Merker auf FALSE setzen, evtl aus dem FB heraus?

Ich danke euch schon mal und bin auch nicht böse, wenn es gleich heißt "Lern erst mal XY" :)

Gute Literatur gern gesehen, denn die Siemens Dokumentation ist echt nicht das Gelbe vom Ei....

THX
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
Hallo,
so einen Kommentar bekommst du erstmal nicht ...

Eine Statemachine oder auch Schrittkette ist die richtige Vorgehensweise. Du mußt dir diesen sequentiellen Ablauf aber erzwingen, da, wie du ja schon festgestellt hast, das Programm nicht in einer Zeile bis zum Ende derer Bearbeitung stehen bleibt.

Eine solche Schrittkette (dazu vielleicht auch einfach mal die Suiche hier bemühen) könntest du z.B. mit einer CASE-Abfrage realisieren (wenn du ja schon bei SCL bist). Du fragst hier den CASE deiner Schrittnummer ab und aktivierst dann immer jeweils in der Schrittnummer die Nächste wenn der Zeitpunkt dafür gekommen ist (also z.B. ein Endschalter angefahren wurde). Abhängig von der Schrittnummer lößt du dann die Aktionen aus.

Kannst du damit etwas anfangen ?

Gruß
Larry
 
OP
H

HarryHirn

Member
Beiträge
15
Punkte Reaktionen
2
Zuviel Werbung?
->Hier kostenlos registrieren
Ja, danke, damit kann ich was anfangen.
Wie würde man denn zeitliche Dinge realisieren in SCL?
Z.B. Ventilx 1 Sekunde offen...
Auch per Timer, welcher den Zustand weitersetzt nach Zeit y?

Ach ja, und wie kann ich aus der FB heraus eine Variable von OB1 ändern?
Wenn ich z.B. FB_ACTIVE als variable habe und nach Fertigstellung der FB diese auf false gesetzt werden soll...
 
Zuletzt bearbeitet:

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
Jetzt kommen wir langsam an den Punkt wo ich nur noch pauschal mithalten kann - S7-1200 ist nicht so mein Thema.

Aber um mal bei der SCL-Geschichte zu bleiben :
Den Timer ansteuern auf gar keinen Fall innerhalb der CASE-Abfrage da dies in der endgültigen Programm-Umsetzen immer eine bedingte Bearbeitung ergibt (was der Timer meißt nicht mag). Besser hier ist den Timer außerhalb dessen mit der (richtigen) Schrittnummer zu triggern und sein Ergebins im CASE als Weiterschaltbedingung abfragen.

Um zu der sache mit dem FB_Active etwas zu sagen müßte ich schon etwas mehr von deinem Code kennen. Ganz grundsätzlich nimmt man für so etwas aber Merker (was im Grunde globale Variablen sind), die du über den jeweiligen Ausgang schaltest (oder ggf. auch wieder aus deiner Schrittkette heraus). Vielleicht beschreibst du mal etwas von deinem Ablauf und zeigst mal ein bißchen Code - dann läßt sich schon viel mehr konkreter machen ...

Gruß
Larry
 
OP
H

HarryHirn

Member
Beiträge
15
Punkte Reaktionen
2
Dein Beitrag hilft mir auf jeden Fall schon sehr!

Mit dem Ausschnitt oben kennst du schon 75% von meinem Code :)
Der Rest ist eine FUP Timer-Merker Kette im FB, um einfach zu gucken ob die FB läuft.

Ich stehe, wie gesagt, erst am Anfang und wollte das erstmal verstanden haben bevor ich es mit Inhalt fülle.
 
Oben