/****************************************************************************** 版权所有: 文件名称: switch.c 文件版本: 01.01 创建作者: sunxi 创建日期: 2013-04-15 功能说明: DTU核心处理程序以开关为单位,循环处理。 其它说明: 修改记录: */ /*------------------------------- 头文件 -------------------------------------- */ #include "head.h" #ifdef CPU_FUXI #include "rt_clib.h" #include "fourier.h" #endif /*------------------------------- 宏定义 -------------------------------------- */ #ifdef CPU_FUXI #define AUTO_ADJUST_NUM 1 // 自动校准时平均的次数 #else #define AUTO_ADJUST_NUM 50 // 自动校准时平均的次数 #endif #define MEA_CAL_NUMBER 5 // 实际测量时平均的次数 //#define MEA_CAL_HARMONIC 14 //(CFG_ADC_DOTS_PER_PERIOD/2) // 谐波计算的次数 /*------------------------------ 全局变量 ------------------------------------- */ int g_sw_init; // SW是否初始化 struct ui g_ui[UI_NUM]; // 电压电流模拟量计算的综合结构 struct ui_jy g_ui_jy[3]; // 方向判断中的记忆电压 struct ui120 Us1_120,Us2_120; struct ui_p0 g_ui_p0[SWITCH_NUM_MAX]; //零序功率 int g_ui_angle0; // 角度计算时,作为参考电压通道在g_ui中的索引 int g_prot_index; // 保护计算时,采样通道中采样点的索引 struct sw g_sw[SWITCH_NUM_EXT]; // 开关综合结构 struct sw_public g_sw_pub; // 开关公共部分综合结构 int g_mea_cnt = 0; // 测量计数 int g_harmonic_num = 13; // 默认计算13次谐波 // 谐波系数修正 float g_harmonic_factor[CFG_ADC_DOTS_PER_PERIOD/2] = { 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0, }; // 开关开入名称 const s8 * g_sw_di_name[SW_DI_NUM] = { "合位开入", // 1 "分位开入",// 2 "隔离刀闸", // 3 "接地刀闸", // 4 #ifdef DISP_DOUBLE_CN "弹簧未储能", // 5 "弹簧已储能", // 5 #else "弹簧储能位", // 5 #endif "气压低", // 6 "HQ开入", // 7 "TQ开入", // 8 "电源侧瞬压", // 9 "负荷侧瞬压", // 10 "手动合闸", // 11 "手动分闸", // 12 //#ifdef GD_AREA_ECZD_2020//2020指导意见使用停用FA及保护 #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020//2020指导意见使用停用FA及保护 "停用FA及保护", #else "保护总功能投入", #endif #ifdef GD_AREA_MAIN_2020 "常规保护压板", //13 "重合闸投入压板", // 14 "馈线自动化压板", // 15 "智能分布式压板", // 16 #elif defined GD_AREA_ECZD_2020 && !defined GD_AREA_ZHONGSHAN_2020 "常规保护压板", //13 "重合闸投入压板", // 14 "常规FA压板", // 15 "智能分布式FA压板", // 16 #else "常规保护压板", //13 "重合闸投入压板", // 14 "就地FA压板", // 15 "智能FA压板", // 16 #endif "联络/分段模式", // 17 "开关远方", // 18 "闭锁重合闸", // 19 //#ifdef GD_AREA_ECZD_2020 #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020//2020指导意见使用停用FA及保护 "停用同期压板", // 20 #else "同期压板", // 20 #endif "控制回路断线", // 21 "脉冲计数1", // 22 "脉冲计数2", // 23 "就地FA闭锁压板",//"开入8",// 31 #ifdef GD_AREA_ECZD_2020//2020指导意见使用停用解列压板 "停用自动解列功能压板", #elif defined GD_AREA_MAIN_2020 "停用解列功能压板", #else "频率电压解列压板", #endif #ifdef TYTQ_DI_YB "停用检同期压板", // 24 #else "开入1", // 24 #endif #ifdef JZS_FUNCTION "集中式投退压板", // #else "开入2", // 25 #endif #ifdef DO_KOUT_CHECK "开出自检", #else "开入3",// 26 #endif //#ifdef GD_AREA_ZHUHAI_V2 #if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021 "对侧开关位置", #else "开入4",// 27 #endif "安全自动控制压板", #ifdef BS_FAL_DI_YB "闭锁FA联络压板", #endif #ifdef CUSTOMIZE_BZT //备自投 "备自投开入", "#1进线合位开入", "#1进线分位开入", "#2进线合位开入", "#2进线分位开入", "备自投-合位开入", "备自投-分位开入", "闭锁备自投", "备自投-失压分闸" #endif #ifdef GD_AREA_ECZD_QINGYUAN_2022 "保护合闸出口", "保护跳闸出口", "遥控/电动合闸", "遥控/电动分闸", #endif }; // 开关开出名称 const s8 * g_sw_do_name[SW_DO_NUM] = { "合闸", "跳闸", "保护合闸", "保护分闸", "遥控合闸", "遥控分闸", "瞬压复归", "瞬压复归1", "瞬压闭锁", "储能信号",//"开出11", "保护动作开出", #ifdef GD_AREA_CHAOZHOU_CHAOAN_FUYANG "同期合闸开出-常闭", "同期合闸开出-常开", #else "同期合闸开出", #endif #ifdef CUSTOMIZE_BZT //备自投 "备自投-#1进线合闸", "备自投-#1进线分闸", "备自投-#2进线合闸", "备自投-#2进线分闸", "备自投-分段合闸", "备自投-分段分闸", "备自投-进线1失压分闸", "备自投-进线2失压分闸", #endif #if defined GD_AREA_MAIN_2020 || defined SW_FAIL_SINGLE_OUT "开关失灵", #endif #ifdef GD_AREA_YUNAN_LP "电源消失开出", #else "开出14", #endif #ifdef GD_AREA_PROTECTOR "装置异常告警动作", #endif }; const s8 * g_sw_led_name[SW_LED_NUM]= { "综合合位灯", "综合分位灯", "合位灯", "分位灯", "过流灯", "接地灯", "重合闸灯", "充电灯", "闭锁灯", "XT灯", "YT灯", "动作灯", "重合闭锁灯", #ifdef DISP_DOUBLE_CN "未储能灯", "已储能灯", #else "储能灯", #endif "联络灯", "分段灯", "重合+FA闭锁灯", #ifdef GD_AREA_MAIN_2020 "常规保护模式灯", #else "保护模式灯", #endif "就地FA模式灯", "分布式模式灯", "X+Y灯", #ifdef QYD_STATE_LED "气压低灯", #endif #ifdef CHZ_QUIT_LED "重合闸退出灯",//(硬件压板或软件压板退出灯亮) #endif #if defined GD_AREA_GUANGZHOU_FTU || defined GD_AREA_TEST_2020 "故障告警灯", #elif defined GD_AREA_ZHUHAI_V2 "告警灯", #endif #ifdef GD_AREA_ZHUHAI_V2 "通讯异常灯" //珠海局针对的是智能分布式通信异常 #endif //#ifdef GD_AREA_ECZD_2020 #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020 "自动解列功能灯", "同期合闸功能灯", "停用保护及FA灯", "停用自动解列灯", "停用同期合闸灯", #endif #ifdef TZ_STATE_LED "跳闸灯", #endif #ifdef CHZ_CD_LED "重合闸充电灯", #endif #ifdef EQU_RUN_LED "装置工作指示灯", #endif #ifdef SWITCH_GLJD_LED "隔离刀闸灯", "接地刀闸灯", #endif #ifdef FUNC_DRIVE "开关传动灯", #endif }; // 开关模拟量名称 //!!!更改模拟量名称可能会对以下宏有影响,请注意 //#define MEA_I_OFFSET 4 //用于判断英文‘I’起始位置 //#define MEA_U_OFFSET 6 //用于判断英文‘U’起始位置 const struct mea_desc g_sw_ac_desc[SW_AC_NUM_ALL] = { #ifdef DISP_MEA_CN {"保护IA",UNIT_A5,UNIT_ANG}, {"保护IB",UNIT_A5,UNIT_ANG}, {"保护IC",UNIT_A5,UNIT_ANG}, {"保护I0",UNIT_A5,UNIT_ANG}, #ifdef SW_AC_I0S_SAMPLE {"保护I0s",UNIT_A5,UNIT_ANG}, #endif {"测量IA",UNIT_A5,UNIT_ANG}, {"测量IB",UNIT_A5,UNIT_ANG}, {"测量IC",UNIT_A5,UNIT_ANG}, {"总有功",UNIT_W,UNIT_NULL}, {"A相有功",UNIT_W,UNIT_NULL}, {"B相有功",UNIT_W,UNIT_NULL}, {"C相有功",UNIT_W,UNIT_NULL}, {"总无功",UNIT_Var,UNIT_NULL}, {"A相无功",UNIT_Var,UNIT_NULL}, {"B相无功",UNIT_Var,UNIT_NULL}, {"C相无功",UNIT_Var,UNIT_NULL}, {"功率因素",UNIT_COS,UNIT_NULL}, #else {"BIA",UNIT_A5,UNIT_ANG}, {"BIB",UNIT_A5,UNIT_ANG}, {"BIC",UNIT_A5,UNIT_ANG}, #ifdef GD_TEST_2021 {"I0",UNIT_I0A,UNIT_ANG}, #else {"I0",UNIT_A5,UNIT_ANG}, #endif #ifdef SW_AC_I0S_SAMPLE {"I0s",UNIT_A5,UNIT_ANG}, #endif {"CIA",UNIT_A5,UNIT_ANG}, {"CIB",UNIT_A5,UNIT_ANG}, {"CIC",UNIT_A5,UNIT_ANG}, {"P",UNIT_W,UNIT_NULL}, {"Pa",UNIT_W,UNIT_NULL}, {"Pb",UNIT_W,UNIT_NULL}, {"Pc",UNIT_W,UNIT_NULL}, {"Q",UNIT_Var,UNIT_NULL}, {"Qa",UNIT_Var,UNIT_NULL}, {"Qb",UNIT_Var,UNIT_NULL}, {"Qc",UNIT_Var,UNIT_NULL}, #ifdef FUN_YC_POWER_S {"S",UNIT_Var,UNIT_NULL}, #endif {"COS",UNIT_COS,UNIT_NULL}, #endif {"BI_UNB",UNIT_Per,UNIT_NULL}, {"CI_UNB",UNIT_Per,UNIT_NULL}, {"脉冲计数1",UNIT_GE,UNIT_NULL}, {"脉冲计数2",UNIT_GE,UNIT_NULL}, {"速断电流定值",UNIT_NULL,UNIT_NULL}, {"速断保护时间",UNIT_NULL,UNIT_NULL}, {"过流电流定值",UNIT_NULL,UNIT_NULL}, {"过流保护时间",UNIT_NULL,UNIT_NULL}, {"零序电流定值",UNIT_NULL,UNIT_NULL}, {"零序保护时间",UNIT_NULL,UNIT_NULL}, {"零序保护模式",UNIT_NULL,UNIT_NULL}, {"一次重合闸时间",UNIT_NULL,UNIT_NULL}, {"二次重合闸时间",UNIT_NULL,UNIT_NULL}, {"得电闭合时间",UNIT_NULL,UNIT_NULL}, {"无压分闸闭锁时间",UNIT_NULL,UNIT_NULL}, {"工作模式",UNIT_NULL,UNIT_NULL}, #ifdef METERING_ENERGY {"计量UAB",UNIT_V220,UNIT_NULL}, // yc 17 {"计量UBC",UNIT_V220,UNIT_NULL}, {"计量UCA",UNIT_V220,UNIT_NULL}, {"计量UA",UNIT_V220,UNIT_NULL}, {"计量UB",UNIT_V220,UNIT_NULL}, {"计量UC",UNIT_V220,UNIT_NULL}, {"计量IA",UNIT_A5,UNIT_NULL}, {"计量IB",UNIT_A5,UNIT_NULL}, {"计量IC",UNIT_A5,UNIT_NULL}, {"计量I0",UNIT_A5,UNIT_NULL}, {"计量有功功率",UNIT_W,UNIT_NULL}, {"计量A相有功功率",UNIT_W,UNIT_NULL}, {"计量B相有功功率",UNIT_W,UNIT_NULL}, {"计量C相有功功率",UNIT_W,UNIT_NULL}, {"计量无功功率",UNIT_Var,UNIT_NULL}, {"计量A相无功功率",UNIT_Var,UNIT_NULL}, {"计量B相无功功率",UNIT_Var,UNIT_NULL}, {"计量C相无功功率",UNIT_Var,UNIT_NULL}, {"计量视在功率",UNIT_Var,UNIT_NULL}, {"计量A相视在功率",UNIT_Var,UNIT_NULL}, {"计量B相视在功率",UNIT_Var,UNIT_NULL}, {"计量C相视在功率",UNIT_Var,UNIT_NULL}, {"计量功率因数",UNIT_COS,UNIT_NULL}, {"计量A相功率因数",UNIT_COS,UNIT_NULL}, {"计量B相功率因数",UNIT_COS,UNIT_NULL}, {"计量C相功率因数",UNIT_COS,UNIT_NULL}, {"计量频率",UNIT_Hz,UNIT_NULL}, #else {"YC1",UNIT_NULL,UNIT_NULL}, // yc 17 {"YC2",UNIT_NULL,UNIT_NULL}, {"YC3",UNIT_NULL,UNIT_NULL}, {"YC4",UNIT_NULL,UNIT_NULL}, {"YC5",UNIT_NULL,UNIT_NULL}, {"YC6",UNIT_NULL,UNIT_NULL}, {"YC7",UNIT_NULL,UNIT_NULL}, {"YC8",UNIT_NULL,UNIT_NULL}, {"YC9",UNIT_NULL,UNIT_NULL}, {"YC10",UNIT_NULL,UNIT_NULL}, {"YC11",UNIT_NULL,UNIT_NULL}, {"YC12",UNIT_NULL,UNIT_NULL}, #endif }; // 计量模块电度值 const struct mea_desc g_dd_desc[SW_DD_NUM_ALL]= { {"当前正向有功", UNIT_kWh,UNIT_NULL}, //6401 {"当前正向无功", UNIT_kVarh,UNIT_NULL}, //6402 {"当前一象限无功", UNIT_kVarh,UNIT_NULL}, //6403 {"当前四象限无功", UNIT_kVarh,UNIT_NULL}, //6404 {"当前反向有功", UNIT_kWh,UNIT_NULL}, //6405 {"当前反向无功", UNIT_kVarh,UNIT_NULL}, //6406 {"当前二象限无功", UNIT_kVarh,UNIT_NULL}, //6407 {"当前三象限无功", UNIT_kVarh,UNIT_NULL}, //6408 {"15分冻结正向有功", UNIT_kWh,UNIT_NULL}, //6409 {"15分冻结正向无功", UNIT_kVarh,UNIT_NULL}, //640A {"15分冻结一象限无功", UNIT_kVarh,UNIT_NULL}, //640B {"15分冻结四象限无功", UNIT_kVarh,UNIT_NULL}, //640C {"15分冻结反向有功", UNIT_kWh,UNIT_NULL}, //640D {"15分冻结反向无功", UNIT_kVarh,UNIT_NULL}, //640E {"15分冻结二象限无功", UNIT_kVarh,UNIT_NULL}, //640F {"15分冻结三象限无功", UNIT_kVarh,UNIT_NULL}, //6410 {"日冻结正向有功", UNIT_kWh,UNIT_NULL}, //6411 {"日冻结冻结正向无功", UNIT_kVarh,UNIT_NULL}, //6412 {"日冻结一象限无功", UNIT_kVarh,UNIT_NULL}, //6413 {"日冻结四象限无功", UNIT_kVarh,UNIT_NULL}, //6414 {"日冻结反向有功", UNIT_kWh,UNIT_NULL}, //6415 {"日冻结反向无功", UNIT_kVarh,UNIT_NULL}, //6416 {"日冻结二象限无功", UNIT_kVarh,UNIT_NULL}, //6417 {"日冻结三象限无功", UNIT_kVarh,UNIT_NULL}, //6418 {"潮变冻结正向有功", UNIT_kWh,UNIT_NULL}, //6419 {"潮变冻结正向无功", UNIT_kVarh,UNIT_NULL}, //641A {"潮变冻结一象限无功", UNIT_kVarh,UNIT_NULL}, //641B {"潮变冻结四象限无功", UNIT_kVarh,UNIT_NULL}, //641C {"潮变冻结反向有功", UNIT_kWh,UNIT_NULL}, //641D {"潮变冻结反向无功", UNIT_kVarh,UNIT_NULL}, //641E {"潮变冻结二象限无功", UNIT_kVarh,UNIT_NULL}, //641F {"潮变冻结三象限无功", UNIT_kVarh,UNIT_NULL}, //6420 #ifdef METERING_ENERGY {"当前A相有功", UNIT_kWh, UNIT_NULL}, {"当前B相有功", UNIT_kWh, UNIT_NULL}, {"当前C相有功", UNIT_kWh, UNIT_NULL}, {"当前A相正向有功", UNIT_kWh, UNIT_NULL}, {"当前B相正向有功", UNIT_kWh, UNIT_NULL}, {"当前C相正向有功", UNIT_kWh, UNIT_NULL}, {"当前A相反向有功", UNIT_kWh, UNIT_NULL}, {"当前B相反向有功", UNIT_kWh, UNIT_NULL}, {"当前C相反向有功", UNIT_kWh, UNIT_NULL}, {"当前总有功", UNIT_kWh, UNIT_NULL}, {"当前总无功", UNIT_kWh, UNIT_NULL}, #endif }; // 开关公共开入名称 const s8 * g_pub_di_name[PUB_DI_NUM] = { "远方", // 1 "就地", // 2 "柜门位置", // 3 "信号复归", // 4 "交流失电告警", // 5 "电池电源故障", // 6 "电池欠压", // 7 "电池活化状态", // 8 "电容器动作", // 9 "FA解锁", // 10 "装置复位", // 11 "功能总压板", // 12 //#ifdef GD_AREA_ECZD_2020 #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020 "检修状态压板", // 13 #else "遥信屏蔽压板", // 13 #endif "非电量1开入", // 14 "非电量2开入", // 15 "非电量3开入", // 16 "非电量4开入", // 17 "非电量5开入", // 18 "非电量6开入", // 19 "非电量7开入", // 20 "非电量8开入", // 21 "开入1", // 22 "开入2", // 23 "开入3", // 24 "开入4", // 25 "开入5", // 26 "开入6", // 27 #ifdef YX_DI_ERROR "遥信自检", #else "开入7", // 28 #endif #ifdef KZ_OUT_TT "控制出口压板", #else "开入8", // 29 #endif "信号复归+FA解锁", // 30 }; // 开关公共开出名称 const s8 * g_pub_do_name[PUB_DO_NUM] = { "电池活化", "活化退出", "开出03", "开出04", "开出05", "开出06", "开出07", "开出08", "开出09", #ifdef YK_ZZDY_KC "装置电源开出", #endif "电压合格率清零", "预控开出", "解除闭锁", "远方重启", "远方复归", #ifdef YK_FG_FAJS "远方复归&FA解锁", // 远方复归+FA解锁 #endif "重合软压板合", "重合软压板分", #if defined BHFA_YB_YK || defined BHFAGS_YB_YK //#ifdef GD_AREA_ECZD_2020 #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020 "停用保护总软压板合", "停用保护总软压板分", #else "功能总投入软压板合", "功能总投入软压板分", #endif "保护出口软压板合", "保护出口软压板分", #ifndef BH_FA_INONE_SW "常规保护软压板合", "常规保护软压板分", "馈线自动化软压板合", "馈线自动化软压板分", #ifdef BHFAGS_YB_YK "智能分布式软压板合", "智能分布式软压板分", #endif #endif #else //#ifdef GD_AREA_ECZD_2020 #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020 "停用保护总软压板合", "停用保护总软压板分", #else "自动功能软压板合", "自动功能软压板分", #endif "保护投入软压板合", "保护投入软压板分", #endif #ifdef TQ_SOFT_YB #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020 "停用同期软压板合", "停用同期软压板分", #else "检同期软压板合", "检同期软压板分", #endif #endif #ifdef JZS_FUNCTION "集中式软压板-合", "集中式软压板-分", #endif #ifdef YK_SOFT_YB "遥控软压板-合", "遥控软压板-分", #endif #ifdef YK_FA_ENBLE "FA遥控闭锁-合", "FA遥控闭锁-分", #endif #ifdef YK_FA_S_L_ENBLE "分段/联络-合", "分段/联络-分", #endif #ifdef JL_SOFT_YB "停用解列软压板合", "停用解列软压板分", #endif #ifdef METERING_ENERGY "遥控电度清零", "遥控线损事件清零", #endif #ifdef FUNC_DRIVE "传动接收软压板合", "传动接收软压板分", "传动指令", #endif #ifdef FUNC_DRIVE_JY "不停电传动功能", #endif #ifdef FUNC_RESET_EQU "重启装置", #endif }; const s8 * g_pub_led_name[PUB_LED_NUM]= { "电源灯", "运行灯", #ifdef COMM_STATUS_LED "通信数据灯", "通信状态灯", #else "通信灯", #endif "电池灯", "异常灯", //#ifdef GD_AREA_ECZD_2020 #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020 "运行告警灯", #endif "动作灯", "远方灯", "就地灯", "232T1", "232R1", "232T2", "232R2", "232T3", "232R3", "485T1", "485R1", "485T2", "485R2", "485T3", "485R3", "网口1", "网口2", #if defined __GOOSE_USING_DOUBLE_ETH__ || defined NET3_IP5 "网口3", #endif #ifdef BAT_STATE_LED "电池欠压灯", "电池活化灯", #endif #ifdef KZ_OUT_TT "控制闭锁灯", #endif #ifdef IEC_ERR_LED "规约通信异常灯", #endif #ifdef LINK_ERR_LED "级联异常灯", #endif }; // 开关公共模拟量名称 const struct mea_desc g_pub_ac_desc[PUB_AC_NUM_ALL] = { #ifdef DISP_MEA_CN #ifdef GD_AREA_ZHUHAI_V2 {"电缆UA1",UNIT_V100,UNIT_ANG}, {"电缆UB1",UNIT_V100,UNIT_ANG}, {"电缆UC1",UNIT_V100,UNIT_ANG}, {"电缆UAB1",UNIT_V100,UNIT_ANG}, {"电缆UBC1",UNIT_V100,UNIT_ANG}, {"电缆UCA1",UNIT_V100,UNIT_ANG}, {"母线U0 ",UNIT_V100,UNIT_ANG}, {"电缆US1",UNIT_V220,UNIT_ANG}, {"母线UA2",UNIT_V100,UNIT_ANG}, {"母线UB2",UNIT_V100,UNIT_ANG}, {"母线UC2",UNIT_V100,UNIT_ANG}, {"母线UAB2",UNIT_V100,UNIT_ANG}, {"母线UBC2",UNIT_V100,UNIT_ANG}, {"母线UCA2",UNIT_V100,UNIT_ANG}, {"电缆U0 ",UNIT_V100,UNIT_ANG}, {"母线US2",UNIT_V220,UNIT_ANG}, #else {"母线UA1",UNIT_V100,UNIT_ANG}, {"母线UB1",UNIT_V100,UNIT_ANG}, {"母线UC1",UNIT_V100,UNIT_ANG}, {"母线UAB1",UNIT_V100,UNIT_ANG}, {"母线UBC1",UNIT_V100,UNIT_ANG}, {"母线UCA1",UNIT_V100,UNIT_ANG}, {"母线U01",UNIT_V100,UNIT_ANG}, #ifdef GD_AREA_HUIZHOU_HUIDONG {"母线AB3",UNIT_V220,UNIT_ANG}, #else {"母线US1",UNIT_V220,UNIT_ANG}, #endif {"线路UA2",UNIT_V100,UNIT_ANG}, {"线路UB2",UNIT_V100,UNIT_ANG}, {"线路UC2",UNIT_V100,UNIT_ANG}, {"线路UAB2",UNIT_V100,UNIT_ANG}, {"线路UBC2",UNIT_V100,UNIT_ANG}, {"线路UCA2",UNIT_V100,UNIT_ANG}, {"线路U02",UNIT_V100,UNIT_ANG}, #ifdef GD_AREA_HUIZHOU_HUIDONG {"母线BC3",UNIT_V220,UNIT_ANG}, #else {"线路US2",UNIT_V220,UNIT_ANG}, #endif #endif {"V_UNB1",UNIT_Per,UNIT_NULL}, {"V_UNB2",UNIT_Per,UNIT_NULL}, {"工频1",UNIT_Hz,UNIT_NULL}, {"工频2",UNIT_Hz,UNIT_NULL}, #else {"UA1",UNIT_V100,UNIT_ANG}, {"UB1",UNIT_V100,UNIT_ANG}, {"UC1",UNIT_V100,UNIT_ANG}, {"UAB1",UNIT_V100,UNIT_ANG}, {"UBC1",UNIT_V100,UNIT_ANG}, {"UCA1",UNIT_V100,UNIT_ANG}, {"U01",UNIT_V100,UNIT_ANG}, {"US1",UNIT_V220,UNIT_ANG}, {"UA2",UNIT_V100,UNIT_ANG}, {"UB2",UNIT_V100,UNIT_ANG}, {"UC2",UNIT_V100,UNIT_ANG}, {"UAB2",UNIT_V100,UNIT_ANG}, {"UBC2",UNIT_V100,UNIT_ANG}, {"UCA2",UNIT_V100,UNIT_ANG}, {"U02",UNIT_V100,UNIT_ANG}, {"US2",UNIT_V220,UNIT_ANG}, {"V_UNB1",UNIT_Per,UNIT_NULL}, {"V_UNB2",UNIT_Per,UNIT_NULL}, {"UF1",UNIT_Hz,UNIT_NULL}, {"UF2",UNIT_Hz,UNIT_NULL}, #endif {"直流电压1",UNIT_V050,UNIT_NULL}, {"直流电压2",UNIT_V050,UNIT_NULL}, #ifdef GD_AREA_YUNAN_LP // 云南涞浦 {"DltUab",UNIT_V100,UNIT_NULL}, {"DltUbc",UNIT_V100,UNIT_NULL}, {"DltUca",UNIT_V100,UNIT_NULL}, {"ArgUab",UNIT_ANG,UNIT_NULL}, {"ArgUbc",UNIT_ANG,UNIT_NULL}, {"ArgUca",UNIT_ANG,UNIT_NULL}, #endif {"温度",UNIT_TEMP,UNIT_NULL}, {"Ver",UNIT_NULL,UNIT_NULL}, #ifdef BATTERY_WITH_COMM {"活化放电时长",UINT_Hour,UNIT_NULL}, {"当前放电时长",UINT_Hour,UNIT_NULL}, #endif #ifdef DEV_GPS_ATGM332D #ifndef GPS_JWD_SPLIT {"经度",UNIT_ANG,UNIT_NULL}, {"纬度",UNIT_ANG,UNIT_NULL}, #else {"经度-度",UNIT_ANG,UNIT_NULL}, {"纬度-分",UNIT_ANG,UNIT_NULL}, {"经度-秒",UNIT_ANG,UNIT_NULL}, {"纬度-度",UNIT_ANG,UNIT_NULL}, {"纬度-分",UNIT_ANG,UNIT_NULL}, {"纬度-秒",UNIT_ANG,UNIT_NULL}, #endif {"卫星个数",UNIT_GE,UNIT_NULL}, #endif {"YC1",UNIT_NULL,UNIT_NULL}, {"YC2",UNIT_NULL,UNIT_NULL}, {"YC3",UNIT_NULL,UNIT_NULL}, {"YC4",UNIT_NULL,UNIT_NULL}, {"YC5",UNIT_NULL,UNIT_NULL}, {"YC6",UNIT_NULL,UNIT_NULL}, {"YC7",UNIT_NULL,UNIT_NULL}, {"YC8",UNIT_NULL,UNIT_NULL}, #ifdef FUNC_SEND_FAULT_CURRENT {"A相故障电流",UNIT_A5,UNIT_ANG}, {"B相故障电流",UNIT_A5,UNIT_ANG}, {"C相故障电流",UNIT_A5,UNIT_ANG}, {"零序电流",UNIT_A5,UNIT_ANG}, #else {"YC9",UNIT_NULL,UNIT_NULL}, {"YC10",UNIT_NULL,UNIT_NULL}, {"YC11",UNIT_NULL,UNIT_NULL}, {"YC12",UNIT_NULL,UNIT_NULL}, #endif #ifdef BATTERY_BP_L500 {"电池内阻",UINT_mVperA,UNIT_NULL}, {"电池温度",UNIT_TEMP,UNIT_NULL}, {"电池实时电量",UNIT_Per,UNIT_NULL}, {"电池放电电流",UINT_mA,UNIT_NULL}, {"电池充电电流",UINT_mA,UNIT_NULL}, #endif }; /*------------------------------ 函数声明 ------------------------------------- */ int _sw_cal_mea(void); void _sw_cal_average(int cal_num); float _sw_ui_e_k(int index); void _sw_auto_adjust_pq(void); void _sw_get_dots(void); void _sw_cal_fft(void); void _sw_cal_effect(void); void _sw_cal_angle(void); void _sw_cal_ri_correct(void); void _sw_min_max(int ui_index,u32 *p_min,u32*p_max); void _fz_min_max(int ui_index1,int ui_index2,u32 *p_min,u32*p_max); float _sw_base_angle(int ui_index); int _sw_save_dc_factor(float dc1_H, float dc1_L,float dc2_H, float dc2_L); void _sw_temp_factor(void); /*------------------------------ 外部函数 ------------------------------------- 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性. */ /****************************************************************************** 函数名称: sw_init 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 线路开关初始化 参数说明: 返回值: 0: 成功 其它: 失败 修改记录: */ int sw_init(void) { int sw,i,type,ui; float f; // 初始化为固定默认值,只有上电初始化才运行一次 if(g_sw_init == 0) { memset(&g_ui,0,sizeof(g_ui)); memset(&g_sw_pub,0,sizeof(g_sw_pub)); memset(&g_sw_pub.di,SW_DI_TYPE_OFF,sizeof(g_sw_pub.di)); memset(&g_sw_pub.di_cfg_index,INDEX_INVALLID,sizeof(g_sw_pub.di_cfg_index)); memset(&g_sw_pub.do_cfg_index,INDEX_INVALLID,sizeof(g_sw_pub.do_cfg_index)); memset(&g_sw_pub.ac_cfg_index,INDEX_INVALLID,sizeof(g_sw_pub.ac_cfg_index)); memset(&g_sw_pub.led_cfg_index,INDEX_INVALLID,sizeof(g_sw_pub.led_cfg_index)); for(i=0; i< UI_NUM; i++) { g_ui[i].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[i].ui_base_make = -1; g_ui[i].e_factor0 = 1.0 ; // 使用理论默认值初始化m2_factor_k,防止初始化时使用此值的定值出错, // 导致保护逻辑出错(例如,跳位有流告警) if(idi_num; i++) { if(g_equ_config_di[i].owner > SWITCH_NUM_MAX) { rt_printf("switch_init(own):i=%d,owner=%d,SWITCH_NUM_MAX=%d.\r\n",i, g_equ_config_di[i].owner,SWITCH_NUM_MAX); continue; } // 如果是其它类型(type == 0),不处理 type = g_equ_config_di[i].type; if(type == 0) { continue; } type--; if(g_equ_config_di[i].owner == 0) { if(type < PUB_DI_NUM) { g_sw_pub.di_cfg_index[type] = i; } else { rt_printf("switch_init(di):i=%d,type=%d,DI_NUM=%d.\r\n",i, type,PUB_DI_NUM); } } else { sw = g_equ_config_di[i].owner - 1; if(type < SW_DI_NUM) { g_sw[sw].di_cfg_index[type] = i; } else { rt_printf("switch_init(di):i=%d,type=%d,DI_NUM=%d,sw=%d.\r\n",i, type,SW_DI_NUM,sw); } } } // DO通道 for(i=0; i< g_equ_config->do_num; i++) { if(g_equ_config_do[i].owner > SWITCH_NUM_MAX) { rt_printf("switch_init(own):i=%d,owner=%d,SWITCH_NUM_MAX=%d.\r\n",i, g_equ_config_do[i].owner,SWITCH_NUM_MAX); continue; } // 如果是其它类型(type == 0),不处理 type = g_equ_config_do[i].type; if(type == 0) { continue; } type--; if(g_equ_config_do[i].owner == 0) { if(type < PUB_DO_NUM) { g_sw_pub.do_cfg_index[type] = i; } else if(type < PUB_DO_NUM + PUB_LED_NUM) { s16 slot,index; g_sw_pub.led_cfg_index[type-PUB_DO_NUM] = i; slot = g_equ_config_do[i].slot; index = g_equ_config_do[i].index; g_led_slot[slot].sn[index].sw = 0; g_led_slot[slot].sn[index].no = type-PUB_DO_NUM; index++; if(index > g_led_slot[slot].num) { g_led_slot[slot].num = index; } } else { rt_printf("switch_init(do):i=%d,type=%d,PUB_DO_NUM + PUB_LED_NUM=%d.\r\n",i, type,PUB_DO_NUM + PUB_LED_NUM); } } else { sw = g_equ_config_do[i].owner - 1; if(type < SW_DO_NUM) { g_sw[sw].do_cfg_index[type] = i; } else if(type < SW_DO_LED_NUM) { s16 slot,index; g_sw[sw].led_cfg_index[type-SW_DO_NUM] = i; slot = g_equ_config_do[i].slot; index = g_equ_config_do[i].index; g_led_slot[slot].sn[index].sw = sw+1; g_led_slot[slot].sn[index].no = type-SW_DO_NUM; index++; if(index > g_led_slot[slot].num) { g_led_slot[slot].num = index; } } else { rt_printf("switch_init(do):i=%d,type=%d,SW_DO_LED_NUM=%d,sw=%d.\r\n",i, type,SW_DO_LED_NUM,sw); } } } // AC通道 for(i=0; i< g_equ_config->ac_num; i++) { if(g_equ_config_ac[i].owner > SWITCH_NUM_MAX) { rt_printf("switch_init(own):i=%d,owner=%d,SWITCH_NUM_MAX=%d.\r\n",i, g_equ_config_ac[i].owner,SWITCH_NUM_MAX); continue; } // 如果是其它类型(type == 0),不处理 type = g_equ_config_ac[i].type; if(type == 0) { continue; } type--; if(g_equ_config_ac[i].owner == 0) { if(type < PUB_AC_NUM) { // 索引 ui = type; g_sw_pub.ac_cfg_index[type] = i; } else { rt_printf("switch_init(ac):i=%d,type=%d,AC_NUM=%d.\r\n",i, g_equ_config_ac[i].type,PUB_AC_NUM); continue; } } else { sw = g_equ_config_ac[i].owner - 1; if(type < SW_AC_NUM) { ui = UI_SW_INDEX(sw,type); // 索引 g_sw[sw].ac_cfg_index[type] = i; } else { rt_printf("switch_init(ac):i=%d,type=%d,AC_NUM=%d,sw=%d.\r\n",i, type,SW_AC_NUM,sw); continue; } } // 通道索引 g_ui[ui].chn_index = equ_get_ac_channel(g_equ_config_ac[i].slot,g_equ_config_ac[i].index); // 系数 factor_e_c_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,&f); g_ui[ui].e_factor0 = f /factor_e_k(g_equ_config_ac[i].scale); g_ui[ui].m2_factor_k = rt_round(factor_e_k(g_equ_config_ac[i].scale)*Q08_BASE); #ifdef PROTECT_AC_ADJUST factor_p_e_c_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,&f); //保护校准系数 #endif g_ui[ui].m2_factor_c = rt_round(f*Q16_BASE); factor_p_c_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,&f); g_ui[ui].p_factor = f; //一二变比 g_ui[ui].e_ps = factor_e_ps(equ_get_ac_scale(g_equ_config_ac[i].slot, g_equ_config_ac[i].index)); // 暂时屏蔽,看看不使用PQ校准的效果 //factor_pq_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,g_ui[ui].pq_factor); } // 计算角度时的基准通道 if(g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO) { g_ui_angle0 = PUB_AC_UA1; } else if(g_ui[PUB_AC_UAB1].chn_index != CFG_ADC_CHANNEL_ZERO) { g_ui_angle0 = PUB_AC_UAB1; } else if(g_ui[PUB_AC_UAB2].chn_index != CFG_ADC_CHANNEL_ZERO) { g_ui_angle0 = PUB_AC_UAB2; } else { g_ui_angle0 = -1; } // 相电压合成线电压标志 if( g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UB1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UC1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UAB1].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UBC1].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UCA1].chn_index == CFG_ADC_CHANNEL_ZERO) { g_sw_pub.ui_flags |= UI_FLAGS_MAKE_LV1; memcpy(&g_ui[PUB_AC_UAB1],&g_ui[PUB_AC_UA1],sizeof(g_ui[0])); g_ui[PUB_AC_UAB1].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_UAB1].ui_base_make = PUB_AC_UA1; g_ui[PUB_AC_UAB1].e_factor0 = (g_ui[PUB_AC_UA1].e_factor0 + g_ui[PUB_AC_UB1].e_factor0)/2; memcpy(&g_ui[PUB_AC_UBC1],&g_ui[PUB_AC_UA1],sizeof(g_ui[0])); g_ui[PUB_AC_UBC1].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_UBC1].ui_base_make = PUB_AC_UA1; g_ui[PUB_AC_UBC1].e_factor0 = (g_ui[PUB_AC_UB1].e_factor0 + g_ui[PUB_AC_UC1].e_factor0)/2; memcpy(&g_ui[PUB_AC_UCA1],&g_ui[PUB_AC_UA1],sizeof(g_ui[0])); g_ui[PUB_AC_UCA1].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_UCA1].ui_base_make = PUB_AC_UA1; g_ui[PUB_AC_UCA1].e_factor0 = (g_ui[PUB_AC_UC1].e_factor0 + g_ui[PUB_AC_UA1].e_factor0)/2; } if(g_ui[PUB_AC_UA2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UB2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UC2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UAB2].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UBC2].chn_index == CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UCA2].chn_index == CFG_ADC_CHANNEL_ZERO) { g_sw_pub.ui_flags |= UI_FLAGS_MAKE_LV2; memcpy(&g_ui[PUB_AC_UAB2],&g_ui[PUB_AC_UA2],sizeof(g_ui[0])); g_ui[PUB_AC_UAB2].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_UAB2].ui_base_make = PUB_AC_UA2; g_ui[PUB_AC_UAB2].e_factor0 = (g_ui[PUB_AC_UA2].e_factor0 + g_ui[PUB_AC_UB2].e_factor0)/2; memcpy(&g_ui[PUB_AC_UBC2],&g_ui[PUB_AC_UA2],sizeof(g_ui[0])); g_ui[PUB_AC_UBC2].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_UBC2].ui_base_make = PUB_AC_UA2; g_ui[PUB_AC_UBC2].e_factor0 = (g_ui[PUB_AC_UB2].e_factor0 + g_ui[PUB_AC_UC2].e_factor0)/2; memcpy(&g_ui[PUB_AC_UCA2],&g_ui[PUB_AC_UA2],sizeof(g_ui[0])); g_ui[PUB_AC_UCA2].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_UCA2].ui_base_make = PUB_AC_UA2; g_ui[PUB_AC_UCA2].e_factor0 = (g_ui[PUB_AC_UC2].e_factor0 + g_ui[PUB_AC_UA2].e_factor0)/2; } // 合成UCA标志 if( g_ui[PUB_AC_UAB1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UBC1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UCA1].chn_index == CFG_ADC_CHANNEL_ZERO) { g_sw_pub.ui_flags |= UI_FLAGS_MAKE_UCA1; memcpy(&g_ui[PUB_AC_UCA1],&g_ui[PUB_AC_UAB1],sizeof(g_ui[0])); g_ui[PUB_AC_UCA1].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_UCA1].ui_base_make = PUB_AC_UAB1; g_ui[PUB_AC_UCA1].e_factor0 = (g_ui[PUB_AC_UAB1].e_factor0 + g_ui[PUB_AC_UBC1].e_factor0)/2; } if( g_ui[PUB_AC_UAB2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UBC2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UCA2].chn_index == CFG_ADC_CHANNEL_ZERO) { g_sw_pub.ui_flags |= UI_FLAGS_MAKE_UCA2; memcpy(&g_ui[PUB_AC_UCA2],&g_ui[PUB_AC_UAB2],sizeof(g_ui[0])); g_ui[PUB_AC_UCA2].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_UCA2].ui_base_make = PUB_AC_UAB2; g_ui[PUB_AC_UCA2].e_factor0 = (g_ui[PUB_AC_UAB2].e_factor0 + g_ui[PUB_AC_UBC2].e_factor0)/2; } // U01 零序电压自产 if( g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UB1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UC1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_U01].chn_index == CFG_ADC_CHANNEL_ZERO &&pRunSet->bTT_U0ZC) { g_sw_pub.ui_flags |= UI_FLAGS_MAKE_U01; memcpy(&g_ui[PUB_AC_U01],&g_ui[PUB_AC_UA1],sizeof(g_ui[0])); g_ui[PUB_AC_U01].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_U01].ui_base_make = PUB_AC_UA1; g_ui[PUB_AC_U01].e_factor0 = (g_ui[PUB_AC_UA1].e_factor0 + g_ui[PUB_AC_UB1].e_factor0+g_ui[PUB_AC_UC1].e_factor0)/3; } // U02 零序电压自产 if( g_ui[PUB_AC_UA2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UB2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UC2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_U02].chn_index == CFG_ADC_CHANNEL_ZERO &&pRunSet->bTT_U0ZC) { g_sw_pub.ui_flags |= UI_FLAGS_MAKE_U02; memcpy(&g_ui[PUB_AC_U02],&g_ui[PUB_AC_UA2],sizeof(g_ui[0])); g_ui[PUB_AC_U02].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_U02].ui_base_make = PUB_AC_UA2; g_ui[PUB_AC_U02].e_factor0 = (g_ui[PUB_AC_UA2].e_factor0 + g_ui[PUB_AC_UB2].e_factor0+g_ui[PUB_AC_UC2].e_factor0)/3; } // 合成IB、I0标志 for(sw=0; swbTT_U0ZC) { g_sw_pub.ui_flags |= UI_FLAGS_MAKE_U01; memcpy(&g_ui[PUB_AC_U01],&g_ui[PUB_AC_UA1],sizeof(g_ui[0])); g_ui[PUB_AC_U01].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_U01].ui_base_make = PUB_AC_UA1; g_ui[PUB_AC_U01].e_factor0 = (g_ui[PUB_AC_UA1].e_factor0 + g_ui[PUB_AC_UB1].e_factor0+g_ui[PUB_AC_UC1].e_factor0)/3; } // U02 零序电压自产 if( g_ui[PUB_AC_UA2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UB2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_UC2].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[PUB_AC_U02].chn_index == CFG_ADC_CHANNEL_ZERO &&pRunSet->bTT_U0ZC) { g_sw_pub.ui_flags |= UI_FLAGS_MAKE_U02; memcpy(&g_ui[PUB_AC_U02],&g_ui[PUB_AC_UA2],sizeof(g_ui[0])); g_ui[PUB_AC_U02].chn_index = CFG_ADC_CHANNEL_ZERO; g_ui[PUB_AC_U02].ui_base_make = PUB_AC_UA2; g_ui[PUB_AC_U02].e_factor0 = (g_ui[PUB_AC_UA2].e_factor0 + g_ui[PUB_AC_UB2].e_factor0+g_ui[PUB_AC_UC2].e_factor0)/3; } return 0; } /****************************************************************************** 函数名称: sw_exit 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 线路开关退出 参数说明: 返回值: 0: 成功 其它: 失败 修改记录: */ int sw_exit(void) { return 0; } int sw_di_get(u32 sw,u32 no) { u8 v; if(no == 0) { return -1; } no--; if(sw == 0) { v=g_sw_pub.di[no] ; } else { sw--; v=g_sw[sw].di[no] ; } return v; } int sw_di_set(u32 sw,u32 no,u8 v) { if(no == 0) { return -1; } no--; if(sw == 0) { g_sw_pub.di[no] = v; } else { sw--; g_sw[sw].di[no] = v; } return 0; } /****************************************************************************** 函数名称: sw_do 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 针对线路开关执行开出动作 参数说明: sw 开关序号 index 开出索引 type 开出类型 返回值: 0: 成功 其它: 失败 修改记录: */ static int _sw_do(u32 slot,u32 index,int type) { int ret,do_num; do_num = equ_get_do_num(slot); if(do_num == 0) { return -1; } // 将辅助板的4个开出(64~67)映射到(0~3), // 解决32位宽度不够的问题,这样LED灯不允许配置成开出。 // 其它板不存在这个问题,例如开出板只有16个开出可配 if((g_board_info[slot].type == BOARD_TYPE_AUX) || (g_board_info[slot].type == BOARD_TYPE_ZT)) { index = index%32; } ret = 0; switch(type) { case SW_DO_TYPE_OFF: case SW_DO_TYPE_ON: ret = dido_do(slot,(1<run_stu.sw==1) { pR->uRmtSW.bHz_Doing = 1; #ifdef FUNC_DRIVE gb_drive.bHz_Doing = 1; #endif } pR->uRmtSW.bTz_Doing = 0; #ifdef FUNC_DRIVE gb_drive.bTz_Doing = 0; #endif } if((index == SW_DO_FZ || index == SW_DO_YKT || index == SW_DO_BHT) && (type == SW_DO_TYPE_ON)) { if(pR->run_stu.sw==2) { pR->uRmtSW.bTz_Doing = 1; #ifdef FUNC_DRIVE gb_drive.bTz_Doing = 1; #endif } pR->uRmtSW.bHz_Doing = 0; #ifdef FUNC_DRIVE gb_drive.bHz_Doing = 0; #endif } if(sw >= SWITCH_NUM_MAX || index >=SW_DO_NUM) { return -1; } // 气压低闭锁分合闸 if(pRunSet->tSwSet[sw].bTT_QYD_BS && (g_sw[sw].di[SW_DI_QYD] == SW_DI_TYPE_ON) && (index == SW_DO_HZ || index == SW_DO_FZ||index == SW_DO_YKH||index == SW_DO_YKT||index ==SW_DO_BHH||index ==SW_DO_BHT)) { return -2; } // 需要通道有配置 index = g_sw[sw].do_cfg_index[index]; if(index == INDEX_INVALLID || index >= g_equ_config->do_num) { return -3; } slot = g_equ_config_do[index].slot; index = g_equ_config_do[index].index; ret = _sw_do(slot,index,type); return ret; } /****************************************************************************** 函数名称: sw_do_pub 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 针对线路开关公共部门执行开出动作 参数说明: index 开出索引 type 开出类型 返回值: 0: 成功 其它: 失败 修改记录: */ int sw_do_pub(u32 index,int type) { int ret; u32 slot; if(index >=PUB_DO_NUM) { return -1; } index = g_sw_pub.do_cfg_index[index]; if(index == INDEX_INVALLID || index >= g_equ_config->do_num) { return -2; } slot = g_equ_config_do[index].slot; index = g_equ_config_do[index].index; ret = _sw_do(slot,index,type); return ret; } /****************************************************************************** 函数名称: sw_do_yk 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 预控继电器开出 参数说明: index 开出索引 type 开出类型 返回值: 0: 成功 其它: 失败 修改记录: */ int sw_do_yuk(int type) { int ret; u32 slot; int index; index = g_sw_pub.do_cfg_index[PUB_DO_YK]; if(index == INDEX_INVALLID || index >= g_equ_config->do_num) { return -2; } slot = g_equ_config_do[index].slot; index = g_equ_config_do[index].index; ret = _sw_do(slot,index,type); return ret; } /****************************************************************************** 函数名称: sw_v_m2_factor_k 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 得到一个保护定值计算用的理论转化系数。目前假设所有电压的系数都是一样, 从第一组电压中取出一个。 参数说明: 返回值: 修改记录: */ float sw_v_m2_factor_k(int id) { if(id < PUB_AC_NUM) { if(id == PUB_AC_US1) { if((short)g_sw_pub.ac_cfg_index[PUB_AC_US1] == INDEX_INVALLID) { return g_ui[PUB_AC_UAB1].m2_factor_k; } else { if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO) { return g_ui[id].m2_factor_k; } } } else if(id == PUB_AC_US2) { if((short)g_sw_pub.ac_cfg_index[PUB_AC_US2] == INDEX_INVALLID) { return g_ui[PUB_AC_UBC2].m2_factor_k; } else { if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO) { return g_ui[id].m2_factor_k; } } } else if(id == PUB_AC_U01) { if(g_ui[id].chn_index == CFG_ADC_CHANNEL_ZERO) { return g_ui[PUB_AC_UA1].m2_factor_k; } else { if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO) { return g_ui[id].m2_factor_k; } } } else if(id == PUB_AC_U02) { if(g_ui[id].chn_index == CFG_ADC_CHANNEL_ZERO) { return g_ui[PUB_AC_UA2].m2_factor_k; } else { if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO) { return g_ui[id].m2_factor_k; } } } else { //if(g_ui[id].chn_index != CFG_ADC_CHANNEL_ZERO) //{ return g_ui[id].m2_factor_k; //} } } return 1.0; } #ifdef FUNC_DRIVE_JY static void drive_ui_proc(void) { int i=0,sw=0; TSETSW *pSet = &pRunSet->tSwSet[sw]; if(!gb_drive.b_drive_on) { return; } for(i=0;i<1;i++)//保护遥测值 { if(!gb_drive.tDriveUa1Time.boolTrip) { g_ui[PUB_AC_UA1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UA1]/256.0)); g_ui[PUB_AC_UB1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UB1]/256.0)); g_ui[PUB_AC_UC1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UC1]/256.0)); g_ui[PUB_AC_UAB1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UAB1]/256.0)); g_ui[PUB_AC_UBC1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UBC1]/256.0)); g_ui[PUB_AC_UCA1].m2[i] = GetSetSQR(pSet->dU_drive_ua1,(pRunSet->dKU[PUB_AC_UCA1]/256.0)); } if(!gb_drive.tDriveUa2Time.boolTrip) { g_ui[PUB_AC_UA2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UA2]/256.0)); g_ui[PUB_AC_UB2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UB2]/256.0)); g_ui[PUB_AC_UC2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UC2]/256.0)); g_ui[PUB_AC_UAB2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UAB2]/256.0)); g_ui[PUB_AC_UBC2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UBC2]/256.0)); g_ui[PUB_AC_UCA2].m2[i] = GetSetSQR(pSet->dU_drive_ua2,(pRunSet->dKU[PUB_AC_UCA2]/256.0)); } if(!gb_drive.tDriveU0Time.boolTrip) { g_ui[PUB_AC_U01].m2[i] = GetSetSQR(pSet->dU_drive_u0,(pRunSet->dKU[PUB_AC_U01]/256.0)); } if(!gb_drive.tDriveITime.boolTrip) { g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_IA].m2[i] = GetSetSQR(pSet->dU_drive_i,(g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_IA].m2_factor_k/256.0)); } if(!gb_drive.tDriveI0Time.boolTrip) { g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_I0].m2[i] = GetSetSQR(pSet->dU_drive_i0,(g_ui[UI_SW_INDEX_BEGIN(sw)+SW_AC_I0].m2_factor_k/256.0)); } } #if 0 //测量显示遥测值 g_sw_pub.ac_in[PUB_AC_UA1] =(pSet->dU_drive_ua1*Q16_BASE); g_sw_pub.ac_in[PUB_AC_UAB1] =(pSet->dU_drive_ua1*Q16_BASE); g_sw_pub.ac_in[PUB_AC_UA2] =(pSet->dU_drive_ua2*Q16_BASE); g_sw_pub.ac_in[PUB_AC_UAB2] =(pSet->dU_drive_ua2*Q16_BASE); g_sw_pub.ac_in[PUB_AC_U01] = (qs16)(pSet->dU_drive_u0*Q16_BASE); g_sw[sw].ac_in[SW_AC_IA] = (qs16)(pSet->dU_drive_i*Q16_BASE); g_sw[sw].ac_in[SW_AC_I0] = (qs16)(pSet->dU_drive_i0*Q16_BASE); #endif } #endif /****************************************************************************** 函数名称: sw_cal_protect 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 在保护5ms中断中计算基波的值。 参数说明: 返回值: 修改记录: */ void sw_cal_protect(void) { int sw,i,index ; short *psam; qs08 angle; qs16 lncos,lnsin; struct ri_s16 ri16; struct ri_s16 ri16_2; struct ri_s32 ri; struct ri_s32 ri_2[2]; // 更新保护计算时采样点的索引 g_prot_index=g_adc_dots_index; #ifdef FUN_HCBS { extern DWORD dTcounterrem; dTcounterrem=dTCounter; } #endif // 计算模值平方 for(i=0; i= PUB_AC_NUM) { fourier32(psam, &ri16_2, FOURIER_HARMONIC_2); } } //基波计算 ri.r = _MulFac_S(ri16.r,g_ui[i].m2_factor_c); // 电压电流实部 ri.i = _MulFac_S(ri16.i,g_ui[i].m2_factor_c); // 电压电流虚部 angle = rt_round((g_ui[i].p_factor + factor_p_k(g_ui[i].chn_index))*256); lncos = mCos(angle); lnsin = mSin(angle); g_ui[i].ri.r = _MulFac_S(ri.r,lncos) - _MulFac_S(ri.i,lnsin); g_ui[i].ri.i = _MulFac_S(ri.r,lnsin) + _MulFac_S(ri.i,lncos); g_ui[i].m2[0] = SQR(g_ui[i].ri.r,g_ui[i].ri.i); // 电压电流平方和 rt_stat_in(&g_ui[i].m2_stat,g_ui[i].m2[0]); //二次谐波计算 if (i >= PUB_AC_NUM) { ri_2[0].r = _MulFac_S(ri16_2.r,g_ui[i].m2_factor_c); // 电压电流实部 ri_2[0].i = _MulFac_S(ri16_2.i,g_ui[i].m2_factor_c); // 电压电流虚部 #if 0 angle = rt_round(g_ui[i].p_factor*256); lncos = mCos(angle); lnsin = mSin(angle); #endif ri_2[1].r = _MulFac_S(ri_2[0].r,lncos) - _MulFac_S(ri_2[0].i,lnsin); ri_2[1].i = _MulFac_S(ri_2[0].r,lnsin) + _MulFac_S(ri_2[0].i,lncos); g_ui[i].m2[1] = SQR(ri_2[1].r,ri_2[1].i); // 电压电流平方和 } } #ifdef GD_AREA_ECZD_2020 //计算正序和负序电压 //US1 if((g_ui[PUB_AC_UA1].chn_index != CFG_ADC_CHANNEL_ZERO)&&(g_ui[PUB_AC_UB1].chn_index != CFG_ADC_CHANNEL_ZERO)&&(g_ui[PUB_AC_UC1].chn_index != CFG_ADC_CHANNEL_ZERO)) { _sw_cal_Xfl120(PUB_AC_UA1, &Us1_120); } else { Us2_120.vect1=0; Us2_120.vect2=0; } //US2 if((g_ui[PUB_AC_UA2].chn_index != CFG_ADC_CHANNEL_ZERO)&&(g_ui[PUB_AC_UB2].chn_index != CFG_ADC_CHANNEL_ZERO)&&(g_ui[PUB_AC_UC2].chn_index != CFG_ADC_CHANNEL_ZERO)) { _sw_cal_Xfl120(PUB_AC_UA2, &Us2_120); } else { Us2_120.vect1=0; Us2_120.vect2=0; } #endif // 合成线电压1 if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_LV1) { g_ui[PUB_AC_UAB1].ri.r = g_ui[PUB_AC_UA1].ri.r - g_ui[PUB_AC_UB1].ri.r; g_ui[PUB_AC_UAB1].ri.i = g_ui[PUB_AC_UA1].ri.i - g_ui[PUB_AC_UB1].ri.i; g_ui[PUB_AC_UAB1].m2[0] = SQR(g_ui[PUB_AC_UAB1].ri.r,g_ui[PUB_AC_UAB1].ri.i); rt_stat_in(&g_ui[PUB_AC_UAB1].m2_stat,g_ui[PUB_AC_UAB1].m2[0]); g_ui[PUB_AC_UBC1].ri.r = g_ui[PUB_AC_UB1].ri.r - g_ui[PUB_AC_UC1].ri.r; g_ui[PUB_AC_UBC1].ri.i = g_ui[PUB_AC_UB1].ri.i - g_ui[PUB_AC_UC1].ri.i; g_ui[PUB_AC_UBC1].m2[0] = SQR(g_ui[PUB_AC_UBC1].ri.r,g_ui[PUB_AC_UBC1].ri.i); rt_stat_in(&g_ui[PUB_AC_UBC1].m2_stat,g_ui[PUB_AC_UBC1].m2[0]); g_ui[PUB_AC_UCA1].ri.r = g_ui[PUB_AC_UC1].ri.r - g_ui[PUB_AC_UA1].ri.r; g_ui[PUB_AC_UCA1].ri.i = g_ui[PUB_AC_UC1].ri.i - g_ui[PUB_AC_UA1].ri.i; g_ui[PUB_AC_UCA1].m2[0] = SQR(g_ui[PUB_AC_UCA1].ri.r,g_ui[PUB_AC_UCA1].ri.i); rt_stat_in(&g_ui[PUB_AC_UCA1].m2_stat,g_ui[PUB_AC_UCA1].m2[0]); } // 合成线电压2 if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_LV2) { g_ui[PUB_AC_UAB2].ri.r = g_ui[PUB_AC_UA2].ri.r - g_ui[PUB_AC_UB2].ri.r; g_ui[PUB_AC_UAB2].ri.i = g_ui[PUB_AC_UA2].ri.i - g_ui[PUB_AC_UB2].ri.i; g_ui[PUB_AC_UAB2].m2[0] = SQR(g_ui[PUB_AC_UAB2].ri.r,g_ui[PUB_AC_UAB2].ri.i); rt_stat_in(&g_ui[PUB_AC_UAB2].m2_stat,g_ui[PUB_AC_UAB2].m2[0]); g_ui[PUB_AC_UBC2].ri.r = g_ui[PUB_AC_UB2].ri.r - g_ui[PUB_AC_UC2].ri.r; g_ui[PUB_AC_UBC2].ri.i = g_ui[PUB_AC_UB2].ri.i - g_ui[PUB_AC_UC2].ri.i; g_ui[PUB_AC_UBC2].m2[0] = SQR(g_ui[PUB_AC_UBC2].ri.r,g_ui[PUB_AC_UBC2].ri.i); rt_stat_in(&g_ui[PUB_AC_UBC2].m2_stat,g_ui[PUB_AC_UBC2].m2[0]); g_ui[PUB_AC_UCA2].ri.r = g_ui[PUB_AC_UC2].ri.r - g_ui[PUB_AC_UA2].ri.r; g_ui[PUB_AC_UCA2].ri.i = g_ui[PUB_AC_UC2].ri.i - g_ui[PUB_AC_UA2].ri.i; g_ui[PUB_AC_UCA2].m2[0] = SQR(g_ui[PUB_AC_UCA2].ri.r,g_ui[PUB_AC_UCA2].ri.i); rt_stat_in(&g_ui[PUB_AC_UCA2].m2_stat,g_ui[PUB_AC_UCA2].m2[0]); } if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_UCA1) // 合成线电压UCA1 { g_ui[PUB_AC_UCA1].ri.r =- g_ui[PUB_AC_UAB1].ri.r - g_ui[PUB_AC_UBC1].ri.r; g_ui[PUB_AC_UCA1].ri.i =- g_ui[PUB_AC_UAB1].ri.i - g_ui[PUB_AC_UBC1].ri.i; g_ui[PUB_AC_UCA1].m2[0] = SQR(g_ui[PUB_AC_UCA1].ri.r,g_ui[PUB_AC_UCA1].ri.i); rt_stat_in(&g_ui[PUB_AC_UCA1].m2_stat,g_ui[PUB_AC_UCA1].m2[0]); } if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_UCA2) // 合成线电压UCA1 { g_ui[PUB_AC_UCA2].ri.r =- g_ui[PUB_AC_UAB2].ri.r - g_ui[PUB_AC_UBC2].ri.r; g_ui[PUB_AC_UCA2].ri.i =- g_ui[PUB_AC_UAB2].ri.i - g_ui[PUB_AC_UBC2].ri.i; g_ui[PUB_AC_UCA2].m2[0] = SQR(g_ui[PUB_AC_UCA2].ri.r,g_ui[PUB_AC_UCA2].ri.i); rt_stat_in(&g_ui[PUB_AC_UCA1].m2_stat,g_ui[PUB_AC_UCA2].m2[0]); } if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_U01) { g_ui[PUB_AC_U01].ri.r = g_ui[PUB_AC_UA1].ri.r + g_ui[PUB_AC_UB1].ri.r+ g_ui[PUB_AC_UC1].ri.r; g_ui[PUB_AC_U01].ri.i = g_ui[PUB_AC_UA1].ri.i + g_ui[PUB_AC_UB1].ri.i+ g_ui[PUB_AC_UC1].ri.i; g_ui[PUB_AC_U01].m2[0] = SQR(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i); rt_stat_in(&g_ui[PUB_AC_U01].m2_stat,g_ui[PUB_AC_U01].m2[0]); } if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_U02) { g_ui[PUB_AC_U02].ri.r = g_ui[PUB_AC_UA2].ri.r + g_ui[PUB_AC_UB2].ri.r+ g_ui[PUB_AC_UC2].ri.r; g_ui[PUB_AC_U02].ri.i = g_ui[PUB_AC_UA2].ri.i + g_ui[PUB_AC_UB2].ri.i+ g_ui[PUB_AC_UC2].ri.i; g_ui[PUB_AC_U02].m2[0] = SQR(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i); rt_stat_in(&g_ui[PUB_AC_U02].m2_stat,g_ui[PUB_AC_U02].m2[0]); } // 合成电流 for(sw=0; swtSwSet[sw].bTT_Power_v2 == 0) { if(g_ui[PUB_AC_U01].chn_index != CFG_ADC_CHANNEL_ZERO) { if(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].chn_index != CFG_ADC_CHANNEL_ZERO) { g_ui_p0[sw].p= _sw_p2(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.i,g_ui[PUB_AC_U01].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor); g_ui_p0[sw].q= _sw_q2(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.i,g_ui[PUB_AC_U01].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor); } if(g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].chn_index != CFG_ADC_CHANNEL_ZERO) { g_ui_p0[sw].ps= _sw_p2(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.i,g_ui[PUB_AC_U01].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].e_factor); g_ui_p0[sw].qs= _sw_q2(g_ui[PUB_AC_U01].ri.r,g_ui[PUB_AC_U01].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.i,g_ui[PUB_AC_U01].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].e_factor); } } else { g_ui_p0[sw].p=0;g_ui_p0[sw].q=0; g_ui_p0[sw].ps=0;g_ui_p0[sw].qs=0; } } else { if(g_ui[PUB_AC_U02].chn_index != CFG_ADC_CHANNEL_ZERO) { if(g_ui[UI_SW_INDEX(sw,SW_AC_I0)].chn_index != CFG_ADC_CHANNEL_ZERO) { g_ui_p0[sw].p= _sw_p2(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.i,g_ui[PUB_AC_U02].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor); g_ui_p0[sw].q= _sw_q2(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].ri.i,g_ui[PUB_AC_U02].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0)].e_factor); } if(g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].chn_index != CFG_ADC_CHANNEL_ZERO) { g_ui_p0[sw].ps= _sw_p2(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.i,g_ui[PUB_AC_U02].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].e_factor); g_ui_p0[sw].qs= _sw_q2(g_ui[PUB_AC_U02].ri.r,g_ui[PUB_AC_U02].ri.i,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.r,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].ri.i,g_ui[PUB_AC_U02].e_factor,g_ui[UI_SW_INDEX(sw,SW_AC_I0s)].e_factor); } } else { g_ui_p0[sw].p=0;g_ui_p0[sw].q=0; g_ui_p0[sw].ps=0;g_ui_p0[sw].qs=0; } } #endif } // 仅线电压需计算幅值 for(i=PUB_AC_UAB1; iac_num; i++) { if(g_equ_config_ac[i].owner ==1&&g_equ_config_ac[i].type==(SW_AC_IA+1)) // 根据开关1 IA的配置,保存相关的参数 { if(g_equ_config_ac[i].scale==EQU_SCALE_CT_DEFAULT) { b100A=true; } if(g_equ_config_ac[i].scale==EQU_SCALE_CT_10A_51) { b50A=true; } if(g_equ_config_ac[i].scale==EQU_SCALE_CT_10A_249) { b20A=true; } if(g_equ_config_ac[i].scale==EQU_SCALE_CT_10A_120) { b10A=true; } if(b100A) { rt_file_cp("/app/data/acfactor.bin","/app/data/acfactor_100A.bin"); } if(b50A) { rt_file_cp("/app/data/acfactor.bin","/app/data/acfactor_50A.bin"); } if(b20A) { rt_file_cp("/app/data/acfactor.bin","/app/data/acfactor_20A.bin"); } if(b10A) { rt_file_cp("/app/data/acfactor.bin","/app/data/acfactor_10A.bin"); } return; } } } /****************************************************************************** 函数名称: sw_auto_adjust 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 自动校准程序 U 100V,I 5A, 参数说明: 返回值: 0: 成功 其它: 失败 修改记录: */ struct pq_factor { int cfg_index; float pq[2]; }; struct pq_factor g_pq_factor[SWITCH_NUM_MAX][3]; int sw_auto_adjust(int ui_angle0) { float baseAng; int ret,i,j,sw; int cfg_index; float factor; float fv; float minfv,maxfv; float baseValue ; u16 base_v=0,base_i=0; #ifdef PROTECT_AC_ADJUST float fv_p; #endif g_mea_cnt= 0; // 如果是单板测试,可能需要使用PUB_AC_UA2作为角度0参考 if(ui_angle0 != -1) { g_ui_angle0 = ui_angle0; } // 测量值复位 g_factor_version = ACFACTOR_FILE_VERSION; for(i=0; i 200) // 220 { // 220V额定电压 baseValue = 220; // } else if (fv > (120.0*1.732)) // 207.84 { // 130V相电压合成线电压校准 // 因为罩式控制器在用100V校准时,PT切换不断的响, // 130V相电压可得到225V电源,可避免PT切换的异响 baseValue = 130*1.732; // 225.16 } else if(fv > 90*1.732) // 155.88 { // 100V相电压合成线电压校准 baseValue = 100*1.732; // 173.2 } else if (fv > 120.0) // 120 { // 130V 相电压校准 baseValue = 130; // 130 } else if(fv > 90.0) { // 100V 相电压校准 baseValue = 100; // 100 } else if(fv > 50.0) { // 100V 相电压校准 baseValue = 57.735; // 57.735 } else if(fv > 16.0) { // 100V 相电压校准 baseValue = 20; // 20 } else if(fv > 8.0) { // 10V 相电压校准 baseValue = 10; // 10 } else if(fv > 6.0) { baseValue =6.5; } else if(fv > 2.0) { // 10V 相电压校准 baseValue = 3; // 10 } else if(fv > 1.5) { baseValue = 1.8763875; } else { // 57.735V 相电压校准 baseValue = 57.735; // 57.735 } } else { sw = (i - PUB_AC_NUM)/SW_AC_NUM; j = (i - PUB_AC_NUM)%SW_AC_NUM; cfg_index = g_sw[sw].ac_cfg_index[j]; // 电子式互感器I0使用5A校准 // if(g_equ_config_ac[cfg_index].scale == EQU_SCALE_ECT_1V_1A // || g_equ_config_ac[cfg_index].scale == EQU_SCALE_ECT_0V2_1A) if(g_equ_config_ac[cfg_index].scale == EQU_SCALE_ECT_1V_1A) { // 电子式CT使用1A。 baseValue = 1; } else if(g_equ_config_ac[cfg_index].scale == EQU_SCALE_CT_10A_249) { // 高精度零序电流互感器,小信号校正值 baseValue = 0.5; } else if(fv > 4) { baseValue=5; } else if(fv > 2) { // 大容量校准时,例如16回路,标准源可能带不动5A负载。 baseValue=3; } else { baseValue=1; } } minfv=baseValue*0.9; maxfv=baseValue*1.1; // 检查幅值是否超范围 if(fvmaxfv) { rt_printf("sw_auto_adjust(err):i=%d,fv=%f,maxfv=%f\r\n",i,fv ,maxfv); return -1; } // 得到并检查校正系数 factor=baseValue/fv; if(CheckFloatSet(&factor,MAX_FACTOR,MIN_FACTOR)>0) { rt_printf("sw_auto_adjust(err):i=%d,fv=%f,factor=%f.\r\n",i,fv ,factor); return -2; } // 保存校正系数 factor_e_c_set(g_equ_config_ac[cfg_index].slot,g_equ_config_ac[cfg_index].index,factor); #ifdef PROTECT_AC_ADJUST factor=baseValue/fv_p; rt_printf("fv_p=%f,baseValue=%f,factor=%f\r\n",fv_p, baseValue, factor); if(CheckFloatSet(&factor,MAX_FACTOR,MIN_FACTOR)>0) { rt_printf("sw_auto_adjust(err) protect ac:i=%d,fv=%f,factor_p=%f.\r\n",i,fv ,factor); return -2; } // 保存校正系数 factor_p_e_c_set(g_equ_config_ac[cfg_index].slot,g_equ_config_ac[cfg_index].index,factor); #endif // 保存校正成功配置通道值 if(i >= PUB_AC_NUM) { g_pq_factor[sw][j].cfg_index = cfg_index; } // 角度校准 baseAng =_sw_base_angle(i); fv = (float)g_ui[i].p/Q16_BASE; if(baseAng == 360.0) { factor = 0; } else { factor = baseAng - fv; } // 确保角度在正负180内。 if(factor > 180.0) { factor -= 360.0; } if(factor < -180.0) { factor += 360.0; } rt_printf("sw_auto_adjust(ang):i=%d,fv=%f,factor=%f.\r\n",i,fv ,factor); if(factorMAX_PHASE) { return -4; } if(CheckFloatSet(&factor,MAX_PHASE,MIN_PHASE)>0) { return -5; } // 如果是基准通道,就不更新角度校准值。 if(i != g_ui_angle0) { factor_p_c_set(g_equ_config_ac[cfg_index].slot,g_equ_config_ac[cfg_index].index,factor); } // 保存校正温度和基准值 factor_temp_set(g_equ_config_ac[cfg_index].slot, #if defined TMP_CHIP_DS18B20 ds18b20_get_temp() #elif defined TMP_CHIP_GX21M15 gx21m15_get_temp() #endif ); if(i < PUB_AC_NUM) { base_v = baseValue; } else { base_i = baseValue; } } // 重新初始化 sw_init(); //保存校正系数 ret = factor_write_all(base_v,base_i); if(ret != 0) { return -6; } sw_factor_cp(); soe_record_opt(EV_CHNZJS, 0); return 0; } float g_dc_factor[2][2]= { {1.0,1.0}, {1.0,1.0}, }; int sw_adjust_dc_0(void) { int i; float dc; #ifdef DC_NUM_SET for(i=0;idDc_num;i++) #else for(i=0;i 1.5*dc_adjust[0]) { return -2; } g_dc_factor[i][0] = dc; } return 0; } int sw_adjust_dc_1(void) { int i; float dc; #ifdef DC_NUM_SET for(i=0;idDc_num;i++) #else for(i=0;i 1.5*dc_adjust[1]) { return -2; } g_dc_factor[i][1] = dc; } _sw_save_dc_factor(g_dc_factor[0][1], g_dc_factor[0][0], g_dc_factor[1][1], g_dc_factor[1][0]); return 0; } /*------------------------------ 内部函数 ------------------------------------- 内部函数以下划线‘_’开头,不需要检查参数的合法性. */ /****************************************************************************** 函数名称: _sw_get_dots 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 获取采样点,供测量计算用 参数说明: 返回值: 修改记录: */ void xdl_smooth3 ( short in[], short out[], int N ); void xdl_smooth5 ( short in[], short out[], int N ); int _sw_check_tb_dots(unsigned long dot_index) { int i,j; if(pRunSet->dSmoothZero==0)return 0; for(i=0;i pRunSet->dSmoothZero) { rt_printf("\r\n chnel=%d zero=%d set=%d",i,daaa,pRunSet->dSmoothZero); return -1; } } } return 0; } void _sw_get_dots(void) { unsigned long i,loop,dots_index ,dots_count_old; int cnt; int ret=0; loop =0; do { // 获取采样点的位置,如果最后一个周波跨界,调整采样点的位置。 #ifdef CPU_FUXI dots_count_old = g_adc_dots_index - CFG_ADC_DOTS_PER_PERIOD; //jack.liu 20200921 获取最后一个周波的采样点 #else dots_count_old = g_adc_dots_count - CFG_ADC_DOTS_PER_PERIOD; // 最后一个周波的采样点 #endif cnt = (dots_count_old&CFG_ADC_DOTS_MASK) - (CFG_ADC_DOTS_PER_CHANNEL - CFG_ADC_DOTS_PER_PERIOD); if(cnt > 0) { dots_count_old -= cnt; } dots_index = dots_count_old&CFG_ADC_DOTS_MASK; ret=_sw_check_tb_dots(dots_index); if(ret<0)return; // 波形判断有突变,不处理采样 for(i=0;i 5) { rt_printf("sw_get_dots:i=%d\r\n",loop); } } #ifdef CPU_FUXI while((g_adc_dots_index - dots_count_old) > CFG_ADC_DOTS_PER_CHANNEL); #else while((g_adc_dots_count - dots_count_old) > CFG_ADC_DOTS_PER_CHANNEL); #endif } /****************************************************************************** 函数名称: _sw_fft 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 计算FFT,一次计算两个通道 参数说明: ch0 通道0索引 ch1 通道1索引 p0 通道0结果,所有谐波的复数表示。 p1 通道1结果,所有谐波的复数表示。 返回值: 修改记录: */ void _sw_fft(int ch0,int ch1,complex * p0,complex * p1) { static complex k[CFG_ADC_DOTS_PER_PERIOD]; int i; // 初始化点 for(i=0; ilIaR - (( pI->lIbR + pI->lIcR )>>1); lbc = pI->lIbI - pI->lIcI; lbc =_MulFac_S(lbc, 56756);//(1.732/2)*2^16=56756 pII->l1Cos = labc - lbc; pII->l2Cos = labc + lbc; labc = pI->lIaI - ( (pI->lIbI + pI->lIcI )>>1); lbc = pI->lIbR - pI->lIcR; lbc =_MulFac_S(lbc,56756);//(1.732/2)*2^16=56756 pII->l1Sin = labc + lbc; pII->l2Sin = labc - lbc; pII->l0Cos = pI->lIaR + pI->lIbR + pI->lIcR; pII->l0Sin = pI->lIaI + pI->lIbI + pI->lIcI; pII->d1Modu = SQR( pII->l1Cos, pII->l1Sin ); pII->d2Modu = SQR( pII->l2Cos, pII->l2Sin ); pII->d0Modu = SQR( pII->l0Cos, pII->l0Sin ); } #endif float _sw_cal_unbalance(int ui_index) { float abc,bc; float r1,r2,i1,i2; abc = g_ui[ui_index].h[1].r - (g_ui[ui_index+1].h[1].r + g_ui[ui_index+2].h[1].r)/2; bc = g_ui[ui_index+1].h[1].i - g_ui[ui_index+2].h[1].i; bc = bc * (1.7320508/2); r1 = abc - bc; r2 = abc + bc; abc = g_ui[ui_index].h[1].i - (g_ui[ui_index+1].h[1].i + g_ui[ui_index+2].h[1].i)/2; bc = g_ui[ui_index+1].h[1].r - g_ui[ui_index+2].h[1].r; bc = bc * (1.7320508/2); i1 = abc + bc; i2 = abc - bc; abc = sqrtf(r1*r1 + i1*i1); bc = sqrtf(r2*r2 + i2*i2); //rt_printf("%s\tabc=%f,\tbc=%f.\r\n",g_ui[ui_index].name,abc*g_ui[ui_index].e_factor,bc*g_ui[ui_index].e_factor); if(abc == 0.0) { return 100; } return bc/abc*100; } /****************************************************************************** 函数名称: _sw_cal_unbalance 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 正负序计算 参数说明: 返回值: 修改记录: */ void _sw_cal_Xfl120( int ui_index, struct ui120 *pII ) { float abc,bc; float r1,r2,i1,i2; abc = g_ui[ui_index].ri.r - (g_ui[ui_index+1].ri.r + g_ui[ui_index+2].ri.r)/2; bc = g_ui[ui_index+1].ri.i - g_ui[ui_index+2].ri.i; bc = bc * (1.7320508/2); r1 = abc - bc; r2 = abc + bc; abc = g_ui[ui_index].ri.i - (g_ui[ui_index+1].ri.i + g_ui[ui_index+2].ri.i)/2; bc = g_ui[ui_index+1].ri.r - g_ui[ui_index+2].ri.r; bc = bc * (1.7320508/2); i1 = abc + bc; i2 = abc - bc; pII->vect1 = (r1*r1 + i1*i1)/9; pII->vect2 = (r2*r2 + i2*i2)/9; } /****************************************************************************** 函数名称: _sw_cal_make 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 测量合成通道向量值 参数说明: 返回值: 修改记录: */ void _sw_cal_make(void) { int sw ; // 合成电压 if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_LV1) { _sw_cal_h_sub(PUB_AC_UAB1,PUB_AC_UA1,PUB_AC_UB1); _sw_cal_h_sub(PUB_AC_UBC1,PUB_AC_UB1,PUB_AC_UC1); _sw_cal_h_sub(PUB_AC_UCA1,PUB_AC_UC1,PUB_AC_UA1); } if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_LV2) { _sw_cal_h_sub(PUB_AC_UAB2,PUB_AC_UA2,PUB_AC_UB2); _sw_cal_h_sub(PUB_AC_UBC2,PUB_AC_UB2,PUB_AC_UC2); _sw_cal_h_sub(PUB_AC_UCA2,PUB_AC_UC2,PUB_AC_UA2); } // 合成UCA if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_UCA1) { { int i; for(i=1;i<=g_harmonic_num;i++) { g_ui[PUB_AC_UCA1].h[i].r = -g_ui[PUB_AC_UAB1].h[i].r - g_ui[PUB_AC_UBC1].h[i].r; g_ui[PUB_AC_UCA1].h[i].i = -g_ui[PUB_AC_UAB1].h[i].i - g_ui[PUB_AC_UBC1].h[i].i; } } } if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_UCA2) { { int i; for(i=1;i<=g_harmonic_num;i++) { g_ui[PUB_AC_UCA2].h[i].r = -g_ui[PUB_AC_UAB2].h[i].r - g_ui[PUB_AC_UBC2].h[i].r; g_ui[PUB_AC_UCA2].h[i].i = -g_ui[PUB_AC_UAB2].h[i].i - g_ui[PUB_AC_UBC2].h[i].i; } } } if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_U01) { { int i; for(i=1;i<=g_harmonic_num;i++) { g_ui[PUB_AC_U01].h[i].r = g_ui[PUB_AC_UA1].h[i].r + g_ui[PUB_AC_UB1].h[i].r+ g_ui[PUB_AC_UC1].h[i].r; g_ui[PUB_AC_U01].h[i].i = g_ui[PUB_AC_UA1].h[i].i + g_ui[PUB_AC_UB1].h[i].i+ g_ui[PUB_AC_UC1].h[i].i; } } } if(g_sw_pub.ui_flags&UI_FLAGS_MAKE_U02) { { int i; for(i=1;i<=g_harmonic_num;i++) { g_ui[PUB_AC_U02].h[i].r = g_ui[PUB_AC_UA2].h[i].r + g_ui[PUB_AC_UB2].h[i].r+ g_ui[PUB_AC_UC2].h[i].r; g_ui[PUB_AC_U02].h[i].i = g_ui[PUB_AC_UA2].h[i].i + g_ui[PUB_AC_UB2].h[i].i+ g_ui[PUB_AC_UC2].h[i].i; } } } // 电压不平衡计算 g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE1] += _sw_cal_unbalance(PUB_AC_UA1); g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE2] += _sw_cal_unbalance(PUB_AC_UA2); // 开关电流 for(sw=0; sw=UI_SW_INDEX(1,SW_AC_IA) && i<=UI_SW_INDEX(1,SW_AC_I0)) { rt_printf("%s[%02d]:e=%f,p=%f.\r\n",g_ui[i].name,j,f*g_ui[i].e_factor,_sw_cal_angle0(re,im)); } #endif } f = sqrtf(sum); g_ui[i].e_acc += f*g_ui[i].e_factor ; } return ; } /****************************************************************************** 函数名称: _sw_cal_angle0 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 计算向量角度 参数说明: re 向量实部 im 向量虚部 返回值: 修改记录: */ #if 1 float _sw_cal_angle0(float re, float im) { float p; p = atan2f(im,re); p = p*180/pi; return p; } #else const int Angle_const[7] = { 0,267,577,1000,1732,3732,57400 }; float _sw_cal_angle0(float re, float im) { float angle_arttg; float angle = 0; uint8 quad; if (re >=0) { if (im >=0) quad = 1; else { quad = 4; im = im*(-1); } } else { re = re*(-1); if (im >= 0) quad = 2; else { im = im*(-1); quad = 3; } } if (re <=2) { switch (quad) { case 1:angle = 90;break; case 2:angle = 90;break; case 3:angle = 270;break; case 4:angle = 270;break; } } else { angle_arttg = (im*1000)/re; if (angle_arttg <= Angle_const[1]) { angle = 0 + (angle_arttg-Angle_const[0])*57/(1000+Angle_const[0]*angle_arttg/1000); } else if (angle_arttg <= Angle_const[2]) { angle = 15 + (angle_arttg-Angle_const[1])*57/(1000+Angle_const[1]*angle_arttg/1000); } else if (angle_arttg <= Angle_const[3]) { angle = 30 + (angle_arttg-Angle_const[2])*57/(1000+Angle_const[2]*angle_arttg/1000); } else if (angle_arttg <= Angle_const[4]) { angle = 45 + (angle_arttg-Angle_const[3])*57/(1000+Angle_const[3]*angle_arttg/1000); } else if (angle_arttg <= Angle_const[5]) { angle = 60 + (angle_arttg-Angle_const[4])*57/(1000+Angle_const[4]*angle_arttg/1000); } else if (angle_arttg <= Angle_const[6]) { angle = 75 + (angle_arttg-Angle_const[5])*57/(1000+Angle_const[5]*angle_arttg/1000); } else { angle = 90; } switch (quad) { case 1: angle = angle;break; case 2: angle = 180 - angle;break; case 3: angle = 180 + angle;break; case 4: angle = 360 - angle;break; } } if((re < 5) && (im < 5)) angle = 0; return(angle); } #endif /****************************************************************************** 函数名称: _sw_cal_angle_correct 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 测量计算角度时对角度进行校正,保证累加时不会出现计算错误。 参数说明: 返回值: 修改记录: */ void _sw_cal_angle_correct(qs16 *angle,int *mark) { if(*angle > ANGF180) { *angle -= ANG360; } if(*angle < ANGN180) { *angle += ANG360; } if(*mark == 0) { if(abs(*angle)< 90*Q16_BASE) { *mark = 1; } else { *mark = -1; } } if(*mark == -1) { if(*angle >= 0) { *angle = 180*Q16_BASE - *angle; } else { *angle = (-180)*Q16_BASE - *angle; } } } /****************************************************************************** 函数名称: _sw_cal_angle 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 测量计算角度,每次调用累加计算值。 参数说明: 返回值: 修改记录: */ void _sw_cal_angle(void) { int i; qs16 qs; float angle,angle0; // 检查是否有基准通道 if(g_ui_angle0 == -1) { return; } // 计算基准通道的角度 angle0 = _sw_cal_angle0(g_ui[g_ui_angle0].h[1].r,g_ui[g_ui_angle0].h[1].i); // angle0 += g_ui[g_ui_angle0].p_factor; // 计算相对角度 for(i=0;itSwSet[sw].bTT_Power_v2 ? PUB_AC_UA2 : PUB_AC_UA1; for(j=0; j<3; j++) { I = UI_SW_INDEX(sw,j+baseI); p = 0; q = 0; pz=0; qz=0; for(i=1; i<=g_harmonic_num;i++) { p += _sw_p2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ; q += _sw_q2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ; } pz=p*(1 + g_ui[I].pq_factor[0]) - q*g_ui[I].pq_factor[1]; qz=q*(1 + g_ui[I].pq_factor[0]) + p*g_ui[I].pq_factor[1]; g_sw[sw].ac_in_acc[SW_AC_IN_P] += pz; g_sw[sw].ac_in_acc[SW_AC_IN_Q] += qz; if(j==0) { g_sw[sw].ac_in_acc[SW_AC_IN_Pa] += pz; g_sw[sw].ac_in_acc[SW_AC_IN_Qa] += qz; } else if(j==1) { g_sw[sw].ac_in_acc[SW_AC_IN_Pb] += pz; g_sw[sw].ac_in_acc[SW_AC_IN_Qb] += qz; } else if(j==2) { g_sw[sw].ac_in_acc[SW_AC_IN_Pc] += pz; g_sw[sw].ac_in_acc[SW_AC_IN_Qc] += qz; } U++; } return; } /****************************************************************************** 函数名称: _sw_cal_pq_2m 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 2表法计算一个开关的pq,每次调用累加计算值。 参数说明: sw 开关序号 返回值: 修改记录: */ void _sw_cal_pq_2m(u32 sw) { u32 i,U,I,baseI; float p,q,pz,qz; // IA U = PUB_AC_UAB1; if(g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].chn_index != CFG_ADC_CHANNEL_ZERO)baseI=SW_AC_CIA; else baseI=0; if(pRunSet->tSwSet[sw].bTT_Power_v2) { U = PUB_AC_UAB2; } else if ((g_ui[PUB_AC_UAB1].chn_index == CFG_ADC_CHANNEL_ZERO) && (g_ui[PUB_AC_UAB2].chn_index != CFG_ADC_CHANNEL_ZERO)) { U = PUB_AC_UAB2; } I = UI_SW_INDEX(sw,baseI); p = 0; q = 0; for(i=1; i<=g_harmonic_num;i++) { p += _sw_p2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ; q += _sw_q2(g_ui[U].h[i].r,g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ; } pz=p*(1 + g_ui[I].pq_factor[0]) - q*g_ui[I].pq_factor[1]; qz=q*(1 + g_ui[I].pq_factor[0]) + p*g_ui[I].pq_factor[1];; g_sw[sw].ac_in_acc[SW_AC_IN_P] += pz; g_sw[sw].ac_in_acc[SW_AC_IN_Q] += qz; g_sw[sw].ac_in_acc[SW_AC_IN_Pa] += pz; g_sw[sw].ac_in_acc[SW_AC_IN_Qa] += qz; // IC U = PUB_AC_UBC1; if(pRunSet->tSwSet[sw].bTT_Power_v2) { U = PUB_AC_UBC2; } else if ((g_ui[PUB_AC_UBC1].chn_index == CFG_ADC_CHANNEL_ZERO) && (g_ui[PUB_AC_UBC2].chn_index != CFG_ADC_CHANNEL_ZERO)) { U = PUB_AC_UBC2; } I = UI_SW_INDEX(sw,2+baseI); p = 0; q = 0; for(i=1; i<=g_harmonic_num;i++) { p += _sw_p2(-g_ui[U].h[i].r,-g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ; q += _sw_q2(-g_ui[U].h[i].r,-g_ui[U].h[i].i,g_ui[I].h[i].r,g_ui[I].h[i].i,g_ui[U].e_factor,g_ui[I].e_factor) ; } pz=p*(1 + g_ui[I].pq_factor[0]) - q*g_ui[I].pq_factor[1]; qz=q*(1 + g_ui[I].pq_factor[0]) + p*g_ui[I].pq_factor[1];; g_sw[sw].ac_in_acc[SW_AC_IN_P] += pz; g_sw[sw].ac_in_acc[SW_AC_IN_Q] += qz; g_sw[sw].ac_in_acc[SW_AC_IN_Pc] += pz; g_sw[sw].ac_in_acc[SW_AC_IN_Qc] += qz; g_sw[sw].ac_in_acc[SW_AC_IN_Pb] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_Qb] = 0; return; } /****************************************************************************** 函数名称: _sw_cal_pq 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 测量计算pq,区分3表法和2表法,每次调用累加计算值。 参数说明: 返回值: 修改记录: */ void _sw_cal_pq(void) { u32 sw,U; for(sw=0; swtSwSet[sw].bTT_Power_v2 ? PUB_AC_UA2 : PUB_AC_UA1; b3U= (g_ui[U+0].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[U+1].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[U+2].chn_index != CFG_ADC_CHANNEL_ZERO); b3I|= (g_ui[UI_SW_INDEX(sw,SW_AC_IA)].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[UI_SW_INDEX(sw,SW_AC_IB)].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[UI_SW_INDEX(sw,SW_AC_IC)].chn_index != CFG_ADC_CHANNEL_ZERO &&g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].chn_index == CFG_ADC_CHANNEL_ZERO); //测量电流未配置 b3I|= (g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[UI_SW_INDEX(sw,SW_AC_CIB)].chn_index != CFG_ADC_CHANNEL_ZERO && g_ui[UI_SW_INDEX(sw,SW_AC_CIC)].chn_index != CFG_ADC_CHANNEL_ZERO); if(b3U&&b3I) //有三相电压,且有三相测量电流或无AC 测量电流有三相保护电流,用三表法 { _sw_cal_pq_3m(sw); } else { _sw_cal_pq_2m(sw); } } } /****************************************************************************** 函数名称: _sw_cal_mea 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 测量计算,每次调用累加计算值 参数说明: 返回值: 修改记录: */ int _sw_cal_mea(void) { static int g_cal_step = 0; uint64_t us0; us0 = bsp_ustimer_get_origin(); if(g_cal_step == 0) { // 得到采样点 _sw_get_dots(); // fft _sw_cal_fft(); _sw_cal_ri_correct(); g_cal_step = 1; rt_stat_other_in(3,bsp_ustimer_get_duration(us0)/USTIMER_US); } else { // 得到合成通道的向量值 _sw_cal_make(); // 计算有效值 _sw_cal_effect(); // 计算角度 _sw_cal_angle(); // 计算PQ _sw_cal_pq(); g_cal_step = 0; rt_stat_other_in(4,bsp_ustimer_get_duration(us0)/USTIMER_US); } return g_cal_step; } #ifdef FUN_JDXX /********************************************************* 函数名称:isTakeIsVal 函数版本:v1.0 作 者: Xzy 日 期:2021.10.30 函数说明:是否取Is通道的值 参数说明:sw:开关号 I_chn:常规通道号 Is_chn:小值范围通道号 返 回 值:true:取Is的值 false:不取Is的值 **********************************************************/ static bool isTakeIsVal(int sw,int I_chn,int Is_chn) { float I_val,Is_val,err_val; if(g_ui[UI_SW_INDEX(sw,I_chn)].chn_index == CFG_ADC_CHANNEL_ZERO || g_ui[UI_SW_INDEX(sw,Is_chn)].chn_index == CFG_ADC_CHANNEL_ZERO){ return false; } I_val = (float)g_sw[sw].ac_in[I_chn]/65536; Is_val = (float)g_sw[sw].ac_in[Is_chn]/65536; if(Is_val == 0) err_val = 1; else err_val = ((float)abs(I_val*1000-Is_val*1000))/(Is_val*1000); if(Is_val > 0.5 || err_val >= 0.05) return false; return true; } #endif /****************************************************************************** 函数名称: _sw_cal_average 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 测量计算平均值 参数说明: cal_num 平均的次数 返回值: 修改记录: */ void _sw_cal_average(int cal_num) { s32 i,sw; s32 temp; // 平均幅值和角度 for(i=0;i= 0) { temp = 180*Q16_BASE - temp; } else { temp = (-180)*Q16_BASE - temp; } } g_ui[i].p = temp; rt_stat_in(&g_ui[i].p_stat,g_ui[i].p); g_ui[i].e_acc = 0; g_ui[i].p_acc = 0; g_ui[i].p_mark = 0; } #ifdef FUN_JDXX // 电流值小于0.5A,取Is的,因为在这个范围I0s准确度高 for(sw=0;swtSwSet[sw].bTT_Current_Inv) { g_sw[sw].ac_in[SW_AC_IN_P] = -g_sw[sw].ac_in[SW_AC_IN_P]; g_sw[sw].ac_in[SW_AC_IN_Q] = -g_sw[sw].ac_in[SW_AC_IN_Q]; g_sw[sw].ac_in[SW_AC_IN_Pa] = -g_sw[sw].ac_in[SW_AC_IN_Pa]; g_sw[sw].ac_in[SW_AC_IN_Pb] = -g_sw[sw].ac_in[SW_AC_IN_Pb]; g_sw[sw].ac_in[SW_AC_IN_Pc] = -g_sw[sw].ac_in[SW_AC_IN_Pc]; g_sw[sw].ac_in[SW_AC_IN_Qa] = -g_sw[sw].ac_in[SW_AC_IN_Qa]; g_sw[sw].ac_in[SW_AC_IN_Qb] = -g_sw[sw].ac_in[SW_AC_IN_Qb]; g_sw[sw].ac_in[SW_AC_IN_Qc] = -g_sw[sw].ac_in[SW_AC_IN_Qc]; } if( g_ui[UI_SW_INDEX(sw,SW_AC_IA)].e > g_unit[g_sw_ac_desc[SW_AC_IA].unit].zero || g_ui[UI_SW_INDEX(sw,SW_AC_IB)].e > g_unit[g_sw_ac_desc[SW_AC_IB].unit].zero || g_ui[UI_SW_INDEX(sw,SW_AC_IC)].e > g_unit[g_sw_ac_desc[SW_AC_IC].unit].zero) { g_sw[sw].ac_in[SW_AC_IN_BI_UNBALANCE] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_BI_UNBALANCE]/cal_num*Q16_BASE); } else { g_sw[sw].ac_in[SW_AC_IN_BI_UNBALANCE] = 0; } if( g_ui[UI_SW_INDEX(sw,SW_AC_CIA)].e > g_unit[g_sw_ac_desc[SW_AC_CIA].unit].zero || g_ui[UI_SW_INDEX(sw,SW_AC_CIB)].e > g_unit[g_sw_ac_desc[SW_AC_CIB].unit].zero || g_ui[UI_SW_INDEX(sw,SW_AC_CIC)].e > g_unit[g_sw_ac_desc[SW_AC_CIC].unit].zero) { g_sw[sw].ac_in[SW_AC_IN_CI_UNBALANCE] = rt_round(g_sw[sw].ac_in_acc[SW_AC_IN_CI_UNBALANCE]/cal_num*Q16_BASE); } else { g_sw[sw].ac_in[SW_AC_IN_CI_UNBALANCE] = 0; } // TODO: // 功率因数,I1/I*COSφ1=COSφ ,I1基波电流有效值,I总电流有效值,COSφ1基波功率因数,COSφ含谐波电网的实际功率因数 if(_AbsL(g_sw[sw].ac_in[SW_AC_IN_Q]) > g_unit[g_sw_ac_desc[SW_AC_IN_Q].unit].zero) { g_sw[sw].ac_in[SW_AC_IN_COS] =_CosPQ((g_sw[sw].ac_in[SW_AC_IN_P]>>14),(g_sw[sw].ac_in[SW_AC_IN_Q]>>14)); } else if(g_sw[sw].ac_in[SW_AC_IN_P]>=Q16_BASE) { g_sw[sw].ac_in[SW_AC_IN_COS]=Q16_BASE; } else if(g_sw[sw].ac_in[SW_AC_IN_P]<=-Q16_BASE) { g_sw[sw].ac_in[SW_AC_IN_COS]=-Q16_BASE; } else { g_sw[sw].ac_in[SW_AC_IN_COS]=0; } g_sw[sw].ac_in_acc[SW_AC_IN_P] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_Q] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_Pa] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_Pb] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_Pc] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_Qa] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_Qb] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_Qc] = 0; g_sw[sw].ac_in_acc[SW_AC_IN_BI_UNBALANCE] = 0; #if 0 //电子电流互感器小信号电压值 for(i=0;i<4;i++) { s16 cfg,scale; cfg = g_sw[sw].ac_cfg_index[SW_AC_IA+i]; if(cfg != INDEX_INVALLID) { scale = equ_get_ac_scale(g_equ_config_ac[cfg].slot,g_equ_config_ac[cfg].index); if(scale == EQU_SCALE_ECT_1V_1A || scale == EQU_SCALE_ECT_0V2_1A) { g_sw[sw].ac_in[SW_AC_IN_IA_ECT+i] = g_ui[UI_SW_INDEX(sw,SW_AC_IA+i)].e*g_e_k_ECVT[scale]; } } } #endif } // 其它测量值 // 频率 g_sw_pub.ac_in[PUB_AC_IN_F1] = (qs16)(freq_get(0)*Q16_BASE); //第1路频率 g_sw_pub.ac_in[PUB_AC_IN_F2] = (qs16)(freq_get(1)*Q16_BASE); //第2路频率 // 直流、温度 { float factor,t,f0,f1; #if defined TMP_CHIP_DS18B20 t = ds18b20_get_temp(); #elif defined TMP_CHIP_GX21M15 t = gx21m15_get_temp(); #endif #ifdef DC_TEST_ONE f0 = (dc_get(0)-g_dcfactor[0].f_dcL)*g_dcfactor[0].f_dc+dc_adjust[0]; f1 = 0; #else f0 = (dc_get(0)-g_dcfactor[0].f_dcL)*g_dcfactor[0].f_dc+dc_adjust[0]; f1 = (dc_get(1)-g_dcfactor[1].f_dcL)*g_dcfactor[1].f_dc+dc_adjust[0]; #endif factor = 1.0; if(t > -80.0 && t < 125.0) { factor += (t - g_dc_temp)* pRunSet->f_temp_factor_dc/1000000; } f0 /= factor; f1 /= factor; #ifdef DC_NUM_SET if(pRunSet->dDc_num==1) f1=0;//只有一个通道,将第二个直流通道强制=0 #endif #ifdef CPU_FUXI if(f0 < tRunPara.wDC_ZERO) { f0 = 0.0; } if(f1 < tRunPara.wDC_ZERO) { f1 = 0.0; } #endif g_sw_pub.ac_in[PUB_AC_IN_TEMP] = (qs16)(t*Q16_BASE); g_sw_pub.ac_in[PUB_AC_IN_UZ1] = (qs16)(f0*Q16_BASE); g_sw_pub.ac_in[PUB_AC_IN_UZ2] = (qs16)(f1*Q16_BASE); if(g_sw_pub.ac_in[PUB_AC_IN_UZ1]<0) g_sw_pub.ac_in[PUB_AC_IN_UZ1]=0; if(g_sw_pub.ac_in[PUB_AC_IN_UZ2]<0) g_sw_pub.ac_in[PUB_AC_IN_UZ2]=0; } // 电压不平衡度 if( g_ui[PUB_AC_UA1].e > g_unit[g_pub_ac_desc[PUB_AC_UA1].unit].zero || g_ui[PUB_AC_UB1].e > g_unit[g_pub_ac_desc[PUB_AC_UB1].unit].zero || g_ui[PUB_AC_UC1].e > g_unit[g_pub_ac_desc[PUB_AC_UC1].unit].zero) { g_sw_pub.ac_in[PUB_AC_IN_V_UNBALANCE1] = rt_round(g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE1]/cal_num*Q16_BASE); } else { g_sw_pub.ac_in[PUB_AC_IN_V_UNBALANCE1] = 0; } if( g_ui[PUB_AC_UA2].e > g_unit[g_pub_ac_desc[PUB_AC_UA2].unit].zero || g_ui[PUB_AC_UB2].e > g_unit[g_pub_ac_desc[PUB_AC_UB2].unit].zero || g_ui[PUB_AC_UC2].e > g_unit[g_pub_ac_desc[PUB_AC_UC2].unit].zero) { g_sw_pub.ac_in[PUB_AC_IN_V_UNBALANCE2] = rt_round(g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE2]/cal_num*Q16_BASE); } else { g_sw_pub.ac_in[PUB_AC_IN_V_UNBALANCE2] = 0; } g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE1] = 0; g_sw_pub.ac_in_acc[PUB_AC_IN_V_UNBALANCE2] = 0; #ifdef GD_AREA_YUNAN_LP // 云南涞浦 g_sw_pub.ac_in[PUB_AC_IN_DLTUAB] =_AbsL(g_ui[PUB_AC_UAB1].e -g_ui[PUB_AC_UAB2].e); g_sw_pub.ac_in[PUB_AC_IN_DLTUBC] =_AbsL(g_ui[PUB_AC_UBC1].e -g_ui[PUB_AC_UBC2].e); g_sw_pub.ac_in[PUB_AC_IN_DLTUCA] =_AbsL(g_ui[PUB_AC_UCA1].e -g_ui[PUB_AC_UCA2].e); if(g_ui[PUB_AC_UAB1].e>10*Q16_BASE&&g_ui[PUB_AC_UAB2].e>10*Q16_BASE) { g_sw_pub.ac_in[PUB_AC_IN_ARGUAB] =_AbsL(CalcAngSub(g_ui[PUB_AC_UAB1].ri.r,g_ui[PUB_AC_UAB1].ri.i,g_ui[PUB_AC_UAB2].ri.r,g_ui[PUB_AC_UAB2].ri.i)); } else { g_sw_pub.ac_in[PUB_AC_IN_ARGUAB]=0; } if(g_ui[PUB_AC_UBC1].e>10*Q16_BASE&&g_ui[PUB_AC_UBC2].e>10*Q16_BASE) { g_sw_pub.ac_in[PUB_AC_IN_ARGUBC] =_AbsL(CalcAngSub(g_ui[PUB_AC_UBC1].ri.r,g_ui[PUB_AC_UBC1].ri.i,g_ui[PUB_AC_UBC2].ri.r,g_ui[PUB_AC_UBC2].ri.i)); } else { g_sw_pub.ac_in[PUB_AC_IN_ARGUBC]=0; } if(g_ui[PUB_AC_UCA1].e>10*Q16_BASE&&g_ui[PUB_AC_UCA2].e>10*Q16_BASE) { g_sw_pub.ac_in[PUB_AC_IN_ARGUCA] =_AbsL(CalcAngSub(g_ui[PUB_AC_UCA1].ri.r,g_ui[PUB_AC_UCA1].ri.i,g_ui[PUB_AC_UCA2].ri.r,g_ui[PUB_AC_UCA2].ri.i)); } else { g_sw_pub.ac_in[PUB_AC_IN_ARGUCA]=0; } #endif //版本号0x00010104 { g_sw_pub.ac_in[PUB_AC_IN_VER] =((BYTE)((VER_NUM>>0)&0x0f) +((BYTE)(VER_NUM>>4)&0x0f)*10 +((BYTE)(VER_NUM>>8)&0x0f)*100 +((BYTE)(VER_NUM>>12)&0x0f)*1000 +((BYTE)(VER_NUM>>16)&0x0f)*10000)*Q16_BASE; } #if 0 //电子电压互感器小信号电压值 for(i=0;i<8;i++) { u8 evt[8]={PUB_AC_UA1,PUB_AC_UB1,PUB_AC_UC1,PUB_AC_U01,PUB_AC_UA2,PUB_AC_UB2,PUB_AC_UC2,PUB_AC_U02}; s16 cfg,scale; cfg = g_sw_pub.ac_cfg_index[evt[i]]; if(cfg != INDEX_INVALLID) { scale = equ_get_ac_scale(g_equ_config_ac[cfg].slot,g_equ_config_ac[cfg].index); if(scale == EQU_SCALE_EVT_3V25_100V || scale == EQU_SCALE_EVT_6V50_100V) { g_sw_pub.ac_in[PUB_AC_IN_UA1_EVT+i] = g_ui[evt[i]].e*g_e_k_ECVT[scale]; } } } #endif } void _sw_cal_zl(void) { // 直流、温度 { float factor,t,f0,f1; #if defined TMP_CHIP_DS18B20 t = ds18b20_get_temp(); #elif defined TMP_CHIP_GX21M15 t = gx21m15_get_temp(); #endif f0 = (dc_get(0)-g_dcfactor[0].f_dcL)*g_dcfactor[0].f_dc+dc_adjust[0]; f1 = (dc_get(1)-g_dcfactor[1].f_dcL)*g_dcfactor[1].f_dc+dc_adjust[0]; factor = 1.0; if(t > -80.0 && t < 125.0) { factor += (t - g_dc_temp)* pRunSet->f_temp_factor_dc/1000000; } f0 /= factor; f1 /= factor; g_sw_pub.ac_in[PUB_AC_IN_TEMP] = (qs16)(t*Q16_BASE); g_sw_pub.ac_in[PUB_AC_IN_UZ1] = (qs16)(f0*Q16_BASE); g_sw_pub.ac_in[PUB_AC_IN_UZ2] = (qs16)(f1*Q16_BASE); } } /****************************************************************************** 函数名称: _sw_auto_adjust_pq 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 自动校正PQ,累加校正系数 参数说明: 返回值: 修改记录: */ void _sw_auto_adjust_pq(void) { float RateP; float RateQ; u32 sw,i,j,U,I; float pp[3],qq[3]; RateP = (float)100*5*0.5; //U*I*COS60 RateQ = (float)100*5*0.866; //U*I*SIN60 for(sw=0; sw max) { max = m2; } ui_index++; } *p_min = min; *p_max = max; return; } /****************************************************************************** 函数名称: _fz_min_max 函数版本: 01.01 创建作者: xxxxxx 创建日期: 2013-08-07 函数说明: 计算g_ui中连续通道中的幅值的最小值,最大值,供保护算法使用 参数说明: ui_index1 起始通道在g_ui中的索引值 ui_index2 结束通道在g_ui中的索引值 p_min 返回的最小值 p_max 返回的最大值 返回值: 修改记录: */ void _fz_min_max(int ui_index1,int ui_index2,u32 *p_min,u32*p_max) { u32 min,max,m2; int i; min = -1; max = 0; for(i=ui_index1;i max) { max = m2; } ui_index1++; } *p_min = min; *p_max = max; return; } /****************************************************************************** 函数名称: _sw_base_angle 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 自动校准时,通道的基本参考角度 参数说明: ui_index 通道在g_ui中的索引值 返回值: 参考的角度 修改记录: */ float _sw_base_angle(int ui_index) { static float angle_v[8] = {0,-120,120,0,-120,120,120,120}; // U0、US使用UC角度 #ifdef SW_AC_I0S_SAMPLE static float angle_a [SW_AC_NUM] = {0,-120,120,-120,-120,0,-120,120}; // I0使用IB值 #else static float angle_a [SW_AC_NUM] = {0,-120,120,-120,0,-120,120}; // I0使用IB值 #endif float angle; if(ui_index < PUB_AC_NUM) { // 电压 // 将第2组电压映射到第一组上面 ui_index = ui_index%(PUB_AC_NUM/2); // 得到基准电压 angle = angle_v[ui_index]; // 如果配置不是相电压,U01、US1减30度。 if((g_ui[PUB_AC_UA1].chn_index == CFG_ADC_CHANNEL_ZERO) && (ui_index == PUB_AC_U01 || ui_index == PUB_AC_US1)) { angle -= 30; } } else { // 电流 ui_index = (ui_index - PUB_AC_NUM)%SW_AC_NUM; angle = angle_a[ui_index]; // 如果配置不是相电压,电流减30度。 if(g_ui[PUB_AC_UA1].chn_index == CFG_ADC_CHANNEL_ZERO) { angle -= 30; } } return angle; } /****************************************************************************** 函数名称: _sw_save_dc_factor 函数版本: 01.01 创建作者: sunxi 创建日期: 2013-08-07 函数说明: 将直流量校正系数保存到内部定值 参数说明: dc1 直流量1的校正系数 dc2 只流量2的校正系数 返回值: 0: 成功 其它: 失败 修改记录: */ int _sw_save_dc_factor(float dc1_H, float dc1_L,float dc2_H, float dc2_L) { struct dc_factor_save factor[2]; u8 id[8]; if(dc1_H != 0.0) { factor[0].dc_h = dc1_H; factor[0].adjust_set = DC_ADJUST; } if(dc1_L!= 0.0) { factor[0].dc_l= dc1_L; factor[0].adjust_set = DC_ADJUST; } if(dc2_H != 0.0) { factor[1].dc_h = dc2_H; factor[1].adjust_set = DC_ADJUST; } if(dc2_L!= 0.0) { factor[1].dc_l = dc2_L; factor[1].adjust_set = DC_ADJUST; } memcpy(id, g_auth_id, 8); if(dcfactor_createfile(&id[0], (u8*)&factor) != 0) { rt_printf("直流系数文件保存失败\r\n"); return -1; } return 0; } float g_temp_factor[EQU_SLOT_AC_NUM]; void _sw_temp_factor(void) { int i; float t; #if defined TMP_CHIP_DS18B20 t = ds18b20_get_temp(); #elif defined TMP_CHIP_GX21M15 t = gx21m15_get_temp(); #endif if(t < -80.0 || t > 125.0) { // 温度超范围,可能温度传感器坏,使用默认值 for(i=0; if_temp_factor_ac/1000000; g_temp_factor[i] += 1.0; } } for(i=0;ipt2_two; } else if(typept1_two; } } else { owner-=1; type-=1; if(type==SW_AC_I0) //零序 CT变比 { if(prim) return pRunSet->ct0_one; else return pRunSet->ct0_two; } else if(type==SW_AC_IA||type==SW_AC_IB||type==SW_AC_IC) { if(prim) return pRunSet->ct_one; else return pRunSet->ct_two; } } return 1; } /*------------------------------ 测试函数 ------------------------------------- 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数). */ int sw_stat_reset(void) { int i; for(i=0; i< UI_NUM; i++) { rt_stat_init(&g_ui[i].m2_stat,g_ui[i].name); rt_stat_init(&g_ui[i].e_stat,g_ui[i].name); rt_stat_init(&g_ui[i].p_stat,g_ui[i].name); } return 0; } int sw_pub_printf(void) { return 0; } int sw_pub_printf_v(void) { int i; // rt_printf("PUB AC通道模值:\r\n"); // rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt\r\n"); rt_printf("PUB AC通道有效值:\r\n"); rt_printf("name\t\t\tmin\tmax\tavg\tsum\t\tcnt\r\n"); for(i=0; icnt) { avg = stat->sum/stat->cnt; } rt_printf("%-24s",stat->name); qs = _Mul_Div_U(sqrt_32fix(stat->min), 256, g_ui[i].m2_factor_k); rt_printf("%f\t", (float)qs/Q16_BASE); qs = _Mul_Div_U(sqrt_32fix(stat->max), 256, g_ui[i].m2_factor_k); rt_printf("%f\t", (float)qs/Q16_BASE); qs = _Mul_Div_U(sqrt_32fix(avg), 256, g_ui[i].m2_factor_k); rt_printf("%f\t", (float)qs/Q16_BASE); rt_printf("%-016d%d\r\n",stat->sum,stat->cnt); return; } #else void rt_stat_printf_m2(int i,struct rt_stat *stat) { uint32_t avg = 0; float k; if(stat->cnt) { avg = stat->sum/stat->cnt; } k = _sw_ui_e_k(i); rt_printf("%-24s",stat->name); rt_printf("%f\t", sqrtf((float)stat->min)/k); rt_printf("%f\t", sqrtf((float)stat->max)/k); rt_printf("%f\t", sqrtf((float)avg)/k); rt_printf("%-016d%d\r\n",stat->sum,stat->cnt); return; } #endif int sw_ui_printf_e(void) { int i; rt_printf("UI通道:\r\n"); rt_printf("name\t\t\tmin\t\tmax\t\tavg\t\tsum\t\tcnt\r\n"); for(i=0; i