多台设备按运行时间协调控制程序

已锁定

W.M.J

  • 帖子

    144
  • 精华

    7
  • 被关注

    41

论坛等级:侠圣

注册时间:2016-11-15

黄金 黄金 如何晋级?

多台设备按运行时间协调控制程序

1493

3

2017-07-15 22:18:34

 

FB_FourDeviceAutoCtrl.zip

        分享一个多设备控制功能块,一般配合设备基本控制功能块使用,附件为博图scl源代码。
        此功能块主要是为了协调一组功能相同的设备在不同情况下需要按需开启不同的台数,启动设备时优先启动运行时间较短的,而停止设备时优先停止运行时间较长的。当某台设备故障时可以自动启用备用设备。功能块现设计为最多4台设备协调控制,如果需要控制更多的设备大家自需要把定义的数组加大即可,不需要改动关键程序。
        其中输入引脚FaultNo1-FaultNo4位设备的故障信号反馈;TotalTimeNo1-TotalTimeNo4为设备的运行时间输入;SetNum即为你当前需要启动设备的台数;EnNum即为当前需要控制的设备的数量,最大设计为4台,如果只需控制3台及输入数量为3即可。
程序精干短小,希望对大家有帮助!
部分代码如下:
//--------------------------------------------------------------
//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];

 

多台设备按运行时间协调控制程序 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有11079条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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