1. 项目概述与硬件配置
在工业自动化领域,Modbus RTU通讯是最基础也是最实用的现场总线技术之一。这次我们要实现的是用西门子S7-200 SMART PLC通过Modbus RTU协议同时控制四台三菱E700系列变频器,并在MCGS触摸屏上实现完整的监控功能。这个方案已经在多个现场稳定运行超过两年,最大扩展到同时控制16台设备。
1.1 硬件选型与连接
核心硬件包括:
- 西门子S7-200 SMART SR20 PLC(6ES7288-1SR20-0AA0)
- 三菱FR-E700系列变频器(0.4kW-15kW均可)
- MCGS TPC7062KX触摸屏(或使用电脑仿真)
- 标准RS485总线(建议使用带屏蔽双绞线)
接线时需要特别注意:
- PLC侧的DB9接口定义与常规不同:3脚为A+(正端),8脚为B-(负端)
- 每个变频器的PU接口接线:SDA接A+,SDB接B-
- 总线两端必须加装120Ω终端电阻,距离超过50米时建议每30米加一个中继器
实际调试中发现,如果使用普通网线代替专用RS485电缆,在电磁干扰严重的场合会出现偶发通讯中断。建议使用Belden 3106A这类专业现场总线电缆。
2. 变频器参数设置
2.1 基础通讯参数
每台变频器需要设置以下关键参数(通过操作面板设置):
| 参数号 | 设定值 | 说明 |
|---|---|---|
| Pr.117 | 1-4 | 站号(每台设备唯一) |
| Pr.118 | 192 | 波特率9600bps |
| Pr.119 | 1 | 8位数据位+偶校验 |
| Pr.120 | 2 | 停止位1位 |
| Pr.547 | 0 | 响应时间5ms |
2.2 功能参数优化
为提高系统响应速度,建议额外设置:
- Pr.79=0(允许面板和通讯同时操作)
- Pr.340=1(通讯错误时继续运行)
- Pr.77=0(参数写入禁止解除)
调试时遇到过变频器偶尔不响应的情况,后来发现是Pr.547设置不当。当设置为0(5ms响应)时,在长距离总线中可能出现超时,此时可尝试设为1(10ms响应)。
3. PLC程序设计
3.1 Modbus RTU主站配置
S7-200 SMART使用Port0口进行Modbus通讯,需在系统块中配置:
- 波特率:9600
- 校验方式:偶校验
- 站地址:1(PLC自身地址)
关键初始化指令:
st复制MBUS_CTRL(
EN => 1,
Mode => 1, // 0=PPI 1=Modbus
Baud => 9600,
Parity => 2, // 0=无 1=奇 2=偶
Timeout => 1000,
Done => Init_Done);
3.2 轮询机制实现
采用指针循环方式实现四台设备的轮询,核心程序结构:
st复制// 数据块定义
VAR
// 设备参数数组
Station_NO: ARRAY[1..4] OF BYTE := [1,2,3,4];
Read_Addr: ARRAY[1..4] OF DWORD := [16#2100, 16#2100, 16#2100, 16#2100];
Write_Addr: ARRAY[1..4] OF DWORD := [16#2000, 16#2000, 16#2000, 16#2000];
// 运行参数
Poll_Ptr: INT := 1; // 当前轮询指针
Read_Buffer: ARRAY[1..4,0..5] OF INT; // 读取数据缓存
Write_Data: ARRAY[1..4] OF INT; // 写入数据缓存
END_VAR
// 主轮询程序
IF NOT MBUS_MSG.Done THEN
RETURN;
END_IF;
// 读取操作
MBUS_MSG(
EN := 1,
Slave := Station_NO[Poll_Ptr],
RW := 0, // 0=读 1=写
Addr := Read_Addr[Poll_Ptr],
Count := 6, // 读取6个寄存器
DataPtr => ADR(Read_Buffer[Poll_Ptr]),
Done => Read_Done);
// 指针循环
Poll_Ptr := Poll_Ptr + 1;
IF Poll_Ptr > 4 THEN
Poll_Ptr := 1;
// 每轮读取完成后执行写入周期
IF 需要写入 THEN
MBUS_MSG(
EN := 1,
Slave := Station_NO[Write_Ptr],
RW := 1,
Addr := Write_Addr[Write_Ptr],
Count := 1,
DataPtr => ADR(Write_Data[Write_Ptr]),
Done => Write_Done);
END_IF;
END_IF;
3.3 数据处理技巧
-
频率值处理:
st复制实际频率 := Read_Buffer[1,0] / 100.0; // 4000表示40.00Hz -
状态位解析:
st复制运行状态 := Read_Buffer[1,5] AND 16#0001; // 取最低位 故障状态 := (Read_Buffer[1,5] AND 16#0080) >> 7; -
滑动滤波算法:
st复制// 电流电压滤波 新电流值 := Read_Buffer[1,2]; 滤波电流 := (滤波电流 * 3 + 新电流值) / 4;
4. 触摸屏界面设计
4.1 MCGS变量绑定
在MCGS中建立与PLC的变量关联:
| 变量名 | PLC地址 | 说明 |
|---|---|---|
| 变频器1频率 | VW100 | 读取缓冲区第1个字 |
| 变频器1电流 | VW104 | 读取缓冲区第3个字 |
| 变频器1状态 | VW110 | 读取缓冲区第6个字 |
| 变频器1控制 | VW200 | 写入控制命令 |
4.2 控制按钮逻辑
正转按钮脚本:
lua复制-- 正转命令(16#047F)
WriteData[1] = 0x047F
PLC.Write("VW200", WriteData[1])
停止按钮脚本:
lua复制-- 停止命令(16#0C7F)
WriteData[1] = 0x0C7F
PLC.Write("VW200", WriteData[1])
频率设定脚本:
lua复制-- 频率设定(单位0.01Hz)
SetFreq = InputFreq * 100
PLC.Write("VW202", SetFreq)
5. 系统调试与优化
5.1 通讯故障排查
常见问题及解决方法:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 全部设备无响应 | 总线接线错误 | 检查A+/B-是否接反 |
| 个别设备不响应 | 站号冲突 | 检查Pr.117设置 |
| 数据偶尔错误 | 终端电阻缺失 | 总线两端加120Ω电阻 |
| 通讯时断时续 | 电磁干扰 | 更换屏蔽电缆,远离动力线 |
5.2 性能优化建议
-
轮询时序优化:
- 关键设备缩短轮询间隔
- 非关键参数减少读取频率
-
错误处理机制:
st复制IF MBUS_MSG.Error THEN Fault_Counter[Poll_Ptr] := Fault_Counter[Poll_Ptr] + 1; IF Fault_Counter[Poll_Ptr] > 3 THEN // 触发报警 END_IF; ELSE Fault_Counter[Poll_Ptr] := 0; END_IF; -
扩展性设计:
- 使用间接寻址便于增加设备
- 预留10%的通讯余量
6. 项目扩展与应用
6.1 多设备扩展方案
要增加更多变频器:
- 修改数组大小:
ARRAY[1..8](扩展到8台) - 调整轮询指针上限:
IF Poll_Ptr > 8 THEN - 确保总线驱动能力足够(超过8台建议加中继器)
6.2 与其他系统集成
-
与上位机通讯:
- 通过PLC的以太网口上传数据
- 使用OPC UA协议
-
云平台对接:
st复制// 通过MQTT发布数据 MQTT_Publish( Topic := 'motor/' + INT_TO_STRING(Station_NO[Poll_Ptr]) + '/freq', Payload := INT_TO_STRING(Read_Buffer[Poll_Ptr,0])); -
安全联锁:
- 急停信号直接接变频器端子
- PLC程序中加入看门狗定时器
这套系统在实际应用中表现出色,单个通讯周期可控制在150ms以内(4台设备),扩展到16台时周期时间约500ms,完全满足大多数工业场合的实时性要求。最大的优势在于其模块化设计——需要增加监控参数时只需扩展读取寄存器数量,而无需改动整体架构。