恭喜,你发布的帖子
发布于 2024-05-13 22:47:33
1楼
------------------------------------------------------------
TYPE "typeBoolConfig"
VERSION : 0.1
STRUCT
memory : Char;
"byte" : DInt;
bit : Int;
symbolName : String;
END_STRUCT;
END_TYPE
FUNCTION_BLOCK "FB_GetSymbolByAddress"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_OUTPUT
O_str_symbol { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : String[32]; // symbol name of address
O_b_status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // status bit
O_b_error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // error bit
O_w_status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // status word
END_VAR
VAR_IN_OUT
IO_arr_boolCfg : Array[*, *] of "typeBoolConfig"; // configuration of I/O
IO_dint_byte { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // set from HMI/SCADA
IO_int_bit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // set from HMI/SCADA
END_VAR
VAR
statLower { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt;
statUpper { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt;
END_VAR
VAR_TEMP
tempBoolConfig : "typeBoolConfig";
tempByteSet : DInt;
tempBitSet : Int;
tempSymbolName : String;
tempBitStatus : Bool;
tempConfigOkBit : Bool;
tempStatusWord : Word;
tempErrorBit : Bool;
END_VAR
VAR CONSTANT
MAX_BYTE : DInt := 10#1024; // max byte value
MIN_BYTE : DInt := 10#0;
MAX_BIT : DInt := 10#7; // max bit value
MIN_BIT : DInt := 10#0;
BYTE_WIDTH : DInt := 10#8;
NOT_DB : DInt := 10#0;
INPUT : Byte := 16#81; // input memory
OUTPUT : Byte := 16#82; // output memory
ZERO_DINT : DInt := 16#0000;
ZERO_INT : Int := 16#0000;
ERROR_NO_ERROR : Word := 16#0000;
ERROR_BYTE_DOWN_OVERFLOW : Word := 16#2522;
ERROR_BYTE_UP_OVERFLOW : Word := 16#2523;
ERROR_BIT_DOWN_OVERFLOW : Word := 16#2522;
ERROR_BIT_UP_OVERFLOW : Word := 16#2523;
ONE_DIMENSION : UDInt := 16#1; // read array by one dimension
INPUT_TYPE : Char := 'I';
OUT_TYPE : Char := 'Q';
END_VAR
BEGIN
REGION Descripation
END_REGION
REGION Initialization
#tempByteSet := #IO_dint_byte;
#tempBitSet := #IO_int_bit;
END_REGION
REGION CheckError
//GetArrayLowerAndUpper
#statLower := LOWER_BOUND(ARR := #IO_arr_boolCfg, DIM := #ONE_DIMENSION);
#statUpper := UPPER_BOUND(ARR := #IO_arr_boolCfg, DIM := #ONE_DIMENSION);
//CheckByte
IF #tempByteSet < #ZERO_DINT THEN
#tempStatusWord := #ERROR_BYTE_DOWN_OVERFLOW;
END_IF;
IF #tempByteSet > #MAX_BYTE OR #tempByteSet > #statUpper THEN
#tempStatusWord := #ERROR_BYTE_UP_OVERFLOW;
END_IF;
//CheckBit
IF #tempBitSet < #ZERO_INT THEN
#tempStatusWord := #ERROR_BIT_DOWN_OVERFLOW;
END_IF;
IF #tempBitSet > #MAX_BIT THEN
#tempStatusWord := #ERROR_BIT_UP_OVERFLOW;
END_IF;
// CheckConfig
#tempConfigOkBit := #tempByteSet >= #statLower
AND #tempByteSet <= #statUpper
AND #tempByteSet <= #MAX_BYTE
AND #tempBitSet >= #ZERO_INT
AND #tempBitSet <= #MAX_BIT;
END_REGION
REGION Main
IF #tempConfigOkBit = TRUE THEN
#tempStatusWord := #ERROR_NO_ERROR;
#tempBoolConfig := #IO_arr_boolCfg[#IO_dint_byte, #IO_int_bit];
#tempSymbolName := #tempBoolConfig.symbolName;
IF #tempBoolConfig.memory = #INPUT_TYPE THEN
#tempBitStatus := PEEK_BOOL(area := #INPUT,
dbNumber := #NOT_DB,
byteOffset := #tempBoolConfig."byte",
bitOffset := #tempBoolConfig.bit);
END_IF;
IF #tempBoolConfig.memory = #OUT_TYPE THEN
#tempBitStatus := PEEK_BOOL(area := #OUTPUT,
dbNumber := #NOT_DB,
byteOffset := #tempBoolConfig."byte",
bitOffset := #tempBoolConfig.bit);
END_IF;
END_IF;
END_REGION
REGION Output
#O_str_symbol := #tempSymbolName;
#O_b_status := #tempBitStatus;
#O_b_error := #tempErrorBit := NOT #tempConfigOkBit;
#O_w_status := #tempStatusWord;
END_REGION
END_FUNCTION_BLOCK
请填写推广理由:
分享
只看
楼主