张国良
级别: 探索解密
精华主题: 0
发帖数量: 68 个
工控威望: 138 点
下载积分: 707 分
在线时间: 64(小时)
注册时间: 2020-02-06
最后登录: 2024-11-10
查看张国良的 主题 / 回贴
楼主  发表于: 2024-03-24 12:05
有ABCD三个风机,触摸屏上可以任意排序,比如A可以是一号可以是二号也可以是三号也可以是四号,BCD同理,现在要求一号风机开10秒停5秒,然后二三四号依次运行,如果是A是一号B是二号,C是三号,D是四号这样固定好了可以写出来,但是ABCD是任意排序的,如果下一次ABCD排序成2341,这样应该怎么写,plc是三菱的
冲出枪林弹雨
冲出枪林弹雨
级别: 家园常客
精华主题: 0
发帖数量: 141 个
工控威望: 622 点
下载积分: 350 分
在线时间: 86(小时)
注册时间: 2020-09-05
最后登录: 2024-11-15
查看冲出枪林弹雨的 主题 / 回贴
1楼  发表于: 2024-03-25 23:02
可以参考,能监控当前运行风机编号,状态,以及加了停止动作
VAR  
    TimerRun : TON;         // 运行计时器  
    TimerStop : TON;        // 停止计时器  
    FanState : ARRAY[1..4] OF BOOL; // 风机状态数组(TRUE-运行,FALSE-停止)  
    CurrentFan : INT;       // 当前运行的风机编号(1-A,2-B,3-C,4-D)  
    FanOrder : ARRAY[1..4] OF INT := [1, 2, 3, 4]; // 风机排序数组,可以修改排序  
    EmergencyStop : BOOL;   // 紧急停止按钮状态  
    SafetyInterlock : BOOL; // 安全联锁状态  
END_VAR  
  
//初始化  
IF NOT TimerRun.Q AND NOT TimerStop.Q AND NOT EmergencyStop AND SafetyInterlock THEN  
    FOR i := 1 TO 4 DO  
        FanState := FALSE; // 所有风机初始状态为停止  
    END_FOR;  
    CurrentFan := FanOrder[1]; // 根据风机排序数组确定起始风机  
    TimerRun(IN:=TRUE, PT:=T#10s); // 设置运行计时器为10秒  
END_IF  
  
// 风机运行逻辑  
IF NOT EmergencyStop AND SafetyInterlock THEN  
    IF TimerRun.Q THEN  
        // 当前风机正在运行或即将运行  
        IF NOT FanState[CurrentFan] THEN  
            // 启动当前风机  
            FanState[CurrentFan] := TRUE;  
            // 这里加入控制当前风机启动的代码  
        END_IF  
    ELSE  
        // 运行时间到,停止当前风机  
        FanState[CurrentFan] := FALSE;  
        // 这里加入控制当前风机停止的代码  
        TimerStop(IN:=TRUE, PT:=T#5s); // 设置停止计时器为5秒  
    END_IF  
      
    IF TimerStop.Q THEN  
        // 停止时间到,切换到下一个风机  
        CurrentFan := FanOrder[(CurrentFan MOD 4) + 1]; // 根据风机排序数组循环风机编号  
        TimerRun(IN:=TRUE, PT:=T#10s); // 重置运行计时器为10秒  
    END_IF  
ELSE  
    // 紧急停止或安全联锁断开,停止所有风机  
    FOR i := 1 TO 4 DO  
        FanState := FALSE;  
    END_FOR;  
    TimerRun(IN:=FALSE); // 停止运行计时器  
    TimerStop(IN:=FALSE); // 停止停止计时器  
END_IF
技术交流vx: Electric973