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

6.1 KiB
Raw Permalink Blame History

mdu_comm 模块说明

路径:app/mdu_comm/
返回主说明:README

1. 模块职责

  • 实现 MDU 模块通信任务与报文处理;
  • 维护模块在线/离线、通信状态与超时判断;
  • 提供 MDU 对接系统数据的接口层;
  • 可选:当配置为群充「终端(分桩)」角色时,通过 PCM UDP 与主机交互(见 PCM_comm.c)。

2. 关键文件

  • mdu_comm_task.c/hMDU 任务主循环;根据 u8_mdu_type 分支调用 CAN 网关逻辑或 PCM UDP 逻辑。
  • mdu_interface.c/hMDU 数据与控制接口层。
  • 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

  • MduComm50ms(任务入口:v_Mdu_Comm_task(void *argument)

任务内根据 s_mdu_data.u8_mdu_type 选择路径:

  • 0:充电模块 CAN 通信(v_mdu_comm_gw_action 等)。
  • 0x02PCM 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 群充 UDPPCM_comm.c / PCM_comm.h

6.1 定位与引用协议

  • 本机角色:群充 终端(分桩),通过 UDP主机 通信。
  • 代码注释约定:协议细节可参考工程内 主机终端通信协议.md(与 PCM_comm.c 文件头说明一致)。
  • 接入点:由 mdu_comm_task.cu8_mdu_type == 0x02 时每周期调用 v_pcm_comm_gw_action(sleep_time_ms);首次调用内完成 s8_pcm_udp_init()(失败则下周期重试)。
  • 日志:使用 TASK_ID_MduComm,宏 PCM_COMM_LOG

6.2 传输与地址

  • SocketUDPAF_INET;本地 bind 端口 PCM_UDP_SRC_PORT502;发往主机 PCM_UDP_DST_PORT502
  • 本机 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_BASE3PCM_TERM_IP_OFFSET 等宏对应;用于群充多终端分段寻址)。

6.3 帧格式摘要

字段顺序 长度 说明
帧头 2 B 固定 0x5A 0x99PCM_FRAME_HEAD
功能码 1 B 见下表
数据长度 1 B N,数据域字节数,N ≤ 128
数据 N B 依功能码变化
CRC 1 B CRC8,多项式 x^8+x^2+x+10x07,计算范围为 帧头+功能码+长度+数据(与组帧顺序一致)
帧尾 1 B 固定 0xA5

最小帧长 6 字节(无数据域时);接收路径校验帧头、帧尾、长度、CRC 后按功能码分发。

6.4 功能码与周期行为(终端侧)

功能码 方向 含义
0x10 终端→主机 分桩心跳:数据含枪数量 + 各枪终端地址(配置 u8_terminal[]
0x11 主机→终端 主机心跳:解析后刷新主机通信「存活」与时间戳
0x12 终端→主机 分桩请求:按枪拼接多组 11 字节 数据(枪地址、流程状态、直流/泄放接触器、需求电压电流 BE、故障状态与原因 BE 等),数据来自 flow_interfaceu8_get_gun_yx_datau8_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_MS1000 ms:发送 0x10
  • PCM_REQUEST_PERIOD_MS200 ms:发送 0x12
  • PCM_COMM_TIMEOUT_MS5000 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 注释引用一致;若文档路径调整请在工程中同步)