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

81 lines
4.2 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.
# meter_calculate 模块说明
> 路径:`app/meter_calculate/`
> 返回主说明:[README](../../README.md)
## 1. 模块职责
- 提供电表采集与计量计费两类任务能力:`meter_coll_task` 负责电表数据采集,`meterfee_task` 负责订单计量与费用累计;
- 维护充电订单生命周期数据(开始、充电中、结束)并对外提供订单读写接口;
- 提供费率查询、周期计量、下周期金额预估能力;
- 对接故障系统,处理计量跳变、费率时间异常等故障置位/恢复;
- 对接 Flash/EEPROM 订单存储与未结算订单管理,支持掉电续传和平台结算确认。
## 2. 关键文件
- `meter_coll_task.c/.h`:电表通信采集任务与底层数据更新;
- `calculate_task.c/.h`:计量计费任务(`v_meterfee_task`)及计费控制结构;
- `meter_calculate_impl.c/.h`:计量对外接口、订单数据接口、故障与结算接口;
- `BSP/flash_file_mgr/meter_calculate_flash_impl.c/.h`:订单正式记录与临时订单 EEPROM/Flash 持久化;
- `BSP/flash_file_mgr/unsettled_order_mng.c/.h`:未结算订单索引管理。
## 3. 功能说明
### 3.1 任务与调度模型
- `v_meterfee_task()` 在系统任务表中按周期运行,流程为:
- 初始化计量控制对象 `s_metering_ctrl`
- 初始化订单存储模块 `v_chg_order_flash_init()` 与未结算模块 `v_unsettled_order_init()`
- 循环执行 `v_meterlog_action_cheak()`(计费启停状态机)和 `v_meterlog_ctrl()`(周期计费);
- 周期喂狗、日志输出与睡眠调度。
- 计量主循环按 5 秒节拍进行电量与费用更新,充电中每 60 秒刷新一次 EEPROM 临时订单。
### 3.2 计量与计费流程
- 通过 `u64_meterlog_get_meter_data()` 获取电表电量(0.0001kWh 精度);
- 首次计量记录起始电量,后续计算循环差分电量并累计到:
- 总电量 `u32_used_energy`
- 分时段电量 `u32_part_energy[period]`
- 电费 `u32_used_money`
- 服务费 `u32_used_service`
- `v_meterlog_real_fee_updata()` 根据当前时间计算 15 分钟时段索引(0~95),并更新充电/放电费率缓存;
- `u32_meterlog_next_cycle_money()` 提供下一周期金额预测(基于当前电压电流和费率)。
### 3.3 订单生命周期管理
- 启动充电:`v_meterlog_set_start_char_log_info()` 清零并写入启动订单关键信息(交易号、用户、VIN、起始电量、起始时间);
- 充电中:`v_meterlog_log_updata()` 持续更新结束时间、结束电量、SOC、已充时长;
- 停止充电:`v_meterlog_set_stop_char_log_info()` 写入停止原因并更新末态数据;
- 对外接口:
- `v_meterlog_put_char_log_data()` 读取订单完整结构;
- `v_meterlog_set_char_log_info()` 按字段更新订单;
- `u32_meterlog_put_data()` 按枚举提取关键订单字段。
### 3.4 存储与结算接口
- `v_meterlog_flash_save_log(u8_flag, u8_gunNo)`
- `u8_flag=0`:充电中更新 EEPROM 临时订单(未结算标志);
- `u8_flag=1`:结束后保存正式订单到 Flash,记录 `u32_index`,加入未结算列表,并清除临时订单。
- `u8_platform_settlement_confirm(orderIndex)`:平台确认结算后,从未结算列表移除订单;
- `u8_check_order_settlement_status(orderIndex)`:查询订单是否已结算(0 已结算,1 未结算)。
### 3.5 故障处理
- 计量相关故障由 `v_meterlog_set_fault()` 统一上报:
- `E_FAULT_17007`:电表跳变异常;
- `E_FAULT_17008`:电量长时间未更新;
- `E_FAULT_17009`:费率/时间异常。
- 计费停止后会执行对应恢复逻辑,避免故障状态长期残留。
## 4. 维护建议
- 调整计量周期、临时订单保存周期(当前 60 秒)时,需同步评估 EEPROM 擦写寿命与掉电恢复精度;
- 修改费率来源时,优先保持 `u32_meterlog_get_sys_data()` 作为统一入口,避免业务层直连全局配置;
- 若后续接入平台上送流程,可在 `v_set_plat_log_flag()` 增加上送触发逻辑并和未结算列表闭环验证;
- 建议联动验证三类场景:正常停机、异常掉电恢复、平台延迟结算。
## 5. 关联文档
- `BSP/flash_file_mgr/flash_file_mgr模块说明.md`
- 主索引:[README](../../README.md)