also...
1. das fummeln am AR2 ist in FBs recht gefährlich, du musst es nach verwendung unbedingt wieder zurücksichern. Der ganze Zugriff auf deine Statvariablen bassiert auf dem AR2, und wenn du den irgendwo verbiegst, dann pasen die Zugriffe danch nicht mehr...
also vorher
TAR2 #T_AR2
und danach
LAR2 #T_AR2
#T_AR2 ist DWORD im temp bereich
2. wie thomas schon sagte geht das mit INOUT so nicht, in dem Fall wird nicht die Struktur übergeben, sonder ein abgespeckter ANY-Zeiger, ein sogenanter "6-byte_pointer". das siehst du relativ leicht wenn du nach der struktur noch ne variable deklarierst, dann siehst du das der utd nur 6 byte hat...
3. den aufbau von anypointer findest du ind er faq hier oder in der hilfe gut beschrieben, er enrhält im wesenltichen den db, die startadresse und die länge des datenblocks.
ein "6-byte-pointer" enthält nur startadresse und länge
4. ich würde anstelle des udt am inout einfach einen any an die in-schnittstelle machen, da kannst du später auch deine struktur symbolisch dranpacken. du hast dann mittels des ans im baustein alles was du brauchst um deine daten zu adressieren.
der zugriff über inout mitels "6-byte-pointer" ist im mc7 code später auch nichts anderes als ein indirekter zugriff auf jede variable, sprich späte in der sps wird für jeden variablenzugriff ein pointer gerechnet - diese bausteine werden deshlab RIESIG im vergleich zur folgenden lösugn wo anfangs alle in den temp bereich kopiert und am ende wieder zurück wird.
(riesig und die pointerrechnerei geht auch noch auf die laufzeit)
5. vorschlag
IN als any wo de struktur später aussen dran kommt(UDT_blabla)
ANY im temp bereich deklarieren (ANY_Aktoren)
struktur im temp bereich deklarieren (blabla)
mit dem any einen pointer für nen blockmov (sfc20) bauen und umkopieren
Pointer einlesen
Code:
L P##UDT_blabla
LAR1
L B [AR1,P#0.0] // Syntax-ID aus dem Any-Pointer auslesen
T #SyntaxID
L B [AR1,P#1.0] // Bereichstyp auslesen (B#16#2 = Byte; B#16#3 = Int; B#16#4 = Word; B#16#7 = DInt; B#16#8 = DWord)
T #Bereichstyp
L W [AR1,P#2.0] // Anzahl der zu übertragenden Werte (Byte/Word)
T #Anzahl_Werte
L W [AR1,P#4.0] // DB-Nummer auslesen
T #DB_Nr
L D [AR1,P#6.0] // Pointer Startadresse auslesen
T #Startadresse
pointer für blockmove bauen
Code:
L P##ANY_blabla
LAR1
L #SyntaxID
T B [AR1,P#0.0] // Syntax-ID in den Any-Pointer schreiben
L #Bereichstyp
T B [AR1,P#1.0] // Bereichstyp schreiben (B#16#2 = Byte; B#16#4 = Word)
L #Anzahl_Werte
T W [AR1,P#2.0] // Anzahl der zu übertragenden Werte (Byte/Word)
L #DB_Nr
T W [AR1,P#4.0] // DB-Nummer schreiben
L #Startadresse
T D [AR1,P#6.0] // Pointer Startadresse schreiben
daten in dem temp breich kopieren
Code:
CALL "BLKMOV"
SRCBLK :=#ANY_blabla
RET_VAL:=#retval
DSTBLK :=#blabla
hier steht dein programm wo du die daten im temp bereich manipulierst bzw. die temp struktur auch an die aufgerufenen fcs übergibst (in denen kannst du ja so wie du es hast arbeiten - achte nur auf die codelänge wegen der zugriffe, wenn dir der code zu lange wird, kannst du es ja auch so machen wie beim fb
am ende des fb muss der inhalt der temp struktur zurück in die anparametrierte struktur...
Code:
CALL "BLKMOV"
SRCBLK :=#blabla
RET_VAL:=#retval
DSTBLK :=#ANY_blabla