1. 项目概述
在工业自动化控制系统中,PLC与变频器的通讯是实现电机精准控制的关键环节。西门子S7-200 SMART系列PLC凭借其优异的性价比和稳定的Modbus通讯能力,成为中小型自动化项目的首选控制器。本文将详细介绍如何通过Modbus RTU协议实现PLC对变频器的轮询控制,这套方案已经在多个实际项目中验证,包括纺织机械、输送线和包装设备等应用场景。
2. 硬件连接与配置
2.1 物理接线规范
RS485通讯的可靠性很大程度上取决于接线质量。我们需要:
- 使用双绞屏蔽电缆(如Belden 9841),屏蔽层单端接地
- PLC端:3号端子(T+/A+)接变频器A+,8号端子(T-/B-)接变频器B-
- 在总线两端各加装120Ω终端电阻
- 确保所有设备共地,但避免形成地环路
实际项目中,我曾遇到过因接地不良导致通讯断续的问题。后来采用等电位连接器将各设备接地端子统一连接到铜排,问题立即解决。
2.2 变频器参数设置详解
以某品牌变频器为例,关键参数设置如下表:
| 参数代码 | 名称 | 设定值 | 说明 |
|---|---|---|---|
| P00.01 | 通讯地址 | 1 | 范围1-247,需唯一 |
| P00.03 | 波特率 | 3 | 对应9600bps |
| P00.04 | 数据格式 | 3 | 8N1(8位数据,无校验) |
| P00.05 | 通讯超时 | 1000 | 单位ms,建议500-2000 |
| P01.00 | 命令源选择 | 5 | 通讯控制启停和频率给定 |
不同品牌变频器参数代码可能不同,但核心设置逻辑相通。建议先通过面板手动控制验证变频器基本功能正常,再切换为通讯控制模式。
3. Modbus寄存器映射
3.1 标准寄存器定义
该变频器采用Modbus功能码03H(读保持寄存器)和06H(写单个寄存器),关键寄存器地址如下:
| 寄存器地址 | 功能 | 数据类型 | 换算公式 |
|---|---|---|---|
| 0x0021 | 输出频率 | U16 | 实际值=读取值/100 |
| 0x0023 | 输出电流 | U16 | 实际值=读取值/10 |
| 0x0025 | 输出转速 | U16 | 直接对应RPM值 |
| 0x0001 | 运行控制 | U16 | 0=停止,1=启动 |
| 0x0010 | 频率给定 | U16 | 设定值=目标频率×100 |
3.2 多字节数据处理
当读取32位数据(如功率、转矩)时,需要注意:
- 设置Count=2,读取连续两个寄存器
- 在PLC中通过MOV指令组合成DWORD:
ST复制MOVW &VB100, VD200 // 将VB100-VB101移至VD200低字
MOVW &VB102, VD204 // 将VB102-VB103移至VD204低字
MOVDW VD200, VD208 // 合并为32位数据
4. PLC程序实现
4.1 通讯初始化
在首次扫描时执行初始化:
ST复制// 端口0配置为Modbus RTU主站
MOVB 16#86, SMB30 // 9600bps,8N1,RTU模式
MOVB 16#0B, SMB87 // 启用接收器,检测空闲线
MOVB 100, SMB92 // 字符间超时100ms
MOVB 5, SMB94 // 消息间间隔5个字符
4.2 轮询调度设计
采用状态机实现可靠轮询:
ST复制// 状态机变量定义
VW300 := 0 // 当前状态
VW302 := 0 // 错误计数器
// 主轮询程序
LD SM0.0
CALL SBR0
// 子程序SBR0
LD SM0.0
MOVW VW300, LW0
JMP LW0
// 状态0:读频率
LBL 0
MBUS_MSG(EN:=1, Slave:=1, RW:=0, Addr:=16#21, Count:=2, DataPtr:=&VD100)
MOVW 1, VW300
JMP END
// 状态1:读电流
LBL 1
LD M0.0 // 上个指令完成
MBUS_MSG(EN:=1, Slave:=1, RW:=0, Addr:=16#23, Count:=2, DataPtr:=&VD104)
MOVW 2, VW300
JMP END
// 状态2:读转速
LBL 2
LD M0.2
MBUS_MSG(EN:=1, Slave:=1, RW:=0, Addr:=16#25, Count:=2, DataPtr:=&VD108)
MOVW 3, VW300
JMP END
// 状态3:写控制
LBL 3
LD M0.4
MBUS_MSG(EN:=I0.0, Slave:=1, RW:=1, Addr:=16#01, Count:=1, DataPtr:=&VW200)
MOVW 0, VW300 // 循环回初始状态
4.3 错误处理机制
增加以下保护措施:
- 指令超时监控:每个MBUS_MSG指令设置500ms超时
ST复制LD M0.1 // 错误标志
TON T37, 500 // 500ms定时器
LD T37
MOVW 0, VW300 // 超时复位状态机
INCW VW302 // 错误计数
- 连续错误超过5次触发报警
ST复制LDW>= VW302, 5
= M10.0 // 通讯故障报警
5. 触摸屏集成
5.1 WinCC Flexible配置要点
- 建立与S7-200 SMART的PPI连接
- 创建以下变量:
- 显示变量:VD100(频率)、VD104(电流)、VD108(转速)
- 控制变量:VW200(启停)、VW202(频率给定)
- 频率给定控件属性设置:
- 格式:浮点,1位小数
- 量程:0.0-50.0Hz
- 线性转换:原始值=显示值×100
5.2 多台变频器扩展
通过修改从站地址实现多设备控制:
ST复制// 在轮询状态机中增加从站选择
LD SM0.0
MOVB 1, VB400 // 当前从站地址
// 每个MBUS_MSG指令改为
MBUS_MSG(EN:=1, Slave:=VB400, RW:=0, Addr:=16#21, Count:=2, DataPtr:=&VD100)
// 完成一轮后切换从站
LD M0.8 // 最后一个指令完成
INCB VB400
LDW>= VB400, 5 // 假设共5台
MOVB 1, VB400 // 循环回第一台
6. 调试经验分享
6.1 典型问题排查
-
通讯无响应:
- 检查终端电阻是否安装
- 用万用表测量A-B间电压(正常应有2-6V波动)
- 通过串口调试助手监听原始数据
-
数据错误:
- 确认所有设备波特率一致
- 检查寄存器地址是否匹配
- 验证数据高低字节顺序
-
随机干扰:
- 增加通讯重试机制
- 降低波特率到4800bps测试
- 在PLC端加装信号隔离器
6.2 性能优化建议
-
轮询周期计算:
- 单台设备:每个指令约20ms
- 5台设备×5个参数=25个指令
- 理论最小周期=25×20=500ms
- 实际建议设置1s以上周期
-
关键参数优先:
ST复制// 在状态机中优先处理重要参数 LBL 0 // 第一优先级:启停状态 MBUS_MSG(EN:=1, Slave:=1, RW:=0, Addr:=16#100, Count:=1, DataPtr:=&VW110) LBL 1 // 第二优先级:频率反馈 MBUS_MSG(EN:=M0.0, Slave:=1, RW:=0, Addr:=16#21, Count:=2, DataPtr:=&VD100) -
数据变化触发:
ST复制// 只在数据变化时上传HMI LDW<> VW110, VW112 // 比较新旧值 MOVW VW110, VW112 // 更新缓存 = M20.0 // 变化标志
这套系统在某包装线项目中稳定运行超过2年,控制8台变频器,平均无故障时间超过8000小时。实际应用中建议定期检查接线端子和通讯参数,特别是在有振动或腐蚀性气体的环境中。