docs(产品需求): 屏板源码到手——串口通道协议定版并补状态灯下行
依据屏板固件工程 DTU-LCD(STM32F103ZE + UC1698U)重写 5.16.2 / 5.16.3, v1.5 遗留的"四项未知"全部消解: - 物理层:RS-485 半双工、700000 8N1、软件 DE;APB1 42 MHz 下分频 零误差(BRR=0x3C0)。 - 角色反转:屏板是 Modbus 主站(主动召唤),主机是从站 0x01。 - 帧 A(6 B 召唤):01 03 type key CRC_H CRC_L,KEY_CMD=0 / RT_CMD=1,CRC-16/MODBUS 只覆盖前 4 B 且高字节在前。 - 帧 B(4208 B 应答):3200 显存 + 4 B 状态灯 + 4 B info + 998 B 填充 + 2 B CRC。readme 写 3208 B 与代码实参 4208 B 矛盾,以代码为准 并标注待台架复核。 - 状态灯下行:info[0..3] 为 32 位小端位掩码,ID 0 电源灯恒亮、 ID 1~19 对应 bit1~19;位到业务状态的映射参考源码没有,须自定。 - 键值:KEY_TYPE 0~10,实物仅 7 键(可达 1/2/3/4/7/8/9),且 9/10 语义与参考的 F1 / F1+ENT 冲突,需先裁定。 - 时序:275 ms 周期召唤、200 ms 应答超时、约 5000 s 屏板自复位。 同步改动:5.16 开篇、5.16.1 注、5.16.8 tTimerLCD 行、5.16.9 差异表与 新增约束、5.16.10 判据扩到 15 条、9.13 任务扩到 15 条(新增状态灯映射 与 LOGO 下发,第三批不再解冻 UART4)、5.8 两套 LED 边界、5.6 FR-UI-1 双出口、6.2 口径注、2.4.1 X3、2.5.2 第 20 项、9.1.2、9.12、10.3、12。 版本 v1.5 -> v1.6。
This commit is contained in:
+303
-61
@@ -7,7 +7,7 @@
|
||||
> 待实现项与路线图、验收判据。
|
||||
> **事实来源**:本文所有数值与结论均取自仓库内**受管事实源**(代码、`.ioc`、`.map`、网表分析报告与
|
||||
> 各模块设计文档),凡与其它文档冲突处,以本文标注的权威来源为准。
|
||||
> **版本**:v1.5 **日期**:2026-10-28 **状态**:现状基线(含已实现项 + 待实现项)
|
||||
> **版本**:v1.6 **日期**:2026-10-28 **状态**:现状基线(含已实现项 + 待实现项)
|
||||
> **阅读前提**:建议先读 [`docs/README.md`](../../docs/README.md)(文档索引)与
|
||||
> [`docs/架构设计/项目架构总览.md`](../../docs/架构设计/项目架构总览.md)(全景架构)。
|
||||
> **范围口径:1:1 复刻**——本产品是参考产品 **CLS100**(`Scatter_P_HV03.01_SV01.01`,OMAP-L138
|
||||
@@ -171,7 +171,7 @@ flowchart LR
|
||||
|---|---|---|---|---|
|
||||
| X1 | 双核 ARM + DSP 分工 | OMAP-L138(ARM 跑通信/HMI,DSP 跑保护) | 单核 Cortex-M4F 按任务划分承担 | 芯片形态 |
|
||||
| X2 | 实时操作系统与工具链 | VxWorks 5.x + CCS | FreeRTOS V10.3.1 + Keil ARMCC | 平台形态 |
|
||||
| X3 | 就地屏板(**板件本体**) | 专用屏板:主机侧**无任何屏 / 键 GPIO**,屏与键全在独立板件上(RS-485 通道 + TCP 7003 镜像,§5.16) | 不产屏板:只实现**主机侧链路**(TCP 7003 推流 + 按键回注);RS-485 屏板通道随 §5.10 冻结 | 交付物形态(屏板非本产品交付范围) |
|
||||
| X3 | 就地屏板(**板件本体**) | 专用屏板:主机侧**无任何屏 / 键 GPIO**,屏与键全在独立板件上(**RS-485 屏板通道为主 + TCP 7003 镜像**,§5.16) | 不产屏板:只实现**主机侧链路**(串口屏板通道 + TCP 7003 推流 + 按键回注);**屏板通道独立立项,不随 §5.10 冻结** | 交付物形态(屏板非本产品交付范围) |
|
||||
| X4 | 一次设备接口 | KO / KI 板卡(出口、开入、硬压板) | V0.1 无该硬件(§4.6 H3) | 硬件缺失 |
|
||||
| X5 | 独立计量通道 | 专用计量芯片(电度) | 无(跨转换器无同刻,§4.6 H1) | 硬件缺失 |
|
||||
|
||||
@@ -224,7 +224,7 @@ flowchart LR
|
||||
| 17 | 上行规约 | `Comm/Pub/`、`Comm/Mon/` | **12 种** | 1 种(104) | 🔶 |
|
||||
| 18 | 加密算法 | `Comm/Ecc/` | SM2 / SM3 / ECDSA | 0 | ⬜ |
|
||||
| 19 | 双核分工 | `CLS100_Arm/`、`CLS100_Dsp/` | ARM + DSP | 单核(X1) | — |
|
||||
| 20 | 远端屏与按键链路 | `HMI/RemoeDisp/RemoDispBus.c`、`HMI/Dsp/Key.c`、`HMI/Dsp/Disp_Pub.c` | **串口屏板通道**(显存 3200 B + LED 4 B 下行 / 键号 1~10 上行)+ **TCP 7003 镜像** | 7003 四命令已通;**串口屏板通道整条缺失**;INIT 应答 8 B(参考 29 B)、无断点续传、无链路监视、缺 F1/F2 | 🔶 |
|
||||
| 20 | 远端屏与按键链路 | `HMI/RemoeDisp/RemoDispBus.c`、`HMI/Dsp/Key.c`、`HMI/Dsp/Disp_Pub.c`;屏板侧 `DTU-LCD` | **串口屏板通道**(显存 3200 B + **状态灯 4 B 位掩码**下行 / 键号上行)+ **TCP 7003 镜像** | 7003 四命令已通;**串口屏板通道整条缺失**(协议已按屏板源码定版,见 §5.16.2);INIT 应答 8 B(参考 29 B)、无断点续传、无链路监视、缺 F1/F2 | 🔶 |
|
||||
|
||||
> **读法**:🔶 / ⬜ 行**全部是待办**,逐条对应 §9.1;`—` 只出现在 X1~X5 不可移植项上。
|
||||
> 本表是范围判定的唯一出处,§9 不再重复解释"为什么缺"。
|
||||
@@ -661,10 +661,13 @@ sequenceDiagram
|
||||
|
||||
### 5.6 UI 与远程显示(FR-UI)✅
|
||||
|
||||
**FR-UI-1 离屏渲染 + 远程推流**
|
||||
- 需求:MCU 无物理屏幕,UI 以 160×160 单色位图(1bpp,3200 B)经 TCP :7003 推送到远端客户端渲染;远端按键回注 UI。
|
||||
- 实现:LVGL 160×160 1bpp 离屏渲染到 `g_ui_fbuf`(3200 B)→ `ui_net_sink` 经 RemoDispBus 推流;远端按键经协议注入。
|
||||
- 判据:DTU-RemoteLCD 连 7003 出图(160×160 1bpp)+ 远端菜单导航可用。
|
||||
**FR-UI-1 离屏渲染 + 双出口推流**
|
||||
- 需求:MCU 无物理屏幕,UI 以 160×160 单色位图(1bpp,3200 B)渲染到离屏显存,
|
||||
经**两个出口**送出:**串口屏板通道**(主,§5.16.2)与 **TCP :7003**(镜像);两路的按键都回注 UI。
|
||||
- 实现:LVGL 160×160 1bpp 离屏渲染到 `g_ui_fbuf`(3200 B)→ `ui_net_sink` 经 RemoDispBus 推流;
|
||||
远端按键经协议注入。**串口屏板通道尚未实现**(§5.16.9 第 11 条)。
|
||||
- 判据:DTU-RemoteLCD 连 7003 出图(160×160 1bpp)+ 远端菜单导航可用;
|
||||
屏板实物接入后 275 ms 节拍出图 + 状态灯正确(§5.16.10 第 8~15 条)。
|
||||
|
||||
**FR-UI-2 菜单与内容页**
|
||||
- 需求:42 节点层级菜单(最大 4 级)+ 内容页(装置信息/交流量/直流量等)。
|
||||
@@ -704,6 +707,10 @@ sequenceDiagram
|
||||
- 实现:`defaultTask` 循环驱动(闪烁指示系统活跃)。
|
||||
- 判据:目检 6 路 LED 随系统状态变化。
|
||||
|
||||
> ⚠ **本节只讲主板 LED。** 屏板上另有 **20 路状态指示灯**(ID 0 电源常亮 + ID 1~19 位掩码),
|
||||
> 由主机每帧下发 4 B 控制,属**另一套输出**,规格见 §5.16.3 ①。
|
||||
> 两套 LED 的"位 → 业务状态"语义**各自独立**,不要混用同一个状态表。
|
||||
|
||||
### 5.9 ADC 采集与标定(FR-ADC)✅
|
||||
|
||||
**FR-ADC-1 采样节拍与触发**
|
||||
@@ -973,6 +980,11 @@ sequenceDiagram
|
||||
> (`LCD_LED_Update` 变化驱动 + `WriteScreenByByte` 500 ms 兜底)和**网络显示总线**(TCP 7003)。
|
||||
> 也就是说"显示信息不只走网络,还走串口"。**本产品目前只有网络这一路**,串口屏板通道整条缺失
|
||||
> (§5.16.9 第 11 条),这是本项复刻的最大缺口——没有它,产品无法脱离 PC 独立带屏运行。
|
||||
>
|
||||
> **屏板固件已到手(2026-10-28)**:屏板侧源码在 `D:\Code\DTU Code\DTU-LCD`(STM32F103ZE +
|
||||
> UC1698U 160×160 单色 + **20 路状态指示灯** + 7 个物理按键),**物理层与帧格式全部可从代码确定**。
|
||||
> 原"四项未知"(波特率 / 帧格式 / 方向控制 / 分片)**已全部消解** → 见 §5.16.2、§5.16.3。
|
||||
> 该链路**不是可选项**:屏板是**主动召唤方**,主机不应答则屏板**无画面、无灯、无键**。
|
||||
|
||||
#### 5.16.1 一份显存、两个出口(串口为主,网络为镜像)
|
||||
|
||||
@@ -995,7 +1007,10 @@ sequenceDiagram
|
||||
|
||||
**串口通道的物理层与协议,交付源码里看不到**——屏板侧的 5 个入口全是**未实现的外部符号**
|
||||
(`KeyGet` / `WriteScreenByByte` / `LCD_LED_Update` / `getRs485Key` / `anyNewKey`),
|
||||
`Release/` 下的 `.o` 与 `.out` 由更完整的树编译而来。能确定的只有**调用契约**:
|
||||
`Release/` 下的 `.o` 与 `.out` 由更完整的树编译而来。能确定的只有**调用契约**(协议本身已由屏板源码补齐,见 §5.16.2):
|
||||
|
||||
> 注:上表"物理键号 `1~10`"是**参考主机侧的假设**。屏板固件实测只有 **7 个物理键**,
|
||||
> 键值 `1~9` 有入口、`10` 无入口,且 `9`/`10` 语义与参考的 `F1`/`F1|ENT` **不同**(§5.16.3 ②)。
|
||||
|
||||
| 契约项 | 已确定的内容 | 依据 |
|
||||
|---|---|---|
|
||||
@@ -1009,40 +1024,235 @@ sequenceDiagram
|
||||
| 背光 / 对比度 | `Lcd_BackLight()`(`Lcd_BKOn/Lcd_BKOff` 走 GPIO)、`Lcd_SetContrast(值, 亮)` | `omapl138_lcd.c:240-247`、`Disp_Interface.c:3281` |
|
||||
| 屏板初始化 | `Lcd_init_display(0xC1F00000)` 由 `LocalDisp_StartTask()` 调用,**不经过任何 UART 打开动作** | `Disp_Main.c:56` |
|
||||
|
||||
> ⚠ **不能从源码推出的四项**(实施前必须实测或取得屏板固件):① 波特率与数据格式;
|
||||
> ② 帧头 / 长度 / 校验(是否有 CRC、哪种);③ 半双工方向控制方式(硬件自动 / 软件 DE);
|
||||
> ④ 3200 B 一帧是否需要分片与应答。**在拿到这些之前,任何"按参考协议实现"的说法都是猜的。**
|
||||
> ⚠ **原"四项未知"已由屏板固件消解**(2026-10-28,实测值见 §5.16.2):
|
||||
> ① 波特率 **700000 8N1**;② 无帧头,**整帧定长 + 尾部 CRC-16/MODBUS**;
|
||||
> ③ **软件 DE**(屏板侧 PA1,低 = 发送);④ **不分片**——一帧一整屏,屏板召唤、主机应答。
|
||||
> 上表保留作为**取证过程**,说明"只看参考主机侧源码能确定什么、不能确定什么",不是待办。
|
||||
|
||||
#### 5.16.2 本产品的串口通道(待建)
|
||||
#### 5.16.2 串口通道:物理层与帧格式(屏板源码实测)
|
||||
|
||||
**要求**:与参考同构——一份显存、两个出口。串口通道负责**直连屏板**,网络通道负责**远程/调试镜像**,
|
||||
两者并发、互不阻塞。端口资源在 V0.1 上是充足的:
|
||||
屏板固件工程 `DTU-LCD` 已在手(STM32F103ZE / 512 KB Flash / 64 KB RAM / 72 MHz,UC1698U 160×160 单色),
|
||||
**链路协议逐字节可确定**。原"四项未知"全部消解,本节即为**主机侧必须实现的契约**。
|
||||
|
||||
| 串口 | 引脚 | 当前用途 | 能否给屏板 |
|
||||
> ⚠ **角色与直觉相反:屏板是 Modbus 主站,主机是从站。** 屏板主动发请求,主机在**请求后**应答;
|
||||
> 主机**从不主动推送**,也不允许主动推送(半双工总线,谁先说谁占用)。
|
||||
> 这与 §5.16.4 的 TCP 7003 通道方向相反——网络通道是**客户端召唤**,串口通道是**屏板召唤**。
|
||||
|
||||
**物理层**
|
||||
|
||||
| 项 | 屏板侧实测值 | 依据 |
|
||||
|---|---|---|
|
||||
| 接口 | RS-485 **半双工** | `rs485.c` |
|
||||
| 引脚 | TX = PA2、RX = PA3、**DE = PA1** | `rs485.h` |
|
||||
| DE 极性 | **低 = 发送,高 = 接收** | `RS485_SEND_ENABLE()` 拉低、`RS485_RECEIVE_ENABLE()` 拉高 |
|
||||
| 波特率 | **700000** bps | `#define BAUDRATE 700000` |
|
||||
| 数据格式 | 8 数据位 / 无校验 / 1 停止位,无流控,**16 倍过采样** | `rs485.c` 初始化 |
|
||||
| 接收 | `HAL_UARTEx_ReceiveToIdle_IT`(空闲断帧),**DMA 版本被注释掉** | `rs485.c:192-195` |
|
||||
| 发送 | `HAL_UART_Transmit(..., 1000)` 阻塞发完,随即切回接收 | `RS485_SendBuff()` |
|
||||
| 缓冲 | RX **4208 B**、TX **8 B** | `UART_RX_LEN` / `UART_TX_LEN` |
|
||||
|
||||
> **700 kbaud 在本产品主控上零误差**:APB1 = 42 MHz(`PLLM=4 / PLLN=168 / PLLP=2 / APB1÷4`,
|
||||
> 见 `Src/main.c` 时钟配置),`42 000 000 / 700 000 = 60` 整除 → `USARTDIV = 60.0`、`BRR = 0x3C0`,
|
||||
> 误差 **0 %**。若改时钟树或改用 HSI,必须重算——700 kbaud 下 2 % 误差已足以丢帧。
|
||||
> 收发器须选 **≥ 1 Mbps** 档(3485 / 自动方向类),700 kbaud 不是普通 485 的常规工况。
|
||||
|
||||
**帧 A:召唤 / 按键(屏板 → 主机,固定 6 B)**
|
||||
|
||||
| 偏移 | 长度 | 字段 | 取值 |
|
||||
|---|---|---|---|
|
||||
| USART1 | PA9 / PA10 | 调试日志(115200,单写者) | ❌ 占用 |
|
||||
| UART4 | PC10 / PC11 / PA15(DE) | RS-485(对下采集簇,**冻结**) | ⚠ 硬件最合适(自带 DE),但与冻结簇争用 |
|
||||
| UART5 | PC12 / PD2 | 初始化但**未接** | ✅ 空闲 |
|
||||
| USART2 | PD5 / PD6 | 初始化但**未接** | ✅ 空闲 |
|
||||
| USART3 | PB10 / PB11 | 初始化但**未接** | ✅ 空闲 |
|
||||
| 0 | 1 | 从站地址 | 固定 `0x01`(**主机的从站地址**,不是屏板地址) |
|
||||
| 1 | 1 | 功能码 | 固定 `0x03`(读保持寄存器) |
|
||||
| 2 | 1 | 命令类型 | `0x00` = `KEY_CMD`(按键事件,**立即**召唤)<br>`0x01` = `RT_CMD`(周期刷新,275 ms 一次) |
|
||||
| 3 | 1 | 按键值 | `KEY_CMD` 时有效(见 §5.16.3 键值表);`RT_CMD` 时**恒为 `0`**(按键发完即清 `key_bk`,见 `RS485_Process()`) |
|
||||
| 4 | 1 | CRC-16 **高**字节 | CRC-16/MODBUS |
|
||||
| 5 | 1 | CRC-16 **低**字节 | 同上 |
|
||||
|
||||
**默认选型**:USART3(PB10/PB11)——不与调试口、不与 RS-485 争用,且外设实例独立。
|
||||
若屏板实物是 RS-485 半双工,则改 UART4 并**先解冻该簇**(两者不能同时占用 PC10/PC11)。
|
||||
CRC-16/MODBUS(多项式 `0xA001` 反转式、初值 `0xFFFF`、查表法 `auchCRCHi[]`/`auchCRCLo[]`),
|
||||
**只覆盖前 4 字节**,**高字节在前**(`cmdbuf[4] = crc>>8`、`cmdbuf[5] = crc`)。
|
||||
|
||||
> 交付源码里 `Key_Rs485_Process()` 的名字说明参考的屏板是 **RS-485** 半双工;
|
||||
> 但 `getRs485Key()` 无实现,"485" 也可能只是历史命名。**选型前先确认屏板实物接口电平**。
|
||||
**帧 B:图像应答(主机 → 屏板,固定 4208 B)**
|
||||
|
||||
#### 5.16.3 参考实现的屏板侧接口一览
|
||||
| 偏移 | 长度 | 字段 | 说明 |
|
||||
|---|---|---|---|
|
||||
| 0 | 3200 | `Picture[]` | 显存位图:160 行 × **20 B/行**,**1 bpp,MSB 在前**,bit=1 → 白 |
|
||||
| 3200 | 4 | `info[0..3]` | 普通图:**LED 状态,32 位位掩码,小端**(`info[0]` = bit0~7)<br>LOGO 图:`info[0..1]` = 宽、`info[2..3]` = 高(均大端) |
|
||||
| 3204 | 1 | `info[4]` | LOGO 魔数高字节 `0x89` |
|
||||
| 3205 | 1 | `info[5]` | LOGO 魔数低字节 `0x45` |
|
||||
| 3206 | 2 | `info[6..7]` | 保留,屏板不读 |
|
||||
| 3208 | 998 | 保留填充 | 屏板不读,**但参与 CRC 计算**,须固定填充(建议 `0x00`) |
|
||||
| 4206 | 2 | CRC-16 | 覆盖 `[0, 4205]`,**高字节在前** |
|
||||
|
||||
| 项 | 参考行为 |
|
||||
> ⚠ **帧长以代码为准:4208 B,不是 3208 B。** 屏板 readme 与 `BMP_LEN` 都写"3208 字节",
|
||||
> 但接收侧实参是 `Check_CRC(DR, UART_RX_LEN)`,`UART_RX_LEN = 4208` → CRC 取 `DR[4206]/DR[4207]`、
|
||||
> 覆盖 `DR[0..4205]`;`rs485.h` 注释亦为"接收缓冲区长度,**与 Modbus 数据帧长度一致**"。
|
||||
> 若主机只发 3210 B,屏板会在 `DR[4206]` 处读到陈旧字节,**CRC 必失败并静默丢弃**。
|
||||
> 有效载荷只有前 3208 B,其后 998 B 为凑齐 CRC 窗口的填充。**此项须台架实测复核后固化。**
|
||||
|
||||
> ⚠ **应答帧不是合法 Modbus RTU 响应**:没有地址、没有功能码、没有字节数域,是一段裸二进制块。
|
||||
> 因此**不能套用现成 Modbus 从站栈**,只能按上表手工组帧。
|
||||
|
||||
> ⚠ **同一 4 字节双解释**:`info[0..3]` 在普通图里是 LED 位掩码、在 LOGO 图里是宽高。
|
||||
> 区分只靠 `info[4..5] == 0x89 0x45`。**先判魔数再解释这 4 字节**,顺序不能反。
|
||||
|
||||
**时序与预算**
|
||||
|
||||
| 参数 | 屏板侧常量 | 实际时间 | 含义 |
|
||||
|---|---|---|---|
|
||||
| 基准节拍 | 5 ms 定时器 | — | `Process_Count()` 每 5 ms 递增 |
|
||||
| 周期召唤 | `RS485_RT_COUNT_MAX = 55` | **275 ms** | 无按键时每 275 ms 召唤一次 |
|
||||
| 应答超时 | `RS485_ACK_COUNT_MAX = 40` | **200 ms** | 发帧后 200 ms 未收齐 → 本次超时 |
|
||||
| 连续超时 | `RS485_ACK_OVERTIME_MAX = 5` | 5 次 | 连续 5 次超时 → 强制允许重发(**不重启串口**,重初始化被注释) |
|
||||
| 屏板自复位 | `sysRunTime > 1 000 000` | **≈5000 s(83 min)** | 屏板**自己**无条件 `HAL_NVIC_SystemReset()` |
|
||||
|
||||
**200 ms 是硬指标**:700 kbaud 8N1 → 10 bit/字节 → 4208 B ≈ 42 080 bit ≈ **60.1 ms**,
|
||||
占预算 **30 %**,留给"取显存快照 + 组帧"约 140 ms,宽裕。
|
||||
但若主机把整帧拆成多次 `HAL_UART_Transmit` 且中间被高优先级任务抢占,很容易越线——
|
||||
**建议一次性 DMA 发送 + 发送完成中断,不要逐块阻塞发**。
|
||||
|
||||
**主机侧端口选型**
|
||||
|
||||
| 串口 | 引脚 | 当前用途 | 用于屏板 |
|
||||
|---|---|---|---|
|
||||
| USART1 | PA9 / PA10 | 调试日志 115200(单写者) | ❌ 占用 |
|
||||
| UART4 | PC10 / PC11 + **PA15(DE)** | RS-485 采集簇(**冻结**) | ⚠ 唯一自带硬件 DE 的实例,但与冻结簇争用 PC10/PC11 |
|
||||
| UART5 | PC12 / PD2 | 已初始化、未接 | ✅ 空闲,需另配 DE GPIO |
|
||||
| USART2 | PD5 / PD6 | 已初始化、未接 | ✅ 空闲,需另配 DE GPIO |
|
||||
| USART3 | PB10 / PB11 | 已初始化、未接 | ✅ 空闲,需另配 DE GPIO |
|
||||
|
||||
**默认选型:USART3(PB10/PB11)+ 一个空闲 GPIO 作 DE**——不与调试口、不与 RS-485 采集簇争用,
|
||||
外设实例独立,且同挂 APB1(42 MHz,分频零误差)。
|
||||
|
||||
> ⚠ **DE 极性不可照抄屏板**。屏板的"低=发"是**它自己那套收发器**的接法;主机侧极性由本板收发器决定。
|
||||
> 若用高有效 DE 的器件,软件必须取反,或改用自动方向芯片(免 DE)。**这是最容易接反、且症状最像"协议不对"的一处。**
|
||||
|
||||
> ⚠ 主机 RX 侧要能吃下 **4208 B 整帧**(缓冲 ≥ 4208 B + 空闲中断断帧)。
|
||||
> 且需处理**自发自收**:半双工总线上自己的 4208 B 会回灌 RX(若收发器带 echo 或 DE 时序不对),
|
||||
> 必须丢弃而非当作帧 A 解析。
|
||||
|
||||
#### 5.16.3 屏板侧行为:状态灯 / 按键 / 背光 / LOGO
|
||||
|
||||
本节描述**屏板固件实际做什么**——决定主机侧要下发什么、以及哪些语义必须由产品自己定义。
|
||||
|
||||
**① 状态指示灯(4 B 位掩码下行)**
|
||||
|
||||
屏板有 **20 路 LED**,由主机每帧的 `info[0..3]` 控制。解码规则(`LED_Printf`):
|
||||
|
||||
```c
|
||||
leddata = (ledbuf[3]<<24) | (ledbuf[2]<<16) | (ledbuf[1]<<8) | ledbuf[0]; /* 32 位小端 */
|
||||
LED_POW(LED_ON); /* ID 0 无条件常亮 */
|
||||
for (i = 1; i < LED_COUNT; i++) /* LED_COUNT = 20 */
|
||||
LED_Set(i, (leddata & (1UL << i)) ? LED_ON : LED_OFF);
|
||||
```
|
||||
|
||||
- **ID 0 = 电源灯,硬件常亮,不受位掩码控制**(`leddata` 的 bit0 被忽略)。
|
||||
- **ID 1~19 一一对应 bit1~bit19**;bit20~bit31 未使用,填 0。
|
||||
- 全部**低电平点亮**(`LED_ON` = 低)、推挽输出、内部上拉、高速模式。
|
||||
- **只在普通图像帧到达时刷新**;LOGO 帧走另一分支,**不动 LED**。
|
||||
|
||||
屏板侧 LED 引脚表(`led_config[20]`,仅备查——主机不直接驱动):
|
||||
|
||||
| ID | 引脚 | 备注 | ID | 引脚 | ID | 引脚 | ID | 引脚 |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| 0 | PC8 | 电源灯,常亮 | 5 | PC11 | 10 | PC7 | 15 | PC12 |
|
||||
| 1 | PC9 | 运行灯 | 6 | PD0 | 11 | PA8 | 16 | PD1 |
|
||||
| 2 | PA9 | | 7 | PD2 | 12 | PA10 | 17 | PD3 |
|
||||
| 3 | PA11 | | 8 | PD4 | 13 | PA12 | 18 | PD5 |
|
||||
| 4 | PA15 | | 9 | PD6 | 14 | PC10 | 19 | PD7 |
|
||||
|
||||
**对本产品的含义**:§5.8 的主板 6 路 LED(`LED1~6`)与屏板 20 路指示灯是**两套独立输出**,
|
||||
语义不同——主板 LED 表"设备自身状态",屏板指示灯是"操作员面前的状态/告警灯组"。
|
||||
|
||||
> ⚠ **位掩码 → 业务状态的映射表,参考源码里没有**。参考的 `LCD_LED_Update(ptr, 3200, ledbuf, 4)`
|
||||
> 只证明"主机侧填这 4 B",填哪几位对应哪个业务状态在**未实现的屏板 BSP 里**。
|
||||
> 因此"哪几号灯表哪个状态"**必须由本产品定义**(建议按 §5.8 的 6 路语义扩展到 19 路,
|
||||
> 并保留 1~2 路作屏板自检/通信状态)。**这是本项唯一需要"新设计"而非"照抄"的地方。**
|
||||
|
||||
**② 按键上行**
|
||||
|
||||
| 项 | 屏板侧实测 |
|
||||
|---|---|
|
||||
| 送屏(变化驱动) | `LCD_LED_Update(显存 3200 B, LED 4 B)`——一次推 160×160 1bpp 显存 + 4 字节面板 LED;**非周期**,仅当 `anyNewKey() \|\| LCD_UPDATE_FLAG` 时触发 |
|
||||
| 送屏(周期兜底) | `WriteScreenByByte(byLcdMemory)`——**按字节**写屏,500 ms 一次;函数名暗示逐字节串行传输,而非内存映射 |
|
||||
| 收键 | `getRs485Key()` 轮询返回物理键号 `1~10`,映射到逻辑键值:`1`=ENT `2`=U `3`=D `4`=ESC `5`=ADD `6`=SUB `7`=L `8`=R `9`=F1 `10`=F1\|ENT |
|
||||
| 去抖 | `CN_KEY_TIMES_ONE=2`(单击)/ `CN_KEY_TIMES_TWO=12`(连击);状态机 `EN_KEY_FLAG_NULL → SAM → NEW` |
|
||||
| 背光 | 有键 `MenuProc_Have_Key()` 点亮;空闲 **120 s** `MenuProc_TurnOff_Light()` 熄灭;上电先 `Lcd_BackLight(FALSE)` 再 `TRUE` |
|
||||
| 面板 LED | `WritePanelLED(pbyLedFlag)`(`SR1200_peri.c:362` 已实现)+ `LedOutput595()`(74HC595 移位输出) |
|
||||
| 任务 | `tKey`(prio 109 / 栈 0x400,只跑 `Key_Rs485_Process` 轮询);`tDisp`(prio 110 / 栈 0x9000,界面 + 推屏) |
|
||||
| 库 | MultiButton,只绑 `BTN_SINGLE_CLICK`(单击事件) |
|
||||
| 扫描 | 5 ms 定时器内 `Button_Ticks()` |
|
||||
| 电气 | 输入模式、**无内部上拉/下拉**(依赖外部)、低电平有效 |
|
||||
| 引脚 | `KEY_ENTER`=PD12、`KEY_UP`=PD11、`KEY_DOWN`=PD10、`KEY_LEFT`=PD13、`KEY_RIGHT`=PD8、`KEY_ESC`=PB15、`KEY_RESET`=PB3 |
|
||||
| JTAG | PB3 需 `__HAL_AFIO_REMAP_SWJ_NOJTAG()` 才能当普通 GPIO |
|
||||
| 回调 | 任意键按下 → `BackLight_ON()` + 更新 `keyStatus`,主循环转交 `RS485_Process()` |
|
||||
|
||||
键值枚举(`KEY_TYPE`,**即帧 A 偏移 3 的 `key` 字节**):
|
||||
|
||||
| 值 | 名称 | 值 | 名称 |
|
||||
|---|---|---|---|
|
||||
| 0 | `KEY_NONE`(无键) | 5 | `KEY_ADD` |
|
||||
| 1 | `KEY_ENTER` | 6 | `KEY_DEC` |
|
||||
| 2 | `KEY_UP` | 7 | `KEY_LEFT` |
|
||||
| 3 | `KEY_DOWN` | 8 | `KEY_RIGHT` |
|
||||
| 4 | `KEY_ESC` | 9 | `KEY_RESET` |
|
||||
| | | 10 | `KEY_FACTORY` |
|
||||
|
||||
> ⚠ **两套键号只在 1~8 对齐,9/10 语义不同**,必须显式建映射:
|
||||
>
|
||||
> | 语义 | 屏板 `KEY_TYPE`(帧 A 的 `key`) | 参考主机 `getRs485Key()` 物理键号 |
|
||||
> |---|---|---|
|
||||
> | 确认 ENT | 1 | 1 |
|
||||
> | 上 UP | 2 | 2 |
|
||||
> | 下 DOWN | 3 | 3 |
|
||||
> | 取消 ESC | 4 | 4 |
|
||||
> | 加 ADD | 5 | 5 |
|
||||
> | 减 SUB | 6 | 6 |
|
||||
> | 左 LEFT | 7 | 7 |
|
||||
> | 右 RIGHT | 8 | 8 |
|
||||
> | **9** | **`KEY_RESET`(复位键)** | **F1** |
|
||||
> | **10** | **`KEY_FACTORY`(工厂模式键)** | **`F1\|ENT` 组合** |
|
||||
>
|
||||
> 帧 A 的 `key` 字节**只能按屏板枚举解释**。主机收到 9/10 时**不得**按 `F1` / `F1|ENT` 处理。
|
||||
> 若产品要求保留 F1/F2 语义,只有两条路:**改屏板固件** 或 **在主机侧加语义映射表**——二者选一,**须先定**。
|
||||
|
||||
> ⚠ **`key_configs[]` 只有 7 项,且与枚举不自洽**:表内第 7 项为 `{PB3, KEY_RESET}`(注释却写"加键");
|
||||
> 枚举有 `KEY_ADD`(5) / `KEY_DEC`(6) / `KEY_FACTORY`(10),但 **`key_configs[]` 没有映射任何 ADD/DEC 物理键**。
|
||||
> 即**实物只有 7 个物理键**(上/下/左/右/确认/取消/复位),ADD/DEC/FACTORY 有枚举无入口。
|
||||
> 屏板 readme 的按键表列了 8 个键,与代码不符——**以 `key_configs[]` 的 7 项为准**。
|
||||
> 这直接影响 §5.16.9 第 8 条"补 F1/F2"是否成立:**屏板上根本没有 F1/F2 物理键**,
|
||||
> 网络通道的 8 键表是给**远程工具**用的;串口通道**只可能收到 `1/2/3/4/7/8/9`** 这 7 个值
|
||||
> (`5`/`6`/`10` 有枚举无入口)。
|
||||
|
||||
**③ 背光**
|
||||
|
||||
- 任意键按下 → `BackLight_ON()`(按键回调里,不在 5 ms 定时器内)。
|
||||
- 5 ms 定时器每拍调 `BackLight_Close()`,超时熄灭(时长在 `160160D.C`,**屏板自管**)。
|
||||
- LOGO 帧到达时也会 `BackLight_ON()`。
|
||||
- **主机侧不参与背光控制**——参考主机的 `Lcd_BackLight()` / 空闲 120 s 熄灭在**主机 BSP**里,
|
||||
而屏板固件自己就管背光,**两条路径不能同时启用**。本产品按"屏板自管"实现,主机不做(§5.16.9 第 14 条)。
|
||||
|
||||
**④ LOGO 与 Flash**
|
||||
|
||||
- 魔数命中(`info[4]==0x89 && info[5]==0x45`)→ 按 LOGO 处理:
|
||||
`Picture` 存入屏板 Flash **`0x0803F000`(扇区 126)**,宽高取 `info[0..1]` / `info[2..3]`(大端),
|
||||
然后点背光、`ClearScreen()`、`LOGO_Printf()`、延时 **2 s**(4 × `delay_ms(500)`)。
|
||||
- 上电时 `BMP_Get()` 从同一地址读回并显示。
|
||||
- **LOGO 帧不刷新 LED、不进入常规画面**;一帧 LOGO 会**永久覆盖**屏板上一次的 LOGO。
|
||||
- 主机侧要提供"下发 LOGO"的一次性操作(建议放在屏板联调/出厂配置流程,不进常规刷新循环)。
|
||||
|
||||
**⑤ 屏板自身的健壮性机制**
|
||||
|
||||
| 机制 | 实现 | 对本产品的影响 |
|
||||
|---|---|---|
|
||||
| CRC 错计数 | 连续 ≥3 次错 → 计数清零(**重初始化串口被注释掉**) | 错帧静默丢弃,链路**不会自愈**,只能靠下一次召唤重试 |
|
||||
| 应答超时 | 200 ms × 连续 5 次 → 强制允许重发 | 主机长时间不应答**不会锁死**屏板,恢复后自动续上 |
|
||||
| 系统自复位 | `sysRunTime > 1 000 000`(≈5000 s)→ `HAL_NVIC_SystemReset()` | **每 83 分钟屏板重启一次**,约 1 s 空窗 |
|
||||
| 看门狗 | 5 ms 定时器内 `Clear_Watchdog()` | 主循环卡死 → 屏板复位 |
|
||||
| DMA 接收 | 屏板提交记录明写"DMA 接收的问题没有解决" | 长帧接收可靠性**未经充分验证**,台架必须压测 |
|
||||
|
||||
> ⚠ **5000 s 周期性自复位必须被主机容忍**:复位期间屏板约 1 s 不响应召唤。
|
||||
> 主机的链路监视**不能**把这种周期性空窗判成"屏板掉线",更不能联动告警/保护。
|
||||
> 判据建议:连续 **≥ 10 s** 无任何应答才置"屏板离线"。
|
||||
|
||||
**待与屏板固件方确认的 5 项**(不影响本产品先开工,但验收前必须闭环):
|
||||
|
||||
1. 线上一帧到底是 **4208 B**(代码实参)还是 **3210 B**(readme + `BMP_LEN`)——决定主机发多少字节。
|
||||
2. `Check_CRC` 用缓冲区容量而非实际接收长度,**短帧会被误判**;是否计划改为传 `Size`。
|
||||
3. 键值 9 / 10 是否要改成 `F1` / `F1|ENT`(对齐参考),还是保持"复位 / 工厂"语义。
|
||||
4. `key_configs[]` 是否要补 ADD / DEC 物理键(当前 7 键,枚举 11 项)。
|
||||
5. 屏板 4208 B 接收缓冲与 700 kbaud 在长线(> 50 m)下的误码率实测数据。
|
||||
|
||||
#### 5.16.4 链路 B 帧格式(逐字节)
|
||||
|
||||
@@ -1126,7 +1336,7 @@ sequenceDiagram
|
||||
|
||||
| 定时器 | 周期 | 作用 |
|
||||
|---|---|---|
|
||||
| `tTimerLCD` | **500 ms** | **串口屏板通道**的周期兜底节拍(`WriteScreenByByte`);本产品待建(§5.16.2) |
|
||||
| `tTimerLCD` | **500 ms** | 参考主机侧**串口屏板通道**的周期兜底节拍(`WriteScreenByByte`)。<br>⚠ 本产品**不照抄**:屏板固件自己按 **275 ms** 主动召唤(§5.16.2),主机只需"**来一帧答一帧**",无需自带节拍 |
|
||||
| `tTimerComBrk` | **1 分钟** | 通信中断判定;**每收到任一帧、每次发送成功**都重置 |
|
||||
| `tTimerAbandon` | **200 ms** | 发送未完成时的放弃窗口 |
|
||||
|
||||
@@ -1156,18 +1366,28 @@ sequenceDiagram
|
||||
| 5 | 越界语义 | `>= 3200` → `-2` 不发 | 无 | 补 |
|
||||
| 6 | 链路监视 | `tTimerComBrk` 1 分钟 | 无 | 补(掉线判定 / 重连驱动) |
|
||||
| 7 | 发送重试 | BUSY + 200 ms 放弃 | 依赖 `net_send` 阻塞模型 | 评估是否需独立实现 |
|
||||
| 8 | 键值集 | 8 键(含 F1 / F2) | 6 键(无 F1 / F2) | 补 F1 / F2 |
|
||||
| 8 | 键值集(网络通道) | 8 键(含 F1 / F2) | 6 键(无 F1 / F2) | 补 F1 / F2;**仅网络通道**——屏板无 F1/F2 物理键(§5.16.3 ②) |
|
||||
| 9 | 任务模型 | 独立任务 prio 111 / 栈 212 KB | `uiTask` 10 ms 轮询(prio BelowNormal / 16 KB) | **形态差异,不追平**(X1 / X2) |
|
||||
| 10 | 接收侧 CRC | 仅 LCDMEM / KEY 校验 | 全帧校验 | **本产品更严,保留** |
|
||||
| 11 | **串口屏板通道** | **有**:显存 3200 B + 面板 LED 4 B 下行、物理键号 1~10 上行,变化驱动 + 500 ms 兜底 | **无**(只有 7003 网络通道) | **新建**,见 §9.13 第 10~13 条 |
|
||||
| 11 | **串口屏板通道** | **有**:显存 3200 B + 状态灯 4 B 下行、键号上行,变化驱动 + 500 ms 兜底 | **无**(只有 7003 网络通道) | **新建**,按 §5.16.2 逐字节实现,见 §9.13 |
|
||||
| 12 | 双出口并发 | 同一份显存同时喂串口与网络,互不阻塞 | 只有网络一个出口 | 随第 11 条一并实现 |
|
||||
| 13 | 面板指示灯 | 屏板上的指示灯组(`WritePanelLED` / `ledbuf 4 B`) | 主板 6 路 GPIO LED(`LED1~6`) | **语义不同**:本产品无屏板指示灯,主板 LED 保留 |
|
||||
| 14 | 背光 / 对比度 | `Lcd_BackLight` + `Lcd_SetContrast` + 空闲 120 s 熄灭 | 无(远端渲染,无背光概念) | 随串口通道一并决定(屏板自管则不做) |
|
||||
| 13 | 屏板状态指示灯 | 20 路(ID 0 电源常亮 + ID 1~19 位掩码),**4 B 小端**随每帧下发 | **无**;主板另有 6 路 GPIO LED(`LED1~6`) | **新建**;"位 → 业务状态"映射须自定(参考源码无此表,§5.16.3 ①) |
|
||||
| 14 | 背光 / 对比度 | 主机 BSP 有 `Lcd_BackLight` / `Lcd_SetContrast` + 空闲 120 s 熄灭 | 无 | **不做**——屏板固件自管背光,两条路径不能同时启用 |
|
||||
|
||||
**来自屏板固件的新增约束(参考主机侧源码里看不出来,但对实现是硬约束)**:
|
||||
|
||||
- **角色反转**:屏板是 **Modbus 主站(主动召唤)**,主机是**从站 `0x01`**;与网络通道"客户端召唤"方向相反。
|
||||
- **帧长 4208 B**(有效载荷 3208 B + 998 B 填充 + 2 B CRC),不是 readme 写的 3208 B(§5.16.2)。
|
||||
- **700000 8N1**,软件 DE;主机侧 DE 极性由本板收发器决定,**不可照抄屏板**。
|
||||
- **屏板每 ≈5000 s 自复位一次**,约 1 s 空窗;主机链路监视须容忍(建议连续 ≥10 s 无应答才判离线)。
|
||||
- **屏板只有 7 个物理键**,键值 `9`/`10` 是"复位 / 工厂",与参考主机的 `F1` / `F1|ENT` **语义不同**。
|
||||
|
||||
> 第 1 / 3 / 4 / 5 / 8 条是**客户端可见的报文口径差异**——现有 `DTU-RemoteLCD` 按 8 B INIT 实现,
|
||||
> 补 29 B 后**客户端必须同步改**,否则会错位解析。这是本项复刻唯一的跨端风险点。
|
||||
>
|
||||
> 第 11 / 12 条是**整条链路缺失**,不是报文细节差异——它决定了本产品能否脱离 PC 独立带屏运行。
|
||||
> 第 11 / 12 / 13 条是**整条链路缺失**,不是报文细节差异——它决定了本产品能否脱离 PC 独立带屏运行。
|
||||
>
|
||||
> 第 14 条从"待决定"改为**已决定不做**:屏板固件自己管背光与超时熄灭,主机再插一手会打架。
|
||||
|
||||
#### 5.16.10 复刻完成判据
|
||||
|
||||
@@ -1182,12 +1402,21 @@ sequenceDiagram
|
||||
|
||||
**串口屏板通道(与上面 7 条并列,待建后验收)**:
|
||||
|
||||
8. 串口侧注入物理键号 `1~10` → 界面动作与映射表一致;`0` 表示无键、不产生事件。
|
||||
9. UI 刷新 → 串口侧在 ≤ 500 ms 内收到一帧完整显存(3200 B)+ LED 4 B;内容与 `g_ui_fbuf` 逐字节一致。
|
||||
10. **双通道并发**:同一时刻 7003 客户端在拉帧、串口屏板在收帧,两侧画面一致,且**互不丢帧、不串帧**;
|
||||
串口侧阻塞不得导致 7003 侧超时(反之亦然)。
|
||||
11. 拔掉串口屏板 → 7003 侧不受影响;插回后自动恢复,无需复位。
|
||||
12. 背光/对比度(若屏板自管则跳过):空闲 120 s 熄灭,任意键点亮。
|
||||
8. 主机上电后,屏板按 **275 ms** 节拍发帧 A(6 B,形如 `01 03 01 xx CRC_H CRC_L`);
|
||||
主机每帧在 **≤200 ms** 内回帧 B(**4208 B**,CRC 覆盖 `[0, 4205]`),屏板**连续 10 分钟无超时**。
|
||||
9. 帧 B 前 3200 B 与主机 `g_ui_fbuf` **逐字节一致**(160 行 × 20 B,1 bpp,MSB 在前,bit = 1 → 白)。
|
||||
10. 屏板 7 个物理键逐个按下 → 主机收到的 `key` 依次为 `1/2/3/4/7/8/9`
|
||||
(ENTER / UP / DOWN / ESC / LEFT / RIGHT / RESET),界面动作与 §8.2 菜单树一致;
|
||||
`0` 表示无键、不产生事件。
|
||||
11. **状态灯下行**:主机把 19 路业务状态映射为位掩码 → 屏板 LED 1~19 的亮灭与掩码逐位一致;
|
||||
LED 0 恒亮、不受掩码控制(bit0 置位不改变任何灯)。
|
||||
12. **双通道并发**:同一时刻 7003 客户端在拉帧、屏板在召唤,两侧画面一致,**互不丢帧、不串帧**;
|
||||
串口侧 4208 B 发送阻塞不得导致 7003 侧超时(反之亦然)。
|
||||
13. **屏板自复位容忍**:屏板跑满 ≈5000 s 触发自复位,主机**不误判"屏板离线"**(无告警、不触发保护),
|
||||
约 1 s 后自动续上。
|
||||
14. 拔掉屏板 → 7003 侧不受影响;插回后自动恢复,无需复位主机。
|
||||
15. **LOGO 下发**:下发一帧 LOGO(`info[4..5] = 0x89 0x45`)→ 屏板写 Flash `0x0803F000` 并显示 2 s;
|
||||
断电重启后仍显示该 LOGO,且**屏板 LED 状态未被这帧改动**。
|
||||
|
||||
---
|
||||
|
||||
@@ -1211,8 +1440,10 @@ sequenceDiagram
|
||||
> **口径**:本节按**参考源码**(`HMI/RemoeDisp/RemoDispBus.c`)给线上格式;本产品当前实现与该口径的
|
||||
> 逐项差异、以及为什么会有差异,见 §5.16.9。**以参考为准**,差异项按 §9.13 排期收敛。
|
||||
>
|
||||
> 本节只讲**网络**通道。**串口屏板通道不走本协议**——它由 `LCD_LED_Update` / `WriteScreenByByte` /
|
||||
> `getRs485Key` 承担,帧格式在交付源码中不可见,见 §5.16.1 与 §5.16.2。
|
||||
> 本节只讲**网络**通道(TCP 7003)。**串口屏板通道不走本协议**——它是 RS-485 上的
|
||||
> **Modbus RTU 风格裸二进制帧**(6 B 召唤 + **4208 B** 图像应答,CRC-16/MODBUS 高字节在前),
|
||||
> 帧格式已按屏板源码逐字节定版,见 §5.16.2。
|
||||
> 两条通道**共用同一份显存**,但帧格式、校验、时序、主从方向全都不同,**不能共用组帧代码**。
|
||||
|
||||
| 项目 | 内容 |
|
||||
|---|---|
|
||||
@@ -1649,7 +1880,7 @@ pre-commit run --all-files
|
||||
| **SNTP 对时** | 17 | 参考对时走 SNTP | 私有 TCP 8888 + 104 `C_CS` | SNTP 客户端 |
|
||||
| **固有参数** | 1 | `8001H~800AH` 字符串类参数 | 未实现(无法短浮点上送) | 随送检点表设计 |
|
||||
| **遥测增强** | 4、5 | k=1~9 谐波方和根 + 4 点平均 | 仅基波轨 | 谐波 / 等周波调频 / 零序自产外接切换 三条算法轨 |
|
||||
| **屏板链路对齐** | 20 | **串口屏板通道**(显存 3200 B + LED 4 B 下行 / 键号 1~10 上行,变化驱动 + 500 ms)+ **7003 四命令**(INIT 29 B)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | 只有 7003 四命令(INIT **8 B**);**串口通道 0**;无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 串口通道整条 + 7003 报文口径 6 项(明细见 §9.13) |
|
||||
| **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / 软件 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT 29 B)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | 只有 7003 四命令(INIT **8 B**);**串口通道 0**;无状态灯下行;无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 串口通道整条(协议已定版)+ 7003 报文口径 6 项(明细见 §9.13) |
|
||||
|
||||
> **一句话**:**「标定闭锁」是唯一"再排期也没用"的缺口**(等标准源);「出口与开入」「三相与同期」
|
||||
> 「电度计量」等 V0.2 硬件;「对下采集」等用户决策;其余规模型条目**全部可在现有硬件上推进**,
|
||||
@@ -2223,7 +2454,7 @@ pre-commit run --all-files
|
||||
| 软压板 | 9 面全部可投退且行为可观测(投退后对应功能确实停走/恢复) |
|
||||
| 出口与开入 | 保护动作 → 出口继电器动作 → 开入回读确认,全链路 ≤ 120 ms |
|
||||
| 标定解卡 | 8 通道两点标定后 `ADC_CAL_F_VALID` 全置位;注入标准源,保护动作值与定值误差 ≤ 3 % |
|
||||
| 屏板链路 | **串口通道**:注入键号 `1~10` 界面动作正确、UI 刷新 ≤500 ms 内串口发出 3200 B + LED 4 B、双通道并发不丢帧不串帧、拔插屏板自动恢复;**网络通道**:INIT 应答 29 B 逐字段一致、`LCDMEM` 偏移 0 得 3204 B、重复召唤无应答、偏移 ≥3200 无应答、`KEEPLIVE` 无应答且 1 分钟不掉链、8 键(含 `F1\|ENT` 组合)动作正确(§5.16.10) |
|
||||
| 屏板链路 | **串口通道**:屏板 275 ms 召唤、主机 ≤200 ms 回 **4208 B**,连续 10 min 无超时;显存 3200 B 与 `g_ui_fbuf` 逐字节一致;7 个物理键(`1/2/3/4/7/8/9`)动作正确;**状态灯位掩码逐位一致、LED 0 恒亮**;屏板 ≈5000 s 自复位不误判离线;LOGO 下发后断电重启仍在;**网络通道**:INIT 应答 29 B 逐字段一致、`LCDMEM` 偏移 0 得 3204 B、重复召唤无应答、偏移 ≥3200 无应答、`KEEPLIVE` 无应答且 1 分钟不掉链、8 键(含 `F1\|ENT` 组合)动作正确(§5.16.10 十五条) |
|
||||
|
||||
---
|
||||
|
||||
@@ -2233,10 +2464,14 @@ pre-commit run --all-files
|
||||
> 改动范围只含本产品固件与 `DTU-RemoteLCD` 客户端;**屏板固件不在本仓库**,
|
||||
> 其行为以 §5.16 为契约做黑盒验收。
|
||||
>
|
||||
> **两种部署形态,两条通道都要**:① **串口直连屏板**(参考的形态,第 10~13 条)——屏板直接挂在设备
|
||||
> **两种部署形态,两条通道都要**:① **串口直连屏板**(参考的形态,第 10~15 条)——屏板直接挂在设备
|
||||
> 串口上,无需任何网络设备;② **串口服务器透传 / 网络镜像**(第 2~9 条)——屏板或调试软件经以太网连 7003。
|
||||
> 现场用串口服务器把屏板接到网上时,两种形态等价,但**固件侧不能只实现后者**:
|
||||
> 只有 7003 时,设备离开网络就没有任何本地显示,与参考产品不等价。
|
||||
>
|
||||
> **方向相反,别写错**:网络通道是"**客户端召唤、设备应答**";串口通道是"**屏板召唤、设备应答**"。
|
||||
> 两条通道共用同一份显存快照,但**帧格式、校验、时序完全不同**(网络用 `0xAA/0xBB` + XOR,
|
||||
> 串口用裸二进制 + CRC-16/MODBUS),不能共用组帧代码。
|
||||
|
||||
| 序 | 任务 | 改动点 | 判据 | 跨端 |
|
||||
|---|---|---|---|---|
|
||||
@@ -2249,10 +2484,12 @@ pre-commit run --all-files
|
||||
| 7 | **KEEPLIVE 静默** | 去掉空帧回显,改为仅重置计时 | §5.16.10 第 4 条通过 | **是** |
|
||||
| 8 | **发送重试评估** | 对比参考"BUSY + 200 ms 放弃"与现有 `net_send` 阻塞模型,出结论并回填 §5.16.9 第 7 行 | 结论有实测数据支撑(实现 / 明确不实现) | 否 |
|
||||
| 9 | **客户端一致性回归** | `DTU-RemoteLCD` 按 29 B 解析;把 §5.16.10 第 1~7 条做成自动化用例 | 七条判据全 PASS | **是** |
|
||||
| 10 | **串口通道物理层定版** | 确认屏板接口电平(RS-485 / TTL)、波特率、帧格式、校验与方向控制;端口默认 **USART3(PB10/PB11)**,若为 RS-485 半双工则改 **UART4** 并先解冻该簇 | 一份定版说明(含实测抓包),回填 §5.16.2 | 否 |
|
||||
| 11 | **串口下行显存** | 新增屏板通道模块:`屏板送帧(显存 3200 B, LED 4 B)`;变化驱动 + 500 ms 兜底;**独立发送缓冲**,不与 7003 共用 | 串口侧收到完整帧,内容与 `g_ui_fbuf` 逐字节一致 | 否 |
|
||||
| 12 | **串口上行按键** | 收键(中断或轮询)→ 物理键号 `1~10` → 逻辑键值 → 与 7003 注入**同一入口**合并;去抖 `2/12` | §5.16.10 第 8 条通过 | 否 |
|
||||
| 13 | **双通道并发回归** | 两出口各自独立发送上下文;串口阻塞不拖 7003、7003 阻塞不拖串口;拔插屏板自动恢复 | §5.16.10 第 10、11 条通过 | 否 |
|
||||
| 10 | **串口物理层落地** | 按 §5.16.2 定版:**700000 8N1**、软件 DE(默认 **USART3 PB10/PB11** + 一个空闲 GPIO 作 DE)、RX 缓冲 ≥4208 B + 空闲中断断帧、发送走 **DMA 一次性发完**(禁逐块阻塞) | 环回 + 示波器实测 700 kbaud 分频零误差;屏板能收到帧 A 并回帧 B | 否 |
|
||||
| 11 | **帧 A 解析 / 帧 B 组帧** | 新增屏板通道模块:识别 6 B 请求(`01 03 type key CRC_H CRC_L`)、校验 CRC-16/MODBUS(**高字节在前**);组 **4208 B** 帧 B(3200 显存 + 4 B LED + 4 B info 保留 + 998 B 填充 + 2 B CRC) | 屏板出图与 `g_ui_fbuf` 逐字节一致;`info[0..3]` 与下发的 LED 掩码一致 | 否 |
|
||||
| 12 | **状态灯位映射表** | 定义"**业务状态 → 屏板 LED 位**"映射(参考源码**无此表**,须自定);`info[0..3]` 按 **32 位小端**填,bit0 恒 0、bit20~31 恒 0 | §5.16.10 第 11 条通过 | 否 |
|
||||
| 13 | **串口上行按键** | 帧 A 的 `key` 字节按**屏板 `KEY_TYPE`** 解释——实际可达值只有 **`1/2/3/4/7/8/9`**(`5`/`6`/`10` 无物理入口);映射为逻辑键值后与 7003 注入**同一入口**合并 | §5.16.10 第 10 条通过;`9`/`10` 语义按 §5.16.3 ② 处置 | 否 |
|
||||
| 14 | **双通道并发 + 自复位容忍** | 两出口各自独立发送上下文;串口 4208 B 阻塞不拖 7003;链路监视按"**连续 ≥10 s 无应答**"判离线,**忽略屏板 ≈5000 s 周期自复位** | §5.16.10 第 12、13、14 条通过 | 否 |
|
||||
| 15 | **LOGO 下发流程** | 一次性下发 LOGO 帧(`info[4..5] = 0x89 0x45`,宽高大端);放在出厂 / 联调流程,**不进常规刷新循环** | §5.16.10 第 15 条通过;断电重启后 LOGO 仍在 | 否 |
|
||||
|
||||
**批次划分**:
|
||||
|
||||
@@ -2260,18 +2497,22 @@ pre-commit run --all-files
|
||||
|---|---|---|
|
||||
| 第一批(无跨端风险,可独立发版) | 3、6、8 | 只动本端,旧客户端不受影响 |
|
||||
| 第二批(跨端,须与客户端同步发版) | 2、4、5、7、9 | 报文口径变更,两端必须同版本 |
|
||||
| 第三批(**独立立项**,不随 RS-485 冻结) | 10、11、12、13 | 屏板串口通道是**独立需求**,与 §5.10 冻结的"对下采集簇"不是一回事;但若屏板是 RS-485 半双工,会与 UART4 争用 → 先做第 10 条定版 |
|
||||
| 第三批(**独立立项**,不随 RS-485 冻结) | 10、11、12、13、14、15 | 屏板串口通道是**独立需求**,与 §5.10 冻结的"对下采集簇"不是一回事;物理层已按屏板源码定版(**700000 8N1 / 软件 DE**),默认走 USART3 另配 DE GPIO,**不必解冻 UART4** |
|
||||
|
||||
> ⚠ **唯一破坏性变更**:第 2 条把 INIT 应答从 8 B 改成 29 B。**旧客户端会把 29 B 的前 8 B 当全部、
|
||||
> 把后 21 B 当作下一帧的 TAG 去找**,解析状态机会被这 21 B 拖住直到超时——表现为"连上了但不出图"。
|
||||
> 因此第 2、5、7、9 条必须**同批发布**,且发版说明中明确"客户端需升级"。
|
||||
>
|
||||
> **屏板固件边界**:本表不覆盖屏板侧固件(帧解析 / 显存写入 / 按键扫描)。屏板可用任意实现,
|
||||
> 只要满足 §5.16.10 的九条黑盒判据即为兼容。
|
||||
> **屏板固件边界**:本表不覆盖屏板侧固件(帧解析 / 显存写入 / 按键扫描 / 状态灯驱动)。
|
||||
> 屏板固件工程在 `D:\Code\DTU Code\DTU-LCD`,**不在本仓库**,其契约已按源码逐字节成文(§5.16.2 / §5.16.3)。
|
||||
> 本产品只要满足 §5.16.10 的十五条判据即为兼容。
|
||||
>
|
||||
> **第三批的前置阻塞**:第 11~13 条需要**屏板实物**才能验收(无实物只能做到"帧发出去了")。
|
||||
> 第 10 条的定版若拿不到屏板固件或抓包,则**不得按猜测定协议**——先用自定义帧跑通,
|
||||
> 但必须在文档里标注"待与屏板核对",避免把猜测固化成契约。
|
||||
> **第三批的前置阻塞**:第 11~15 条需要**屏板实物**才能验收(无实物只能做到"帧发出去了")。
|
||||
> 第 11 条的帧长仍有一处待实测复核——代码实参是 **4208 B**,屏板 readme 写 **3208 B**(§5.16.2);
|
||||
> 台架抓到第一帧真实报文后**立即固化**,在此之前以代码实参为准,不得按 readme 实现。
|
||||
>
|
||||
> **已消解的旧阻塞**:原"屏板协议拿不到、不得按猜测定契约"的告警**不再适用**——物理层、帧格式、
|
||||
> 键值、状态灯、时序均已从 `DTU-LCD` 源码确定。剩下的只是"实物联调确认",不是"协议未知"。
|
||||
|
||||
---
|
||||
|
||||
@@ -2318,7 +2559,7 @@ pre-commit run --all-files
|
||||
| 10 | 104 遥控与定值 | `YK12` 软压板投退、`C_SE` 写定值 | 两段式正答、压板行为可观测、定值跨复位保持 |
|
||||
| 11 | 保护闭锁态 | 未标定状态下观察 `YX31` 与日志 | 判据停走且**明确可见**(不得静默不动作) |
|
||||
| 12 | 记录可追溯 | FTP 下载 `/log/soe.log`、`/log/run.log`、`/log/selftest.log` | 记录连续、时标正确、解码校验通过 |
|
||||
| 13 | 屏板链路一致性 | 串口屏板 + TCP 客户端同时接入,按 §5.16.10 九条逐项验证 | 串口侧 3200 B + LED 4 B 一致、键号 1~10 动作正确、双通道并发不丢帧;网络侧 INIT 29 B、重复召唤/越界无应答、KEEPLIVE 静默、8 键(含组合)动作正确 |
|
||||
| 13 | 屏板链路一致性 | 串口屏板 + TCP 客户端同时接入,按 §5.16.10 **十五条**逐项验证 | 串口侧:275 ms 召唤 / ≤200 ms 回 4208 B、显存 3200 B 逐字节一致、**状态灯 4 B 掩码逐位一致**、7 键动作正确、自复位不误判离线;网络侧:INIT 29 B、重复召唤 / 越界无应答、KEEPLIVE 静默、8 键(含组合)动作正确 |
|
||||
|
||||
### 10.4 台架验收(已闭环)
|
||||
|
||||
@@ -2390,3 +2631,4 @@ pre-commit run --all-files
|
||||
| 2026-10-28 | **v1.3 缺口逐项细化(新增 §9.4~§9.12)** | ① **定值**:给出 40 项去向对账(覆盖参考 35 + 本地扩展 5),差额由「+209」更正为 **+214 项**;新增 23 单元逐单元差额表、已覆盖 35 项逐项对照(过流三段每段缺方向 / 低压 / 告警 / 低压定值 4 项;零序过流三段 18 项全缺,注意 `PS_3U0_*` 是零序**过压**不是过流;三级负荷只做一级;频率缺「跳闸投退」;电压缺 4 项跳闸 / 告警投退;PT·CT 缺 6 项)、完全未覆盖 163 项逐项清单(`SYS3` 45 / `VolTimeRecv` 17 / `AutoReCls` 16 / `SYN` 13 / `WAVESTART` 12 / `MeaLimit` 10 / `OverCurSpeed` 8 / `OverCurI0` 13 / 小单元 29);② **遥测**:31 点逐点对照,缺 22 点按依赖分三批(线电压与功率 13 / 第二回线 7 / 直流 2),指出「三相电压全落 TPAFE」可一次解锁 6 个线电压点;③ **开入开出**:138 = 软遥信 104 + 硬件 27 + 双点 6 + 多态 1,澄清「104 点 ≠ 104 个端子」;31 开出 = 出口 11 + 信号 20;④ **动作事件**:33 条(421~453)逐条对照,覆盖 9 条;记录参考源码 428/429 **同名**需按事件码区分;⑤ **保护元件**:口径改为模块级 45 → 8,37 个缺失模块逐个给出「缺它的后果 + 依赖」,差额由「+35」更正为 **+37**,指出 `MusterRecov` 总复归是唯一无硬件依赖、可立即开工的元件;⑥ **录波**:14 项硬指标(80 点/周波 = 4000 Hz、6 段、前 5 后 10 返回 2 手动 6 周波、9000 ms、RAM 16、COMTRADE 64/64/16、65 通道)与复刻所需四件东西;⑦ **记录体系**:13 类队列容量表,覆盖 8 类,缺越限 / 闭锁 / COS / 顺控 / 顺控执行;指出「闭锁记录」性价比最高(四源闭锁已全实现却无留痕);⑧ **规约栈**:12 种逐种链路 / 用途 / 工作量特征 + 四层排期,指出对上与对下是两套角色;⑨ 新增 **§9.12 复刻完成判据**(12 条可验证判据)。**本次只改本文件** |
|
||||
| 2026-10-28 | **v1.4 屏板链路口径更正 + 逐字节复刻规格(新增 §5.16、§9.13)** | ① **口径更正**:v1.3 及更早把参考写成"**板载** LCD + 按键"、把本产品远端推流说成"等价替代",**两处都错**。参考源码中主机侧 5 个碰硬件的函数(`KeyGet` / `WriteScreenByByte` / `LCD_LED_Update` / `getRs485Key` / `anyNewKey`)**全树只有声明没有实现**,按键轮询函数名为 `Key_Rs485_Process()`(注释"轮询从485传来的按键值"),屏板插槽号 `CN_SLOT_DISP = 0`(注释"显示板插槽号固定为0")——**参考的屏和键同样在独立板件上、同样靠链路传输**,本产品与之**同构而非替代**;§2.4.1 X3 由「本地人机」改为「**就地屏板(板件本体)**」,并补口径更正说明段;② **§2.5.2 补第 20 项「远端屏与按键链路」**(状态 🔶),能力计数 19 → **20 项**、🔶 9 → **10 项**,§2.5.7 差异归因同步(X3 不再计为"已用等价方案替代");③ **新增 §5.16 远端屏与按键链路(FR-HMI)**:两条链路对照(RS-485 屏板通道 / TCP 7003 总线)、帧格式逐字节、CRC 覆盖范围、接收定界算法、**INIT 应答 29 B 逐字段偏移表**、键值位掩码语义、`bNeedFlash` 续传与拒绝语义(`-1` / `-2`)、按键状态机与合并优先级、三个定时器(500 ms / 1 分钟 / 200 ms)、发送状态机、`0x55`/`0xaa` 刷新互斥、任务参数(prio 111 / 栈 0x35000);④ **§5.16.9 给出 10 项与参考的差异**,其中 5 项为客户端可见的报文口径差(INIT **8 B vs 29 B** 为最大一条);⑤ **§6.2 按参考源码重写**:更正 INIT 应答长度(原写 8 B)、KEEPLIVE 改为**不应答**(原写"原样回显")、补最长帧 9800 B / 收发缓冲 10240 B / 按键码补 `F1`·`F2` 与位掩码可组合说明;⑥ **新增 §9.13 屏板链路复刻任务规划**:10 条语义短语任务 + 三批划分 + 唯一破坏性变更警示(INIT 长度变更必须与客户端同批发版);⑦ §9.1.2 补「屏板链路对齐」行、§9.12 补完成判据、§10.3 补现场验收第 13 项。**本次只改本文件** |
|
||||
| 2026-10-28 | **v1.5 补串口屏板通道(显示信息不只走网络)** | ① **口径再更正**:v1.4 把串口通道写成"链路 A,随 RS-485 簇冻结",等于把它降级成可选——**错**。参考的架构是**一份显存、两个出口**:**串口屏板通道是主通道**(`LCD_LED_Update(显存 3200 B, LED 4 B)` 变化驱动 + `WriteScreenByByte` 500 ms 兜底),**TCP 7003 是镜像**;上行同理(`getRs485Key()` 物理键号 1~10 为主,`g_tRemoteKey` 为镜像,两者在 `Key_Read()` 汇合且**本地优先**)。§5.16 标题改为「**屏板链路:串口主通道 + 网络镜像**」并重写开篇;② **§5.16.1 重写为「一份显存、两个出口」**:显存物理基址 `CN_VIDEO_ADDRESS_BASE = 0xC1F00000`(非 cache 区)、三条下行路径与两条上行路径的归属任务 / 调用 / 载荷 / 节拍对照表;③ 新增 **§5.16.2「本产品的串口通道(待建)」**:V0.1 串口资源盘点(USART1 调试占用 / UART4 被冻结 RS-485 占用 / **UART5、USART2、USART3 空闲**),默认选 **USART3(PB10/PB11)**,若屏板为 RS-485 半双工则改 UART4 并先解冻该簇;④ 新增 **§5.16.3「参考实现的屏板侧接口一览」**,并**明确列出交付源码推不出的四项**(波特率与数据格式 / 帧头与校验 / 半双工方向控制 / 3200 B 是否分片与应答)——在拿到实测前不得声称"按参考协议实现";⑤ **§5.16.9 差异表由 10 行扩到 14 行**,新增「串口屏板通道整条缺失」「双出口并发缺失」「面板指示灯语义不同」「背光对比度」四项,并注明第 11/12 条是**整条链路缺失**而非报文细节;⑥ **§5.16.10 判据由 7 条扩到 12 条**,新增串口侧 5 条(键号注入 / 500 ms 内出帧 / 双通道并发不丢帧不串帧 / 拔插恢复 / 背光);⑦ **§9.13 任务由 10 条扩到 13 条**:原「RS-485 屏板通道」一条拆为「串口通道物理层定版 / 串口下行显存 / 串口上行按键 / 双通道并发回归」四条,批次表第三批改为**独立立项、不随 §5.10 冻结**,并补前置阻塞(需屏板实物验收;拿不到固件或抓包时不得把猜测定成契约);⑧ §5.16.8 `tTimerLCD` 行由"此路不实现"改为"串口通道周期兜底节拍(待建)",§2.5.2 第 20 项、§9.1.2、§9.12、§10.3 同步。**本次只改本文件** |
|
||||
| 2026-10-28 | **v1.6 屏板源码到手:串口通道协议定版 + 状态灯下行** | ① **屏板固件已获得**(`D:\Code\DTU Code\DTU-LCD`,STM32F103ZE + UC1698U 160×160 单色 + **20 路状态指示灯** + 7 个物理按键),v1.5 列的"四项未知"**全部消解**;② **§5.16.2 重写为「串口通道:物理层与帧格式(屏板源码实测)」**:**700000 8N1**(APB1 42 MHz 分频零误差、`BRR = 0x3C0`)、软件 DE、**角色反转(屏板是 Modbus 主站、主机是从站 `0x01`)**、帧 A 6 B 召唤(`01 03 type key CRC_H CRC_L`,`KEY_CMD=0` / `RT_CMD=1`,CRC-16/MODBUS 只覆盖前 4 B、**高字节在前**)、帧 B **4208 B** 图像应答(3200 显存 + 4 B 状态灯 + 4 B info + 998 B 填充 + 2 B CRC,覆盖 `[0, 4205]`)、时序 275 ms / 200 ms / 5 次超时、200 ms 预算下 4208 B 约 60.1 ms(占 30 %)、主机端口默认 **USART3 + 另配 DE GPIO**(**不必解冻 UART4**);③ **§5.16.3 重写为「屏板侧行为:状态灯 / 按键 / 背光 / LOGO」**,新增**状态灯下行**:`info[0..3]` 为 **32 位小端位掩码**、**ID 0 = 电源灯硬件常亮、ID 1~19 对应 bit1~19**,给出 20 路 LED 引脚表,并指出"**位 → 业务状态映射表参考源码没有、须由本产品自定**";键值 `KEY_TYPE` 表(`0` 无键 / `1` ENTER / `2` UP / `3` DOWN / `4` ESC / `5` ADD / `6` DEC / `7` LEFT / `8` RIGHT / `9` RESET / `10` FACTORY),并**指出与参考主机 `getRs485Key()` 的 `9` / `10` 语义冲突**(参考是 `F1` 与 `F1+ENT`)、`key_configs[]` 仅 7 项且无 ADD/DEC 入口;背光自管、LOGO(Flash `0x0803F000`、魔数 `0x89 0x45`)、屏板健壮性(CRC 错 ≥3 仅清计数**不自愈**、**≈5000 s 自复位**、DMA 接收问题未解决);④ **§5.16.9 差异表**第 8 / 11 / 12 / 13 / 14 行按屏板实测重写,并新增"来自屏板固件的新增约束"5 条;⑤ **§5.16.10 判据由 12 条扩到 15 条**(275 ms 召唤 / ≤200 ms 回 4208 B、显存逐字节、7 键、**状态灯逐位**、双通道并发、**自复位容忍**、拔插恢复、**LOGO 下发**);⑥ **§9.13 任务由 13 条改为 15 条**:第 10 条由"物理层定版"改为"**串口物理层落地**"(参数已定)、新增第 12 条"**状态灯位映射表**"与第 15 条"**LOGO 下发流程**"、第 14 条并入"自复位容忍",批次表第三批改 10~15 并注明**不必解冻 UART4**,删除"拿不到固件不得定契约"告警(已消解),保留"**4208 vs 3208 待台架复核**";⑦ **§5.8 补屏板 20 路指示灯与主板 6 路 LED 是两套独立输出**;§5.6 FR-UI-1 改为"**双出口推流**";§6.2 口径注改为"串口通道是 Modbus RTU 风格裸帧、**不能共用组帧代码**";§2.4.1 X3、§2.5.2 第 20 项、§5.16.1、§5.16.8 `tTimerLCD` 行、§9.1.2、§9.12、§10.3 第 13 项同步。**本次只改本文件** |
|
||||
|
||||
Reference in New Issue
Block a user