ML307C 多接口 4G 工业网关板

面向工业物联网的多接口 4G 通信网关。以 ML307C(4G Cat.1,OpenCPU)为核心, 单板集成蜂窝通信、有线以太网与工业总线,实现现场设备数据采集与远程上云。 4 层 PCB,全自主设计,已打样验证并稳定运行。
ML307C · OpenCPU 4 层 PCB FreeRTOS MQTT / OneNET RS485 · Modbus

项目概况

工业现场的设备大多各自为政:PLC 走 RS485,传感器走模拟量, 远程监控又需要单独拉一条网线。市面上的"DTU"只做单一协议转换, 现场往往要叠好几个模块,接线乱、故障点分散、供电也成问题。

这块板子把三件事做到同一块 110×80mm 的 4 层板上: 4G 无线回传、有线以太网、RS485 工业总线。 向下通过 Modbus RTU 轮询 PLC 采集数据,向上经 MQTT 汇聚到 OneNET 平台, 断网时数据自动落到 TF 卡,恢复后按时间戳补传。

整机由 24V 工业电源供电,内置 18650 锂电 UPS,市电断电时自动切换电池, 保证通信不中断。板载 1.54 寸 TFT 实时显示网络、现场设备与云端连接状态, 现场调试不用接串口。

ML307C 网关板实物运行图
设备实物运行中。TFT 显示网络注册状态、信号强度(-67 dBm)、运营商、 OneNET 连接与云端接收计数,以及 RS485 与网口状态。

硬件设计

电源链

24V 工业输入保护:TVS + PTC + PMOS 防反接 + 稳压钳位 + LC 滤波。

多级降压 24V→5V→3.3V/3.8V→1.8V,满足 VBAT 2A 瞬态供电。

锂电 UPS

TP4056 充电 + XB7608 保护。

市电掉电时自动切换 18650 电池供电,通信不中断。

接口

4G Cat.1(双 SIM)、W5500 以太网、RS485(Modbus RTU)。

TF 卡存储、SPI TFT 本地显示。

主控ML307C-DC-CN(ASR1605,Cortex-R5 @614MHz,OpenCPU)
PCB4 层板,阻抗控制,独立地平面
供电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 秒静默窗口让功放电流回落。长任务(定位)在持锁 期间定期检查是否有更高优先级业务在排队,有就主动让出。

AT 通道压力控制

查 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 卡, 恢复后按序补传。

避免工业现场网络波动导致数据丢失——这是工业场景和消费级 设备最关键的区别之一。

// 射频调度:同一时刻只有一路业务占用模组 if (rf_acquire(RF_SLOT_ONENET, 10000)) { publish_once(); // 发完立刻交还 rf_release(RF_SLOT_ONENET); } // 长任务持锁期间定期检查让位 if ((i % (500 / TICK_MS)) == 0 && rf_yield_check(RF_SLOT_LBS)) { // 有 MQTT 在排队,主动让出射频 return -6; }

云端链路验证

设备通过 MQTT 接入 OneNET Studio,使用物模型协议上报 11 项数值属性、 故障码与基站定位。下图是平台侧的实际日志:属性上报返回 code 200,物模型校验通过。

OneNET 平台设备日志
OneNET 控制台设备日志。可见上行消息、物模型调用(check_property: success) 与 HTTP 推送均返回 200。共 296 条记录。
踩过的坑:OneNET 物模型是严格校验的——报文里只要出现一个 未在控制台登记的标识符,整包都会被拒(错误码 2306), 所有点位数据一起丢失。新增上报字段前必须先在控制台建好对应属性。 固件里为此加了一个编译开关,控制是否上报固件版本号。

自诊断与现场可观测性

工业设备装到现场后,最怕的是"看起来正常,实际数据全是旧的"。 为此固件内置了设备自诊断:RS485 总线无应答、SIM 不可用、PDP 掉线、 MQTT 反复重连、HTTP 接口连续失败、网口断开等异常会拼成故障码字符串 随每次上报传给云端。

云端后台据此判断设备是否"带病工作"——比如 485 断了但 4G 还通, 数据照样在传,只是全是旧值。不上报故障就会被当成正常, 这是最危险的失效模式。

板载 TFT 同步显示同样的信息,现场不用接串口也能一眼看出问题在哪一级: 网注不上、PDP 起不来、MQTT 连不上,还是后端接口挂了。

源码与资料

固件源码共 22 个源文件,包含射频调度、网络守护、OneNET 接入、 RS485 主从协议、ST7789 驱动等模块,另附设备运行实物图与平台日志截图。