最近一直被同一个问题刷屏:车间里装了一大堆 PLC、传感器,能不能用手机随时看数据?答案是能,而且有一条从零到一跑通一个最小系统只需要一两天的路径。这篇文章就针对“PLC 传感器怎么快速对接手机 APP,实现无线监控”这个话题,把我自己实际踩过一遍的链路、选型逻辑、参数换算和排错方法完整捋一遍。
这个问题的本质不是单一的软件开发,而是把四段链路串起来:传感器与 PLC 的数据采集、PLC 数据的联网上行、云端或中转侧的协议适配、手机端 APP 的数据展示与告警。每一段都有成熟方案,难的是把它们拼在一起时暴露出来的细节坑。无论你是设备厂商、工厂运维,还是刚接触工业物联网的开发者,这篇文章的目标是让你少走弯路,几天内跑通属于自己的无线监控系统。
1. 先分清底层问题:从传感器到手机,链路有四段
很多人在动手前习惯先纠结“我要不要学开发 APP”,其实方向从一开始就偏了。手机 APP 只是最上面的一层,决定项目成败的反而是底层链路选型。
整条链路我习惯拆成四个环节:
- 传感器端:压力、温度、液位、电流等信号,通过模拟量或数字量接口进入 PLC。
- PLC 侧:负责数据采集和逻辑控制,常用控制器内置以太网口或串口。
- 传输侧:把 PLC 数据从现场网络送到远端,常见方式有工业网关加 4G/Wi-Fi,或者 PLC 直接接 DTU。
- 手机侧:APP 通过 MQTT 或 HTTP 接口拿到数据,再以图表、报警、历史曲线的形式展示出来。
对很多人来说,最容易产生误解的地方在前两段。他们以为“对接”就是把 PLC 的数据线直接插到手机上,实际上 PLC 和手机之间没有一个统一的语言。我的做法是,先把传感器怎么接到 PLC 搞清楚,再考虑网络层。因为无论你用什么方式把数据发到手机,前提都是 PLC 内部已经把这些值变成标准寄存器地址。
举个例子,车间里一个温度传感器通过 4-20mA 电流信号接到 PLC 的模拟量模块,PLC 内部把它转换成一个数值,比如 0 到 27648。你再通过 MODBUS TCP 协议去读 PLC 的保持寄存器,把这个数值读出来,除以 27648 再乘以 100,才得到实际温度值。手机 APP 展示的其实是经过换算后的物理量,而不是 PLC 里的原始整数。
理解了这一层,整个系统的架构才算立住。而后面所有无线方案,都是在保证“能稳定读到 PLC 寄存器数值”的前提下展开的。
2. 传感器到 PLC 的采集细节:底层数据搞不准则全盘皆输
我见过不少项目,网络层、APP 都没问题,最后发现数据不对,排查了半天,根源是传感器信号和 PLC 模块之间的量程没有对齐。所以第一部分必须放在“怎么把传感器读到 PLC 里”,这也是后面所有换算的起点。
2.1 模拟量信号与工程量换算:4-20mA 的标准玩法
工业现场最常见的传感器信号类型是 4-20mA 电流环,其次是 0-10V 电压信号和铂电阻温度信号。其中 4-20mA 之所以流行,是因为它天然带供电状态检测功能——如果线路断了,电流降到 0mA,远低于 4mA 的零点,PLC 就能识别出断线故障。
以西门子 S7-1200 为例,模拟量输入模块内部把 4-20mA 映射到 0 到 27648 的数字范围。这里有个容易忽略的点:不同品牌的 PLC 映射范围不一样。有些国产 PLC 用 0 到 4000,有些用 0 到 65535,甚至有些老型号还带符号位,范围是从 -32768 到 32767,而 4mA 对应的值不是 0,是 5530 左右。这点必须去查具体型号的硬件手册,别凭经验套。
知道了原始值范围,换算物理量就简单了。公式是:
实际工程量 = (PLC原始值 ÷ 满量程数字值) × (传感器量程上限 - 传感器量程下限) + 传感器量程下限
举个例子,一个液位传感器量程是 0 到 10 米,接在映射范围 0 到 27648 的模块上,PLC 读出来 13824,那液位就是 13824 ÷ 27648 × 10 = 5 米。这个换算公式我在每个项目里都会写到 PLC 内部程序里,因为如果你在后面网关里处理,每个数据点都要配一条换算规则,工作量翻倍而且容易出错。
2.2 RS485 与 MODBUS RTU:多个传感器共享一条总线的接法
如果传感器是数字量输出,比如带 RS485 接口的智能仪表,那 PLC 一般用 MODBUS RTU 协议去读。RS485 总线可以并联挂多个设备,但要记住几个硬性规矩:手拉手接线,不能星型;终端电阻只在首尾设备上接;波特率、数据位、校验位必须所有设备一致。
我曾经在一条产线上接了 8 台带 RS485 的电表,一开始怎么都读不上来,后来发现是 A、B 两根线接反了。别笑,这个问题出现的频率极高。正常情况下,仪表上的 A 接 PLC 侧的 A,B 接 B,如果接反,数据一定是错乱或者干脆收不到。
还有一种情况:传感器加了屏蔽层,屏蔽层单端接地还是两端接地。低压工业环境里我习惯单端接地,避免形成地环路。地环路会导致串口通信偶发超时,排查起来比断线还要麻烦。
2.3 PLC 侧寄存器地址映射:你在手机上看到的点号怎么来的
传感器进入 PLC 之后,每个数据点最终都对应一个寄存器地址。我用 MODBUS 协议读西门子 PLC 时,习惯把它映射到保持寄存器区,而三菱 FX 系列则是 D 寄存器对应 MODBUS 地址 40001 起始区。
这里有个经典坑:MODBUS 地址是 1 基的,也就是你从 40001 开始,但 PLC 数据块里的偏移可能是 0 基的。比如三菱 D0 对应 40001,D10 对应 40011,这个换算关系必须记牢。
在配置网关或写 APP 轮询代码时,你要维护好一张映射表,告诉系统每个传感器对应哪个寄存器地址、什么数据类型、多少倍率。这张表做得好,后面所有环节都会很顺。我一般用 Excel 或简单表格管理,字段包括设备名称、寄存器地址、寄存器数量、数据类型(16 位无符号、32 位浮点等)、字节序、量程、换算系数和单位。一开始别省这个功夫,后面调试时会省下大量时间。
2.4 批量采集时怎么提高效率:一次把多个寄存器读回来
当你有很多传感器数据要发到手机 APP 时,效率问题就来了。如果每个寄存器单独读一次,不仅网络开销大,而且 4G 通道还可能被频繁打断。正确做法是用 MODBUS 的批量读功能,一次连续读取多个地址。
以温度、压力、液位三个点连续存放在 D0、D1、D2 为例,用功能码 03 一次读 3 个寄存器就能全部拿到。前提是这些数据在 PLC 程序里存放在连续地址段。如果你在写 PLC 程序时把不同传感器的数值存得七零八落,后面轮询效率会很差。
这部分规划其实在 PLC 编程阶段就要想到。我把现场所有需要远程监控的模拟量值集中存到一段连续的保持寄存器里,统一做数据处理,这样网关只需要一条指令就能拿到全部监控点,轮询周期也能控制在 1 秒以内。
3. 数据怎么从 PLC 到手机:无线方案与网关选型
底层数据准备好了,接下来的核心问题是:数据怎么从 PLC 到手机。这里有几种方案,各有优缺点。我的思路是先用一张场景表格来对比哪个更贴合,然后再展开关键的参数配置细节。
| 方案 | 传输方式 | 延迟 | 部署难度 | 适合场景 |
|---|---|---|---|---|
| PLC 直连 4G DTU | 蜂窝网络 | 1-3 秒 | 低 | 单台设备远程监控 |
| 工业网关 + MQTT | 以太网/4G/Wi-Fi | 1 秒内 | 中 | 多台 PLC 集中管理 |
| 边缘计算网关 | 本地处理 + 上传 | 毫秒级 | 高 | 需要本地联动逻辑的场景 |
| 云平台快速接入 | 公网 | 2 秒以上 | 低 | 开发资源有限,想快速上线 |
3.1 为什么我推荐“工业网关 + MQTT 协议”
我个人推荐绝大多数场景用工业网关加 MQTT 协议,因为它在“快、稳、通用”三个维度上最均衡。网关侧内置 MODBUS TCP 主站功能,定时从 PLC 读数据,然后打包成 MQTT 消息发布到 MQTT Broker;手机上或云平台上订阅这个主题就能收到数据。
MQTT 好在哪里?它是工业物联网事实标准,几乎所有云平台都支持;它基于发布订阅模型,天然适合多设备、多客户端场景;它还能通过 QoS 等级保证消息不丢。相比直接用 HTTP 定时上报,MQTT 的长连接机制更适合无线环境,省电省流量,延迟还低。
3.2 网关的关键选型指标:别只看价格
网关选型时,我重点看四件事:是否支持 MODBUS 主站、是否内置 MQTT 客户端、是否支持断网缓存重传、以及数据点表配置的便捷性。
支持 MODBUS 主站意味着网关可以直接读 PLC 的数据,不需要 PLC 那边改程序,非常关键。断网缓存重传意味着 4G 信号不稳定时,数据会先存本地,恢复后再补传,这在工厂无线环境里能解决很多痛点。数据点表配置则关乎你部署的效率,有的网关必须在电脑上用专用软件一个个配,有的可以直接在网页或 App 上配,差别很大。
3.3 MQTT 参数配置:主题与 QoS 怎么设
关于 MQTT 配置,很多人第一次布“主题(Topic)”会犯错误。最简单的设计策略是“按设备分主题”,比如factory/line1/device01/data,这样订阅的时候可以灵活选择,比如你只想看某个车间的数据,就可以订阅factory/line1/+/data,通配符就能全部搞定。
QoS 级别方面,我建议对监控数据用 QoS 1,保证至少一次送达。QoS 0 虽然省流量,但网络抖动时可能会丢。对于报警类消息用 QoS 1 也够了,没必要上 QoS 2,那会导致重发机制复杂,延迟也更高。
还有一个常见问题是 Broker 的地址怎么填。如果网关走 4G 上网,那你不能用 PLC 局域网内的地址,必须填公网可访问的 Broker 地址,或者云平台的接入点。我早期踩过这个坑,网关配好以后一直连不上,排查了大半天,最后发现是填了内网地址。
3.4 用户侧常用 MQTT 客户端实测
手机端最直接的做法是用现成的 MQTT 调试工具先验证链路,再去开发自己的 APP。个人测试阶段我用过几款主流的 MQTT 客户端(比如常用的 MQTTX 以及另一款叫 MQTT Tool 的),体验和稳定性都基本够用。
我这里想特别提醒的是,MQTTX 支持 Windows/Mac/Linux/手机端,拿来模拟数据、验证订阅最顺手;而 MQTT Tool 在 Android 端用起来很轻量,适合现场临时调试。如果你准备长期使用,建议以你自己的 APP 或云平台集成方案为主,这些工具只是辅助链路验证。用这些工具的好处是,你可以不考虑 APP 开发,先把“网关能不能把数据发到公网 Broker”这件事验证清楚。链路通了,后续开发 APP 就是水到渠成的事。
4. 手机 APP 端的三条路线:别一上来就钻代码
APP 端要能展示数据,本质是拿到 MQTT Broker 的数据再呈现。开发的方式可以有三种,按你的资源和需求来选。
4.1 路线一:直接写个 MQTT 订阅客户端(门槛中等,自由度最高)
如果你本身会 Android 或 iOS 开发,最简单的方式是用官方 MQTT 库写一个订阅功能:连接 Broker、订阅刚才配好的主题、收到 JSON 数据后解析、显示在界面上。
以 Android 为例,用 Eclipse Paho MQTT Android 服务库,几十行代码就能跑通。iOS 端的话 CocoaMQTT 库用起来也比较顺手。这是自由度最高的路线,因为界面、图表、告警规则全部自己掌控。
不过这条路线耗时长。要处理连接重连、数据缓存、离线推送、图表绘制,一套完整 APP 做下来并不是一两天的事。我通常只在小批量验证、或客户明确要求私有化部署时走这条路。
4.2 路线二:基于物联网平台快速搭建(最快落地,免开发)
如果你没有精力写代码,那就直接选一个支持 MQTT 接入的物联网平台,把网关的数据推送到平台,平台自带手机 APP 会帮你处理好设备管理、数据展示和报警通知。
这条路我测下来最快。很多平台都提供设备影子、属性定义、数据流和告警规则。你在平台创建一个产品,添加设备,把网关的 MQTT 连接信息改成平台的接入点,然后在平台配置数据解析脚本,把网关发来的原始 JSON 映射成平台的标准属性。手机上装该平台的 APP,扫码绑定设备,就能看到数据曲线。整个过程不需要写一行代码,半天能跑通。
4.3 路线三:H5 网页嵌入到微信(折中方案,最灵活控制)
第三种路线是用 H5 网页实现,把页面套进微信公众号或企业微信里。技术上仍然是订阅 MQTT Broker,但前端代码最终以网页形式呈现,维护起来比原生 APP 轻量。
这条路线适合那些不想下载独立 APP、又想有品牌化界面的场景。我在设备厂商的售后监控项目里经常用,客户扫个码就能看实时状态,不用在应用商店上架,对企业内部使用的场景非常实用。
4.4 JSON 数据格式设计:前后端约定好字段是关键
不管选哪条路线,网关发到 MQTT 的 Payload 格式必须先设计好。我推荐用 JSON 格式,设计时统一字段含义,避免后期来回改。
一个典型数据消息:
{ "deviceId": "line1-pump-01", "timestamp": 1717123456, "data": { "temperature": 62.5, "pressure": 0.31, "liquidLevel": 4.2 } }字段方面,timestamp 我建议用 Unix 时间戳(秒级),方便前端一点转换成可读格式,也方便做历史排序。data 对象里的键名尽量和设备的数据点表保持一致,这样排错时可以通过对比表快速定位是传输问题还是显示问题。
另一个经验:所有数值都带单位写进注释,或者单独维护一张字段-单位对照表。因为很多人开发 APP 时,区分不了网关传来的压力值到底是 kPa 还是 MPa,一个单位不对,整个监控界面就是灾难。
5. 现场调试与常见问题速查:从接线到报文逐层看
系统搭建完毕后的调试阶段,是最耗精力的。我通常采用“从物理层往应用层追”的套路,按接线、网络、协议、应用四个层次排查,效率最高。
5.1 接线层:先解决物理层的干扰与断开
最常见的问题是“读不到数据”或“偶发断线”。第一时间看传感器有没有正常供电,尤其是两线制 4-20mA 仪表,必须确认回路里串入的电源极性接对没有。万用表量电流环是最直接的手段,正常工作时电流会在 4-20mA 之间波动。
RS485 通信不稳定时,检查 A/B 是否接反、屏蔽层是否单端接地、是否有超过 32 个节点但没加中继器。还有一条隐蔽问题——通信线是不是用了普通网线,而不是双绞屏蔽线。普通网线在电机启停的瞬间容易被干扰,把数据带乱。有条件的话换成 120 欧姆阻抗的屏蔽双绞线,效果立竿见影。
现场我还有个习惯:在传感器端并联一个终端电阻(常见的 120 欧姆),如果通信立刻恢复稳定,说明原来的总线上反射严重,这时再审视总线两端是否都有匹配电阻。
5.2 网络层:确认网关是否真的连上了网
很多网关有指示灯,4G 拨号成功后通常会亮。如果灯不亮,先检查 SIM 卡有没有插到位,APN 参数对不对。有些物联网卡需要手动填 APN,不填就是连不上。
网关接到公司 WiFi 网络时,要注意频段兼容问题。有些工业网关只支持 2.4G,但现场路由器开了双频合一,网关可能半天连不上。另外,如果现场网络 DHCP 关闭,网关需要手动配静态 IP、掩码、网关和 DNS。这四个参数缺一不可,尤其是 DNS 漏了会导致域名解析不成功,看起来就是连接不上。
5.3 协议层:MODBUS 与 MQTT 各自的常见故障
MODBUS 读失败的大部分原因,是寄存器地址不对或数据类型映射错位。建议先用 PC 端串口调试工具或 MODBUS 扫描工具,直接读一次 PLC 的寄存器值,确认地址没问题,再让网关去读。如果扫描工具能读到,网关读不到,那检查网关里配的地址是否偏移了一位,尤其是那些把 0 基偏移写成 1 基偏移的坑。
MQTT 这边,常见故障是“能发送但刷不出来”。这时该检查主题是否匹配,APP 里订阅的 Topic 是否和网关发布的完全一致,包括层级和通配符。另一个坑是 Payload 解析失败,网关发布的 JSON 里某个字段类型是字符串,但 APP 按数值解析,就报错。调试阶段建议先用 MQTT 客户端订阅一下,看看原始消息长什么样,再逐步定位。
5.4 应用层:APP 和平台侧的排查方向
如果发现数据有延迟,先检查轮询周期设置。部分网关默认轮询周期是 5 秒甚至更长,你可以在网关配置页面调成 1 秒。但要注意,轮询太快也会导致 PLC 通信负载增高,一般 500ms 到 1 秒已经足够满足手机监控需求。
还有一个容易忽略的时间戳问题。如果手机显示的数据是空的,或者曲线莫名其妙只显示平线,检查网关的时钟是否正确。有些网关掉电后 RTC 回退到出厂时间,上报的数据时间戳全都不对,平台排序直接乱了。
5.5 常见故障速查表
| 症状 | 可能原因 | 快速排查 |
|---|---|---|
| APP 收不到数据 | MQTT Topic 不一致 | 用 MQTT 客户端订阅上级主题,观察是否有消息 |
| PLC 数据读上不来 | 寄存器地址错误/A-B 接反 | 先用扫描工具单点读,验证物理链路 |
| 数据偏差大 | 量程换算系数不对 | 断开传感器,用标准信号发生器校准零点满度 |
| 偶发断线 | 现场电磁干扰 | 检查屏蔽层接地与总线终端电阻 |
| 网关连不上网 | APN/DNS 配置错误 | 查看网关网络状态页,检查拨号日志 |
这张表并不神秘,我分享出来的原因是:绝大多数现场故障都不是“方案不行”,而是“细节没对齐”。你对照一遍,大概率能自己解决 80% 的问题。
6. 从零到一跑通无线监控最快路径:四步实战
最后我给出一个可直接照做的最小行动方案。这套流程已经在多个项目里验证过,能在 1-2 天内跑通原型系统。
第一步,准备一台 PLC(或直接用支持 MODBUS TCP 的软 PLC)、两个模拟量传感器、一个支持 MQTT 的工业网关(自带 4G 更好)。
第二步,把传感器接好,确认 PLC 里能通过编程软件看到正确数值。
第三步,在网关里配置设备连接信息和 MODBUS 数据采集点,然后测试把数据推到一个公网的 Broker。你可以先用免费的测试 Broker 验证,确认链路通了再切换到正式环境。
第四步,手机上装一个 MQTT 调试工具,订阅网关发布的 Topic。数据能实时刷新,就说明核心链路已经打通。如果不满足于调试工具,再参考前面“APP 端三条路线”去开发带历史曲线和报警的正式页面。
需要特别说明的是,公网 Broker 在生产场景要注意数据安全和网络稳定,最好选择有专人维护的物联网平台,而不是长期依赖调试用的免费公共实例。其实这个问题我们把链路拆开来看之后,会发现没什么玄学成分,走得通的方案早有大量成熟的组件在支撑。别盯着“手机 APP”这层壳不放,把最底层的数据和网络理顺了,剩下的只是时间和耐心问题。
我最后想说的是,我做这类项目最大的体会是“先通再优”。第一版哪怕只是手机能实时看到传感器数值,那就已经很了不起了。后面的历史曲线、报警联动、多设备地图,都可以在这个基础上逐步叠加,千万不要一开始就想做一个完美无缺的监控平台。把最小的闭环跑通,再谈优化,这个节奏几乎适用于所有工业场景的数字化改造项目。