一、核心定位与设计约束
1.1 核心价值
HSM(Hanzi‑Sensor Middleware)是位于 RT-Thread 驱动层与 Modbus 输出层之间的轻量级语义中间件。
核心价值:在 MCU 资源受限(无浮点、无动态内存)条件下,将物理传感数据转化为标准化的语义编码,消除云端乱码风险。
1.2 设计铁律(强制)
以下条款具有强制性,违反任意一条视为设计不合格。
| 铁律 | 说明 |
|---|---|
| 无字符化 | 设备端禁止处理字符串(GB2312/UTF-8),避免编码混乱。 |
| 接口恒定 | Modbus 寄存器固定,防止协议膨胀。 |
| 确定性 | 相同输入特征必须产生相同语义编码,无随机性。 |
| 防变砖 | 规则表更新必须支持断电回滚,防止设备变砖。 |
| 索引上限 | 单 Namespace 内索引 ≤ 4095,预留扩展空间。 |
| 自描述 | 暴露规则版本与 CRC 校验,便于上位机对齐。 |
| 仲裁防抖 | 仲裁器必须实现滞回与冷却,防止高频振荡。 |
| 零堆分配 | 禁止动态内存分配,保证实时性。 |
| 传感器可溯源 | Source_ID 必须通过描述符表定义,禁止匿名传感器。 |
二、系统架构
2.1 架构总览
HSM 采用单向流水线架构,职责边界清晰,避免模块间耦合。
[ 传感器 ] → [ 感知接入层 ] → [ 数据处理层 ] → [ 仲裁器 ] → [ 语义管理层 ] → [ 语义输出层 ] → [ 云端 ]
- 语义输出层:Modbus 寄存器填充。
- 语义管理层:指纹生成、查表映射。
- 仲裁器:解决多传感器冲突,输出唯一语义。
- 数据处理层:特征提取、趋势分析。
- 感知接入层:复用 RT-Thread Sensor 驱动。
三、核心机制:语义编码
3.1 语义编码结构
将版本语义从编码中移除,确保编码的长期稳定性。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| Namespace (4 bit) | Index (12 bit) |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
设计解释:
- Namespace:区分标准语义、厂商语义、系统语义。
- Index:语义索引,指向规则表中的具体条目。
- 无版本位:规则版本变更不影响编码值,通过外部元数据体现。
四、传感器描述符规范
4.1 传感器描述符表
为解决 OEM 现场传感器数量膨胀导致的“ID 语义漂移”问题,强制定义描述符表。
typedef struct {
uint8_t source_id; // 传感器槽位索引 (0~255)
uint16_t sensor_type; // 传感器类型编码 (0x0001=温度)
uint8_t zone; // 区域 (1=室内, 2=室外)
} sensor_desc_t;
const sensor_desc_t sensor_desc_table[] = {
{0, 0x0001, 1}, // ID0: 温度, 室内
{1, 0x0002, 1}, // ID1: 湿度, 室内
{2, 0x0001, 2}, // ID2: 温度, 室外
};
解释:
- zone:辅助信息,供上位机使用。
- sensor_type:用于仲裁器匹配规则表。
- Source_ID:仅作为索引,HSM 内核不关心其物理含义。
五、仲裁器规范
5.1 仲裁优先级
当多个传感器同时触发异常时,输出唯一语义。
| 优先级 | 规则 |
|---|---|
| P0 (最高) | 系统故障(0xFxxx),立即覆盖所有语义。 |
| P1 | 安全相关(过温/过压),遵循“最坏情况”原则。 |
| P2 | 普通业务语义,按权重仲裁。 |
5.2 仲裁器状态机
INIT → IDLE ↔ ACTIVE → ALARM → COOLDOWN → IDLE
关键解释:
- COOLDOWN:高警解除后冷却期,防止频繁切换。
- ALARM:高优先级安全事件,锁定输出。
- ACTIVE:普通业务语义激活。
- IDLE:无事件。
5.3 关键参数(const 存储)
const uint16_t TEMP_HIGH_ENTER = 360; // 36.0℃ 进入过热
const uint16_t TEMP_HIGH_EXIT = 350; // 35.0℃ 退出过热
const uint16_t ARB_DEBOUNCE_MS = 50; // 消抖时间,过滤毛刺
const uint16_t ARB_COOLDOWN_MS = 5000; // 冷却期,防止报警风暴
解释:所有参数存 Flash,不占 RAM。
六、Modbus 接口规范
6.1 寄存器定义
HSM 严禁动态扩展寄存器。
| 地址 | 名称 | 权限 | 说明 |
|---|---|---|---|
| 0x0000 | Semantic_Code | RO | 16 位语义编码 |
| 0x0001 | Severity_Level | RO | 0=Info, 1=Warn, 2=Error |
| 0x0002 | Source_ID | RO | 传感器索引 |
| 0x0003 | Status | RW | Bit 0: Valid Bit 1: Change Flag |
| 0x0004 | Rule_Version | RO | 规则集版本号 |
| 0x0005 | Rule_CRC16 | RO | 规则表完整性校验 |
解释:
- Rule_CRC16:快速校验规则表是否损坏或被篡改。
- Rule_Version:上位机据此加载对应字典。
七、规则表生命周期管理
7.1 Flash 存储布局
引入 Header 结构,杜绝“裸数据”风险。
+-----------------------+
| Header (Magic/CRC/Ver)|
+-----------------------+
| Rule Data |
+-----------------------+
| Rule_Backup |
+-----------------------+
| Pointer (1 Byte) |
+-----------------------+
7.2 原子更新流程
硬件复位(禁止软重启,防止 RAM 残留)。
- 擦除 Backup 区。
- 写入 Header + Rule Data。
- 校验 CRC。
- 修改 Pointer 字节(原子操作)。
八、代码实现规范
| 条款 | 要求 | 解释 |
|---|---|---|
| Volatile | Modbus 寄存器 volatile。 | 防止编译器优化导致上位机读不到更新。 |
| 原子赋值 | 语义编码 16 位一次性写入。 | 防止中断打断导致半个字被读取。 |
| 无递归 | 禁止递归调用。 | 防止栈溢出。 |
| 栈深度 | ≤ 256 字节。 | 适应小内存 MCU。 |
| 常量修饰 | 配置参数必须为 const。 | 节省 RAM,存 Flash。 |
性能边界:
- Modbus 响应 ≤ 10 ms:满足工业实时性。
- 仲裁器延迟 ≤ 100 µs:不含消抖等待。
- 指纹生成 ≤ 200 µs:@72MHz。
- RAM ≤ 512 B:含全局状态与栈。
- Flash ≤ 16 KB:含描述符表与规则表。
九、自检结论
| 检查项 | 状态 | 说明 |
|---|---|---|
| 无字符化 | ✅ | 无字符串处理。 |
| 接口恒定 | ✅ | 仅 6 个寄存器。 |
| 仲裁防抖 | ✅ | 滞回与冷却机制生效。 |
| 传感器治理 | ✅ | 描述符表约束 ID 语义。 |
| 版本外置 | ✅ | 编码稳定,版本元数据独立。 |
| 完整性校验 | ✅ | CRC16 防止规则表损坏。 |
签发:HSM 技术标准委员会
生效日期:2026-05-16


全部评论