回复:设备均衡磨损程序完整版 原创(分两个帖子,上传不了文字太多)第二部分

柳叶飘飘

  • 帖子

    95
  • 精华

    7
  • 被关注

    194

论坛等级:侠圣

注册时间:2016-12-08

黄金 黄金 如何晋级?

发布于 2017-07-28 11:54:27

1楼

展开查看
以下是引用柳叶飘飘在2017-07-28 11:13:00的发言 >楼主

//##############################备启设备列表进行排序·#########################################################  

//这里采用冒泡算法进行对二维数组排序   

   REPEAT

    ST_FLAG:=FALSE;

     FOR PX_ST_I:= TB_B_ST_I TO 1 BY -1 DO

        IF TB_B_ST[2,PX_ST_I-1]>TB_B_ST[2,PX_ST_I] THEN//从小到大排序

            //对时间进行排序

            PX_ST_TEMP1:=TB_B_ST[2,PX_ST_I];

            TB_B_ST[2,PX_ST_I]:=TB_B_ST[2,PX_ST_I-1];

            TB_B_ST[2,PX_ST_I-1]:=PX_ST_TEMP1;

            //交换设备编号的位置和排序的时间一致

            PX_ST_TEMP2:=TB_B_ST[1,PX_ST_I];

            TB_B_ST[1,PX_ST_I]:=TB_B_ST[1,PX_ST_I-1];

            TB_B_ST[1,PX_ST_I-1]:=PX_ST_TEMP2;

            ST_FLAG:=TRUE;           

         END_IF;

    END_FOR;

    UNTIL NOT ST_FLAG 

END_REPEAT;


 //##############################备停设备列表进行排序#########################################################

//目前没有运行的设备的运行时间长短进行排序(按照时间最少的顺序排序)

//这里采用冒泡算法进行对二维数组排序   

   REPEAT

    STO_FLAG:=FALSE;

     FOR PX_STO_I:=  1 TO TB_B_STO_I BY 1 DO

        IF TB_B_STO[2,PX_STO_I+1]>TB_B_STO[2,PX_STO_I] THEN//从大到小排序

            //对时间进行排序

            PX_STO_TEMP1:=TB_B_STO[2,PX_STO_I];

            TB_B_STO[2,PX_STO_I]:=TB_B_STO[2,PX_STO_I+1];

            TB_B_STO[2,PX_STO_I+1]:=PX_STO_TEMP1;

            //交换设备编号的位置和排序的时间一致

            PX_STO_TEMP2:=TB_B_STO[1,PX_STO_I];

            TB_B_STO[1,PX_STO_I]:=TB_B_STO[1,PX_STO_I+1];

            TB_B_STO[1,PX_STO_I+1]:=PX_STO_TEMP2;

            STO_FLAG:=TRUE;           

         END_IF;

    END_FOR;

    UNTIL NOT STO_FLAG 

END_REPEAT;


//##############################启动设备条件满足时####################################

//启动条件满足且运行总数小于设定的最大运行总数设定值时则产生启动命令

//启动命令产生时则触发一个标志位

IF ST_PN & (RUN_ALL<= INT_TO_DINT(NUM_H-1))& NOT(ST_P_FLAG) THEN

    ST_P_FLAG:=1;//启动标志位置1不再执行该段程序直到该标志位复位

   FOR CTL_OUT_ST_I:= 1 TO NUM_ALL BY 1 DO

        //读取备起列表的第一个设备编号并逐个测试为哪一台设备,符合要求就启动起来

        IF (TB_B_ST[1,1]=CTL_OUT_ST_I) & NOT(RUN_STAUS[CTL_OUT_ST_I].NOT_ST_STO) THEN

            CTL_OUT[CTL_OUT_ST_I].START_P:=1;

            CTL_OUT[CTL_OUT_ST_I].STOP_P:=0;

           ELSE 

              CTL_OUT[CTL_OUT_ST_I].START_P:=0;

              CTL_OUT[CTL_OUT_ST_I].STOP_P:=0;

         END_IF;

   END_FOR;

 END_IF;


