Daten übergeben und sortieren, UDTs und Globale DBs

J.Hinz

Level-1
Beiträge
6
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich bekomme von einem FB einen Daten über einen ANY pointer übergeben.
Die Daten enthalten mehrere Narichtentypen verschiedener länge und sollen analysiert und verarbeitet werden in folgenden FBs.
Für die unterschiedlichen Narichten gibt es je eigene UDTs die ihre Form beschreiben.
Um die einzelnen Narichtentypen den folgenden Fbs bereitzustellen dachte ich an einen globalen DB der die entsprechenden UDTs enthält.

Da ich noch nicht wirklich gewandt in SCL bin mein Frage:
Wie gestallte ich hier am geschicktesten die Schnittstelle zwischen den einzelnen FBs und das sortieren in die entsprechenden UDTs.

Ungefähre Konzeption (pseudocode):

UDT100
UDT101
UDT102
...

DATEN_BLOCK DB100
UDT100
UDT101
...
END_DATENBLOCK


FB100(OUT: DATA:ANY)
?
FB200(IN DATA:ANY? , OUT: MESSAGE1:UDT100 in DB100? , MESSAGE2:UDT101 in DB100? ,.....)
?
FB300(IN: UDT100 in DB100)
FB300(IN: UDT101 in DB100)

Ich hoffe das, auch wenn sehr abstrakt, recht eindeutig erkennbar ist worauf ich hinaus will.

Da ich wieder (nach ein paar Kursen im Studium) recht neu in S7 und SCL bin sind mir die Übergaben noch etwas fremd.

Wenn es nur um ein Message Format ging könnte man das wohl recht einfach mit einer direkten übergabe oder einem blockmove machen,
aber wahrscheinlich gibts hier noch einige Kniffe das sauber zu machen.

Viele Dank und Viele Grüße

J
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Würde gerne eingehende Messagepackete in einen Globalen DB einordnen abhängig von deren Form.
Ungefähr wür ich das so machen, allerdings fehlt mir da die erfahrung für eine Funktionierende Idee.
Code:
DATA_BLOCK MESSAGES
MESSAGE1:UDT100;
MESSAGE2:UDT101;
END_DATA_BLOCK

VAR_IN
DATA:ANY;
END_VAR

VAR_OUT

END_VAr

VAR
MESSAGE1 AT DATA: STRUCT
CLIENTID:DINT;
BLOCKCOUNTER:DINT;
...
END_STRUCT

MESSAGE2 AT DATA: STRUCT
CLIENTID:DINT;
BLOCKCOUNTER:DINT;
...
END_STRUCT
END_VAR

BEGIN

COPY_ERROR:= SFC20(srcblk:= MESSAGE1, dstblk:= MESSAGES.MESSAGE1);
COPY_ERROR:= SFC20(srcblk:= MESSAGE2, dstblk:= MESSAGES.MESSAGE2);
END_FUNCTION_BLOCK

Vielleicht läßt sich das ja leichter lesen ;)
 
Zurück
Oben