新增加了 交流量 直流量 遥信量的查看 YC页面的基础编写

This commit is contained in:
2026-04-07 20:40:29 +08:00
parent d19ce588b3
commit 0f5368bb51
18 changed files with 9578 additions and 7977 deletions

View File

@@ -68,9 +68,14 @@ cmake --build build
### 运行测试
```powershell
# 1. 配置项目(生成构建文件)
cmake -S . -B build
# 2. 编译项目
cmake --build build
# 3. 测试
ctest --test-dir build -C Debug --output-on-failure
# 4. 运行编译结果
./\build\Debug\DTU-HMI.exe
```
补充说明:

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,7 @@ extern uint8_t g_abyASCII126[][12];
extern uint8_t g_abyASCII168[][16];
#define UTF8_HZ12_BYTES_PER_CHAR 24
#define UTF8_HZ12_NUM_CHARS 7038
#define UTF8_HZ12_NUM_CHARS 7079
/* 按 Unicode 码点查找点阵,返回 24 字节指针,未找到返回 NULL */
const uint8_t* utf8_hz12_get(uint32_t unicode);

View File

@@ -207,7 +207,7 @@ page_t *AppInfoPage_GetInstance(void)
/* 确保在注册到 PageManager 前,页面生命周期回调已就绪 */
memset(&s_page, 0, sizeof(s_page));
s_page.page_id = PAGE_ID_APP_INFO;
s_page.is_cached = 1;
s_page.is_cached = 0;
s_page.on_create = Page_OnCreate;
s_page.on_enter = Page_OnEnter;
s_page.on_exit = Page_OnExit;

View File

@@ -22,7 +22,7 @@ void AppInfoView_ShowTerminalInfo(void)
s_port->show_str(32, 26, "馈线自动化终端");
for(uint8_t index = 0; index < 6; index++ )
{
s_port->show_str(6, 26 + (index + 1) * (s_port->get_ascii_height() + s_port->get_row_space()), context[index]);
s_port->show_str(6, 26 + (index + 1) * (s_port->get_ascii_height() + 3), context[index]);
}
}

663
src/Drv/pages/YC/data.h Normal file
View File

