说明
采用数学排序方法进行控制,初始化一个序列号(三台机组为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