Geschachtelte IF-Anweisungen mit Funktionsbausteinsprache realisieren

floh2508

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

ich nutze in TwinCAT3 die TF1910 UML Funktionen um bestehende StateMachines in Zustandsautomaten zu übertragen.
Aufgrund komplexer Transitionsbedingungen lager ich diese in separate Transitionselemente aus und rufe diese an der entsprechenden Stelle im Zustandsautomaten auf.
Vorgabe ist es die ausgelagerten Transitionen in Funktionsbausteinsprache zu realisieren.

Ich bin gerade an einer Transition, welche aus einer Vielzahl geschachtelter IF-Anweisungen besteht:

IF(PRG_Hauptspindeln.bFastTaskEnable AND (FPRG_EtherCatCom.SoE_Antrieb[diAxisNr].DriveStatusWord AND stSoE.ReadyPowerON(*Globale_Const.wCnst_SoE_ReadyPowerON*)) <> 0)
AND FPRG_EtherCatCom.SoE_Antrieb[diAxisNr].ECatState = stSoE.EcatStateOPmode(*Globale_Const.wCnst_SoE_EcatStateOPmode*)
THEN
IF( (stPbInData.wSTW1 AND stSTW1.NichtAUS3) <> 0) THEN (* TA2 *)
IF( (stPbInData.wSTW1 AND stSTW1.NichtAUS2) <> 0) THEN
IF( (stPbInData.wSTW1 AND stSTW1.Fuehrung) <> 0) THEN
IF( (stPbInData.wSTW1 AND stSTW1.NichtAUS1) = 0) THEN
stPbOutData.wZSW1:= stPbOutData.wZSW1 AND NOT stZSW1.Einschaltsperre;
iSAstate:= 3;
END_IF
END_IF
END_IF
END_IF
END_IF

Meine erste Idee ist es an dieser Stelle für jede IF-Anweisung ein Netzwerk zu erstellen, welches dann wiederum mit der nächsten Stufe (IF-Anweisung) verknüpft wird. Dies stelel ich mir so vor, dass der Ausgang des ersten Netzwerkes mit der Bedingung der nächsten IF-Anweisung mittels AND verbunden wird. Ist dies ein in der Praxis zulässiges Vorgehen?

Ich habe gerade die Sprung- und Marken-Funktionen in dem Infosys von Beckhoff gefunden. So wie ich es verstehen ist die eine bessere Umsetzung, da ich mit dem Sprung-befehl in die Marke des nächsten Netzwerks springen kann und somit in die nächste IF-Anweisung. Sehe ich das richtig so?

Vielen Dank im Voraus für eure Tipps.

Gruß Floh
 
Zuletzt bearbeitet:
Hallo Floh,

ganz blöd gefragt:

Du hast 5 IF-Anweisungen mit mehreren Bedingungen, alle UND-verknüpft und am Ende lediglich zwei Zuweisungen... warum willst du das in Netzwerke trennen und machst da nicht ein großes UND in FUP draus.

Ansonsten kannst du das machen... ob das schön ist... ist fraglich:

Ich nehme mal an, dass du folgendes meinst:
if_vers_1.PNG

und frage mich, warum du es nicht so machst
if_vers_2.PNG

oder ich habe die Frage nicht verstanden...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ads_0x1,

du hast meine Frage richtig verstanden.

An die Lösung mit einem großen Netzwerk hatte ich auch gedacht, allerdings erschien mir die Variante mit den getrennten Netzwerken als übersichtlicher.
Mir ist jedoch gerade aufgefallen, dass ich zum Verknüpfen der Netzwerke weitere Variablen benötige. Dies bedeutet zusätzlichen Speicherbedarf, welchen ich möglichst gering halten soll.

Wenn ich ein großes Netzwerk erstelle, ist es doch noch möglich eine Fehlerdiagnose online zu betreiben oder? Damit meine ich, dass ich kontrollieren kann, welche der IF-Anweisungen nicht erfüllt wird.
Der Signalfluss wird doch farblich angezeigt oder?
 
Hallo Floh,

ja, es wird farblich gekennzeichnet, allerdings gibt es beispielsweise bei Siemens das Problem, wenn Netzwerke zu groß werden, bekommt Step7 das nicht mehr alles gerendert und du siehst live nur einen Teil des Signalflusses. In wieweit dieses Phänomen bei Codesys existiert, kann ich leider nicht sagen.

Zum Speicherbedarf:
Du brauchst eigentlich nur eine einzige Boolsche Variable, die du immer weiterverwendest, damit belegst du ein Bit im Speicherabbild... das sollte immer noch irgendwo zu finden sein. Außerdem kann es ja auch sein, dass du das Zwischenergebnis aus anderen Gründen noch für andere Sachen benötigst. Bei dem Beispiel von mir kannst du einfach aus teilergbenis_1, teilergbenis_2, teilergbenis_3 ein normales "teilergebnis" machen, dann funktioniert das auch.

Schau dir einfach nachher an, wie groß dein Netzwerk ist und entscheide selber, in wie weit das übersichtlich ist. Wenn es größer als eine Bildschirmseite wird, dann ist das schon nicht so schön zum nachverfolgen, wenn du aber 20 einzelne Netzwerke brauchst, ist das auch irgendwie blöd...
 
Vorgabe ist es die ausgelagerten Transitionen in Funktionsbausteinsprache zu realisieren.
Deine verschachtelten IF haben keinen ELSE-Zweig (typisch für Programmieranfänger) - d.h. falls nicht alle Bedingungen erfüllt sind, dann hat das Konstrukt kein Ergebnis, keine Aktion, keine Zuweisung.
Das FUP-Zusammenschalten von AND-, OR-, ...-Blöcken auf eine Variable hat immer eine Zuweisung zur Folge.
Du mußt nachdenken, ob Dein IF-Entwurf korrekt ist oder die FUP-Schaltung. Die FUP-Entsprechung für "IF" ist "SEL".


Ich habe gerade die Sprung- und Marken-Funktionen in dem Infosys von Beckhoff gefunden. So wie ich es verstehen ist die eine bessere Umsetzung, da ich mit dem Sprung-befehl in die Marke des nächsten Netzwerks springen kann
Sprünge sollten eigentlich nicht notwendig sein. Sprünge sind als "Spaghettiprogrammierung" sehr verpönt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Harald,

erstmal danke für die Infos.

Zu dem Programmcode muss ich anmerken, dass dieser aus dem aktuellen Maschinenprojekt meiner Firma entspricht. Für unsere Anwendung ist diese Umsetzung hinreichend, da bei icht Erfüllung der Bedingung in dem aktuellen CASE verweilt wird.

Dein Tipp mit dem SEL-Operator war genau das richtige. Diese Umsetzung gefällt mir bei weitem besser als meine erste Idee mit den ANDs.

Die Sprünge und Marken habe ich auch verworfen.
 
Zurück
Oben