发布于 2012-07-25 16:18:57
32楼
感觉上面求整数最大最小值的代码撒在程序中体积有些大,也有些不协调。所以想了点办法做了一个可多次调用的子程序,也可将其添加到程序库中,这样就方便用LAD、FBD来调用了。如果有需要的朋友看看能不能用。见下面子参考代码:
SUBROUTINE_BLOCK MIN_AND_MAX:SBR0
TITLE=子程序注释:
// 此子程序主要是用来判断从"ID_ADDR"地址区域,起始地址"START_ADDR",连续"N_DATA"个整数中最大最小值。并把最小值输出到MIN_DATA ,最大值输出到MAX_DATA存储。
//
// 注意:"ID_ADDR"地址区域(变量值),可以直接用十六进制数16#0800作为实参,也可以转换成十进制数2048作为实参或者是全局变量。如果"ID_ADDR"输入值不等于16#0800或者不等于2048,那么程序将导致执行错误并显示;如果"START_ADDR"输入值小于0,程序执行也将导致错误并显示。如果"N_DATA"输入值小于2,程序执行也将导致错误并显示。
VAR_INPUT
ID_ADDR:INT; // 区域地址标示符,W#16#0800表示V区
START_ADDR:INT; // 起始地址
N_DATA:INT; // 数据个数
END_VAR
VAR_OUTPUT
STATUS:BOOL; // 程序执行正确STATUS=1,程序执行错误STATUS=0
MIN_DATA:INT; // 输出最小值
MAX_DATA:INT; // 输出最大值
END_VAR
VAR
min_data:INT; // 最小数据暂存
max_data:INT; // 最大数据暂存
n:INT; // 循环次数
END_VAR
BEGIN
Network 1
//╬╬╬将"ID_ADDR"区的"START_ADDR"作为起始地址指针,并将第一个数存入min_data,max_data╬╬╬
LD SM0.0
LDW<> LW0, 16#0800 //如果输入区域地址值不等于16#0800,那么就跳转到标签1(输入错误)
JMP 1
LDW< LW2, 0 //如果起始地址小于0,那么就跳转到标签1(输入错误)
JMP 1
LDW< LW4, 2 //如果数据个数小于2,那么就跳转到标签1(输入错误)
JMP 1
//╬╬╬将"ID_ADDR"区的"START_ADDR"作为起始地址指针,并将第一个数存入min_data,max_data╬╬╬
LD SM0.0
MOVW *LD0, LW11 //将指针指向的地址里面的内容,存入min_data
MOVW *LD0, LW13 //将指针指向的地址里面的内容,存入max_data
+I -1, LW4 //将"N_DATA"的内容减1,存入"N_DATA"
MOVW LW4, LW15 //将"N_DATA"减1存入"n"作为循环次数
//╬╬将后面的数据分别与min_data、max_data进行比较,小的值存入min_data,大的值存入max_data╬╬
FOR AC0, +1, LW15 //FOR循环体循环比较"n"次
+D +2, LD0 //将当前的地址指针加2个字节,存入LD0
LDW< *LD0, LW11 //当前地址里面的内容与前面一个数进行小于比较
MOVW *LD0, LW11 //如果当前值小于"min_data"里面的内容,将当前值存入"min_data"
LDW> *LD0, LW13 //当前地址里面的内容与前面一个数进行大于比较
MOVW *LD0, LW13 //如果当前值大于"max_data"里面的内容,将当前值存入"max_data"
NEXT //当循环"N"次结束,离开循环体,往下执行
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬如果程序执行正确╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
MOVW LW11, LW7 //程序执行正确,输出最小值
MOVW LW13, LW9 //程序执行正确,输出最大值
LD SM0.0
= L6.0 //程序执行正确,STATUS=1
JMP 2 //跳转到标签2
//╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬如果程序执行错误╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬
LBL 1 //程序执行错误
MOVW 0, LW7 //将0写入MIN_DATA
MOVW 0, LW9 //将0写入MIN_DATA
LDN SM0.0
= L6.0 //程序执行错误,STATUS=0
LBL 2 //退出子程序
Network 2
END_SUBROUTINE_BLOCK
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”