EMS 知识库
首页 / knowledge/代码解析/midware/evc

evc.h

源文件路径:midware/evc/evc.h 所属模块:midware/evc(一代交流充电桩 SMILE-EVCT11 通信中间件) 代码行数:370

1. 文件职责

本文件是一代充电桩(EVC,SMILE-EVCT11,单桩)通信中间件的对外声明头文件,定义了 EMS 主控与充电桩之间交互所需的全部配置表、运行数据结构与接口原型。

它处在数据流的"接口契约"环节:evc.c 按 RS485/Modbus-RTU 读取充电桩的 SN、固件版本、电压/电流/功率/电量/故障字,写入 g_t_evc_run_info;再把 EMS 计算出的分相功率设定值回写到充电桩。

配置侧由 data/system_config/system_config.c 负责初始化与 Flash 持久化(g_t_evc_setting_info、g_t_evc_config_table),运行侧由 midware/interface/interface.c 的 Modbus 任务周期调用 evc_control() 驱动。

evc.h 同时被二代充电桩模块 evc_ii.c、升级模块 evc_upgrade.c 引用(复用 g_evc_send_buf/g_evc_recv_buf 与 EVC_BUF_LEN),是 evc 子系统的公共头。

2. 关键数据结构与宏

名称类型说明
DEBUG_EVC宏调试开关,值为 0,置 1 后打开 evc.c 内大量 printf 打印(evc.h:12)
EVC_BUF_LEN宏收发缓存长度 256,等于 g_evc_send_buf/g_evc_recv_buf 数组长度(evc.h:14)
FW_TYPE_EVC宏一代充电桩型号字符串 "SMILE-EVCT11",上报云端与固件匹配用(evc.h:16)
VERSION_EVC_HARD宏硬件版本字符串 "V1.02"(evc.h:17)
EVC_START_MODE_E枚举启动模式:NOT_START/EMS_START/CARD_START(evc.h:20)
EVC_CHARGE_MODE_E枚举充电指令:DEFAULT_CHARGE(0)/STOP_CHARGE(1)/START_CHARGE(2)(evc.h:27)
EVC_CHARGE_PLOT_E枚举充电策略:EVC_SLOW(1 慢充)/EVC_NORMAL(2 常充)/EVC_QUICK(3 快充)/EVC_SPECIFIED_POWER(4 指定功率)(evc.h:34)
EVC_CHARGE_MODEL_E枚举上报云端的充电模式:EVC_NULL_MODEL(0)/EVC_EMS_START_MODEL/EVC_CARD_START_MODEL/EVC_AVAILABLE_MODEL(4)(evc.h:42)
EVC_CHARGE_STATUS_E枚举条件充电延迟状态:CHARGE_NORMAL/CONDITION_CHARGE/NO_CONDITION_CHARGE(evc.h:50)
EVC_SETTING_TABLE_T结构体单桩设置表(Flash 页存储):使能、充电优先级、两个时间段起止时分、时间有效位域、相数 u8_ev_phase、最大充电电流 u16_max_charg_curr、14 字节保留、Modbus CRC(evc.h:59)
EVC_CONFIG_TABLE_T结构体充电桩整体配置表:入户单相最大电流 u16_max_consume_cur(0.1A)、充电策略 u8_plot、并机限流标志 u8_evc_parallel_limit_flag(evc.h:91)
EVC_FAULT_E枚举32 个故障位序号(继电器过温、输出过载、电网过/欠压、漏电流、地锁异常、通讯失败等),与 EVC_FAULT_U 位域一一对应(evc.h:104)
EVC_FAULT_U联合体32 位故障字:u32_evc_fault_all / byteData[4] / 32 个 bool 位域三种视图(evc.h:143)
EVC_RUN_INFO_T结构体充电桩单体运行数据总表,本模块核心全局变量 g_t_evc_run_info 的类型(evc.h:188)
evc_state_u(匿名联合体)联合体桩状态字:startmode(2bit)/chargingfull(1bit)/chgsts(4bit)/charge_en(1bit)(evc.h:200)
evc_tags_u(匿名联合体)联合体控制状态:rechargeable/server_control/full_tag(evc.h:212)
evc_set_u(匿名联合体)联合体下发控制字:remotcontrol(1bit,0 允许 / 1 禁止,写入 Modbus 0x1000 区)、phasecontrol(2bit 相数)(evc.h:253)
evc_flag_u(匿名联合体)联合体软件标记:comm_flag(通讯在线)、clear_energy_flag(待清电量)(evc.h:263)
EVC_CONTROL_PARA_T结构体功率计算中间结果:桩数量、A/B/C 相与总的可充功率(evc.h:276)
EVC_SYS_DATA_T结构体从 g_t_logic_info/电表/logic_read_* 抓取的系统侧快照(电网状态、三相电压功率、逆变器、电池 SOC/功率/充放限值、各截止 SOC)(evc.h:285)
EVC_DEBUG_DATA_T结构体调试可视化数据:JSON 字段值、系统/时间段 tick、邮编、特殊命令、充/清电量标志(evc.h:320)
g_evc_send_buf / g_evc_recv_buf全局数组256 字节收发共用缓存,一代/二代/升级三处共用(evc.h:350)
g_t_evc_setting_info / g_t_evc_config_table全局变量单桩设置表 / 整体配置表(evc.h:353)
g_t_evc_run_info全局变量单体运行数据(evc.h:356)
g_t_evc_debug_data全局变量调试数据结构(evc.h:358)

