Hallo,

wusste doch, dass ich was von 6 Byte entsprechen einem Pointer gelesen haben.
Sind aber nicht nur BOOL, die nicht als Pointer vorliegen.

Code:
Typ                                     Belegter Platz

BIT                                      0.1
BYTE                                    1
WORD                                   2
DWORD                                 4

INT                                      2
DINT                                    4
REAL                                    4

S5TIME                                 2
TIME                                    4
DATE                                    2
TIME_OF_DAY                        4

STRUCT                                6    <- Zeiger 
ARRAY[x..y]                           6    <- Zeiger
Die nächste Erkenntnis bzw. wissenswert für mich ist, dass STRUCT und ARRAY in den anderen Deklarations... (VAR_INPUT, VAR_OUTPUT, usw.) die tatsächliche Größe belegen und nicht 6 Byte.

VAR_INPUT Parametern kann man im aufgerufenen FB neue Werte zuweisen. Und diese dann im aufrufenden FB/OB aus dem instanz DB des FB herausholen (wie bei VAR_OUT).

VAR_IN_OUT Parameter beinhalten immer den aktuellen Wert.

VAR_OUT Parameter können einem FB beim Aufruf nicht zugewiesen werden.


------------------------------------
Test Beispiel:

UDT
Code:
TYPE UDT1
    STRUCT
            StrIn      : INT;
            StrOut     : INT;
            StrInOut   : INT;
    END_STRUCT
END_TYPE
DB
Code:
DATA_BLOCK DB1
//
// Baustein-Kommentar ...
//
    STRUCT
        gStr        : UDT1;
        
        WertIn      : INT;
        WertOut     : INT;
        WertInOut   : INT;
    END_STRUCT
BEGIN

END_DATA_BLOCK
FB
Code:
FUNCTION_BLOCK FB2


// Bausteinparameter
VAR_INPUT
    // Eingangsparameter
    WertIn  : INT;
    StrIn   : UDT1;
END_VAR

VAR_IN_OUT
    // Durchgangsparameter
    WertInOut  : INT;
    StrInOut   : UDT1;
END_VAR

VAR_OUTPUT
    // Ausgangsparameter
    WertOut  : INT;
    StrOut   : UDT1;
END_VAR


    // Anweisungsteil
    WertIn      := WertIn   + 1;
    WertOut     := WertOut  + 1;
    WertInOut   := WertInOut+ 1;
    
    StrIn.StrIn         := StrIn.StrIn          + 1;
    StrOut.StrOut       := StrOut.StrOut        + 1;
    StrInOut.StrInOut   := StrInOut.StrInOut    + 1;
    
END_FUNCTION_BLOCK
Inztanz DB zu FB
Code:
DATA_BLOCK DB2

FB2

BEGIN

END_DATA_BLOCK
OB zum Aufruf von FB
Code:
ORGANIZATION_BLOCK OB31

VAR_TEMP
    // reserviert
    info : ARRAY[0..19] OF BYTE;
    // temporäre Variablen
END_VAR  
    
    
    // Zuweisung   


    FB2.DB2(         
         WertIn     := DB1.WertIn
        ,StrIn      := DB1.gStr
        ,WertInOut  := DB1.WertInOut
        ,StrInOut   := DB1.gStr
        );
        
        DB1.WertIn := DB2.WertIN;
        DB1.gStr.StrIn := DB2.StrIn.StrIn;
        
        DB1.WertOut := DB2.WertOut;
        DB1.gStr.StrOut := DB2.StrOut.StrOut;

END_ORGANIZATION_BLOCK
Wie am Anfang gesagt, es ist ein Test. Inwieweit es Sinn mach die Parameter so zu verwenden muss man sich überlegen.

----
Aber nun habe ich doch das gute Gefühl, dass ich es begriffen habe!
War ein langer gedanken Weg von nach .

Vielen Dank euch allen für eure Kommentare, die mich hier her gebracht haben.