Hallo Emilio,
generell kannst du auf diesen Programmteil verzichten. Er dient eigentlich nur dazu, nach Möglichkeit zu überprüfen ob an dem Bausteinparameter tatsächlich der richtige ANY angetragen ist.
Mit dem Aufbau von Pointern und ANY-Pointern hast du dich schon angefreundet?
In der Variable "SZP.ZEIGER" steht ein bereichsübergreifender Zeiger, so wie er in dem ANY-Pointer enthalten ist. Dieser besteht aus vier Byte.
Code:
00000000_00000yyy_yyyyyyyy_yyyyyxxx - bereichsinterner Zeiger (der Vollständigkeit halber)
10000zzz_00000yyy_yyyyyyyy_yyyyyxxx - bereichsübergreifender Zeiger
Die "1" ganz links unterscheidet die beiden.
"zzz" kennzeichnet den Operandenbereich, "100" steht für Globaldaten (DBX).
Die y.. bilden die Byte-Adresse und x.. bilden die Bit-Adresse.
Die Nullen haben keine Bedeutung.
Durch "SHR" wird das Bitmuster um 24 Stellen (N:=24) nach rechts verschoben, frei werdende Stellen werden mit Nullen aufgefüllt. Das linke Byte steht jetzt rechtsbündig im Akku. Wenn dieses Byte nicht "10000100" beinhaltet, wird die Bearbeitung des Bausteins abgebrochen. Das dient u.a. auch dazu, die Dummheit zu verhindern, Parameter wie Schaltzeiten in den Lokaldaten ab zu legen. Manche Leute machen so etwas.
Mit "SZP.TYP <> 16#02"wird überprüft, ob der Datentyp als "Byte" angegeben ist. Symbolisch angelegte ANY-Pointer werden vom Compiler mit dem Datentyp "Byte" generiert. Die Erkennung des Datentyps ist wichtig, da er zur Ermittlung der Anzahl der Datensätze von Bedeutung ist. Greift man auf einen Datenbereich zu, der nicht in ein ARRAY oder STRUCT verpackt ist, dann kann man den Parameter auch absolut angeben und auch mit anderen Datentypen (z.Bsp. "P#DB1.DBX0.0 WORD 100"). Der Baustein würde jeden ANY-Pointer annehmen. Daher macht eine Überprüfung generell schon Sinn.
Mit "SZP.ANZAHL_TYP MOD 10" wird ganz einfach noch mal überprüft, ob der Datenbereich genau durch 10 teilbar ist. Bei verschachtelten STRUCTs können leicht mal Schreibfehler am ANY passieren, die u.U. hierdurch erkannt werden.
Man kann diese Überprüfung weglassen. Man könnte aber auch, wie es nutellahase schon genannt hat, Fehlercodes erzeugen und an RET_VAL als INT ausgeben. Für den Schaltuhr-Ausgang dann einen normalen OUT verwenden.
"RETURN" beendet die Bearbeitung des Bausteins. Bei einer FC ist wichtig dass vorher, bzw. generell in jedem Zyklus, alle Ausgänge beschrieben werden, "SCHALTZEITUHR := false" steht deswegen ganz weit oben!
Gruß, Onkel