发布于 2013-11-24 20:22:13
4楼
FUNCTION "Dispatch1" : VOID
TITLE =
NAME : FIND_MAX
VERSION : 0.1
VAR_INPUT
LOW_EFF_SP : REAL ; //水泵最低高效值
DATA_REF : ANY ; //水泵参数数据块
END_VAR
VAR_OUTPUT
Error : INT ;
sequence : ANY ; //泵启动序列
END_VAR
VAR_TEMP
PUMP_Current : ANY ; //当前泵
PUMP_L : ANY ; //低效泵
PUMP_G : ANY ; //高效泵
All_ref_byte_num : DINT ; //所有泵参数空间(字节)
ONE_ref_byte_num : DINT ; //单台泵参数空间(字节)
ONE_ref_bit_num : DINT ; //单台泵参数空间(位数)
BYTE0_Pointer : BYTE ; //ANY指针首字节BYTE0
BYTE6_Pointer : BYTE ; //ANY指针第七字节BYTE6
DB_NO : WORD ; //ANY指针第三字BYTE4、BYTE5
ADD_S : DWORD ; //ANY指针最后4个BYTE
NUM_PUMP : DINT ; //泵数量
ONE_REF : "PUMP_REF"; //单台泵参数1
NUM_FIND : DINT ; //查找次数
NUM_Loop1 : DINT ; //外循环次数(兼查找次数)
NUM_Loop2 : DINT ; //内循环次数
Sfc_Return_Value : INT ; //功能块返回代码
SSTA : INT ; //源起始地址
END_VAR
BEGIN
NETWORK
TITLE =
//输入参数Data(Any类型);输出参数Error(INT类型)
//若输出参数Error不为0, 则说明排序未进行,
//Error = 1, Data(ANY类型)输入指针无效
//Error = 2, Data(ANY类型)输入指针地址非DB地址
SET ;
SAVE ;
L 0;
T #Error;
//初始化
//初始化低效泵
L 0.000000e+000;
T DB103.DBD 0;
L L#0;
T DB103.DBD 4;
L 0;
T DB103.DBW 8;
L 0.000000e+000;
T DB103.DBD 10;
L L#0;
T DB103.DBD 14;
L 0;
T DB103.DBW 18;
L 0.000000e+000;
T DB103.DBD 20;
L L#0;
T DB103.DBD 24;
L 0;
T DB103.DBW 28;
L 0.000000e+000;
T DB103.DBD 30;
L L#0;
T DB103.DBD 34;
L 0;
T DB103.DBW 38;
L 0.000000e+000;
T DB103.DBD 40;
L L#0;
T DB103.DBD 44;
L 0;
T DB103.DBW 48;
//初始化高效泵
L 0.000000e+000;
T DB104.DBD 0;
L L#0;
T DB104.DBD 4;
L 0;
T DB104.DBW 8;
L 0.000000e+000;
T DB104.DBD 10;
L L#0;
T DB104.DBD 14;
L 0;
T DB104.DBW 18;
L 0.000000e+000;
T DB104.DBD 20;
L L#0;
T DB104.DBD 24;
L 0;
T DB104.DBW 28;
T DB104.DBD 30;
L L#0;
T DB104.DBD 34;
L 0;
T DB104.DBW 38;
T DB104.DBD 40;
L L#0;
T DB104.DBD 44;
L 0;
T DB104.DBW 48;
NETWORK
TITLE =
//将输入ANY指针'DATA_REF'复制到LB0~LB9
L P##DATA_REF;
LAR1 ;
L B [AR1,P#0.0];
T #BYTE0_Pointer;
L W [AR1,P#4.0];
T #DB_NO;
L B [AR1,P#6.0];
T #BYTE6_Pointer;
//ANY指针BYTE0是B#16#10
L #BYTE0_Pointer;
L B#16#10;
==I ;
JCN ERR1;
//输入数据区是否为DB块
L #BYTE6_Pointer;
L B#16#84;
==I ;
JCN ERR2;
NETWORK
TITLE =
//DB101的字节数
CALL "ANY_BYTE" (
IN := P#DB101.DBX0.0 BYTE 50,
RET_VAL := #All_ref_byte_num);
CALL "ANY_BYTE" (
IN := #ONE_REF,
RET_VAL := #ONE_ref_byte_num);
L #ONE_ref_byte_num;
L L#8;
*D ;
T #ONE_ref_bit_num;
L #All_ref_byte_num;
L #ONE_ref_byte_num;
/D ;
T #NUM_PUMP;
NETWORK
TITLE =分配源指针
L W#16#1002; //类型:字节(修改ANY指针可以更改数据类型)
T LW 0;
L #ONE_ref_byte_num; //传输字节数目
T LW 2;
L #DB_NO; //源数据块
T LW 4;
L L#0;
SLD 3;
OD DW#16#84000000;
T LD 6;
NETWORK
TITLE ="分配低效泵指针"
L W#16#1002; //类型:字节
T LW 10;
L #ONE_ref_byte_num; //传输字节数目
T LW 12;
L 103; //目标数据块
T LW 14;
L L#0; //目标起始地址
SLD 3;
OD DW#16#84000000;
T LD 16;
NETWORK
TITLE ="分配高效泵指针"
L W#16#1002; //类型:字节
T LW 20;
L #ONE_ref_byte_num; //传输字节数目
T LW 22;
L 104; //目标数据块
T LW 24;
L L#0; //目标起始地址
SLD 3;
OD DW#16#84000000;
T LD 26;
NETWORK
TITLE =
L P#0.0;
LAR1 ;
OPN DB [#DB_NO];
//查找计#NUM_FIND,次数为(泵数量)次
L #NUM_PUMP;
L L#1;
-D ;
NXT1: T #NUM_FIND;
//效率数据小于水泵最低高效值指定值,为低效泵
L LD 6;
T #ADD_S;
LAR1 ;
L DBD [AR1,P#0.0];
L #LOW_EFF_SP;
JC L_F;
//否,为高效泵
CALL "BLKMOV" (
SRCBLK := #PUMP_Current,
RET_VAL := #Sfc_Return_Value,
DSTBLK := #PUMP_G);
//指针移动
L #NUM_FIND;
L L#2;
<=D ;
JC F_N; //防止指针过界
L LW 8; //当前源指针
L #ONE_ref_byte_num; //源指针后移
+I ;
SLD 3;
OD DW#16#84000000;
T LD 6;
L LW 28; //当前高效泵指针
L #ONE_ref_byte_num; //高效泵指针后移
+I ;
SLD 3;
OD DW#16#84000000;
T LD 26;
JU F_N;
L_F: CALL "BLKMOV" (
SRCBLK := #PUMP_Current,
RET_VAL := #Sfc_Return_Value,
DSTBLK := #PUMP_L);
//指针移动
L #NUM_FIND;
L L#2;
<=D ;
JC F_N; //防止指针过界
L LW 8; //当前源指针
L #ONE_ref_byte_num; //源指针后移
+I ;
SLD 3;
OD DW#16#84000000;
T LD 6;
L LW 18; //当前低效泵指针
L #ONE_ref_byte_num; //低效泵指针后移
+I ;
SLD 3;
OD DW#16#84000000;
T LD 16;
//循环
F_N: L #NUM_FIND;
LOOP NXT1; //这个指令自动的将A寄存器里的值减1
//错误码1,ANY指针有错
ERR1: L 1;
T #Error;
JU EXIT;
//错误码2,输入数据区不是DB块
ERR2: L 2;
T #Error;
JU EXIT;
EXIT: SET ;
SAVE ;
END_FUNCTION
ORGANIZATION_BLOCK "CYCL_EXC"
TITLE =Main Program Sweep (Cycle)
AUTHOR : HTL
FAMILY : HTL
NAME : CYCL_EXC
VERSION : 1.0
VAR_TEMP
OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ; //Priority of OB Execution
OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
OB1_Frist_Scan : BOOL ; //OB1第一次扫描
END_VAR
BEGIN
NETWORK
TITLE =
CALL "Dispatch1" (
LOW_EFF_SP := 8.000000e+001,
DATA_REF := P#DB101.DBX0.0 BYTE 30,
Error := MW 3,
sequence := DB 102);
NOP 0;
END_ORGANIZATION_BLOCK