工业现场的设备大多各自为政:PLC 走 RS485,传感器走模拟量, 远程监控又需要单独拉一条网线。市面上的"DTU"只做单一协议转换, 现场往往要叠好几个模块,接线乱、故障点分散、供电也成问题。
这块板子把三件事做到同一块 110×80mm 的 4 层板上: 4G 无线回传、有线以太网、RS485 工业总线。 向下通过 Modbus RTU 轮询 PLC 采集数据,向上经 MQTT 汇聚到 OneNET 平台, 断网时数据自动落到 TF 卡,恢复后按时间戳补传。
整机由 24V 工业电源供电,内置 18650 锂电 UPS,市电断电时自动切换电池, 保证通信不中断。板载 1.54 寸 TFT 实时显示网络、现场设备与云端连接状态, 现场调试不用接串口。
24V 工业输入保护:TVS + PTC + PMOS 防反接 + 稳压钳位 + LC 滤波。
多级降压 24V→5V→3.3V/3.8V→1.8V,满足 VBAT 2A 瞬态供电。
TP4056 充电 + XB7608 保护。
市电掉电时自动切换 18650 电池供电,通信不中断。
4G Cat.1(双 SIM)、W5500 以太网、RS485(Modbus RTU)。
TF 卡存储、SPI TFT 本地显示。
| 主控 | ML307C-DC-CN(ASR1605,Cortex-R5 @614MHz,OpenCPU) |
|---|---|
| PCB | 4 层板,阻抗控制,独立地平面 |
| 供电 | 24V 宽压输入,三级降压,18650 锂电 UPS |
| 通信 | 4G Cat.1 / W5500 以太网 / RS485 |
| 存储显示 | SPI TF 卡、1.54" 240×240 IPS(ST7789) |
| 协议 | Modbus RTU、MQTT、HTTP、TCP/UDP |
固件运行在模组内部的 OpenCPU 环境,基于 CMSIS-RTOS2 / ThreadX。 按职责拆成多个任务:网络守护、MQTT 上报、云端命令轮询、基站定位、 RS485 主从通信、界面刷新。
4G 模组上所有走网络的业务都落在同一套射频和 TCP/IP 栈上。 同时发起会叠加电流峰值,也会互相抢占 SDK 内部的连接池。
用 RTOS 互斥量把它们串行化:同一时刻只有一路业务握着射频, 释放后留 1.5 秒静默窗口让功放电流回落。长任务(定位)在持锁 期间定期检查是否有更高优先级业务在排队,有就主动让出。
查 SDK 实现会发现,这些"原生接口"内部全部是
cm_virt_at_send_sync(),同步阻塞的虚拟 AT 往返。
尤其 cm_modem_get_cereg_state() 发的是
AT+CEREG=5;+CEREG?,前半截是设置命令,
会重写内核的网络事件订阅。
因此把周期性查询拆成两档:5 秒只读缓存的注册态与 PDP;
60 秒才查信号、运营商、电压。
AT+CEREG=5 只在掉网恢复时才发。
模组掉网分好几种:射频被关、SIM 重新识别、PDP 被网络侧释放。 只盯 PDP 是不够的——CFUN 关了以后 SIM 也读不到,PDP 永远回不来。
守护线程按「CFUN → SIM → 注册 → PDP」逐级拉起。 网络正常时 10 秒探测一次,掉网时加密到 1 秒。 连续 15 分钟没网才复位整机。
网络正常时数据实时上报;中断时按时间戳写入 TF 卡, 恢复后按序补传。
避免工业现场网络波动导致数据丢失——这是工业场景和消费级 设备最关键的区别之一。
设备通过 MQTT 接入 OneNET Studio,使用物模型协议上报 11 项数值属性、
故障码与基站定位。下图是平台侧的实际日志:属性上报返回
code 200,物模型校验通过。
工业设备装到现场后,最怕的是"看起来正常,实际数据全是旧的"。 为此固件内置了设备自诊断:RS485 总线无应答、SIM 不可用、PDP 掉线、 MQTT 反复重连、HTTP 接口连续失败、网口断开等异常会拼成故障码字符串 随每次上报传给云端。
云端后台据此判断设备是否"带病工作"——比如 485 断了但 4G 还通, 数据照样在传,只是全是旧值。不上报故障就会被当成正常, 这是最危险的失效模式。
板载 TFT 同步显示同样的信息,现场不用接串口也能一眼看出问题在哪一级: 网注不上、PDP 起不来、MQTT 连不上,还是后端接口挂了。
固件源码共 22 个源文件,包含射频调度、网络守护、OneNET 接入、 RS485 主从协议、ST7789 驱动等模块,另附设备运行实物图与平台日志截图。