/** * @file switch_def.c * @brief 开关控制结构体实现 * @author 虾哥 * @date 2026-04-09 */ #include "switch_def.h" #include /** * @brief 全局变压器控制实例 * * 所有开关控制的全局实例 * 在系统启动时初始化为 0 */ TRANS_CONTROL g_trans_control = {0}; /** * @brief 初始化变压器控制结构 * * 将所有开关状态清零 * 包括合闸命令、分闸命令、故障复位命令等 * * @param ptr 指向 TRANS_CONTROL 结构体的指针 */ void TransControl_Init(TRANS_CONTROL_PTR ptr) { // 参数检查 if (ptr == NULL) { return; } // 清空整个结构体内存 memset(ptr, 0, sizeof(TRANS_CONTROL)); } /** * @brief 合闸操作 * * 设置指定开关的合闸命令 * 同时清除分闸命令,避免冲突 * * @param ptr 指向 TRANS_CONTROL 结构体的指针 * @param sw 指向具体 SWITCH 成员的指针 */ void Switch_Close(TRANS_CONTROL_PTR ptr, SWITCH* sw) { // 参数检查 if ((ptr == NULL) || (sw == NULL)) { return; } // 检查开关是否在有效范围内 if ((uint8_t*)sw < (uint8_t*)ptr || (uint8_t*)sw >= (uint8_t*)ptr + sizeof(TRANS_CONTROL)) { return; } // 设置合闸命令 sw->close_cmd = 1; // 清除分闸命令,避免同时合分 sw->open_cmd = 0; } /** * @brief 分闸操作 * * 设置指定开关的分闸命令 * 同时清除合闸命令,避免冲突 * * @param ptr 指向 TRANS_CONTROL 结构体的指针 * @param sw 指向具体 SWITCH 成员的指针 */ void Switch_Open(TRANS_CONTROL_PTR ptr, SWITCH* sw) { // 参数检查 if ((ptr == NULL) || (sw == NULL)) { return; } // 检查开关是否在有效范围内 if ((uint8_t*)sw < (uint8_t*)ptr || (uint8_t*)sw >= (uint8_t*)ptr + sizeof(TRANS_CONTROL)) { return; } // 设置分闸命令 sw->open_cmd = 1; // 清除合闸命令,避免同时合分 sw->close_cmd = 0; } /** * @brief 故障复位操作 * * 设置指定开关的故障复位命令 * 用于清除开关的故障状态 * * @param ptr 指向 TRANS_CONTROL 结构体的指针 * @param sw 指向具体 SWITCH 成员的指针 */ void Switch_Reset(TRANS_CONTROL_PTR ptr, SWITCH* sw) { // 参数检查 if ((ptr == NULL) || (sw == NULL)) { return; } // 检查开关是否在有效范围内 if ((uint8_t*)sw < (uint8_t*)ptr || (uint8_t*)sw >= (uint8_t*)ptr + sizeof(TRANS_CONTROL)) { return; } // 设置故障复位命令 sw->reset_cmd = 1; } /** * @brief 获取开关状态 * * 读取指定开关的当前状态 * * @param sw 指向具体 SWITCH 成员的指针 * @return uint8_t 开关状态:1=合位,0=分位 */ uint8_t Switch_GetStatus(SWITCH* sw) { // 参数检查 if (sw == NULL) { return 0; } return sw->status; } /** * @brief 获取故障状态 * * 读取指定开关的故障状态 * * @param sw 指向具体 SWITCH 成员的指针 * @return uint8_t 故障状态:1=故障,0=正常 */ uint8_t Switch_GetFaultStatus(SWITCH* sw) { // 参数检查 if (sw == NULL) { return 0; } return sw->fault_status; } /** * @brief 设置开关状态 * * 更新指定开关的实际状态 * 通常由硬件反馈更新 * * @param sw 指向具体 SWITCH 成员的指针 * @param status 开关状态:1=合位,0=分位 */ void Switch_SetStatus(SWITCH* sw, uint8_t status) { // 参数检查 if (sw == NULL) { return; } sw->status = status; } /** * @brief 设置故障状态 * * 更新指定开关的故障状态 * 通常由保护电路反馈更新 * * @param sw 指向具体 SWITCH 成员的指针 * @param fault_status 故障状态:1=故障,0=正常 */ void Switch_SetFaultStatus(SWITCH* sw, uint8_t fault_status) { // 参数检查 if (sw == NULL) { return; } sw->fault_status = fault_status; } /** * @brief 清除所有命令 * * 清除指定开关的所有控制命令 * 用于执行完操作后复位命令状态 * * @param sw 指向具体 SWITCH 成员的指针 */ void Switch_ClearCommands(SWITCH* sw) { // 参数检查 if (sw == NULL) { return; } sw->close_cmd = 0; sw->open_cmd = 0; sw->reset_cmd = 0; } /** * @brief 打印开关信息(调试用) * * 输出指定开关的当前状态到调试终端 * * @param name 开关名称(如 "1-QF1") * @param sw 指向具体 SWITCH 成员的指针 */ void Switch_PrintInfo(const char* name, SWITCH* sw) { // 参数检查 if ((name == NULL) || (sw == NULL)) { return; } // 打印开关信息 printf("[%s] 状态=%d, 故障=%d, 合闸=%d, 分闸=%d, 复位=%d\r\n", name, sw->status, sw->fault_status, sw->close_cmd, sw->open_cmd, sw->reset_cmd); }