1. 项目概述
在工业自动化领域,PLC(可编程逻辑控制器)之间的通信是实现设备协同控制的基础。Modbus TCP作为工业以太网协议中的"普通话",因其简单可靠的特点,成为不同品牌PLC间通信的首选方案。这次我们要实现的是两台PLC通过Modbus TCP协议建立主从站通信连接,其中一台作为主站(Master),另一台作为从站(Slave)。
这种架构在实际生产中非常常见,比如在流水线控制中,主站PLC负责整体调度,从站PLC控制具体工位设备。相比传统的硬接线方式,Modbus TCP通信不仅节省了大量布线成本,还实现了更灵活的数据交互。
2. 硬件准备与网络配置
2.1 设备选型要点
选择支持Modbus TCP协议的PLC是前提。目前市面上主流品牌如西门子S7-1200/1500、三菱FX5U、欧姆龙NJ/NX、施耐德M580等都内置了Modbus TCP功能。如果使用较老型号的PLC,可能需要额外购买通信模块。
注意:不同品牌的Modbus功能实现可能有差异,建议查阅具体型号的技术手册确认功能支持情况。
2.2 网络连接方案
两台PLC通过工业交换机或直接网线连接组成局域网。推荐使用工业级交换机,其抗干扰能力更强。网络拓扑建议如下:
code复制[主站PLC] --- [工业交换机] --- [从站PLC]
|
[HMI/SCADA] (可选)
关键参数配置表:
| 参数项 | 主站PLC | 从站PLC |
|---|---|---|
| IP地址 | 192.168.1.10 | 192.168.1.20 |
| 子网掩码 | 255.255.255.0 | 255.255.255.0 |
| 默认网关 | 192.168.1.1 | 192.168.1.1 |
| 端口号 | 502 | 502 |
提示:避免使用192.168.0.x或192.168.1.x这类常见网段,建议改为192.168.100.x等较少冲突的地址段。
3. 从站PLC配置详解
3.1 从站数据区规划
从站需要预先定义好供主站访问的数据区。Modbus TCP支持以下四种数据类型:
- 线圈(Coils,地址0xxxx):可读可写的布尔量
- 离散输入(Discrete Inputs,地址1xxxx):只读布尔量
- 输入寄存器(Input Registers,地址3xxxx):只读16位寄存器
- 保持寄存器(Holding Registers,地址4xxxx):可读可写16位寄存器
典型数据区分配示例:
| 功能 | 数据类型 | 起始地址 | 数量 |
|---|---|---|---|
| 电机启停控制 | Coils | 00001 | 8 |
| 传感器状态 | Discrete Inputs | 10001 | 16 |
| 温度采集值 | Input Registers | 30001 | 10 |
| 设定参数 | Holding Registers | 40001 | 20 |
3.2 西门子S7-1200从站配置步骤
- 在TIA Portal中新建项目,添加S7-1200 PLC
- 进入"设备视图",右键PLC选择"属性"
- 在"常规"→"PROFINET接口"中配置IP地址
- 在"防护与安全"→"连接机制"中勾选"允许来自远程对象的PUT/GET通信访问"
- 添加新DB块作为Modbus数据区,设置属性为"优化的块访问"取消勾选
- 在OB1中调用MB_SERVER指令:
- 连接参数:ActiveEstablished = TRUE
- 端口号:502
- 背景数据块:自动生成
- 编译下载程序到PLC
4. 主站PLC编程实现
4.1 通信指令解析
主站PLC需要周期性地发送Modbus请求帧。以三菱FX5U为例,使用ADPRW指令:
code复制ADPRW D100 D200 D300 D400
参数说明:
- D100:从站IP地址(如192.168.1.20)
- D200:端口号(502)
- D300:Modbus功能码+数据地址
- D400:读写数据长度
功能码示例:
- 01:读线圈
- 02:读离散输入
- 03:读保持寄存器
- 04:读输入寄存器
- 05:写单个线圈
- 06:写单个寄存器
- 16:写多个寄存器
4.2 典型通信程序结构
-
初始化阶段:
- 设置通信超时(通常3-5秒)
- 定义重试次数(建议3次)
- 建立心跳检测机制
-
主循环程序:
- 周期性读取从站数据(如每100ms)
- 异常处理与重连机制
- 数据有效性校验(CRC校验由TCP层自动处理)
-
数据处理:
- 原始数据转换(如INT转REAL)
- 量程变换(如寄存器值0-4000对应0-100℃)
- 状态位解析
5. 调试与故障排查
5.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通信超时 | 网络物理连接故障 | 检查网线、交换机端口状态 |
| IP地址冲突 | 使用ping命令测试连通性 | |
| 从站未启用Modbus服务 | 检查从站配置 | |
| 数据读取全零 | 地址映射错误 | 核对从站数据区定义 |
| 数据类型不匹配 | 确认功能码选择正确 | |
| 随机通信中断 | 网络负载过高 | 优化通信周期 |
| PLC处理能力不足 | 简化程序或升级硬件 |
5.2 Wireshark抓包分析
当通信异常时,使用Wireshark抓包是定位问题的有效手段。关键过滤条件:
code复制tcp.port == 502 && ip.addr == 192.168.1.10 && ip.addr == 192.168.1.20
典型通信过程分析:
- TCP三次握手建立连接
- 主站发送Modbus请求帧
- 从站返回响应帧
- TCP连接保持(长连接)或关闭(短连接)
经验:工业现场建议使用长连接模式,减少TCP握手开销,但需要增加心跳检测。
6. 性能优化与高级应用
6.1 通信效率提升技巧
-
批量读写优化:
- 合并多个数据项到单个请求(最大长度约250个寄存器)
- 合理安排数据区布局,将频繁访问的数据集中存放
-
通信周期设置:
- 关键数据:100-500ms
- 一般参数:1-5s
- 历史数据:分钟级
-
数据压缩策略:
- 布尔量打包(8个开关状态合并为1个字节)
- 使用Modbus功能码23(读写多个寄存器)
6.2 安全增强措施
-
网络隔离:
- 使用VLAN划分工业网络
- 部署工业防火墙
-
访问控制:
- 限制Modbus TCP端口(502)的访问IP
- 设置PLC通信白名单
-
数据校验:
- 增加软件CRC校验
- 关键数据双通道校验
7. 项目扩展方向
在实际应用中,这种基础架构可以进一步扩展:
- 多从站系统:一个主站带多个从站(建议不超过32个)
- 冗余架构:主备双主站热切换
- 跨网段通信:通过路由器连接不同子网
- 云端接入:通过MQTT网关上传数据到云平台
我在多个现场项目中验证过,这种Modbus TCP主从架构在100个节点以内的系统中表现稳定可靠。关键是要做好网络规划,避免广播风暴,同时合理设置通信周期,平衡实时性和网络负载。
