506 lines
36 KiB
C++
506 lines
36 KiB
C++
#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 }
|
||
|
||
// ------------------------------
|
||
// 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<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
|