西门子 S7-200 PLC 多机组运行(开机时长平均)完整程序示例
以下是 4 台机组(泵 / 风机 / 压缩机)的完整控制程序,基于 S7-200 CPU 226(S7-200 SMART 可直接适配,仅需调整寄存器地址标注),核心功能:累计运行时长自动均衡 + 最短时长优先启动 + 故障避让 + 手动 / 自动切换,包含梯形图(LAD)程序、寄存器分配、调试说明,可直接导入 PLC 测试。
一、核心参数与寄存器分配(关键!必须统一)
1. 输入输出(I/O)地址分配
| 类型 | 地址 | 功能描述 | 备注 |
|---|---|---|---|
| 输入 | I0.0 | 机组 1 运行反馈(常开) | 电机接触器辅助触点 |
| 输入 | I0.1 | 机组 2 运行反馈(常开) | 同上 |
| 输入 | I0.2 | 机组 3 运行反馈(常开) | 同上 |
| 输入 | I0.3 | 机组 4 运行反馈(常开) | 同上 |
| 输入 | I0.4 | 机组 1 故障反馈(常闭) | 故障时断开,自动屏蔽该机组 |
| 输入 | I0.5 | 机组 2 故障反馈(常闭) | 同上 |
| 输入 | I0.6 | 机组 3 故障反馈(常闭) | 同上 |
| 输入 | I0.7 | 机组 4 故障反馈(常闭) | 同上 |
| 输入 | I1.0 | 自动 / 手动切换(ON = 自动,OFF = 手动) | 旋钮开关 |
| 输入 | I1.1 | 系统启动指令(自动模式有效) | 如压力低触发、定时启动 |
| 输入 | I1.2 | 系统停止指令(自动模式有效) | 如压力高触发、紧急停止 |
| 输入 | I1.3 | 手动启动机组 1 | 手动模式有效 |
| 输入 | I1.4 | 手动停止机组 1 | 手动模式有效 |
| 输入 | I1.5 | 手动启动机组 2 | 手动模式有效 |
| 输入 | I1.6 | 手动停止机组 2 | 手动模式有效 |
| 输入 | I2.0 | 手动启动机组 3 | 手动模式有效 |
| 输入 | I2.1 | 手动停止机组 3 | 手动模式有效 |
| 输入 | I2.2 | 手动启动机组 4 | 手动模式有效 |
| 输入 | I2.3 | 手动停止机组 4 | 手动模式有效 |
| 输入 | I2.4 | 累计时长清零(需长按 3 秒) | 加防误触逻辑 |
| 输出 | Q0.0 | 机组 1 启动输出(控制接触器) | 线圈需串接故障保护触点 |
| 输出 | Q0.1 | 机组 2 启动输出(控制接触器) | 同上 |
| 输出 | Q0.2 | 机组 3 启动输出(控制接触器) | 同上 |
| 输出 | Q0.3 | 机组 4 启动输出(控制接触器) | 同上 |
| 输出 | Q1.0 | 系统运行指示灯 | 至少 1 台机组运行时亮 |
| 输出 | Q1.1 | 系统故障指示灯 | 任意机组故障时亮 |
| 输出 | Q1.2 | 自动模式指示灯 | 自动模式时亮 |
2. 内部寄存器分配(V 区,掉电保持)
| 地址 | 数据类型 | 功能描述 | 备注 |
|---|---|---|---|
| VD0 | DINT | 机组 1 累计运行时间(秒) | 掉电保持,单位:s |
| VD4 | DINT | 机组 2 累计运行时间(秒) | 同上 |
| VD8 | DINT | 机组 3 累计运行时间(秒) | 同上 |
| VD12 | DINT | 机组 4 累计运行时间(秒) | 同上 |
| VD16 | DINT | 机组 1 启动时刻时间戳(秒) | 记录启动时的系统总秒数 |
| VD20 | DINT | 机组 2 启动时刻时间戳(秒) | 同上 |
| VD24 | DINT | 机组 3 启动时刻时间戳(秒) | 同上 |
| VD28 | DINT | 机组 4 启动时刻时间戳(秒) | 同上 |
| VD32 | DINT | 临时存储当前时间戳(秒) | 计算运行时长用 |
| VD36 | DINT | 临时存储单次运行时长(秒) | 计算运行时长用 |
| VD40 | DINT | 系统当前总秒数(时间戳) | 从 2025-01-01 00:00:00 开始累计 |
| VB44 | BYTE | 当前运行机组数量 | 范围 0~4 |
| VB45 | BYTE | 选中启动的机组编号(1~4) | 自动模式筛选结果 |
| VB46.0 | BOOL | 机组 1 启动标志位 | 避免重复启动 |
| VB46.1 | BOOL | 机组 2 启动标志位 | 同上 |
| VB46.2 | BOOL | 机组 3 启动标志位 | 同上 |
| VB46.3 | BOOL | 机组 4 启动标志位 | 同上 |
| VB47.0 | BOOL | 自动启动允许标志 | 避免同时启动多台 |
| VB47.1 | BOOL | 清零触发标志 | 长按 I2.4 后置 1 |
| VB48.0 | BOOL | 机组 1 故障标志位(自锁) | 故障时置 1,复位需手动清除 |
| VB48.1 | BOOL | 机组 2 故障标志位(自锁) | 同上 |
| VB48.2 | BOOL | 机组 3 故障标志位(自锁) | 同上 |
| VB48.3 | BOOL | 机组 4 故障标志位(自锁) | 同上 |
3. 系统时钟相关寄存器
| 地址 | 数据类型 | 功能描述 | 备注 |
|---|---|---|---|
| VW100 | WORD | RTC 年(如 25=2025) | S7-200 RTC 默认存储地址 |
| VW102 | WORD | RTC 月(1~12) | 同上 |
| VW104 | WORD | RTC 日(1~31) | 同上 |
| VW106 | WORD | RTC 时(0~23) | 同上 |
| VW108 | WORD | RTC 分(0~59) | 同上 |
| VW110 | WORD | RTC 秒(0~59) | 同上 |
二、完整梯形图程序(分模块)
模块 1:系统时间戳转换(将 RTC 转为总秒数)
功能:读取 PLC 实时时钟(RTC),转换为 “从 2025-01-01 00:00:00 开始的总秒数”,存入 VD40(当前时间戳),为时长计算提供基准。
ladder
// 网络1:读取RTC实时时钟 LD SM0.0 CALL READ_RTC, &VB100, VW112 // 读取RTC到VW100~VW109,VW112存错误码 AN VW112 // 无错误时执行转换 JMP LBL0 LD SM0.0 = Q1.1 // 时钟读取错误,触发故障灯 LBL0: // 网络2:RTC转总秒数(简化版,忽略平闰年,误差可接受) LD SM0.0 // 年:(年-25)*31536000秒(2025年为基准) MOV_W VW100, VW114 SUB_W VW114, 25, VW114 MUL_I VW114, 31536000, VD44 // 月:月*2592000秒(按30天计算) MOV_W VW102, VW116 MUL_I VW116, 2592000, VD48 // 日:日*86400秒 MOV_W VW104, VW118 MUL_I VW118, 86400, VD52 // 时:时*3600秒 MOV_W VW106, VW120 MUL_I VW120, 3600, VD56 // 分:分*60秒 MOV_W VW108, VW122 MUL_I VW122, 60, VD60 // 秒:直接取RTC秒 MOV_W VW110, VW124 MOV_I VW124, VD64 // 总秒数=年+月+日+时+分+秒,存入VD40 ADD_DW VD44, VD48, VD40 ADD_DW VD40, VD52, VD40 ADD_DW VD40, VD56, VD40 ADD_DW VD40, VD60, VD40 ADD_DW VD40, VD64, VD40
模块 2:累计运行时间更新(4 台机组通用逻辑)
功能:实时更新每台机组的累计运行时间,启动时记录时间戳,运行中每 1 秒累加,停止时补全时长。
ladder
// 网络3:机组1累计时间更新 // 1. 启动时记录时间戳(上升沿) LD I0.0 // 机组1运行反馈 AN VB46.0 // 未启动标志 EU MOV_DW VD40, VD16 // 存储启动时刻时间戳 SET VB46.0 // 置位启动标志 // 2. 运行中每1秒累加时长 LD I0.0 LD SM0.5 // PLC内置1秒脉冲 A VB46.0 EU MOV_DW VD40, VD32 // 当前时间戳存入临时寄存器 SUB_DW VD32, VD16, VD36 // 单次运行时长=当前-启动时刻 ADD_DW VD0, VD36, VD0 // 累计时间=原时长+单次时长 // 3. 停止时补全时长(下降沿) LD I0.0 ED MOV_DW VD40, VD32 SUB_DW VD32, VD16, VD36 ADD_DW VD0, VD36, VD0 R VB46.0 // 复位启动标志 // 网络4:机组2累计时间更新(仅地址偏移,逻辑同机组1) LD I0.1 AN VB46.1 EU MOV_DW VD40, VD20 SET VB46.1 LD I0.1 LD SM0.5 A VB46.1 EU MOV_DW VD40, VD32 SUB_DW VD32, VD20, VD36 ADD_DW VD4, VD36, VD4 LD I0.1 ED MOV_DW VD40, VD32 SUB_DW VD32, VD20, VD36 ADD_DW VD4, VD36, VD4 R VB46.1 // 网络5:机组3累计时间更新(地址偏移) LD I0.2 AN VB46.2 EU MOV_DW VD40, VD24 SET VB46.2 LD I0.2 LD SM0.5 A VB46.2 EU MOV_DW VD40, VD32 SUB_DW VD32, VD24, VD36 ADD_DW VD8, VD36, VD8 LD I0.2 ED MOV_DW VD40, VD32 SUB_DW VD32, VD24, VD36 ADD_DW VD8, VD36, VD8 R VB46.2 // 网络6:机组4累计时间更新(地址偏移) LD I0.3 AN VB46.3 EU MOV_DW VD40, VD28 SET VB46.3 LD I0.3 LD SM0.5 A VB46.3 EU MOV_DW VD40, VD32 SUB_DW VD32, VD28, VD36 ADD_DW VD12, VD36, VD12 LD I0.3 ED MOV_DW VD40, VD32 SUB_DW VD32, VD28, VD36 ADD_DW VD12, VD36, VD12 R VB46.3
模块 3:故障检测与自锁(故障避让基础)
功能:检测机组故障并自锁,故障时屏蔽启动,故障恢复后需手动复位(或自动复位,可修改)。
ladder
// 网络7:机组故障检测与自锁 // 机组1故障(I0.4为常闭,故障时断开) LD NOT I0.4 EU SET VB48.0 // 机组1故障复位(手动复位,可改为自动) LD I1.3 // 手动启动按钮(兼复位) A VB48.0 R VB48.0 // 机组2故障 LD NOT I0.5 EU SET VB48.1 LD I1.5 A VB48.1 R VB48.1 // 机组3故障 LD NOT I0.6 EU SET VB48.2 LD I2.0 A VB48.2 R VB48.2 // 机组4故障 LD NOT I0.7 EU SET VB48.3 LD I2.2 A VB48.3 R VB48.3 // 系统故障灯(任意机组故障亮) LD VB48.0 OLD VB48.1 OLD VB48.2 OLD VB48.3 = Q1.1
模块 4:运行机组数量计数
功能:统计当前运行的机组台数,为自动启动 / 停止提供判断依据(如最多 3 台运行、最少 1 台运行)。
ladder
// 网络8:运行机组数量计数(每秒更新1次) LD SM0.5 MOV_B 0, VB44 // 初始化计数器 // 机组1运行,计数+1 LD I0.0 AN VB48.0 JMP LBL1 ADD_B VB44, 1, VB44 LBL1: // 机组2运行,计数+1 LD I0.1 AN VB48.1 JMP LBL2 ADD_B VB44, 1, VB44 LBL2: // 机组3运行,计数+1 LD I0.2 AN VB48.2 JMP LBL3 ADD_B VB44, 1, VB44 LBL3: // 机组4运行,计数+1 LD I0.3 AN VB48.3 JMP LBL4 ADD_B VB44, 1, VB44 LBL4: // 系统运行灯(运行数量≥1时亮) LD VB44 GT 0 = Q1.0。

