回复:SCL 语言编程排序求助

宁超

  • 帖子

    1009
  • 精华

    39
  • 被关注

    370

论坛等级:至圣

注册时间:2012-12-11

普通 普通 如何晋级?

发布于 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


评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54621条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。