Das mit dem Auslagern ist schon so ne Sache aber wie?
Das Verhältnis "normaler" Code der immer bearbeitet wird (Bausteinbeginn) und Schrittkette liegt vielleicht bei 5/90 %
Mal kurz die Eckdaten:
Ich schreibe alles in AWL (kann auch nix anderes).
Beispiel ein Netzwerk ohne eigene Schrittnummer
(Schrittnummer nenne ich IZ = innerer Zustand...):
Code:
// Beginn Netzwerk
// Wenn bereits gesperrt ist, dann nichts machen.
L #IZ_FB
L 900
==I
SPB ue99
// Wenn der IZ kleiner 10 ist braucht nur gesperrt zu werden.
L #IZ_FB
L 10
<I
UN #Notaus_IO
UN #Gesperrt_Aktiv
S #Merker_Sperren
SPBN ue01
L 900
T #IZ_FB
SPA ue99
ue01: NOP 0
// Wenn der IZ zwischen 10 und 64 ist kann NormalAus_S angewandt werden...
L #IZ_FB
L 10
<I
SPB ue02
L #IZ_FB
L 64
>I
SPB ue02
UN #Notaus_IO
UN #NormalAus_S_Aktiv
UN #Abbruch_Aktiv
S #Merker_NormalAus_S
SPBN ue02
U #Option_XY // wenn True anderen IZ nehmen!
SPBN sd03
L 450
T #IZ_FB
SPA ue99
sd03: L 750
T #IZ_FB
SPA ue99
ue02: NOP 0
// Wenn der IZ größer als 64 ist muß NotAus angewandt werden...
L #IZ_FB
L 64
>I
UN #Notaus_IO
UN #NotAus_Aktiv
UN #Abbruch_Aktiv
S #Merker_NotAus
SPBN ue03
U #Option_XY // wenn True anderen IZ nehmen!
SPBN sd04
L 450
T #IZ_FB
SPA ue99
sd04: L 800
T #IZ_FB
ue03: NOP 0
ue99: NOP 0
// Ende Netzwerk
Solche Netzwerke stehen alle am Beginn des FB. Grund ist der um sicherzustellen daß sie immer durchlaufen werden.
Das andere ist wie eine sehr umfangreiche Schrittkette zu sehen die u.A. in abhängigkeit von Optionsflags (IN Parametrer TRUE/FALSE) verzweigt.
Es sind Schritte vorhanden die niemals in einer Anlage vorhanden sein können jedoch aber auf Grund der gemeinsamen restlichen Basis im selben Baustein sitzen weil das nächste mal sie und dafür die anderen nicht verwendet werden.
So gesehen ist es für mich dann relativ einfach eine neue Teilkette nachträglich einzufügen da es immer definierte Abzweigungen gibt (also bis dahin ist alles gleich und wenn wir hier angekommen sind gehen wir abhängig von der Option weiter...) und es ist sichergestellt daß die vorletzte Anlage immer noch damit laufen würde wenn sie gleich parametriert ist (Wichtig!)
Schon aus diesem Grund eignet sich die Sprungleiste nicht so gut für mich weil ich es so handhabe eine Interger als Zustandkennung zu verwenden und am Netzwerkbeginn auf ==I vergleichnederweise abfrage (natürlich nur in den Netzwerken die einem Schritt zugeordnet sind). Das hat zwar den Nachteil daß weit unten liegende Netzwerke erst durch abklappern der vorigen erreicht werden - also etwas zu lasten der zykluszeit, aber den riesen Vorteil daß sich das beliebig Strukturieren und Gruppieren lässt.
Wenn also im Schritt angekommen (==I TRUE) wird das Netzwerk bearbeitet und am ende festgelegt wohin es als nächstes geht. Entweder gleicher Schritt (z.B. bei Verzögerungszeiten) oder Nächster bzw. Alternativschritt. Dies geschieht dann durch Schreiben der neuen Nummer und anschließend BE (ende FB)
Beispiel ein Netzwerk (IZ=401) mit einer Verzögerungszeit:
Code:
// Beginn Netzwerk
L 401
L #IZ_FB
==I
= #HB_FB
SPBN z401
// Wenn eine Abwahl durch den Bediener am Schalter entweder auf "AUS" oder
// auf "Bereit" erfolgt, ODER wenn eine Abwahl vom Master erfolgt dann:
U #Notaus_IO
UN #BA_Hand
UN #Modul_EIN_ZS
SPBN e401
// Zum Beenden - IZ wechseln...
SET
CALL #t_SFB4_EVerz
IN:=FALSE
PT:=T#5MS
Q :=#t_M_SFB4_EVerz
ET:=
L 450
T #IZ_FB
BE
e401: NOP 0
// Verzoegerungszeit abwarten
SET
CALL #t_SFB4_EVerz
IN:=TRUE
PT:=T#10S
Q :=#t_M_SFB4_EVerz
ET:=#t_Status_SFB4_EVerz
U #t_M_SFB4_EVerz
SPBN z401
// abgelaufen -> Zeit ruecksetzen, naechster IZ...
CALL #t_SFB4_EVerz
IN:=FALSE
PT:=T#5MS
Q :=#t_M_SFB4_EVerz
ET:=
L 402
T #IZ_FB
BE
z401: NOP 0
// Ende Netzwerk
Ich gruppiere z.B. die Schrittnummern so sinnvoll daß sogar andere Bausteine davon profitieren können in dem ich die Schrittnummer zur verfügung stelle (sogar im HMI anzeige) und durch simple Vergleiche >I / <I einer bestimmten Zahl weiss welcher globale Zustand (Stillstand, Betrieb, Gestört...) dort gerade herrscht...
Ich darf natürlich nicht über Netzwerkgrenzen hinweg springen.
Was ich mir jetzt vorstellen kann Platz zu sparen wäre wie schon gesagt ähnliche Teilketten zusammenzufassen und per Hilfsbits einen Grund für dessen Ausführung mitzugeben. So würde der Teil gleich gut erledigt, aber am HMI eine andere Meldung angezeigt sowie am Ende des Teils abhängig vom Hilfsbit hier oder dort weitergemacht - z.B. bei einer Störung der automatische Wiederanlauf blockiert werden und warten bis ein "Finger" den Taster an der Schranktüre betätigt hat (nachdem er hoffentlich die Fehlermelung am Panel gelesen und richtig interpretiert hat...).
Nur komme ich so auf keinen Fall unter die 16kB, leider...
Zu Godis Vorschlag noch mal was:
Wenn das so funktioniert wie ich jetzt denke daß es funktionieren müsste dann hätte ich die wenigste Arbeit damit - weil dann automatisch sichergestellt ist daß immer nur ein Schritt aktiv ist, egal in welchem der beiden (oder vielleicht später im fünften ?) FBs er liegt. Spätestens hier wäre die Sprungleiste gar nicht mehr einsetzbar...
Von der "Aufteilung" her bin ich ja flexibel weil es gar nicht so eine Rolle spielt welcher Schritt in welchem FB nachher liegt -> Ablauftechnisch zumindest wäre es trotzdem besser zu organisieren, ganz klar. Aber das geht ja wiederum spielend leicht in dem ich die Netzwerke nach belieben in Ihrer Reihenfolge sortiere. Trotzdem liegt dann immer nur in einem der FBs ein aktiver Schritt pro Zyklus.