Files
CCU621M/app/mdu_comm/mdu_comm模块说明.md

114 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 注释引用一致;若文档路径调整请在工程中同步)