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

190 lines
11 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.
# 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切换 = 副板 DO11SubComm 下发)
E_KY_TYPE_AUX_POWER1 辅源1 = 副板 DO15SubComm 下发)
E_KY_TYPE_AUX_POWER2 辅源2 = 副板 DO16SubComm 下发)
```
对应实现:`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` 当前目录下未找到;如该设计文档实际存在,建议补充到本目录并在此处建立链接,便于维护对照。