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

11 KiB
Raw Permalink Blame History

collect_ctrl 模块说明

路径:app/collect_ctrl/
返回主说明:README

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_gunNou8_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/DO1612/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.hDI1~DI12DO1~DO10ELOCK_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

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.cu8_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.cu8_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.cf32_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.cf32_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切换          = 副板 DO11SubComm 下发)
E_KY_TYPE_AUX_POWER1     辅源1               = 副板 DO15SubComm 下发)
E_KY_TYPE_AUX_POWER2     辅源2               = 副板 DO16SubComm 下发)

对应实现:yk_ctrl.cv_yk_ctrl()

4. 维护建议

  • 更新与读取要保持一致性:对外读取接口已加任务锁;如果增加“周期更新整桩/整枪数据”的逻辑,建议也在同一把 DATACOLL 锁内完成。
  • 按职责分层扩展:建议按“采集(驱动对接)/数据整形(单位换算、限幅、去抖)/对外发布(接口、共享区)”分层维护,避免在任务循环里堆叠业务。
  • 日志节流:保持 TASK_RUN_PRINT_TIME 这类周期日志输出,避免高频打印影响实时性。
  • 遥控并发:若外部可能在中断或多任务环境写 v_yk_ctrl_impl(),建议补充锁/临界区,或改为消息队列/事件投递。

5. 关联文档

  • 主索引:README
  • 备注:collect_task.c 头部注释里提到的 collectTask_readme.md 当前目录下未找到;如该设计文档实际存在,建议补充到本目录并在此处建立链接,便于维护对照。