Initial commit: CCU621_M firmware project with BLE debug link support.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
# collect_ctrl 模块说明
|
||||
|
||||
> 路径:`app/collect_ctrl/`
|
||||
> 返回主说明:[README](../../README.md)
|
||||
|
||||
## 1. 模块职责
|
||||
|
||||
- 数据采集任务(DataColl)实现:周期调度、任务锁、喂狗、周期运行日志;
|
||||
- 维护“遥信/遥测(YXYC)”实时数据镜像,并对外提供统一读取接口;
|
||||
- 维护“遥控(YK)”命令缓存,提供对外设置接口与任务内统一执行入口;
|
||||
- 提供温度/枪温采集的循环框架(片选切换 + 周期读取 + 缓存),为后续接入真实 ADC/SPI 采集预留入口。
|
||||
|
||||
## 2. 关键文件
|
||||
|
||||
- `collect_task.c`
|
||||
- `collect_task.h`
|
||||
- `yk_ctrl.c`
|
||||
- `yk_ctrl.h`
|
||||
- `led_ctrl.c`
|
||||
- `led_ctrl.h`
|
||||
|
||||
## 3. 功能说明
|
||||
|
||||
### 3.1 任务模型(DataColl)
|
||||
|
||||
- **任务 ID 与调度**:任务 ID 使用 `TASK_ID_DataColl`;睡眠周期通过 `MY_GET_SLEEP_TIME(TASK_ID_DataColl)` 获取(宏 `DATACOLL_SLEEP_TIME_MS()`)。
|
||||
- **任务锁**:通过 `u8_task_lock_ctrl()` 实现互斥(宏 `DATACOLL_LOCK_INIT/TAKE/GIVE`),保证“写入更新/对外读取”之间的数据一致性。
|
||||
- **喂狗**:任务循环内调用 `v_wdt_setFlag(TASK_ID_DataColl)`(宏 `DATACOLL_FEED_DOG()`)。
|
||||
- **运行日志**:按 `TASK_RUN_PRINT_TIME` 周期尝试获取锁并输出运行日志(避免与数据更新互相干扰)。
|
||||
|
||||
对应入口:`v_collect_task(void *arg)`、初始化:`v_collect_task_init()` → `v_init_collect()`。
|
||||
|
||||
### 3.2 实时数据镜像(遥信/遥测,YXYC)
|
||||
|
||||
模块内部维护全局镜像 `sys_yxyc_data`(类型 `YXYC_DATA`),包含:
|
||||
|
||||
- **整桩数据**:`SYS_RT_DATA s_sys_rt_data`
|
||||
- **单枪数据**:`GUN_RT_DATA s_gun_rt_data[GUN_MAX_CNT]`
|
||||
- **枪数量/适配项**:`u8_gunNo`、`u8_gunLockNeg[]`(用于“电子锁输入取反”适配)
|
||||
|
||||
数据更新入口:
|
||||
|
||||
- `v_update_gun_yxyc(GUN_RT_DATA* p_gun, U8_T u8_gunNo)`:更新指定枪的遥信/遥测字段(内部会根据 `u8_gunLockNeg` 处理锁输入取反)。
|
||||
- 采集来源按“对接外部接口”集中在四个函数内(后续需要改点位时,直接改这些 switch-case 即可):
|
||||
- `u8_coll_get_yx_sys()`:整桩遥信(目前主要来自**副板 DI13~DI19**,通过 `SubComm` 缓存读取)。
|
||||
- `u8_coll_get_yx_gun()`:单枪遥信(目前来自**主板 DI1~DI10** 等)。
|
||||
- `f32_coll_get_yc_gun()`:单枪遥测(目前来自 ADC 缓存读取 `f_get_gun_data(E_ADC_TYPE_xxx)`)。
|
||||
- `f32_coll_get_yc_sys()`:整桩遥测(目前用进/出风口温度缓存映射为桩温1/2)。
|
||||
|
||||
对外读取接口(均带任务锁保护):
|
||||
|
||||
- `U8_T u8_get_yxyc_data(SYS_RT_DATA *pile_data, GUN_RT_DATA *gun_data, U8_T u8_gunNo)`:一次性拷贝获取整桩 + 指定枪数据(任一入参为 NULL 则跳过该部分)。
|
||||
- `U8_T u8_get_gun_yx_data(E_YX_GUN gun_yx_type, U8_T u8_gunNo)`:读取单枪遥信(如枪连接、电子锁、接触器、熔断器、归位等)。
|
||||
- `F32_T f32_get_gun_yc_data(E_YC_GUN gun_yc_type, U8_T u8_gunNo)`:读取单枪遥测(母线电压、枪温、回路电流等)。
|
||||
- `U8_T u8_get_sys_yx_data(E_YX_SYS sys_yx_type)`:读取整桩遥信(急停、门禁、水浸、防雷、烟感、交流接触器/断路器等)。
|
||||
- `F32_T f32_get_sys_yc_data(E_YC_SYS sys_yc_type)`:读取整桩遥测(例如桩温 1/2)。
|
||||
|
||||
### 3.3 遥控命令缓存与执行(YK)
|
||||
|
||||
为了避免外部模块“直接打 DO”导致状态不可追踪/动作不可控,本模块提供“遥控命令缓存 → 任务内统一执行”的机制:
|
||||
|
||||
- **代码位置**:YK 逻辑已从 `collect_task.c` 拆分为独立文件 `yk_ctrl.c/.h`,由采集任务周期调用执行。
|
||||
- **缓存结构**:`yk_ctrl.c` 内部维护遥控缓存(`U_YK_CTRL_DATA`),按 `YK_DATA_NUM` 维护多路控制命令(直流接触器1/2、母联、交流接触器、风扇、泄放继电器、枪 A/B 电子锁等)。
|
||||
- **对外设置接口**:`v_yk_ctrl_impl(E_YK_CTRL_TYPE e_type, E_CMD e_cmd)`,仅更新缓存,不直接控制 IO。
|
||||
- **任务内执行入口**:
|
||||
- `v_yk_ctrl_init()`:清空缓存;
|
||||
- `v_yk_ctrl_cheak()`:遍历缓存并调用 `v_yk_ctrl()` 执行动作;
|
||||
- `v_yk_ctrl(E_YK_CTRL_TYPE e_type, E_CMD e_cmd)`:底层执行:
|
||||
- **主板 DO**:直流接触器/母联/交流接触器/风机/泄放等走 `DOx()`;
|
||||
- **主板 PK1/PK2**:电子锁走 `ELOCK_A()/ELOCK_B()`;
|
||||
- **副板 DO11/DO15/DO16**:12/24V 切换与辅源控制通过 `v_sub_comm_yk_set()` 下发到副板。
|
||||
|
||||
> 注意:`v_yk_ctrl_cheak()` 需要在 DataColl 任务周期里调用才符合“统一时序执行”的设计初衷;若外部在其他上下文频繁写入缓存,应评估并发一致性(当前 `u_yk_data` 未加锁)。
|
||||
|
||||
### 3.4 温度/枪温采集框架(ADC)
|
||||
|
||||
模块内提供“片选切换 + 周期读取 + 缓存”的枪温/温度采集框架:
|
||||
|
||||
- `S_ADC_GUN_CTRL s_adc_gun_ctrl`:维护通道切换状态(`flag_set/flag_read`)、计时(`u16_timer_cnt`)、缓存数组:
|
||||
- `f_adc_data[6]`:4 路枪温 + 2 路进/出风口温度;
|
||||
- `f_adc_dc_vol[4]`:直流母线电压采集缓存(目前示例代码保留)。
|
||||
- `v_set_adc()`:按状态机切换温度传感器通道(调用 `select_temp_channel()`)。
|
||||
- `v_gun_temp_loop(U16_T u16_leep_time)`:按固定节拍读取 `adc_readval()` 并推进通道切换。
|
||||
- `float f_get_gun_data(E_ADC_TYPE e_type)`:统一读取缓存并做简单限幅(如温度超过 `TEMP_MAX_NUM` 则返回 0)。
|
||||
|
||||
> 目前枪连接状态 `u8_get_gunLink()` 以及部分 ADC 电压采集为“预留对接点”,系统集成时按硬件方案补齐实现即可。
|
||||
|
||||
### 3.5 指示灯状态缓存(LED)
|
||||
|
||||
为适配“本项目不执行 `v_led_do_ctrl()` 硬件灯控动作”的现状,`led_ctrl.c` 目前主要承担**状态计算与缓存**职责:
|
||||
|
||||
- `v_led_state_refresh()`:按现有规则计算 A/B 两把枪 LED 状态,并写入全局缓存;
|
||||
- `u8_led_state_get(u8_gunNo)`:读取指定枪 LED 状态缓存(`E_LED_STATE_TYPE` 编码);
|
||||
- `v_led_ctrl(u16_sleepTime)`:不再直接下发硬件动作,内部改为刷新缓存并维护周期计数;
|
||||
- `v_led_init()`:初始化时清零缓存并执行一次刷新。
|
||||
|
||||
`sub_comm_task.c` 在组 0x04 枪信息帧时通过上述接口读取 LED 状态,避免在 `sub_comm` 内重复维护一套灯态判定逻辑。
|
||||
|
||||
### 3.6 遥控/遥信/遥测点位与板卡位置表(主板/副板)
|
||||
|
||||
说明:
|
||||
|
||||
- **主板 DI/DO/PK**:见 `BSP/sys_drv_init.h`(`DI1~DI12`、`DO1~DO10`、`ELOCK_A/B(PK1/PK2)`)。
|
||||
- **副板 DI/DO**:通过 `app/sub_comm/sub_comm_task.c` 的 USART0 协议接入:
|
||||
- DI 状态命令 `0x01`:更新 `u8_sub_comm_yx_get(E_SUB_YX_xx)`(当前用 bit-map 解包)。
|
||||
- DO 控制命令 `0x02`:下发 `v_sub_comm_yk_set(E_SUB_YK_DOxx, CMD_ON/OFF)`(当前 2 字节 bit-map 编码)。
|
||||
|
||||
#### 3.6.1 整桩遥信(系统 YX,来源:副板 DI13~DI19)
|
||||
|
||||
```text
|
||||
YX_PILE_EMERGENCY 急停开关状态 = 副板 DI13 = u8_sub_comm_yx_get(E_SUB_YX_13)
|
||||
YX_PILE_DOOR 门禁开关状态 = 副板 DI14 = u8_sub_comm_yx_get(E_SUB_YX_14)
|
||||
YX_PILE_WARTER 水浸开关状态 = 副板 DI15 = u8_sub_comm_yx_get(E_SUB_YX_15)
|
||||
YX_PILE_KM 交流接触器状态 = 副板 DI16 = u8_sub_comm_yx_get(E_SUB_YX_16)
|
||||
YX_PILE_SPD 防雷器状态 = 副板 DI17 = u8_sub_comm_yx_get(E_SUB_YX_17)
|
||||
YX_PILE_QF 交流进线开关状态 = 副板 DI18 = u8_sub_comm_yx_get(E_SUB_YX_18)
|
||||
YX_PILE_BUS_KM 母联直流接触器状态 = 副板 DI19 = u8_sub_comm_yx_get(E_SUB_YX_19)
|
||||
YX_PILE_SMOKE 烟感状态 = 预留/待对接(当前默认 0)
|
||||
```
|
||||
|
||||
对应实现:`collect_task.c` 的 `u8_coll_get_yx_sys()`。
|
||||
|
||||
#### 3.6.2 单枪遥信(枪 YX,来源:主板 DI1~DI10 等)
|
||||
|
||||
```text
|
||||
YX_GUN_LOCK 枪电子锁状态 = 主板 DI1/DI7 (A枪/B枪) (注:实际电子锁输出为 PK1/PK2,锁“状态”输入点位需按硬件对接)
|
||||
YX_GUN_DC_KM 直流接触器状态 = 主板 DI2/DI6
|
||||
YX_GUN_RELIF 泄放继电器状态 = 主板 DI4/DI9
|
||||
YX_GUN_DC_FUSE 直流熔断器状态 = 主板 DI3/DI8
|
||||
YX_GUN_HOMING 枪归位状态 = 主板 DI5/DI10
|
||||
YX_GUN_AUXPOWER 低压辅源状态 = 预留/待对接(当前默认 0)
|
||||
YX_GUN_LINK 枪连接状态 = u8_get_gunLink(u8_gunNo)(对接点)
|
||||
```
|
||||
|
||||
对应实现:`collect_task.c` 的 `u8_coll_get_yx_gun()`。
|
||||
|
||||
#### 3.6.3 单枪遥测(枪 YC,来源:ADC 缓存 `f_get_gun_data()`)
|
||||
|
||||
```text
|
||||
ADC_GUN_VOLT_PLUS 直流母线正对地电压 = f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_A1/B1)
|
||||
ADC_GUN_VOLT_MINUS 直流母线负对地电压 = f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_A2/B2)
|
||||
ADC_GUN_BAT_PLUS 接触器外侧正对地电压 = 复用 DC_VOL_A1/B1(后续按硬件改)
|
||||
ADC_GUN_BAT_MINUS 接触器外侧负对地电压 = 复用 DC_VOL_A2/B2(后续按硬件改)
|
||||
ADC_GUN_TEMP_PLUS 枪正极温度 = f_get_gun_data(E_ADC_TYPE_GUN_TEMP_A1/B1)
|
||||
ADC_GUN_TEMP_MINUS 枪负极温度 = f_get_gun_data(E_ADC_TYPE_GUN_TEMP_A2/B2)
|
||||
ADC_GUN_MVI 回路电流 = 预留/待对接(当前默认 0)
|
||||
```
|
||||
|
||||
对应实现:`collect_task.c` 的 `f32_coll_get_yc_gun()`。
|
||||
|
||||
#### 3.6.4 整桩遥测(系统 YC,来源:进/出风口温度缓存)
|
||||
|
||||
```text
|
||||
ADC_PILE_TEMP1 桩温1 = f_get_gun_data(E_ADC_TYPE_FAN_IN_TEMP)
|
||||
ADC_PILE_TEMP2 桩温2 = f_get_gun_data(E_ADC_TYPE_FAN_OUT_TEMP)
|
||||
```
|
||||
|
||||
对应实现:`collect_task.c` 的 `f32_coll_get_yc_sys()`。
|
||||
|
||||
#### 3.6.5 遥控(YK,主板 DO/PK + 副板 DO)
|
||||
|
||||
```text
|
||||
E_KY_TYPE_DC_CONT1 直流接触器1 = 主板 DO3
|
||||
E_KY_TYPE_DC_CONT2 直流接触器2 = 主板 DO6
|
||||
E_KY_TYPE_DC_CONT_BUS 直流母联接触器 = 主板 DO9
|
||||
E_KY_TYPE_AC_CONT 交流接触器 = 主板 DO7
|
||||
E_KY_TYPE_FAN_CONT 散热风机 = 主板 DO10
|
||||
E_KY_TYPE_RELIEF_A A枪泄放 = 主板 DO2
|
||||
E_KY_TYPE_RELIEF_B B枪泄放 = 主板 DO5
|
||||
E_KY_TYPE_GUN_LOCK1 A枪电子锁 = 主板 PK1 (ELOCK_A)
|
||||
E_KY_TYPE_GUN_LOCK2 B枪电子锁 = 主板 PK2 (ELOCK_B)
|
||||
E_KY_TYPE_V12_24_SWITCH 12/24V切换 = 副板 DO11(SubComm 下发)
|
||||
E_KY_TYPE_AUX_POWER1 辅源1 = 副板 DO15(SubComm 下发)
|
||||
E_KY_TYPE_AUX_POWER2 辅源2 = 副板 DO16(SubComm 下发)
|
||||
```
|
||||
|
||||
对应实现:`yk_ctrl.c` 的 `v_yk_ctrl()`。
|
||||
|
||||
## 4. 维护建议
|
||||
|
||||
- **更新与读取要保持一致性**:对外读取接口已加任务锁;如果增加“周期更新整桩/整枪数据”的逻辑,建议也在同一把 `DATACOLL` 锁内完成。
|
||||
- **按职责分层扩展**:建议按“采集(驱动对接)/数据整形(单位换算、限幅、去抖)/对外发布(接口、共享区)”分层维护,避免在任务循环里堆叠业务。
|
||||
- **日志节流**:保持 `TASK_RUN_PRINT_TIME` 这类周期日志输出,避免高频打印影响实时性。
|
||||
- **遥控并发**:若外部可能在中断或多任务环境写 `v_yk_ctrl_impl()`,建议补充锁/临界区,或改为消息队列/事件投递。
|
||||
|
||||
## 5. 关联文档
|
||||
|
||||
- 主索引:[README](../../README.md)
|
||||
- 备注:`collect_task.c` 头部注释里提到的 `collectTask_readme.md` 当前目录下未找到;如该设计文档实际存在,建议补充到本目录并在此处建立链接,便于维护对照。
|
||||
Reference in New Issue
Block a user