Modbus TCP协议在PLC与HMI通信中的应用,本质是让可编程逻辑控制器(PLC)和人机界面(HMI)通过以太网“说同一句话”。它不依赖专用硬件,不强制使用特定品牌设备,只靠标准化的数据格式和网络规则就能完成数据交换。以下内容全程聚焦“如何让PLC和HMI真正通上话”,所有步骤均可在主流国产/进口设备(如汇川H3U、三菱FX5U、威纶通TK系列、昆仑通态MCGS)上直接验证。
一、先搞懂Modbus TCP到底是什么(不是协议栈,是对话规则)
Modbus TCP不是新协议,而是把经典Modbus RTU的“语义”装进TCP/IP的“信封”里。它省去了RTU需要的校验位、起始位等串行细节,只保留最核心的三件事:
- 谁在问:由客户端(通常是HMI)发起请求;
- 问谁:目标PLC的IP地址和端口号(默认
502); - 问什么:用功能码+寄存器地址+数据长度来表达,例如:
- 功能码
0x03表示“读多个保持寄存器(Holding Register)”; - 地址
40001在Modbus协议中实际对应十进制偏移0(即寄存器编号从0开始计数); - 数据长度
10表示一次读取10个连续寄存器。
- 功能码
注意:
40001是传统Modbus地址命名习惯(4=保持寄存器,0001=首地址),但Modbus TCP报文里不传输这个40001,只传十进制偏移值0。HMI组态软件显示40001是为方便工程师理解,底层自动转换。
二、物理连接:四步确认网线真通、IP真对
-
确认PLC已启用Modbus TCP服务
- 汇川H3U:打开
编程软件AutoShop→ 进入系统配置→通信设置→ 勾选Modbus TCP服务器→ 设置监听端口为502; - 三菱FX5U:打开
GX Works3→参数→PLC参数→内置以太网→Modbus TCP→ 启用并指定站号(通常设为1); - 西门子S7-1200:需在TIA Portal中添加
Modbus TCP指令块(MB_SERVER),并调用至主程序。
- 汇川H3U:打开
-
给PLC分配静态IP
- 使用网线将PLC以太网口直连电脑(或同局域网);
- 打开
命令提示符,输入ping 192.168.1.100(假设PLC IP为该值); - 若返回
来自 192.168.1.100 的回复,说明物理层连通;若超时,检查网线、PLC网口指示灯是否常亮/闪烁。
-
设置HMI与PLC同网段
- 威纶通TK系列:点击
HMI编辑软件EBPro→系统参数→以太网设置→IP地址设为192.168.1.101,子网掩码255.255.255.0,网关可为空; - 昆仑通态MCGS:进入
设备窗口→ 双击通用串口父设备→ 切换为通用TCP/IP父设备→ 填写IP地址192.168.1.100,端口号502。
- 威纶通TK系列:点击
-
验证端口开放
- 在HMI所在电脑上执行:
telnet 192.168.1.100 502 - 若屏幕变为空白(无“无法连接”提示),说明PLC的502端口已监听成功;若报错,返回第1步检查PLC服务是否启用。
- 在HMI所在电脑上执行:
三、HMI组态:三类寄存器映射必须对齐
Modbus TCP通信中,HMI读写的是PLC内存中的具体区域。不同品牌PLC对寄存器的命名和偏移规则不同,必须严格对照:
| HMI组态中填写的地址 | 对应PLC内部区域(以汇川H3U为例) | 十进制偏移值 | 实际读写范围 |
|---|---|---|---|
40001 |
D寄存器(保持寄存器)起始地址 | 0 |
D0–D65535 |
00001 |
X输入点(只读) | 0 |
X0–X1FFF(共8192点) |
10001 |
Y输出点(可写) | 0 |
Y0–Y1FFF |
关键细节:
- 汇川PLC中,
D0对应 Modbus 地址40001;D100对应40101;- 三菱FX5U中,
D0对应400001(六位地址,首数字为4);D100对应400101;- 西门子S7-1200需在
MB_SERVER指令中明确指定DATA_PTR指向DB块,HMI地址需与DB内偏移一致(如DB1.DBW0对应地址40001)。
操作步骤(以威纶通EBPro为例):
- 新建
数值输入元件→ 右键属性→数据来源→Modbus TCP; - 填写
IP地址192.168.1.100,端口号502; - 地址栏输入
40001(读取D0),数据类型选整数(16位); - 勾选
允许写入(若需修改PLC内D0值); - 编译下载 至HMI,重启生效。
四、典型故障排查清单(按发生频率排序)
当HMI显示“通信失败”“数据为0”“写入无效”时,按以下顺序逐项排除:
-
Ping通但通信失败?→ 检查防火墙
- Windows系统:打开
控制面板→Windows Defender 防火墙→允许应用或功能通过防火墙→ 勾选telnet 客户端和HMI编辑软件; - 工业环境:禁用杀毒软件实时防护(尤其360、腾讯电脑管家会拦截502端口)。
- Windows系统:打开
-
HMI能读不能写?→ 查PLC写权限设置
- 汇川H3U:
AutoShop→系统配置→Modbus TCP→ 确认写使能已勾选; - 三菱FX5U:
GX Works3→参数→PLC参数→Modbus TCP→写入允许区域必须包含目标D寄存器范围(如D0–D999)。
- 汇川H3U:
-
部分地址能读、部分为乱码?→ 核对字节序(Endianness)
- Modbus TCP传输32位浮点数(REAL)或长整型(DWORD)时,需明确高低字节顺序;
- 威纶通默认
ABCD(大端模式),汇川PLC也默认大端;若读取为0x40490FDB却显示1.23而非3.14,说明HMI与PLC字节序不一致; - 解决:HMI中将数据类型改为
浮点数(ABCD)或浮点数(DCBA),逐一测试。
-
通信偶发中断?→ 查网络稳定性
- 避免使用普通家用路由器(QoS、ARP老化易丢包);
- 必须使用工业级交换机,或PLC/HMI直连;
- 在HMI中设置
重试次数≥3,超时时间≥1000 ms(EBPro路径:系统参数→通信设置→Modbus TCP)。
-
多台HMI同时连接PLC失败?→ 查PLC并发连接数限制
- 汇川H3U默认支持
8个Modbus TCP客户端; - 三菱FX5U为
4个; - 超限时,后连接的HMI会立即断开;
- 解决:在PLC端启用“连接池复用”,或改用OPC UA协议(需额外授权)。
- 汇川H3U默认支持
五、进阶技巧:一条指令实现批量读写与心跳监测
(1)单次读取20个D寄存器(提升效率)
HMI中不逐个添加40001、40002…,而用起始地址+长度方式:
- 元件属性中
地址填40001,长度填20,数据类型选整数数组(16位); - 对应PLC中D0–D19,HMI内部自动解析为20个独立变量(如
Data[0]至Data[19])。
(2)用M寄存器做通信状态灯(无需PLC逻辑)
- 在HMI中创建一个
位状态指示灯,地址设为00001(读取X0); - 将PLC的
以太网通信OK信号(如汇川的SM400.0,三菱的M8070)硬接线或软映射至X0; - HMI实时显示该位,绿色=通信正常,红色=中断。
(3)心跳包防假死(HMI主动探测)
- 在HMI脚本中编写周期任务(如每5秒执行一次):
IF !ReadWord("192.168.1.100", 502, 40000) THEN SetBit("报警指示灯", 1) ELSE SetBit("报警指示灯", 0) ENDIF此处读取D0(地址
40000对应偏移0),仅检测能否响应,不依赖具体数值。
六、安全红线:必须规避的三个致命错误
-
绝对禁止在Modbus TCP中读写PLC系统寄存器
- 如汇川的
SM区、三菱的SM特殊继电器、西门子的SFC系统存储器; - 误写可能导致PLC停机、参数丢失、固件损坏;
- 正确做法:只操作用户定义的D、M、Y区,并在PLC程序中加互锁保护。
- 如汇川的
-
禁止HMI直接写入PLC输出线圈(Y)控制强电
- Y点直连接触器线圈时,HMI单点失效可能造成设备失控;
- 必须经PLC逻辑判断(如
Y0 = (HMI_启动 AND 安全门关闭) OR 急停复位); - HMI只发“请求信号”,不发“执行命令”。
-
禁止跨网段使用默认端口且无路由配置
- 若PLC在
192.168.2.100/24,HMI在192.168.1.101/24,未配置路由器静态路由,则ping不通,telnet必失败; - 解决方案:统一为
192.168.1.x/24,或在路由器添加192.168.2.0/24 → 192.168.1.1路由条目。
- 若PLC在
七、性能优化:百毫秒级响应的实测配置
在产线要求快速响应场景(如包装机伺服启停),需压降通信延迟:
| 优化项 | 默认值 | 推荐值 | 效果 |
|---|---|---|---|
| HMI轮询周期 | 1000 ms | 200 ms |
减少画面刷新滞后 |
| PLC响应超时 | 1000 ms | 200 ms |
避免HMI长时间等待 |
| 寄存器读取长度 | 单点 | 合并为16点/次 | 降低TCP包数量,实测总延时从85ms→32ms |
| 网络MTU | 1500 | 1492(适配PPPoE) |
防分片,提升稳定率 |
实测数据(汇川H3U + 威纶通TK6070iH,千兆工业交换机):
- 单点读取平均耗时:
23±5 ms;- 16点批量读取平均耗时:
32±7 ms;- 连续运行72小时无丢包、无超时。
八、替代方案对比:什么情况下不该用Modbus TCP
| 场景 | Modbus TCP | 更优方案 | 原因 |
|---|---|---|---|
| 多品牌设备集成(含SCADA) | 支持,但需手动映射 | OPC UA | 统一信息模型,自带安全认证、历史数据、报警订阅 |
| 高实时性运动控制(<10ms) | 不满足 | EtherCAT / PROFINET | 硬件级同步,抖动<1μs |
| 无线环境(Wi-Fi) | 易丢包、延迟抖动大 | MQTT + 边缘网关 | 报文轻量、支持QoS等级、断网缓存 |
| 远程云端监控 | 需公网IP/NAT穿透 | Modbus TCP over VPN 或 HTTP API网关 | 规避端口暴露风险 |
注:当前90%以上HMI-PLC本地通信仍首选Modbus TCP——因其零成本、零学习门槛、100%兼容。
九、最后验证:五步确认通信真正可靠
- 冷启动验证:断电重启PLC和HMI,观察30秒内是否自动恢复通信;
- 扰动测试:拔插一次网线,确认2秒内重连成功(HMI不报错、数据不跳变);
- 压力测试:HMI同时读取50个寄存器、写入10个寄存器,持续1小时无超时;
- 边界测试:读取地址
465535(D65535),确认不越界、不崩溃; - 交叉验证:用PC端Modbus Poll软件(地址
192.168.1.100:502)同步读取同一地址,比对数值是否一致。
所有测试通过,即可交付使用。

暂无评论,快来抢沙发吧!