发布于 2008-05-23 16:30:40
0楼
//能不能用不知道,自己去试
FUNCTION_BLOCK FB 1
TITLE =
//数组排序
//对M存储器或DB块中的数据进行排序
//ERROR:
// 1 输入只能为BYTE,WORD或DWORD
// 2 不为M或DB块
// 3 数据长度为1,不需要排序
// 4 数据块中的长度不正确
// 5 未知错误
VERSION : 0.1
VAR_INPUT
data : ANY ;
END_VAR
VAR_OUTPUT
error : BYTE ;
END_VAR
VAR_TEMP
i : INT ;
j : INT ;
inc_len : INT ;
n : INT ;
addr : DATE ;
END_VAR
BEGIN
NETWORK
TITLE =
//数据类型校验
L 0;
T #error;
O( ;
L DIB 1;
L 2;
==I ;
) ;
O( ;
L DIB 1;
L 4;
==I ;
) ;
O( ;
L DIB 1;
L 6;
==I ;
) ;
JC _001;
L 1;
T #error;
BE ;
_001: NOP 0;
L DIB 1;
SLW 2;
T #inc_len;
NETWORK
TITLE =
//存储区域校验
O( ;
L DIB 6;
L B#16#83;
==I ;
) ;
O( ;
L DIB 6;
L B#16#84;
==I ;
) ;
JC _002;
L 2;
T #error;
BE ;
_002: NOP 0;
NETWORK
TITLE =
//数据长度应>=2
//
L DIW 2;
T #n;
L 2;
>=I ;
JC _003;
L 3;
T #error;
BE ;
_003: NOP 0;
NETWORK
TITLE =
//如果为数据块,则校验数据块长度
A( ;
L DIB 6;
L B#16#84;
==I ;
) ;
A( ;
L DIW 2;
L #inc_len;
SLW 3;
*I ;
OPN DB [DIW 4];
L DBLG;
<=I ;
) ;
JC _004;
L 4;
T #error;
BE ;
_004: NOP 0;
NETWORK
TITLE =
//冒泡排序
A( ;
L DIB 6;
L B#16#84;
==I ;
) ;
JCN _005;
L 0;
T #i;
_l1: NOP 0;
L #i;
INC 1;
T #j;
L #inc_len;
*I ;
L DID 6;
+D ;
LAR1 ;
L #inc_len;
-I ;
LAR2 ;
OPN DB [DIW 4];
L DIB 1;
SRW 1;
DEC 1;
JL err1;
JU b;
JU w;
JU d;
err1: L 1; //仍然是长度不正确
T #error;
BE ;
b: NOP 0;
L DBB [AR1,P#0.0]; //j
L DBB [AR2,P#0.0]; //i
>I ;
JC _C1;
T DBB [AR1,P#0.0];
POP ;
T DBB [AR2,P#0.0];
JC _C1;
w: NOP 0;
L DBW [AR1,P#0.0]; //j
L DBW [AR2,P#0.0]; //i
>I ;
JC _C1;
T DBW [AR1,P#0.0];
POP ;
T DBW [AR2,P#0.0];
JC _C1;
d: NOP 0;
L DBD [AR1,P#0.0]; //j
L DBD [AR2,P#0.0]; //i
>D ;
JC _C1;
T DBD [AR1,P#0.0];
POP ;
T DBD [AR2,P#0.0];
_C1: NOP 1;
L #j; //next j
INC 1;
T #j;
L #n;
>=I ;
JC b;
L #i; //next i
INC 1;
T #i;
L #n;
DEC 1;
JC _l1;
BE ;
_005: NOP 0;
NETWORK
TITLE =
//冒泡排序
A( ;
L DIB 6;
L B#16#83;
==I ;
) ;
JCN _006;
L 0;
T #i;
_l2: NOP 0;
L #i;
INC 1;
T #j;
L #inc_len;
*I ;
L DID 6;
+D ;
LAR1 ;
L #inc_len;
-I ;
LAR2 ;
// OPN DB [DIW 4]
L DIB 1;
SRW 1;
DEC 1;
JL err2;
JU b2;
JU w2;
JU d2;
err2: L 12; //仍然是长度不正确
T #error;
BE ;
b2: NOP 0;
L MB [AR1,P#0.0]; //j
L MB [AR2,P#0.0]; //i
>I ;
JC _C2;
T MB [AR1,P#0.0];
POP ;
T MB [AR2,P#0.0];
JC _C2;
w2: NOP 0;
L DBW [AR1,P#0.0]; //j
L DBW [AR2,P#0.0]; //i
>I ;
JC _C2;
T MW [AR1,P#0.0];
POP ;
T MW [AR2,P#0.0];
JC _C2;
d2: NOP 0;
L MD [AR1,P#0.0]; //j
L MD [AR2,P#0.0]; //i
>D ;
JC _C1;
T MD [AR1,P#0.0];
POP ;
T MD [AR2,P#0.0];
_C2: NOP 1;
L #j; //next j
INC 1;
T #j;
L #n;
>=I ;
JC b2;
L #i; //next i
INC 1;
T #i;
L #n;
DEC 1;
JC _l2;
BE ;
_006: NOP 0;
NETWORK
TITLE =
L 5;
T #error;
END_FUNCTION_BLOCK