#include "pqdif_semantic_ids.h" #include #include 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 } // ------------------------------ // QuantityType:tagQuantityTypeID // ------------------------------ 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]); // ------------------------------ // ValueType:tagValueTypeID // 这里只放 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]); // ------------------------------ // QuantityCharacteristic:tagQuantityCharacteristicID // 这里只放统计数据映射最常用、且在 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]); // ------------------------------ // DisturbanceCategory:tagDisturbanceCategoryID // 统计映射主要用它做过滤,不作为多数统计指标主键。 // 这里只放头文件中最常见、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 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