Hirdetés

Új hozzászólás Aktív témák

  • Szirty

    őstag

    válasz DP_Joci #520 üzenetére

    Helló DP_Joci!

    "Az ANY pointeres dolog az érdekes lehet.
    Van esetleg egy példád erre, megpróbáltam kreálni egy ilyen pointert, de nem igazán tudok DB-re hivatkozni vele."

    Egyszer csináltam olyat, hogy különböző számú egyforma szerkezető DB-kből másoltam adatokat, ahol a DB számát a program kalkulálta ki. Itt ANY pointertípusban kellett összeállítani a címet, mert a másolás BLKMOV hívással történt, aminek ANY kell.
    Persze hogy nem találom.

    Ha megnézed az ANY felépítését:

    Akkor hamar kiderül hogyan kell összesakkozni egy címet.
    Csak arra kell nagyon vigyázni nehogy mellécímezzen az ember. Az indirekt címzés már csak ilyen. Jó nagyokat lehet vele szívni és alaposan tesztelni kell.

    A helpben van példa az "Example of the Data Type ANY" címszó alatt.

    FUNCTION FC1: INT
    TITLE = Transfer and handling of ANY pointers
    // Task :
    // This block should copy a source area to a target area using
    // SFC20 (BLKMOV) where the source is put together from
    // a number of individual parameters to form an Any pointer
    // and the target is already specified as an Any pointer.

    AUTHOR: SIEMENS
    FAMILY: TOOLS
    NAME: ANY_PTR
    VERSION: 00.01
    VAR_INPUT
    SRC_DB : INT;
    SRC_Byte : INT;
    SRC_Type : BOOL;
    SRC_Len : INT;
    DEST_Any : ANY;
    END_VAR

    VAR_TEMP
    T_AR1 : DWORD;
    T_AR2 : DWORD;
    T_SRC_Any : ANY;
    T_DEST_Any : ANY;
    Count : INT;
    SFC_Ret_Val: INT;
    END_VAR
    BEGIN
    NETWORK
    TITLE = Save the contents of the address registers AR1 and AR2
    TAR1 T_AR1;
    TAR2 T_AR2;
    NETWORK
    TITLE = Put together and check source area
    LAR1 P#T_SRC_Any; //Load start address of the source Any
    //pointer into AR1
    L B#16#10; //Enter syntax ID in the Any pointer
    T LB [AR1, P#0.0];

    L B#16#2; //Load area type BYTE
    AN SRC_Type; //If BYTE was chosen, then
    //jump to entry
    JC Tran;
    L B#16#4; //Otherwise load area type WORD
    Tran: T LB [AR1, P#1.0]; //and store in the Any pointer
    L SRC_Len; //Enter number of bytes/words to be
    //transferred
    T LW [AR1, P#2.0];
    L SRC_DB; //Enter source DB number
    T LW [AR1, P#4.0];
    L 0; //If source DB number = 0 then
    //transfer from bit memory area,
    ==I ; //otherwise from a DB
    JC Mem;

    L P#DBX0.0; //Load area pointer in data block
    JU Offs;
    Mem: L P#M0.0; //Load area pointer in bit memory area
    Offs: L SRC_Byte; //Load copy of the number of the first bytes to be copied SLD 3; //Convert to pointer format
    +D ; //Add to area pointer
    T LD [AR1, P#6.0]; //Enter result in ANY pointer
    NETWORK
    TITLE = Enter and check the target Any pointer
    L P#DEST_Any; //Place address of Any pointer in AR1
    LAR1 ;
    L B#16#2; //If the area type of the transferred
    //Any pointer
    L B [AR1, P#1.0]; //= byte or = word, the jump
    //follows
    ==I ;
    O( ;
    L B#16#4;
    ==I ;
    ) ;
    JC Copy;

    L W#16#80FF; //Otherwise load error code
    T RET_VAL; //Transfer to the caller
    JU End; //Finish block processing
    Copy: LAR2 P#T_DEST_Any; //Load address of temp. Any pointer
    L 5; //5 words must be copied
    Back: T Count;
    L W [AR1, P#0.0]; //Move the Any pointer
    //as an input variable to
    T LW[AR2, P#0.0]; //the local data
    +AR1 P#2.0;
    +AR2 P#2.0;
    L Count;
    LOOP Back;
    NETWORK
    TITLE = Call SFC20 (BLKMOV)

    CALL SFC20
    (
    SRCBLK := T_SRC_Any,
    RET_VAL := SFC_Ret_Val,
    DSTBLK := T_DEST_Any
    );
    NETWORK
    TITLE = Pass on return value of SFC
    L SFC_Ret_Val;
    T RET_VAL;
    NETWORK
    TITLE = Restore the contents of the address registers AR1 and AR2
    End: LAR1 T_AR1;
    LAR2 T_AR2;
    END_FUNCTION

    DATA_BLOCK DB10
    TITLE = Copy_In
    AUTHOR: SIEMENS
    FAMILY: EXAMPLE
    NAME: COPY_IN
    VERSION: 00.01
    STRUCT
    test: ARRAY[0..29] of BYTE;
    END_STRUCT;

    BEGIN
    END_DATA_BLOCK

    DATA_BLOCK DB11
    TITLE = Copy_Out
    AUTHOR: SIEMENS
    FAMILY: EXAMPLE
    NAME: COPY_OUT
    VERSION: 00.01
    STRUCT
    test: ARRAY[0..29] of BYTE;
    END_STRUCT;
    BEGIN
    END_DATA_BLOCK

    ORGANIZATION_BLOCK OB1
    TITLE = Cycle
    AUTHOR: SIEMENS
    FAMILY: EXAMPLE
    NAME: OB_CYC
    VERSION: 00.01
    VAR_TEMP
    OB1_System: array [1..20] of byte;
    Src_Db : INT;
    Src_Byte : INT;
    Src_Type : BOOL;
    Src_Len : INT;
    END_VAR
    BEGIN
    NETWORK
    TITLE = First call example for FC1

    // This call for FC1 copies 5 words from memory byte 33
    // to DB10 from data byte 3. This means the memory
    // words 33, 35, 37, 39, and 41 are copied to the data
    // words 3, 5, 7, 9, and 11 of DB10.
    L 0;
    T Src_Db;
    L 33;
    T Src_Byte;
    Set ;
    = Src_Type;
    L 5;
    T Src_Len;
    CALL FC1
    (
    SRC_DB := Src_Db,
    SRC_Byte := Src_Byte,
    SRC_Type := Src_Type,
    SRC_Len := Src_Len,
    DEST_Any := P# DB10.DBX 3.0 BYTE 20,
    RET_VAL := MW100
    );


    NETWORK
    TITLE = Second call example for FC1
    // This call for FC1 copies 7 bytes from DB11 from
    // data byte 13 to the process output image from
    // QB99. This means the data bytes 13 to 19
    // of DB11 are copied to the output bytes 99 - 105.
    L 11;
    T Src_Db;
    L 13;
    T Src_Byte;
    CLR ;
    = Src_Type;
    L 7;
    T Src_Len;
    CALL FC1
    (
    SRC_DB := Src_Db,
    SRC_Byte := Src_Byte,
    SRC_Type := Src_Type,
    SRC_Len := Src_Len,
    DEST_Any := P# Q 99.0 WORD 5,
    RET_VAL := MW100
    );

    END_ORGANIZATION_BLOCK

Új hozzászólás Aktív témák