产线数据上云实践:从PLC数据采集到Web监控与小程序点检
设备数据采集不上来、PLC坏了要等厂商、质检报表全靠人工抄——这类场景在中小型制造企业里太常见了。我做过一段时间工业自动化相关的软件开发,后来慢慢把业务面扩展到互联网程序开发和方案策划,中间踩过不少坑。这篇文章就围着一次完整的“产线数据上云+Web监控+小程序端点检”项目复盘来写,既是自动化项目,也是软件项目,更是一个需要懂网络协议、懂编程、懂文档和翻译的综合性项目。如果你正从传统PLC编程往工业互联网方向转,或者不清楚“自动化、软件、互联网”这几个词在一个项目里到底怎么拧成一股绳,这篇文章值得看完。
1. 这个项目到底要解决什么问题:设备联网与数据孤岛的真实现状
1.1 改造前车间里的真实场景
接手这个项目之前,客户车间里有32台注塑机、6条组装线、4台空压机。设备品牌很杂,有三菱、西门子、台达、还有几台国产小牌子。整个车间只有两台工控机装了厂家自带的上位机软件,其他设备的生产数据全部靠操作工每天下班前手写记录。主管想看当天的产量和合格率,得让统计员加班把纸质报表重新录进Excel。
这种“设备数据孤岛”状态在制造企业里不是个例。设备各自为政,能联网的也没接,不能联网的就更不用提。老板知道要数字化,但真正问起“你想用数据做什么”,得到的回答往往是“先能看就行,别让我总跑车间”。这个诉求听起来简单,实操起来涉及的问题一点不少:设备通讯协议怎么兼容、历史数据存哪里、现场网络怎么规划、未来要不要接ERP/MES、操作工文化水平有限怎么设计界面。这些问题横跨自动化、软件、互联网三个领域,恰好就是标题里要聊的核心。
1.2 为什么“装个软件”解决不了工业数据问题
很多企业第一反应是“买个MES”或者“找个软件公司来装系统”。但真正进场勘察后会发现问题没那么简单。MES系统负责的是生产执行层面的管理,它需要底层数据,而底层数据来自PLC、传感器、变频器,这些属于自动化范畴。自动化工程师懂PLC,但不太熟悉Web开发、数据库和网络安全性设计;纯软件工程师会写程序,但跟不上Modbus寄存器、OPC UA节点、脉冲计数的现场逻辑。
这个gap是项目里最大的隐性成本。软件公司报价低,进场之后发现设备协议不开放,要加协议转换网关,预算翻倍;自动化公司报价实在,但做出来的上位机软件还是C/S架构的单机版,换一台电脑就没法用,更别提手机端看数据。所以后来我给自己定了个原则:做工业软件,先把“自动化到底提供了什么数据、软件到底要消费什么数据、互联网到底怎么把数据安全地传到该去的地方”这三件事想清楚,再动工也不迟。
1.3 需求拆解:把自动化、软件、互联网三个方向拧成一条线
这次项目的需求梳理花了整整一周。我把客户提出的每一条要求拆成三类:
- 自动化侧需求:设备PLC点位表整理、Modbus地址映射、老旧设备加装传感器与采集模块、空压机通过RS485总线读取运行参数。
- 软件侧需求:实时数据采集服务、历史数据库存储、Web端可视化看板、用户权限管理、生产报表自动生成。
- 互联网侧需求:厂区局域网与云服务器之间的数据安全传输、设备远程运维、微信小程序端点检打卡与报警推送、多工厂数据汇聚。
拆完之后发现,客户真正想要的其实不是一个软件,而是一套“从设备到手机端”的数据通道。这也决定了我们后面对技术选型和架构设计的思路——一切围绕数据流来,不搞花架子。
2. 总体架构与技术选型:从PLC传感器到手机端的完整链路怎么做
2.1 数据采集层:Modbus RTU/TCP 与 OPC UA 的取舍
数据采集是整个项目的地基。设备品牌杂,通讯协议就必须统一。实操下来90%的设备都支持Modbus,剩下的西门子S7系列走的是Profinet/S7comm,需要用OPC UA或者S7协议转换。我建议新手别一上来就追求“万协议归一”,先摸清现场设备清单再定采集方案。
这次项目里我们采用了“边缘网关+软件解析”的混合方式:能走Modbus RTU的就用工业串口服务器转成Modbus TCP,能走Modbus TCP的直接网线接入;西门子S7-1200用S7协议读取;还有两台老式继电器设备完全没有通讯接口,最后加装了带RS485输出的电表和传感器。
对采集频率也要有清醒认识。很多需求文档里写“实时监控”,但实际业务并不需要毫秒级。我们最后统一采样周期:运行状态2秒采集一次,能耗数据15秒采集一次,产量计数走PLC内部累计寄存器,每5秒读一次增量。这样对网络和数据库的压力都小很多,也不影响监控效果。工业数据采集最忌讳的事就是不管业务实际,把采样周期都设成500ms,最后设备没累死,数据库先崩溃了。
2.2 边缘网关与数据上云:MQTT协议为什么是工业现场的最佳选项
采集上来的数据不能全裸着往云上发。传统做法是写个Windows服务直接连数据库,但这个方案有两个问题:一是WAN环境不稳定,断线后数据容易丢;二是安全性堪忧,把数据库端口暴露到公网等于开门揖盗。
我们最终定的链路是:采集服务写到本地时序数据库(用InfluxDB 2.x),边缘网关通过MQTT协议把聚合后的数据发布到云服务器。MQTT和工业现场的气质非常匹配,它是发布/订阅模式,QoS能保证消息不丢,占用的带宽很小,适合厂里那种不太稳定的宽带环境。我们选了EMQX作为云侧Broker,设备侧上报的主题命名规则是factory/line01/machine003/status,按厂区-产线-设备三级建模,后续接MES甚至集团级的大屏展示都能直接复用这套主题。
| 对比项 | Modbus TCP直连云服务器 | HTTP接口轮询 | MQTT消息上云 |
|---|---|---|---|
| 实时性 | 好 | 一般 | 好 |
| 断线补偿 | 需要自研 | 需要自研 | QoS+离线消息 |
| 安全性 | 差,端口易暴露 | 可配HTTPS | 双向TLS证书 |
| 工业设备适配性 | 强 | 弱 | 较强 |
| 运营维护成本 | 高 | 中 | 低 |
用MQTT还有一个额外的好处:移动端小程序不需要直接访问现场设备,只需要订阅云端的主题,这对现场网络安全是极大的保护。以前做远程监控都是搞端口映射,设备直接暴露在公网,现在全部变成单向出站的上报,就算被攻击也只是边缘网关本身,PLC网段和办公网完全隔离。
2.3 云端平台与前端展示:Web端加大屏的组合
云端平台我们选了主流的Spring Boot + Vue 3,数据库用了PostgreSQL存业务数据,InfluxDB存时序数据。Web端做成响应式布局,既能投车间大屏,也能在办公电脑上正常用。因为客户有“在手机上看看数据”的需求,还做了一个基于uni-app的小程序端,功能没那么全,主要承担设备台账、点检记录、报警通知这三类高频操作。
这里说一句实话:小程序端和Web端如果共享一套后端,开发效率提升是很明显的。小程序端不能直接嵌网页就完事,必须考虑微信登录、手机号绑定这些细节,但核心的查询接口和Web端是完全一致的。我们后端的接口设计从一开始就按RESTful规范来做,天然兼容两端的调用。
3. 核心程序开发实操:采集服务、双机热备与数据库同步的落地细节
3.1 基于Python的采集服务如何做到可配置
采集服务是整个软件系统里技术含量比较隐藏、但后期维护价值最高的一块。我用的是Python 3.10 + asyncio + pymodbus,为什么选Python?因为Libmodbus生态好,写点小工具脚本方便,第三方库也能快速解决Modbus、OPC UA、MQTT的开发问题。
关键设计是“配置化驱动”:每一种设备类型对应一个JSON配置文件,里面写好设备IP、端口、寄存器地址映射、字节序、数据类型。这样新增一台设备,只需要改配置不需要改代码。比如下面这段设备配置,就是注塑机温控器的读取定义:
采集主循环的逻辑很简单:按配置周期读取寄存器,校验CRC,转成JSON对象,然后推到内存队列里。另外一个独立任务负责消费队列,把数据批量写入InfluxDB,同时判断有没有超过报警阈值,触发报警就通过MQTT发一条消息。这样采集和存储解耦,就算数据库临时挂了,内存队列能缓冲一部分数据,不至于立刻丢失。
3.2 双机热备与数据库同步:工业现场对“不能丢数据”的真实要求
客户在项目中期提出了一个需求:现场工控机如果死机,数据不能中断超过5分钟;两台服务器之间要能自动切换。这就是典型的双机热备需求。我评估了一圈商业双机热备软件,价格贵、绑定性强,最后决定用开源方案自己搭。
两台服务器分别是A机和B机,运行同样的采集服务,但只有A机作为主节点向外提供服务,B机处于备用状态,通过Keepalived虚拟出一个VIP。正常情况下客户端连接的是VIP,数据都写入本机的InfluxDB。A机出现故障后,Keepalived检测心跳超时,B机自动绑定VIP,采集服务随之切换,数据库里缺失的记录由从A机同步过来的增量补齐。
这里最麻烦的是数据同步。InfluxDB自带集群版收费,开源的InfluxDB单机不支持主主复制。我的方案是“双写+回补”:A机正常工作时,采集服务同时向A机和B机的InfluxDB写数据;B机在备用状态下也一直在接收写入,所以数据基本是实时的。万一A机挂了,B机接管后,从A机最后的心跳时间点开始,通过读取A机导出的WAL文件做一次回补,保证数据连续性。
表面看双写浪费了一点性能,但换来了切换时的无感体验。实际验证过,A机断电后大约8秒,B机完成VIP接管,采集服务自动续上,Web端无感知。还有一点要提醒:不要把双机热备和数据库集群混为一谈。如果业务数据量巨大,该上分布式时序数据库还是要上;我们这里单机几万点位的数据量,双写完全够用。
3.3 Web看板和小程序端的功能实现
Web端核心是几个大屏看板组件:产线总览、设备状态矩阵、能耗趋势、产量排行、报警列表。Vue 3 + ECharts这套组合做工业看板很顺手,ECharts的实时动态曲线、仪表盘组件开箱即用。数据接入就用WebSocket,后端把最新的点位数据推给前端,避免页面轮询。
小程序端的点检功能是客户非常看重的点。实际操作中,每个班次结束后,操作工要打开小程序,对注塑机做例行点检,填写润滑油位、温度异常、异响情况,并拍照片上传。小程序端用uni-app开发,照片上传走云存储,点检记录落库到PostgreSQL。为了减少操作工的学习成本,我把点检表单固定成一套模板,端上先缓存,等有Wi-Fi时再自动同步,这样车间信号差也不影响使用。
程序开发环节有一个比较容易忽略的点:工业软件必须考虑断网时的表现。Web端如果数据库查询超时,要给出明确的“数据加载失败,网络不稳定”提示,不能白屏或卡死。采集服务也要有自动重连机制,所有外呼的接口调用都要设置超时时间,不然一个设备网络假死,整个采集进程会被卡住。我们最后在采集服务里加了一个看门狗线程,每30秒检查一次所有任务是否还在正常调度,发现卡死就自动重启对应协程。
4. 项目管理里的“杂活”同样决定成败:方案策划、技术文档与翻译
4.1 方案策划:从售前交流到实施方案落地的文档体系
做工业联网项目,花在文档上的时间往往比写代码还多。客户招标需要方案,进场需要实施方案,验收需要竣工文档。我个人的习惯是把方案文档拆成四个层级:
- 现状调研报告:设备清单、网络拓扑、点位表、业务流程。
- 总体架构方案:面向客户决策层,多画架构图,少写技术术语,重点讲清楚“花了钱能解决什么问题”。
- 详细设计文档:面向开发团队,包含数据库表结构、接口定义、通讯协议映射、异常处理策略。
- 运维手册:面向客户设备科,写清楚日常维护、常见故障处理、如何新增设备点位。
写方案的技巧在于“把技术问题翻译成管理语言”。客户不关心你用了MQTT还是CoAP,他关心数据能不能帮我减少停线时间、能耗能不能降、报表能不能自动生成。所以方案里我通常先用2页纸讲痛点,再用1页纸给架构总览,最后才铺开功能清单和技术细节。
4.2 技术文案与翻译:中英文界面对接的常见坑
这个项目里有一段英文对接需求:总部在德国,需要定期把设备OEE、MTTR、产能等核心KPI同步给总部的信息系统。技术文档、接口说明、报警邮件模板都需要中英双语。做翻译的时候最怕就是直接机翻“产量”“停机时间”这些词。比较稳妥的做法是先建一份术语表,和客户确认每个关键术语的标准译法,再基于术语表去翻译整篇文档,避免同一份文档里“产量”有时候叫Output,有时候叫Production Count。
| 中文术语 | 推荐英文译法 | 不推荐译法 |
|---|---|---|
| 产量 | Production Count | Output Value |
| 设备综合效率 | OEE (Overall Equipment Effectiveness) | Machine Efficiency |
| 停机时间 | Downtime | Stopping Time |
| 点检 | Routine Check | Spot Check |
| 报警复位 | Alarm Reset | Alarm Cancel |
文档和翻译这块还有一个实用建议:技术文档尽量用中英双语对照排版,左边中文右边英文,方便后续维护和跨国团队沟通。不要嫌麻烦,等到对接第三方系统时,这套双语文档能省无数个沟通群里的追问。
4.3 软件著作权申请与代码规范:被忽略的交付质量
做工业软件项目,版权归属和技术资料完整性经常被忽略。这次项目我们在开发早期就明确了知识产权条款:客户定制部分的代码归客户所有,通用组件库代码归我们保留。还帮客户申请了一个软件著作权——设备数据采集监控管理系统V1.0。申请软著需要源码和用户手册的特定文档格式,代码量不要求全量,但前30页和后30页必须排好版,源文件是PDF导出。如果代码量不足60页,需要把字体调大、行距拉开到合乎要求的密度,这也是实操中比较常见的做法。
代码规范同样重要。工业现场的设备类型会不断增加,代码写得不规范,三个月后自己都看不懂。我要求在采集服务里统一使用类型注解,统一日志格式,统一错误码规范。比如说所有采集异常都抛出DeviceReadError(address, register, error_code),上层集中处理并产生报警事件,而不是到处写一堆裸的except Exception。这套规范在后续接到MES对接需求时帮了大忙,新同事看代码几天就能上手。
5. 现场实施中的高频踩坑与排查思路:网络、设备、兼容性的真实战场
5.1 网络通但数据不通:端口、防火墙、NAT的完整排查链路
项目上线第一周就遇到一个玄学问题:设备Ping得通,但Modbus TCP测试工具读取寄存器超时。那台设备换到测试台又是好的,接到车间网口就不行。我还是按老一套排查链路来走:
- Ping设备IP,确认二层网络通。
- telnet IP 502,确认TCP端口能不能连上。
- 用Wireshark在交换机的镜像口抓包,看Modbus请求是否到达设备、设备是否有响应。
- 抓包发现设备确实回了响应,但回到采集电脑时已经被丢弃,怀疑交换机里有VLAN隔离策略。
- 最后排查到是车间网络管理员给办公网和生产网设置了ACL,只放行特定IP段的特定端口,Modbus的502端口不在白名单里。
这类问题的排查思路对做工业互联网的程序员来说很重要。看到“网络通”不能直接认定没问题,要分层次验证:链路层、网络层、传输层、应用层一层层剥开。后来我们把这种思路整理成了标准排查文档,遇到新设备数据结构异常时也按此流程走,效率提升明显。
5.2 数据时漂与精度问题:采样周期、时间戳与断点续传设计
还有一个容易坑人的问题:数据时漂。采集服务每2秒读一次产量寄存器,按设想每分钟应该采集到30个点。但实际InfluxDB里查出来经常是28个点或31个点,而且时间戳并不是严格均匀的。原因一是PLC的扫描周期与采集周期存在竞争,二是网络抖动导致某些读请求超时重触发。
对于工业数据分析,这个“非均匀采样”问题如果不处理,后续算OEE、算节拍都会出错。我的处理方式是:写入InfluxDB时,时间戳一律用设备时间而不是服务器接收时间;报表统计时使用插值函数,把非均匀序列规整到标准周期序列;关键产量数据不做平均,只用累计寄存器差值计算,避免误差累计。
断点续传也是大数据量场景的刚需。边缘网关到云服务器的链路偶尔会断,MQTT虽然支持QoS,但如果断网时间较长,离线消息堆积也会出问题。我们设计了一个本地消息落盘机制:采集服务把需要上云的增量数据先写一份到SQLite,确认云端收到后再标记清除;断网恢复后自动把未确认的历史消息按时间顺序补传。实践下来这套机制比单纯依赖MQTT的离线消息更可靠,数据不丢是工业项目的底线。
5.3 老设备改造兼容性:没有网口的PLC如何处理
这次项目里最累的部分不是写代码,而是处理一台2005年产的老式注塑机。这台设备没有网口,也没有任何通讯模块,就只剩一个串口。我们一开始想加一个RS485转以太网模块,结果装上去发现通信协议是非标准的,厂家已经倒闭,资料也找不到。
最后没办法,只能上最笨的办法:在设备的运行指示灯上并联了一个小型继电器,继电器输出接工业I/O采集模块,通过统计继电器的通断次数来估算产量。这个方案精度不高,但客户能接受,胜在稳定可靠。
我想说的是,做工业软件不能只抱着高大上的架构图不放,现场总会有一些“脏活”需要处理。套用一句老话:工业互联网的价值不光是上云和大屏,更在于把原本沉默的旧设备用最低成本接入数据体系。哪怕只采集到一个开关量,也比完全没有数据强。
6. 项目上线之后的几个经验沉淀
整个项目从开工到验收花了四个月,上线运行到现在快一年了。设备在线率稳定在99.5%以上,月报自动生成的能力让统计员从三天工作量减到半小时。后续客户又提了能耗优化、备件预警、设备寿命预测这几个方向,说明数据采集做扎实之后,往上做算法和智能应用是顺理成章的事。
如果让我总结一下这个项目里最值得记住的经验,大概是这几条:
- 先摸清设备再谈架构:设备通讯协议、点表、网络拓扑这些基础数据没搞清楚之前,任何架构设计都是空中楼阁。
- 边缘侧做减法,云端侧做加法:设备侧只做采集和必要预处理,把复杂计算留在云端,避免给工控机增加太多负担。
- 数据质量比数据量更重要:时间戳规范、字节序统一、断点续传是工业数据项目的地基,这些不做扎实,后面所有数据分析都是白搭。
- 文档和方案不是杂活:优秀的方案策划和双语技术文档,是项目能否签约、能否顺利验收的关键一环,甚至比代码本身更能影响客户满意度。
我个人的体会是,现在做工业自动化的工程师,如果能在软件、互联网、程序开发、方案策划和外语文档这些方向上适当拓展,职业空间会宽很多。纯粹的自动化已经很难覆盖客户对数据打通、远程运维、多终端协同的全部诉求了,软硬结合、多技能叠加,才是这类项目真正需要的核心能力。希望这篇复盘能给你一些参考,下次遇到设备数据上云的项目时,少踩几个坑。