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 内存布局约束
#pragma pack(1)(evc.h:57)到#pragma pack()(evc.h:347)之间所有结构体按 1 字节对齐。这既用于 RS485 直接整块收发,也用于 Flash 整页读写。STATIC_ASSERT(ASSERT_FLASH_SECTOR_SIZE % sizeof(...) == 0)(evc.h:89、evc.h:101)在编译期强制两张配置表的大小能整除 Flash 扇区,保证"擦一页写一张表"不会跨扇区丢数据。宏定义位于midware/debug/debug.h:16。- 所有表以
u16_head开头、以u16_crc_code结尾,是data/system_config侧统一的"配置表 + Modbus CRC 校验"惯例,初值由system_config.c:782、system_config.c:822写入。
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. 对外接口
导出的函数(供外部调用)
evc_control():被midware/interface/interface.c:351调用。get_evc_enable_flag():被interface.c:331、data/resume_data/flash/flash_data_store.c:673、logic/logic.c:164、net/ems.c:540调用。get_evc_power_total():flash_data_store.c:673、logic.c:165、net/ems.c:540。get_evc_energy_total():flash_data_store.c:1037、midware/interface/modbus/modbus.c:933/944、net/ems.c:760。get_evc_chargemodel():modbus.c:956、net/ems.c:1010。get_evc_type():net/ems.c:3015/3096、net/server.c:3305/3709。clear_evc_energy():net/server.c:1222。set_evc_charge_flag():net/server.c:1772。
导出的全局变量(供外部读写)
g_evc_send_buf/g_evc_recv_buf:被evc_ii.c:28-29、evc_upgrade.c:28-29取址复用。g_t_evc_setting_info/g_t_evc_config_table:被data/system_config/system_config.c:782-836初始化并写 Flash。g_t_evc_run_info:被data/fault_warn_log/fault_warn_log.c:1102-1142读取故障字做故障记录。g_t_evc_debug_data:供 HMI/调试界面观察。
本文件依赖的外部声明
includes.h(u8/u16/s16/s32/bool/TRUE/FALSE 等基础类型与 STATIC_ASSERT 所在链)、midware/debug/debug.h(STATIC_ASSERT、DEBUG_* 工具)。头文件本身不引用其它模块函数。
6. 依赖关系
- 依赖:
includes.h(evc.h:9)、midware/debug/debug.h(evc.h:10);结构体定义间接依赖data/system_config/system_config.h中的ASSERT_FLASH_SECTOR_SIZE。 - 被依赖:
midware/evc/evc.c(evc.c:13,本模块主实现)midware/evc/evc_ii.c(evc_ii.c:14,复用EVC_BUF_LEN与收发缓存)midware/evc/evc_upgrade.c/evc_upgrade.h(evc_upgrade.c:16、evc_upgrade.h:10)midware/interface/interface.c、data/system_config/system_config.c、data/fault_warn_log/fault_warn_log.c、midware/interface/modbus/modbus.c、net/ems.c、net/server.c、logic/logic.c、data/resume_data/flash/flash_data_store.c
7. 备注与风险点
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。EVC_CHARGE_MODEL_E的枚举值不连续:EVC_AVAILABLE_MODEL = 4(evc.h:47),中间值 3 被跳过,这是历史遗留(二代补上了 3 = 即插即用,见evc_ii.h:64)。云端解析需容忍"3 从不出现"。EVC_START_MODE_E只有 3 个状态(evc.h:20),二代扩展为 4 个(evc_ii.h:33),一代代码里evc.c:1074只判断CARD_START,即插即用桩不适用。u8_reserver[14](evc.h:85)与u8_reserver[24](evc.h:97)为保留字段,占用 Flash 空间并参与 CRC 计算,改动结构体顺序会破坏已出货设备的配置兼容性。evc_set_u是u16,但phasecontrol为 2 bit、remotcontrol为 1 bit,高 13 位未定义且会原样下发(evc.c:427整字发送),升级固件时需保持高位为 0。- 头文件中
get_evc_id_info等 10 个static函数不在evc.h声明,而升级/查询接口get_percent_upgrade_evc之类的跨模块调用靠各自头文件,头文件职责边界清晰,暂无其它问题。