- switch_def.h: SWITCH 和 TRANS_CONTROL 结构体定义 - switch_def.c: 开关控制函数实现(初始化/合闸/分闸/复位) - switch_example.c: 完整使用示例代码 包含所有开关: - 1-QF (1-12, 14-16, 20) 共 16 个 - 2-QF (1-13, 16-18, 20, 30) 共 18 个 - 3-QF (1-5, 8-9, 11-14, 16-22) 共 18 个 - F1-QF (1-3) 共 3 个 - F2-QF (1-3) 共 3 个 - F3-QF (1-3) 共 3 个 - 4-QF (2-9, 21-26, 28, 31-41) 共 26 个 - 5-QF (2-6, 31-34) 共 9 个 - 6-QF (1-9) 共 9 个 总计:105 个断路器开关
253 lines
5.0 KiB
C
253 lines
5.0 KiB
C
/**
|
||
* @file switch_def.c
|
||
* @brief 开关控制结构体实现
|
||
* @author 虾哥
|
||
* @date 2026-04-09
|
||
*/
|
||
|
||
#include "switch_def.h"
|
||
#include <string.h>
|
||
|
||
/**
|
||
* @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);
|
||
}
|