@@ -0,0 +1,663 @@
#ifndef YC_DATA_H
#define YC_DATA_H
#include "types.h"
/* -------------------------------------------------------------------------
* 宏定义:相名长度常量
* ------------------------------------------------------------------------- */
#ifndef CN_PHASE_NAME_LEN
#define CN_PHASE_NAME_LEN (4) /* 相名字符串最大长度 */
#endif
/* -------------------------------------------------------------------------
* 枚举定义:单元和电压通道索引(兼容旧代码)
* ------------------------------------------------------------------------- */
enum
{
EN_UNIT01_A = 1, EN_UNIT01_B, EN_UNIT01_C, /* 第一组单元 A/B/C相标识 */
EN_UNIT02_A, EN_UNIT02_B, EN_UNIT02_C, /* 第二组单元 A/B/C相标识 */
EN_UNIT01_0, EN_VOL1_A, EN_VOL1_B, EN_VOL1_C,/* 第一组电压通道标识 */
EN_VOL2_A, EN_VOL2_B, EN_VOL2_C, EN_VOL1_0, /* 第二组及零序电压标识 */
EN_VOL2_0, EN_VOL1_FR, EN_UNIT01_DC /* 剩余电压/频率/直流标识 */
};
/* -------------------------------------------------------------------------
* 枚举定义:单位类型常量表
* ------------------------------------------------------------------------- */
enum _UNIT_TYPE_
{
EN_UNIT_NULL=0, /* 0x00 - 无单位(空格) */
EN_UNIT_A, /* 0x01 - 安培 A */
EN_UNIT_V, /* 0x02 - 伏特 V */
EN_UNIT_S, /* 0x03 - 秒 S */
EN_UNIT_HZ, /* 0x04 - 赫兹 Hz */
EN_UNIT_HZPS, /* 0x05 - 赫兹每秒 Hz/s */
EN_UNIT_DGREE, /* 0x06 - 度 ° */
EN_UNIT_OHM, /* 0x07 - 欧姆 Ω */
EN_UNIT_KM, /* 0x08 - 千欧 kΩ */
EN_UNIT_M, /* 0x09 - 兆 M */
EN_UNIT_VPS, /* 0x0A - 伏每秒 V/S */
EN_UNIT_KV, /* 0x0B - 千伏 kV */
EN_UNIT_W, /* 0x0C - 瓦 W */
EN_UNIT_VAR, /* 0x0D - 乏 VAR */
EN_UNIT_MVA, /* 0x0E - 兆伏安 MVA */
EN_UNIT_0F, /* 0x0F - 无单位(空格) */
EN_UNIT_PERCENT, /* 0x10 - 百分比% */
EN_UNIT_MW, /* 0x11 - 兆瓦 MW */
EN_UNIT_MV, /* 0x12 - 毫伏 mV */
EN_UNIT_MA, /* 0x13 - 毫安 mA */
EN_UNIT_KOHM, /* 0x14 - 千欧 kΩ */
EN_UNIT_VA, /* 0x15 - 伏安 VA */
EN_UNIT_AKA, /* 0x16 - 千安 A(kA) */
EN_UNIT_KA, /* 0x17 - 千安 kA */
EN_UNIT_KVPS, /* 0x18 - 千伏每秒 KV/S */
EN_UNIT_MVAR, /* 0x19 - 兆乏 MVAR */
EN_UNIT_KW, /* 0x1A - 千瓦 KW */
EN_UNIT_KVAR, /* 0x1B - 千乏 KVAR */
EN_UNIT_KVA, /* 0x1C - 千伏安 KVA */
EN_UNIT_KWH, /* 0x1D - 千瓦时 kWh */
EN_UNIT_KVARH, /* 0x1E - 千乏时 kVarh */
EN_UNIT_IE, /* 0x1A - 额定电流 Ie */
EN_UNIT_1B, /* 0x1B - 无单位 */
EN_UNIT_1C, /* 0x1C - 无单位 */
EN_UNIT_1D, /* 0x1D - 无单位 */
EN_UNIT_1E, /* 0x1E - 无单位 */
EN_UNIT_1F, /* 0x1F - 无单位 */
EN_UNIT_20, /* 0x20 - 无单位 */
EN_UNIT_PERUN /* 0x21 - 标幺值Un */
};
/* -------------------------------------------------------------------------
* 枚举定义:遥测通道索引类型(交流模拟量)
* ------------------------------------------------------------------------- */
enum _YCMEA_INDEX_TYPE_
{
EN_YCMEA_ORI_START = 0, /* 遥测量起始偏移 */
EN_YCMEA_I_START = EN_YCMEA_ORI_START, /* 电流通道起始标记 */
EN_YCMEA_IA01, /* 遥测 A 相电流 01 */
EN_YCMEA_IB01, /* 遥测 B 相电流 01 */
EN_YCMEA_IC01, /* 遥测 C 相电流 01 */
EN_YCMEA_IA02, /* 遥测 A 相电流 02 */
EN_YCMEA_IB02, /* 遥测 B 相电流 02 */
EN_YCMEA_IC02, /* 遥测 C 相电流 02 */
EN_YCMEA_I_END, /* 电流模拟量通道 END不可修改*/
/* === 电压通道区域开始 === */
EN_YCMEA_U_START = EN_YCMEA_I_END-1, /* 电压通道起始标记(不可修改)*/
EN_YCMEA_UA1, /* 遥测 A 相电压 1 */
EN_YCMEA_UB1, /* 遥测 B 相电压 1 */
EN_YCMEA_UC1, /* 遥测 C 相电压 1 */
EN_YCMEA_UA2, /* 遥测 A 相电压 2 */
EN_YCMEA_UB2, /* 遥测 B 相电压 2 */
EN_YCMEA_UC2, /* 遥测 C 相电压 2 */
EN_YCMEA_UAB1, /* 线电压 AB1 */
EN_YCMEA_UBC1, /* 线电压 BC1 */
EN_YCMEA_UCA1, /* 线电压 CA1 */
EN_YCMEA_UAB2, /* 线电压 AB2 */
EN_YCMEA_UBC2, /* 线电压 BC2 */
EN_YCMEA_UCA2, /* 线电压 CA2 */
EN_YCMEA_U_END, /* 电压模拟量通道 END不可修改*/
/* === 零序通道区域开始 === */
EN_YCMEA_3I0_START = EN_YCMEA_U_END-1, /* 零序电流通道起始标记 */
EN_YCMEA_3I01, /* 零序电流 3I01 */
EN_YCMEA_3I0_END, /* 零序电流通道路 END */
EN_YCMEA_3U0_START = EN_YCMEA_3I0_END-1, /* 零序电压通道起始标记 */
EN_YCMEA_3U01, /* 零序电压 3U01 */
EN_YCMEA_3U02, /* 零序电压 3U02 */
EN_YCMEA_3U0_END, /* 零序电压通道 END */
/* === 频率测量通道区域开始 === */
EN_YCMEA_FR_START = EN_YCMEA_3U0_END-1, /* 频率通道起始标记 */
EN_YCMEA_FR1, /* 频率测量 FR1 */
EN_YCMEA_ANA_END, /* 交流模拟量通道 END不可修改*/
/* === 直流通道区域开始 === */
EN_YCMEA_DC_START = EN_YCMEA_ANA_END-1, /* 直流通道起始标记 */
EN_YCMEA_DC_01, /* 直流电压 01 */
EN_YCMEA_DC_02, /* 直流电压 02 */
EN_YCMEA_DC_END, /* 直流通道 END不可修改*/
/* === 电度通道区域开始 === */
EN_YCMEA_P_START = EN_YCMEA_DC_END-1, /* 电度通道起始标记 */
EN_YCMEA_PA_1, /* A 相有功功率 1 */
EN_YCMEA_PB_1, /* B 相有功功率 1 */
EN_YCMEA_PC_1, /* C 相有功功率 1 */
EN_YCMEA_P_1, /* 总有功功率 1 */
EN_YCMEA_Q_1, /* 总无功功率 1 */
EN_YCMEA_S_1, /* 总视在功率 1 */
EN_YCMEA_COS_1, /* 功率因数 1 */
EN_YCMEA_P_END, /* 电度通道 END不可修改*/
/* === 档位通道区域开始 === */
EN_YCMEA_DW_START = EN_YCMEA_P_END-1, /* 档位通道起始标记 */
EN_YCMEA_DW_END, /* 档位通道 END不可修改*/
EN_YCMEA_END=EN_YCMEA_DW_END /* 所有遥测通道 END */
};
/* -------------------------------------------------------------------------
* 宏定义位掩码常量BIT0-BIT31
* ------------------------------------------------------------------------- */
#define DB0 (0x01) /* BIT0 - 第 0 位掩码 */
#define DB1 (0x02) /* BIT1 - 第 1 位掩码 */
#define DB2 (0x04) /* BIT2 - 第 2 位掩码 */
#define DB3 (0x08) /* BIT3 - 第 3 位掩码(显示上送标志)*/
#define DB4 (0x10) /* BIT4 - 第 4 位掩码 */
#define DB5 (0x20) /* BIT5 - 第 5 位掩码CPU0 标志)*/
#define DB6 (0x40) /* BIT6 - 第 6 位掩码 */
#define DB7 (0x80) /* BIT7 - 第 7 位掩码 */
#define DB8 (0x100) /* BIT8 - 第 8 位掩码 */
#define DB9 (0x200) /* BIT9 - 第 9 位掩码 */
#define DB10 (0x400) /* BIT10 - 第 10 位掩码 */
#define DB11 (0x800) /* BIT11 - 第 11 位掩码 */
#define DB12 (0x1000) /* BIT12 - 第 12 位掩码 */
#define DB13 (0x2000) /* BIT13 - 第 13 位掩码 */
#define DB14 (0x4000) /* BIT14 - 第 14 位掩码 */
#define DB15 (0x8000) /* BIT15 - 第 15 位掩码 */
#define DB16 (0x10000) /* BIT16 - 第 16 位掩码 */
#define DB17 (0x20000) /* BIT17 - 第 17 位掩码 */
#define DB18 (0x40000) /* BIT18 - 第 18 位掩码 */
#define DB19 (0x80000) /* BIT19 - 第 19 位掩码 */
#define DB20 (0x100000) /* BIT20 - 第 20 位掩码 */
#define DB21 (0x200000) /* BIT21 - 第 21 位掩码 */
#define DB22 (0x400000) /* BIT22 - 第 22 位掩码 */
#define DB23 (0x800000) /* BIT23 - 第 23 位掩码 */
#define DB24 (0x1000000) /* BIT24 - 第 24 位掩码 */
#define DB25 (0x2000000) /* BIT25 - 第 25 位掩码 */
#define DB26 (0x4000000) /* BIT26 - 第 26 位掩码 */
#define DB27 (0x8000000) /* BIT27 - 第 27 位掩码 */
#define DB28 (0x10000000) /* BIT28 - 第 28 位掩码 */
#define DB29 (0x20000000) /* BIT29 - 第 29 位掩码 */
#define DB30 (0x40000000) /* BIT30 - 第 30 位掩码 */
#define DB31 (0x80000000) /* BIT31 - 第 31 位掩码 */
/* -------------------------------------------------------------------------
* 宏定义CPU 上送标识(字节高三位)
* ------------------------------------------------------------------------- */
enum _ANA_CPU_
{
EN_CPU0 = 32, /* BIT5 - CPU0 上送标志 */
EN_CPU1 = 64, /* BIT6 - CPU1 上送标志 */
EN_CPU2 = 128 /* BIT7 - CPU2 上送标志 */
};
/* -------------------------------------------------------------------------
* 宏定义:模拟量类型(用于 wChanType 字段)
* ------------------------------------------------------------------------- */
enum _ANA_TYP_
{
EN_ANA_TYP_NULL = 0, /* 未定义类型 */
EN_ANA_TYP_I, /* 交流电流 */
EN_ANA_TYP_I0, /* 零序电流 */
EN_ANA_TYP_U, /* 相电压 */
EN_ANA_TYP_Ux, /* 线电压 */
EN_ANA_TYP_U0, /* 零序电压 */
EN_ANA_TYP_U_S, /* 站用变电压 */
EN_ANA_TYP_P, /* 有功功率 */
EN_ANA_TYP_Q, /* 无功功率 */
EN_ANA_TYP_S, /* 视在功率 */
EN_ANA_TYP_COS, /* 功率因数 */
EN_ANA_TYP_DC_U, /* 直流电压 */
EN_ANA_TYP_DC_I, /* 直流电流 */
EN_ANA_TYP_GEAR, /* 档位 */
EN_ANA_TYP_FR, /* 频率 */
EN_ANA_TYP_T, /* 温度 */
EN_ANA_TYP_DU, /* 直流模拟量 */
EN_ANA_TYP_MC, /* 脉冲计数 */
EN_ANA_TYP_AMP, /* 幅值 */
EN_ANA_TYP_ST, /* 设备状态 */
EN_ANA_TYP_IMP /* 阻抗 */
};
/* -------------------------------------------------------------------------
* 宏定义:通道系数常量
* ------------------------------------------------------------------------- */
#define CN_COE_YCMEA_I1A (1) /* 电流通道系数1A -> 原始值 */
#define CN_COE_YCMEA_VOL (1) /* 电压通道系数1V -> 原始值 */
/* -------------------------------------------------------------------------
* 宏定义:条件标志常量
* ------------------------------------------------------------------------- */
#define CN_FLAG_TRUE (0x5A) /* 条件成立标志 */
#define CN_FLAG_FALSE (0xA5) /* 条件不成立标志 */
#define CN_REC_ACTION (0x55) /* 记录动作标志(保护动作)*/
#define CN_REC_RETURN (0xAA) /* 记录返回标志(动作返回)*/
#define CN_REC_RETURN_YX (0x5500+CN_REC_RETURN) /* 记录返回标志(不清除保护遥信)*/
/* -------------------------------------------------------------------------
* 结构体定义:遥测量常量信息表条目
* ------------------------------------------------------------------------- */
typedef struct
{
uint16_t wIndex; /* 模拟量虚端子号,通道唯一标识符 */
uint8_t byPinName[32]; /* 模拟量虚端子名称字符串 */
uint8_t byUnit; /* 二次模拟量单位索引(常量表偏移)*/
uint8_t byKiloUnit; /* 一次模拟量单位索引(常量表偏移)*/
uint8_t byCpu; /* 数据源 CPU 编号0-2 分别对应 DB5-DB7 */
uint16_t wChanType; /* 模拟量向量类型(电流/电压/功率等)*/
uint8_t byName[8]; /* 模拟量简写描述字符串(如"Ia1"*/
uint8_t byPhaseName[CN_PHASE_NAME_LEN]; /* 相别标识A/B/C/0*/
uint8_t byWidth; /* 数据显示总宽度(含小数点)*/
uint8_t byDotBit; /* 小数位数,用于数值格式化 */
uint16_t wCode; /* IEC 60870-5-103 规约测量值代码 */
uint32_t dwChanCoe; /* 通道系数,用于原始值转工程值计算 */
uint16_t wCapacity; /* 遥测量量程上限,用于越限判断 */
uint32_t dwXuYcDflt; /* 虚遥测默认值(无数据时显示)*/
uint16_t wSamPinNO; /* 采样通道序号(原始采样/测频通道有效)*/
uint16_t wYcAdjFlg; /* 遥测关联调节系数标志,非 0 表示应用系数 */
uint16_t wHarmFlg; /* 谐波计算标志,非 0 表示需计算谐波分量 */
uint16_t wParIndex1; /* 关联参数号 1线电压关联相量虚端子*/
uint16_t wParIndex2; /* 关联参数号 2线电压关联相量虚端子*/
uint32_t dwCommAttr; /* 通讯传输属性位图:
DB0-103 上送DB1-调试规约,
DB2-打印规约DB3-显示上送 */
uint32_t dwResePara; /* 保留参数(按位使用)*/
} tagYcIndexTab;
/* -------------------------------------------------------------------------
* 全局变量:遥测量常量索引表
* 功能:
* 存储所有遥测点的配置信息,包括通道类型、单位、量程、颜色等。
*
* 数据结构说明:
* - 交流模拟量通道(电流/电压/功率/频率)
* - 直流模拟量通道(直流电压/电流)
* - 电度量通道(有功/无功/视在功率及功率因数)
* - 档位通道(预留扩展)
*
* 颜色规范:
* - CN_RGB_YELLOW (黄): A 相及相关量
* - CN_RGB_GREEN (绿): B 相及相关量
* - CN_RGB_RED (红): C 相及相关量
* - CN_RGB_WHITE (白): 零序/直流/通用量
*
* 返回值:
* - 指向常量表的只读指针const
* ------------------------------------------------------------------------- */
const tagYcIndexTab g_tYcIndexTab[] =
{
//================================================================================
// 遥测量交流通道配置表
//================================================================================
// 字段顺序wIndex, byPinName, byUnit, byKiloUnit, byCpu, wChanType,
// byName, byPhase, byWidth, byDotBit, wCode, wChanCoe,
// wCapacity, dwXuYcDflt, wSamPinNO, wYcAdjFlg, wHarmFlg,
// wParIndex1, wParIndex2, dwCommAttr, dwResePara
{EN_YCMEA_IA01, "EN_YCMEA_IA01", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ia1", "A", 7, 3, 92, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT01_A, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // A 相测量电流 01
{EN_YCMEA_IB01, "EN_YCMEA_IB01", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ib1", "B", 7, 3, 93, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT01_B, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // B 相测量电流 01
{EN_YCMEA_IC01, "EN_YCMEA_IC01", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ic1", "C", 7, 3, 94, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT01_C, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // C 相测量电流 01
{EN_YCMEA_IA02, "EN_YCMEA_IA02", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ia2", "A", 7, 3, 95, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT02_A, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // A 相测量电流 02
{EN_YCMEA_IB02, "EN_YCMEA_IB02", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ib2", "B", 7, 3, 96, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT02_B, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // B 相测量电流 02
{EN_YCMEA_IC02, "EN_YCMEA_IC02", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ic2", "C", 7, 3, 97, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT02_C, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // C 相测量电流 02
{EN_YCMEA_UA1, "EN_YCMEA_UA1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ua1", "A", 6, 2, 98, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL1_A, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // A 相电压 1
{EN_YCMEA_UB1, "EN_YCMEA_UB1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ub1", "B", 6, 2, 99, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL1_B, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // B 相电压 1
{EN_YCMEA_UC1, "EN_YCMEA_UC1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uc1", "C", 6, 2, 100, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL1_C, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // C 相电压 1
{EN_YCMEA_UA2, "EN_YCMEA_UA2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ua2", "A", 6, 2, 101, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL2_A, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // A 相电压 2
{EN_YCMEA_UB2, "EN_YCMEA_UB2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ub2", "B", 6, 2, 102, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL2_B, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // B 相电压 2
{EN_YCMEA_UC2, "EN_YCMEA_UC2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uc2", "C", 6, 2, 103, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL2_C, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // C 相电压 2
{EN_YCMEA_UAB1, "EN_YCMEA_UAB1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uab1", "A", 6, 2, 104, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL1_A, EN_VOL1_B, 0xFFFF, 0}, // AB 相线电压 1
{EN_YCMEA_UBC1, "EN_YCMEA_UBC1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ubc1", "B", 6, 2, 105, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL1_B, EN_VOL1_C, 0xFFFF, 0}, // BC 相线电压 1
{EN_YCMEA_UCA1, "EN_YCMEA_UCA1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uca1", "C", 6, 2, 106, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL1_C, EN_VOL1_A, 0xFFFF, 0}, // CA 相线电压 1
{EN_YCMEA_UAB2, "EN_YCMEA_UAB2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uab2", "A", 6, 2, 107, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL2_A, EN_VOL2_B, 0xFFFF, 0}, // AB 相线电压 2
{EN_YCMEA_UBC2, "EN_YCMEA_UBC2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ubc2", "B", 6, 2, 108, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL2_B, EN_VOL2_C, 0xFFFF, 0}, // BC 相线电压 2
{EN_YCMEA_UCA2, "EN_YCMEA_UCA2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uca2", "C", 6, 2, 109, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL2_C, EN_VOL2_A, 0xFFFF, 0}, // CA 相线电压 2
{EN_YCMEA_3I01, "EN_YCMEA_3I01", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I0, "Io1", "0", 7, 3, 110, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT01_0, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 零序电流 3I0
{EN_YCMEA_3U01, "EN_YCMEA_3U01", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U0, "Uo1", "0", 6, 2, 111, CN_COE_YCMEA_VOL, 120, 10000, EN_VOL1_0, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 零序电压 3U0 1
{EN_YCMEA_3U02, "EN_YCMEA_3U02", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uo2", "0", 6, 2, 112, CN_COE_YCMEA_VOL, 120, 10000, EN_VOL2_0, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 零序电压 3U0 2
{EN_YCMEA_FR1, "EN_YCMEA_FR1", EN_UNIT_HZ, EN_UNIT_HZ, EN_CPU0, EN_ANA_TYP_FR, "Fr1", "0", 5, 2, 113, 1, 20, 4999, EN_VOL1_FR, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, DB0}, // 频率测量 FR
//================================================================================
// 遥测量直流通道配置表
//================================================================================
{EN_YCMEA_DC_01, "EN_YCMEA_DC_01", EN_UNIT_NULL, EN_UNIT_NULL, EN_CPU0, EN_ANA_TYP_DU, "ZL01", "0", 6, 2, 114, 1, 512, 6000, EN_UNIT01_DC, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 直流电压 01
{EN_YCMEA_DC_02, "EN_YCMEA_DC_02", EN_UNIT_NULL, EN_UNIT_NULL, EN_CPU0, EN_ANA_TYP_DU, "ZL02", "0", 6, 2, 115, 2, 512, 6000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 直流电压 02
//================================================================================
// 遥测量电度通道配置表
//================================================================================
{EN_YCMEA_PA_1, "EN_YCMEA_PA_1", EN_UNIT_W, EN_UNIT_W, EN_CPU0, EN_ANA_TYP_P, "Pa1", "A", 8, 3, 116, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 60000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // A 相有功功率 PA
{EN_YCMEA_PB_1, "EN_YCMEA_PB_1", EN_UNIT_W, EN_UNIT_W, EN_CPU0, EN_ANA_TYP_P, "Pb1", "B", 8, 3, 117, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 60000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // B 相有功功率 PB
{EN_YCMEA_PC_1, "EN_YCMEA_PC_1", EN_UNIT_W, EN_UNIT_W, EN_CPU0, EN_ANA_TYP_P, "Pc1", "C", 8, 3, 118, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 60000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // C 相有功功率 PC
{EN_YCMEA_P_1, "EN_YCMEA_P_1", EN_UNIT_W, EN_UNIT_W, EN_CPU0, EN_ANA_TYP_P, "P1", "0", 8, 3, 119, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 180000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 总有功功率 P
{EN_YCMEA_Q_1, "EN_YCMEA_Q_1", EN_UNIT_VAR, EN_UNIT_VAR, EN_CPU0, EN_ANA_TYP_Q, "Q1", "0", 8, 3, 120, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 180000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 总无功功率 Q
{EN_YCMEA_S_1, "EN_YCMEA_S_1", EN_UNIT_VA, EN_UNIT_VA, EN_CPU0, EN_ANA_TYP_S, "S1", "0", 8, 3, 121, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 180000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 总视在功率 S
{EN_YCMEA_COS_1, "EN_YCMEA_COS_1", EN_UNIT_NULL, EN_UNIT_NULL, EN_CPU0, EN_ANA_TYP_COS, "COS1", "0", 7, 3, 122, 1, 1, 1000, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0}, // 功率因数 COS
};
enum _KI_USAGE_NUMBER
{
//================================================================================
EN_KI_START, // 开入通道 START,本条不能修改
EN_KI_YX_START = EN_KI_START, // 将保护开入也计入保护遥信中,以便遥信组件处理 mod by 2012-08-14
//================================================================================
// SR1600板件开入start
EN_KI_HW1,
EN_KI_TW1,
EN_KI_CN,
EN_KIA_04,
EN_KIA_05,
EN_KI_HardYBCH,
EN_KI_HardYB,
EN_KI_HardYBJX,
EN_KI_YFJD,
EN_KIA_10,
EN_KIA_11,
EN_KIA_12,
EN_KI_FG,
EN_KI_SDFZ,
EN_KI_SDHZ,
EN_KI_HardYBJL,
EN_KIA_17,
EN_KIA_18,
EN_KIA_19,
EN_KIA_20,
EN_KIA_14,
EN_KIA_15,
EN_KIA_16,
EN_KIA_24,
EN_KI_RLY_END, // 保护开入通道 END,本条不能修改
//================================================================================
// 单点遥信(需设防抖时间)
//================================================================================
EN_KI_YX_TEMP = EN_KI_RLY_END-1, // 单点遥信开入通道 START,本条不能修改( 遥信通道已经移至EN_KI_START)
//================================================================================
// 若DTU不带保护则移出保护遥信队列dudw2013-12-18 19:07:51
// 未将开关位置枚举量修改为开入名称因为省去了保护组件、I/O表等存在大量的多余预编译
//#if(CN_DTU_RLY_ON == FALSE) //===========DTU保护投退==================
//----------------------------------------------
EN_KI_TIME_YX_END, // 单点遥信(需设防抖时间)通道 END,本条不能修改
//================================================================================
// 单点遥信(不需设防抖时间)
//================================================================================
EN_KI_NOTIME_YX_START = EN_KI_TIME_YX_END-1,// 单点遥信(不需设防抖时间)开入通道 START,本条不能修改
EN_KI_SOFTYX_DRQY,
EN_KI_SOFTYX_BHON,
EN_KI_SOFTYX_FAON,
EN_KI_SOFTYX_DYFAON,
EN_KI_SOFTYX_DLFAON,
EN_KI_SOFTYX_ZSYFAON,
EN_KI_SOFTYX_YKFZ,
EN_KI_SOFTYX_YKHZ,
EN_KI_SOFTYX_WaveStart,
EN_KI_SOFTYX_WaveEnd,
EN_KI_SOFTYX_CHZON,
EN_KI_SOFTYX_HBCK,//
EN_KI_SOFTYX_FA_JZ,///--集中型软遥信
EN_KI_SOFTYX_FA_UT,///--电压时间型投入软遥信
EN_KI_SOFTYX_BSZ_01,//闭锁总软遥信
EN_KI_SOFTYX_SGZ_01, // 线路01事故总软遥信
EN_KI_SOFTYX_FZD_TZ, // 保护出口软遥信
EN_KI_SOFTYX_Flt_A,
EN_KI_SOFTYX_Flt_B,
EN_KI_SOFTYX_Flt_C,
EN_KI_SOFTYX_L1GL_ALARM_01,
EN_KI_SOFTYX_L1GL_TRIP_01,
EN_KI_SOFTYX_DDHZ,
EN_KI_SOFTYX_SDFZ,
EN_KI_SOFTYX_L2GLIC_ALARM_01,
EN_KI_SOFTYX_L2GL_ALARM_01,
EN_KI_SOFTYX_L2GL_TRIP_01,
EN_KI_SOFTYX_L3GLIA_ALARM_01,
EN_KI_SOFTYX_L3GLIB_ALARM_01,
EN_KI_SOFTYX_L3GLIC_ALARM_01,
EN_KI_SOFTYX_L3GL_ALARM_01,
EN_KI_SOFTYX_L3GL_TRIP_01,
EN_KI_SOFTYX_KGJH, // 软遥信开关拒合
EN_KI_SOFTYX_KGJF, // 软遥信开关拒分
EN_KI_SOFTYX_AdjEnd, // 校准结束软遥信
EN_KI_SOFTYX_UYSX, // 软遥信U越下限
EN_KI_SOFTYX_UYXX, // 软遥信U越下限
EN_KI_SOFTYX_IYSX, // 软遥信I越上限
EN_KI_SOFTYX_LackFr_ALARM,//欠压告警
EN_KI_SOFTYX_LackFr_TRIP, //欠压跳闸
EN_KI_SOFTYX_OverFr_ALARM,//过压告警
EN_KI_SOFTYX_OverFr_TRIP, //过压跳闸
EN_KI_SOFTYX_OverI0_ALARM,
EN_KI_SOFTYX_OverI0_TRIP,
EN_KI_SOFTYX_GFH_ALARM_01,
EN_KI_SOFTYX_GFH_TRIP_01,
EN_KI_SOFTYX_GFH_ALARM_02,
EN_KI_SOFTYX_GFH_TRIP_02,
EN_KI_SOFTYX_GFH_ALARM_03,
EN_KI_SOFTYX_GFH_TRIP_03,
EN_KI_SOFTYX_Speed_TRIP,
EN_KI_SOFTYX_I0Speed_TRIP,
EN_KI_SOFTYX_CHZ_TRIP,
EN_KI_SOFTYX_CchHVBS, //负荷侧有压闭锁重合
EN_KI_SOFTYX_Bak05,
EN_KI_SOFTYX_Bak06,
EN_KI_SOFTYX_RCLS, // " 重合闸动作"
EN_KI_SOFTYX_CHJS, // " 断路器重合闸后加速"
EN_KI_SOFTYX_CHZChgOver, // " 重合闸充电好"
EN_KI_SOFTYX_CHZACT1, // " 一次重合闸动作"
EN_KI_SOFTYX_CHZACT2, // " 二次重合闸动作"
EN_KI_SOFTYX_CHZACT3, // " 三次重合闸动作"
EN_KI_SOFTYX_CHBS, // " 断路器二次重合闭锁"
EN_KI_SOFTYX_SPED, // " 大电流闭锁重合闸"
EN_KI_SOFTYX_FDMS,
EN_KI_SOFTYX_LLMS,
EN_KI_SOFTYX_JDXH,
EN_KI_SOFTYX_JDGZ,
EN_KI_SOFTYX_DLGZ,
EN_KI_SOFTYX_L1GLIA_TRIP_01,
EN_KI_SOFTYX_L1GLIB_TRIP_01,
EN_KI_SOFTYX_L1GLIC_TRIP_01,
EN_KI_SOFTYX_L2GLIA_TRIP_01,
EN_KI_SOFTYX_L2GLIB_TRIP_01,
EN_KI_SOFTYX_L2GLIC_TRIP_01,
EN_KI_SOFTYX_L3GLIA_TRIP_01,
EN_KI_SOFTYX_L3GLIB_TRIP_01,
EN_KI_SOFTYX_L3GLIC_TRIP_01,
EN_KI_TWIN_YX_01_0, // 双点遥信常开
EN_KI_TWIN_YX_01_1, // 双点遥信常闭
EN_KI_YX_END, // 单点遥信通道 END,本条不能修改
//================================================================================
// 双点遥信
//================================================================================
EN_KI_TWIN_YX_START = EN_KI_YX_END-1, // 双点遥信通道 START,本条不能修改
//----------------------------------------------
EN_KI_TWIN_YX_01, // 双点遥信01
EN_KI_TWIN_YX_02, // 双点遥信02
EN_KI_TWIN_YX_03, // 双点遥信03
EN_KI_TWIN_YX_04, // 双点遥信04
//------------------------------------------//
EN_KI_TWIN_YX_END, // 双点遥信通道 END,本条不能修改
//================================================================================
// 整形遥信(INT8U)
//================================================================================
EN_KI_INT8U_YX_START = EN_KI_TWIN_YX_END-1, // 整形遥信(INT8U)通道 START,本条不能修改
//----------------------------------------------
EN_KI_INT8U_SBTYS_01, // 整形遥信(INT8U)01
//------------------------------------------//
EN_KI_INT8U_YX_END, // 整形遥信(INT8U)通道 END,本条不能修改
//================================================================================
EN_KI_USER_END = EN_KI_INT8U_YX_END // 可视化定义开入量枚举 END,本条以最后一个END赋值
};
// 开入量信息常量表数据结构
typedef struct
{
uint16_t wIndex; // 开入量的偏移地址
uint8_t byPinName[32]; // 开入量虚端子名称
uint16_t wIndexDPS; // 关联的双点状态配对常闭虚端子无关联为0xAAAA
uint8_t byCpu; // 数据由哪一CPU上送
uint16_t wUnitNo; // 间隔编号,暂定BP2C区分间隔专用,其他装置无效
uint16_t wIOType; // KI:备用 KO:GOOSE跳闸经底层FPGA启动线闭锁
uint16_t wInf; // 103规约信息码
uint8_t byName[40]; // 开入量描述字符串
uint32_t dwCommAttr; // 通讯传输属性, DB0置位:103上送, DB1置位:调试规约上送, DB2置位:打印规约,DB3置位:显示上送, DB4~DB31:未定义
uint32_t dwAttrWave; // 附加数据录波属性 =0本通道不录波=其它(本通道录波)
uint16_t wGoSoft; // 关联的GOOSE软压板号,投入时GOOSE开入开出才起作用,非关联为0xAAAA
uint8_t byEnName[8]; // 英文简写标识(本通道录波时用)
}tagInputDefTab;
const tagInputDefTab g_tInputModelTab[]=
{
//================================================================================
// 可视化生成开入量
//================================================================================
//wIndex byPinName dwIndexDPS byCpu wUnitNo wKIType wInf byName dwCommAttr dwAttrWave wGoSoft byEnName
//==============================================
{EN_KI_START, "EN_KI_START", 0xAAAA, EN_CPU0, 0, 0, 2 , "开入开始", 0, 0, 0xAAAA, ""},
//==============================================
//==============================================
// 保护开入通道
//==============================================
//wIndex byPinName dwIndexDPS byCpu wUnitNo wKIType wInf byName dwCommAttr dwAttrWave wGoSoft byEnName
{EN_KI_HW1, "EN_KI_HW1", 0xAAAA, EN_CPU0, 0, 0, 149, "开关合位", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_TW1, "EN_KI_TW1", 0xAAAA, EN_CPU0, 0, 0, 150, "开关分位", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_CN, "EN_KI_CN", 0xAAAA, EN_CPU0, 0, 0, 151, "开关未储能", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_04, "EN_KIA_04", 0xAAAA, EN_CPU0, 0, 0, 152, "接地位置", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_05, "EN_KI_05", 0xAAAA, EN_CPU0, 0, 0, 153, "隔离位置", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_HardYBCH, "EN_KI_HardYBCH", 0xAAAA, EN_CPU0, 0, 0, 154, "停用重合闸", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_HardYB, "EN_KI_HardYB", 0xAAAA, EN_CPU0, 0, 0, 155, "保护投入", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_HardYBJX, "EN_KI_HardYBJX", 0xAAAA, EN_CPU0, 0, 0, 156, "检修压板", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_YFJD, "EN_KIA_05", 0xAAAA, EN_CPU0, 0, 0, 157, "远方信号", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_10, "EN_KIA_07", 0xAAAA, EN_CPU0, 0, 0, 158, "备用1", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_11, "EN_KIA_08", 0xAAAA, EN_CPU0, 0, 0, 159, "备用2", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_12, "EN_KIA_10", 0xAAAA, EN_CPU0, 0, 0, 160, "备用3", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_FG, "EN_KI_FG", 0xAAAA, EN_CPU0, 0, 0, 161, "复归", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_SDFZ, "EN_KI_SDFZ,", 0xAAAA, EN_CPU0, 0, 0, 169, "手动分闸", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_SDHZ, "EN_KI_SDHZ", 0xAAAA, EN_CPU0, 0, 0, 170, "手动合闸", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_HardYBJL, "EN_KI_HardYBJL", 0xAAAA, EN_CPU0, 0, 0, 171, "安全自动化", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_17, "EN_KIA_09", 0xAAAA, EN_CPU0, 0, 0, 165, "备用8", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_18, "EN_KIA_17", 0xAAAA, EN_CPU0, 0, 0, 166, "故障信号", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_19, "EN_KIA_18", 0xAAAA, EN_CPU0, 0, 0, 167, "备用9", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_20, "EN_KIA_19", 0xAAAA, EN_CPU0, 0, 0, 168, "备用10", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_14, "EN_KIA_12", 0xAAAA, EN_CPU0, 0, 0, 162, "气压报警", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_15, "EN_KIA_13", 0xAAAA, EN_CPU0, 0, 0, 163, "气压故障", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_16, "EN_KIA_14", 0xAAAA, EN_CPU0, 0, 0, 164, "备用11", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KIA_24, "EN_KIA_20", 0xAAAA, EN_CPU0, 0, 0, 172, "备用12", 0xFFFFFFFF, 0, 0xAAAA, ""},
{EN_KI_SOFTYX_DRQY, "EN_KI_SOFTYX_DRQY", 0xAAAA, EN_CPU0, 0, 0, 257, "控回断线告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_BHON, "EN_KI_SOFTYX_Break_A", 0xAAAA, EN_CPU0, 0, 0, 258, "保护功能投入", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_FAON, "EN_KI_SOFTYX_Break_B", 0xAAAA, EN_CPU0, 0, 0, 259, "就地型FA投入", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_DYFAON, "EN_KI_SOFTYX_Break_C", 0xAAAA, EN_CPU0, 0, 0, 260, "电压时间型FA投入", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_DLFAON, "EN_KI_SOFTYX_Break_AB", 0xAAAA, EN_CPU0, 0, 0, 261, "电压电流时间型FA投入", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_ZSYFAON, "EN_KI_SOFTYX_Break_BC", 0xAAAA, EN_CPU0, 0, 0, 262, "自适应型FA投入", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_YKFZ, "EN_KI_SOFTYX_Break_AC", 0xAAAA, EN_CPU0, 0, 0, 263, "遥控分闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_YKHZ, "EN_KI_SOFTYX_Break_ABC", 0xAAAA, EN_CPU0, 0, 0, 264, "遥控合闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CHZON, "EN_KI_SOFTYX_CHZON", 0xAAAA, EN_CPU0, 0, 0, 273, "重合闸投入", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_HBCK, "EN_KI_SOFTYX_FAON", 0xAAAA, EN_CPU0, 0, 0, 274, "开关保护出口", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_FA_JZ, "EN_KI_SOFTYX_FA_JZ", 0xAAAA, EN_CPU0, 0, 0, 275, "集中型投入", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_FA_UT, "EN_KI_SOFTYX_FA_UT", 0xAAAA, EN_CPU0, 0, 0, 276, "装置故障告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_BSZ_01, "EN_KI_SOFTYX_BSZ_01", 0xAAAA, EN_CPU0, 0, 0, 277, "闭锁总软遥信", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_SGZ_01, "EN_KI_SOFTYX_SGZ_01", 0xAAAA, EN_CPU0, 0, 0, 278, "事故总软遥信", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_FZD_TZ, "EN_KI_SOFTYX_FZD_TZ", 0xAAAA, EN_CPU0, 0, 0, 279, "非遮断停电跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX095"},
//预留保护软遥信 10个
{EN_KI_SOFTYX_Flt_A, "EN_KI_SOFTYX_Flt_A",0xAAAA, EN_CPU0, 0, 0, 280, "备用", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_Flt_B, "EN_KI_SOFTYX_Flt_B",0xAAAA, EN_CPU0, 0, 0, 281, "备用", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_Flt_C, "EN_KI_SOFTYX_Flt_C",0xAAAA, EN_CPU0, 0, 0, 282, "备用", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L1GL_ALARM_01, "EN_KI_SOFTYX_L1GL_ALARM_01", 0xAAAA, EN_CPU0, 0, 0, 283, "过流Ⅰ段告警" , DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L1GL_TRIP_01, "EN_KI_SOFTYX_L1GL_TRIP_01", 0xAAAA, EN_CPU0, 0, 0, 284, "过流Ⅰ段跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_DDHZ, "EN_KI_SOFTYX_DDHZ", 0xAAAA, EN_CPU0, 0, 0, 285, "得电合闸动作", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_SDFZ, "EN_KI_SOFTYX_SDFZ", 0xAAAA, EN_CPU0, 0, 0, 286, "失电分闸动作", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L2GLIC_ALARM_01,"EN_KI_SOFTYX_L2GLIC_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 287, "备用", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L2GL_ALARM_01, "EN_KI_SOFTYX_L2GL_ALARM_01", 0xAAAA, EN_CPU0, 0, 0, 288, "过流Ⅱ段告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L2GL_TRIP_01, "EN_KI_SOFTYX_L2GL_TRIP_01", 0xAAAA, EN_CPU0, 0, 0, 289, "过流Ⅱ段跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L3GLIA_ALARM_01,"EN_KI_SOFTYX_L3GLIA_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 290, "备用", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L3GLIB_ALARM_01,"EN_KI_SOFTYX_L3GLIB_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 291, "备用", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L3GLIC_ALARM_01,"EN_KI_SOFTYX_L3GLIC_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 292, "备用", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L3GL_ALARM_01, "EN_KI_SOFTYX_L3GL_ALARM_01", 0xAAAA, EN_CPU0, 0, 0, 293, "过流Ⅲ段告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L3GL_TRIP_01, "EN_KI_SOFTYX_L3GL_TRIP_01", 0xAAAA, EN_CPU0, 0, 0, 294, "过流Ⅲ段跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
//=============================================
{EN_KI_SOFTYX_KGJH, "EN_KI_SOFTYX_KGJH", 0xAAAA, EN_CPU0, 0, 0, 295, "开关拒合", DB0+DB1+DB2, 0, 0xAAAA, "SYX082"},
{EN_KI_SOFTYX_KGJF, "EN_KI_SOFTYX_KGJF", 0xAAAA, EN_CPU0, 0, 0, 296, "开关拒分", DB0+DB1+DB2, 0, 0xAAAA, "SYX083"},
{EN_KI_SOFTYX_AdjEnd, "EN_KI_SOFTYX_AdjEnd", 0xAAAA, EN_CPU0, 0, 0, 297, "校准结束软遥信", DB0+DB1+DB2, 0, 0xAAAA, "SYX087"},
{EN_KI_SOFTYX_UYSX, "EN_KI_SOFTYX_UYSX", 0xAAAA, EN_CPU0, 0, 0, 298, "线路电压越上限", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX081"},
{EN_KI_SOFTYX_UYXX, "EN_KI_SOFTYX_UYXX", 0xAAAA, EN_CPU0, 0, 0, 299, "线路电压越下限", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX084"},
{EN_KI_SOFTYX_IYSX, "EN_KI_SOFTYX_IYSX", 0xAAAA, EN_CPU0, 0, 0, 300, "线路负荷越上限", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX093"},
{EN_KI_SOFTYX_LackFr_ALARM,"EN_KI_SOFTYX_LackFr_ALARM", 0xAAAA, EN_CPU0, 0, 0, 314, "低频告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_LackFr_TRIP,"EN_KI_SOFTYX_LackFr_TRIP", 0xAAAA, EN_CPU0, 0, 0, 315, "低频跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_OverFr_ALARM,"EN_KI_SOFTYX_OverFr_ALARM", 0xAAAA, EN_CPU0, 0, 0, 316, "高频告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_OverFr_TRIP,"EN_KI_SOFTYX_OverFr_TRIP", 0xAAAA, EN_CPU0, 0, 0, 317, "高频跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_OverI0_ALARM, "EN_KI_SOFTYX_OverI0_ALARM", 0xAAAA, EN_CPU0, 0, 0, 318, "接地告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_OverI0_TRIP, "EN_KI_SOFTYX_OverI0_TRIP", 0xAAAA, EN_CPU0, 0, 0, 319, "接地跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_GFH_ALARM_01, "EN_KI_SOFTYX_GFH_ALARM_01", 0xAAAA, EN_CPU0, 0, 0, 320, "过负荷告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_GFH_TRIP_01, "EN_KI_SOFTYX_GFH_TRIP_01", 0xAAAA, EN_CPU0, 0, 0, 321, "过负荷跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_GFH_ALARM_02, "EN_KI_SOFTYX_GFH_ALARM_02", 0xAAAA, EN_CPU0, 0, 0, 322, "重载告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_GFH_TRIP_02, "EN_KI_SOFTYX_GFH_TRIP_02", 0xAAAA, EN_CPU0, 0, 0, 323, "重载跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_GFH_ALARM_03, "EN_KI_SOFTYX_GFH_ALARM_03", 0xAAAA, EN_CPU0, 0, 0, 324, "过载告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_GFH_TRIP_03, "EN_KI_SOFTYX_GFH_TRIP_03", 0xAAAA, EN_CPU0, 0, 0, 325, "过载跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_Speed_TRIP, "EN_KI_SOFTYX_Speed_TRIP", 0xAAAA, EN_CPU0, 0, 0, 326, "过流后加速跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_I0Speed_TRIP, "EN_KI_SOFTYX_I0Speed_TRIP", 0xAAAA, EN_CPU0, 0, 0, 327, "零序后加速跳闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CHZ_TRIP, "EN_KI_SOFTYX_CHZ_TRIP", 0xAAAA, EN_CPU0, 0, 0, 328, "重合闸出口动作", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CchHVBS, "EN_KI_SOFTYX_CchHVBS", 0xAAAA, EN_CPU0, 0, 0, 331, "负荷侧有压闭锁重合", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_Bak05, "EN_KI_SOFTYX_Bak05", 0xAAAA, EN_CPU0, 0, 0, 332, "交流失电告警", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_Bak06, "EN_KI_SOFTYX_Bak06", 0xAAAA, EN_CPU0, 0, 0, 333, "开关遥控软压板", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
// 重合闸
{EN_KI_SOFTYX_RCLS, "EN_KI_SOFTYX_RCLS", 0xAAAA, EN_CPU0, 0, 0, 334, "重合闸动作", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CHJS, "EN_KI_SOFTYX_CHJS", 0xAAAA, EN_CPU0, 0, 0, 335, "重合闸后加速动作", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CHZChgOver, "EN_KI_SOFTYX_CHZChgOver", 0xAAAA, EN_CPU0, 0, 0, 340, "重合闸充电好", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CHZACT1, "EN_KI_SOFTYX_CHZACT1", 0xAAAA, EN_CPU0, 0, 0, 341, "一次重合闸动作", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CHZACT2, "EN_KI_SOFTYX_CHZACT2", 0xAAAA, EN_CPU0, 0, 0, 342, "二次重合闸动作", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CHZACT3, "EN_KI_SOFTYX_CHZACT3", 0xAAAA, EN_CPU0, 0, 0, 343, "三次重合闸动作", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_CHBS, "EN_KI_SOFTYX_CHBS", 0xAAAA, EN_CPU0, 0, 0, 344, "重合闸闭锁", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_SPED, "EN_KI_SOFTYX_SPED", 0xAAAA, EN_CPU0, 0, 0, 345, "大电流闭锁重合闸", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_FDMS, "EN_KI_SOFTYX_FDMS", 0xAAAA, EN_CPU0, 0, 0, 346, "常规馈线分段模式", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_LLMS, "EN_KI_SOFTYX_LLMS", 0xAAAA, EN_CPU0, 0, 0, 347, "常规馈线联络模式", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_JDXH, "EN_KI_SOFTYX_JDXH", 0xAAAA, EN_CPU0, 0, 0, 348, "就地信号软遥信", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_JDGZ, "EN_KI_SOFTYX_JDGZ", 0xAAAA, EN_CPU0, 0, 0, 349, "线路接地故障", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_DLGZ, "EN_KI_SOFTYX_DLGZ", 0xAAAA, EN_CPU0, 0, 0, 350, "线路短路故障", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L1GLIA_TRIP_01,"EN_KI_SOFTYX_L1GLIA_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 351, "A相过流", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L1GLIB_TRIP_01,"EN_KI_SOFTYX_L1GLIB_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 352, "B相过流", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L1GLIC_TRIP_01,"EN_KI_SOFTYX_L1GLIC_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 353, "C相过流", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L2GLIA_TRIP_01,"EN_KI_SOFTYX_L2GLIA_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 354, "A相过流Ⅱ段", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L2GLIB_TRIP_01,"EN_KI_SOFTYX_L2GLIB_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 355, "B相过流Ⅱ段", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L2GLIC_TRIP_01,"EN_KI_SOFTYX_L2GLIC_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 356, "C相过流Ⅱ段", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L3GLIA_TRIP_01,"EN_KI_SOFTYX_L3GLIA_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 357, "A相过流Ⅲ段", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L3GLIB_TRIP_01,"EN_KI_SOFTYX_L3GLIB_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 358, "B相过流Ⅲ段", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
{EN_KI_SOFTYX_L3GLIC_TRIP_01,"EN_KI_SOFTYX_L3GLIC_ALARM_01",0xAAAA, EN_CPU0, 0, 0, 359, "C相过流Ⅲ段", DB0+DB1+DB2+DB3, 0, 0xAAAA, "SYX099"},
//============================================
//预留软遥信 5个
//=============================================
{EN_KI_TWIN_YX_01_0, "EN_KI_TWIN_YX_01_0", 0xAAAA, EN_CPU0, 0, 0, 385, "双点遥信常开 ", DB0+DB1+DB2, 0, 0xAAAA, "SYX097"},
{EN_KI_TWIN_YX_01_1, "EN_KI_TWIN_YX_01_1", 0xAAAA, EN_CPU0, 0, 0, 386, "双点遥信常闭 ", DB0+DB1+DB2, 0, 0xAAAA, "SYX098"},
////==============================================
//// 双点遥信开入通道
////==============================================
{EN_KI_TWIN_YX_01, "EN_KI_TWIN_YX_01", 0xAAAA, EN_CPU0, 0, 0, 387, "双点01", DB0+DB1+DB2+DB3, 0, 0xAAAA, "TYX01" },
{EN_KI_TWIN_YX_02, "EN_KI_TWIN_YX_02", 0xAAAA, EN_CPU0, 0, 0, 388, "双点02", DB0+DB1+DB2+DB3, 0, 0xAAAA, "TYX02" },
{EN_KI_TWIN_YX_03, "EN_KI_TWIN_YX_03", 0xAAAA, EN_CPU0, 0, 0, 389, "双点03", DB0+DB1+DB2+DB3, 0, 0xAAAA, "TYX03" },
{EN_KI_TWIN_YX_04, "EN_KI_TWIN_YX_04", 0xAAAA, EN_CPU0, 0, 0, 390, "双点04", DB0+DB1+DB2+DB3, 0, 0xAAAA, "TYX04" },
////==============================================
//// 整形遥信(INT8U)通道
////==============================================
{EN_KI_INT8U_SBTYS_01, "EN_KI_INT8U_SBTYS_01", 0xAAAA, EN_CPU0, 0, 0, 403, "设备态遥设01", 0, 0, 0xAAAA, "IYX01" },
};
#endif

View File

@@ -1,332 +1,38 @@
#include "Drv/pages/YC/model.h"
#include "../global/global_state.h"
#include <string.h>
#include "data.h"
#ifndef CN_PHASE_NAME_LEN
#define CN_PHASE_NAME_LEN (4)
#endif
/* YC 页面编译接入阶段的兼容常量(后续可替换为真实业务定义) */
#ifndef CN_RGB_YELLOW
#define CN_RGB_YELLOW (0x00FFFF00u)
#define CN_RGB_GREEN (0x0000FF00u)
#define CN_RGB_RED (0x00FF0000u)
#define CN_RGB_WHITE (0x00FFFFFFu)
#endif
enum
{
EN_UNIT01_A = 1, EN_UNIT01_B, EN_UNIT01_C,
EN_UNIT02_A, EN_UNIT02_B, EN_UNIT02_C,
EN_UNIT01_0, EN_VOL1_A, EN_VOL1_B, EN_VOL1_C,
EN_VOL2_A, EN_VOL2_B, EN_VOL2_C, EN_VOL1_0,
EN_VOL2_0, EN_VOL1_FR, EN_UNIT01_DC
};
// 定义单位类型常量
enum _UNIT_TYPE_
{
EN_UNIT_NULL=0, // 0 " "
EN_UNIT_A, // 1 "A"
EN_UNIT_V, // 2 "V"
EN_UNIT_S, // 3 "S"
EN_UNIT_HZ, // 4 "Hz"
EN_UNIT_HZPS, // 5 "Hz/s"
EN_UNIT_DGREE, // 6 "°"
EN_UNIT_OHM, // 7 "Ω"
EN_UNIT_KM, // 8 "kM"
EN_UNIT_M, // 9 "M"
EN_UNIT_VPS, // 0AH "V/S"
EN_UNIT_KV, // 0BH "kV"
EN_UNIT_W, // 0CH "W"
EN_UNIT_VAR, // 0DH "VAR"
EN_UNIT_MVA, // 0EH "MVA"
EN_UNIT_0F, // 0FH " "
EN_UNIT_PERCENT, // 10H ""
EN_UNIT_MW, // 11H "MW"
EN_UNIT_MV, // 12H "mV"
EN_UNIT_MA, // 13H "mA"
EN_UNIT_KOHM, // 14 "kΩ"
EN_UNIT_VA, // 15H "VA"
EN_UNIT_AKA, // 16H "A(kA)"
EN_UNIT_KA, // 17H "kA"
EN_UNIT_KVPS, // 18H "KV/S"
EN_UNIT_MVAR, // 19H "MVAR"
EN_UNIT_KW, // 1AH "KW"
EN_UNIT_KVAR, // 1BH "KVAR"
EN_UNIT_KVA, // 1CH "KVA"
EN_UNIT_KWH, // 1DH "kWh"
EN_UNIT_KVARH, // 1EH "kVarh"
EN_UNIT_IE, // 1AH "Ie"
EN_UNIT_1B, // 1BH "无"
EN_UNIT_1C, // 1CH "无"
EN_UNIT_1D, // 1DH "无"
EN_UNIT_1E, // 1EH "无"
EN_UNIT_1F, // 1FH "无"
EN_UNIT_20, // 20H "无"
EN_UNIT_PERUN, // 21H "Un"
};
//================================================================================
// 遥测量交流通道
//================================================================================
enum _YCMEA_INDEX_TYPE_
{
EN_YCMEA_ORI_START = 0,
EN_YCMEA_I_START = EN_YCMEA_ORI_START,
EN_YCMEA_IA01 = EN_YCMEA_I_START, // 遥测A相电流01
EN_YCMEA_IB01, // 遥测B相电流01
EN_YCMEA_IC01, // 遥测C相电流01
EN_YCMEA_IA02, // 遥测A相电流01
EN_YCMEA_IB02, // 遥测B相电流01
EN_YCMEA_IC02,
//------------------add by lc 为了功率计算能通过定值设置选择电压----------------
EN_YCMEA_I_END, // 遥测电流模拟量通道 END,本条不能修改 2
//================================================================================
// 遥测量电压通道
//================================================================================
EN_YCMEA_U_START = EN_YCMEA_I_END-1, // 遥测量电压通道 START,本条不能修改 1
//----------------------------------------------
//------------------add by lc 为了功率计算能通过定值设置选择电压----------------
// 以下部分添加格式必须是UA、UB、UC、UAB、UBC、UCA
EN_YCMEA_UA1, // 遥测A相电压1 2
EN_YCMEA_UB1, // 遥测B相电压1
EN_YCMEA_UC1, // 遥测C相电压1
EN_YCMEA_UA2, // 遥测A相电压2
EN_YCMEA_UB2, // 遥测B相电压2
EN_YCMEA_UC2, // 遥测C相电压2
EN_YCMEA_UAB1,
EN_YCMEA_UBC1,
EN_YCMEA_UCA1,
EN_YCMEA_UAB2,
EN_YCMEA_UBC2,
EN_YCMEA_UCA2,
//------------------add by lc 为了功率计算能通过定值设置选择电压----------------
EN_YCMEA_U_END, // 遥测电压模拟量通道 END,本条不能修改
//================================================================================
// 遥测量电压通道
//================================================================================
EN_YCMEA_3I0_START = EN_YCMEA_U_END-1, // 遥测量零序通道 START,本条不能修改
//----------------------------------------------
//------------------add by lc 为了功率计算能通过定值设置选择电压----------------
EN_YCMEA_3I01, // 3I01
EN_YCMEA_3I0_END,
EN_YCMEA_3U0_START = EN_YCMEA_3I0_END-1,
EN_YCMEA_3U01, // 3U01
EN_YCMEA_3U02, // 3U02
//----------------------------------------------
EN_YCMEA_3U0_END,
//================================================================================
// 频率测量通道
//================================================================================
EN_YCMEA_FR_START = EN_YCMEA_3U0_END-1,
EN_YCMEA_FR1,
//----------------------------------------------
EN_YCMEA_ANA_END, // 遥测交流模拟量通道 END,本条不能修改
//================================================================================
// 遥测量直流通道
//================================================================================
EN_YCMEA_DC_START = EN_YCMEA_ANA_END-1, // 遥测量直流通道 START,本条不能修改
//----------------------------------------------
EN_YCMEA_DC_01, // 直流01
EN_YCMEA_DC_02, // 直流02
//----------------------------------------------
EN_YCMEA_DC_END, // 遥测量直流通道 END,本条不能修改
//================================================================================
// 遥测量电度通道
//================================================================================
EN_YCMEA_P_START = EN_YCMEA_DC_END-1, // 遥测量电度通道 START,本条不能修改
//----------------------------------------------
EN_YCMEA_PA_1, // A相有功功率1
EN_YCMEA_PB_1, // B相有功功率1
EN_YCMEA_PC_1, // C相有功功率1
EN_YCMEA_P_1, // 有功功率1
EN_YCMEA_Q_1, // 无功功率1
EN_YCMEA_S_1, // 视在功率1
EN_YCMEA_COS_1, // 功率因素1
//----------------------------------------------
EN_YCMEA_P_END, // 遥测量电度通道 END,本条不能修改
//================================================================================
// 遥测量档位通道
//================================================================================
EN_YCMEA_DW_START = EN_YCMEA_P_END-1, // 遥测量档位通道 START,本条不能修改
//----------------------------------------------
//EN_YCMEA_DW_1, // 档位1
//----------------------------------------------
EN_YCMEA_DW_END, // 遥测量档位通道 END,本条不能修改
EN_YCMEA_END=EN_YCMEA_DW_END // 遥测量通道 END,本条不能修改
};
// BIT位定义
#define DB0 (0x01)
#define DB1 (0x02)
#define DB2 (0x04)
#define DB3 (0x08)
#define DB4 (0x10)
#define DB5 (0x20)
#define DB6 (0x40)
#define DB7 (0x80)
#define DB8 (0x100)
#define DB9 (0x200)
#define DB10 (0x400)
#define DB11 (0x800)
#define DB12 (0x1000)
#define DB13 (0x2000)
#define DB14 (0x4000)
#define DB15 (0x8000)
#define DB16 (0x10000)
#define DB17 (0x20000)
#define DB18 (0x40000)
#define DB19 (0x80000)
#define DB20 (0x100000)
#define DB21 (0x200000)
#define DB22 (0x400000)
#define DB23 (0x800000)
#define DB24 (0x1000000)
#define DB25 (0x2000000)
#define DB26 (0x4000000)
#define DB27 (0x8000000)
#define DB28 (0x10000000)
#define DB29 (0x20000000)
#define DB30 (0x40000000)
#define DB31 (0x80000000)
//============================================================================
//上送CPU定义
//============================================================================
enum _ANA_CPU_ { // 字节高三位分别表示
EN_CPU0 = 32, // bit5
EN_CPU1 = 64, // bit6
EN_CPU2 = 128 // bit7
};
//============================================================================
//模拟量常量表类型定义(应用于交流量常量表,及)
//============================================================================
enum _ANA_TYP_ { // 模拟量类型定义
EN_ANA_TYP_NULL = 0, // 未定义
EN_ANA_TYP_I, // 电流
EN_ANA_TYP_I0, // 电流
EN_ANA_TYP_U, // 电压
EN_ANA_TYP_Ux,
EN_ANA_TYP_U0, // 电压
EN_ANA_TYP_U_S, // 站用变电压
EN_ANA_TYP_P, // 有功功率
EN_ANA_TYP_Q, // 无功功率
EN_ANA_TYP_S, // 视在功率
EN_ANA_TYP_COS, // 功率因素
EN_ANA_TYP_DC_U, // 直流电压
EN_ANA_TYP_DC_I, // 直流电流
EN_ANA_TYP_GEAR, // 档位
EN_ANA_TYP_FR, // 频率
EN_ANA_TYP_T, // 温度
EN_ANA_TYP_DU, // 直流
EN_ANA_TYP_MC, // 脉冲
EN_ANA_TYP_AMP,
EN_ANA_TYP_ST, // 设备态
EN_ANA_TYP_IMP // 阻抗
};
#define CN_COE_YCMEA_I1A (1) // 遥测电流通道系数 1A ->
#define CN_COE_YCMEA_I1A_0
#define CN_COE_YCMEA_VOL (1) // 遥测电流通道系数 1V ->
// 条件成立常用标志
#define CN_FLAG_TRUE (0x5A) // 条件成立标志
#define CN_FLAG_FALSE (0xA5) // 条件不成立标志
#define CN_REC_ACTION (0x55) // 记录动作标志
#define CN_REC_RETURN (0xAA) // 记录返回标志
#define CN_REC_RETURN_YX (0x5500+CN_REC_RETURN) // 记录返回标志(表示不清除保护遥信)
// 遥测量常量信息表数据结构
typedef struct
{
uint16_t wIndex; // 模拟量虚端子号
uint8_t byPinName[32]; // 模拟量虚端子名称
uint8_t byUnit; // 二次模拟量单位索引号,字符串单位常量表中偏移地址
uint8_t byKiloUnit; // 一次模拟量单位索引号,字符串单位常量表中偏移地址
uint8_t byCpu; // 数据由哪一 CPU 上送
uint16_t wChanType; // 模拟量向量类型
uint8_t byName[8]; // 模拟量描述字符串
uint8_t byPhaseName[CN_PHASE_NAME_LEN]; // 模拟量相别
uint8_t byWidth; // 数据长度 (包含小数点长度)
uint8_t byDotBit; // 小数位数;
uint32_t dwRGB; // 显示颜色
uint16_t wCode; // 103 规约测量值代码
uint32_t dwChanCoe; // 通道系数
uint16_t wCapacity; // 遥测量的量程
uint32_t dwXuYcDflt; // 虚遥测的默认值
uint16_t wSamPinNO; // 遥测采样通道序号(仅原始采样通道及测频通道有效)
uint16_t wYcAdjFlg; // 遥测关联调节系数标志TRUE-带调节系数,否则 - 不带调节系数
uint16_t wHarmFlg; // 谐波计算标志TRUE-需要计算谐波,否则 - 不需要计算谐波
uint16_t wParIndex1; // 关联的遥测参数号,线电压关联相量虚端子,无关联为 0xAAAA
uint16_t wParIndex2; // 关联的遥测参数号,线电压关联相量虚端子,无关联为 0xAAAA
uint32_t dwCommAttr; // 通讯传输属性DB0 置位:103 上送DB1 置位调试规约上送DB2 置位:打印规约,DB3 置位显示上送DB4~DB31:未定义
uint32_t dwResePara; // 保留参数 (按照 bit 位使用)
}tagYcIndexTab;
const tagYcIndexTab g_tYcIndexTab[] =
{
//================================================================================
// 遥测量交流通道
//================================================================================
// wIndex byPinName byUnit byKiloUnit byCpu wChanType byName byPhase byWidth byDotBit dwRGB wCode wChanCoe wCapacity wXuYcDflt wSamPinNO wYcAdjFlg wHarmFlg wParIndex1 wParIndex2 dwCommAttr dwResePara
{EN_YCMEA_IA01, "EN_YCMEA_IA01", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ia1", "A", 7, 3, CN_RGB_YELLOW, 92, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT01_A, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // A相测量电流
{EN_YCMEA_IB01, "EN_YCMEA_IB01", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ib1", "B", 7, 3, CN_RGB_GREEN, 93, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT01_B, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // B相测量电流
{EN_YCMEA_IC01, "EN_YCMEA_IC01", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ic1", "C", 7, 3, CN_RGB_RED, 94, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT01_C, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // C相测量电流
{EN_YCMEA_IA02, "EN_YCMEA_IA02", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ia2", "A", 7, 3, CN_RGB_YELLOW, 95, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT02_A, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // A相测量电流
{EN_YCMEA_IB02, "EN_YCMEA_IB02", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ib2", "B", 7, 3, CN_RGB_GREEN, 96, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT02_B, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // B相测量电流
{EN_YCMEA_IC02, "EN_YCMEA_IC02", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I, "Ic2", "C", 7, 3, CN_RGB_RED, 97, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT02_C, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // C相测量电流
{EN_YCMEA_UA1, "EN_YCMEA_UA1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ua1", "A", 6, 2, CN_RGB_YELLOW, 98, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL1_A, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5},
{EN_YCMEA_UB1, "EN_YCMEA_UB1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ub1", "B", 6, 2, CN_RGB_GREEN, 99, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL1_B, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5},
{EN_YCMEA_UC1, "EN_YCMEA_UC1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uc1", "C", 6, 2, CN_RGB_RED, 100, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL1_C, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5},
{EN_YCMEA_UA2, "EN_YCMEA_UA2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ua2", "A", 6, 2, CN_RGB_YELLOW, 101, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL2_A, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5},
{EN_YCMEA_UB2, "EN_YCMEA_UB2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ub2", "B", 6, 2, CN_RGB_GREEN, 102, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL2_B, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5},
{EN_YCMEA_UC2, "EN_YCMEA_UC2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uc2", "C", 6, 2, CN_RGB_RED, 103, CN_COE_YCMEA_VOL, 120, 6000, EN_VOL2_C, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, DB5},
{EN_YCMEA_UAB1, "EN_YCMEA_UAB1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uab1", "A", 6, 2, CN_RGB_YELLOW, 104, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL1_A, EN_VOL1_B, 0xFFFF, 0 }, // AB相电压 1
{EN_YCMEA_UBC1, "EN_YCMEA_UBC1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ubc1", "B", 6, 2, CN_RGB_GREEN, 105, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL1_B, EN_VOL1_C, 0xFFFF, 0 }, // BC相电压 1
{EN_YCMEA_UCA1, "EN_YCMEA_UCA1", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uca1", "C", 6, 2, CN_RGB_RED, 106, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL1_C, EN_VOL1_A, 0xFFFF, 0 }, // CA相电压 1
{EN_YCMEA_UAB2, "EN_YCMEA_UAB2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uab2", "A", 6, 2, CN_RGB_YELLOW, 107, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL2_A, EN_VOL2_B, 0xFFFF, 0 }, // AB相电压 1
{EN_YCMEA_UBC2, "EN_YCMEA_UBC2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Ubc2", "B", 6, 2, CN_RGB_GREEN, 108, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL2_B, EN_VOL2_C, 0xFFFF, 0 }, // BC相电压 1
{EN_YCMEA_UCA2, "EN_YCMEA_UCA2", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uca2", "C", 6, 2, CN_RGB_RED, 109, CN_COE_YCMEA_VOL, 120, 10000, 0xAAAA, 0xAAAA, CN_FLAG_TRUE, EN_VOL2_C, EN_VOL2_A, 0xFFFF, 0 }, // CA相电压 1
{EN_YCMEA_3I01, "EN_YCMEA_3I01", EN_UNIT_A, EN_UNIT_KA, EN_CPU0, EN_ANA_TYP_I0, "Io1", "0", 7, 3, CN_RGB_WHITE, 110, CN_COE_YCMEA_I1A, 6, 1000, EN_UNIT01_0, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // 零序电流
{EN_YCMEA_3U01, "EN_YCMEA_3U01", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U0, "Uo1", "0", 6, 2, CN_RGB_WHITE, 111, CN_COE_YCMEA_VOL, 120, 10000, EN_VOL1_0, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // 零序电压
{EN_YCMEA_3U02, "EN_YCMEA_3U02", EN_UNIT_V, EN_UNIT_KV, EN_CPU0, EN_ANA_TYP_U, "Uo2", "0", 6, 2, CN_RGB_WHITE, 112, CN_COE_YCMEA_VOL, 120, 10000, EN_VOL2_0, CN_FLAG_TRUE, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // 零序电压
{EN_YCMEA_FR1, "EN_YCMEA_FR1", EN_UNIT_HZ, EN_UNIT_HZ, EN_CPU0, EN_ANA_TYP_FR, "Fr1", "0", 5, 2, CN_RGB_YELLOW, 113, 1, 20, 4999, EN_VOL1_FR, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, DB0},
//======================================================================================
// 遥测量直流通道
//======================================================================================
{EN_YCMEA_DC_01, "EN_YCMEA_DC_01", EN_UNIT_NULL, EN_UNIT_NULL, EN_CPU0, EN_ANA_TYP_DU, "ZL01", "0", 6, 2, CN_RGB_WHITE, 114, 1, 512, 6000, EN_UNIT01_DC, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // 直流量1
{EN_YCMEA_DC_02, "EN_YCMEA_DC_02", EN_UNIT_NULL, EN_UNIT_NULL, EN_CPU0, EN_ANA_TYP_DU, "ZL02", "0", 6, 2, CN_RGB_WHITE, 115, 2, 512, 6000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // 直流量2
//======================================================================================
// 遥测量电度通道
//======================================================================================
{EN_YCMEA_PA_1, "EN_YCMEA_PA_1", EN_UNIT_W, EN_UNIT_W, EN_CPU0, EN_ANA_TYP_P, "Pa1", "A", 8, 3, CN_RGB_YELLOW, 116, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 60000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // PA
{EN_YCMEA_PB_1, "EN_YCMEA_PB_1", EN_UNIT_W, EN_UNIT_W, EN_CPU0, EN_ANA_TYP_P, "Pb1", "B", 8, 3, CN_RGB_GREEN, 117, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 60000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // PB
{EN_YCMEA_PC_1, "EN_YCMEA_PC_1", EN_UNIT_W, EN_UNIT_W, EN_CPU0, EN_ANA_TYP_P, "Pc1", "C", 8, 3, CN_RGB_RED, 118, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 60000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, DB5}, // PC
{EN_YCMEA_P_1, "EN_YCMEA_P_1", EN_UNIT_W, EN_UNIT_W, EN_CPU0, EN_ANA_TYP_P, "P1", "0", 8, 3, CN_RGB_YELLOW, 119, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 180000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // P
{EN_YCMEA_Q_1, "EN_YCMEA_Q_1", EN_UNIT_VAR, EN_UNIT_VAR, EN_CPU0, EN_ANA_TYP_Q, "Q1", "0", 8, 3, CN_RGB_GREEN, 120, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 180000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // Q
{EN_YCMEA_S_1, "EN_YCMEA_S_1", EN_UNIT_VA, EN_UNIT_VA, EN_CPU0, EN_ANA_TYP_S, "S1", "0", 8, 3, CN_RGB_YELLOW, 121, CN_COE_YCMEA_VOL * CN_COE_YCMEA_I1A, 866, 180000, 0xAAAA, CN_FLAG_TRUE, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // S
{EN_YCMEA_COS_1, "EN_YCMEA_COS_1", EN_UNIT_NULL, EN_UNIT_NULL, EN_CPU0, EN_ANA_TYP_COS, "COS1", "0", 7, 3, CN_RGB_GREEN, 122, 1, 1, 1000, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xFFFF, 0 }, // COS
};
/* -------------------------------------------------------------------------
* 函数名Get_RealData_Num
* 功能:
* 统计指定类型中需要显示的数据项数量(根据 DB3 标志判断)。
*
* 参数:
* wTabType - 数据类型标识EN_MEA_AC(交流)、EN_MEA_DC(直流) 或 EN_INPUT_RLY_ALL(遥信)
*
* 边界处理:
* - 若 wTabType 无效(非上述三种类型),返回 0。
* - 遍历范围受通道索引上限限制,不会越界访问数组。
*
* 说明:
* - 遍历对应数据表,检查 dwCommAttr 的 DB3 位(显示上送标志)。
* - 对于交流类型:从 EN_YCMEA_ORI_START 到 EN_YCMEA_ANA_END
* - 对于直流类型:从 EN_YCMEA_DC_START 到 EN_YCMEA_DC_END
* - 对于遥信类型:从 EN_KI_USER_END-1 开始遍历 g_tInputModelTab 表
* - 统计 DB3 置位的条目数量作为有效显示项数
* - 该函数用于计算总页数和初始化模型时获取数据总数
*
* 返回值:
* - 需要显示的数据项数量uint16_t
* ------------------------------------------------------------------------- */
uint16_t Get_RealData_Num(uint16_t wTabType)
{
uint16_t wNum = 0;
if (wTabType == EN_MEA_AC)
{
/* 统计交流模拟量通道中 DB3=1 的条目数 */
uint16_t wLoopMax = EN_YCMEA_ANA_END;
for(uint16_t index = 0; index < wLoopMax; index++)
{
@@ -338,6 +44,7 @@ uint16_t Get_RealData_Num(uint16_t wTabType)
}
else if (wTabType == EN_MEA_DC)
{
/* 统计直流通道中 DB3=1 的条目数 */
uint16_t wLoopMax = EN_YCMEA_DC_END;
for(uint16_t index = EN_YCMEA_DC_START; index < wLoopMax; index++)
{
@@ -347,11 +54,476 @@ uint16_t Get_RealData_Num(uint16_t wTabType)
}
}
}
else if (wTabType == EN_INPUT_RLY_ALL)
{
/* 统计遥信输入中 DB3=1 的条目数 */
uint16_t wLoopMax = EN_KI_USER_END;
for(uint16_t index = 0; index < wLoopMax; index++)
{
if( (g_tInputModelTab[index].dwCommAttr & DB3) == DB3 )
{
wNum++;
}
}
}
return wNum;
}
#define CN_NUM_OF_PAGE_ANADBG ( 9 ) //每页显示的交流量/遥信量等的个数
/* -------------------------------------------------------------------------
* 函数名YC_Model_RowsOnCurrentPage
* 功能:
* 计算当前页需要显示的行数。
*
* 参数:
* model - 模型对象指针,包含总项数和当前页码信息
*
* 边界处理:
* - 若 model 为 NULL 或无数据项itemNum=0返回 0。
* - 最后一页可能不满一屏,需特殊计算。
*
* 说明:
* - 计算公式:剩余项数 = 总项数 - (当前页 -1) × 每页行数
* - 若剩余项数超过每页容量,返回 YC_ITEMS_PER_PAGE满屏
* - 否则返回实际剩余项数(最后一页不满的情况)
* - 该函数用于确定页面布局和内容绘制范围
*
* 返回值:
* - 当前页应显示的行数uint16_t不会超过 YC_ITEMS_PER_PAGE
* ------------------------------------------------------------------------- */
uint16_t YC_Model_RowsOnCurrentPage(const model_t *model)
{
uint16_t remain;
if ((model == NULL) || (model->itemNum == 0))
{
return 0;
}
/* 计算当前页剩余项数 */
remain = model->itemNum - (model->page - 1u) * YC_ITEMS_PER_PAGE;
return (remain > YC_ITEMS_PER_PAGE) ? YC_ITEMS_PER_PAGE : remain;
}
/* -------------------------------------------------------------------------
* 函数名YC_Model_TableIndexForOrdinal
* 功能:
* 根据序号ordinal查找对应的通道索引号。
*
* 参数:
* attrib - 数据类型标识EN_MEA_AC(交流)、EN_MEA_DC(直流) 或 EN_INPUT_RLY_ALL(遥信)
* ordinal - 显示序号(从 0 开始的当前页内行号,仅统计 DB3=1 的项)
*
* 边界处理:
* - 若未找到对应索引,返回 0xFFFFu。
* - 遍历范围受通道上限限制,不会越界访问数组。
*
* 说明:
* - 仅统计 dwCommAttr 的 DB3 位(显示上送标志)置位的条目。
* - 对于交流类型:从 EN_YCMEA_ORI_START 到 EN_YCMEA_ANA_END
* - 对于直流类型:从 EN_YCMEA_DC_START 到 EN_YCMEA_DC_END
* - 对于遥信类型:从 0 到 EN_KI_USER_END遍历 g_tInputModelTab
* - 按顺序计数,当计数器等于 ordinal 时返回当前索引
* - 该函数用于将页面上的行号映射到实际通道索引
*
* 返回值:
* - 对应的表索引值uint16_t未找到返回 0xFFFFu
* ------------------------------------------------------------------------- */
uint16_t YC_Model_TableIndexForOrdinal(uint16_t attrib, uint16_t ordinal)
{
uint16_t n = 0;
if (attrib == EN_MEA_AC)
{
/* 遍历交流通道,查找第 ordinal 个 DB3=1 的条目 */
for (uint16_t i = 0; i < EN_YCMEA_ANA_END; i++)
{
if ((g_tYcIndexTab[i].dwCommAttr & DB3) == DB3)
{
if (n == ordinal)
{
return i;
}
n++;
}
}
}
else if (attrib == EN_MEA_DC)
{
/* 遍历直流通道,查找第 ordinal 个 DB3=1 的条目 */
for (uint16_t i = EN_YCMEA_DC_START; i < EN_YCMEA_DC_END; i++)
{
if ((g_tYcIndexTab[i].dwCommAttr & DB3) == DB3)
{
if (n == ordinal)
{
return i;
}
n++;
}
}
}
else if (attrib == EN_INPUT_RLY_ALL)
{
/* 遍历遥信通道,查找第 ordinal 个 DB3=1 的条目 */
uint16_t i;
for (i = 0; i < EN_KI_USER_END; i++)
{
if ((g_tInputModelTab[i].dwCommAttr & DB3) == DB3)
{
if (n == ordinal)
{
return i;
}
n++;
}
}
}
return 0xFFFFu; /* 未找到有效索引 */
}
/* -------------------------------------------------------------------------
* 函数名YC_Model_OrdinalForRow
* 功能:
* 根据当前页码和行号计算全局显示序号。
*
* 参数:
* model - Model 对象指针,包含当前页码信息
* rowOnPage - 当前页内的行号(从 0 开始)
*
* 边界处理:
* - 本函数不做参数校验,调用方应保证 rowOnPage 有效。
*
* 说明:
* - 计算公式:全局序号 = (页码 -1) × 每页行数 + 行号
* - 将页面内的相对行号转换为全局显示序号(从 0 开始计数)
* - 用于在翻页时保持数据项的连续编号
*
* 返回值:
* - 对应的全局显示序号uint16_t
* ------------------------------------------------------------------------- */
uint16_t YC_Model_OrdinalForRow(const model_t *model, uint8_t rowOnPage)
{
return (model->page - 1u) * YC_ITEMS_PER_PAGE + rowOnPage;
}
/* -------------------------------------------------------------------------
* 函数名YC_Table_EntryCount静态
* 功能:
* 计算遥测量常量表的条目总数。
*
* 参数:
* 无
*
* 边界处理:
* - 使用 sizeof 计算,不会越界。
*
* 说明:
* - 通过总字节数除以单个条目大小得到条目数量
* - 该函数为静态私有函数,仅在 model.c 内部使用
* - 用于数组边界检查等场景
*
* 返回值:
* - 表条目总数uint16_t
* ------------------------------------------------------------------------- */
static uint16_t YC_Table_EntryCount(void)
{
return (uint16_t)(sizeof(g_tYcIndexTab) / sizeof(g_tYcIndexTab[0]));
}
/* -------------------------------------------------------------------------
* 函数名YC_Input_EntryCount静态
* 功能:
* 计算遥信输入通道的条目总数。
*
* 参数:
* 无
*
* 边界处理:
* - 使用 sizeof 计算,不会越界。
*
* 说明:
* - 通过总字节数除以单个条目大小得到条目数量
* - 该函数为静态私有函数,仅在 model.c 内部使用
* - 用于遥信输入相关操作的边界检查
*
* 返回值:
* - 表条目总数uint16_t
* ------------------------------------------------------------------------- */
static uint16_t YC_Input_EntryCount(void)
{
return (uint16_t)(sizeof(g_tInputModelTab) / sizeof(g_tInputModelTab[0]));
}
/* -------------------------------------------------------------------------
* 函数名YC_GetNamePtr
* 功能:
* 根据模型类型获取指定输入项的名称指针。
*
* 参数:
* model - Model 对象指针提供当前数据类型标识attrib
* inputIndex - 输入项索引号
*
* 边界处理:
* - 若为遥信类型且索引越界,返回 NULL。
* - 若为遥测类型且索引越界,返回 NULL。
* - 自动进行边界检查,不会造成数组越界访问。
*
* 说明:
* - 根据 model->attrib 判断数据类型:
* - EN_INPUT_RLY_ALL遥信输入类型从 g_tInputModelTab 获取名称
* - 其他类型(交流/直流):遥测类型,从 g_tYcIndexTab 获取名称
* - 返回指向名称字符串的指针,供视图层显示使用
* - 该函数实现了不同类型数据源的统一访问接口
*
* 返回值:
* - 名称字符串指针const uint8_t*),无效索引或类型返回 NULL
* ------------------------------------------------------------------------- */
const uint8_t *YC_GetNamePtr(const model_t *model, uint16_t inputIndex)
{
/* 遥信输入类型:从 g_tInputModelTab 获取名称 */
if (model->attrib == EN_INPUT_RLY_ALL)
{
if (inputIndex >= YC_Input_EntryCount())
{
return NULL;
}
return g_tInputModelTab[inputIndex].byName;
}
/* 遥测类型:从 g_tYcIndexTab 获取名称 */
else
{
if (inputIndex >= YC_Table_EntryCount())
{
return NULL;
}
return g_tYcIndexTab[inputIndex].byName;
}
}
/* -------------------------------------------------------------------------
* 函数名YC_Input_GetType
* 功能:
* 根据输入索引获取输入项的类型标识。
*
* 参数:
* inputIndex - 输入项索引号
*
* 边界处理:
* - 若索引超出用户定义范围(>= EN_KI_USER_END返回 YC_INPUT_TYPE_KI。
* - 通过多级条件判断确定具体类型,确保不会越界访问。
*
* 说明:
* - 输入类型判定逻辑:
* 1) >= EN_KI_USER_END用户自定义遥信默认 KI 类型)
* 2) >= EN_KI_INT8U_YX_START8 位无符号整数型遥信
* 3) >= EN_KI_TWIN_YX_START双位遥信DPYX
* 4) 其他情况:默认返回 KI 类型
* - 该函数用于确定输入项的数据格式和显示方式
* - 返回值对应 YC_INPUT_TYPE_*系列枚举定义
*
* 返回值:
* - 输入类型标识uint8_t见 YC_INPUT_TYPE_*枚举定义
* ------------------------------------------------------------------------- */
uint8_t YC_Input_GetType(uint16_t inputIndex)
{
/* 超出用户定义范围,返回默认 KI 类型 */
if (inputIndex >= EN_KI_USER_END)
{
return YC_INPUT_TYPE_KI;
}
/* 8 位无符号整数型遥信 */
if (inputIndex >= EN_KI_INT8U_YX_START)
{
return YC_INPUT_TYPE_UIN8;
}
/* 双位遥信 */
if (inputIndex >= EN_KI_TWIN_YX_START)
{
return YC_INPUT_TYPE_DPYX;
}
/* 默认返回 KI 类型 */
return YC_INPUT_TYPE_KI;
}
/* -------------------------------------------------------------------------
* 函数名YC_Input_GetState
* 功能:
* 根据 CPU 参数和输入索引获取当前输入项的状态值。
*
* 参数:
* cpuPara - CPU 参数,不同 CPU 可能对应不同的状态数据源
* inputIndex - 输入项索引号
*
* 边界处理:
* - 若索引超出用户定义范围(>= EN_KI_USER_END返回 0。
* - 通过位运算提取低 4 位作为状态值,确保返回值在有效范围内。
*
* 说明:
* - 状态计算逻辑state = (inputIndex + cpuPara) & 0x0F
* - inputIndex 与 cpuPara 相加模拟不同 CPU 的数据偏移
* - 与 0x0F 确保结果在 0-15 范围内4 位状态值)
* - 该函数用于获取输入项的实时状态,供显示或逻辑判断使用
* - 返回值被转换为 uint8_t实际有效位为低 4 位
*
* 返回值:
* - 输入项状态值uint8_t无效索引返回 0
* ------------------------------------------------------------------------- */
uint8_t YC_Input_GetState(uint16_t cpuPara, uint16_t inputIndex)
{
/* 超出范围返回默认值 */
if (inputIndex >= EN_KI_USER_END)
{
return 0u;
}
/* 计算状态值并提取低 4 位 */
return (uint8_t)((inputIndex + cpuPara) & 0x0Fu);
}
/* -------------------------------------------------------------------------
* 函数名YC_Input_FormatState
* 功能:
* 根据输入类型和状态值格式化输出状态字符串。
*
* 参数:
* inputType - 输入项类型标识YC_INPUT_TYPE_KI/SINYX/DPYX/UIN8
* state - 当前状态值
* buf - 输出缓冲区指针,存放格式化后的状态字符串
* bufSize - 输出缓冲区大小(字节)
*
* 边界处理:
* - 若 buf 为 NULL 或 bufSize 为 0返回 YC_ERR_NULL。
* - 未知类型时填充"EN_OVER"并返回 YC_ERR_RANGE。
* - 自动清空缓冲区确保字符串正确结束。
*
* 说明:
* - 状态格式化规则:
* - KI 类型:"SET"(闭合)或"ESC"(断开),根据 state&0x01 判断
* - SINYX/DPYX 类型:"0"或"1",显示单比特状态
* - UIN8 类型:两位十六进制数(如"3F"
* - 未知类型:填充"EN_OVER"并返回错误码
* - 使用 snprintf() 确保字符串安全格式化,避免缓冲区溢出
* - 该函数用于将内部状态值转换为人类可读的显示文本
*
* 返回值:
* - YC_OK成功
* - YC_ERR_NULL参数无效buf 为空或 bufSize 为 0
* - YC_ERR_RANGE未知输入类型
* ------------------------------------------------------------------------- */
YC_result_t YC_Input_FormatState(uint8_t inputType, uint8_t state, uint8_t *buf, size_t bufSize)
{
/* 参数有效性检查 */
if ((buf == NULL) || (bufSize == 0u))
{
return YC_ERR_NULL;
}
/* 清空缓冲区确保字符串正确结束 */
(void)memset(buf, 0, bufSize);
/* 根据输入类型格式化状态字符串 */
switch (inputType)
{
case YC_INPUT_TYPE_KI:
/* KI 类型SET闭合/ESC断开*/
(void)snprintf((char *)buf, bufSize, "%s", ((state & 0x01u) != 0u) ? "SET" : "ESC");
break;
case YC_INPUT_TYPE_SINYX:
case YC_INPUT_TYPE_DPYX:
/* 单/双位遥信:"0"或"1"*/
(void)snprintf((char *)buf, bufSize, "%u", (unsigned int)(state & 0x01u));
break;
case YC_INPUT_TYPE_UIN8:
/* 8 位无符号整数:两位十六进制数 */
(void)snprintf((char *)buf, bufSize, "%02X", (unsigned int)state);
break;
default:
/* 未知类型返回错误标识 */
(void)snprintf((char *)buf, bufSize, "EN_OVER");
return YC_ERR_RANGE;
}
return YC_OK;
}
/* -------------------------------------------------------------------------
* 函数名YC_Table_GetWidth
* 功能:
* 获取指定通道的数据显示宽度。
*
* 参数:
* tableIndex - 通道索引号g_tYcIndexTab 数组下标)
*
* 边界处理:
* - 若索引越界,返回 0。
* - 自动进行边界检查,不会造成数组越界访问。
*
* 说明:
* - 从 g_tYcIndexTab[tableIndex].byWidth 字段读取显示宽度
* - 该值包含小数点占用的字符位置
* - 用于视图层格式化显示时的宽度控制
*
* 返回值:
* - 数据显示宽度uint8_t无效索引返回 0
* ------------------------------------------------------------------------- */
uint8_t YC_Table_GetWidth(uint16_t tableIndex)
{
if (tableIndex >= YC_Table_EntryCount())
{
return 0;
}
return g_tYcIndexTab[tableIndex].byWidth;
}
/* -------------------------------------------------------------------------
* 函数名YC_Table_GetDotBits
* 功能:
* 获取指定通道的小数位数。
*
* 参数:
* tableIndex - 通道索引号g_tYcIndexTab 数组下标)
*
* 边界处理:
* - 若索引越界,返回 0。
* - 自动进行边界检查,不会造成数组越界访问。
*
* 说明:
* - 从 g_tYcIndexTab[tableIndex].byDotBit 字段读取小数位数
* - 用于数值格式化时确定小数点位置
* - 例如:值 12345小数位 2 → 显示"123.45"
*
* 返回值:
* - 小数位数uint8_t无效索引返回 0
* ------------------------------------------------------------------------- */
uint8_t YC_Table_GetDotBits(uint16_t tableIndex)
{
if (tableIndex >= YC_Table_EntryCount())
{
return 0;
}
return g_tYcIndexTab[tableIndex].byDotBit;
}
/* -------------------------------------------------------------------------
* 函数名Model_Init
* 功能:
* 初始化遥测页面模型对象。
*
* 参数:
* model - Model 对象指针,待初始化的结构体
*
* 边界处理:
* - 若 model 为 NULL直接返回不做任何操作。
* - 所有成员字段都会被显式初始化到安全默认值。
*
* 说明:
* - 初始化流程:
* 1) 清空整个模型结构体memset
* 2) 从全局状态获取菜单动作名称、属性标识等参数
* 3) 调用 Get_RealData_Num() 统计有效数据项总数
* 4) 根据总项数计算总页数group并设置 empty 标志
* 5) 初始化当前页码为 1光标位置为第 0 行
* - 初始化后模型对象处于就绪状态,可进行页面显示操作
* - 该函数在页面首次加载或数据刷新时调用
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
void Model_Init(model_t *model)
{
if (model == NULL)
@@ -359,9 +531,30 @@ void Model_Init(model_t *model)
return;
}
/* 清空模型结构体到零值 */
memset(model, 0, sizeof(*model));
/* 默认顶栏标题,与菜单「实时数据」条目一致 */
/* 从全局状态获取菜单相关参数 */
model->topName = GlobalModel_GetMenuActionName();
model->wGroup = (Get_RealData_Num(GlobalModel_GetMenuActionAttrib()) + CN_NUM_OF_PAGE_ANADBG - 1) / CN_NUM_OF_PAGE_ANADBG;
model->wPage = 1;
model->attrib = GlobalModel_GetMenuActionAttrib();
model->cpuPara = GlobalModel_GetMenuActionPara();
/* 统计有效数据项数量DB3=1 的条目)*/
model->itemNum = Get_RealData_Num(model->attrib);
/* 设置无数据标志 */
model->empty = (model->itemNum == 0) ? 1u : 0u;
if (model->itemNum == 0)
{
model->group = 1; /* 无数据时总页数为 1显示空页面*/
}
else
{
/* 计算总页数:向上取整 (itemNum + perPage - 1) / perPage */
model->group = (model->itemNum + YC_ITEMS_PER_PAGE - 1u) / YC_ITEMS_PER_PAGE;
}
/* 初始化页码 */
model->page = 1; /* 从第一页开始 */
}

View File

@@ -3,14 +3,55 @@
#include "types.h"
typedef struct model_t model_t;
typedef enum
{
YC_OK = 0,
YC_ERR_NULL = -1,
YC_ERR_RANGE = -2,
YC_ERR_NOT_FOUND = -3
} YC_result_t;
typedef enum
{
YC_INPUT_TYPE_KI = 0,
YC_INPUT_TYPE_SINYX = 1,
YC_INPUT_TYPE_DPYX = 2,
YC_INPUT_TYPE_UIN8 = 3
} YC_input_type_t;
/* 160×160 屏底栏约在 y=size_y-16行高≈ascii_height+row_space(14)9 行末行会与页码区重叠 */
#define YC_ITEMS_PER_PAGE (8)
typedef struct model_t model_t;
typedef struct model_t {
const uint8_t *topName;
uint16_t wGroup;
uint16_t wPage;
uint16_t itemNum;
uint16_t group;
uint16_t page;
uint16_t attrib;
uint16_t cpuPara;
uint8_t empty;
} model_t;
void Model_Init(model_t *model);
/* 当前页实际行数(末页可能不足 YC_ITEMS_PER_PAGE */
uint16_t YC_Model_RowsOnCurrentPage(const model_t *model);
/* 全局第 ordinal 个可显示通道对应的 g_tYcIndexTab 下标;失败返回 0xFFFF */
uint16_t YC_Model_TableIndexForOrdinal(uint16_t attrib, uint16_t ordinal);
/* 当前页第 row 行0 起)对应的全局序数 */
uint16_t YC_Model_OrdinalForRow(const model_t *model, uint8_t rowOnPage);
uint32_t YC_Table_GetRgb(uint16_t tableIndex);
uint8_t YC_Table_GetWidth(uint16_t tableIndex);
uint8_t YC_Table_GetDotBits(uint16_t tableIndex);
const uint8_t *YC_GetNamePtr(const model_t *model, uint16_t inputIndex);
uint8_t YC_Input_GetType(uint16_t inputIndex);
uint8_t YC_Input_GetState(uint16_t cpuPara, uint16_t inputIndex);
YC_result_t YC_Input_FormatState(uint8_t inputType, uint8_t state, uint8_t *buf, size_t bufSize);
#endif

View File

@@ -207,7 +207,7 @@ page_t *YCPage_GetInstance(void)
/* 确保在注册到 PageManager 前,页面生命周期回调已就绪 */
memset(&s_page, 0, sizeof(s_page));
s_page.page_id = PAGE_ID_YC;
s_page.is_cached = 1;
s_page.is_cached = 0;
s_page.on_create = Page_OnCreate;
s_page.on_enter = Page_OnEnter;
s_page.on_exit = Page_OnExit;

View File

@@ -1,91 +1,457 @@
#include "Drv/pages/YC/presenter.h"
#include "Drv/pages/page_manager.h"
#include "Drv/key.h"
#include <stddef.h>
#include <stdio.h>
#include <string.h>
static void Presenter_HandleInput(presenter_t *presenter, uint8_t keyVal)
{
switch (keyVal)
{
case KEY_ESC:
(void)PageManager_Pop();
break;
default: break;
}
}
/* -------------------------------------------------------------------------
* 静态变量:桩测试相位计数器
* ------------------------------------------------------------------------- */
static uint32_t s_ycStubPhase; /* 桩测试相位计数器,用于生成模拟数据的时间变化 */
/* -------------------------------------------------------------------------
* 函数名:MenuPresenter_Refresh
* 函数名Presenter_StubTick
* 功能:
* Presenter 层的对外刷新接口,根据是否为首帧渲染选择不同的刷新策略
* 本函数作为 menu_presenter_t::refresh 回调被调用,负责协调 View 层完成界面更新。
* 递增桩测试相位计数器,使模拟数据产生时间维度的动态变化
*
* 参数:
* presenter - 菜单 Presenter 实例指针,内部持有 menuCtrl 上下文和 view 接口引用
* isFirstFrame - 是否为首帧标志:
* 1 - 首帧渲染:需要完整初始化并刷新整个菜单界面
* 0 - 非首帧渲染:根据当前状态差异进行增量或局部刷新
*
* 刷新策略:
* 首帧模式 (isFirstFrame == 1):
* - 调用 View 层的 full_refresh() 接口,完整重绘整个菜单界面。
* - 此时 menuCtrl 中的导航路径、选中项等状态已完成初始化,可安全进行全量渲染。
* - MODE_NONE 表示不进行特殊模式过滤(如调试模式、特定层级过滤等)。
*
* 非首帧模式 (isFirstFrame == 0):
* - 调用 MenuPresenter_RenderByState() 进行智能状态对比刷新:
* 1) 比较 pt0Level 与 ptRoute[0],判断顶层上下文是否切换
* 2) 比较 ptCurBak 与 ptCurrent判断选中项是否变化
* 3) 根据层级关系和父节点关联选择最优渲染策略:
* - 同层同父:局部反显更新(旧选中恢复 + 新选中高亮)
* - 新层级 >= 旧层级:补绘受影响层级
* - 回退到更高层:整页刷新保证一致性
* - 此策略可避免不必要的重绘,提升界面响应性能。
*
* 调用关系:
* - 被 MenuPresenter_HandleInput() 在导航状态变化后调用isFirstFrame = 0
* - 被外部初始化完成后首次调用isFirstFrame = 1
* - 通过 presenter->refresh 函数指针绑定,符合 Presenter 的接口抽象。
*
*
* 边界处理:
* - 本函数假设 presenter 指针有效,不做空指针校验(由调用方保证)
* - view 接口的 full_refresh() 和内部渲染逻辑负责具体的绘制安全校验。
* ------------------------------------------------------------------------- */
static void Presenter_Refresh(presenter_t *presenter)
{
presenter->view->show_top_name(presenter->model->topName);
presenter->view->show_info_page(presenter->model->wPage, presenter->model->wGroup);
}
/* -------------------------------------------------------------------------
* 函数名: MenuPresenter_Init
* 功能:
* 初始化菜单 Presenter 实例,完成依赖绑定、对外接口挂接以及初始导航状态装配。
*
* 参数:
* presenter - 待初始化的 Presenter 实例
* model - 菜单 Model 实例,提供菜单树与运行时数据
* view - 菜单 View 实例,提供刷新与绘制能力
*
* 边界处理:
* - 若 `presenter`、`model` 或 `view` 任一为空,则直接返回。
* - 本函数不对计数器进行溢出检查,依赖 uint32_t 自动回绕特性
*
* 说明:
* - 这是一个桩测试辅助函数,仅在编译接入阶段使用。
* - 通过递增 s_ycStubPhase 实现模拟数据的时变效果。
* - Presenter_FormatStubValue() 使用该变量生成不同时间点的模拟值。
* - 真实数据接入后此函数将被移除或替换为真实采样逻辑。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
void Presenter_Init(presenter_t *presenter, model_t *model, view_t *view)
{
ASSERT((presenter == NULL) || (model == NULL) || (view == NULL));
if ((presenter == NULL) || (model == NULL) || (view == NULL))
{
return;
}
static void Presenter_StubTick(void)
{
s_ycStubPhase++;
}
memset(presenter, 0, sizeof(*presenter));
presenter->model = model;
presenter->view = view;
presenter->handle_input = Presenter_HandleInput;
presenter->refresh = Presenter_Refresh;
}
/* -------------------------------------------------------------------------
* 函数名Presenter_FormatStubValue
* 功能:
* 按表索引与时间相位生成可显示遥测字符串(桩函数,用于测试阶段模拟数据)。
*
* 参数:
* tableIndex - 遥测量常量表的索引,用于确定基础数值
* width - 数据显示宽度(包含小数点长度),当前未使用
* dotBits - 小数位数,控制输出字符串的小数精度
* outBuf - 输出缓冲区指针(输出),存放格式化后的字符串
* outSize - 输出缓冲区大小(字节)
*
* 边界处理:
* - 若 outBuf 为 NULL 或 outSize 为 0函数直接返回不做任何操作。
* - 若 dotBits > 6则自动截断为 6 位小数,避免输出过长。
* - width 参数在当前实现中未使用,通过 (void)width 消除编译器警告。
*
* 说明:
* - 这是一个桩函数stub用于在真实采样数据接入前提供测试支持。
* - 数值生成算法:
* 1) 基础值 = tableIndex × 137 + s_ycStubPhase × 3
* - tableIndex 来自遥测量常量表索引
* - s_ycStubPhase 为静态变量,通过 YCView_StubTick() 递增实现时间相位变化
* 2) 显示值 = (基础值 % 100000) / 1000.0
* - 取模确保数值范围在 0-99.999 之间
* - 除以 1000.0 转换为带小数的浮点数
* - 支持跨平台字符串格式化:
* - MSVC 编译器使用 sprintf_s()(安全版)
* - 其他编译器使用 snprintf()
* - 此函数后续将被真实采样数据格式化逻辑替换。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void Presenter_FormatStubValue(uint16_t tableIndex, uint8_t width, uint8_t dotBits,
uint8_t *outBuf, size_t outSize)
{
if ((outBuf == NULL) || (outSize == 0))
{
return;
}
/* 生成模拟数值:基于表索引和相位计数 */
uint32_t base = (uint32_t)tableIndex * 137u + s_ycStubPhase * 3u;
double v = (double)(base % 100000u) / 1000.0;
/* 限制小数位数不超过 6 位 */
if (dotBits > 6u)
{
dotBits = 6u;
}
#if defined(_MSC_VER)
(void)width;
(void)sprintf_s((char *)outBuf, outSize, "%.*f", dotBits, v);
#else
(void)width;
(void)snprintf((char *)outBuf, outSize, "%.*f", (int)dotBits, v);
#endif
}
static uint16_t Presenter_ClampCursorRow(uint16_t cursorRow, uint16_t rows)
{
if (rows == 0u)
{
return 0u;
}
if (cursorRow >= rows)
{
return (uint16_t)(rows - 1u);
}
return cursorRow;
}
/* -------------------------------------------------------------------------
* 函数名Presenter_BuildViewInput
* 功能:
* 从领域 Model 构建视图输入快照,供 View 层绘制使用。
*
* 设计原则:
* - Presenter 负责将 Model 数据转换为 View 可识别的格式。
* - View 不直接访问 Yc_Table_*系列函数,保持职责分离。
* - 本函数生成 yc_view_input_t 结构体,包含所有绘制所需信息。
*
* 参数:
* m - Model 对象指针,提供当前页面状态和数据源
* out - 输出指针,用于填充 yc_view_input_t 结构体
*
* 边界处理:
* - 若 m 或 out 为 NULL直接返回不做任何操作。
* - 若数据为空m->empty != 0设置 rows_on_page=0 并提前返回。
* - 遍历范围受 YC_VIEW_ROWS_MAX 限制,防止数组越界。
* - 索引查找失败时tidx==0xFFFFu标记该行无效row_valid=0
*
* 说明:
* - 构建流程:
* 1) 清空输出结构体memset
* 2) 复制基础页面信息top_name、empty、page、page_max、cursor_row
* 3) 若数据为空,设置 rows_on_page=0 并返回
* 4) 遍历当前页有效行:
* - 计算全局序号 ord = YC_Model_OrdinalForRow()
* - 查找对应表索引 tidx = YC_Model_TableIndexForOrdinal()
* - 若索引无效跳过该行row_valid=0
* - 否则标记有效row_valid=1复制名称和数值字符串
* - 数值来源:桩模式下使用 Presenter_FormatStubValue() 生成模拟数据。
* - 真实接入后,此处的数值填充将被真实采样值替换。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void Presenter_BuildViewInput(const model_t *m, uint16_t cursorRow, yc_view_input_t *out)
{
uint16_t rows;
uint16_t ord;
uint16_t tidx;
/* 参数有效性检查 */
if ((m == NULL) || (out == NULL))
{
return;
}
/* 清空输出结构体并填充基础页面信息 */
(void)memset(out, 0, sizeof(*out));
out->top_name = m->topName;
out->empty = m->empty;
out->page = m->page;
out->page_max = m->group;
rows = YC_Model_RowsOnCurrentPage(m);
out->rows_on_page = rows;
out->cursor_row = Presenter_ClampCursorRow(cursorRow, rows);
/* 数据为空时的特殊处理 */
if (m->empty != 0u)
{
out->rows_on_page = 0u;
return;
}
/* 遍历当前页有效行,构建显示数据 */
for (uint8_t row = 0u; row < (uint8_t)rows && row < YC_VIEW_ROWS_MAX; row++)
{
/* 计算全局序号并查找对应表索引 */
ord = YC_Model_OrdinalForRow(m, row);
tidx = YC_Model_TableIndexForOrdinal(m->attrib, ord);
out->row_valid[row] = 0u; /* 默认标记为无效 */
if (tidx == 0xFFFFu)
{
continue; /* 索引无效,跳过此行 */
}
out->row_valid[row] = 1u; /* 标记为有效行 */
/* 获取名称指针 */
out->row_name[row] = YC_GetNamePtr(m, tidx);
if (m->attrib == EN_INPUT_RLY_ALL)
{
uint8_t inputType;
uint8_t inputState;
inputType = YC_Input_GetType(tidx);
inputState = YC_Input_GetState(m->cpuPara, tidx);
(void)YC_Input_FormatState(inputType, inputState, out->row_value[row], YC_VIEW_VALUE_BUF_MAX);
}
else
{
Presenter_FormatStubValue(tidx, YC_Table_GetWidth(tidx), YC_Table_GetDotBits(tidx),
out->row_value[row], YC_VIEW_VALUE_BUF_MAX);
}
}
}
/* -------------------------------------------------------------------------
* 函数名Presenter_Refresh
* 功能:
* 完整刷新页面显示,重绘整个画面(包括顶栏和内容区)。
*
* 参数:
* presenter - Presenter 对象指针,包含 Model 和 View 的绑定关系
*
* 边界处理:
* - 若 presenter、presenter->view 或 presenter->model 为 NULL直接返回。
* - 不做额外的有效性校验,依赖调用方保证参数正确性。
*
* 说明:
* - 完整刷新流程:
* 1) 调用 Presenter_BuildViewInput() 从 Model 构建 View 输入快照
* 2) 通过 presenter->view->draw_full() 回调执行完整页面绘制
* - 使用 draw_full 而非 draw_values确保顶栏和内容区全部重绘。
* - 该函数在以下场景调用:
* - 用户翻页page 变更)后需要刷新显示
* - 光标移动后需要同步更新高亮效果
* - 页面首次加载时的完整绘制
* - 相比 draw_values此函数开销较大但能确保画面一致性。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void Presenter_Refresh(presenter_t *presenter)
{
yc_view_input_t input;
/* 参数有效性检查 */
if ((presenter == NULL) || (presenter->view == NULL) || (presenter->model == NULL))
{
return;
}
/* 构建 View 输入并触发完整绘制 */
Presenter_BuildViewInput(presenter->model, presenter->cursor_row, &input);
presenter->view->draw_full(presenter->view, &input);
}
/* -------------------------------------------------------------------------
* 函数名Presenter_RefreshValues
* 功能:
* 仅刷新内容区数值显示(不重绘顶栏),用于主循环中的周期性更新。
*
* 参数:
* presenter - Presenter 对象指针,包含 Model 和 View 的绑定关系
*
* 边界处理:
* - 若 presenter、presenter->view 或 presenter->model 为 NULL直接返回。
* - 若数据为空model->empty != 0跳过刷新避免无效绘制。
*
* 说明:
* - 数值刷新流程:
* 1) 检查数据有效性,空数据时不执行刷新
* 2) 调用 Presenter_StubTick() 推进桩测试相位(模拟数据更新)
* 3) 构建 View 输入快照
* 4) 通过 presenter->view->draw_values() 回调仅重绘内容区
* - 使用 draw_values 而非 draw_full避免重复绘制顶栏减少开销。
* - 该函数在以下场景调用:
* - 主循环节拍触发(周期性数值刷新)
* - 桩模式下模拟数据需要更新显示
* - 相比 Presenter_Refresh(),此函数更高效适合高频调用。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void Presenter_RefreshValues(presenter_t *presenter)
{
yc_view_input_t input;
/* 参数有效性检查 */
if ((presenter == NULL) || (presenter->view == NULL) || (presenter->model == NULL))
{
return;
}
/* 数据为空时跳过刷新 */
if (presenter->model->empty != 0u)
{
return;
}
/* 推进桩测试相位并触发内容区刷新 */
Presenter_StubTick();
Presenter_BuildViewInput(presenter->model, presenter->cursor_row, &input);
presenter->view->draw_values(presenter->view, &input);
}
/* -------------------------------------------------------------------------
* 函数名Presenter_HandleInput
* 功能:
* 处理用户键盘输入,执行相应的页面导航和控制操作。
*
* 参数:
* presenter - Presenter 对象指针,包含 Model 和 View 的绑定关系
* keyVal - 按键值KEY_ESC、KEY_U、KEY_D等
*
* 边界处理:
* - 若 presenter、presenter->model 或 presenter->view 为 NULL直接返回。
* - 数据为空时仅响应 ESC 键(退出页面),其他按键忽略。
* - 光标移动时检查边界,确保不超出有效范围。
* - 翻页操作检查页码范围,防止越界。
*
* 说明:
* - 按键处理逻辑:
* KEY_ESC: 弹出当前页面,返回上一级菜单
* KEY_U: 光标上移(若不在第一行)
* KEY_D: 光标下移(若不在最后一行)
* KEY_L: 上一页(若不在第一页)
* KEY_R: 下一页(若不在最后一页)
* KEY_F1/F2: 复归事件预留接口(后续接入通讯层)
* KEY_ENT: 确认操作预留接口(当前未实现)
* 其他按键:忽略处理
* - 光标/翻页操作后调用 Presenter_Refresh() 刷新显示。
* - 数据为空时仅允许 ESC 退出,防止无效导航。
* - 该函数作为 presenter->handle_input 回调被页面管理器调用。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void Presenter_HandleInput(presenter_t *presenter, uint8_t keyVal)
{
model_t *m;
/* 参数有效性检查 */
if ((presenter == NULL) || (presenter->model == NULL) || (presenter->view == NULL))
{
return;
}
m = presenter->model;
/* 数据为空时的特殊处理:仅响应 ESC 退出 */
if (m->empty != 0u)
{
if (keyVal == KEY_ESC)
{
(void)PageManager_Pop();
}
return;
}
/* 按键分发处理 */
switch (keyVal)
{
case KEY_ESC:
/* 退出页面,返回上一级菜单 */
(void)PageManager_Pop();
break;
case KEY_U:
/* 光标上移:若不在第一行则减小光标位置 */
if (presenter->cursor_row > 0u)
{
presenter->cursor_row--;
}
Presenter_Refresh(presenter); /* 刷新显示更新高亮 */
break;
case KEY_D:
/* 光标下移:若不在最后一行则增加光标位置 */
{
uint16_t rows = YC_Model_RowsOnCurrentPage(m);
if ((rows > 0u) && (presenter->cursor_row + 1u < rows))
{
presenter->cursor_row++;
}
Presenter_Refresh(presenter); /* 刷新显示更新高亮 */
break;
}
case KEY_L:
/* 上一页:若不在第一页则减小页码,并校正光标 */
if (m->page > 1u)
{
m->page--;
presenter->cursor_row = Presenter_ClampCursorRow(presenter->cursor_row, YC_Model_RowsOnCurrentPage(m)); /* 确保光标在有效范围 */
Presenter_Refresh(presenter); /* 刷新显示 */
}
break;
case KEY_R:
/* 下一页:若不在最后一页则增加页码,并校正光标 */
if (m->page < m->group)
{
m->page++;
presenter->cursor_row = Presenter_ClampCursorRow(presenter->cursor_row, YC_Model_RowsOnCurrentPage(m)); /* 确保光标在有效范围 */
Presenter_Refresh(presenter); /* 刷新显示 */
}
break;
case KEY_F1:
case KEY_F2:
/* 复归事件:预留接口,后续接入通讯层实现保护复归功能 */
break;
case KEY_ENT:
/* 确认操作:预留接口,当前未实现具体功能 */
break;
default:
/* 未知按键:忽略处理 */
break;
}
}
/* -------------------------------------------------------------------------
* 函数名Presenter_Init
* 功能:
* 初始化 Presenter 实例,完成依赖绑定、对外接口挂接以及初始导航状态装配。
*
* 参数:
* presenter - 待初始化的 Presenter 实例指针
* model - Model 实例指针,提供菜单数据与状态管理
* view - View 实例指针,提供绘制能力与渲染接口
*
* 边界处理:
* - 若 presenter、model 或 view 任一为 NULL直接返回不做初始化。
* - 使用 memset 将 presenter 结构体清零后再填充有效字段。
*
* 说明:
* - 初始化流程:
* 1) 参数有效性校验presenter/model/view均非空
* 2) 清空 presenter 结构体到零值
* 3) 绑定 Model 引用presenter->model = model
* 4) 绑定 View 引用presenter->view = view
* 5) 挂接输入处理回调handle_input -> Presenter_HandleInput
* 6) 挂接完整刷新回调refresh -> Presenter_Refresh
* 7) 挂接数值刷新回调refresh_values -> Presenter_RefreshValues
* - Presenter 作为 Model 与 View 之间的桥梁,负责:
* - 将 Model 数据转换为 View 可识别的格式
* - 响应键盘输入并更新 Model 状态
* - 触发 View 刷新以显示最新数据
* - 初始化后 Presenter 即可被页面管理器使用。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
void Presenter_Init(presenter_t *presenter, model_t *model, view_t *view)
{
/* 参数有效性检查 */
if ((presenter == NULL) || (model == NULL) || (view == NULL))
{
return;
}
/* 清空结构体并绑定依赖 */
memset(presenter, 0, sizeof(*presenter));
presenter->model = model;
presenter->view = view;
presenter->cursor_row = 0u;
/* 挂接回调函数接口 */
presenter->handle_input = Presenter_HandleInput;
presenter->refresh = Presenter_Refresh;
presenter->refresh_values = Presenter_RefreshValues;
}

View File

@@ -9,8 +9,10 @@ typedef struct presenter_t presenter_t;
typedef struct presenter_t {
model_t *model;
view_t *view;
uint16_t cursor_row;
void (*handle_input)(presenter_t *presenter, uint8_t keyVal);
void (*refresh)(presenter_t *presenter);
void (*refresh_values)(presenter_t *presenter);
} presenter_t;
void Presenter_Init(presenter_t *presenter, model_t *model, view_t *view);

View File

@@ -1,45 +1,365 @@
#include "Drv/pages/YC/view.h"
#include <stdio.h>
static const PageRenderPort *s_port = NULL;
/* -------------------------------------------------------------------------
* 宏定义:遥测页面布局常量
* ------------------------------------------------------------------------- */
#define YC_TOP_BAND_MAX_Y (24u) /* 顶栏最大 Y 坐标 */
#define YC_CONTENT_BASE_Y (24u) /* 内容区起始 Y 坐标 */
#define YC_NAME_X (6u) /* 名称显示 X 坐标 */
#define YC_VALUE_X (100u) /* 数值显示 X 坐标 */
#define YC_ROW_PAD_X0 (2u) /* 行内容左侧留白 */
#define YC_ROW_PAD_X1 (2u) /* 行内容右侧留白 */
#define YC_FOOTER_Y_FROM_BOTTOM (16u) /* 底栏距底部距离(与 PageRenderer_LcdShowInfoPage 一致)*/
#define YC_FOOTER_GAP_PX (2u) /* 内容区与底栏之间的留白间隙 */
/* -------------------------------------------------------------------------
* 函数名YCView_ShowInfoPage
* 功能:
* 显示当前页码和总页数信息到底栏。
*
* 参数:
* wPageNum - 当前页码(从 1 开始)
* wPageMax - 总页数
*
* 边界处理:
* - 本函数不做参数合法性校验,直接传递给渲染端口显示。
*
* 说明:
* - 该函数通过 s_port->show_info_page() 调用底层渲染接口显示页码信息。
* - 通常在内容区绘制完成后调用,用于告知用户当前浏览位置。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void YCView_ShowInfoPage(uint16_t wPageNum, uint16_t wPageMax)
{
s_port->show_info_page(wPageNum, wPageMax);
}
static void YCView_ShowTerminalInfo(void)
{
uint8_t *context[] = {
"终端类型 F30",
"终端型号 F30",
"软件版本 SV0.010",
"硬件版本 HW0.010",
"软件校验 4454",
"程序日期 2024.08.27"
};
s_port->show_str(32, 26, "馈线自动化终端");
for(uint8_t index = 0; index < 6; index++ )
{
s_port->show_str(6, 26 + (index + 1) * (s_port->get_ascii_height() + s_port->get_row_space()), context[index]);
}
s_port->show_info_page(wPageNum, wPageMax);
}
/* -------------------------------------------------------------------------
* 函数名YCView_ShowTopName
* 功能:
* 在页面顶栏居中显示顶部名称,并绘制装饰性箭头。
*
* 参数:
* name - 要显示的顶部名称字符串UTF-8 编码)
*
* 边界处理:
* - 本函数不对 name 做空指针校验,调用方需保证 name 有效。
* - 若名称过长导致居中计算偏移为负数,显示位置可能异常,由底层渲染处理。
*
* 说明:
* - 首先填充整个屏幕为背景色,实现清屏效果。
* - 通过 s_port->get_utf8_len() 和 s_port->get_ascii_width() 计算字符串显示宽度。
* - 使用居中公式 (screen_width - text_width) / 2 确定 X 坐标。
* - 在 Y=3 位置绘制名称,并在固定位置 (18, 2) 绘制箭头装饰draw_meitou
* - 顶栏高度为 0-23 像素,名称显示于第 3 行以确保视觉美观。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void YCView_ShowTopName(const uint8_t *name)
{
uint16_t wLen = s_port->get_utf8_len(name) * s_port->get_ascii_width();
uint16_t wLen = s_port->get_utf8_len(name) * s_port->get_ascii_width();
s_port->fill_rect(0, 0, s_port->get_size_x() - 1, s_port->get_size_y() - 1, s_port->get_color_back());
/* 显示顶部名称,居中显示 */
/* 显示顶部名称居中显示 */
s_port->show_str((s_port->get_size_x() - wLen) / 2, 3, name);
s_port->draw_meitou(18, 2);
}
/* -------------------------------------------------------------------------
* 函数名YCView_RowY
* 功能:
* 根据行号计算该行在屏幕上的实际 Y 坐标。
*
* 参数:
* row - 行号(从 0 开始)
*
* 边界处理:
* - 本函数不做行号范围校验,调用方应保证 row 有效。
*
* 说明:
* - 计算公式row_y = YC_CONTENT_BASE_Y + row × (字符高度 + 行间距)
* - YC_CONTENT_BASE_Y 为内容区起始 Y 坐标24 像素)。
* - 每行高度由 s_port->get_ascii_height() 和 s_port->get_row_space() 决定。
* - 该函数确保所有遥测数据显示在内容区内,从第 24 像素开始向下排列。
*
* 返回值:
* - 该行在屏幕上的 Y 坐标
* ------------------------------------------------------------------------- */
static uint16_t YCView_RowY(uint8_t row)
{
uint16_t lineH = s_port->get_ascii_height() + s_port->get_row_space();
return YC_CONTENT_BASE_Y + (uint16_t)row * lineH;
}
/* -------------------------------------------------------------------------
* 函数名YCView_DrawRowNameAndValue
* 功能:
* 在指定行绘制遥测项的名称和数值。
*
* 参数:
* name - 名称字符串指针
* value - 数值字符串指针
* row - 目标行号(从 0 开始)
* drawName - 是否显示名称的标志,非 0 表示显示0 表示不显示
*
* 边界处理:
* - 本函数不对 name/value 做空指针校验,调用方需保证字符串有效。
* - 若 drawName 为 0则跳过名称绘制仅显示数值。
*
* 说明:
* - 根据 drawName 标志决定是否在左侧区域YC_NAME_X显示名称。
* - 数值始终在右侧固定位置YC_VALUE_X显示。
* - Y 坐标通过 YCView_RowY(row) 计算,确保内容对齐到指定行。
* - 该函数是遥测数据显示的核心绘制单元,被 YCView_PaintContent() 调用。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void YCView_DrawRowNameAndValue(const uint8_t *name, const uint8_t *value, uint8_t row, uint8_t drawName)
{
if (drawName != 0u)
{
s_port->show_str(YC_NAME_X, YCView_RowY(row), name);
}
s_port->show_str(YC_VALUE_X, YCView_RowY(row), value);
}
/* -------------------------------------------------------------------------
* 函数名YCView_ClearContentArea
* 功能:
* 清空内容区域(不含顶栏和底栏),填充背景色并准备重绘。
*
* 参数:
* 无
*
* 边界处理:
* - 若内容区上边界 y0 大于等于下边界 y1或屏幕宽度为 0不执行填充操作。
* - 自动将下边界限制在屏幕有效范围内sy-1
*
* 说明:
* - 内容区范围:从 YC_CONTENT_BASE_Y-2 到 YC_FOOTER_Y_FROM_BOTTOM
* - 上边界预留 2 像素用于视觉缓冲,避免与顶栏过于接近。
* - 下边界通过 YC_FOOTER_Y_FROM_BOTTOM 计算,确保不覆盖底栏页码信息。
* - 清空后内容区处于待绘制状态,由调用方继续执行数据项绘制。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void YCView_ClearContentArea(void)
{
uint16_t sx = s_port->get_size_x();
uint16_t sy = s_port->get_size_y();
uint16_t y0 = YC_CONTENT_BASE_Y - 2u;
uint16_t y1 = sy - YC_FOOTER_Y_FROM_BOTTOM;
if ((y1 > y0) && (sx > 0u))
{
s_port->fill_rect(0, y0, sx - 1u, y1, s_port->get_color_back());
}
}
/* -------------------------------------------------------------------------
* 函数名YCView_ApplyCursorInvert
* 功能:
* 对当前光标所在行进行反显高亮处理。
*
* 参数:
* input - 视图输入结构体,包含页码、光标位置等信息
*
* 边界处理:
* - 若数据为空input->empty != 0或没有可显示的行数直接返回。
* - 若计算的反显区域越界,自动调整至有效范围内。
* - 若反显上边界大于等于下边界,不执行反显操作。
*
* 说明:
* - 光标行 Y 坐标通过 YCView_RowY(input->cursor_row) 计算。
* - 反显区域高度为单行高度lineH-1确保覆盖整个字符区域。
* - X 方向留白:左侧 YC_ROW_PAD_X0右侧 sx-1-YC_ROW_PAD_X1避免触及屏幕边缘。
* - 下边界受 YC_FOOTER_Y_FROM_BOTTOM 限制,防止覆盖底栏页码。
* - 该函数在绘制页码前调用,避免因页码绘制导致光标高亮消失。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void YCView_ApplyCursorInvert(const yc_view_input_t *input)
{
uint16_t sx = s_port->get_size_x();
uint16_t rows = input->rows_on_page;
uint16_t lineH = s_port->get_ascii_height() + s_port->get_row_space();
uint16_t y0;
uint16_t y1;
uint16_t yMax;
if ((input->empty != 0u) || (rows == 0u))
{
return;
}
y0 = YCView_RowY((uint8_t)input->cursor_row);
y1 = y0 + lineH - 1u;
yMax = s_port->get_size_y() - YC_FOOTER_Y_FROM_BOTTOM;
if (y1 > yMax)
{
y1 = yMax;
}
if (y1 < y0)
{
return;
}
s_port->invert(YC_ROW_PAD_X0, y0, sx - 1u - YC_ROW_PAD_X1, y1);
}
/* -------------------------------------------------------------------------
* 函数名YCView_PaintContent
* 功能:
* 绘制内容区,包括清空背景、显示遥测数据项、光标高亮和页码信息。
*
* 参数:
* input - 视图输入结构体,包含页面索引、行数据等信息
*
* 边界处理:
* - 若数据为空input->empty != 0显示"无遥测数据"提示并返回。
* - 跳过无效行input->row_valid[row] == 0
* - 循环次数受 input->rows_on_page 和 YC_VIEW_ROWS_MAX 双重限制。
*
* 说明:
* - 绘制流程:
* 1) 调用 YCView_ClearContentArea() 清空内容区背景
* 2) 若数据为空,显示提示信息并返回
* 3) 遍历有效行,逐行调用 YCView_DrawRowNameAndValue() 绘制名称和数值
* 4) 先反显光标行YCView_ApplyCursorInvert再绘制页码
* - 顺序重要:避免页码绘制覆盖光标高亮效果
* 5) 最后显示页码信息YCView_ShowInfoPage
* - 该函数是遥测页面内容绘制的核心入口,被 YCView_DrawFull() 和 YCView_DrawValues() 调用。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void YCView_PaintContent(const yc_view_input_t *input)
{
uint8_t row;
uint16_t rows;
YCView_ClearContentArea();
if (input->empty != 0u)
{
s_port->show_str(6u, YC_CONTENT_BASE_Y + 20u, (const uint8_t *)"无遥测数据");
return;
}
rows = input->rows_on_page;
for (row = 0; row < (uint8_t)rows && row < YC_VIEW_ROWS_MAX; row++)
{
if (input->row_valid[row] == 0u)
{
continue;
}
YCView_DrawRowNameAndValue(input->row_name[row], input->row_value[row], row, 1u);
}
/* 先反显光标,再绘页码,避免 invert 覆盖底栏「第 x 页」造成花屏 */
YCView_ApplyCursorInvert(input);
YCView_ShowInfoPage(input->page, input->page_max);
}
/* -------------------------------------------------------------------------
* 函数名YCView_DrawFull
* 功能:
* 完整绘制遥测页面,包括顶栏和内容区。
*
* 参数:
* view - 视图对象指针(当前未使用)
* input - 视图输入结构体,包含顶部名称和行数据等信息
*
* 边界处理:
* - 若 input 或 s_port 为 NULL直接返回。
* - 通过 (void)view 消除未使用参数警告。
*
* 说明:
* - 完整绘制流程先显示顶栏名称YCView_ShowTopName再绘制内容区YCView_PaintContent
* - 整屏擦除操作在 MenuPage_OnExit() 统一完成,此处无需重复清屏。
* - 该函数用于首次加载页面或需要完整重绘的场景。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void YCView_DrawFull(view_t *view, const yc_view_input_t *input)
{
(void)view;
if ((input == NULL) || (s_port == NULL))
{
return;
}
/* 整屏擦除在 MenuPage_OnExit 统一完成,此处直接绘制顶栏与内容 */
YCView_ShowTopName(input->top_name);
YCView_PaintContent(input);
}
/* -------------------------------------------------------------------------
* 函数名YCView_DrawValues
* 功能:
* 仅重绘内容区数值(不重绘顶栏),用于主循环中的数值刷新。
*
* 参数:
* view - 视图对象指针(当前未使用)
* input - 视图输入结构体,包含页面和行数据信息
*
* 边界处理:
* - 若 input 或 s_port 为 NULL直接返回。
* - 通过 (void)view 消除未使用参数警告。
*
* 说明:
* - 该函数是主循环节拍的核心调用点,用于周期性刷新遥测数值显示。
* - 仅重绘内容区YCView_PaintContent顶栏保持不变以减少绘制开销。
* - 在桩模式下,此函数会触发 YCView_FormatStubValue() 生成模拟数据并更新显示。
* - 相比 YCView_DrawFull(),此函数更高效,适合高频刷新场景。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
static void YCView_DrawValues(view_t *view, const yc_view_input_t *input)
{
(void)view;
if ((input == NULL) || (s_port == NULL))
{
return;
}
/* 主循环节拍:重绘内容区以更新桩数值(不重画面顶栏) */
YCView_PaintContent(input);
}
/* -------------------------------------------------------------------------
* 函数名View_Init
* 功能:
* 初始化遥测页面视图,绑定渲染端口和回调函数。
*
* 参数:
* view - 视图对象指针,待初始化的视图结构体
*
* 边界处理:
* - 本函数不对 view 做空指针校验,调用方需保证 view 有效。
*
* 说明:
* - 初始化流程:
* 1) 获取 LCD 渲染端口s_port = PageRenderer_Lcd()
* 2) 设置 show_top_name 为 NULL表示不使用自定义顶栏显示函数
* 3) 绑定 show_info_page 回调到 YCView_ShowInfoPage
* 4) 绑定 draw_full 回调到 YCView_DrawFull完整绘制入口
* 5) 绑定 draw_values 回调到 YCView_DrawValues数值刷新入口
* - 初始化后,视图对象即可被页面管理器使用。
*
* 返回值:
* - 无
* ------------------------------------------------------------------------- */
void View_Init(view_t *view)
{
s_port = PageRenderer_Lcd();
view->show_top_name = YCView_ShowTopName;
view->show_top_name = NULL;
view->show_info_page = YCView_ShowInfoPage;
}
view->draw_full = YCView_DrawFull;
view->draw_values = YCView_DrawValues;
}

View File

@@ -4,9 +4,37 @@
#include "types.h"
#include "Drv/pages/global/renderer_lcd.h"
/* 与 model.h 中 YC_ITEMS_PER_PAGE 保持一致 */
#define YC_VIEW_ROWS_MAX (8U)
#define YC_VIEW_NAME_BUF_MAX (16U)
#define YC_VIEW_VALUE_BUF_MAX (28U)
/**
* 遥测页绘制用展示快照:由 Presenter 从 model/表 填充文本View 只负责布局与绘制,
* 不调用 Yc_Table_* 或 model 层。
*/
typedef struct yc_view_input_t
{
const uint8_t *top_name;
uint8_t empty;
uint16_t page;
uint16_t page_max;
uint16_t cursor_row;
uint16_t rows_on_page;
/** 为 1 表示该行有有效遥测项,需绘制 row_name/row_value */
uint8_t row_valid[YC_VIEW_ROWS_MAX];
const uint8_t *row_name[YC_VIEW_ROWS_MAX];
uint8_t row_value[YC_VIEW_ROWS_MAX][YC_VIEW_VALUE_BUF_MAX];
} yc_view_input_t;
typedef struct view_t view_t;
typedef struct view_t {
void (*show_top_name)(const uint8_t *name);
void (*show_info_page)(uint16_t wPageNum, uint16_t wPageMax);
void (*draw_full)(view_t *view, const yc_view_input_t *input);
void (*draw_values)(view_t *view, const yc_view_input_t *input);
} view_t;
void View_Init(view_t *view);

View File

@@ -310,7 +310,7 @@ const uint8_t *GlobalModel_GetMenuActionTip(void)
*
* 说明:
* - 该函数用于查询全局模型中的 activeAttrib 字段。
* - 返回值是与当前菜单相关的额外参数数据,具体含义取决于菜单类型。
* - 返回值是与当前菜单相关的动作属性,具体含义取决于动作类型。
*
* 返回值:
* - 当前菜单的动作属性

View File

@@ -1,6 +1,8 @@
#ifndef MENU_def_H
#define MENU_def_H
#include "display.h"
/* layout constants are unified into menu_view */
#define MENU_SIZE_Y (160)
#define MENU_SIZE_X (160)

View File

@@ -1,69 +0,0 @@
#ifndef MENU_MODEL_H
#define MENU_MODEL_H
#include "display.h"
typedef struct tagMenuModel
{
uint8_t byClass;
uint8_t byName[50];
uint8_t byTip[50];
uint8_t byAttrib;
uint16_t wPassword;
uint16_t wPara;
FUNCPTR pfnWinProc;
} tagMenuModel;
typedef struct MenuItem MenuItem;
typedef MenuItem *tagPMenuItem;
typedef MenuItem tagMenuItem;
typedef struct
{
MenuItem *higher;
MenuItem *lower;
MenuItem *before;
MenuItem *behind;
} MenuLinks;
typedef struct
{
uint16_t wPos;
uint16_t wNum;
uint16_t wSPosX;
uint16_t wSPosY;
uint16_t wEPosX;
uint16_t wEPosY;
} MenuRect;
struct MenuItem
{
MenuLinks links;
tagMenuModel menuDef;
MenuRect rect;
};
typedef struct
{
uint8_t by0LevelNum;
tagPMenuItem ptHead;
tagPMenuItem ptCurrent;
tagPMenuItem ptRoute[4];
tagPMenuItem ptCurBak;
tagPMenuItem pt0Level;
} tagMenuCtrl;
typedef struct menu_model_t menu_model_t;
struct menu_model_t
{
uint16_t maxItem;
tagMenuItem menuItems[300];
uint16_t by0LevelNum;
};
void MenuModel_Init(menu_model_t *model);
#endif

View File

@@ -512,7 +512,7 @@ const tagMenuModel menuTab[] =
{ 1, "实时数据", "装置实时数据", 0, 0x0000, 0, (FUNCPTR)Menu_NonPfunc },
{ 2, "交流量", "查看遥测交流量", EN_MEA_AC, 0x0000, EN_ANA_0, (FUNCPTR)MenuProc_See_YC },
{ 2, "直流量", "查看遥测直流量", EN_MEA_DC, 0x0000, EN_ANA_0, (FUNCPTR)MenuProc_See_YC },
{ 2, "遥信量", "查看遥信开入量", EN_INPUT_RLY_ALL, 0x0000, EN_INPUT_0, (FUNCPTR)MenuProc_See_Input },
{ 2, "遥信量", "查看遥信开入量", EN_INPUT_RLY_ALL, 0x0000, EN_INPUT_0, (FUNCPTR)MenuProc_See_YC },
{ 1, "参数定值", "保护参数查看与修改", 0, 0x0000, 0, (FUNCPTR)Menu_NonPfunc },
{ 2, "整定", "整定装置保护参数", 0, 0x0000, 0, (FUNCPTR)Menu_NonPfunc },
{ 3, "参数", "查看设备参数定值", EN_FIGURE_SET, CN_USER_PWD, EN_SIDE_BASIC, (FUNCPTR)MenuProc_Set_Value },

View File

@@ -5,6 +5,7 @@
#include "display.h"
#include "presenter.h"
#include "Drv/pages/global/renderer_lcd.h"
/* -------------------------------------------------------------------------
@@ -22,6 +23,7 @@ static menu_model_t s_model;
static menu_view_t s_view;
static menu_presenter_t s_presenter;
static page_t s_menuPage;
static const PageRenderPort *s_port = NULL;
/* -------------------------------------------------------------------------
* 函数名: MenuPage_OnExit
@@ -35,7 +37,7 @@ static page_t s_menuPage;
* - 使用 (void)page 防止未使用参数告警。
*
* 说明:
* - 预留给后续扩展(如停止定时任务、冻结动画、保存瞬时 UI 状态等)
* - 离开菜单时整屏擦除,避免 MenuView 边框线残留在显存,进入其它页前画面干净
*
* 返回值:
* - 无
@@ -43,6 +45,10 @@ static page_t s_menuPage;
static void MenuPage_OnExit(page_t *page)
{
(void)page;
if (s_port != NULL)
{
s_port->clear_screen();
}
}
/* -------------------------------------------------------------------------
@@ -172,6 +178,7 @@ static void MenuPage_OnCreate(page_t *page)
s_menuPage.presenter = &s_presenter;
s_menuPage.view = &s_view;
s_menuPage.model = &s_model;
s_port = PageRenderer_Lcd();
}
/* -------------------------------------------------------------------------