Modbus转MQTT实战指南:老旧设备上云、网关配置与调试全解析
发布时间:2026/9/23 4:17:13 作者:尧图编辑部 阅读量:1,286

你们是不是也遇到过这种情况车间里那批用了十几年的PLC、仪表、变频器本身跑得好好的但数据就是出不了车间。想统计个开机率、想远程看个温度要么靠人工拿本子去抄要么就得连一个笨重的上位机。这两年很多工厂开始让设备“上云”但拆了重换一批设备不现实成本扛不住。我今年在几个现场项目里集中用了一套方案——给老旧设备加装Modbus转MQTT采集网关把原来只能本地读的Modbus RTU/TCP数据统一转换成MQTT消息推到云端平台。这套路并不复杂但里面有很多细节处理不好就翻车。这篇就把整个方案的选型、配置、接线、排障过程完整拆开讲尤其是Modbus Poll调试、CRC校验、MQTT broker部署这些环节全是实操经验不写虚的。老规矩先说清楚这套方案能干嘛它适合现场设备具备Modbus接口RS485串口或者以太网Modbus TCP都算、但缺少联网上云能力的场景。改造时不动设备本身只在旁边加一个边缘网关负责采集、解析、转换再把数据以MQTT协议发到本地或云端的消息服务器。因此这篇文章适合现场设备维护的电气工程师、做数据采集的软件工程师还有想落地小型物联网项目的个人开发者参考。1. 为什么非得折腾Modbus转MQTT1.1 老旧设备的数据现状能用但看不见我见过很多厂里的实际情况设备控制器是十多年前买的支持485通讯协议是标准的Modbus RTU说明书还在寄存器地址表也完整。但工厂没有上位机也没有组态软件甚至通讯口都从来没接过线一直用手工记录数据。问为什么不接回答基本是当初那套上位机太贵要几万块还要专人维护后来电脑坏了也没人管。另一类情况更麻烦设备有以太网口走Modbus TCP但机房的老监控软件绑定Windows XP的工控机一旦换系统就装不回去。数据只能存在这台工控机的硬盘里既不能推送也不能远程访问说白了就是一个“数据孤岛”。Modbus协议本身是很成熟的现场总线协议胜在简单稳定几乎所有工业设备都支持。但它有个先天问题它是同步请求-响应模式主站去问从站才回答。这种模式在现场一对一问没问题跨网络、跨平台、跨防火墙就非常麻烦。特别是一台设备要被多个系统同时读取时主站之间的地址冲突、轮询调度、网络穿透每一项都让人头大。1.2 为什么中间要加一层MQTTMQTT是轻量级的发布/订阅消息协议诞生于低带宽、高延迟的卫星网络场景天然适合工业数据的远传。设备端作为客户端把数据“发布”到某个主题服务器端“订阅”这个主题就能收到数据。反向也一样服务器可以下发指令到主题设备端订阅后执行。整个过程是异步的设备不需要时刻在线消息服务器自动缓存转发这个特性对工业现场断网、信号不稳的情况非常友好。所以Modbus转MQTT并不是把Modbus扔掉而是给Modbus设备配一个“翻译官快递员”翻译官负责把Modbus寄存器里的原始数据读出来快递员负责按MQTT协议打包寄出去。Modbus负责车间内部“最后一公里”MQTT负责数据从车间到服务器的“长途运输”各干各的擅长的活。1.3 典型场景什么时候适合用这套方案不是所有设备都要转MQTT我归纳了三个最典型的场景你可以对照自己现场判断生产数据汇总车间里几十台设备需要把产量、温度、压力、运行状态统一汇总到一个平台做看板或报表。这是最常见的使用场景。远程运维监控设备分布在不同厂区甚至不同城市需要远程查看运行参数、接收故障报警。有了MQTT之后不需要公网IP只要有能访问到broker的网络即可。与业务系统对接MES、ERP、能源管理系统需要实时读取设备数据。通过MQTT可以让后端服务比如Java、Python写的接口服务直接订阅数据省去各种繁琐的自定义通讯协议开发。2. 先把两个协议吃透后面配置才不懵2.1 Modbus RTU/TCP报文到底长什么样很多朋友一上来就问“我的设备型号是XXX能不能采集”结果一看连设备的寄存器地址表都没看过。我的建议是动手之前先花半小时把Modbus的报文结构搞明白。以最常用的Modbus RTU为例一帧完整报文依次是从站地址1字节、功能码1字节、数据区N字节、CRC校验2字节。以读取保持寄存器的03功能码为例主站发送的请求帧是从站地址 0x03 起始寄存器地址高字节 起始寄存器地址低字节 寄存器数量高字节 寄存器数量低字节 CRC低字节 CRC高字节。比如读从站1的40001寄存器实际地址0x0000连续2个寄存器请求帧就是01 03 00 00 00 02 C4 0B。设备返回的响应帧则是从站地址 功能码 字节数 数据1 数据2 ... CRC。热词里常出现的“modbus rtu 03报文详解”“modbus rtu报文详解”本质就是把上面这段请求和响应的每个字节拆开来解释。我刚接触的时候也觉得这东西要背其实不用Modbus Poll工具会把报文解析好展示出来但基础结构你得懂不然后面点表配置错了不知道怎么查。功能码方面最常用的是03读保持寄存器、04读输入寄存器、01读线圈、02读离散输入写的话是06写单个寄存器、16写多个寄存器。记住一个大原则保持寄存器和线圈可读可写输入寄存器和离散输入只能只读。去现场看设备说明书时先确认设备支持哪些功能码再选对应采集方式。2.2 CRC16校验算法看着吓人其实套路固定Modbus RTU的一个重点是CRC校验因为它是整个报文能否被从站接受的关键。Modbus CRC-16的计算过程是固定的先初始化一个16位寄存器为0xFFFF然后对报文中从从站地址开始到数据区结束的每个字节与寄存器低字节异或再右移8次每次检测最低位如果为1则与多项式0xA001异或。最终得到的值低字节在前发送所以报文里CRC是“低字节在前、高字节在后”。这个算法我建议不要自己去手推直接用现成函数。给你一个非常通用的C语言实现uint16_t modbus_crc(uint8_t *buf, uint16_t len) { uint16_t crc 0xFFFF; for (uint16_t i 0; i len; i) { crc ^ buf[i]; for (uint8_t j 0; j 8; j) { if (crc 0x0001) { crc (crc 1) ^ 0xA001; } else { crc 1; } } } return crc; }用的时候注意两点第一CRC只参与报文末尾的校验不计入CRC自身第二发送时低字节在前。很多人在串口调试助手里怎么发都不通一查就是CRC高低字节反了。另外如果现场不支持RTU而支持ASCII模式那是另一套LRC校验现在用得很少遇到再说。实际调试时Modbus Poll会显示CRC是否正确你只要会用工具校验就可以很快定位是设备没响应、还是CRC算错、还是地址不对。2.3 MQTT的核心机制不是“连接”而是“话题”MQTT协议本质上是一个消息总线模型所有客户端都连接到一台称为broker消息服务器的节点上通过“主题”来区分消息类型。举个例子车间里所有设备的温度数据都发布到factory/device/temperature这个topic后端服务订阅这个topic就能收到所有温度数据。如果你想单独收1号设备的温度就拆成factory/device/01/temperature用层级式topic来管理。MQTT有三个品质服务等级QoS 0最多发一次可能丢QoS 1至少发一次可能重复QoS 2恰好一次性能略差。工业场景采集数据我一般用QoS 1重要指令用QoS 2但后者对broker性能有要求。热词里“mqtt订阅与发布消息”问的人很多无非就是确认三件事先用哪个客户端发布再用哪个客户端订阅最后看消息内容是否符合预期。工具我用的是MQTTX和mosquitto自带的命令行工具后面实操环节会讲。Broker的选择上Windows本地开发我用mosquittoLinux服务器上用EMQX轻量级项目用Mosquitto就够了。记住MQTT只负责消息的传输和转发不负责业务逻辑业务逻辑要写在订阅端。所以协议里还规定了遗嘱消息LWT机制设备异常断线时broker会代发一条指定消息这条消息常常被用来做设备离线报警非常实用。3. 方案设计和选型网关、软件、云端怎么搭配3.1 硬件网关选型思路做Modbus转MQTT首先得有硬件载体。市面上的边缘采集网关很多常见的有工业物联网关、边缘计算网关、DTU数据透传单元。我的选型经验是看三个指标一是串口数量很多现场不只有一台设备至少要2路RS485才能灵活组网二是支持的协议驱动数量有些网关内置了各种品牌PLC的驱动可以直接解析三菱、西门子、台达等协议不局限于标准Modbus三是是否支持本地脚本/规则引擎这个决定了你能否在网关本地做数据计算、阈值报警而不只是简单透传。现场老设备的情况千差万别有的走RS485有的走RS232有的走以太网。一个合格的网关应该具备至少2路RS485 1路以太网口支持Modbus RTU主站、Modbus TCP主站同时支持MQTT客户端功能能将采集到的数据以JSON格式发布到指定topic。价格从几百到几千都有我一般建议客户别买最便宜的因为工业现场的宽温、浪涌、隔离这些硬指标便宜货通常省掉了后期维护够你喝一壶的。有人问能不能不买网关用DTU透传可以但DTU只做串口到网络的双向透传不做协议转换你还是得在云平台或服务器侧自己解析Modbus报文。相当于把“翻译官”的工作搬到云端做服务器侧压力大同时占用的带宽也大。能用网关在边缘侧转换尽量在边缘侧转换。3.2 软件工具链准备Modbus Poll / Modbus Slave / MQTTX调Modbus必须有两类工具一类当主站master用一类当从站slave、server用。Modbus Poll就是最经典的主站模拟工具Modbus Slave则是从站模拟工具。这两个工具在很多调试场景里是对着开的先用Modbus Slave模拟设备端预设一组寄存器值再用Modbus Poll去读验证采集链路通不通。热词里“modbus poll密钥”“modbus poll 13.2.1注册码”这些搜索说明很多人卡在了工具的授权上。这里说实话Modbus Poll是商业软件需要注册码才能长时间使用但调试阶段用它的演示模式也基本够用只是每次打开有提示、可能限制读取时间。如果你只是验证协议和做小规模调试免费的替代方案也有ModbusScope开源、QModMaster以及Python的pymodbus库自己写个简单脚本。我的建议是别在找注册码上花太多时间值不值当自己衡量调试完就没用了关键是掌握思路。MQTT侧的工具推荐MQTTX跨平台、界面清爽支持多个连接同时在线。还有一个轻量选择是mosquitto自带的命令行工具mosquitto_sub用来订阅mosquitto_pub用来发布适合服务器上用。3.3 云平台接入AEP平台和自建MQTT服务云端平台这块热词里有“aep平台mqtt”指的是电信的物联网开放平台它支持设备通过MQTT协议接入这种方式非常典型。其余大小厂商的物联网平台基本也都支持MQTT接入区别只在于设备接入认证方式和payload的JSON字段格式。选择平台时注意几点平台是否支持TLS加密连接、是否提供设备管理影子设备、物模型、数据能保存多久、有没有API可以拉取历史数据。小规模项目可以直接用EMQX MySQL 简单的Web应用自己搭一套这也是热词里“springboot 使用mqtt”这类搜索非常多的原因——用SpringBoot编写订阅服务把MQTT数据写入数据库前端再展示整个链路非常成熟。4. 实操从Modbus侧把数据摸清楚4.1 RS485接线与串口参数去现场做Modbus采集百分之六十的问题出在物理层。RS485是差分信号用的是一对双绞线分A和B也叫D和D-接反了设备不回应这是最基础但最常见的坑。我习惯用万用表先测电压确定线序A线对地电压一般是0V到2V波动B线是2V到4V左右。如果设备不支持热插拔接线时务必断电操作485芯片很脆弱带电拔插容易烧芯片。接线之外终端电阻很关键。RS485总线两端需要各并联一个120欧姆终端电阻用来匹配阻抗、抑制反射。短距离、低速、设备不多时不加可能也能跑但距离拉到一两百米波特率上到9600以上不加终端电阻就会出现偶发性超时。建议在总线的物理两端各加一个别只加一头。串口参数是另一个重点波特率、数据位、停止位、校验位四项必须和设备说明书完全一致。现场老设备常见的是9600、8、N、1也就是9600波特率、8个数据位、无校验、1个停止位。如果设备支持多个波特率优先选9600稳定性好距离走得更远。站号也是关键Modbus RTU总线上每个设备必须有唯一的从站地址1到247之间。遇到两个设备设成了同一个站号那数据就会串得一塌糊涂而且很难排查。4.2 用Modbus Poll和Modbus Slave联调我调一个新项目时一定先在办公室用Modbus Slave把设备的行为模拟出来再用Modbus Poll去读。这样能把“通讯协议问题”和“现场设备问题”分开省很多时间。Modbus Slave设置步骤选择连接方式RTU对应串口TCP对应网口配置从站ID比如1配置功能码比如03保持寄存器然后设置寄存器区的起始地址和数量手动填入几个测试值启动监听。这边一启动Modbus Poll新建连接选择相同类型填从站IPTCP或串口参数RTU设置功能码和地址点连接就能看到数据刷新。如果显示通讯正常数据和你填的值一致说明你手里的主站程序、串口参数、地址全是对的。实际在车间Modbus Poll还可以用来验证你草图上的点表有没有写错。设备说明书会写“40001寄存器对应温度为XXX”注意Modbus有的从地址0开始有的从1开始差一个地址的偏移非常要命。Modbus Poll里通常显示的是‘PLC地址’4xxxx你填的时候要清楚它背后的协议地址是0xxxx两者之间有个加1的关系。不要背诵这个规则关键是在每个设备上验证到底哪个地址能读到你要的值。4.3 读懂功能码和地址对应关系Modbus的地址规则分两类一类是协议层的地址实际数据帧里传输的地址一类是厂商说明书里的“寄存器编号”。比如设备说明书写“40003寄存器是温度”对应Modbus PDU里的寄存器地址就是240001对应地址040002对应140003对应2。这个坑特别容易让新手困惑读数时填2还是填3以目标设备说明为准在Modbus Poll里分别试一下读到合理数值就对了。再补充一个功能码与数据类型的联动问题很多设备的一个“寄存器”是16位但温度、压力这类模拟量经常是32位浮点数占用连续两个寄存器。读取时要在“寄存器数量”里对应增加然后在解析侧按高16位在前还是低16位在前来组合。不同品牌设备的字节序不同有的大端有的小端这也是导致读出来数值“怪怪的”的常见原因。你需要在点表里明确标注起始地址、寄存器数量、数据类型int16/uint16/float32、字节序、缩放系数。5. 核心实现Modbus转MQTT的配置与映射5.1 网关侧的数据轮询机制网关作为Modbus主站需要周期性地向各个从站发送读请求。轮询间隔的设置要综合考虑实时性要求和总线负载。一次Modbus RTU请求9600波特率、8N1大约需要10ms的传输时间再加上从站响应延时和帧间隙单台设备轮询一次大约在20到50ms。如果总线挂了10台设备轮询一轮就是0.2到0.5秒能做到1秒级的数据刷新完全没问题。要注意的是网关通常会为每个从站维护“离线检测”和“超时重试”机制。超时时间建议设置在200到500毫秒不要设置成1秒或更长否则一台设备断电后面排队的设备全部被拖慢。重试次数1到2次即可再多会加剧总线拥堵。另一个重要参数是“无效报文过滤”网关内部要丢弃CRC错误、地址不符的报文不然会把错误数据当成正常数据处理。5.2 点位表设计先画表格再配置无论你用哪个品牌的网关配置Modbus转MQTT第一步都是整理点位表。这个点位表是设备数据到云端数据的完整映射决定了网关采集哪些寄存器、以什么格式上报。我负责的项目通常会做一个这样的表点位名从站地址功能码寄存器起始地址数据类型字节序缩放系数单位上报周期1号炉温度1030float32AB CD0.1℃5s1号炉压力1032float32AB CD0.01MPa5s1号炉运行状态1010bool---5s这张表里最容易被忽略的是“缩放系数”和“字节序”。有些设备的寄存器值传回来的是100实际含义是10.0度那就需要除以10。这个逻辑在网关里可以配置也可以在云端解析时处理我的习惯是尽量在网关侧就换算成真实物理值这样下游无论是数据库还是大屏都省事。字节序方面用Modbus Poll反复读几次对照设备实际显示值就能确定AB CD还是CD AB。5.3 主题与JSON数据格式设计MQTT主题设计建议遵循层级化、可扩展的原则。我常用的格式是factory/{车间标识}/{设备类型}/{设备编号}/data报警类消息单独走一个主题factory/{车间标识}/{设备类型}/{设备编号}/alarm这样做的好处是后端可以按前缀订阅比如订阅factory/plant1/#就能收到plant1车间的所有类型消息。避免把报警数据混在采集数据里因为报警需要及时推送QoS等级和数据处理优先级都不一样。上报的payload建议统一用JSON方便各种语言解析。一个常规的采集数据包长这样{ deviceId: furnace_01, timestamp: 2024-01-15 14:30:02, data: { temperature: 456.7, pressure: 1.23, status: 1 } }timestamp用设备本地时间还是服务器时间要提前约定我的建议是网关侧生成时间戳因为服务器收到消息的时间和设备实际采集时间可能差好几秒尤其现场网络延时大的时候这个偏差会严重影响数据趋势图的分析。5.4 不买网关用Python软网关怎么写如果项目还在原型验证阶段或者设备数量很少不想买硬件网关可以用Python写一个软网关。这个不止一次被问到我给你一个最简可运行的核心框架依赖pymodbus和paho-mqtt两个库。import time import json import paho.mqtt.client as mqtt from pymodbus.client import ModbusTcpClient # Modbus 连接 mb_client ModbusTcpClient(192.168.1.10, port502) mb_client.connect() # MQTT 连接 mqtt_client mqtt.Client() mqtt_client.connect(192.168.1.200, 1883, 60) mqtt_client.loop_start() POLL_INTERVAL 5 # 秒 while True: try: # 读取从站1保持寄存器起始地址0读4个寄存器 result mb_client.read_holding_registers(address0, count4, slave1) if not result.isError(): # 假设前两个寄存器组成float32温度大端 AB CD raw (result.registers[0] 16) | result.registers[1] temp raw / 10.0 payload json.dumps({ deviceId: test_dev_01, timestamp: time.strftime(%Y-%m-%d %H:%M:%S), data: {temperature: temp} }) mqtt_client.publish(factory/plant1/test_dev_01/data, payload, qos1) except Exception as e: print(采集异常:, e) time.sleep(POLL_INTERVAL)注意pymodbus的版本升级后接口有变化老代码可能跑不起来建议按你安装版本的官方示例为准。软网关适合开发调试但生产环境不推荐原因很简单普通PC或树莓派的稳定性、供电、散热、抗干扰能力都比不上工业网关一旦跑一段时间死机整个数据链路就断了。6. 服务器端Broker部署与联调6.1 Windows上手动把MQTT服务装成本地服务热词里“如何在windows中手动把mqtt服务zip包设置成本地服务”这种问法一看就是想在Windows开发机上快速搭建一个本地MQTT broker。Mosquitto官方提供了Windows安装包装了之后有时候不会自动注册为系统服务手动折腾一次确实繁琐。我分享下最省事的做法以mosquitto 2.x为例先把zip包解压到C:\mosquitto保证mosquitto.exe和mosquitto.conf在同一目录然后以管理员身份打开CMD或PowerShell执行cd C:\mosquitto mosquitto.exe install net start mosquitto第一条是安装Windows服务第二条是启动服务。这样mosquitto就以Windows服务的方式在后台运行了开机自启掉线自动拉起。如果执行mosquitto.exe install报错多半是权限不够确认是以管理员身份运行的终端。如果你懒得用服务直接mosquitto.exe -c mosquitto.conf -v前台运行也行但关掉窗口服务就停了只适合临时调试。Mosquitto默认只监听本地回环地址如果想让局域网其他机器都能连上需要修改配置文件listener 1883 0.0.0.0 allow_anonymous true生产环境一定要关掉匿名访问设置用户名密码。生成密码文件的命令是mosquitto_passwd -c passwordfile username然后在mosquitto.conf里加上allow_anonymous false和password_file passwordfile路径。6.2 用MQTT客户端验证全链路Broker部署完下面就是把Modbus侧和MQTT侧串起来验证。我在现场常用这套流程先用mosquitto_sub订阅所有主题观察设备数据是否上来。命令行示例如下mosquitto_sub -h 127.0.0.1 -p 1883 -t factory/# -v-v参数会打印主题和消息内容如果能看到类似{deviceId:furnace_01...}的JSON数据说明网关已经成功上报。如果这里没数据问题就在网关侧先检查网关的MQTT参数broker地址、端口、用户名密码、topic是否填写正确以及网关是否成功接入broker。再用MQTTX做一个发布测试向factory/plant1/test_dev_01/control发布一条控制指令看设备侧是否有反应。注意工业控制指令最好设置QoS 2确保不丢不重同时在指令里带消息ID服务端和设备端都要做去重。6.3 SpringBoot后端怎么订阅MQTT数据热词里“springboot 使用mqtt”说明很多人想用Java生态对接。SpringBoot集成MQTT通常通过Spring Integration MQTT模块核心就是配置一个MqttPahoClientFactory再定义入站通道适配器订阅topic。核心配置大致是paho客户端ID、broker地址、用户名密码、默认topic、QoS。实际开发中的坑有几个一是客户端ID必须在broker上唯一多个服务实例部署时如果共用同一个clientId会造成互相踢下线需要给每个实例加上随机后缀二是消费端要做好幂等处理因为QoS 1可能重复投递后端入库前要按设备ID时间戳去重三是断线重连要配置自动重连同时监听连接丢失的回调做好日志告警不然服务静默掉线数据就全断了。7. 现场常见问题与排查实录7.1 通讯不稳定、偶发超时这个现象在RS485现场太常见了表现为Modbus Poll有时能读到数据有时报超时或者读的数据刷新着就卡住了。排查方向我建议按顺序来第一看线是否双绞、屏蔽层是否单端接地485线如果不双绞、不接地在变频器旁边就是一根天线第二确认终端电阻尤其总线超过30米时必须加第三看波特率和设备是否一致有的设备拨码设置的波特率和说明书默认值不同第四看从站地址是否冲突把总线上其他设备逐个断开测试。7.2 能通讯但数据一直为0或满量程读到的数据是0或者65535这种极端值说明链路是通的问题出在地址或数据类型上。先确认寄存器地址有没有偏移再用Modbus Poll以不同数据类型解析同一段寄存器比如按int16、uint16、float32分别看哪个解析结果符合设备实际显示值就是正确的数据类型。如果所有解析方式都不对就得回设备说明书确认是不是用错功能码了比如保持寄存器当成输入寄存器读返回的数据自然不对。7.3 数据上报到云端有延迟或丢包MQTT链路数据延迟要从两个方向排查一是网关侧轮询频率太高导致Modbus总线本身处理不过来网关内部缓冲区堆积二是broker到订阅端的链路有问题比如订阅端处理消息慢没有及时消费broker积压消息。我遇到过一次是因为后端数据库写入太慢导致MQTT消息堆积了几十万条一查发现是订阅端没有开启多线程消费。7.4 设备掉线但MQTT没触发报警MQTT的遗嘱消息Last Will要设好。网关在连接broker时带上遗嘱主题比如factory/plant1/gateway/status遗嘱消息是offline。正常运行时网关定时发送心跳到另一个主题如果网关与broker之间网络中断broker会在心跳超时后自动代发遗嘱消息。订阅端订阅这个状态主题就能实现设备离线报警。注意心跳超时时间要设置合理太短容易误报太长报警不及时一般60到120秒比较合适。7.5 问题排查速查表现象可能原因快速排查方法串口完全收不到响应接线反、串口参数错误、站号错误万用表测A/B线电压核对波特率和从站地址偶发超时缺终端电阻、屏蔽层未接地、干扰强检查终端电阻、换双绞屏蔽线单端接地读到数据全为0或满量程地址偏移、数据类型错误、功能码不对Modbus Poll换类型解析核对说明书CRC校验错误频繁波特率偏差、总线干扰、线缆过长降低波特率到9600加终端电阻换屏蔽线MQTT能连但收不到数据主题订阅错误、QoS不匹配、网关未启动采集mosquitto_sub订阅通配符#观察是否有数据MQTT频繁断开客户端ID冲突、心跳超时、网络不稳定检查客户端ID唯一性调整KeepAlive开启自动重连结尾这套方案做下来我最深的体会是Modbus转MQTT看着简单真正难的点不在协议转换而在你对现场设备的熟悉程度。寄存器地址表对不对、字节序对不对、设备的通讯参数是不是说明书里的默认值这些才是决定项目顺不顺利的关键。所以做这类项目一定不要急着上云先在车间把Modbus侧的数据用Modbus Poll一对一调通再做转换和上报最后才接云平台。Modbus侧稳了MQTT侧基本不会出大问题。另外给老旧设备做改造要有一个心态这类设备没有统一标准每台都可能给你“惊喜”点表一定要现场实测为准别全信说明书。最后分享一个小技巧网关设备的配置必须定期导出备份最好在项目文档里保留一份与云平台对接的字段说明不然半年后想加一个点位又得重新翻半天配置。