FUNCTION_BLOCK FB1000
Know_How_Protect;
VAR_TEMP
I,j,ii,NumP,NumPP:INT;
S :BOOL;
END_VAR
VAR_INPUT
DB_No :INT;//数据块编号
DBw_No :INT;//数据块开始字
IN_Data :INT;//要写入数据
Lenght :INT;//写入总长度
Big_On_Off :BOOL;//是否从大到小排列
Little_On_Off :BOOL;//是否从小到大排列
RegEqual :BOOL;//是否要踢除相同的数据
END_VAR
VAR_OUTPUT
Re_Lenght :INT;//数据块数据长度
ScuB :BOOL;//写入数据是否成功
END_VAR;
i:=0;
j:=0;
ii:=0;
Nump:=0;
Numpp:=0;
//*********************************获取当前数据毕数********************************
FOR I:=0 TO((Lenght*2)-2) BY 2 DO
IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I])>0 THEN
NumPP:=NumPP+1;
ELSE
EXIT;
END_IF;
END_FOR;
//*********************************将指定数据写入表中********************************
IF Lenght>NumPP THEN
IF RegEqual THEN // 判定待写入数据是否已填入表中
FOR I:= 0 TO((Lenght*2)-2) BY 2 DO
IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+I])=In_Data THEN
S:=TRUE;
EXIT;
ELSE
S:=FALSE;
END_IF;
END_FOR;
END_IF;
IF NOT S THEN
FOR I:=0 TO((Lenght*2)-2) BY 2 DO
IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I])>0 THEN
IF I<((Lenght*2)-2) THEN
IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I+2])=0 THEN
WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I+2]:=INT_TO_WORD(IN_Data);
EXIT;
END_IF;
ELSE
WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I]:=INT_TO_WORD(IN_Data);
END_IF;
ELSE
WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I]:=INT_TO_WORD(IN_Data);
IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I])>0 THEN
EXIT;
END_IF;
END_IF;
END_FOR;
END_IF;
FOR I:=0 TO((Lenght*2)-2) BY 2 DO
IF WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+I])>0 THEN
NumP:=Nump+1;
ELSE
EXIT;
END_IF;
END_FOR;
RE_Lenght:=NumP;
//**************************************** 表中从小到大排列**************************************************
IF (NOT Big_On_Off)AND(Little_On_Off)AND(WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No])>0)AND(WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+2])>0)THEN
FOR I:= 0 TO (NumP-1) DO
FOR J:= 0 to((NumP*2)-2) BY 2 DO
IF j<((NumP*2)-2) THEN
IF (WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J])> WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2])) THEN
II:=WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J]);
WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J]:=WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2];
WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2]:=INT_TO_WORD(II);
END_IF;
END_IF;
END_FOR;
END_FOR;
END_IF;
//**************************************** 表中从大到小排列**************************************************
IF ( Big_On_Off)AND(NOT Little_On_Off)AND(WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No])>0)AND(WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NO)).DW[DBW_No+2])>0) THEN
FOR I:= 0 TO (NumP-1) DO
FOR J:= 0 to((NumP*2)-2) BY 2 DO
IF j<((NumP*2)-2) THEN
IF (WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J])< WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2])) THEN
II:=WORD_TO_INT(WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J]);
WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J]:=WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2];
WORD_TO_BLOCK_DB(INT_TO_WORD(DB_No)).DW[DBW_No+J+2]:=INT_TO_WORD(II);
END_IF;
END_IF;
END_FOR;
END_FOR;
END_IF;
END_IF;
//******************判定当前数据写入是否成功************************
IF Nump> Numpp THEN
ScuB:=TRUE;
ELSE
ScuB:=false;
END_IF;
END_FUNCTION_BLOCK
楼主最近还看过