三台设备顺序启停(数学算法)

已锁定

柳叶飘飘

  • 帖子

    95
  • 精华

    7
  • 被关注

    195

论坛等级:侠圣

注册时间:2016-12-08

黄金 黄金 如何晋级?

三台设备顺序启停(数学算法)

5586

21

2016-12-28 00:23:07

说明

采用数学排序方法进行控制,初始化一个序列号(三台机组为1、2、3),启动过程中优先启动序号最小的,关闭过程中优先关闭序号最大的,当设备自动开启或者自动停止时会自动改变序列号顺序,即下一次启停顺序就会改变。

 例1:初始化序号为1、2、3,开启条件满足时自动开启序号为1的设备(当前为1#设备),开启后序号会更改为3、1、2,若开启条件仍然满足,则自动开启序号为1的设备(当前为2#设备),开启后序号会更改为2、3、1,依次类推。

 例2:初始化序号为1、2、3,关闭条件满足时自动关闭序号为3的设备(当前为3#设备),关闭后序号会更改为2、3、1,若关闭条件仍然满足,则自动关闭序号为3的设备(当前为2#设备),停止后序号会更改为3、1、2,依次类推。

该方法有个好处就是知道最先启动的是那一台和最先停止的是哪一台


//以下为源程序

//**************************************************************************************

// 适用于三台设备移位 20160525  EBC-LW

//**************************************************************************************


FUNCTION_BLOCK FB19

TITLE =   'FAN_CL'


AUTHOR:   EBC_LW

NAME:        FAN_CL

VERSION:      '0.01'

FAMILY:   EBC

KNOW_HOW_PROTECT


//**************************************************************************************

// Declaration Section: Block Parameters

//**************************************************************************************


//System attributes for parameters

(*

S7_sampletime:='true'

S7_dynamic:='true'

S7_edit:='true'

S7_link:='true'

S7_param:='true'

S7_visible:='true'

S7_contact:='true'

S7_m_c:='true'

S7_shortcut:=''

S7_string_0:=''

S7_string_1:=''

S7_unit:=''

S7_server:='alarm_archiv'

S7_a_type:='alarm_8p'

*)


VAR_INPUT

//RUN_LESS:INT; //数量限制(运行)

//RUN_MORE:INT;

NUM1_RUN:BOOL;//设备运行状态

NUM2_RUN:BOOL;

NUM3_RUN:BOOL;


//NUM1_REMOTE:BOOL;//设备远程状态

//NUM2_REMOTE:BOOL;

//NUM3_REMOTE:BOOL;

//NUM1_AUTO:BOOL;//自动模式,1为自动模式

//NUM2_AUTO:BOOL;

//NUM3_AUTO:BOOL;

//NUM1_RUN_ELIMINATE:BOOL;//为1时排除该设备投入到排队当中

 //NUM2_RUN_ELIMINATE:BOOL;

 //NUM3_RUN_ELIMINATE:BOOL;


END_VAR


VAR_OUTPUT

 NUM_RUN:INT;//总运行的台数


NUM1_S:BOOL;//开启设备

NUM1_ST:BOOL;//关闭设备

NUM2_S:BOOL;

NUM2_ST:BOOL;

NUM3_S:BOOL;

NUM3_ST:BOOL;




 END_VAR


VAR_IN_OUT

//MOVE_BIT:BYTE := 1;//初始化一个数

//MOVE_BIT_FLAG:BOOL; //为1时执行移位


NUM1_NUM:INT:=1;//初始化寄存器值

NUM2_NUM:INT:=2;

NUM3_NUM:INT:=3;

MOVE_FLAG_S:BOOL;//开启设备标志位,为1时触发一次数据标志位计算

MOVE_FLAG_ST:BOOL;//关闭设备标志位

REST:BOOL;//复位启停顺序

REST_OUT:BOOL;

END_VAR


VAR


//  NUM1_RUN_ELIMINATE:BOOL;//优选排除标志,为1时排除

 // NUM2_RUN_ELIMINATE:BOOL;

 // NUM3_RUN_ELIMINATE:BOOL;

 END_VAR



VAR_TEMP

    

  CurrTime_S : S5time;

  BiVal_S  : word;

  ActFlag_S : BOOL;

  CurrTime_ST : S5time;

  BiVal_ST  : word;

  ActFlag_ST : BOOL;

    TEMP1: BOOL;

   END_VAR


//**************************************************************************************

//判断运转台数

//**************************************************************************************


NUM_RUN:= BOOL_TO_INT(NUM1_RUN)+BOOL_TO_INT( NUM2_RUN)+BOOL_TO_INT(NUM3_RUN);//实际运行的设备总数

   //--------------------------------------------------------------------------------

 //*************************************************************************************

// 采用数学计算法进行  

//*************************************************************************************

 //复位输出

 IF REST_OUT THEN

    REST_OUT:=0;

    REST_OUT:=0;

    NUM1_ST:=0;

    NUM2_ST:=0;

    NUM3_ST:=0;

    NUM1_S:=0;

    NUM2_S:=0;

    NUM3_S:=0;


  END_IF;

 

 //------------------复位程序

 IF REST THEN

    REST:=0;

    NUM1_NUM:=1;

    NUM2_NUM:=2;     

    NUM3_NUM:=3; 

    NUM1_ST:=0;

    NUM2_ST:=0;

    NUM3_ST:=0;

    NUM1_S:=0;

    NUM2_S:=0;

    NUM3_S:=0;

   // NUM1_RUN_ELIMINATE:=0;

  //  NUM2_RUN_ELIMINATE:=0;  

   // NUM3_RUN_ELIMINATE:=0; 

 END_IF; 

  //------------复位程序结束

  


IF MOVE_FLAG_S THEN  //开启顺序调用更改启动编号

   

     MOVE_FLAG_S:=0;//复位标志位

 

IF NUM1_NUM=1 THEN

    //MOVE_FLAG_S:=0;//复位标志位

    NUM2_S:=0;

    NUM3_S:=0;

    NUM1_S:=1;

    NUM1_ST:=0;

    NUM2_ST:=0;

    NUM3_ST:=0;

    NUM1_NUM:=NUM1_NUM+2;

    NUM2_NUM:=NUM2_NUM-1;

    NUM3_NUM:=NUM3_NUM-1;



ELSE

    IF NUM2_NUM=1 THEN

    //MOVE_FLAG_S:=0;//复位标志位

    NUM1_S:=0;

    NUM3_S:=0;

    NUM2_S:=1;

    NUM1_ST:=0;

    NUM2_ST:=0;

    NUM3_ST:=0;


    NUM1_NUM:=NUM1_NUM-1;

    NUM2_NUM:=NUM2_NUM+2;

    NUM3_NUM:=NUM3_NUM-1;


ELSE

    

    IF NUM3_NUM=1 THEN

    //MOVE_FLAG_S:=0;//复位标志位

    NUM1_S:=0;

    NUM2_S:=0;

    NUM3_S:=1;

    NUM1_ST:=0;

    NUM2_ST:=0;

    NUM3_ST:=0;


    NUM1_NUM:=NUM1_NUM-1;

    NUM2_NUM:=NUM2_NUM-1;

    NUM3_NUM:=NUM3_NUM+2;


    //

END_IF;

    //

END_IF;

    //

END_IF;


END_IF;   

//------------------开启顺序结束      



//-----------------关闭程序开始


IF MOVE_FLAG_ST THEN  //开启顺序调用更改启动编号

   

     MOVE_FLAG_ST:=0;//复位标志位

 

IF NUM1_NUM=3 THEN

    //MOVE_FLAG_S:=0;//复位标志位

    NUM2_ST:=0;

    NUM3_ST:=0;

    NUM1_ST:=1;

    NUM1_S:=0;

    NUM2_S:=0;

    NUM3_S:=0;

    NUM1_NUM:=NUM1_NUM-2;

    NUM2_NUM:=NUM2_NUM+1;

    NUM3_NUM:=NUM3_NUM+1;


ELSE

    IF NUM2_NUM=3 THEN

    //MOVE_FLAG_S:=0;//复位标志位

    NUM1_ST:=0;

    NUM3_ST:=0;

    NUM2_ST:=1;

    NUM1_S:=0;

    NUM2_S:=0;

    NUM3_S:=0;

    NUM1_NUM:=NUM1_NUM+1;

    NUM2_NUM:=NUM2_NUM-2;

    NUM3_NUM:=NUM3_NUM+1;


ELSE

    

    IF NUM3_NUM=3 THEN

    //MOVE_FLAG_S:=0;//复位标志位

    NUM1_ST:=0;

    NUM2_ST:=0;

    NUM3_ST:=1;

    NUM1_S:=0;

    NUM2_S:=0;

    NUM3_S:=0;

    NUM1_NUM:=NUM1_NUM+1;

    NUM2_NUM:=NUM2_NUM+1;

    NUM3_NUM:=NUM3_NUM-2;


    //

END_IF;

    //

END_IF;

    //

END_IF;


END_IF;   

//------------------关闭顺序结束  

//*************************************************************************************

// 输出指令复位

//*************************************************************************************

//复位输出(开设备指令输出复位)

//若有启动指令则1S钟后复位


//CurrTime_S :=S_ODTS  (T_NO:= T500, S:=(NUM1_S OR NUM2_S OR NUM3_S), TV:=T#5S, R:=FALSE, BI:=biVal_S,Q:=actFlag_S);

                    

//IF  actFlag_S THEN

  //  NUM1_S:=0;

  //  NUM2_S:=0;

  //  NUM3_S:=0;

//END_IF;

//复位输出(关设备指令输出复位)

//CurrTime_ST :=S_ODTS  (T_NO:= ST_TIMER, S:=NUM1_ST OR NUM2_ST OR NUM3_ST, TV:=T#3S, R:=FALSE, BI:=biVal_ST,Q:=actFlag_ST);

                     

//IF  actFlag_ST THEN

    //NUM1_ST:=0;

    //NUM2_ST:=0;

    //NUM3_ST:=0;

//END_IF;


//*************************************************************************************

// 自动开启

//*************************************************************************************

//1#设备的开启



 


  //连锁逻辑开始

  

       

//*************************************************************************************

// 采用排序启动方式,移动位置标记位

////******* ******************************************************************************

///启动顺序

//IF MOVE_BIT_FLAG THEN

   // MOVE_BIT:=ROL (IN:=MOVE_BIT,N:=1);

   // IF MOVE_BIT=B#16#4 THEN

   //     MOVE_BIT:=B#16#1 AND MOVE_BIT;//从新开始回到第一台设备

     //ELSE

    //END_IF;

  

   //MOVE_BIT_FLAG:=FALSE;//标记位复位

    //ELSE

//END_IF;


END_FUNCTION_BLOCK

//原创程序 请多交流 QQ 275578306

三台设备顺序启停(数学算法) 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54716条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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