TYPE UDT_ANY_Pointer
STRUCT //10 Byte ANY Pointer e.g. P#DBxx.DBx0.0 Byte 10
Syntax_ID: BYTE; //Always 10 Hex
DataTyp: BYTE; //Code for data type
Count: WORD; //Number of Byte
DB_Number: WORD; //Number of DB
Byte_Pointer: DWORD; //Pointer to bit- and byte address
END_STRUCT
END_TYPE
FUNCTION Call_SFC14_15: INT
VAR_INPUT
SFC15_Select: BOOL; //0=SFC14 read data, 1=SFC15 write data
DP_Adresse: WORD; //DP-address ID LADDR
Byte_Count: INT; //Number of byte (consistent data)
DB_Nummer: INT; //Nummer of DB (which contains consistent data)
DB_Byte_Adr: INT; //Starting address (byte) of data in the DB
END_VAR
VAR_TEMP
Buffer: UDT_ANY_Pointer;
Temp_Any_Pointer AT Buffer: ANY;
Error: INT;
END_VAR
//Supply 10 byte buffer for the ANY Pointer
Buffer.Syntax_ID:= b#16#10; //Length of buffer
Buffer.DataTyp:= 2; //Code for data type BYTE
Buffer.Count:= INT_TO_WORD(Byte_Count); //Number of used data (byte)
Buffer.DB_Number:= INT_TO_WORD(DB_Nummer); //Number of destination DB for your data
Buffer.Byte_Pointer:= dw#16#84000000; //Zero pointer on global data DBX0.0 (over several areas)
//Load byte address in pointer:
Buffer.Byte_Pointer:= Buffer.Byte_Pointer OR (SHL(in:=WORD_TO_DWORD(INT_TO_WORD(DB_Byte_Adr)),N:=3));; //这行程序为什么要这么编写,有什么功用呢?
IF SFC15_Select THEN
Error:= DPWR_DAT(LADDR:= DP_Adresse, RECORD:= Temp_Any_Pointer); //Write data with SFC15
ELSE
Error:= DPRD_DAT(LADDR:= DP_Adresse, RECORD:= Temp_Any_Pointer); //Read data with SFC14
END_IF;
//为什么SFC15_Select 0=SFC14 read data, 1=SFC15 write data
Call_SFC14_15:= Error;
END_FUNCTION