3. 函数清单

本文件为纯声明头文件,不含函数定义(static 或全局函数体均为 0 个),仅导出 8 个函数原型。

函数名作用域说明
evc_control全局(声明,evc.h:361)一代充电桩周期控制主入口,定义于 evc.c:958
get_evc_enable_flag全局(声明,evc.h:362)读取单桩使能标志,定义于 evc.c:1043
get_evc_type全局(声明,evc.h:363)返回型号字符串 FW_TYPE_EVC,定义于 evc.c:1094
get_evc_power_total全局(声明,evc.h:364)返回充电桩当前总有功功率,定义于 evc.c:1106
get_evc_energy_total全局(声明,evc.h:365)返回累计充电电量,定义于 evc.c:1118
clear_evc_energy全局(声明,evc.h:366)置位清电量标记,定义于 evc.c:1130
set_evc_charge_flag全局(声明,evc.h:367)由云端/本地写入充电指令,定义于 evc.c:1142
get_evc_chargemodel全局(声明,evc.h:368)返回上报云端的充电模式,定义于 evc.c:1060

4. 核心逻辑解析

本文件不含可执行逻辑,其"核心逻辑"体现在数据结构布局的约束与位域语义上。

4.1 内存布局约束

4.2 位域与协议字段的对应

EVC_RUN_INFO_T.evc_state_u 的位域顺序(evc.h:205)与充电桩 Modbus 0x13 个寄存器的状态字按位对齐:startmode:2 对应 evc.c:1070 判断的 EMS/刷卡启动;chgsts:4 被升级流程占用为 0x0A(evc_upgrade.c:441)表示"正在升级";charge_en 表示枪已连接可充。

evc_set_u(evc.h:253)的 remotcontrol 语义在本模块中为 0=允许充电、1=禁止充电(evc.c:854 置 0 允许、evc.c:862 置 1 禁止),而二代模块在 evc_ii.h:22 用 EVC_REMOTE_DENY=1 把同一语义显式宏化,一代此处使用裸常量 0/1。

4.3 外部可见变量

g_evc_send_buf/g_evc_recv_buf 被声明为 extern(evc.h:350)而非封装在 evc.c 内部,导致一/二代与升级模块三处并发复用同一块 256 字节缓冲(各文件将指针 s_evc_upgrade_send_buf = g_evc_send_buf,见 evc_upgrade.c:28)。由于 interface.c:331 的任务调度保证同一时刻只跑 evc_control / evc_ii_control / evc_upgrad_handle 之一,该共享在现有调度下不会真正并发。

5. 对外接口

导出的函数(供外部调用)

导出的全局变量(供外部读写)

本文件依赖的外部声明

includes.h(u8/u16/s16/s32/bool/TRUE/FALSE 等基础类型与 STATIC_ASSERT 所在链)、midware/debug/debug.h(STATIC_ASSERT、DEBUG_* 工具)。头文件本身不引用其它模块函数。

6. 依赖关系

7. 备注与风险点

  1. EVC_CHARGE_PLOT_E 缺少 0x00 定义(从 EVC_SLOW=0x01 起,evc.h:34),而 EVC_II_CHARGE_PLOT_E(evc_ii.h:43)补了 EVC_II_NONE=0x00。一代若从 Flash 读到未初始化的 u8_plot(0),evc.c:699 的 switch 会落到 default 分支把可充功率置 0。
  2. EVC_CHARGE_MODEL_E 的枚举值不连续:EVC_AVAILABLE_MODEL = 4(evc.h:47),中间值 3 被跳过,这是历史遗留(二代补上了 3 = 即插即用,见 evc_ii.h:64)。云端解析需容忍"3 从不出现"。
  3. EVC_START_MODE_E 只有 3 个状态(evc.h:20),二代扩展为 4 个(evc_ii.h:33),一代代码里 evc.c:1074 只判断 CARD_START,即插即用桩不适用。
  4. u8_reserver[14](evc.h:85)与 u8_reserver[24](evc.h:97)为保留字段,占用 Flash 空间并参与 CRC 计算,改动结构体顺序会破坏已出货设备的配置兼容性。
  5. evc_set_u 是 u16,但 phasecontrol 为 2 bit、remotcontrol 为 1 bit,高 13 位未定义且会原样下发(evc.c:427 整字发送),升级固件时需保持高位为 0。
  6. 头文件中 get_evc_id_info 等 10 个 static 函数不在 evc.h 声明,而升级/查询接口 get_percent_upgrade_evc 之类的跨模块调用靠各自头文件,头文件职责边界清晰,暂无其它问题。