工控玩家
澧县电气自动化
级别: 家园常客
精华主题: 0
发帖数量: 528 个
工控威望: 778 点
下载积分: 787 分
在线时间: 607(小时)
注册时间: 2008-09-06
最后登录: 2026-01-20
查看工控玩家的 主题 / 回贴
楼主  发表于: 3天前
现有7个电磁阀向7条管道给水,先给1 2号供水---再给2 3号供水----3  4号供水---4 5号供水----5 6号供水--6  7号供水--7 1供水---1 2供水,这样循环。
问题是某些管路关闭了怎么跳过?任何时间都有两路给水。
gmajyqi
只有想不到的,没有做不到的gmaiyqi@163.com
级别: 略有小成
精华主题: 0
发帖数量: 105 个
工控威望: 325 点
下载积分: 1940 分
在线时间: 103(小时)
注册时间: 2007-03-28
最后登录: 2026-01-21
查看gmajyqi的 主题 / 回贴
1楼  发表于: 前天
以下程序只是一个基本框架,实际应用中需要根据具体的PLC型号、输入输出地址分配、供水时间要求等进行调整和完善。同时,还可以考虑添加故障报警、手动控制等功能以增强系统的实用性和可靠性。编程思路

1. 定义输入输出:将每个电磁阀的状态(开/关)连接到PLC的输入点,用于判断管路是否关闭。将控制电磁阀的输出信号连接到PLC的输出点,以控制电磁阀的通断。

2. 设置状态变量:使用中间继电器或数据寄存器来记录当前的供水组合状态以及管路的关闭状态。

3. 状态判断与跳转:在程序中不断检查当前要供水的两路管路是否关闭。如果有管路关闭,则跳过该组合,寻找下一个有效的供水组合,同时要保证始终有两路给水。

4. 循环控制:当遍历完所有可能的供水组合后,重新回到初始状态,实现循环供水。

示例程序(以三菱FX系列PLC梯形图为例)

假设X0-X6分别对应7条管道是否关闭的输入信号(X0对应1号管道,X1对应2号管道,以此类推,X为ON表示管道关闭),Y0-Y6分别对应7个电磁阀的输出信号(Y0控制1号电磁阀,Y1控制2号电磁阀,以此类推)。
// 初始化状态,假设初始从1、2号供水开始
M0 = ON;  // M0作为当前状态标志,初始为1、2号供水状态

// 主循环
LOOP:
    // 判断1、2号供水状态
    IF (M0 AND NOT X0 AND NOT X1) THEN
        Y0 = ON;  // 打开1号电磁阀
        Y1 = ON;  // 打开2号电磁阀
        // 延时供水时间(假设T0为定时器,定时时间根据实际需求设置)
        T0 = START;
        WHILE (NOT T0.DONE) DO
            // 等待供水时间结束
        END WHILE;
        Y0 = OFF;
        Y1 = OFF;
        M1 = ON;  // 切换到2、3号供水状态
        M0 = OFF;
    ELSEIF (M0 AND (X0 OR X1)) THEN
        M1 = ON;  // 若1或2号管道关闭,直接切换到2、3号供水状态
        M0 = OFF;
    END IF;

    // 判断2、3号供水状态
    IF (M1 AND NOT X1 AND NOT X2) THEN
        Y1 = ON;
        Y2 = ON;
        T1 = START;
        WHILE (NOT T1.DONE) DO
            // 等待供水时间结束
        END WHILE;
        Y1 = OFF;
        Y2 = OFF;
        M2 = ON;  // 切换到3、4号供水状态
        M1 = OFF;
    ELSEIF (M1 AND (X1 OR X2)) THEN
        M2 = ON;  // 若2或3号管道关闭,直接切换到3、4号供水状态
        M1 = OFF;
    END IF;

    // 依次类推,判断3、4号;4、5号;5、6号;6、7号;7、1号供水状态,逻辑同上述
    // 判断3、4号供水状态
    IF (M2 AND NOT X2 AND NOT X3) THEN
        Y2 = ON;
        Y3 = ON;
        T2 = START;
        WHILE (NOT T2.DONE) DO
            // 等待供水时间结束
        END WHILE;
        Y2 = OFF;
        Y3 = OFF;
        M3 = ON;  // 切换到4、5号供水状态
        M2 = OFF;
    ELSEIF (M2 AND (X2 OR X3)) THEN
        M3 = ON;  // 若3或4号管道关闭,直接切换到4、5号供水状态
        M2 = OFF;
    END IF;

    // 判断4、5号供水状态
    IF (M3 AND NOT X3 AND NOT X4) THEN
        Y3 = ON;
        Y4 = ON;
        T3 = START;
        WHILE (NOT T3.DONE) DO
            // 等待供水时间结束
        END WHILE;
        Y3 = OFF;
        Y4 = OFF;
        M4 = ON;  // 切换到5、6号供水状态
        M3 = OFF;
    ELSEIF (M3 AND (X3 OR X4)) THEN
        M4 = ON;  // 若4或5号管道关闭,直接切换到5、6号供水状态
        M3 = OFF;
    END IF;

    // 判断5、6号供水状态
    IF (M4 AND NOT X4 AND NOT X5) THEN
        Y4 = ON;
        Y5 = ON;
        T4 = START;
        WHILE (NOT T4.DONE) DO
            // 等待供水时间结束
        END WHILE;
        Y4 = OFF;
        Y5 = OFF;
        M5 = ON;  // 切换到6、7号供水状态
        M4 = OFF;
    ELSEIF (M4 AND (X4 OR X5)) THEN
        M5 = ON;  // 若5或6号管道关闭,直接切换到6、7号供水状态
        M4 = OFF;
    END IF;

    // 判断6、7号供水状态
    IF (M5 AND NOT X5 AND NOT X6) THEN
        Y5 = ON;
        Y6 = ON;
        T5 = START;
        WHILE (NOT T5.DONE) DO
            // 等待供水时间结束
        END WHILE;
        Y5 = OFF;
        Y6 = OFF;
        M6 = ON;  // 切换到7、1号供水状态
        M5 = OFF;
    ELSEIF (M5 AND (X5 OR X6)) THEN
        M6 = ON;  // 若6或7号管道关闭,直接切换到7、1号供水状态
        M5 = OFF;
    END IF;

    // 判断7、1号供水状态
    IF (M6 AND NOT X6 AND NOT X0) THEN
        Y6 = ON;
        Y0 = ON;
        T6 = START;
        WHILE (NOT T6.DONE) DO
            // 等待供水时间结束
        END WHILE;
        Y6 = OFF;
        Y0 = OFF;
        M0 = ON;  // 切换回1、2号供水状态
        M6 = OFF;
    ELSEIF (M6 AND (X6 OR X0)) THEN
        M0 = ON;  // 若7或1号管道关闭,直接切换回1、2号供水状态
        M6 = OFF;
    END IF;

    // 跳转到循环开始处
    GOTO LOOP;
只有想不到的,没有做不到的