-> Hier kostenlos registrieren
Hallo,
ich habe an einer IN_OUT Schnittstelle eins FB (multiinstanz) ein UDT den ich im Baustein natürlich direkt beschreiben/lesen kann. Wenn ich in dem UDT allerdings ein Datentyp benutze der länger als 4 Byte ist oder einen STRING, funktioniert das ja nicht mehr weil die IN_OUT Schnittstelle nur als Pointer in den FB übergeben wird. Soweit so gut...
Jetzt zu meiner Frage.
In einem DB ist für jeden Aufruf des FB einmal der besagte UDT. Hier ein Beispiel:
UDT500 = 16 Byte
Zeit_1 / DATE_AND_TIME
Zeit_2 / DATE_AND_TIME
DB500 = 48 Byte
Aufruf_1 / UDT500
Aufruf_2 / UDT500
Aufruf_3 / UDT500
Die drei Aufrufe stehen jetzt an meiner IN_OUT Schnittstelle der drei FB´s:
FB500 Aufruf_1: IN_OUT = P#DB500.DBX0.0 Byte 16
FB500 Aufruf_2: IN_OUT = P#DB500.DBX16.0 Byte 16
FB500 Aufruf_3: IN_OUT = P#DB500.DBX32.0 Byte 16
Jetzt möchte ich im FB500 natürlich den jeweiligen Datenbereich des richtigen Aufrufs beschreiben. Hierfür wollte ich den Pointer der IN_OUT Schnittstelle auslesen und mir daraus einen individuellen Any-Pointer bilden. Die beiden DATE_AND_TIME die ich ausgeben möchte liegen im TEMP (Byte 0-15). Hier mein FB500:
FB500
IN_OUT 0.0 / Schnittstelle / UDT500 (6 Byte)
TEMP 0.0 / Zeit_1 / DATE_AND_TIME
TEMP 8.0 / Zeit_2 / DATE_AND_TIME
TEMP 16.0 / IN_OUT_Datenbaustein / INT
TEMP 18.0 / IN_OUT_Anfangsadresse / DWORD
TEMP 22.0 / Zielzeiger / Any
LAR1 P#Schnittstelle
L W [AR1,P#0.0] (AKKU1 = 500)
T #IN_OUT_Datenbaustein
L D [AR1,P#2.0] (AKKU1 = 16#84000000)
L 16#00FFFFFF
UD
T #IN_OUT_Anfangsadresse
Wenn ich den Baustein beobachte liegt hier offensichtlich schon der Fehler. In meiner Variable #IN_OUT_Datenbaustein steht wie gewünscht "500" (Datenbaustein der UDT an der IN_OUT_Schnittstelle). Leider steht im Byte 3-5 nicht wie erwartet der Anfangsbereich meiner UDT (Aufruf_1 = P#0.0; Aufruf_2 = P#16.0; Aufruf_3 = P#32.0) sondern immer nur P#0.0. Im Byte 3, welches ja ausgeblendet wird, steht sogar 16#84 (Speicherbereich Datenbaustein). Aber den Versatz von der UDT im jeweiligen Aufruf bekomme ich nicht raus .
Zur Vervollständigung noch der weitere Baustein:
LAR1 P##Zielzeiger
L B#16#10 (S7-Kennung)
T B [AR1,P#0.0]
L B#16#2 (Datentyp Byte)
T B [AR1,P#1.0]
L 16 (Länge der beiden DATE_AND_TIME)
T W [AR1,P#2.0]
L #IN_OUT_Datenbaustein (Datenbaustein der angegebenen UDT)
T W [AR1,P#4.0]
L #IN_OUT_Anfangsadresse (Anfangsadresse der angegeben UDT, welche bei mir leider immer P#0.0 ist)
T D [AR1,P#6.0]
L B#16#84 (Speicherbereich für Datenbaustein)
T B [AR1,P#6.0]
SFC20 soll dann nur
P#L0.0 Byte 16 -> #Zielzeiger
kopieren.
Vielen Dank vorab für die Unterstützung .
Gruss
ich habe an einer IN_OUT Schnittstelle eins FB (multiinstanz) ein UDT den ich im Baustein natürlich direkt beschreiben/lesen kann. Wenn ich in dem UDT allerdings ein Datentyp benutze der länger als 4 Byte ist oder einen STRING, funktioniert das ja nicht mehr weil die IN_OUT Schnittstelle nur als Pointer in den FB übergeben wird. Soweit so gut...
Jetzt zu meiner Frage.
In einem DB ist für jeden Aufruf des FB einmal der besagte UDT. Hier ein Beispiel:
UDT500 = 16 Byte
Zeit_1 / DATE_AND_TIME
Zeit_2 / DATE_AND_TIME
DB500 = 48 Byte
Aufruf_1 / UDT500
Aufruf_2 / UDT500
Aufruf_3 / UDT500
Die drei Aufrufe stehen jetzt an meiner IN_OUT Schnittstelle der drei FB´s:
FB500 Aufruf_1: IN_OUT = P#DB500.DBX0.0 Byte 16
FB500 Aufruf_2: IN_OUT = P#DB500.DBX16.0 Byte 16
FB500 Aufruf_3: IN_OUT = P#DB500.DBX32.0 Byte 16
Jetzt möchte ich im FB500 natürlich den jeweiligen Datenbereich des richtigen Aufrufs beschreiben. Hierfür wollte ich den Pointer der IN_OUT Schnittstelle auslesen und mir daraus einen individuellen Any-Pointer bilden. Die beiden DATE_AND_TIME die ich ausgeben möchte liegen im TEMP (Byte 0-15). Hier mein FB500:
FB500
IN_OUT 0.0 / Schnittstelle / UDT500 (6 Byte)
TEMP 0.0 / Zeit_1 / DATE_AND_TIME
TEMP 8.0 / Zeit_2 / DATE_AND_TIME
TEMP 16.0 / IN_OUT_Datenbaustein / INT
TEMP 18.0 / IN_OUT_Anfangsadresse / DWORD
TEMP 22.0 / Zielzeiger / Any
LAR1 P#Schnittstelle
L W [AR1,P#0.0] (AKKU1 = 500)
T #IN_OUT_Datenbaustein
L D [AR1,P#2.0] (AKKU1 = 16#84000000)
L 16#00FFFFFF
UD
T #IN_OUT_Anfangsadresse
Wenn ich den Baustein beobachte liegt hier offensichtlich schon der Fehler. In meiner Variable #IN_OUT_Datenbaustein steht wie gewünscht "500" (Datenbaustein der UDT an der IN_OUT_Schnittstelle). Leider steht im Byte 3-5 nicht wie erwartet der Anfangsbereich meiner UDT (Aufruf_1 = P#0.0; Aufruf_2 = P#16.0; Aufruf_3 = P#32.0) sondern immer nur P#0.0. Im Byte 3, welches ja ausgeblendet wird, steht sogar 16#84 (Speicherbereich Datenbaustein). Aber den Versatz von der UDT im jeweiligen Aufruf bekomme ich nicht raus .
Zur Vervollständigung noch der weitere Baustein:
LAR1 P##Zielzeiger
L B#16#10 (S7-Kennung)
T B [AR1,P#0.0]
L B#16#2 (Datentyp Byte)
T B [AR1,P#1.0]
L 16 (Länge der beiden DATE_AND_TIME)
T W [AR1,P#2.0]
L #IN_OUT_Datenbaustein (Datenbaustein der angegebenen UDT)
T W [AR1,P#4.0]
L #IN_OUT_Anfangsadresse (Anfangsadresse der angegeben UDT, welche bei mir leider immer P#0.0 ist)
T D [AR1,P#6.0]
L B#16#84 (Speicherbereich für Datenbaustein)
T B [AR1,P#6.0]
SFC20 soll dann nur
P#L0.0 Byte 16 -> #Zielzeiger
kopieren.
Vielen Dank vorab für die Unterstützung .
Gruss
Zuletzt bearbeitet: