Files
front_linux/LFtid1056/pqdif_semantic_ids.cpp

506 lines
36 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "pqdif_semantic_ids.h"
#include <cstdio>
#include <sstream>
namespace pqdif_sem
{
// ============================================================================
// GUID 工具
// ============================================================================
std::string GuidToString(const GUID& g)
{
char buf[64] = { 0 };
std::snprintf(
buf,
sizeof(buf),
"%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",
g.Data1, g.Data2, g.Data3,
g.Data4[0], g.Data4[1],
g.Data4[2], g.Data4[3], g.Data4[4],
g.Data4[5], g.Data4[6], g.Data4[7]);
return std::string(buf);
}
// ============================================================================
// 整数型固定表
// 来源PDF 表 B.2 / B.3 / B.4 + pqdif/include/pqdif_id.h
// ============================================================================
const UIntSemanticEntry kPhaseTable[] = {
{ ID_PHASE_NONE, "ID_PHASE_NONE", "无相别", "tagPhaseID", "未指定相别" },
{ ID_PHASE_AN, "ID_PHASE_AN", "A-N", "tagPhaseID", "A 相对中性线" },
{ ID_PHASE_BN, "ID_PHASE_BN", "B-N", "tagPhaseID", "B 相对中性线" },
{ ID_PHASE_CN, "ID_PHASE_CN", "C-N", "tagPhaseID", "C 相对中性线" },
{ ID_PHASE_NG, "ID_PHASE_NG", "N-G", "tagPhaseID", "中性线对地" },
{ ID_PHASE_AB, "ID_PHASE_AB", "A-B", "tagPhaseID", "A-B 线量" },
{ ID_PHASE_BC, "ID_PHASE_BC", "B-C", "tagPhaseID", "B-C 线量" },
{ ID_PHASE_CA, "ID_PHASE_CA", "C-A", "tagPhaseID", "C-A 线量" },
{ ID_PHASE_RES, "ID_PHASE_RES", "剩余量", "tagPhaseID", "Residual" },
{ ID_PHASE_NET, "ID_PHASE_NET", "净值", "tagPhaseID", "Net" },
{ ID_PHASE_TOTAL, "ID_PHASE_TOTAL", "总量", "tagPhaseID", "Total" },
{ ID_PHASE_LN_AVE, "ID_PHASE_LN_AVE", "相电压平均", "tagPhaseID", "LN average" },
{ ID_PHASE_LL_AVE, "ID_PHASE_LL_AVE", "线电压平均", "tagPhaseID", "LL average" },
{ ID_PHASE_WORST, "ID_PHASE_WORST", "最差相", "tagPhaseID", "Worst phase" },
{ ID_PHASE_PLUS, "ID_PHASE_PLUS", "正向", "tagPhaseID", "Plus / forward" },
{ ID_PHASE_MINUS, "ID_PHASE_MINUS", "反向", "tagPhaseID", "Minus / reverse" },
{ ID_PHASE_GENERAL_1, "ID_PHASE_GENERAL_1", "通用1", "tagPhaseID", "General slot 1" },
{ ID_PHASE_GENERAL_2, "ID_PHASE_GENERAL_2", "通用2", "tagPhaseID", "General slot 2" },
{ ID_PHASE_GENERAL_3, "ID_PHASE_GENERAL_3", "通用3", "tagPhaseID", "General slot 3" },
{ ID_PHASE_GENERAL_4, "ID_PHASE_GENERAL_4", "通用4", "tagPhaseID", "General slot 4" },
{ ID_PHASE_GENERAL_5, "ID_PHASE_GENERAL_5", "通用5", "tagPhaseID", "General slot 5" },
{ ID_PHASE_GENERAL_6, "ID_PHASE_GENERAL_6", "通用6", "tagPhaseID", "General slot 6" },
{ ID_PHASE_GENERAL_7, "ID_PHASE_GENERAL_7", "通用7", "tagPhaseID", "General slot 7" },
{ ID_PHASE_GENERAL_8, "ID_PHASE_GENERAL_8", "通用8", "tagPhaseID", "General slot 8" },
{ ID_PHASE_GENERAL_9, "ID_PHASE_GENERAL_9", "通用9", "tagPhaseID", "General slot 9" },
{ ID_PHASE_GENERAL_10, "ID_PHASE_GENERAL_10", "通用10", "tagPhaseID", "General slot 10" },
{ ID_PHASE_GENERAL_11, "ID_PHASE_GENERAL_11", "通用11", "tagPhaseID", "General slot 11" },
{ ID_PHASE_GENERAL_12, "ID_PHASE_GENERAL_12", "通用12", "tagPhaseID", "General slot 12" },
{ ID_PHASE_GENERAL_13, "ID_PHASE_GENERAL_13", "通用13", "tagPhaseID", "General slot 13" },
{ ID_PHASE_GENERAL_14, "ID_PHASE_GENERAL_14", "通用14", "tagPhaseID", "General slot 14" },
{ ID_PHASE_GENERAL_15, "ID_PHASE_GENERAL_15", "通用15", "tagPhaseID", "General slot 15" },
{ ID_PHASE_GENERAL_16, "ID_PHASE_GENERAL_16", "通用16", "tagPhaseID", "General slot 16" }
};
const std::size_t kPhaseTableSize = sizeof(kPhaseTable) / sizeof(kPhaseTable[0]);
const UIntSemanticEntry kQuantityMeasuredTable[] = {
{ ID_QM_NONE, "ID_QM_NONE", "未指定", "tagQuantityMeasuredID", "未指定被测量" },
{ ID_QM_VOLTAGE, "ID_QM_VOLTAGE", "电压", "tagQuantityMeasuredID", "Voltage" },
{ ID_QM_CURRENT, "ID_QM_CURRENT", "电流", "tagQuantityMeasuredID", "Current" },
{ ID_QM_POWER, "ID_QM_POWER", "功率", "tagQuantityMeasuredID", "Power" },
{ ID_QM_ENERGY, "ID_QM_ENERGY", "能量", "tagQuantityMeasuredID", "Energy" },
{ ID_QM_TEMPERATURE, "ID_QM_TEMPERATURE", "温度", "tagQuantityMeasuredID", "Temperature" },
{ ID_QM_PRESSURE, "ID_QM_PRESSURE", "压力", "tagQuantityMeasuredID", "Pressure" },
{ ID_QM_CHARGE, "ID_QM_CHARGE", "电荷", "tagQuantityMeasuredID", "Charge" },
{ ID_QM_EFIELD, "ID_QM_EFIELD", "电场", "tagQuantityMeasuredID", "Electric field" },
{ ID_QM_MFIELD, "ID_QM_MFIELD", "磁场", "tagQuantityMeasuredID", "Magnetic field" },
{ ID_QM_VELOCITY, "ID_QM_VELOCITY", "速度", "tagQuantityMeasuredID", "Velocity" },
{ ID_QM_BEARING, "ID_QM_BEARING", "方位", "tagQuantityMeasuredID", "Bearing" },
{ ID_QM_FORCE, "ID_QM_FORCE", "", "tagQuantityMeasuredID", "Force" },
{ ID_QM_TORQUE, "ID_QM_TORQUE", "转矩", "tagQuantityMeasuredID", "Torque" },
{ ID_QM_POSITION, "ID_QM_POSITION", "位置", "tagQuantityMeasuredID", "Position" },
{ ID_QM_FLUXLINKAGE, "ID_QM_FLUXLINKAGE", "磁链", "tagQuantityMeasuredID", "Flux linkage" },
{ ID_QM_FLUXDENSITY, "ID_QM_FLUXDENSITY", "磁通密度", "tagQuantityMeasuredID", "Flux density" },
{ ID_QM_STATUS, "ID_QM_STATUS", "状态量", "tagQuantityMeasuredID", "Status quantity" }
};
const std::size_t kQuantityMeasuredTableSize = sizeof(kQuantityMeasuredTable) / sizeof(kQuantityMeasuredTable[0]);
const UIntSemanticEntry kQuantityUnitsTable[] = {
{ ID_QU_NONE, "ID_QU_NONE", "无单位", "tagQuantityUnitsID", "No unit" },
{ ID_QU_TIMESTAMP, "ID_QU_TIMESTAMP", "时间戳", "tagQuantityUnitsID", "Timestamp" },
{ ID_QU_SECONDS, "ID_QU_SECONDS", "", "tagQuantityUnitsID", "Seconds" },
{ ID_QU_CYCLES, "ID_QU_CYCLES", "周波", "tagQuantityUnitsID", "Cycles" },
{ ID_QU_VOLTS, "ID_QU_VOLTS", "V", "tagQuantityUnitsID", "Volts" },
{ ID_QU_AMPS, "ID_QU_AMPS", "A", "tagQuantityUnitsID", "Amps" },
{ ID_QU_VA, "ID_QU_VA", "VA", "tagQuantityUnitsID", "Volt-amps" },
{ ID_QU_WATTS, "ID_QU_WATTS", "W", "tagQuantityUnitsID", "Watts" },
{ ID_QU_VARS, "ID_QU_VARS", "var", "tagQuantityUnitsID", "Vars" },
{ ID_QU_OHMS, "ID_QU_OHMS", "Ω", "tagQuantityUnitsID", "Ohms" },
{ ID_QU_SIEMENS, "ID_QU_SIEMENS", "S", "tagQuantityUnitsID", "Siemens" },
{ ID_QU_VOLTSPERAMP, "ID_QU_VOLTSPERAMP", "V/A", "tagQuantityUnitsID", "Volts per amp" },
{ ID_QU_JOULES, "ID_QU_JOULES", "J", "tagQuantityUnitsID", "Joules" },
{ ID_QU_HERTZ, "ID_QU_HERTZ", "Hz", "tagQuantityUnitsID", "Hertz" },
{ ID_QU_CELCIUS, "ID_QU_CELCIUS", "", "tagQuantityUnitsID", "Celsius" },
{ ID_QU_DEGREES, "ID_QU_DEGREES", "°", "tagQuantityUnitsID", "Degrees" },
{ ID_QU_DB, "ID_QU_DB", "dB", "tagQuantityUnitsID", "Decibel" },
{ ID_QU_PERCENT, "ID_QU_PERCENT", "%", "tagQuantityUnitsID", "Percent" },
{ ID_QU_PERUNIT, "ID_QU_PERUNIT", "pu", "tagQuantityUnitsID", "Per-unit" },
{ ID_QU_SAMPLES, "ID_QU_SAMPLES", "samples", "tagQuantityUnitsID", "Samples" },
{ ID_QU_VARHOURS, "ID_QU_VARHOURS", "varh", "tagQuantityUnitsID", "Var-hours" },
{ ID_QU_WATTHOURS, "ID_QU_WATTHOURS", "Wh", "tagQuantityUnitsID", "Watt-hours" },
{ ID_QU_VAHOURS, "ID_QU_VAHOURS", "VAh", "tagQuantityUnitsID", "VA-hours" },
{ ID_QU_MPS, "ID_QU_MPS", "m/s", "tagQuantityUnitsID", "Meters per second" },
{ ID_QU_MPH, "ID_QU_MPH", "mph", "tagQuantityUnitsID", "Miles per hour" },
{ ID_QU_BARS, "ID_QU_BARS", "bar", "tagQuantityUnitsID", "Bars" },
{ ID_QU_PASCALS, "ID_QU_PASCALS", "Pa", "tagQuantityUnitsID", "Pascals" },
{ ID_QU_NEWTONS, "ID_QU_NEWTONS", "N", "tagQuantityUnitsID", "Newtons" },
{ ID_QU_NEWTONMETERS, "ID_QU_NEWTONMETERS", "N·m", "tagQuantityUnitsID", "Newton meters" },
{ ID_QU_RPM, "ID_QU_RPM", "rpm", "tagQuantityUnitsID", "Rotations per minute" },
{ ID_QU_RADPERSEC, "ID_QU_RADPERSEC", "rad/s", "tagQuantityUnitsID", "Radians per second" },
{ ID_QU_METERS, "ID_QU_METERS", "m", "tagQuantityUnitsID", "Meters" },
{ ID_QU_WEBERTURNS, "ID_QU_WEBERTURNS", "Wb·turn", "tagQuantityUnitsID", "Weber-turns" },
{ ID_QU_TESLAS, "ID_QU_TESLAS", "T", "tagQuantityUnitsID", "Teslas" },
{ ID_QU_WEBERS, "ID_QU_WEBERS", "Wb", "tagQuantityUnitsID", "Webers" },
{ ID_QU_VOLTSPERVOLT, "ID_QU_VOLTSPERVOLT", "V/V", "tagQuantityUnitsID", "Volts per volt" },
{ ID_QU_AMPSPERAMP, "ID_QU_AMPSPERAMP", "A/A", "tagQuantityUnitsID", "Amps per amp" },
{ ID_QU_AMPSPERVOLT, "ID_QU_AMPSPERVOLT", "A/V", "tagQuantityUnitsID", "Amps per volt" }
};
const std::size_t kQuantityUnitsTableSize = sizeof(kQuantityUnitsTable) / sizeof(kQuantityUnitsTable[0]);
const UIntSemanticEntry kStorageMethodTable[] = {
{ ID_SERIES_METHOD_VALUES, "ID_SERIES_METHOD_VALUES", "直接存值", "tagStorageMethodID", "SeriesValues 直接保存原始值" },
{ ID_SERIES_METHOD_SCALED, "ID_SERIES_METHOD_SCALED", "缩放存值", "tagStorageMethodID", "需要结合 scale/offset 解释" },
{ ID_SERIES_METHOD_INCREMENT, "ID_SERIES_METHOD_INCREMENT", "增量存值", "tagStorageMethodID", "需要按增量方式还原" }
};
const std::size_t kStorageMethodTableSize = sizeof(kStorageMethodTable) / sizeof(kStorageMethodTable[0]);
const UIntSemanticEntry kTriggerMethodTable[] = {
{ ID_TRIGGER_METH_NONE, "ID_TRIGGER_METH_NONE", "无触发", "tagTriggerMethodID", "无触发方式" },
{ ID_TRIGGER_METH_CHANNEL, "ID_TRIGGER_METH_CHANNEL", "通道触发", "tagTriggerMethodID", "由某个通道条件触发" },
{ ID_TRIGGER_METH_PERIODIC, "ID_TRIGGER_METH_PERIODIC", "周期触发", "tagTriggerMethodID", "按固定周期采样/记录" },
{ ID_TRIGGER_METH_EXTERNAL, "ID_TRIGGER_METH_EXTERNAL", "外部触发", "tagTriggerMethodID", "由外部事件触发" },
{ ID_TRIGGER_METH_PERIODIC_STATS, "ID_TRIGGER_METH_PERIODIC_STATS", "统计触发", "tagTriggerMethodID", "周期统计型 observation" }
};
const std::size_t kTriggerMethodTableSize = sizeof(kTriggerMethodTable) / sizeof(kTriggerMethodTable[0]);
// ============================================================================
// GUID 型固定表
// 来源PDF 表 B.2 / B.4 + pqdif/include/pqdif_id.h
// 不手写 GUID 值,直接引用 pqdif_id.h 常量。
// ============================================================================
#define GUID_ENTRY(field_enum, guid_const, cn_name, tag_name, desc_text) \
{ guid_const, field_enum, #guid_const, cn_name, tag_name, desc_text }
// ------------------------------
// QuantityTypetagQuantityTypeID
// ------------------------------
const GuidSemanticEntry kQuantityTypeTable[] = {
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_WAVEFORM, "波形", "tagQuantityTypeID", "点波形测量"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_VALUELOG, "统计日志", "tagQuantityTypeID", "时间序列统计/趋势记录,统计映射首选"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_PHASOR, "相量", "tagQuantityTypeID", "幅值/相角时域量"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_RESPONSE, "响应曲线", "tagQuantityTypeID", "频域响应量"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_FLASH, "闪变定位", "tagQuantityTypeID", "闪电位置/极性/椭圆参数"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_HISTOGRAM, "直方图", "tagQuantityTypeID", "BINLOW/BINHIGH/BINID/COUNT"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_HISTOGRAM3D, "三维直方图", "tagQuantityTypeID", "X/Y 双维 BIN + COUNT"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_CPF, "累计概率", "tagQuantityTypeID", "PROB + VAL"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_XY, "XY 数据", "tagQuantityTypeID", "双值对"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_MAGDUR, "幅值持续时间", "tagQuantityTypeID", "VAL + DURATION"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_XYZ, "XYZ 数据", "tagQuantityTypeID", "三值对"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_MAGDURTIME, "时间幅值持续时间", "tagQuantityTypeID", "TIME + VAL + DURATION"),
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_MAGDURCOUNT, "时间幅值持续时间计数", "tagQuantityTypeID", "TIME + VAL + DURATION + COUNT")
};
const std::size_t kQuantityTypeTableSize = sizeof(kQuantityTypeTable) / sizeof(kQuantityTypeTable[0]);
// ------------------------------
// ValueTypetagValueTypeID
// 这里只放 PDF 表 B.2 中明确列出且 pqdif_id.h 中存在定义的统计常用项。
// ------------------------------
const GuidSemanticEntry kValueTypeTable[] = {
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_VAL, "", "tagValueTypeID", "默认值序列"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_TIME, "时间轴", "tagValueTypeID", "时间序列"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_MIN, "最小值", "tagValueTypeID", "统计最小值"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_MAX, "最大值", "tagValueTypeID", "统计最大值"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_AVG, "平均值", "tagValueTypeID", "统计平均值"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_INST, "瞬时值", "tagValueTypeID", "已弃用,推荐用 VAL"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PHASEANGLE, "相角", "tagValueTypeID", "适用于 VAL 或全局相角"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PHASEANGLE_MIN, "最小值相角", "tagValueTypeID", "对应 MIN 序列的相角"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PHASEANGLE_MAX, "最大值相角", "tagValueTypeID", "对应 MAX 序列的相角"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PHASEANGLE_AVG, "平均值相角", "tagValueTypeID", "对应 AVG 序列的相角"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_AREA, "面积", "tagValueTypeID", "曲线面积"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_LATITUDE, "纬度", "tagValueTypeID", "Latitude"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_DURATION, "持续时间", "tagValueTypeID", "Duration"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_LONGITUDE, "经度", "tagValueTypeID", "Longitude"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_POLARITY, "极性", "tagValueTypeID", "Polarity"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_BINID, "分箱编号", "tagValueTypeID", "Histogram bin id"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_BINHIGH, "分箱上界", "tagValueTypeID", "Histogram bin high"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_BINLOW, "分箱下界", "tagValueTypeID", "Histogram bin low"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_XBINHIGH, "X分箱上界", "tagValueTypeID", "3D histogram X high"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_XBINLOW, "X分箱下界", "tagValueTypeID", "3D histogram X low"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_YBINHIGH, "Y分箱上界", "tagValueTypeID", "3D histogram Y high"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_YBINLOW, "Y分箱下界", "tagValueTypeID", "3D histogram Y low"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_COUNT, "计数", "tagValueTypeID", "样本/事件计数"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_TRANSITION, "过渡码", "tagValueTypeID", "VALUELOG 过渡事件代码"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PROB, "概率", "tagValueTypeID", "累计概率百分比"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_INTERVAL, "间隔", "tagValueTypeID", "统计间隔/区间值"),
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_STATUS, "状态", "tagValueTypeID", "状态值/质量码")
};
const std::size_t kValueTypeTableSize = sizeof(kValueTypeTable) / sizeof(kValueTypeTable[0]);
// ------------------------------
// QuantityCharacteristictagQuantityCharacteristicID
// 这里只放统计数据映射最常用、且在 PDF 表 B.2 与 pqdif_id.h 中可直接对上的项。
// ------------------------------
const GuidSemanticEntry kQuantityCharacteristicTable[] = {
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_NONE, "无特征量", "tagQuantityCharacteristicID", "未额外指定特征量"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_INSTANTANEOUS, "瞬时", "tagQuantityCharacteristicID", "Instantaneous f(t)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SPECTRA, "频谱", "tagQuantityCharacteristicID", "Spectra F(F)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_PEAK, "峰值", "tagQuantityCharacteristicID", "Peak value"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_RMS, "有效值", "tagQuantityCharacteristicID", "RMS value"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_HRMS, "谐波有效值", "tagQuantityCharacteristicID", "Harmonic RMS"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FREQUENCY, "频率特征量", "tagQuantityCharacteristicID", "Frequency"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TOTAL_THD, "总谐波畸变", "tagQuantityCharacteristicID", "Total harmonic distortion (%)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_EVEN_THD, "偶次谐波畸变", "tagQuantityCharacteristicID", "Even harmonic distortion (%)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_ODD_THD, "奇次谐波畸变", "tagQuantityCharacteristicID", "Odd harmonic distortion (%)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_CREST_FACTOR, "波峰因数", "tagQuantityCharacteristicID", "Crest factor"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FORM_FACTOR, "波形因数", "tagQuantityCharacteristicID", "Form factor"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_ARITH_SUM, "算术和", "tagQuantityCharacteristicID", "Arithmetic sum"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_S0S1, "零序不平衡度", "tagQuantityCharacteristicID", "Zero sequence component unbalance (%)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_S2S1, "负序不平衡度", "tagQuantityCharacteristicID", "Negative sequence component unbalance (%)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SPOS, "正序分量", "tagQuantityCharacteristicID", "Positive sequence component"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SNEG, "负序分量", "tagQuantityCharacteristicID", "Negative sequence component"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SZERO, "零序分量", "tagQuantityCharacteristicID", "Zero sequence component"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_AVG_IMBAL, "平均不平衡度", "tagQuantityCharacteristicID", "Imbalance by max deviation from average"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TOTAL_THD_RMS, "总 THD(RMS)", "tagQuantityCharacteristicID", "Total THD normalized to RMS"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_ODD_THD_RMS, "奇次 THD(RMS)", "tagQuantityCharacteristicID", "Odd THD normalized to RMS"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_EVEN_THD_RMS, "偶次 THD(RMS)", "tagQuantityCharacteristicID", "Even THD normalized to RMS"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TID, "总间谐波畸变", "tagQuantityCharacteristicID", "Total Interharmonic Distortion"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TID_RMS, "总间谐波畸变(RMS)", "tagQuantityCharacteristicID", "Total Interharmonic Distortion normalized to RMS"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_IHRMS, "间谐波有效值", "tagQuantityCharacteristicID", "Interharmonic RMS"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SPECTRA_HGROUP, "按谐波组频谱", "tagQuantityCharacteristicID", "Spectra by Harmonic Group index"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SPECTRA_IGROUP, "按间谐波组频谱","tagQuantityCharacteristicID", "Spectra by Interharmonic Group index"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TIF, "TIF", "tagQuantityCharacteristicID", "Telephone Influence Factor"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_MAG_AVG, "闪变平均幅值", "tagQuantityCharacteristicID", "Flicker average RMS value"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_MAX_DVV, "闪变最大 dV/V", "tagQuantityCharacteristicID", "dV/V base"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_FREQ_MAX, "闪变最大谐波频率", "tagQuantityCharacteristicID", "Frequency of maximum flicker harmonic"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_MAG_MAX, "闪变最大谐波幅值", "tagQuantityCharacteristicID", "Magnitude of maximum flicker harmonic"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_WGT_AVG, "闪变加权平均", "tagQuantityCharacteristicID", "Spectrum weighted average"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_SPECTRUM, "闪变频谱", "tagQuantityCharacteristicID", "Flicker spectrum VRMS(F)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_PST, "短时闪变", "tagQuantityCharacteristicID", "Short Term Flicker"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_PLT, "长时闪变", "tagQuantityCharacteristicID", "Long Term Flicker"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TIF_RMS, "TIF(RMS)", "tagQuantityCharacteristicID", "TIF normalized to RMS"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_PLTSLIDE, "滑动 PLT", "tagQuantityCharacteristicID", "Sliding PLT"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_IT, "IT", "tagQuantityCharacteristicID", "IT"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_RMS_DEMAND, "需量有效值", "tagQuantityCharacteristicID", "RMS value of current for a demand interval"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_ANSI_TDF, "ANSI 变压器降额因子", "tagQuantityCharacteristicID", "Transformer Derating Factor"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_K_FACTOR, "K 因子", "tagQuantityCharacteristicID", "Transformer K Factor"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TDD, "总需量畸变", "tagQuantityCharacteristicID", "Total Demand Distortion"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_RMS_PEAK_DEMAND,"峰值需量电流", "tagQuantityCharacteristicID", "Peak Demand Current"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_P, "有功功率", "tagQuantityCharacteristicID", "Real power (watts)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_Q, "无功功率", "tagQuantityCharacteristicID", "Reactive power (VAR)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_S, "视在功率", "tagQuantityCharacteristicID", "Apparent power (VA)"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_PF, "功率因数", "tagQuantityCharacteristicID", "True Power Factor"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_DF, "位移因数", "tagQuantityCharacteristicID", "Displacement factor"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_P_DEMAND, "有功需量", "tagQuantityCharacteristicID", "Real power demand"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_Q_DEMAND, "无功需量", "tagQuantityCharacteristicID", "Reactive power demand"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_S_DEMAND, "视在需量", "tagQuantityCharacteristicID", "Apparent power demand"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_DF_DEMAND, "位移因数需量", "tagQuantityCharacteristicID", "Displacement factor demand"),
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_PF_DEMAND, "功率因数需量", "tagQuantityCharacteristicID", "Power factor demand")
};
const std::size_t kQuantityCharacteristicTableSize =
sizeof(kQuantityCharacteristicTable) / sizeof(kQuantityCharacteristicTable[0]);
// ------------------------------
// DisturbanceCategorytagDisturbanceCategoryID
// 统计映射主要用它做过滤,不作为多数统计指标主键。
// 这里只放头文件中最常见、PDF 表 B.4 也能对上的基础项。
// ------------------------------
const GuidSemanticEntry kDisturbanceCategoryTable[] = {
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_NONE, "无扰动分类", "tagDisturbanceCategoryID", "No IEEE 1159 definition applicable"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_TRANSIENT, "瞬态", "tagDisturbanceCategoryID", "IEEE 1159 Transient"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_LONGDUR, "长时 RMS 变化", "tagDisturbanceCategoryID", "IEEE 1159 Long Duration RMS Variation"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_IMBALANCE, "不平衡", "tagDisturbanceCategoryID", "IEEE 1159 Imbalance"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_POWERFREQVARIATION, "工频变化", "tagDisturbanceCategoryID", "IEEE 1159 Power Frequency Variation"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_VOLTAGEFLUCTUATION, "电压波动/闪变", "tagDisturbanceCategoryID", "IEEE 1159 Voltage Fluctuation"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT, "波形畸变", "tagDisturbanceCategoryID", "IEEE 1159 Waveform Distortion"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT_HARMONIC, "谐波畸变", "tagDisturbanceCategoryID", "IEEE 1159 Harmonics Present"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT_INTERHARMONIC, "间谐波畸变", "tagDisturbanceCategoryID", "IEEE 1159 Interharmonics Present"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT_NOTCHING, "缺口", "tagDisturbanceCategoryID", "IEEE 1159 Notching Present"),
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT_NOISE, "噪声", "tagDisturbanceCategoryID", "IEEE 1159 Noise Present")
};
const std::size_t kDisturbanceCategoryTableSize =
sizeof(kDisturbanceCategoryTable) / sizeof(kDisturbanceCategoryTable[0]);
#undef GUID_ENTRY
// ============================================================================
// 查询函数
// ============================================================================
const UIntSemanticEntry* FindUIntSemantic(
const UIntSemanticEntry* table,
std::size_t table_size,
uint32_t raw_value)
{
for (std::size_t i = 0; i < table_size; ++i)
{
if (table[i].raw_value == raw_value)
return &table[i];
}
return nullptr;
}
const UIntSemanticEntry* FindPhase(uint32_t raw_value)
{
return FindUIntSemantic(kPhaseTable, kPhaseTableSize, raw_value);
}
const UIntSemanticEntry* FindQuantityMeasured(uint32_t raw_value)
{
return FindUIntSemantic(kQuantityMeasuredTable, kQuantityMeasuredTableSize, raw_value);
}
const UIntSemanticEntry* FindQuantityUnits(uint32_t raw_value)
{
return FindUIntSemantic(kQuantityUnitsTable, kQuantityUnitsTableSize, raw_value);
}
const UIntSemanticEntry* FindStorageMethod(uint32_t raw_value)
{
return FindUIntSemantic(kStorageMethodTable, kStorageMethodTableSize, raw_value);
}
const UIntSemanticEntry* FindTriggerMethod(uint32_t raw_value)
{
return FindUIntSemantic(kTriggerMethodTable, kTriggerMethodTableSize, raw_value);
}
static std::string MakeUnknownUIntName(const char* prefix, uint32_t raw_value)
{
return std::string(prefix) + "(" + std::to_string(raw_value) + ")";
}
std::string FindPhaseName(uint32_t raw_value)
{
const auto* e = FindPhase(raw_value);
return e ? e->display_name : MakeUnknownUIntName("UNKNOWN_PHASE", raw_value);
}
std::string FindQuantityMeasuredName(uint32_t raw_value)
{
const auto* e = FindQuantityMeasured(raw_value);
return e ? e->display_name : MakeUnknownUIntName("UNKNOWN_MEASURED", raw_value);
}
std::string FindQuantityUnitsName(uint32_t raw_value)
{
const auto* e = FindQuantityUnits(raw_value);
return e ? e->display_name : MakeUnknownUIntName("UNKNOWN_UNIT", raw_value);
}
std::string FindStorageMethodName(uint32_t raw_value)
{
const auto* e = FindStorageMethod(raw_value);
return e ? e->display_name : MakeUnknownUIntName("UNKNOWN_STORAGE_METHOD", raw_value);
}
std::string FindStorageMethodFlagsName(uint32_t raw_value)
{
std::vector<std::string> parts;
if (raw_value & ID_SERIES_METHOD_VALUES)
parts.emplace_back("VALUES");
if (raw_value & ID_SERIES_METHOD_SCALED)
parts.emplace_back("SCALED");
if (raw_value & ID_SERIES_METHOD_INCREMENT)
parts.emplace_back("INCREMENT");
if (parts.empty())
return "UNKNOWN_STORAGE_METHOD(" + std::to_string(raw_value) + ")";
std::ostringstream oss;
for (size_t i = 0; i < parts.size(); ++i)
{
if (i > 0) oss << "|";
oss << parts[i];
}
return oss.str();
}
std::string FindTriggerMethodName(uint32_t raw_value)
{
const auto* e = FindTriggerMethod(raw_value);
return e ? e->display_name : MakeUnknownUIntName("UNKNOWN_TRIGGER_METHOD", raw_value);
}
// ============================================================================
// GUID registry
// ============================================================================
GuidSemanticRegistry::GuidSemanticRegistry()
{
auto add_table = [this](const GuidSemanticEntry* table, std::size_t n)
{
for (std::size_t i = 0; i < n; ++i)
{
const GuidSemanticEntry& e = table[i];
map_.insert({ Key{ e.field, e.raw_guid }, &e });
}
};
add_table(kQuantityTypeTable, kQuantityTypeTableSize);
add_table(kValueTypeTable, kValueTypeTableSize);
add_table(kQuantityCharacteristicTable, kQuantityCharacteristicTableSize);
add_table(kDisturbanceCategoryTable, kDisturbanceCategoryTableSize);
}
const GuidSemanticEntry* GuidSemanticRegistry::Find(GuidSemanticField field, const GUID& raw_guid) const
{
auto it = map_.find(Key{ field, raw_guid });
if (it == map_.end())
return nullptr;
return it->second;
}
std::string GuidSemanticRegistry::FindName(GuidSemanticField field, const GUID& raw_guid, const char* fallback) const
{
const auto* e = Find(field, raw_guid);
if (e)
return e->display_name;
return fallback ? std::string(fallback) : GuidToString(raw_guid);
}
const GuidSemanticRegistry& GetGuidSemanticRegistry()
{
static GuidSemanticRegistry registry;
return registry;
}
// ============================================================================
// helper
// ============================================================================
bool IsQuantityTypeValueLog(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_QT_VALUELOG);
}
bool IsValueTypeTime(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_SERIES_VALUE_TYPE_TIME);
}
bool IsValueTypeVal(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_SERIES_VALUE_TYPE_VAL);
}
bool IsValueTypeMin(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_SERIES_VALUE_TYPE_MIN);
}
bool IsValueTypeMax(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_SERIES_VALUE_TYPE_MAX);
}
bool IsValueTypeAvg(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_SERIES_VALUE_TYPE_AVG);
}
bool IsValueTypeInterval(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_SERIES_VALUE_TYPE_INTERVAL);
}
bool IsCharacteristicFrequency(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_QC_FREQUENCY);
}
bool IsCharacteristicRms(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_QC_RMS);
}
bool IsCharacteristicTotalThd(const GUID& raw_guid)
{
return GuidEqual(raw_guid, ID_QC_TOTAL_THD) || GuidEqual(raw_guid, ID_QC_TOTAL_THD_RMS);
}
bool IsUnitHertz(uint32_t raw_value)
{
return raw_value == ID_QU_HERTZ;
}
bool IsTriggerPeriodicStats(uint32_t raw_value)
{
return raw_value == ID_TRIGGER_METH_PERIODIC_STATS;
}
} // namespace pqdif_sem