电工学习网

 找回密码
 立即注册
查看: 4927|回复: 2
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2017-7-16 16:44:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       分享一个多设备控制功能块,一般配合设备基本控制功能块使用,附件为博图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];


回复

使用道具 举报

沙发
发表于 2019-4-15 23:17:13 | 只看该作者
编译错误,程序有问题。。。楼主

回复 支持 反对

使用道具 举报

板凳
发表于 2019-4-16 23:17:36 | 只看该作者
楼主,程序编译有问题,请发一个完整的程序。谢谢

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-4-20 22:02

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表