|
分享一个多设备控制功能块,一般配合设备基本控制功能块使用,附件为博图scl源代码。
此功能块主要是为了协调一组功能相同的设备在不同情况下需要按需开启不同的台数,启动设备时优先启动运行时间较短的,而停止设备时优先停止运行时间较长的。当某台设备故障时可以自动启用备用设备。功能块现设计为最多4台设备协调控制,如果需要控制更多的设备大家自需要把定义的数组加大即可,不需要改动关键程序。
其中输入引脚FaultNo1-FaultNo4位设备的故障信号反馈;TotalTimeNo1-TotalTimeNo4为设备的运行时间输入;SetNum即为你当前需要启动设备的台数;EnNum即为当前需要控制的设备的数量,最大设计为4台,如果只需控制3台及输入数量为3即可。
FB_FourDeviceAutoCtrl.zip
(1.03 KB, 下载次数: 72)
程序精干短小,希望对大家有帮助!
部分代码如下:
//--------------------------------------------------------------
//This block is used to control at most 4 devices start /stop
//--------------------------------------------------------------
#currOnNum := 0;
#MaxIndex := LIMIT(MN := 1, IN := #EnNum, MX := 4);
#effectSetNum :=LIMIT(MN := 0, IN := #SetNum, MX := #MaxIndex);
#aFaultNo[1] := #FaultNo1;
#aFaultNo[2] := #FaultNo2;
#aFaultNo[3] := #FaultNo3;
#aFaultNo[4] := #FaultNo4;
#aTotalTimeNo[1] := ABS(#TotalTimeNo1);
#aTotalTimeNo[2] := ABS(#TotalTimeNo2);
#aTotalTimeNo[3] := ABS(#TotalTimeNo3);
#aTotalTimeNo[4] := ABS(#TotalTimeNo4);
//------------------------------------------
// current ON device numbers
//------------------------------------------
FOR #index_i := 1 TO #MaxIndex DO
IF #aFaultNo[#index_i] THEN
#aStartNo[#index_i] := false;
END_IF;
IF #aStartNo[#index_i] THEN
#currOnNum := #currOnNum + 1;
END_IF;
END_FOR;
//------------------------------------------
// sort by Total run time Max - Min
//------------------------------------------
FOR #index_i := 1 TO #MaxIndex DO
#MaxTotalTime := -1;
FOR #index_j := 1 TO #MaxIndex DO
IF #aTotalTimeNo[#index_j] >= #MaxTotalTime THEN
#tempMaxIndex := #index_j;
#MaxTotalTime := #aTotalTimeNo[#index_j];
END_IF;
END_FOR;
#aOnTimeMaxToMinNo[#index_i] := #tempMaxIndex;
#aTotalTimeNo[#tempMaxIndex] := -1;
END_FOR;
//------------------------------------------
// sort by Total run time Min - Max
//------------------------------------------
#index_j := 1;
FOR #index_i := #MaxIndex TO 1 BY -1 DO
#aStpTimeMinToMaxNo[#index_j] := #aOnTimeMaxToMinNo[#index_i];
#index_j := #index_j + 1;
END_FOR;
//------------------------------------------
// On / stop
//------------------------------------------
FOR #index_i := 1 TO 4 DO
IF #effectSetNum < #currOnNum THEN
IF #aStartNo[#aOnTimeMaxToMinNo[#index_i]] THEN
#aStartNo[#aOnTimeMaxToMinNo[#index_i]] := false;
#currOnNum := #currOnNum - 1;
END_IF;
END_IF;
IF #effectSetNum > #currOnNum THEN
IF NOT #aStartNo[#aStpTimeMinToMaxNo[#index_i]] AND NOT #aFaultNo[#aStpTimeMinToMaxNo[#index_i]] THEN
#aStartNo[#aStpTimeMinToMaxNo[#index_i]] := true;
#currOnNum := #currOnNum + 1;
END_IF;
END_IF;
END_FOR;
//------------------------------------------
// output
//------------------------------------------
#StartNo1 := #aStartNo[1];
#StartNo2 := #aStartNo[2];
#StartNo3 := #aStartNo[3];
#StartNo4 := #aStartNo[4];
|
|