Files

306 lines
8.0 KiB
C
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.
#include "collect_ctrl/yk_ctrl.h"
#include "usart.h"
#include "sys_drv_init.h"
#include "sub_comm/sub_comm_task.h"
#include <string.h>
/* 遥控通道总数自动跟随枚举 E_YK_CTRL_TYPE。 */
#define YK_DATA_NUM ((U8_T)E_KY_TYPE_NUM)
/* 遥控缓存区:
* - u8_data[] 便于按索引批量扫描执行;
* - s_yk_data 便于按“语义字段”点对点写入;
* 两者共用同一块内存,用于“写入命令”和“周期执行命令”的桥接。 */
typedef union
{
/* 按枚举下标访问的原始命令缓存。 */
U8_T u8_data[YK_DATA_NUM];
struct
{
E_CMD e_ctrl_dc_cont1; /* 直流接触器1(一枪主回路)。 */
E_CMD e_ctrl_dc_cont2; /* 直流接触器2(二枪主回路)。 */
E_CMD e_ctrl_dc_bus; /* 直流母联接触器。 */
E_CMD e_ctrl_ac_cont; /* 交流接触器。 */
E_CMD e_ctrl_fan; /* 散热风机。 */
E_CMD e_ctrl_relief_a; /* A枪泄放控制。 */
E_CMD e_ctrl_relief_b; /* B枪泄放控制。 */
E_CMD e_ctrl_lock1; /* 枪A电子锁。 */
E_CMD e_ctrl_lock2; /* 枪B电子锁。 */
E_CMD e_ctrl_aux_power1; /* 辅源1。 */
E_CMD e_ctrl_aux_power2; /* 辅源2。 */
E_CMD e_ctrl_v12_24_sw; /* 12/24V切换控制。 */
E_CMD e_ctrl_ac1; /* 模块交流接触器1。 */
E_CMD e_ctrl_ac2; /* 模块交流接触器2。 */
} s_yk_data;
} U_YK_CTRL_DATA;
/* 遥控命令全局缓存(模块私有):
* - 写入口:v_yk_ctrl_impl()
* - 执行入口:v_yk_ctrl_cheak()
* 当前由采集任务周期调用,默认单任务上下文访问。 */
static U_YK_CTRL_DATA u_yk_data;
/**
* @brief 周期执行遥控缓存中的全部命令。
*
* 执行策略:
* 1) 按 E_YK_CTRL_TYPE 的顺序遍历;
* 2) 将缓存命令传入 v_yk_ctrl() 下发到 DO
* 3) 不在本函数中清命令,保持“电平保持型”行为。
*/
void v_yk_ctrl_cheak(void)
{
U8_T i;
for (i = 0; i < YK_DATA_NUM; i++)
{
v_yk_ctrl((E_YK_CTRL_TYPE)i, (E_CMD)u_yk_data.u8_data[i]); //依次执行遥控命令
}
}
/**
* @brief 将指定遥控类型下发到具体硬件 DO。
*
* @param e_type 遥控类型(决定映射到哪个 DO)。
* @param e_cmd 遥控命令(开/关)。
*
* 说明:
* - 本函数只负责“硬件动作”;
* - 命令缓存维护由 v_yk_ctrl_impl() 负责。
*/
void v_yk_ctrl(E_YK_CTRL_TYPE e_type, E_CMD e_cmd)
{
switch (e_type)
{
case E_KY_TYPE_DC_CONT1: /* 直流接触器1 */
{
DO3(e_cmd);
break;
}
case E_KY_TYPE_DC_CONT2: /* 直流接触器2 */
{
DO6(e_cmd);
break;
}
case E_KY_TYPE_DC_CONT_BUS: /* 母联接触器 */
{
DO9(e_cmd);
break;
}
case E_KY_TYPE_AC_CONT: /* 交流接触器 */
{
DO7(e_cmd);
break;
}
case E_KY_TYPE_FAN_CONT: /* 风扇接触器 */
{
DO10(e_cmd);
break;
}
case E_KY_TYPE_RELIEF_A: /* A枪泄放控制 */
{
DO2(e_cmd);
break;
}
case E_KY_TYPE_RELIEF_B: /* B枪泄放控制 */
{
DO5(e_cmd);
break;
}
case E_KY_TYPE_GUN_LOCK1: /* 枪A电子锁 */
{
ELOCK_A(e_cmd);
break;
}
case E_KY_TYPE_GUN_LOCK2: /* 枪B电子锁 */
{
ELOCK_B(e_cmd);
break;
}
case E_KY_TYPE_AUX_POWER1: /* 辅源1 */
{
/* 辅源1 */
DO1(e_cmd);
break;
}
case E_KY_TYPE_AUX_POWER2: /* 辅源2 */
{
/* 辅源2 */
DO4(e_cmd);
break;
}
case E_KY_TYPE_V12_24_SWITCH: /* 12/24V切换控制 */
{
/* 12/24V切换:下发到副板 DO11 */
v_sub_comm_yk_set(E_SUB_YK_DO11, e_cmd);
break;
}
case E_KY_TYPE_AC1: /* 交流接触器1,主板 DO7 */
{
DO7(e_cmd);
break;
}
case E_KY_TYPE_AC2: /* 交流接触器2,主板 DO8 */
{
DO8(e_cmd);
break;
}
default:
break;
}
}
/**
* @brief 外部遥控写入接口(仅更新缓存,不直接动作)。
*
* @param e_type 遥控类型。
* @param e_cmd 遥控命令。
*
* 使用方式:
* - 上层流程调用本函数写入命令;
* - 采集任务周期调用 v_yk_ctrl_cheak() 统一执行;
* 这样可以把遥控执行节拍收敛到单任务上下文,降低并发风险。
*/
static void v_yk_cache_set(E_YK_CTRL_TYPE e_type, E_CMD e_cmd)
{
switch (e_type)
{
case E_KY_TYPE_DC_CONT1: /* 直流接触器1 */
{
u_yk_data.s_yk_data.e_ctrl_dc_cont1 = e_cmd;
break;
}
case E_KY_TYPE_DC_CONT2: /* 直流接触器2 */
{
u_yk_data.s_yk_data.e_ctrl_dc_cont2 = e_cmd;
break;
}
case E_KY_TYPE_DC_CONT_BUS: /* 母联接触器 */
{
u_yk_data.s_yk_data.e_ctrl_dc_bus = e_cmd;
break;
}
case E_KY_TYPE_AC_CONT: /* 交流接触器 */
{
u_yk_data.s_yk_data.e_ctrl_ac_cont = e_cmd;
break;
}
case E_KY_TYPE_FAN_CONT: /* 风扇接触器 */
{
u_yk_data.s_yk_data.e_ctrl_fan = e_cmd;
break;
}
case E_KY_TYPE_RELIEF_A: /* A枪泄放控制 */
{
u_yk_data.s_yk_data.e_ctrl_relief_a = e_cmd;
break;
}
case E_KY_TYPE_RELIEF_B: /* B枪泄放控制 */
{
u_yk_data.s_yk_data.e_ctrl_relief_b = e_cmd;
break;
}
case E_KY_TYPE_GUN_LOCK1: /* 枪A电子锁 */
{
u_yk_data.s_yk_data.e_ctrl_lock1 = e_cmd;
break;
}
case E_KY_TYPE_GUN_LOCK2: /* 枪B电子锁 */
{
u_yk_data.s_yk_data.e_ctrl_lock2 = e_cmd;
break;
}
case E_KY_TYPE_AUX_POWER1: /* 辅源1 */
{
u_yk_data.s_yk_data.e_ctrl_aux_power1 = e_cmd;
break;
}
case E_KY_TYPE_AUX_POWER2: /* 辅源2 */
{
u_yk_data.s_yk_data.e_ctrl_aux_power2 = e_cmd;
break;
}
case E_KY_TYPE_V12_24_SWITCH: /* 12/24V切换控制 */
{
u_yk_data.s_yk_data.e_ctrl_v12_24_sw = e_cmd;
break;
}
case E_KY_TYPE_AC1: /* 模块交流接触器1 */
{
u_yk_data.s_yk_data.e_ctrl_ac1 = e_cmd;
break;
}
case E_KY_TYPE_AC2: /* 模块交流接触器2 */
{
u_yk_data.s_yk_data.e_ctrl_ac2 = e_cmd;
break;
}
default:
break;
}
}
/**
* @brief 遥控模块初始化。
*
* 初始化互斥锁并清空所有遥控命令缓存,确保上电后不携带历史控制状态。
*/
void v_yk_ctrl_init(void)
{
memset(&u_yk_data, 0, sizeof(U_YK_CTRL_DATA));
}
/**
* @brief 立即执行遥控(更新缓存并下发 DO)。
*
* @param e_type 遥控类型。
* @param e_cmd 遥控命令。
*/
void v_yk_ctrl_impl(E_YK_CTRL_TYPE e_type, E_CMD e_cmd)
{
//更新控制命令状态
v_yk_cache_set(e_type, e_cmd);
//执行控制命令
v_yk_ctrl(e_type, e_cmd);
}
/**
* @brief 获取遥控命令缓存中的对应控制状态。
*
* @param e_type 遥控类型。
* @return E_CMD 遥控命令。
*/
E_CMD e_yk_get_ctrl_cmd(E_YK_CTRL_TYPE e_type)
{
if (e_type < E_KY_TYPE_NUM)
{
return (E_CMD)u_yk_data.u8_data[e_type];
}
return CMD_OFF;
}