新增加了 交流量 直流量 遥信量的查看 YC页面的基础编写
This commit is contained in:
@@ -68,9 +68,14 @@ cmake --build build
|
|||||||
### 运行测试
|
### 运行测试
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
|
# 1. 配置项目(生成构建文件)
|
||||||
cmake -S . -B build
|
cmake -S . -B build
|
||||||
|
# 2. 编译项目
|
||||||
cmake --build build
|
cmake --build build
|
||||||
|
# 3. 测试
|
||||||
ctest --test-dir build -C Debug --output-on-failure
|
ctest --test-dir build -C Debug --output-on-failure
|
||||||
|
# 4. 运行编译结果
|
||||||
|
./\build\Debug\DTU-HMI.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
补充说明:
|
补充说明:
|
||||||
|
|||||||
15001
src/Drv/lcd/ascii.c
15001
src/Drv/lcd/ascii.c
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,7 @@ extern uint8_t g_abyASCII126[][12];
|
|||||||
extern uint8_t g_abyASCII168[][16];
|
extern uint8_t g_abyASCII168[][16];
|
||||||
|
|
||||||
#define UTF8_HZ12_BYTES_PER_CHAR 24
|
#define UTF8_HZ12_BYTES_PER_CHAR 24
|
||||||
#define UTF8_HZ12_NUM_CHARS 7038
|
#define UTF8_HZ12_NUM_CHARS 7079
|
||||||
|
|
||||||
/* 按 Unicode 码点查找点阵,返回 24 字节指针,未找到返回 NULL */
|
/* 按 Unicode 码点查找点阵,返回 24 字节指针,未找到返回 NULL */
|
||||||
const uint8_t* utf8_hz12_get(uint32_t unicode);
|
const uint8_t* utf8_hz12_get(uint32_t unicode);
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ page_t *AppInfoPage_GetInstance(void)
|
|||||||
/* 确保在注册到 PageManager 前,页面生命周期回调已就绪 */
|
/* 确保在注册到 PageManager 前,页面生命周期回调已就绪 */
|
||||||
memset(&s_page, 0, sizeof(s_page));
|
memset(&s_page, 0, sizeof(s_page));
|
||||||
s_page.page_id = PAGE_ID_APP_INFO;
|
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_create = Page_OnCreate;
|
||||||
s_page.on_enter = Page_OnEnter;
|
s_page.on_enter = Page_OnEnter;
|
||||||
s_page.on_exit = Page_OnExit;
|
s_page.on_exit = Page_OnExit;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ void AppInfoView_ShowTerminalInfo(void)
|
|||||||
s_port->show_str(32, 26, "馈线自动化终端");
|
s_port->show_str(32, 26, "馈线自动化终端");
|
||||||
for(uint8_t index = 0; index < 6; index++ )
|
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
663
src/Drv/pages/YC/data.h
Normal 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
|
||||||
@@ -1,332 +1,38 @@
|
|||||||
#include "Drv/pages/YC/model.h"
|
#include "Drv/pages/YC/model.h"
|
||||||
#include "../global/global_state.h"
|
#include "../global/global_state.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "data.h"
|
||||||
|
|
||||||
#ifndef CN_PHASE_NAME_LEN
|
/* -------------------------------------------------------------------------
|
||||||
#define CN_PHASE_NAME_LEN (4)
|
* 函数名:Get_RealData_Num
|
||||||
#endif
|
* 功能:
|
||||||
|
* 统计指定类型中需要显示的数据项数量(根据 DB3 标志判断)。
|
||||||
/* YC 页面编译接入阶段的兼容常量(后续可替换为真实业务定义) */
|
*
|
||||||
#ifndef CN_RGB_YELLOW
|
* 参数:
|
||||||
#define CN_RGB_YELLOW (0x00FFFF00u)
|
* wTabType - 数据类型标识:EN_MEA_AC(交流)、EN_MEA_DC(直流) 或 EN_INPUT_RLY_ALL(遥信)
|
||||||
#define CN_RGB_GREEN (0x0000FF00u)
|
*
|
||||||
#define CN_RGB_RED (0x00FF0000u)
|
* 边界处理:
|
||||||
#define CN_RGB_WHITE (0x00FFFFFFu)
|
* - 若 wTabType 无效(非上述三种类型),返回 0。
|
||||||
#endif
|
* - 遍历范围受通道索引上限限制,不会越界访问数组。
|
||||||
|
*
|
||||||
enum
|
* 说明:
|
||||||
{
|
* - 遍历对应数据表,检查 dwCommAttr 的 DB3 位(显示上送标志)。
|
||||||
EN_UNIT01_A = 1, EN_UNIT01_B, EN_UNIT01_C,
|
* - 对于交流类型:从 EN_YCMEA_ORI_START 到 EN_YCMEA_ANA_END
|
||||||
EN_UNIT02_A, EN_UNIT02_B, EN_UNIT02_C,
|
* - 对于直流类型:从 EN_YCMEA_DC_START 到 EN_YCMEA_DC_END
|
||||||
EN_UNIT01_0, EN_VOL1_A, EN_VOL1_B, EN_VOL1_C,
|
* - 对于遥信类型:从 EN_KI_USER_END-1 开始遍历 g_tInputModelTab 表
|
||||||
EN_VOL2_A, EN_VOL2_B, EN_VOL2_C, EN_VOL1_0,
|
* - 统计 DB3 置位的条目数量作为有效显示项数
|
||||||
EN_VOL2_0, EN_VOL1_FR, EN_UNIT01_DC
|
* - 该函数用于计算总页数和初始化模型时获取数据总数
|
||||||
};
|
*
|
||||||
|
* 返回值:
|
||||||
// 定义单位类型常量
|
* - 需要显示的数据项数量(uint16_t)
|
||||||
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
|
|
||||||
};
|
|
||||||
|
|
||||||
uint16_t Get_RealData_Num(uint16_t wTabType)
|
uint16_t Get_RealData_Num(uint16_t wTabType)
|
||||||
{
|
{
|
||||||
uint16_t wNum = 0;
|
uint16_t wNum = 0;
|
||||||
|
|
||||||
if (wTabType == EN_MEA_AC)
|
if (wTabType == EN_MEA_AC)
|
||||||
{
|
{
|
||||||
|
/* 统计交流模拟量通道中 DB3=1 的条目数 */
|
||||||
uint16_t wLoopMax = EN_YCMEA_ANA_END;
|
uint16_t wLoopMax = EN_YCMEA_ANA_END;
|
||||||
for(uint16_t index = 0; index < wLoopMax; index++)
|
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)
|
else if (wTabType == EN_MEA_DC)
|
||||||
{
|
{
|
||||||
|
/* 统计直流通道中 DB3=1 的条目数 */
|
||||||
uint16_t wLoopMax = EN_YCMEA_DC_END;
|
uint16_t wLoopMax = EN_YCMEA_DC_END;
|
||||||
for(uint16_t index = EN_YCMEA_DC_START; index < wLoopMax; index++)
|
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;
|
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_START:8 位无符号整数型遥信
|
||||||
|
* 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)
|
void Model_Init(model_t *model)
|
||||||
{
|
{
|
||||||
if (model == NULL)
|
if (model == NULL)
|
||||||
@@ -359,9 +531,30 @@ void Model_Init(model_t *model)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 清空模型结构体到零值 */
|
||||||
memset(model, 0, sizeof(*model));
|
memset(model, 0, sizeof(*model));
|
||||||
/* 默认顶栏标题,与菜单「实时数据」条目一致 */
|
|
||||||
|
/* 从全局状态获取菜单相关参数 */
|
||||||
model->topName = GlobalModel_GetMenuActionName();
|
model->topName = GlobalModel_GetMenuActionName();
|
||||||
model->wGroup = (Get_RealData_Num(GlobalModel_GetMenuActionAttrib()) + CN_NUM_OF_PAGE_ANADBG - 1) / CN_NUM_OF_PAGE_ANADBG;
|
model->attrib = GlobalModel_GetMenuActionAttrib();
|
||||||
model->wPage = 1;
|
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; /* 从第一页开始 */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,14 +3,55 @@
|
|||||||
|
|
||||||
#include "types.h"
|
#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 {
|
typedef struct model_t {
|
||||||
const uint8_t *topName;
|
const uint8_t *topName;
|
||||||
uint16_t wGroup;
|
uint16_t itemNum;
|
||||||
uint16_t wPage;
|
uint16_t group;
|
||||||
|
uint16_t page;
|
||||||
|
uint16_t attrib;
|
||||||
|
uint16_t cpuPara;
|
||||||
|
uint8_t empty;
|
||||||
} model_t;
|
} model_t;
|
||||||
|
|
||||||
void Model_Init(model_t *model);
|
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
|
#endif
|
||||||
@@ -207,7 +207,7 @@ page_t *YCPage_GetInstance(void)
|
|||||||
/* 确保在注册到 PageManager 前,页面生命周期回调已就绪 */
|
/* 确保在注册到 PageManager 前,页面生命周期回调已就绪 */
|
||||||
memset(&s_page, 0, sizeof(s_page));
|
memset(&s_page, 0, sizeof(s_page));
|
||||||
s_page.page_id = PAGE_ID_YC;
|
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_create = Page_OnCreate;
|
||||||
s_page.on_enter = Page_OnEnter;
|
s_page.on_enter = Page_OnEnter;
|
||||||
s_page.on_exit = Page_OnExit;
|
s_page.on_exit = Page_OnExit;
|
||||||
|
|||||||
@@ -1,91 +1,457 @@
|
|||||||
#include "Drv/pages/YC/presenter.h"
|
#include "Drv/pages/YC/presenter.h"
|
||||||
#include "Drv/pages/page_manager.h"
|
#include "Drv/pages/page_manager.h"
|
||||||
#include "Drv/key.h"
|
#include "Drv/key.h"
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static void Presenter_HandleInput(presenter_t *presenter, uint8_t keyVal)
|
/* -------------------------------------------------------------------------
|
||||||
{
|
* 静态变量:桩测试相位计数器
|
||||||
switch (keyVal)
|
* ------------------------------------------------------------------------- */
|
||||||
{
|
static uint32_t s_ycStubPhase; /* 桩测试相位计数器,用于生成模拟数据的时间变化 */
|
||||||
case KEY_ESC:
|
|
||||||
(void)PageManager_Pop();
|
|
||||||
break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
/* -------------------------------------------------------------------------
|
||||||
* 函数名: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 指针有效,不做空指针校验(由调用方保证)。
|
* - 本函数不对计数器进行溢出检查,依赖 uint32_t 自动回绕特性。
|
||||||
* - 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` 任一为空,则直接返回。
|
|
||||||
*
|
*
|
||||||
* 说明:
|
* 说明:
|
||||||
|
* - 这是一个桩测试辅助函数,仅在编译接入阶段使用。
|
||||||
|
* - 通过递增 s_ycStubPhase 实现模拟数据的时变效果。
|
||||||
|
* - Presenter_FormatStubValue() 使用该变量生成不同时间点的模拟值。
|
||||||
|
* - 真实数据接入后此函数将被移除或替换为真实采样逻辑。
|
||||||
*
|
*
|
||||||
* 返回值:
|
* 返回值:
|
||||||
* - 无
|
* - 无
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
void Presenter_Init(presenter_t *presenter, model_t *model, view_t *view)
|
static void Presenter_StubTick(void)
|
||||||
{
|
{
|
||||||
ASSERT((presenter == NULL) || (model == NULL) || (view == NULL));
|
s_ycStubPhase++;
|
||||||
if ((presenter == NULL) || (model == NULL) || (view == NULL))
|
}
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(presenter, 0, sizeof(*presenter));
|
/* -------------------------------------------------------------------------
|
||||||
presenter->model = model;
|
* 函数名:Presenter_FormatStubValue
|
||||||
presenter->view = view;
|
* 功能:
|
||||||
presenter->handle_input = Presenter_HandleInput;
|
* 按表索引与时间相位生成可显示遥测字符串(桩函数,用于测试阶段模拟数据)。
|
||||||
presenter->refresh = Presenter_Refresh;
|
*
|
||||||
}
|
* 参数:
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,8 +9,10 @@ typedef struct presenter_t presenter_t;
|
|||||||
typedef struct presenter_t {
|
typedef struct presenter_t {
|
||||||
model_t *model;
|
model_t *model;
|
||||||
view_t *view;
|
view_t *view;
|
||||||
|
uint16_t cursor_row;
|
||||||
void (*handle_input)(presenter_t *presenter, uint8_t keyVal);
|
void (*handle_input)(presenter_t *presenter, uint8_t keyVal);
|
||||||
void (*refresh)(presenter_t *presenter);
|
void (*refresh)(presenter_t *presenter);
|
||||||
|
void (*refresh_values)(presenter_t *presenter);
|
||||||
} presenter_t;
|
} presenter_t;
|
||||||
|
|
||||||
void Presenter_Init(presenter_t *presenter, model_t *model, view_t *view);
|
void Presenter_Init(presenter_t *presenter, model_t *model, view_t *view);
|
||||||
|
|||||||
@@ -1,45 +1,365 @@
|
|||||||
#include "Drv/pages/YC/view.h"
|
#include "Drv/pages/YC/view.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const PageRenderPort *s_port = NULL;
|
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)
|
static void YCView_ShowInfoPage(uint16_t wPageNum, uint16_t wPageMax)
|
||||||
{
|
{
|
||||||
s_port->show_info_page(wPageNum, 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]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------
|
||||||
|
* 函数名: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)
|
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->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->show_str((s_port->get_size_x() - wLen) / 2, 3, name);
|
||||||
s_port->draw_meitou(18, 2);
|
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)
|
void View_Init(view_t *view)
|
||||||
{
|
{
|
||||||
s_port = PageRenderer_Lcd();
|
s_port = PageRenderer_Lcd();
|
||||||
view->show_top_name = YCView_ShowTopName;
|
view->show_top_name = NULL;
|
||||||
view->show_info_page = YCView_ShowInfoPage;
|
view->show_info_page = YCView_ShowInfoPage;
|
||||||
}
|
view->draw_full = YCView_DrawFull;
|
||||||
|
view->draw_values = YCView_DrawValues;
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,9 +4,37 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "Drv/pages/global/renderer_lcd.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 {
|
typedef struct view_t {
|
||||||
void (*show_top_name)(const uint8_t *name);
|
void (*show_top_name)(const uint8_t *name);
|
||||||
void (*show_info_page)(uint16_t wPageNum, uint16_t wPageMax);
|
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;
|
} view_t;
|
||||||
|
|
||||||
void View_Init(view_t *view);
|
void View_Init(view_t *view);
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ const uint8_t *GlobalModel_GetMenuActionTip(void)
|
|||||||
*
|
*
|
||||||
* 说明:
|
* 说明:
|
||||||
* - 该函数用于查询全局模型中的 activeAttrib 字段。
|
* - 该函数用于查询全局模型中的 activeAttrib 字段。
|
||||||
* - 返回值是与当前菜单相关的额外参数数据,具体含义取决于菜单类型。
|
* - 返回值是与当前菜单相关的动作属性,具体含义取决于动作类型。
|
||||||
*
|
*
|
||||||
* 返回值:
|
* 返回值:
|
||||||
* - 当前菜单的动作属性
|
* - 当前菜单的动作属性
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#ifndef MENU_def_H
|
#ifndef MENU_def_H
|
||||||
#define MENU_def_H
|
#define MENU_def_H
|
||||||
|
|
||||||
|
#include "display.h"
|
||||||
|
|
||||||
/* layout constants are unified into menu_view */
|
/* layout constants are unified into menu_view */
|
||||||
#define MENU_SIZE_Y (160)
|
#define MENU_SIZE_Y (160)
|
||||||
#define MENU_SIZE_X (160)
|
#define MENU_SIZE_X (160)
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -512,7 +512,7 @@ const tagMenuModel menuTab[] =
|
|||||||
{ 1, "实时数据", "装置实时数据", 0, 0x0000, 0, (FUNCPTR)Menu_NonPfunc },
|
{ 1, "实时数据", "装置实时数据", 0, 0x0000, 0, (FUNCPTR)Menu_NonPfunc },
|
||||||
{ 2, "交流量", "查看遥测交流量", EN_MEA_AC, 0x0000, EN_ANA_0, (FUNCPTR)MenuProc_See_YC },
|
{ 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_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 },
|
{ 1, "参数定值", "保护参数查看与修改", 0, 0x0000, 0, (FUNCPTR)Menu_NonPfunc },
|
||||||
{ 2, "整定", "整定装置保护参数", 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 },
|
{ 3, "参数", "查看设备参数定值", EN_FIGURE_SET, CN_USER_PWD, EN_SIDE_BASIC, (FUNCPTR)MenuProc_Set_Value },
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "presenter.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_view_t s_view;
|
||||||
static menu_presenter_t s_presenter;
|
static menu_presenter_t s_presenter;
|
||||||
static page_t s_menuPage;
|
static page_t s_menuPage;
|
||||||
|
static const PageRenderPort *s_port = NULL;
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
/* -------------------------------------------------------------------------
|
||||||
* 函数名: MenuPage_OnExit
|
* 函数名: MenuPage_OnExit
|
||||||
@@ -35,7 +37,7 @@ static page_t s_menuPage;
|
|||||||
* - 使用 (void)page 防止未使用参数告警。
|
* - 使用 (void)page 防止未使用参数告警。
|
||||||
*
|
*
|
||||||
* 说明:
|
* 说明:
|
||||||
* - 预留给后续扩展(如停止定时任务、冻结动画、保存瞬时 UI 状态等)。
|
* - 离开菜单时整屏擦除,避免 MenuView 边框线残留在显存,进入其它页前画面干净。
|
||||||
*
|
*
|
||||||
* 返回值:
|
* 返回值:
|
||||||
* - 无
|
* - 无
|
||||||
@@ -43,6 +45,10 @@ static page_t s_menuPage;
|
|||||||
static void MenuPage_OnExit(page_t *page)
|
static void MenuPage_OnExit(page_t *page)
|
||||||
{
|
{
|
||||||
(void)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.presenter = &s_presenter;
|
||||||
s_menuPage.view = &s_view;
|
s_menuPage.view = &s_view;
|
||||||
s_menuPage.model = &s_model;
|
s_menuPage.model = &s_model;
|
||||||
|
s_port = PageRenderer_Lcd();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
/* -------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user