终于写好一个依据时间来启停的程序

已锁定

柳叶飘飘

  • 帖子

    95
  • 精华

    7
  • 被关注

    194

论坛等级:侠圣

注册时间:2016-12-08

黄金 黄金 如何晋级?

终于写好一个依据时间来启停的程序

1398

11

2017-03-29 10:52:20

前段时间不是要研究依照时间来启停设备的程序么

程序编写完成 初步测试已经OK,发了很多贴子,不晓得多少人能够看得明白SCL程序,以下附部分代码(核心代码)供大家参考。


//#############################初始化设备状态表格(结构体数组)####################################

//对符合要求数量的计数清零操作

TB_B_ST_I:=0;

TB_B_STO_I:=0;

//清空要排序的列表

    FOR CLEAR_TB_I:= 1 TO NUM_ALL  BY 1 DO

         TB_B_ST[1,CLEAR_TB_I]:=0;

         TB_B_ST[2,CLEAR_TB_I]:=0;

         TB_B_STO[1,CLEAR_TB_I]:=0;

         TB_B_STO[2,CLEAR_TB_I]:=0;

    END_FOR;

//设备的总状态表格(结构体数组)有条件进行更新(总运行数量产生变化时或者任意一台设备手自动变化时)  

    FOR Initialization_TB_I:= 1 TO NUM BY 1 DO

        RUN_STAUS[Initialization_TB_I].ID:=WORD_TO_INT(RUN_STATUS_DB.DW[8*(Initialization_TB_I-1)]);

        RUN_STAUS[Initialization_TB_I].SS:=DWORD_TO_DINT(RUN_STATUS_DB.DD[8*(Initialization_TB_I-1)+2]);  

        RUN_STAUS[Initialization_TB_I].REMOTE:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,0];      

        RUN_STAUS[Initialization_TB_I].RUN:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,1];   

        RUN_STAUS[Initialization_TB_I].FAULT:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,2];   

        RUN_STAUS[Initialization_TB_I].TRIP:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,3];   

        RUN_STAUS[Initialization_TB_I].AM:=RUN_STATUS_DB.DX[8*(Initialization_TB_I-1)+6,4];  

        //不能启动停止的设备:没有在自动状态或者有故障或者有跳闸的均不能启停。

        RUN_STAUS[Initialization_TB_I].NOT_ST_STO:=NOT(RUN_STAUS[Initialization_TB_I].AM) OR RUN_STAUS[Initialization_TB_I].FAULT OR RUN_STAUS[Initialization_TB_I].TRIP OR NOT(RUN_STAUS[Initialization_TB_I].REMOTE);

        //符合备用启动的条件:设备没有运行且 能启停的状态

        RUN_STAUS[Initialization_TB_I].STANDBY_ST:=NOT(RUN_STAUS[Initialization_TB_I].RUN) & NOT(RUN_STAUS[Initialization_TB_I].NOT_ST_STO) ;

        //符合备用停止的条件:设备运行且 能启停的状态

        RUN_STAUS[Initialization_TB_I].STANDBY_STO:=RUN_STAUS[Initialization_TB_I].RUN & NOT(RUN_STAUS[Initialization_TB_I].NOT_ST_STO);

        

        //将设备编号赋值给控制输出的ID编号     

        CTL_OUT[Initialization_TB_I].ID:=RUN_STAUS[Initialization_TB_I].ID;

        

        //判断是否符合备用启动条件,符合即将该设备的ID,SS,加入备用启动的列表

        IF RUN_STAUS[Initialization_TB_I].STANDBY_ST THEN

            //统计符合备用启动要求的台数

            TB_B_ST_I:=TB_B_ST_I+1;

            //将符合条件的设备加入备启数组

            TB_B_ST[1,TB_B_ST_I]:=RUN_STAUS[Initialization_TB_I].ID;//原数据是INT类型存在隐性转换为DINT

            TB_B_ST[2,TB_B_ST_I]:=RUN_STAUS[Initialization_TB_I].SS;

         END_IF;

        

        //判断是否符合备用停止条件,符合即将该设备的ID,SS,加入备用停止的列表

        IF RUN_STAUS[Initialization_TB_I].STANDBY_STO THEN

            //统计符合备用停止要求的台数

            TB_B_STO_I:=TB_B_STO_I+1;

            //将符合条件的设备加入备启数组

            TB_B_STO[1,TB_B_STO_I]:=RUN_STAUS[Initialization_TB_I].ID;//原数据是INT类型存在隐性转换为DINT

            TB_B_STO[2,TB_B_STO_I]:=RUN_STAUS[Initialization_TB_I].SS;

        END_IF;    

            

    END_FOR;

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

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

   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;


终于写好一个依据时间来启停的程序 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54664条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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