Co-authored-by: Cursor <cursoragent@cursor.com>
11 KiB
collect_ctrl 模块说明
路径:
app/collect_ctrl/
返回主说明:README
1. 模块职责
- 数据采集任务(DataColl)实现:周期调度、任务锁、喂狗、周期运行日志;
- 维护“遥信/遥测(YXYC)”实时数据镜像,并对外提供统一读取接口;
- 维护“遥控(YK)”命令缓存,提供对外设置接口与任务内统一执行入口;
- 提供温度/枪温采集的循环框架(片选切换 + 周期读取 + 缓存),为后续接入真实 ADC/SPI 采集预留入口。
2. 关键文件
collect_task.ccollect_task.hyk_ctrl.cyk_ctrl.hled_ctrl.cled_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()下发到副板。
- 主板 DO:直流接触器/母联/交流接触器/风机/泄放等走
注意:
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 编码)。
- DI 状态命令
3.6.1 整桩遥信(系统 YX,来源:副板 DI13~DI19)
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 等)
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())
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,来源:进/出风口温度缓存)
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)
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
- 备注:
collect_task.c头部注释里提到的collectTask_readme.md当前目录下未找到;如该设计文档实际存在,建议补充到本目录并在此处建立链接,便于维护对照。