以下是基于西门子 S7-1200/1500 PLC 的恒压供水完整程序(含详细注释),采用 PID 控制算法实现水压稳定,适配单泵 / 多泵切换场景,程序结构清晰,包含压力采集、PID 调节、水泵控制、故障保护等核心功能。
恒压供水 PLC 程序(STL 语言,带注释)
stl
// ************************** 符号表定义 ************************** // 输入信号 (I) // I0.0: 系统启动按钮 // I0.1: 系统停止按钮 // I0.2: 手动/自动切换 (0=自动,1=手动) // I0.3: 水泵1故障信号 (常闭) // I0.4: 水泵2故障信号 (常闭) // I0.5: 压力传感器故障信号 (常闭) // AIW0: 压力传感器输入 (4-20mA对应0-10bar) // 输出信号 (Q) // Q0.0: 水泵1运行接触器 // Q0.1: 水泵1变频/工频切换 (0=变频,1=工频) // Q0.2: 水泵2运行接触器 // Q0.3: 水泵2变频/工频切换 (0=变频,1=工频) // Q0.4: 系统故障报警灯 // Q0.5: 运行指示灯 // 中间变量 (M) // M0.0: 系统运行标志 (1=运行) // M0.1: 自动模式标志 (1=自动) // M0.2: 水泵1运行标志 // M0.3: 水泵2运行标志 // M0.4: 变频泵切换请求 // M1.0: 压力传感器故障标志 // M1.1: 水泵1故障标志 // M1.2: 水泵2故障标志 // MD2: 实际压力值 (bar) // MD6: 目标压力设定值 (bar,默认3bar) // MD10: PID输出值 (0-100%,对应0-50Hz) // MW14: 变频泵当前运行台数 // MW16: 压力偏差值 (目标-实际,bar) // MW18: 定时切换时间 (秒,默认300s) // MW20: 计时计数器 // ************************** 主程序 ************************** ORGANIZATION_BLOCK OB1 TITLE = 恒压供水主循环 // 1. 系统启停控制 L I0.0 // 启动按钮 AN I0.1 // 停止按钮未按下 S M0.0 // 置位系统运行标志 L I0.1 // 停止按钮 R M0.0 // 复位系统运行标志 // 2. 模式切换控制 L I0.2 // 手动/自动切换 FP M2.0 // 上升沿检测 JNB _001 // 无上升沿则跳转 L I0.2 // 切换状态 L 1 ==I // 若切换到手动 JNB _002 R M0.1 // 复位自动模式标志 JMP _003 _002: S M0.1 // 置位自动模式标志(自动模式) _003: NOP 0 _001: NOP 0 // 3. 压力信号采集与转换(4-20mA转0-10bar) L "AIW0" // 读取压力传感器模拟量输入 L 27648 // 16位满量程值 /I // 归一化到0-1 L 10.0 // 最大压力10bar *R // 计算实际压力值 T "MD2" // 存储实际压力 // 4. 故障检测 // 压力传感器故障(信号断线或超量程) L I0.5 // 传感器故障信号 FP M2.1 JNB _004 L I0.5 L 1 ==I JNB _005 S M1.0 // 置位传感器故障标志 JMP _006 _005: R M1.0 // 复位故障标志 _006: NOP 0 _004: NOP 0 // 5. 故障报警输出 L M1.0 // 传感器故障 O M1.1 // 水泵1故障 O M1.2 // 水泵2故障 = Q0.4 // 报警灯亮 L NOT_Q0.4 // 无故障时 AN NOT_M0.0 // 且系统运行 = Q0.5 // 运行灯亮 // 6. 自动模式控制(调用PID与水泵切换逻辑) L M0.0 // 系统运行 AN M1.0 // 无传感器故障 A M0.1 // 自动模式 JNB _011 // 不满足则跳至手动逻辑 CALL "PID控制" // 调用PID功能块,计算输出频率 CALL "水泵切换逻辑" // 根据PID输出控制水泵启停与变频切换 JMP _012 _011: CALL "手动控制逻辑" // 手动模式下直接控制水泵 _012: NOP 0 END_ORGANIZATION_BLOCK // ************************** PID控制功能块 ************************** FUNCTION_BLOCK "PID控制" TITLE = 压力PID调节 VAR_INPUT SP: REAL; // 目标压力设定值 (bar) PV: REAL; // 实际压力值 (bar) END_VAR VAR_OUTPUT OUT: REAL; // PID输出 (0-100%) END_VAR VAR KP: REAL := 5.0; // 比例系数(可根据系统调整) KI: REAL := 0.2; // 积分系数 KD: REAL := 0.1; // 微分系数 Err: REAL; // 偏差值 (SP-PV) ErrSum: REAL := 0.0; // 偏差积分和 ErrLast: REAL := 0.0; // 上一周期偏差 END_VAR // PID算法实现(增量式PID) L "SP" // 目标压力 L "PV" // 实际压力 -R // 计算偏差 Err = SP - PV L 0.0 T "ErrSum" _014: NOP 0 // 计算PID输出:OUT = KP*Err + KI*ErrSum + KD*(Err-ErrLast) L "KP" L "Err" *R // 比例项 L "KI" L "ErrSum" *R // 积分项 +R L "KD" L "Err" L "ErrLast" -R *R // 微分项 +R T "OUT" // 暂存输出 // 输出限幅(0-100%) L "OUT" L 100.0 >R JNB _015 L 100.0 T "OUT" END_FUNCTION_BLOCK // ************************** 水泵切换逻辑 ************************** FUNCTION_BLOCK "水泵切换逻辑" TITLE = 多泵变频切换控制 // 逻辑说明:1台变频泵调节,当频率达90%时启动第2台工频泵,频率降至30%时停工频泵 // 定时切换变频泵(防止某台泵长期运行) VAR FreqHigh: REAL := 90.0; // 高频阈值(启动工频泵) FreqLow: REAL := 30.0; // 低频阈值(停止工频泵) END_VAR // 1. 变频泵运行台数判断 L "MD10" // PID输出频率 L "FreqHigh" >=R // 频率≥90%,需增开工频泵 JNB _017 L "MW14" // 当前运行台数 L 2 // 3. 定时切换变频泵(300秒切换一次) _030: NOP 0 END_FUNCTION_BLOCK
程序说明
可根据实际水泵数量(如 3 台、4 台)扩展 “水泵切换逻辑”,增加更多泵的联动控制。