以下是对您提供的博文内容进行深度润色与专业重构后的技术文章。全文已彻底去除AI生成痕迹,采用真实工程师口吻写作,逻辑更连贯、语言更精炼、教学性更强,并强化了实操细节、常见坑点与工程经验总结。结构上打破传统“引言-正文-总结”模板,以问题驱动+场景切入,层层递进,自然过渡,符合一线开发者阅读习惯。
用OpenPLC搭一套能真干活的HMI系统:从Modbus通信配置到界面联动的完整闭环
你有没有遇到过这样的场景?
在实训课上,学生刚写完一个PID温控程序,却卡在“怎么让按钮在屏幕上动起来”;
在产线改造项目里,客户指着旧设备说:“能不能别换PLC,只加个触摸屏看数据?”;
或者你自己折腾了一下午Raspberry Pi + OpenPLC,HMI死活连不上——Wireshark抓包看到TCP三次握手成功,但Modbus请求发出去就石沉大海……
这不是配置错了,而是你还没真正摸清OpenPLC和HMI之间那条“看不见的数据通道”是怎么建起来的。
今天这篇文章,不讲概念、不列文档、不堆术语。我们就以一个可立即复现的小型恒温箱控制系统为蓝本,手把手带你打通OpenPLC与HMI集成的全部关键节点:
✅ Modbus TCP服务到底监听在哪?为什么改了端口还是连不上?
✅%MW100怎么变成 HMI 里的40001?REAL类型为何必须占两个寄存器?
✅ Ignition里点一下按钮,OpenPLC真的收到了吗?如何确认不是“假动作”?
✅ 网络一抖就断连?温度显示跳变?这些“小毛病”背后藏着哪些底层机制?
整篇文章,就是一次真实的调试笔记。
一、先让OpenPLC“被看见”:Modbus TCP服务不是开箱即用
很多新手第一步就栽在这里:启动OpenPLC后,在HMI里填好IP和502端口,点击连接——失败。
别急着怀疑网线。先问自己三个问题:
OpenPLC真的在监听502端口吗?
默认是,但前提是它没被其他进程抢占。Windows上Hyper-V虚拟交换机、某些杀毒软件、甚至Docker Desktop都会悄悄霸占502。执行这条命令验证:bash netstat -ano | findstr :502
如果看到LISTENING且PID不是你启动的python.exe,那就得换端口或干掉冲突进程。防火墙放行了吗?
Linux(树莓派)执行:bash sudo ufw status verbose # 查看ufw状态 sudo ufw allow 502 # 若未开放,补上这一句
Windows则要进“高级安全防火墙”→入站规则→新建规则→端口→TCP 502。Docker容器里跑OpenPLC,宿主机能访问吗?
必须显式映射端口:bash docker run -d --name openplc \ -p 8080:8080 -p 502:502 \ # 关键!502也要映射 -v /path/to/config:/openplc/config \ openplcproject/openplc:v3.7
🔍调试技巧:用
telnet 192.168.1.100 502测试基础TCP连通性。能连上说明网络层OK;连不上,问题一定出在网络或防火墙,跟Modbus协议无关。
再来看OpenPLC内部的服务初始化逻辑(core/modbus_server.py):
modbus_server = ModbusServer( host='0.0.0.0', # 注意!不是'127.0