9ceb218f80
Co-authored-by: Cursor <cursoragent@cursor.com>
6.1 KiB
6.1 KiB
mdu_comm 模块说明
路径:
app/mdu_comm/
返回主说明:README
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 协议栈(lwIPsocket/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
- 群充 PCM:
主机终端通信协议.md(与PCM_comm.c注释引用一致;若文档路径调整请在工程中同步)