恭喜,你发布的帖子
发布于 2015-10-20 07:55:46
2楼
Sort源代码:
FUNCTION_BLOCK Sort
NAME:Sort
FAMILY:MyLib
AUTHOR:NC
VERSION:'1.0'
VAR_INPUT
Start:BOOL:=FALSE; //启泵条件满足
Stop :BOOL:=FALSE; //停泵条件满足
Source:ANY; //电机信息存储位置
Num:INT:=8; //参与排序的电机数量
END_VAR
VAR_OUTPUT
First:INT; //启泵编号
Last :INT; //停泵编号
Error:BOOL;
Start1:BOOL; // 1~8号泵启动命令
Start2:BOOL;
Start3:BOOL;
Start4:BOOL;
Start5:BOOL;
Start6:BOOL;
Start7:BOOL;
Start8:BOOL;
Stop1:BOOL; //1~8号泵停泵命令
Stop2:BOOL;
Stop3:BOOL;
Stop4:BOOL;
Stop5:BOOL;
Stop6:BOOL;
Stop7:BOOL;
Stop8:BOOL;
END_VAR
VAR_TEMP
RET_VAL1 :INT; //SFC20 返回值
DataSwip:MotorInfo ;
ExtCyc,IntCyc:INT;
Index:INT;
END_VAR
VAR
DataCopy:ARRAY[1..8]OF MotorInfo; //复制1~8号电机信息存取用于排序计算
MotorStartAry:ARRAY[1..8]OF BOOL; //数组1~8号电机启停标志
MotorStopAry:ARRAY[1..8]OF BOOL;
CycCount:INT; //扫描周期计算
END_VAR
BEGIN
// 用于保持启动停止脉冲信号宽度3个周期
IF (First<>0) OR (Last<>0) THEN
CycCount:=CycCount + 1;
IF (CycCount > 3) THEN
First:=0;
Last :=0;
FOR index:=1 TO Num BY 1 DO
MotorStartAry[index]:=FALSE;
MotorStopAry[index]:=FALSE;
END_FOR;
END_IF;
ELSE
CycCount:=0;
END_IF;
//复制电机信息,为开始排序做准备,为电机赋值1~8编号
IF Start OR Stop THEN
RET_VAL1:= BLKMOV(SRCBLK :=Source,DSTBLK :=DataCopy );//Call SFC20
FOR index:=1 TO Num BY 1 DO
DataCopy[index].Number:=index;
END_FOR;
//冒泡排序过程,交换电机信息的存储位置
FOR ExtCyc:=1 TO (Num - 1) BY 1 DO
FOR IntCyc:=1 TO (Num - ExtCyc) BY 1 DO
IF DataCopy[IntCyc].Runtime > DataCopy[IntCyc + 1].Runtime THEN
DataSwip:=DataCopy[IntCyc];
DataCopy[IntCyc]:=DataCopy[IntCyc + 1];
DataCopy[IntCyc + 1]:=DataSwip;
END_IF;
END_FOR;
END_FOR;
END_IF;
//根据排序的结果再查找允许启动的电机编号
IF Start THEN
FOR Index:=1 TO Num BY 1 DO
IF DataCopy[Index].StartEn THEN
First:=DataCopy[Index].Number;
MotorStartAry[First]:=TRUE;
MotorStopAry[First]:=FALSE;
EXIT;
END_IF;
END_FOR;
END_IF;
//根据排序的结果再查找允许停止的电机编号
IF Stop THEN
FOR Index:=Num TO 1 BY -1 DO
IF DataCopy[Index].StopEn THEN
last:=DataCopy[Index].Number;
MotorStartAry[Last]:=FALSE;
MotorStopAry[Last]:=TRUE;
EXIT;
END_IF;
END_FOR;
END_IF;
Start1:=MotorStartAry[1]; Stop1:=MotorStopAry[1];
Start2:=MotorStartAry[2]; Stop2:=MotorStopAry[2];
Start3:=MotorStartAry[3]; Stop3:=MotorStopAry[3];
Start4:=MotorStartAry[4]; Stop4:=MotorStopAry[4];
Start5:=MotorStartAry[5]; Stop5:=MotorStopAry[5];
Start6:=MotorStartAry[6]; Stop6:=MotorStopAry[6];
Start7:=MotorStartAry[7]; Stop7:=MotorStopAry[7];
Start8:=MotorStartAry[8]; Stop8:=MotorStopAry[8];
Start:=FALSE;
Stop:= FALSE;
END_FUNCTION_BLOCK
请填写推广理由:
分享
只看
楼主