在车间里搞了快十年自动化,从最早守着组态软件盯产线,到现在把设备数据搬到云端大屏上实时看,我最大的感受是:工业数据上云这件事,难不在技术本身,难在把现场到云端这一条链路想清楚。这篇文章就从我自己做过的项目出发,聊聊PLC数据采集上云这套完整物联网方案该怎么搭——从现场PLC侧怎么准备、边缘网关怎么选怎么配、数据走什么协议上云、云端怎么存储怎么用,一直讲到实际部署中最容易踩的那些坑。
这套内容适合谁看?如果你正在做工厂数字化改造、接手了一个“设备数据要上云”的项目,或者自己手里有几台PLC想远程监控但不知道从哪下手,那这篇文章基本能覆盖你从设计到落地的全部疑问。我尽量把每一步背后的“为什么”也讲清楚,而不是只丢给你一套配置清单。
1. 先想清楚:PLC数据为什么要上云,上云到底解决什么问题
1.1 工厂里最普遍的现状:数据出了车间就没了
大多数传统工厂现在的状态是这样的:PLC控制设备运转,组态软件(SCADA)在车间中控室画出一堆趋势图和报警条,工程师坐在中控室能看到一切。但一旦人离开厂区,这套系统基本就是失明状态——设备半夜报警了、停机了,你在家接不到任何通知,等到第二天早上到了现场才发现,一晚上的良品率已经烂透了。
还有一类更头疼的场景:集团有多个厂区,总部领导想看各厂的整体运行效率,你拿什么给他看?让每个厂都装一套组态软件然后把截图发到群里?这不叫数字化,这叫信息搬运。
PLC数据上云的核心价值,就是解决三件事:远程监控(人在哪里都能看到设备状态)、异常告警(故障主动推给你而不是等你发现)、数据沉淀(历史数据存下来给后续分析和优化用)。你把这三点拿去做方案汇报,才真正站得住脚。
1.2 上云之前的灵魂拷问:你的目标到底是什么
很多项目一上来就谈架构、谈平台、谈各种炫酷的功能,但你要先问自己一个问题:数据上云之后,谁来看这些数据,看完之后要做什么决策?这个答案直接决定你的系统该做多复杂。
举几个真实的例子。如果你只是想让老板在手机上看个设备开动率,那不需要上什么重型平台,一台网关加上基础的云服务就能搞定;但如果你要做设备的预测性维护,那就得考虑数据的采集频率、历史数据存储时长、报警模型的迭代——架构的复杂度完全不同。
我个人的建议是:项目启动前先把需求列成一张表,每条需求都标上“必须有、应该有、可以有”,然后用“必须有”去倒推架构。否则你很容易陷入“平台功能堆了一堆,现场工人根本不用”的尴尬局面。
2. 整套架构怎么分层:从车间到云端,每层该干什么
2.1 四层架构:设备层、边缘采集层、传输层、平台层
做工业物联网方案,我最推荐的分层思路是四层架构,这跟你企业规模大小没关系,关键是每一层职责单一、边界清晰,后续哪一层要换也好换。
第一层是现场设备层,就是车间里那些PLC、传感器、仪器仪表。这一层的核心是设备本身要具备通信能力,PLC要有网口或者串口接口,传感器要给到PLC或者直接给到采集终端。
第二层是边缘采集层,主要就是工业物联网网关。这一层负责把PLC里的数据读出来,做协议转换、格式整理、边缘计算、本地缓存,然后通过MQTT等协议上云。网关这层是整个架构里最容易被低估的一环,实际上它承担了绝大部分脏活累活。
第三层是网络传输层,也就是数据从工厂走到云平台所经过的链路。可以是工厂宽带、4G/5G蜂窝网络、专线。这一层要考虑的不是“能上网就行”,而是稳定性、流量成本、网络隔离。
第四层是平台应用层,就是云端的物联网平台,负责设备接入鉴权、数据存储、规则引擎、可视化展示。之前流行的说法是“云-边-端”三层架构,其实本质是一样的,只是把网络层合进了边缘或平台层。
2.2 为什么要用分层架构而不是PLC直连云
有人问过我一针见血的问题:PLC本身不就支持TCP/IP吗,直接让PLC通过网线连到云平台服务器,不就把中间那台网关省了吗?
理论上可以,但实际你根本不敢这么干。一个关键原因是安全:PLC直接暴露在公网上,任何一个端口扫描到你的PLC,就等于把你的设备控制权交给了黑客。另一个原因是协议适配:PLC侧的工业协议五花八门,有Modbus TCP、Profinet、三菱的MC协议、西门子的S7协议,而云端通信主流是MQTT,两者需要一个中间层去做翻译。
再加上PLC自身的通信资源很宝贵,你要是让PLC直接跟云端保持长连接、搞心跳、断线重连、数据缓存,它的CPU和内存会被大量消耗,直接影响控制任务的实时性。所以,网关存在的本质,是把“跟云端打交道”这件事从PLC身上剥离开。PLC只管跟网关通信,网关去处理上云的一堆破事。
3. 现场PLC侧的准备:点表、协议、程序一个都不能少
3.1 第一步永远是梳理数据点表
不管你的采集方案多高级,回到现场第一件事永远是做数据点表。点表就是你跟PLC“对话”的清单:你要读哪些数据,读出来的数据叫什么名字,数据在PLC哪个存储区域,数据类型是什么,多长时间采一次。
我做项目一般用Excel列一张表,包含这些字段:数据名称、PLC站号/模块、寄存器地址、数据类型、采集周期、读写属性、工程量范围、备注。
举个例子,一台西门子S7-1200控制的加热设备,点表大概长这样:
- 设备启停状态,地址DB1.DBX0.0,Bool类型,采集周期500ms,只读;
- 当前温度,地址DB1.DBD4,Real类型,采集周期1s,只读;
- 设定温度,地址DB1.DBD8,Real类型,采集周期1s,可写;
- 设备总运行时间,地址DB1.DBD12,Real类型,采集周期1min,只读;
- 累计产量,地址DB1.DBD16,Real类型,采集周期1min,只读。
点表最忌讳“现场随便问两句就拍脑袋”。我见过太多的返工都是因为前期点表没做干净:地址写错了、数据类型弄反了、该采集的电机电流漏掉了。做点表的时候,你最好对着设备操作手册和PLC程序逐个核对,宁可多花两天时间也不要在上线之后天天改配置。
3.2 不同品牌的PLC,通信协议怎么选
工业现场最常遇到的PLC协议,我按经验频率排序:Modbus TCP、西门子S7协议、三菱MC协议、OPC UA。
Modbus TCP是通用的工业以太网协议,几乎所有主流PLC都支持,它简单、稳定、跨品牌兼容性好。如果你现场有多个品牌的PLC混用,优先考虑它。Modbus TCP里最常用的功能码是03(读保持寄存器)和06(写单个保持寄存器),数据以寄存器为单位组织,一个寄存器16位。
S7协议是西门子PLC的专属协议,通过TSAP来寻址,可以直接访问S7-1200/1500的DB块、M区、I/O区。它比Modbus更灵活,能直接通过符号名访问,但只有西门子设备能用,而且不同固件版本之间有时候还会有小差异。
OPC UA是现在工业4.0时代最受推崇的协议,它解决了工业设备信息模型统一的问题,跨平台、面向服务架构。如果你的设备层协议五花八门并且预算充足,OPC UA是正路,但它的配置复杂度也高,得在PLC或服务器上跑OPC UA Server,网关侧做Client。
选协议的时候我有个原则:能走Modbus就走Modbus,走不了再看品牌专属协议,最后才考虑OPC UA。因为Modbus的实现最简单,出问题的概率最低,排错也最方便。下面的表格供参考:
| 协议 | 适用品牌 | 优点 | 缺点 |
|---|---|---|---|
| Modbus TCP | 几乎所有主流品牌 | 通用、轻量、排错方便 | 信息模型弱,地址要人工映射 |
| S7协议 | 西门子S7系列 | 直接访问DB块,功能强 | 品牌绑定,TSAP配置有门槛 |
| MC协议 | 三菱 | 访问三菱各系列方便 | 品牌绑定 |
| OPC UA | 多品牌通用 | 信息模型标准,安全性强 | 实现复杂,项目成本高 |
3.3 PLC程序侧要做什么配合
协议选好了,不等于网关就能把数据读出来了。你需要在PLC程序里做几件配合的事。
**第一,把需要采集的数据集中放到一块连续的存储区。**比如西门子就规划一个专门的DB块叫“DataCollect”,把所有需要上云的数据都定义在这里面。好处是网关采集的时候只要读这一个DB块的一段地址就行,效率和稳定性都大大提升。不要东一个M区地址西一个DB地址,地址表写得贼长,网关采集起来效率低且容易出错。
**第二,增加一个“心跳”信号。**在PLC程序里写一个定时器,每秒钟翻转一次某个Bool量的值。网关通过判断这个心跳量是否在变化,就能确认PLC程序是否正常运行。如果设备停机了、程序没跑,心跳不动了,那这本身就是一条很有价值的报警。
**第三,预留一个“数据有效”标记。**比如设备处于手动模式、正在检修模式时,采集上来的数据可能是无意义的,甚至可能误导云端分析。那么PLC程序里应该有个标志位告诉网关:当前数据是否有效。网关看到无效标记,就不上传或者打上标签。
**第四,别忘了远程写控制的权限边界。**如果方案里包含从云端远程修改参数的需求,PLC侧一定要做权限校验、范围限制,比如设定温度只能写在合理区间内,防止有人在云端手滑把1000度写进去了,现场设备直接出安全事故。
4. 边缘网关这层:它的选型、配置和那些不为人知的作用
4.1 网关选型看什么:硬件参数不是越多越好
边缘网关是整套方案里我花时间最多的地方。买网关不是买参数,而是买个“匹配你项目场景”的工具。
先看核心参数:
- 通信接口:现场PLC走以太网还是串口?至少需要几个网口?有没有需要用RS485接仪表?一般建议至少双网口,一个接车间设备,一个接上层网络,实现物理隔离。
- 协议支持:这个决定了能不能对接你的PLC。选网关前一定要确认它支持你PLC的协议,比如西门子S7-1200要用S7协议,网关就得原生支持而不是靠什么蹩脚的脚本。
- 边缘计算能力:你要在网关侧做数据预处理(比如滤波、越限判断、数据过滤)的话,CPU算力和内存得够用。注意,很多廉价网关说的是“支持边缘计算”,实际上只能跑点简单的表达式,复杂的脚本处理能力很弱。
- 断网缓存能力:工厂网络难免会断,网关得能本地缓存数据,网络恢复后自动补传。这个功能太重要了,否则断网就是数据黑洞。
- 宽温和可靠性:车间环境不比办公室,夏天四五十度甚至更高,网关必须能扛住,最好选无风扇散热、工业级宽温产品(-40到70摄氏度是基本线)。
4.2 网关配置实操:从建连接到点位映射的完整流程
网关到手后,一般来说配置分这么几步。不同品牌界面有差异,但逻辑是通用的。
**第一步,添加设备连接。**这一步是告诉网关,要跟哪个PLC通信。你需要填PLC的IP地址、端口、通信协议类型。比如西门子S7-1200,协议选S7,IP填192.168.1.10,端口默认102。填完之后先用网关的调试工具做一次连接测试,确认能读到数据再继续。
第二步,配置点位映射。把你在点表里列好的每条数据,一个个配进网关。这里要小心的是地址格式,每个网关的地址写法不一样,一定要先搞清楚。比如Modbus寄存器地址,有的网关写40001(对应Modbus协议里的0000地址,偏置1),有的直接写0。差一个偏置,读出来的数据就是对不上的。
**第三步,设置采集周期和上报策略。**采集周期是网关从PLC读数的时间间隔,上报周期是网关把数据推到云端的间隔。这两个千万别理解成一个东西。工艺数据比如温度,采集周期1秒、变化不大可以5秒上报;设备状态、报警信号这类,最好变化就立即上报——很多网关支持“数据变化时上报”模式。
**第四步,配置上云通道。**填云平台地址(MQTT Broker地址)、客户端ID、账号密码或者证书、上报的Topic、JSON数据格式。这些配置项在不同网关里叫法天差地别,有的是“MQTT设置”,有的是“MQTT配置”,你只要抓住本质:它就是一个MQTT客户端配置。
4.3 网关侧到底该不该做边缘计算
关于边缘计算,我的态度是:不要为了“边缘计算”而边缘计算,但该算的一定要放到边缘。
该放到边缘做的,有这么几类:
- 数据有效性判断:PLC数据明明无效还往云端推,占用带宽还误导分析,直接在网关侧根据有效性标记过滤掉。
- 简单的阈值告警:温度超过80度直接在网关侧判断并推送报警,不用把原始值传到云端再绕一圈——快,而且在断网时依然有效。
- 数据压缩与聚合:能耗数据计算5分钟平均、15分钟平均,这完全可以网关侧算好再上报,云端只要存结果就行。
但是像设备故障预测、复杂的机器学习模型这类需要大算力的,就该放云端,边缘网关塞不下也跑不快。记住一个原则:边缘做实时、轻量的决策,云端做离线、复杂的分析。
5. 数据上云通道:MQTT协议、数据格式与物联网平台对接
5.1 为什么工业上云普遍选MQTT而不是HTTP
工业设备数据上云最常见的协议,毫无疑问是MQTT。为什么不用大家最熟悉的HTTP?
原因在于MQTT是为“机器对机器”通信量身定做的。HTTP是请求-响应模式,设备主动请求,服务器被动响应,每次通信都有大量HTTP头开销,还要求设备端跟服务器建立复杂的会话管理。MQTT是发布/订阅模式,设备作为客户端把数据发布到某个主题(Topic),云端服务通过订阅该主题实时接收。MQTT的数据包非常小,头开销极低,很适合网络不稳定、带宽受限的工业环境。
MQTT还有一个核心特性是QoS(服务质量),分三个等级:QoS0最多发一次,丢了不管;QoS1至少发一次,可能重复;QoS2只发一次,保证不重不漏。工业场景里不能用QoS0(丢数据),也不建议直接用QoS2(慢、开销高),我一般用QoS1,配合数据里的时间戳去重。
另外MQTT有着心跳保活机制(Keep Alive),客户端和服务器之间按设定时间间隔发送心跳报文,如果服务器超过一定时间没收到心跳,就判定设备离线。这个机制用来做设备在线状态监测非常方便。
5.2 Topic和JSON数据格式要提前设计好
Topi的设计决定了后续数据管理是否清晰。我推荐用“层级式”主题名,格式如:
工厂/车间/设备类型/设备编码/数据类型比如:
factory/shenyang/plant1/heating_eq/01/data factory/shenyang/plant1/heating_eq/01/status factory/shenyang/plant1/heating_eq/01/alarm把数据、状态、报警拆成三个独立的Topic分支,好处是云端可以分别订阅、按不同频率处理。数据量大但实时性要求不高,报警量小但要即时响应,混在一个Topic里会让消费逻辑很别扭。
数据内容现在主流的做法是统一JSON格式,网关侧把采集到的点位组装成一个JSON对象再发送。例子:
{ "ts": 1712880000000, "deviceId": "HT-EQ-001", "values": { "running": true, "temp": 67.5, "temp_set": 70.0, "runtime_total": 13245.6 } }这里的ts是设备侧的毫秒时间戳,一定不要用云端接收时间代替。因为一旦网络波动导致上报延迟,你拿云端接收时间当数据时间,分析出来的曲线就是乱的。这是很多人没注意的细节。
5.3 物联网平台选型:大云厂商平台还是自己搭
数据上了云,总得有个地方收。现在主流选择无非两类:大厂云物联网平台和开源私有化部署的物联网平台。
大厂平台(比如阿里云物联网平台、华为云IoT、腾讯云IoT)的优势是稳定省心:设备接入门槛低,MQTT接入地址给你配好,设备管理、规则引擎、数据存储、图表都是现成的。适合不想在平台维护上投入太多精力的团队。缺点是数据都在别人平台上,长期费用随着设备数和消息量上涨,而且数据出平台要做导出,比较麻烦。
开源私有化部署平台(比如EMQX这类MQTT消息中间件,配合TDengine或InfluxDB时序数据库,再加上Node-RED或自定义服务),适合对数据主权要求高、团队有一定开发能力的场景。隐私性、灵活性好,但你要能扛住运维压力。
我的建议排序是:中小项目优先用云厂商托管平台,省时省力;对数据敏感的大型制造企业,优先私有化部署。另外不管选哪种,设备接入认证一定要开,别裸奔。
6. 云端数据存储、监控大屏与告警的落地
6.1 为什么时序数据库比MySQL更适合存设备数据
设备上云之后,数据存储是个容易被忽略但实际很关键的问题。很多人一开始用MySQL存数据,跑不到一个月就发现:表越来越大,写入越来越慢,查询越来越卡。
问题出在数据类型不匹配。设备数据是典型的时间序列数据——每一条都带着时间戳,持续不断产生,写入频率高,很少更新。MySQL是关系型数据库,为事务而设计,每一行插入都要维护索引和事务日志,扛不住每台设备每秒一条的高频写入。
这种情况下要上时序数据库,比如InfluxDB、TDengine、TimescaleDB。时序数据库的核心优势就是吃“时间序列”这种写入模式:单机吞吐量可以轻松达到每秒几十万甚至上百万条写入,查询按时间窗口聚合也非常高效。还有一个实用特性是数据生命周期管理(TTL),比如设定原始数据保存90天、5分钟聚合数据保存1年,到期自动清理,磁盘空间可控。
6.2 监控大屏、组态画面和报警推送怎么建
存储解决了,接着就是给大家看到数据。监控可视化有两条路。
一条是用云平台自带的可视化搞定,比如大厂的IoT平台可以配置图表模板、3D模型,适合快速搭建、简单的看板;另一条是开发自定义监控应用,后端从时序数据库查询数据然后通过接口把数据交给前端,大屏展示设备状态、实时曲线、OEE、能耗等。
报警这块是我每次项目都提醒“别做太多”的地方。**报警不在多,在于准确。**很多项目上线第一天就把它整成了“报警轰炸”,钉钉消息每分钟弹一条,三天后所有人群都免打扰了,真正的故障消息也被沉掉了。把报警设置成“越限报警+持续确认门限+恢复通知”的组合,避免信号抖动导致反复告警。
7. 安全设计:不让设备成为工厂网络的突破口
7.1 边缘网关的核心安全价值:隔离
回到之前说的“为什么不能用PLC直连云”,最关键的理由就是安全。PLC如果直接接入公网,它没有防火墙能力,一个开放端口等于给攻击者递了钥匙。
正确做法是把安全性落在网关这层,让PLC永远不直接面对公网。网关和PLC在车间内部局域网通信,网关作为唯一出口上云,PLC的IP地址只在车间内可见。这样就算网关被突破,攻击面也只是网关本身,不会直接打到PLC。
7.2 设备接入云端的认证与加密实践
网关上云通信,一定要启用TLS加密和身份认证。MQTT over TLS是基本配置,保证数据在传输过程中不被窃听和篡改。身份认证上,主流物联网平台支持一机一密、证书认证等方式。工业项目我推荐一机一密:每台网关有独立的设备密钥,密钥泄露就禁用该设备,不影响其他设备。
还有一点容易被忽略:云平台账户和设备的权限分离。别用管理员账户给所有应用配权限,该只读的只读,该控制的才给控制权限。云上操作记录要有审计日志,防止误操作和恶意操作。
7.3 工控安全的一些基本功
不要把密码设成123456和admin这种,默认密码必须改,这已经是老生常谈了,但实现中总有人不当回事。还有一点是边界防护:车间网络和办公网络建议做访问控制隔离,网关上云的网络出口走独立的通道。工厂内部可以定期检查是否有异常设备接入车间网络。
8. 常见问题与排查技巧实录:那些现场踩过的坑
8.1 网关连接不上PLC,怎么排查
这个问题的检查顺序我建议是:IP能不能Ping通 → 端口通不通 → 协议参数对不对 → 地址映射对不对 → 权限/防火墙有没有拦。
先确认物理链路通不通。很多项目出问题其实是IP冲突,车间设备多,PLC的IP地址跟别的机器撞了,时通时断。所以配好PLC之后,一定要执行一个Ping测试,然后看看车间网络里有没有同类地址的设备。
协议参数这块,西门子S7-1200/1500要特别注意“允许从远程伙伴(PLC/HMI/OPC UA)通信”的复选框有没有打勾。这个设置默认可能不同,很多数据读不出来就是这里卡住了。
8.2 PLC数据有时有、有时没有,报错还不清楚
一种典型情况是采集到了PLC的数据,但偶尔连不上。最常被忽略的原因是:西门子PLC的S7通信有连接数限制——S7-1200最多支持32个连接(不同固件版本有差异),S7-1500要多一些。如果现场你同时开着TIA博途在线监控、还有HMI和上位机软件,每个都在抢占连接资源,网关的连接就被挤掉了。解决办法是规划好通信连接数,给网关留固定通道。
另一种常见问题是读出来的数据数值不对,翻了好几倍。比如你读到的温度是675,但实际应该是67.5。这种通常是数据类型定义错了。PLC里是Real(4字节浮点数),你在网关里配成了DWord整数,字节序对不上,数值自然不对。排查方法是先用网关自带的调试工具实时查看原始寄存器值,对照点表逐一核对。
8.3 数据上报到云平台延迟高
如果从PLC采集到云端曲线显示,延迟超过10秒。先排除网关采集周期设置得太大,再看网络链路。工厂网络出口带宽被占用是常见凶手,尤其白天上班时大家都在上网,你可以测一下云平台的MQTT服务器连通性、丢包率。
如果网络正常,问题可能出在平台侧消息处理链路,比如用规则引擎转发到存储或告警时排队滞后。
8.4 所有设备数据全上报会把平台刷爆
这是非常典型的设计失误。我有一次帮客户排查,发现他们5台设备的数据把云平台API调用配额1个小时就跑满了。原因就是网关把所有点位全量按1秒周期上报,其中包括大量几乎没有变化的开关状态。
这个问题的解法在网关侧的上报策略:对缓慢变化的数据(温度、液位、压力)用周期性上报加死区判断——变化超过死区门槛才上报;对开关量、报警信号用变化触发上报;对累计量用固定周期上报并做增量计算。这样消息量能减少80%以上,平台费用也顺带降下来。
8.5 云端时间跟设备时间对不上
有时候你看趋势图,明明现场是上午10点发生的数据,云端显示的却是10点3分,整整偏移了3分钟。这通常是因为网关或PLC没有做时间同步。PLC和网关的系统时间必须靠谱,否则你所有的时间戳分析都是错的。网关一般支持NTP时间同步,配置里一定要设置NTP服务器地址并开启周期同步。如果是断网环境,则要确保网关RTC电池正常,或从外部同步模块获取时间。
9. 项目落地的最后几句经验
以我个人的经验,做PLC数据采集上云项目,最容易成功的路径不是上来就大干快上,而是先小范围打通一条完整链路,再逐步扩展。选一台设备、一台网关、一个云平台,把点表、采集、上报、存储、看板、报警全部跑通,确认每一步的数据都对得上,再往更多设备上铺开。这样带宽、点位、成本都在可控范围内,出问题也容易定位。
另外,我手头最重要的一件事永远是点表先行,而且要让工艺、设备、电气、IT四方坐在一起把点表确认清楚。数据定义清晰了,后续的协议、网关、云端逻辑都是顺水推舟的事。最后再叮嘱一句:施工文档、配置备份、密码台账这些看似不起眼的东西,在项目维护期会救你无数次。这行的价值不在一时的上线,而在设备稳定运转每一天背后的链路畅通。