Initial commit: CCU621_M firmware project with BLE debug link support.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
# mdu_comm 模块说明
|
||||
|
||||
> 路径:`app/mdu_comm/`
|
||||
> 返回主说明:[README](../../README.md)
|
||||
|
||||
## 1. 模块职责
|
||||
|
||||
- 实现 MDU 模块通信任务与报文处理;
|
||||
- 维护模块在线/离线、通信状态与超时判断;
|
||||
- 提供 MDU 对接系统数据的接口层;
|
||||
- **可选**:当配置为群充「终端(分桩)」角色时,通过 **PCM UDP** 与主机交互(见 `PCM_comm.c`)。
|
||||
|
||||
## 2. 关键文件
|
||||
|
||||
- `mdu_comm_task.c/h`:MDU 任务主循环;根据 `u8_mdu_type` 分支调用 CAN 网关逻辑或 PCM UDP 逻辑。
|
||||
- `mdu_interface.c/h`:MDU 数据与控制接口层。
|
||||
- **`PCM_comm.c` / `PCM_comm.h`**:群充 **PCM 终端 ↔ 主机** 的 **UDP** 协议栈(lwIP `socket`/`sendto`/`recvfrom`),详见下文第 6 节。
|
||||
|
||||
## 3. 功能说明
|
||||
|
||||
- 处理模块 CAN 报文收发和任务周期调度;
|
||||
- 对外暴露 MDU 数据读取与控制动作接口;
|
||||
- 当前包含部分可配置/可屏蔽的系统取数接口(便于分阶段集成)。
|
||||
|
||||
## 4. 调度与对外接口
|
||||
|
||||
该模块由 FreeRTOS 任务 `MduComm` 周期运行(单位:ms),周期来自 `app/app_init/app_init.c`:
|
||||
|
||||
- `MduComm`:`50ms`(任务入口:`v_Mdu_Comm_task(void *argument)`)
|
||||
|
||||
任务内根据 **`s_mdu_data.u8_mdu_type`** 选择路径:
|
||||
|
||||
- **`0`**:充电模块 **CAN** 通信(`v_mdu_comm_gw_action` 等)。
|
||||
- **`0x02`**:PCM **UDP** 终端通信(`v_pcm_comm_gw_action`,实现位于 `PCM_comm.c`)。
|
||||
|
||||
对外接口(来自 `mdu_comm_task.h`):
|
||||
|
||||
- `void v_MduCanMsg_send(CAN_DATA* can_data)`:发送 MDU 报文(封装)
|
||||
- `U8_T u8_MduCanMsg_recv(CAN_DATA *rx_can_data)`:接收 MDU 报文
|
||||
- `void v_mdu_clear_recv_data(U8_T u8_id)`:清空指定接收缓存
|
||||
- `void v_mdu_data_summ(void)`:汇总/刷新统计数据
|
||||
|
||||
并提供与 STM/PLC 相关的状态查询接口(根据配置启用):
|
||||
|
||||
- `U8_T u8_stm_status_get_gun_plug(U8_T u8_gunNo)`
|
||||
- `U8_T u8_stm_status_get_di(U8_T u8_index)`
|
||||
|
||||
## 5. 维护建议
|
||||
|
||||
- 新增命令类型时建议先扩展接口层,再接入任务主循环;
|
||||
- 保持超时与故障上报路径一致,避免重复告警;
|
||||
- PCM 与 CAN 共用 `MduComm` 任务时,注意 **`u8_mdu_type`** 与网络初始化顺序(lwIP 就绪后再 `bind`)。
|
||||
|
||||
## 6. PCM 群充 UDP(`PCM_comm.c` / `PCM_comm.h`)
|
||||
|
||||
### 6.1 定位与引用协议
|
||||
|
||||
- **本机角色**:群充 **终端(分桩)**,通过 **UDP** 与 **主机** 通信。
|
||||
- **代码注释约定**:协议细节可参考工程内 **`主机终端通信协议.md`**(与 `PCM_comm.c` 文件头说明一致)。
|
||||
- **接入点**:由 `mdu_comm_task.c` 在 **`u8_mdu_type == 0x02`** 时每周期调用 **`v_pcm_comm_gw_action(sleep_time_ms)`**;首次调用内完成 **`s8_pcm_udp_init()`**(失败则下周期重试)。
|
||||
- **日志**:使用 `TASK_ID_MduComm`,宏 `PCM_COMM_LOG`。
|
||||
|
||||
### 6.2 传输与地址
|
||||
|
||||
- **Socket**:UDP,`AF_INET`;本地 **`bind`** 端口 **`PCM_UDP_SRC_PORT`(502)**;发往主机 **`PCM_UDP_DST_PORT`(502)**。
|
||||
- **本机 IP**:取自共享配置 **`g_t_share_data.t_sys_fix_cfg.s_net_cfg.u8_eth_ip`**(写入 `S_PCM_COMM_DATA` 中的终端 IP 字段)。
|
||||
- **主机 IP**:按终端 IP 末字节推算——**`192.168.1.(200 + ((终端末字节-100)/10)*10)`**(与 `PCM_HOST_IP_BASE3`、`PCM_TERM_IP_OFFSET` 等宏对应;用于群充多终端分段寻址)。
|
||||
|
||||
### 6.3 帧格式摘要
|
||||
|
||||
| 字段顺序 | 长度 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 帧头 | 2 B | 固定 **`0x5A 0x99`**(`PCM_FRAME_HEAD`) |
|
||||
| 功能码 | 1 B | 见下表 |
|
||||
| 数据长度 | 1 B | `N`,数据域字节数,`N ≤ 128` |
|
||||
| 数据 | N B | 依功能码变化 |
|
||||
| CRC | 1 B | **CRC8**,多项式 **`x^8+x^2+x+1`(0x07)**,计算范围为 **帧头+功能码+长度+数据**(与组帧顺序一致) |
|
||||
| 帧尾 | 1 B | 固定 **`0xA5`** |
|
||||
|
||||
最小帧长 **6 字节**(无数据域时);接收路径校验帧头、帧尾、长度、`CRC` 后按功能码分发。
|
||||
|
||||
### 6.4 功能码与周期行为(终端侧)
|
||||
|
||||
| 功能码 | 方向 | 含义 |
|
||||
| --- | --- | --- |
|
||||
| `0x10` | 终端→主机 | **分桩心跳**:数据含枪数量 + 各枪终端地址(配置 `u8_terminal[]`) |
|
||||
| `0x11` | 主机→终端 | **主机心跳**:解析后刷新主机通信「存活」与时间戳 |
|
||||
| `0x12` | 终端→主机 | **分桩请求**:按枪拼接多组 **11 字节** 数据(枪地址、流程状态、直流/泄放接触器、需求电压电流 BE、故障状态与原因 BE 等),数据来自 **`flow_interface`**、**`u8_get_gun_yx_data`**、**`u8_get_fault_sum` / `u16_flow_get_sys_data`** |
|
||||
| `0x13` | 主机→终端 | **请求应答**:解析多组 **9 字节**(枪地址、模块启停、输出电压电流 BE、主机故障及原因 BE),写入 **`S_PCM_HOST_STATE`** |
|
||||
|
||||
**定时**(在 **`v_pcm_udp_periodic_handler`** 中累加任务周期 `sleep_time_ms`):
|
||||
|
||||
- **`PCM_HEARTBEAT_PERIOD_MS`(1000 ms)**:发送 **`0x10`**;
|
||||
- **`PCM_REQUEST_PERIOD_MS`(200 ms)**:发送 **`0x12`**;
|
||||
- **`PCM_COMM_TIMEOUT_MS`(5000 ms)**:若距上次有效接收超时,置 **`u8_comm_ok = 0`**(主机通信异常)。
|
||||
|
||||
接收:**`u8_pcm_udp_recv_process`** 使用 **`MSG_DONTWAIT`** 非阻塞 `recvfrom`,仅处理 **`0x11` / `0x13`**。
|
||||
|
||||
### 6.5 对外可查接口(节选)
|
||||
|
||||
- **`u8_pcm_get_host_comm_status()`**:主机链路是否正常(`0` 超时 / `1` 正常)。
|
||||
- **`ps_pcm_get_host_gun_data(u8_gun_index)`**:最近一次 **`0x13`** 解析得到的某枪应答(索引非法或超出主机回复枪数则返回 `NULL`)。
|
||||
- **`v_pcm_update_term_gun_data(...)`**:可选写入本地缓存的终端枪数据(当前 **`0x12`** 组帧仍以实时采集接口为准,该接口便于后续扩展)。
|
||||
|
||||
### 6.6 与 CAN MDU 路径的关系
|
||||
|
||||
- **互斥分支**:`u8_mdu_type == 0` 走 CAN;**`== 0x02`** 走 PCM UDP,二者在同一任务周期内不同时执行主通路。
|
||||
- **喂狗、锁、睡眠**:仍由 `mdu_comm_task` 统一调度;PCM 仅作为分支内的网络协议处理。
|
||||
|
||||
## 7. 关联文档
|
||||
|
||||
- 主索引:[README](../../README.md)
|
||||
- 群充 PCM:`主机终端通信协议.md`(与 `PCM_comm.c` 注释引用一致;若文档路径调整请在工程中同步)
|
||||
Reference in New Issue
Block a user