//##############################停止设备条件满足时####################################

CTL_OUT_STO_I:=0;

IF STO_PN &(RUN_ALL>=INT_TO_DINT(NUM_L)) & NOT(STO_P_FLAG)  THEN

    STO_P_FLAG:=1;//停止标志位置1不再执行该段程序直到该标志位复位

   FOR CTL_OUT_STO_I:= 1 TO NUM_ALL BY 1 DO

        IF (TB_B_STO[1,1]=CTL_OUT_STO_I) & NOT(RUN_STAUS[CTL_OUT_STO_I].NOT_ST_STO) THEN

            CTL_OUT[CTL_OUT_STO_I].START_P:=0;

            CTL_OUT[CTL_OUT_STO_I].STOP_P:=1;

        ELSE

            CTL_OUT[CTL_OUT_STO_I].START_P:=0;

            CTL_OUT[CTL_OUT_STO_I].STOP_P:=0; 

        END_IF;

   END_FOR;

END_IF;

//###############################启动脉冲复位########################################

IF PN & ST_P_FLAG THEN  //这里需要注意FOR循环周期不能大于秒脉冲能执行完的时间

    ST_COUNT:=ST_COUNT+1;

END_IF;

IF ST_COUNT>=P_WIDE THEN  //对启动进行计时超过设定值则复位全部指令

      FOR ST_P_REST_I:= 1 TO NUM_ALL BY 1 DO

                CTL_OUT[ST_P_REST_I].START_P:=0;

       END_FOR;

        ST_P_FLAG:=0;

        ST_COUNT:=0;

END_IF;

//###############################停止脉冲复位########################################

IF PN & STO_P_FLAG THEN  //这里需要注意FOR循环周期不能大于秒脉冲能执行完的时间

    STO_COUNT:=STO_COUNT+1;

END_IF;

IF STO_COUNT>=P_WIDE THEN  //对启动进行计时超过设定值则复位全部指令

      FOR STO_P_REST_I:= 1 TO NUM_ALL BY 1 DO

                CTL_OUT[STO_P_REST_I].STOP_P:=0;

       END_FOR;

        STO_P_FLAG:=0;

        STO_COUNT:=0;

END_IF;


//############################单输出指令##########################################


 FOR CTL_OUT_START_I:= 1 TO NUM_ALL BY 1 DO

        IF CTL_OUT[CTL_OUT_START_I].STOP_P OR RUN_STAUS[CTL_OUT_START_I].NOT_ST_STO THEN

            CTL_OUT[CTL_OUT_START_I].START:=0;

          ELSE

            IF CTL_OUT[CTL_OUT_START_I].START_P THEN

               CTL_OUT[CTL_OUT_START_I].START:=1;

            END_IF;

        END_IF;

       //若存在不允许启动的情况则对脉冲指令进行复位操作

        IF RUN_STAUS[CTL_OUT_START_I].NOT_ST_STO THEN

            CTL_OUT[CTL_OUT_START_I].START_P:=0;

            CTL_OUT[CTL_OUT_START_I].STOP_P:=0;

            END_IF;

  END_FOR;

//##############################复位操作########################################

IF REST THEN

        ST_P_FLAG:=0;

        ST_COUNT:=0;

        STO_P_FLAG:=0;

        STO_COUNT:=0;

    FOR REST_I:= 1 TO NUM_ALL BY 1 DO

        CTL_OUT[REST_I].START:=0;

        CTL_OUT[REST_I].START_P:=0;

        CTL_OUT[REST_I].STOP_P:=0;

    END_FOR;

END_IF;


END_FUNCTION_BLOCK


定义看第一部分http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1411592&b_id=4&s_id=23&num=0

努力赚钱 养家糊口
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54617条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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