新增PQDIF解析线程,新增各项PQDIF解析逻辑
This commit is contained in:
Binary file not shown.
@@ -88,6 +88,7 @@
|
||||
<ClCompile Include="main_thread.cpp" />
|
||||
<ClCompile Include="pqdif\include\cjson.c" />
|
||||
<ClCompile Include="pqdif\PQDIF.cpp" />
|
||||
<ClCompile Include="pqdif_semantic_ids.cpp" />
|
||||
<ClCompile Include="pqdif_thread_processor.cpp" />
|
||||
<ClCompile Include="PQSMsg.cpp" />
|
||||
</ItemGroup>
|
||||
@@ -306,6 +307,7 @@
|
||||
<ClInclude Include="pqdif\include\zconf.h" />
|
||||
<ClInclude Include="pqdif\include\zlib.h" />
|
||||
<ClInclude Include="pqdif\PQDIF.h" />
|
||||
<ClInclude Include="pqdif_semantic_ids.h" />
|
||||
<ClInclude Include="pqdif_thread_processor.h" />
|
||||
<ClInclude Include="PQSMsg.h" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
<Filter>pqdif\include</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="pqdif_thread_processor.cpp" />
|
||||
<ClCompile Include="pqdif_semantic_ids.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="client2.h" />
|
||||
@@ -675,6 +676,7 @@
|
||||
<Filter>pqdif\include</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="pqdif_thread_processor.h" />
|
||||
<ClInclude Include="pqdif_semantic_ids.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="cloudfront">
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
CPQDIF::CPQDIF()
|
||||
{
|
||||
// Init
|
||||
m_percont = (CPQDIF_PC_FlatFile *)theFactory.NewPersistController(PFPC_FlatFile);
|
||||
m_percont = (CPQDIF_PC_FlatFile*)theFactory.NewPersistController(PFPC_FlatFile);
|
||||
}
|
||||
|
||||
CPQDIF::~CPQDIF()
|
||||
@@ -61,7 +61,7 @@ bool CPQDIF::New()
|
||||
if (m_percont)
|
||||
delete m_percont;
|
||||
|
||||
m_percont = (CPQDIF_PC_FlatFile *)theFactory.NewPersistController(PFPC_FlatFile);
|
||||
m_percont = (CPQDIF_PC_FlatFile*)theFactory.NewPersistController(PFPC_FlatFile);
|
||||
|
||||
if (m_percont)
|
||||
ret = true;
|
||||
@@ -83,15 +83,15 @@ long CPQDIF::RecordGetCount()
|
||||
bool CPQDIF::RecordGetInfo
|
||||
(
|
||||
long index,
|
||||
GUID * tagRecordType,
|
||||
string & nameRecordType
|
||||
GUID* tagRecordType,
|
||||
string& nameRecordType
|
||||
)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
bool status = false;
|
||||
|
||||
CPQDIFRecord * prec;
|
||||
CPQDIFRecord* prec;
|
||||
GUID tagRecord;
|
||||
string nameTag;
|
||||
|
||||
@@ -107,11 +107,11 @@ bool CPQDIF::RecordGetInfo
|
||||
|
||||
// Return the data...
|
||||
// The GUID itself
|
||||
*tagRecordType=tagRecord;
|
||||
*tagRecordType = tagRecord;
|
||||
|
||||
// The GUID name
|
||||
nameTag = theInfo.GetNameOfTag(tagRecord);
|
||||
nameRecordType=nameTag;
|
||||
nameRecordType = nameTag;
|
||||
|
||||
|
||||
status = true;
|
||||
@@ -127,15 +127,38 @@ bool CPQDIF::RecordGetInfo
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CPQDIF::RecordRequestObservation(long index, long * pRecordObserv)
|
||||
bool CPQDIF::RecordRequestRecord(long index, long* pRecord)
|
||||
{
|
||||
if (pRecord == nullptr)
|
||||
return false;
|
||||
|
||||
bool status = false;
|
||||
try
|
||||
{
|
||||
CPQDIFRecord* prec = m_percont->GetRecordFull(index);
|
||||
if (prec)
|
||||
{
|
||||
*pRecord = (long)prec;
|
||||
status = true;
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
status = false;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF::RecordRequestObservation(long index, long* pRecordObserv)
|
||||
{
|
||||
|
||||
bool status = false;
|
||||
CPQDIFRecord * precBase;
|
||||
CPQDIFRecord * precCurrent = NULL;
|
||||
CPQDIFRecord * precDS = NULL;
|
||||
CPQDIFRecord * precSett = NULL;
|
||||
CPQDIF_R_Observation * pobs = NULL;
|
||||
CPQDIFRecord* precBase;
|
||||
CPQDIFRecord* precCurrent = NULL;
|
||||
CPQDIFRecord* precDS = NULL;
|
||||
CPQDIFRecord* precSett = NULL;
|
||||
CPQDIF_R_Observation* pobs = NULL;
|
||||
|
||||
GUID tagRecord;
|
||||
long idxRec;
|
||||
@@ -225,7 +248,7 @@ bool CPQDIF::ObservationGetInfo(long pRecordObserv, DATE& timeStart, string& nam
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
bool status = false;
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
TIMESTAMPPQDIF timeStartLocal;
|
||||
TIMESTAMPPQDIF timeCreateLocal;
|
||||
// string nameLocal;
|
||||
@@ -267,15 +290,15 @@ bool CPQDIF::ObservationGetInfo(long pRecordObserv, DATE& timeStart, string& nam
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CPQDIF::ObservationGetTriggerInfo(long pRecordObserv, long * idTriggerMethod, DATE * timeTriggered)
|
||||
bool CPQDIF::ObservationGetTriggerInfo(long pRecordObserv, long* idTriggerMethod, DATE* timeTriggered)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
bool status = false;
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
|
||||
UINT4 idTriggerMethodLocal;
|
||||
CPQDIF_E_Vector * pvectTriggerChanIdx = NULL;
|
||||
CPQDIF_E_Vector* pvectTriggerChanIdx = NULL;
|
||||
TIMESTAMPPQDIF timeTriggeredLocal;
|
||||
|
||||
*idTriggerMethod = -1;
|
||||
@@ -305,12 +328,12 @@ bool CPQDIF::ObservationGetTriggerInfo(long pRecordObserv, long * idTriggerMetho
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CPQDIF::ObservationGetChannelInfo(long pRecordObserv, long idxChannel, string &name, long * countSeries)
|
||||
bool CPQDIF::ObservationGetChannelInfo(long pRecordObserv, long idxChannel, string& name, long* countSeries)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
bool status = false;
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
|
||||
string nameLocal;
|
||||
UINT4 idPhaseLocal;
|
||||
@@ -348,10 +371,10 @@ bool CPQDIF::ObservationGetChannelInfo(long pRecordObserv, long idxChannel, stri
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CPQDIF::ObservationGetSeriesInfo3(long pRecordObserv, long idxChannel, long idxSeries, long * idQuantityUnits, GUID * idQuantityCharacteristic, GUID * idValueType)
|
||||
bool CPQDIF::ObservationGetSeriesInfo3(long pRecordObserv, long idxChannel, long idxSeries, long* idQuantityUnits, GUID* idQuantityCharacteristic, GUID* idValueType)
|
||||
{
|
||||
bool status = false;
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
|
||||
UINT4 idQuantityUnitsLocal;
|
||||
GUID idValueTypeLocal;
|
||||
@@ -367,8 +390,8 @@ bool CPQDIF::ObservationGetSeriesInfo3(long pRecordObserv, long idxChannel, long
|
||||
{
|
||||
// Translate information
|
||||
*idQuantityUnits = (long)idQuantityUnitsLocal;
|
||||
*idValueType=idValueTypeLocal;
|
||||
*idQuantityCharacteristic=idQuantityCharacteristicLocal;
|
||||
*idValueType = idValueTypeLocal;
|
||||
*idQuantityCharacteristic = idQuantityCharacteristicLocal;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -384,13 +407,13 @@ bool CPQDIF::ObservationGetSeriesInfo3(long pRecordObserv, long idxChannel, long
|
||||
}
|
||||
|
||||
//ע<><D7A2><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>double* <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ棬ʹ<E6A3AC><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ͷ<EFBFBD>
|
||||
bool CPQDIF::ObservationGetSeriesData(long pRecordObserv, long idxChannel, long idxSeries, double ** values,long* varCount)
|
||||
bool CPQDIF::ObservationGetSeriesData(long pRecordObserv, long idxChannel, long idxSeries, double** values, long* varCount)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
bool status = false;
|
||||
CPQDIF_R_Observation * pobs;
|
||||
double * pvalues;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
double* pvalues;
|
||||
long countPoints;
|
||||
|
||||
try
|
||||
@@ -401,7 +424,7 @@ bool CPQDIF::ObservationGetSeriesData(long pRecordObserv, long idxChannel, long
|
||||
pvalues = pobs->NewResolvedSeries(idxChannel, idxSeries, countPoints);
|
||||
if (pvalues)
|
||||
{
|
||||
*values= pvalues;
|
||||
*values = pvalues;
|
||||
status = true;
|
||||
*varCount = countPoints;
|
||||
//delete[] pvalues;
|
||||
@@ -419,22 +442,22 @@ bool CPQDIF::ObservationGetSeriesData(long pRecordObserv, long idxChannel, long
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CPQDIF::ObservationGetChannelFreq(long pRecObs, long idxChannel, double * freq)
|
||||
bool CPQDIF::ObservationGetChannelFreq(long pRecObs, long idxChannel, double* freq)
|
||||
{
|
||||
bool status = false;
|
||||
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
|
||||
try
|
||||
{
|
||||
pobs = ValidateObservation(pRecObs);
|
||||
if (pobs)
|
||||
{
|
||||
CPQDIF_E_Collection * pcol = pobs->GetOneChannel(idxChannel);
|
||||
CPQDIF_E_Collection* pcol = pobs->GetOneChannel(idxChannel);
|
||||
|
||||
if (pcol)
|
||||
{
|
||||
CPQDIF_E_Scalar * psc = pobs->FindScalarInCollection(pcol, tagChannelFrequency);
|
||||
CPQDIF_E_Scalar* psc = pobs->FindScalarInCollection(pcol, tagChannelFrequency);
|
||||
if (psc)
|
||||
{
|
||||
double val;
|
||||
@@ -457,23 +480,23 @@ bool CPQDIF::ObservationGetChannelFreq(long pRecObs, long idxChannel, double * f
|
||||
return status;
|
||||
}
|
||||
|
||||
bool CPQDIF::ObservationGetChannelGroupID(long pRecObs, long idxChannel, int *GroupID)
|
||||
bool CPQDIF::ObservationGetChannelGroupID(long pRecObs, long idxChannel, int* GroupID)
|
||||
{
|
||||
|
||||
bool status = false;
|
||||
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
|
||||
try
|
||||
{
|
||||
pobs = ValidateObservation(pRecObs);
|
||||
if (pobs)
|
||||
{
|
||||
CPQDIF_E_Collection * pcol = pobs->GetOneChannel(idxChannel);
|
||||
CPQDIF_E_Collection* pcol = pobs->GetOneChannel(idxChannel);
|
||||
|
||||
if (pcol)
|
||||
{
|
||||
CPQDIF_E_Scalar * psc = pobs->FindScalarInCollection(pcol, tagChannelGroupID);
|
||||
CPQDIF_E_Scalar* psc = pobs->FindScalarInCollection(pcol, tagChannelGroupID);
|
||||
if (psc)
|
||||
{
|
||||
INT2 val = 0;
|
||||
@@ -511,11 +534,11 @@ bool CPQDIF::ObservationGetChannelGroupID(long pRecObs, long idxChannel, int *Gr
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF::ObservationGetSeriesPhasicType(long pRecordObserv, long idxChannel, long idxSeries, long *valuetypes)
|
||||
bool CPQDIF::ObservationGetSeriesPhasicType(long pRecordObserv, long idxChannel, long idxSeries, long* valuetypes)
|
||||
{
|
||||
|
||||
bool status = false;
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -541,13 +564,13 @@ bool CPQDIF::ObservationGetSeriesPhasicType(long pRecordObserv, long idxChannel,
|
||||
}
|
||||
|
||||
|
||||
bool CPQDIF::ObservationGetSeriesScale(long pRecObs, long idxChannel, long idxSeries, double * scale, double * offset)
|
||||
bool CPQDIF::ObservationGetSeriesScale(long pRecObs, long idxChannel, long idxSeries, double* scale, double* offset)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
bool status = false;
|
||||
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -573,7 +596,7 @@ bool CPQDIF::RecordReleaseObservation(long pRecordObserv)
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
bool status = false;
|
||||
CPQDIF_R_Observation * pobs;
|
||||
CPQDIF_R_Observation* pobs;
|
||||
|
||||
pobs = ValidateObservation(pRecordObserv);
|
||||
if (pobs)
|
||||
@@ -594,33 +617,33 @@ bool CPQDIF::SetDateFromTimeStamp(DATE& date, const TIMESTAMPPQDIF& ts)
|
||||
return true;
|
||||
}
|
||||
|
||||
CPQDIF_Element * CPQDIF::ValidateElement(long pElement)
|
||||
CPQDIF_Element* CPQDIF::ValidateElement(long pElement)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
CPQDIF_Element * pel;
|
||||
CPQDIF_Element* pel;
|
||||
|
||||
pel = (CPQDIF_Element *)pElement;
|
||||
pel = (CPQDIF_Element*)pElement;
|
||||
//ASSERT_VALID(pel);
|
||||
|
||||
return pel;
|
||||
}
|
||||
|
||||
|
||||
CPQDIF_E_Collection * CPQDIF::ValidateCollection(long pElement)
|
||||
CPQDIF_E_Collection* CPQDIF::ValidateCollection(long pElement)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
CPQDIF_Element * pel;
|
||||
CPQDIF_E_Collection * pcoll = NULL;
|
||||
CPQDIF_Element* pel;
|
||||
CPQDIF_E_Collection* pcoll = NULL;
|
||||
|
||||
pel = (CPQDIF_Element *)pElement;
|
||||
pel = (CPQDIF_Element*)pElement;
|
||||
//ASSERT_VALID(pel);
|
||||
if (pel)
|
||||
{
|
||||
if (pel->GetElementType() == ID_ELEMENT_TYPE_COLLECTION)
|
||||
{
|
||||
pcoll = (CPQDIF_E_Collection *)pel;
|
||||
pcoll = (CPQDIF_E_Collection*)pel;
|
||||
//ASSERT_VALID(pcoll);
|
||||
}
|
||||
}
|
||||
@@ -637,20 +660,20 @@ CPQDIF_E_Collection * CPQDIF::ValidateCollection(long pElement)
|
||||
// Valid object pointer The object is valid and of the correct type
|
||||
// NULL The object is invalid or has an incorrect type
|
||||
//
|
||||
CPQDIF_E_Scalar * CPQDIF::ValidateScalar(long pElement)
|
||||
CPQDIF_E_Scalar* CPQDIF::ValidateScalar(long pElement)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
CPQDIF_Element * pel;
|
||||
CPQDIF_E_Scalar * pscalar = NULL;
|
||||
CPQDIF_Element* pel;
|
||||
CPQDIF_E_Scalar* pscalar = NULL;
|
||||
|
||||
pel = (CPQDIF_Element *)pElement;
|
||||
pel = (CPQDIF_Element*)pElement;
|
||||
//ASSERT_VALID(pel);
|
||||
if (pel)
|
||||
{
|
||||
if (pel->GetElementType() == ID_ELEMENT_TYPE_SCALAR)
|
||||
{
|
||||
pscalar = (CPQDIF_E_Scalar *)pel;
|
||||
pscalar = (CPQDIF_E_Scalar*)pel;
|
||||
//ASSERT_VALID(pscalar);
|
||||
}
|
||||
}
|
||||
@@ -667,20 +690,20 @@ CPQDIF_E_Scalar * CPQDIF::ValidateScalar(long pElement)
|
||||
// Valid object pointer The object is valid and of the correct type
|
||||
// NULL The object is invalid or has an incorrect type
|
||||
//
|
||||
CPQDIF_E_Vector * CPQDIF::ValidateVector(long pElement)
|
||||
CPQDIF_E_Vector* CPQDIF::ValidateVector(long pElement)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
CPQDIF_Element * pel;
|
||||
CPQDIF_E_Vector * pvector = NULL;
|
||||
CPQDIF_Element* pel;
|
||||
CPQDIF_E_Vector* pvector = NULL;
|
||||
|
||||
pel = (CPQDIF_Element *)pElement;
|
||||
pel = (CPQDIF_Element*)pElement;
|
||||
//ASSERT_VALID(pel);
|
||||
if (pel)
|
||||
{
|
||||
if (pel->GetElementType() == ID_ELEMENT_TYPE_VECTOR)
|
||||
{
|
||||
pvector = (CPQDIF_E_Vector *)pel;
|
||||
pvector = (CPQDIF_E_Vector*)pel;
|
||||
//ASSERT_VALID(pvector);
|
||||
}
|
||||
}
|
||||
@@ -697,22 +720,22 @@ CPQDIF_E_Vector * CPQDIF::ValidateVector(long pElement)
|
||||
// Valid object pointer The object is valid and of the correct type
|
||||
// NULL The object is invalid or has an incorrect type
|
||||
//
|
||||
CPQDIF_R_Observation * CPQDIF::ValidateObservation(long pRecObserv)
|
||||
CPQDIF_R_Observation* CPQDIF::ValidateObservation(long pRecObserv)
|
||||
{
|
||||
// AFX_MANAGE_STATE(AfxGetStaticModuleState())
|
||||
|
||||
CPQDIFRecord * prec;
|
||||
CPQDIF_R_Observation * pobs = NULL;
|
||||
CPQDIFRecord* prec;
|
||||
CPQDIF_R_Observation* pobs = NULL;
|
||||
GUID tagThisRecord;
|
||||
|
||||
prec = (CPQDIFRecord *)pRecObserv;
|
||||
prec = (CPQDIFRecord*)pRecObserv;
|
||||
//ASSERT_VALID(prec);
|
||||
if (prec)
|
||||
{
|
||||
prec->HeaderGetTag(tagThisRecord);
|
||||
if (PQDIF_IsEqualGUID(tagThisRecord, tagRecObservation))
|
||||
{
|
||||
pobs = (CPQDIF_R_Observation *)prec;
|
||||
pobs = (CPQDIF_R_Observation*)prec;
|
||||
//ASSERT_VALID(pobs);
|
||||
}
|
||||
}
|
||||
@@ -720,7 +743,7 @@ CPQDIF_R_Observation * CPQDIF::ValidateObservation(long pRecObserv)
|
||||
return pobs;
|
||||
}
|
||||
|
||||
void testjson()
|
||||
void testjson()
|
||||
{
|
||||
//{ "emspq1":[{ "type":1,"min":"{str}" },{ "type":2,"min":"{str2}" }],"emspq2":[{ "type":3,"min":"{str3}" },{ "type":4,"min":"{str4}" }] }
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -806,7 +829,7 @@ char* CDeal::AssJson(char* Id) //
|
||||
{
|
||||
i = getCurrentGroup(stringToTimeT(dataDate), it->second);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
i = getCurrentGroup(stringToTimeT(dataDate), aggCydeMin);
|
||||
}
|
||||
@@ -959,7 +982,7 @@ char* CDeal::AssJson(char* Id) //
|
||||
cJSON_AddStringToObject(emspq1_obj1, item->KeyName.c_str(), count_str.c_str());
|
||||
}
|
||||
}
|
||||
if (item->Type == "Null")
|
||||
if (item->Type == "Null")
|
||||
{
|
||||
if (item->DateName == "monitorId") //<2F><><EFBFBD><EFBFBD> ID
|
||||
{
|
||||
@@ -1064,7 +1087,7 @@ void CDeal::CheckDataTableList()
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
for (std::list<CItem*>::iterator itemIt = seq->DateItemList.begin(); itemIt != seq->DateItemList.end(); ++itemIt) {
|
||||
CItem* item = *itemIt;
|
||||
if (item->Type == "Null")
|
||||
if (item->Type == "Null")
|
||||
{
|
||||
{
|
||||
std::string str = item->DateName;
|
||||
@@ -1331,7 +1354,7 @@ void CDeal::ResJsonCfg(char* json)
|
||||
str_data_name.replace(pos, 1, seq);
|
||||
}
|
||||
int start = 0, end = 0;
|
||||
if (ExtractNumbersBetweenPercent(str_data_name,start,end))
|
||||
if (ExtractNumbersBetweenPercent(str_data_name, start, end))
|
||||
{
|
||||
//printf(" Item: start=%d, end=%d\n", start,end);
|
||||
for (int i = start; i <= end; i++) {
|
||||
@@ -1361,7 +1384,7 @@ void CDeal::ResJsonCfg(char* json)
|
||||
//printf(" Item: KeyName=%s, DataName=%s, Type=%s\n", str_key_name_temp.c_str(), str_data_name_temp.c_str(), type);
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
CItem* citem = new CItem(key_name, str_data_name.c_str(), type);
|
||||
cseq->DateItemList.push_back(citem);
|
||||
@@ -1395,7 +1418,7 @@ std::string CDeal::convertToDateOnly(const std::string& dateTime) {
|
||||
return dateTime; // <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5>ո<D5B8><F1A3ACB7><EFBFBD>ԭ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>̫<EFBFBD><CCAB><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
int CDeal::getCurrentGroup(const std::time_t& currentTime,int min) {
|
||||
int CDeal::getCurrentGroup(const std::time_t& currentTime, int min) {
|
||||
// <20><>time_tת<74><D7AA>Ϊtm<74>ṹ<EFBFBD><E1B9B9>
|
||||
std::tm* localTime = std::localtime(¤tTime);
|
||||
|
||||
@@ -1432,7 +1455,7 @@ std::time_t CDeal::stringToTimeT(const std::string& dateTime) {
|
||||
return currentTime;
|
||||
}
|
||||
|
||||
void CDeal::clear()
|
||||
void CDeal::clear()
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD>AvgData<74><61>ͬʱ<CDAC>ͷ<EFBFBD>list<double><3E>е<EFBFBD><D0B5>ڴ棨<DAB4><E6A3A8><EFBFBD><EFBFBD><EFBFBD>еĻ<D0B5><C4BB><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>list<double><3E><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ֶ<EFBFBD><D6B6>ͷţ<CDB7>
|
||||
AvgData.clear();
|
||||
|
||||
@@ -51,7 +51,7 @@ struct PqdifSeriesInfoEx
|
||||
double offset = 0.0; // ƫ<><C6AB>
|
||||
};
|
||||
|
||||
class CPQDIF
|
||||
class CPQDIF
|
||||
{
|
||||
public:
|
||||
CPQDIF();
|
||||
@@ -66,19 +66,20 @@ public:
|
||||
bool RecordGetInfo
|
||||
(
|
||||
long index,
|
||||
GUID * tagRecordType,
|
||||
string & nameRecordType
|
||||
GUID* tagRecordType,
|
||||
string& nameRecordType
|
||||
);
|
||||
bool RecordRequestObservation(long index, long * pRecordObserv);
|
||||
bool RecordRequestRecord(long index, long* pRecord);
|
||||
bool RecordRequestObservation(long index, long* pRecordObserv);
|
||||
bool ObservationGetInfo(long pRecordObserv, DATE& timeStart, string& name, long& countChannels);
|
||||
bool ObservationGetTriggerInfo(long pRecordObserv, long * idTriggerMethod, DATE * timeTriggered);
|
||||
bool ObservationGetChannelInfo(long pRecordObserv, long idxChannel, string &name, long * countSeries);
|
||||
bool ObservationGetSeriesInfo3(long pRecordObserv, long idxChannel, long idxSeries, long * idQuantityUnits, GUID * idQuantityCharacteristic, GUID * idValueType);
|
||||
bool ObservationGetSeriesData(long pRecordObserv, long idxChannel, long idxSeries, double ** values, long* varCount);
|
||||
bool ObservationGetChannelFreq(long pRecObs, long idxChannel, double * freq);
|
||||
bool ObservationGetChannelGroupID(long pRecObs, long idxChannel, int *GroupID);
|
||||
bool ObservationGetSeriesPhasicType(long pRecordObserv, long idxChannel, long idxSeries, long *valuetypes);
|
||||
bool ObservationGetSeriesScale(long pRecObs, long idxChannel, long idxSeries, double * scale, double * offset);
|
||||
bool ObservationGetTriggerInfo(long pRecordObserv, long* idTriggerMethod, DATE* timeTriggered);
|
||||
bool ObservationGetChannelInfo(long pRecordObserv, long idxChannel, string& name, long* countSeries);
|
||||
bool ObservationGetSeriesInfo3(long pRecordObserv, long idxChannel, long idxSeries, long* idQuantityUnits, GUID* idQuantityCharacteristic, GUID* idValueType);
|
||||
bool ObservationGetSeriesData(long pRecordObserv, long idxChannel, long idxSeries, double** values, long* varCount);
|
||||
bool ObservationGetChannelFreq(long pRecObs, long idxChannel, double* freq);
|
||||
bool ObservationGetChannelGroupID(long pRecObs, long idxChannel, int* GroupID);
|
||||
bool ObservationGetSeriesPhasicType(long pRecordObserv, long idxChannel, long idxSeries, long* valuetypes);
|
||||
bool ObservationGetSeriesScale(long pRecObs, long idxChannel, long idxSeries, double* scale, double* offset);
|
||||
bool RecordReleaseObservation(long pRecordObserv);
|
||||
|
||||
// <20><>ȡ Observation <20><>ij<EFBFBD><C4B3>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>ǩ<EFBFBD><C7A9>Ϣ
|
||||
@@ -88,18 +89,18 @@ public:
|
||||
bool ObservationGetSeriesInfoEx(long pRecordObserv, long idxChannel, long idxSeries, PqdifSeriesInfoEx* out);
|
||||
// Internal
|
||||
protected:
|
||||
CPQDIF_Element * ValidateElement(long pElement);
|
||||
CPQDIF_E_Collection * ValidateCollection(long pElement);
|
||||
CPQDIF_E_Scalar * ValidateScalar(long pElement);
|
||||
CPQDIF_E_Vector * ValidateVector(long pElement);
|
||||
CPQDIF_R_Observation * ValidateObservation(long pRecObserv);
|
||||
CPQDIF_R_DataSource * ValidateDataSource(long pRecDS);
|
||||
CPQDIF_R_Settings * ValidateSettings(long pRecSettings);
|
||||
CPQDIF_R_Container* ValidateContainer(long pRecCon);
|
||||
CPQDIF_Element* ValidateElement(long pElement);
|
||||
CPQDIF_E_Collection* ValidateCollection(long pElement);
|
||||
CPQDIF_E_Scalar* ValidateScalar(long pElement);
|
||||
CPQDIF_E_Vector* ValidateVector(long pElement);
|
||||
CPQDIF_R_Observation* ValidateObservation(long pRecObserv);
|
||||
CPQDIF_R_DataSource* ValidateDataSource(long pRecDS);
|
||||
CPQDIF_R_Settings* ValidateSettings(long pRecSettings);
|
||||
CPQDIF_R_Container* ValidateContainer(long pRecCon);
|
||||
bool SetDateFromTimeStamp(DATE& date, const TIMESTAMPPQDIF& ts);
|
||||
// Member data
|
||||
private:
|
||||
CPQDIF_PC_FlatFile * m_percont; // Persistence controller
|
||||
CPQDIF_PC_FlatFile* m_percont; // Persistence controller
|
||||
|
||||
};
|
||||
|
||||
@@ -162,7 +163,7 @@ public:
|
||||
cJSON* cJSON_GetObjectItemCaseSensitive(cJSON* object, const char* string);//json<6F>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȡֵ
|
||||
bool ExtractNumbersBetweenPercent(const std::string& str, int& start, int& end);
|
||||
std::string convertToDateOnly(const std::string& dateTime);
|
||||
int getCurrentGroup(const std::time_t& currentTime,int min);
|
||||
int getCurrentGroup(const std::time_t& currentTime, int min);
|
||||
std::time_t stringToTimeT(const std::string& dateTime);
|
||||
|
||||
std::list<CTable*> DataTableList;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
||||
|
||||
506
LFtid1056/pqdif_semantic_ids.cpp
Normal file
506
LFtid1056/pqdif_semantic_ids.cpp
Normal file
@@ -0,0 +1,506 @@
|
||||
#include "pqdif_semantic_ids.h"
|
||||
|
||||
#include <cstdio>
|
||||
#include <sstream>
|
||||
|
||||
namespace pqdif_sem
|
||||
{
|
||||
|
||||
// ============================================================================
|
||||
// GUID <20><><EFBFBD><EFBFBD>
|
||||
// ============================================================================
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>̶<CDB9><CCB6><EFBFBD>
|
||||
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2 / B.3 / B.4 + pqdif/include/pqdif_id.h
|
||||
// ============================================================================
|
||||
|
||||
const UIntSemanticEntry kPhaseTable[] = {
|
||||
{ ID_PHASE_NONE, "ID_PHASE_NONE", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagPhaseID", "δָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
|
||||
{ ID_PHASE_AN, "ID_PHASE_AN", "A-N", "tagPhaseID", "A <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
|
||||
{ ID_PHASE_BN, "ID_PHASE_BN", "B-N", "tagPhaseID", "B <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
|
||||
{ ID_PHASE_CN, "ID_PHASE_CN", "C-N", "tagPhaseID", "C <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
|
||||
{ ID_PHASE_NG, "ID_PHASE_NG", "N-G", "tagPhaseID", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶Ե<EFBFBD>" },
|
||||
{ ID_PHASE_AB, "ID_PHASE_AB", "A-B", "tagPhaseID", "A-B <20><><EFBFBD><EFBFBD>" },
|
||||
{ ID_PHASE_BC, "ID_PHASE_BC", "B-C", "tagPhaseID", "B-C <20><><EFBFBD><EFBFBD>" },
|
||||
{ ID_PHASE_CA, "ID_PHASE_CA", "C-A", "tagPhaseID", "C-A <20><><EFBFBD><EFBFBD>" },
|
||||
{ ID_PHASE_RES, "ID_PHASE_RES", "ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagPhaseID", "Residual" },
|
||||
{ ID_PHASE_NET, "ID_PHASE_NET", "<EFBFBD><EFBFBD>ֵ", "tagPhaseID", "Net" },
|
||||
{ ID_PHASE_TOTAL, "ID_PHASE_TOTAL", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagPhaseID", "Total" },
|
||||
{ ID_PHASE_LN_AVE, "ID_PHASE_LN_AVE", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹƽ<EFBFBD><EFBFBD>", "tagPhaseID", "LN average" },
|
||||
{ ID_PHASE_LL_AVE, "ID_PHASE_LL_AVE", "<EFBFBD>ߵ<EFBFBD>ѹƽ<EFBFBD><EFBFBD>", "tagPhaseID", "LL average" },
|
||||
{ ID_PHASE_WORST, "ID_PHASE_WORST", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagPhaseID", "Worst phase" },
|
||||
{ ID_PHASE_PLUS, "ID_PHASE_PLUS", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagPhaseID", "Plus / forward" },
|
||||
{ ID_PHASE_MINUS, "ID_PHASE_MINUS", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagPhaseID", "Minus / reverse" },
|
||||
|
||||
{ ID_PHASE_GENERAL_1, "ID_PHASE_GENERAL_1", "ͨ<EFBFBD><EFBFBD>1", "tagPhaseID", "General slot 1" },
|
||||
{ ID_PHASE_GENERAL_2, "ID_PHASE_GENERAL_2", "ͨ<EFBFBD><EFBFBD>2", "tagPhaseID", "General slot 2" },
|
||||
{ ID_PHASE_GENERAL_3, "ID_PHASE_GENERAL_3", "ͨ<EFBFBD><EFBFBD>3", "tagPhaseID", "General slot 3" },
|
||||
{ ID_PHASE_GENERAL_4, "ID_PHASE_GENERAL_4", "ͨ<EFBFBD><EFBFBD>4", "tagPhaseID", "General slot 4" },
|
||||
{ ID_PHASE_GENERAL_5, "ID_PHASE_GENERAL_5", "ͨ<EFBFBD><EFBFBD>5", "tagPhaseID", "General slot 5" },
|
||||
{ ID_PHASE_GENERAL_6, "ID_PHASE_GENERAL_6", "ͨ<EFBFBD><EFBFBD>6", "tagPhaseID", "General slot 6" },
|
||||
{ ID_PHASE_GENERAL_7, "ID_PHASE_GENERAL_7", "ͨ<EFBFBD><EFBFBD>7", "tagPhaseID", "General slot 7" },
|
||||
{ ID_PHASE_GENERAL_8, "ID_PHASE_GENERAL_8", "ͨ<EFBFBD><EFBFBD>8", "tagPhaseID", "General slot 8" },
|
||||
{ ID_PHASE_GENERAL_9, "ID_PHASE_GENERAL_9", "ͨ<EFBFBD><EFBFBD>9", "tagPhaseID", "General slot 9" },
|
||||
{ ID_PHASE_GENERAL_10, "ID_PHASE_GENERAL_10", "ͨ<EFBFBD><EFBFBD>10", "tagPhaseID", "General slot 10" },
|
||||
{ ID_PHASE_GENERAL_11, "ID_PHASE_GENERAL_11", "ͨ<EFBFBD><EFBFBD>11", "tagPhaseID", "General slot 11" },
|
||||
{ ID_PHASE_GENERAL_12, "ID_PHASE_GENERAL_12", "ͨ<EFBFBD><EFBFBD>12", "tagPhaseID", "General slot 12" },
|
||||
{ ID_PHASE_GENERAL_13, "ID_PHASE_GENERAL_13", "ͨ<EFBFBD><EFBFBD>13", "tagPhaseID", "General slot 13" },
|
||||
{ ID_PHASE_GENERAL_14, "ID_PHASE_GENERAL_14", "ͨ<EFBFBD><EFBFBD>14", "tagPhaseID", "General slot 14" },
|
||||
{ ID_PHASE_GENERAL_15, "ID_PHASE_GENERAL_15", "ͨ<EFBFBD><EFBFBD>15", "tagPhaseID", "General slot 15" },
|
||||
{ ID_PHASE_GENERAL_16, "ID_PHASE_GENERAL_16", "ͨ<EFBFBD><EFBFBD>16", "tagPhaseID", "General slot 16" }
|
||||
};
|
||||
const std::size_t kPhaseTableSize = sizeof(kPhaseTable) / sizeof(kPhaseTable[0]);
|
||||
|
||||
const UIntSemanticEntry kQuantityMeasuredTable[] = {
|
||||
{ ID_QM_NONE, "ID_QM_NONE", "δָ<EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "δָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
|
||||
{ ID_QM_VOLTAGE, "ID_QM_VOLTAGE", "<EFBFBD><EFBFBD>ѹ", "tagQuantityMeasuredID", "Voltage" },
|
||||
{ ID_QM_CURRENT, "ID_QM_CURRENT", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Current" },
|
||||
{ ID_QM_POWER, "ID_QM_POWER", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Power" },
|
||||
{ ID_QM_ENERGY, "ID_QM_ENERGY", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Energy" },
|
||||
{ ID_QM_TEMPERATURE, "ID_QM_TEMPERATURE", "<EFBFBD>¶<EFBFBD>", "tagQuantityMeasuredID", "Temperature" },
|
||||
{ ID_QM_PRESSURE, "ID_QM_PRESSURE", "ѹ<EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Pressure" },
|
||||
{ ID_QM_CHARGE, "ID_QM_CHARGE", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Charge" },
|
||||
{ ID_QM_EFIELD, "ID_QM_EFIELD", "<EFBFBD>糡", "tagQuantityMeasuredID", "Electric field" },
|
||||
{ ID_QM_MFIELD, "ID_QM_MFIELD", "<EFBFBD>ų<EFBFBD>", "tagQuantityMeasuredID", "Magnetic field" },
|
||||
{ ID_QM_VELOCITY, "ID_QM_VELOCITY", "<EFBFBD>ٶ<EFBFBD>", "tagQuantityMeasuredID", "Velocity" },
|
||||
{ ID_QM_BEARING, "ID_QM_BEARING", "<EFBFBD><EFBFBD>λ", "tagQuantityMeasuredID", "Bearing" },
|
||||
{ ID_QM_FORCE, "ID_QM_FORCE", "<EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Force" },
|
||||
{ ID_QM_TORQUE, "ID_QM_TORQUE", "ת<EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Torque" },
|
||||
{ ID_QM_POSITION, "ID_QM_POSITION", "λ<EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Position" },
|
||||
{ ID_QM_FLUXLINKAGE, "ID_QM_FLUXLINKAGE", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Flux linkage" },
|
||||
{ ID_QM_FLUXDENSITY, "ID_QM_FLUXDENSITY", "<EFBFBD><EFBFBD>ͨ<EFBFBD>ܶ<EFBFBD>", "tagQuantityMeasuredID", "Flux density" },
|
||||
{ ID_QM_STATUS, "ID_QM_STATUS", "״̬<EFBFBD><EFBFBD>", "tagQuantityMeasuredID", "Status quantity" }
|
||||
};
|
||||
const std::size_t kQuantityMeasuredTableSize = sizeof(kQuantityMeasuredTable) / sizeof(kQuantityMeasuredTable[0]);
|
||||
|
||||
const UIntSemanticEntry kQuantityUnitsTable[] = {
|
||||
{ ID_QU_NONE, "ID_QU_NONE", "<EFBFBD><EFBFBD>λ", "tagQuantityUnitsID", "No unit" },
|
||||
{ ID_QU_TIMESTAMP, "ID_QU_TIMESTAMP", "ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityUnitsID", "Timestamp" },
|
||||
{ ID_QU_SECONDS, "ID_QU_SECONDS", "<EFBFBD><EFBFBD>", "tagQuantityUnitsID", "Seconds" },
|
||||
{ ID_QU_CYCLES, "ID_QU_CYCLES", "<EFBFBD>ܲ<EFBFBD>", "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", "<EFBFBD><EFBFBD>", "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", "<EFBFBD><EFBFBD>", "tagQuantityUnitsID", "Celsius" },
|
||||
{ ID_QU_DEGREES, "ID_QU_DEGREES", "<EFBFBD><EFBFBD>", "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<EFBFBD><EFBFBD>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<EFBFBD><EFBFBD>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", "ֱ<EFBFBD>Ӵ<EFBFBD>ֵ", "tagStorageMethodID", "SeriesValues ֱ<>ӱ<EFBFBD><D3B1><EFBFBD>ԭʼֵ" },
|
||||
{ ID_SERIES_METHOD_SCALED, "ID_SERIES_METHOD_SCALED", "<EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD>ֵ", "tagStorageMethodID", "<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> scale/offset <20><><EFBFBD><EFBFBD>" },
|
||||
{ ID_SERIES_METHOD_INCREMENT, "ID_SERIES_METHOD_INCREMENT", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ", "tagStorageMethodID", "<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>ԭ" }
|
||||
};
|
||||
const std::size_t kStorageMethodTableSize = sizeof(kStorageMethodTable) / sizeof(kStorageMethodTable[0]);
|
||||
|
||||
const UIntSemanticEntry kTriggerMethodTable[] = {
|
||||
{ ID_TRIGGER_METH_NONE, "ID_TRIGGER_METH_NONE", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagTriggerMethodID", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ" },
|
||||
{ ID_TRIGGER_METH_CHANNEL, "ID_TRIGGER_METH_CHANNEL", "ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagTriggerMethodID", "<EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
|
||||
{ ID_TRIGGER_METH_PERIODIC, "ID_TRIGGER_METH_PERIODIC", "<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>", "tagTriggerMethodID", "<EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>/<2F><>¼" },
|
||||
{ ID_TRIGGER_METH_EXTERNAL, "ID_TRIGGER_METH_EXTERNAL", "<EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagTriggerMethodID", "<EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
|
||||
{ ID_TRIGGER_METH_PERIODIC_STATS, "ID_TRIGGER_METH_PERIODIC_STATS", "ͳ<EFBFBD>ƴ<EFBFBD><EFBFBD><EFBFBD>", "tagTriggerMethodID", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> observation" }
|
||||
};
|
||||
const std::size_t kTriggerMethodTableSize = sizeof(kTriggerMethodTable) / sizeof(kTriggerMethodTable[0]);
|
||||
|
||||
// ============================================================================
|
||||
// GUID <20>̶<CDB9><CCB6><EFBFBD>
|
||||
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2 / B.4 + pqdif/include/pqdif_id.h
|
||||
// <20><><EFBFBD><EFBFBD>д GUID ֵ<><D6B5>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pqdif_id.h <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ============================================================================
|
||||
|
||||
#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<70><65>tagQuantityTypeID
|
||||
// ------------------------------
|
||||
const GuidSemanticEntry kQuantityTypeTable[] = {
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_WAVEFORM, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityTypeID", "<EFBFBD>㲨<EFBFBD>β<EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_VALUELOG, "ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>־", "tagQuantityTypeID", "ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD>/<2F><><EFBFBD>Ƽ<EFBFBD>¼<EFBFBD><C2BC>ͳ<EFBFBD><CDB3>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ѡ"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_PHASOR, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityTypeID", "<EFBFBD><EFBFBD>ֵ/<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_RESPONSE, "<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityTypeID", "Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_FLASH, "<EFBFBD><EFBFBD><EFBFBD>䶨λ", "tagQuantityTypeID", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>/<2F><>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_HISTOGRAM, "ֱ<EFBFBD><EFBFBD>ͼ", "tagQuantityTypeID", "BINLOW/BINHIGH/BINID/COUNT"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_HISTOGRAM3D, "<EFBFBD><EFBFBD>άֱ<EFBFBD><EFBFBD>ͼ", "tagQuantityTypeID", "X/Y ˫ά BIN + COUNT"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_CPF, "<EFBFBD>ۼƸ<EFBFBD><EFBFBD><EFBFBD>", "tagQuantityTypeID", "PROB + VAL"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_XY, "XY <20><><EFBFBD><EFBFBD>", "tagQuantityTypeID", "˫ֵ<EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_MAGDUR, "<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>", "tagQuantityTypeID", "VAL + DURATION"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_XYZ, "XYZ <20><><EFBFBD><EFBFBD>", "tagQuantityTypeID", "<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_MAGDURTIME, "ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>", "tagQuantityTypeID", "TIME + VAL + DURATION"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityType, ID_QT_MAGDURCOUNT, "ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityTypeID", "TIME + VAL + DURATION + COUNT")
|
||||
};
|
||||
const std::size_t kQuantityTypeTableSize = sizeof(kQuantityTypeTable) / sizeof(kQuantityTypeTable[0]);
|
||||
|
||||
// ------------------------------
|
||||
// ValueType<70><65>tagValueTypeID
|
||||
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB> PDF <20><> B.2 <20><><EFBFBD><EFBFBD>ȷ<EFBFBD>г<EFBFBD><D0B3><EFBFBD> pqdif_id.h <20>д<EFBFBD><D0B4>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>
|
||||
// ------------------------------
|
||||
const GuidSemanticEntry kValueTypeTable[] = {
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_VAL, "ֵ", "tagValueTypeID", "Ĭ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_TIME, "ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_MIN, "<EFBFBD><EFBFBD>Сֵ", "tagValueTypeID", "ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_MAX, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ", "tagValueTypeID", "ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_AVG, "ƽ<EFBFBD><EFBFBD>ֵ", "tagValueTypeID", "ͳ<EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD>ֵ"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_INST, "˲ʱֵ", "tagValueTypeID", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD> VAL"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PHASEANGLE, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VAL <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PHASEANGLE_MIN, "<EFBFBD><EFBFBD>Сֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "<EFBFBD><EFBFBD>Ӧ MIN <20><><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PHASEANGLE_MAX, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "<EFBFBD><EFBFBD>Ӧ MAX <20><><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PHASEANGLE_AVG, "ƽ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "<EFBFBD><EFBFBD>Ӧ AVG <20><><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_AREA, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_LATITUDE, "γ<EFBFBD><EFBFBD>", "tagValueTypeID", "Latitude"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_DURATION, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>", "tagValueTypeID", "Duration"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_LONGITUDE, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "Longitude"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_POLARITY, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "Polarity"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_BINID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "Histogram bin id"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_BINHIGH, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>", "tagValueTypeID", "Histogram bin high"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_BINLOW, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>", "tagValueTypeID", "Histogram bin low"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_XBINHIGH, "X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>", "tagValueTypeID", "3D histogram X high"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_XBINLOW, "X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>", "tagValueTypeID", "3D histogram X low"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_YBINHIGH, "Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>", "tagValueTypeID", "3D histogram Y high"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_YBINLOW, "Y<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>", "tagValueTypeID", "3D histogram Y low"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_COUNT, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_TRANSITION, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "VALUELOG <20><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_PROB, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "<EFBFBD>ۼƸ<EFBFBD><EFBFBD>ʰٷֱ<EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_INTERVAL, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagValueTypeID", "ͳ<EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>ֵ"),
|
||||
GUID_ENTRY(GuidSemanticField::ValueType, ID_SERIES_VALUE_TYPE_STATUS, "״̬", "tagValueTypeID", "״ֵ̬/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
||||
};
|
||||
const std::size_t kValueTypeTableSize = sizeof(kValueTypeTable) / sizeof(kValueTypeTable[0]);
|
||||
|
||||
// ------------------------------
|
||||
// QuantityCharacteristic<69><63>tagQuantityCharacteristicID
|
||||
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>á<EFBFBD><C3A1><EFBFBD><EFBFBD><EFBFBD> PDF <20><> B.2 <20><> pqdif_id.h <20>п<EFBFBD>ֱ<EFBFBD>Ӷ<EFBFBD><D3B6>ϵ<EFBFBD><CFB5>
|
||||
// ------------------------------
|
||||
const GuidSemanticEntry kQuantityCharacteristicTable[] = {
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_NONE, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_INSTANTANEOUS, "˲ʱ", "tagQuantityCharacteristicID", "Instantaneous f(t)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SPECTRA, "Ƶ<EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Spectra F(F)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_PEAK, "<EFBFBD><EFBFBD>ֵ", "tagQuantityCharacteristicID", "Peak value"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_RMS, "<EFBFBD><EFBFBD>Чֵ", "tagQuantityCharacteristicID", "RMS value"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_HRMS, "г<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чֵ", "tagQuantityCharacteristicID", "Harmonic RMS"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FREQUENCY, "Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Frequency"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TOTAL_THD, "<EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Total harmonic distortion (%)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_EVEN_THD, "ż<EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Even harmonic distortion (%)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_ODD_THD, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Odd harmonic distortion (%)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_CREST_FACTOR, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Crest factor"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FORM_FACTOR, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Form factor"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_ARITH_SUM, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Arithmetic sum"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_S0S1, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Zero sequence component unbalance (%)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_S2S1, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Negative sequence component unbalance (%)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SPOS, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Positive sequence component"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SNEG, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Negative sequence component"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SZERO, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Zero sequence component"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_AVG_IMBAL, "ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Imbalance by max deviation from average"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TOTAL_THD_RMS, "<EFBFBD><EFBFBD> THD(RMS)", "tagQuantityCharacteristicID", "Total THD normalized to RMS"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_ODD_THD_RMS, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> THD(RMS)", "tagQuantityCharacteristicID", "Odd THD normalized to RMS"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_EVEN_THD_RMS, "ż<EFBFBD><EFBFBD> THD(RMS)", "tagQuantityCharacteristicID", "Even THD normalized to RMS"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TID, "<EFBFBD>ܼ<EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Total Interharmonic Distortion"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TID_RMS, "<EFBFBD>ܼ<EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(RMS)", "tagQuantityCharacteristicID", "Total Interharmonic Distortion normalized to RMS"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_IHRMS, "<EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чֵ", "tagQuantityCharacteristicID", "Interharmonic RMS"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SPECTRA_HGROUP, "<EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Spectra by Harmonic Group index"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_SPECTRA_IGROUP, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>","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, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ", "tagQuantityCharacteristicID", "Flicker average RMS value"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_MAX_DVV, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dV/V", "tagQuantityCharacteristicID", "dV/V base"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_FREQ_MAX, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Frequency of maximum flicker harmonic"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_MAG_MAX, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ", "tagQuantityCharacteristicID", "Magnitude of maximum flicker harmonic"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_WGT_AVG, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩƽ<EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Spectrum weighted average"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_SPECTRUM, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Flicker spectrum VRMS(F)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_PST, "<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Short Term Flicker"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_FLKR_PLT, "<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "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, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> PLT", "tagQuantityCharacteristicID", "Sliding PLT"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_IT, "IT", "tagQuantityCharacteristicID", "IT"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_RMS_DEMAND, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чֵ", "tagQuantityCharacteristicID", "RMS value of current for a demand interval"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_ANSI_TDF, "ANSI <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Transformer Derating Factor"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_K_FACTOR, "K <20><><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Transformer K Factor"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_TDD, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Total Demand Distortion"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_RMS_PEAK_DEMAND,"<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Peak Demand Current"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_P, "<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Real power (watts)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_Q, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Reactive power (VAR)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_S, "<EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Apparent power (VA)"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_PF, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "True Power Factor"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_DF, "λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Displacement factor"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_P_DEMAND, "<EFBFBD>й<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Real power demand"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_Q_DEMAND, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Reactive power demand"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_S_DEMAND, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Apparent power demand"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_DF_DEMAND, "λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Displacement factor demand"),
|
||||
GUID_ENTRY(GuidSemanticField::QuantityCharacteristic, ID_QC_PF_DEMAND, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagQuantityCharacteristicID", "Power factor demand")
|
||||
};
|
||||
const std::size_t kQuantityCharacteristicTableSize =
|
||||
sizeof(kQuantityCharacteristicTable) / sizeof(kQuantityCharacteristicTable[0]);
|
||||
|
||||
// ------------------------------
|
||||
// DisturbanceCategory<72><79>tagDisturbanceCategoryID
|
||||
// ͳ<><CDB3>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ͷ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EEB3A3><EFBFBD><EFBFBD>PDF <20><> B.4 Ҳ<>ܶ<EFBFBD><DCB6>ϵĻ<CFB5><C4BB><EFBFBD><EFBFBD>
|
||||
// ------------------------------
|
||||
const GuidSemanticEntry kDisturbanceCategoryTable[] = {
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_NONE, "<EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "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, "<EFBFBD><EFBFBD>ʱ RMS <20>仯", "tagDisturbanceCategoryID", "IEEE 1159 Long Duration RMS Variation"),
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_IMBALANCE, "<EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD>", "tagDisturbanceCategoryID", "IEEE 1159 Imbalance"),
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_POWERFREQVARIATION, "<EFBFBD><EFBFBD>Ƶ<EFBFBD>仯", "tagDisturbanceCategoryID", "IEEE 1159 Power Frequency Variation"),
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_VOLTAGEFLUCTUATION, "<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>", "tagDisturbanceCategoryID", "IEEE 1159 Voltage Fluctuation"),
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT, "<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>", "tagDisturbanceCategoryID", "IEEE 1159 Waveform Distortion"),
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT_HARMONIC, "г<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagDisturbanceCategoryID", "IEEE 1159 Harmonics Present"),
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT_INTERHARMONIC, "<EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagDisturbanceCategoryID", "IEEE 1159 Interharmonics Present"),
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT_NOTCHING, "ȱ<EFBFBD><EFBFBD>", "tagDisturbanceCategoryID", "IEEE 1159 Notching Present"),
|
||||
GUID_ENTRY(GuidSemanticField::DisturbanceCategory, ID_DISTURB_1159_WAVEDISTORT_NOISE, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "tagDisturbanceCategoryID", "IEEE 1159 Noise Present")
|
||||
};
|
||||
const std::size_t kDisturbanceCategoryTableSize =
|
||||
sizeof(kDisturbanceCategoryTable) / sizeof(kDisturbanceCategoryTable[0]);
|
||||
|
||||
#undef GUID_ENTRY
|
||||
|
||||
// ============================================================================
|
||||
// <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>
|
||||
// ============================================================================
|
||||
|
||||
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
|
||||
347
LFtid1056/pqdif_semantic_ids.h
Normal file
347
LFtid1056/pqdif_semantic_ids.h
Normal file
@@ -0,0 +1,347 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include <cstring>
|
||||
|
||||
#include "pqdif/include/pqdif_ph.h"
|
||||
#include "pqdif/include/pqdif_id.h"
|
||||
|
||||
namespace pqdif_sem
|
||||
{
|
||||
|
||||
// ============================================================================
|
||||
// ˵<><CBB5>
|
||||
// ----------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ﱣ<EFBFBD><EFB1A3>ԭʼ<D4AD>ֶ<EFBFBD>ֵ<EFBFBD><D6B5>UINT4 / GUID<49><44>
|
||||
// ӳ<><D3B3><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼֵ<CABC><D6B5><EFBFBD>ͳɡ<CDB3><C9A1><EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ============================================================================
|
||||
|
||||
// ------------------------------
|
||||
// GUID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ------------------------------
|
||||
|
||||
inline bool GuidEqual(const GUID& a, const GUID& b)
|
||||
{
|
||||
return std::memcmp(&a, &b, sizeof(GUID)) == 0;
|
||||
}
|
||||
|
||||
struct GuidHash
|
||||
{
|
||||
std::size_t operator()(const GUID& g) const noexcept
|
||||
{
|
||||
const unsigned char* p = reinterpret_cast<const unsigned char*>(&g);
|
||||
std::size_t h = 1469598103934665603ull; // FNV-1a <20><><EFBFBD><EFBFBD>
|
||||
for (std::size_t i = 0; i < sizeof(GUID); ++i)
|
||||
{
|
||||
h ^= static_cast<std::size_t>(p[i]);
|
||||
h *= 1099511628211ull;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
};
|
||||
|
||||
std::string GuidToString(const GUID& g);
|
||||
|
||||
// ============================================================================
|
||||
// һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID ö<>٣<EFBFBD><D9A3><EFBFBD>Դ<EFBFBD><D4B4>PDF <20><> B.2 / B.3 / B.4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pqdif_id.h <20><><EFBFBD>к궨<D0BA>壩
|
||||
// ============================================================================
|
||||
|
||||
// ------------------------------
|
||||
// 1) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tagPhaseID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
|
||||
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
|
||||
// ------------------------------
|
||||
enum class PhaseId : uint32_t
|
||||
{
|
||||
None = ID_PHASE_NONE,
|
||||
AN = ID_PHASE_AN,
|
||||
BN = ID_PHASE_BN,
|
||||
CN = ID_PHASE_CN,
|
||||
NG = ID_PHASE_NG,
|
||||
AB = ID_PHASE_AB,
|
||||
BC = ID_PHASE_BC,
|
||||
CA = ID_PHASE_CA,
|
||||
RES = ID_PHASE_RES,
|
||||
NET = ID_PHASE_NET,
|
||||
Total = ID_PHASE_TOTAL,
|
||||
LnAve = ID_PHASE_LN_AVE,
|
||||
LlAve = ID_PHASE_LL_AVE,
|
||||
Worst = ID_PHASE_WORST,
|
||||
Plus = ID_PHASE_PLUS,
|
||||
Minus = ID_PHASE_MINUS,
|
||||
|
||||
General1 = ID_PHASE_GENERAL_1,
|
||||
General2 = ID_PHASE_GENERAL_2,
|
||||
General3 = ID_PHASE_GENERAL_3,
|
||||
General4 = ID_PHASE_GENERAL_4,
|
||||
General5 = ID_PHASE_GENERAL_5,
|
||||
General6 = ID_PHASE_GENERAL_6,
|
||||
General7 = ID_PHASE_GENERAL_7,
|
||||
General8 = ID_PHASE_GENERAL_8,
|
||||
General9 = ID_PHASE_GENERAL_9,
|
||||
General10 = ID_PHASE_GENERAL_10,
|
||||
General11 = ID_PHASE_GENERAL_11,
|
||||
General12 = ID_PHASE_GENERAL_12,
|
||||
General13 = ID_PHASE_GENERAL_13,
|
||||
General14 = ID_PHASE_GENERAL_14,
|
||||
General15 = ID_PHASE_GENERAL_15,
|
||||
General16 = ID_PHASE_GENERAL_16
|
||||
};
|
||||
|
||||
// ------------------------------
|
||||
// 2) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tagQuantityMeasuredID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
|
||||
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
|
||||
// ע<>⣺<EFBFBD><E2A3BA><EFBFBD><EFBFBD>û<EFBFBD><C3BB> Frequency<63><79>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> characteristic <20><><EFBFBD>
|
||||
// ------------------------------
|
||||
enum class QuantityMeasuredId : uint32_t
|
||||
{
|
||||
None = ID_QM_NONE,
|
||||
Voltage = ID_QM_VOLTAGE,
|
||||
Current = ID_QM_CURRENT,
|
||||
Power = ID_QM_POWER,
|
||||
Energy = ID_QM_ENERGY,
|
||||
Temperature = ID_QM_TEMPERATURE,
|
||||
Pressure = ID_QM_PRESSURE,
|
||||
Charge = ID_QM_CHARGE,
|
||||
EField = ID_QM_EFIELD,
|
||||
MField = ID_QM_MFIELD,
|
||||
Velocity = ID_QM_VELOCITY,
|
||||
Bearing = ID_QM_BEARING,
|
||||
Force = ID_QM_FORCE,
|
||||
Torque = ID_QM_TORQUE,
|
||||
Position = ID_QM_POSITION,
|
||||
FluxLinkage = ID_QM_FLUXLINKAGE,
|
||||
FluxDensity = ID_QM_FLUXDENSITY,
|
||||
Status = ID_QM_STATUS
|
||||
};
|
||||
|
||||
// ------------------------------
|
||||
// 3) <20><>λ<EFBFBD><CEBB>tagQuantityUnitsID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
|
||||
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
|
||||
// ------------------------------
|
||||
enum class QuantityUnitsId : uint32_t
|
||||
{
|
||||
None = ID_QU_NONE,
|
||||
Timestamp = ID_QU_TIMESTAMP,
|
||||
Seconds = ID_QU_SECONDS,
|
||||
Cycles = ID_QU_CYCLES,
|
||||
Volts = ID_QU_VOLTS,
|
||||
Amps = ID_QU_AMPS,
|
||||
VA = ID_QU_VA,
|
||||
Watts = ID_QU_WATTS,
|
||||
Vars = ID_QU_VARS,
|
||||
Ohms = ID_QU_OHMS,
|
||||
Siemens = ID_QU_SIEMENS,
|
||||
VoltsPerAmp = ID_QU_VOLTSPERAMP,
|
||||
Joules = ID_QU_JOULES,
|
||||
Hertz = ID_QU_HERTZ,
|
||||
Celcius = ID_QU_CELCIUS,
|
||||
Degrees = ID_QU_DEGREES,
|
||||
Db = ID_QU_DB,
|
||||
Percent = ID_QU_PERCENT,
|
||||
PerUnit = ID_QU_PERUNIT,
|
||||
Samples = ID_QU_SAMPLES,
|
||||
VarHours = ID_QU_VARHOURS,
|
||||
WattHours = ID_QU_WATTHOURS,
|
||||
VaHours = ID_QU_VAHOURS,
|
||||
Mps = ID_QU_MPS,
|
||||
Mph = ID_QU_MPH,
|
||||
Bars = ID_QU_BARS,
|
||||
Pascals = ID_QU_PASCALS,
|
||||
Newtons = ID_QU_NEWTONS,
|
||||
NewtonMeters = ID_QU_NEWTONMETERS,
|
||||
Rpm = ID_QU_RPM,
|
||||
RadPerSec = ID_QU_RADPERSEC,
|
||||
Meters = ID_QU_METERS,
|
||||
WeberTurns = ID_QU_WEBERTURNS,
|
||||
Teslas = ID_QU_TESLAS,
|
||||
Webers = ID_QU_WEBERS,
|
||||
VoltsPerVolt = ID_QU_VOLTSPERVOLT,
|
||||
AmpsPerAmp = ID_QU_AMPSPERAMP,
|
||||
AmpsPerVolt = ID_QU_AMPSPERVOLT
|
||||
};
|
||||
|
||||
// ------------------------------
|
||||
// 4) <20><><EFBFBD>д洢<D0B4><E6B4A2>ʽ<EFBFBD><CABD>tagStorageMethodID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
|
||||
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
|
||||
// ------------------------------
|
||||
enum class StorageMethodId : uint32_t
|
||||
{
|
||||
Values = ID_SERIES_METHOD_VALUES,
|
||||
Scaled = ID_SERIES_METHOD_SCALED,
|
||||
Increment = ID_SERIES_METHOD_INCREMENT
|
||||
};
|
||||
|
||||
// ------------------------------
|
||||
// 5) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>tagTriggerMethodID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
|
||||
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.3 / B.4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
|
||||
// ------------------------------
|
||||
enum class TriggerMethodId : uint32_t
|
||||
{
|
||||
None = ID_TRIGGER_METH_NONE,
|
||||
Channel = ID_TRIGGER_METH_CHANNEL,
|
||||
Periodic = ID_TRIGGER_METH_PERIODIC,
|
||||
External = ID_TRIGGER_METH_EXTERNAL,
|
||||
PeriodicStats = ID_TRIGGER_METH_PERIODIC_STATS
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||||
// ============================================================================
|
||||
|
||||
struct UIntSemanticEntry
|
||||
{
|
||||
uint32_t raw_value; // ԭʼ UINT4 ֵ
|
||||
const char* standard_name; // <20><><EFBFBD><D7BC>/ͷ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID_PHASE_AN
|
||||
const char* display_name; // <20><><EFBFBD><EFBFBD>չʾ<D5B9><CABE>
|
||||
const char* source_tag; // <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD> tagPhaseID
|
||||
const char* comment; // <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// <20><><EFBFBD><EFBFBD>GUID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ----------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GUID ֵ<><D6B5><EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pqdif_id.h <20><><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD>ÿһ<C3BF><EFBFBD>ܻ<EFBFBD><DCBB>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD> pqdif ͷ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>塣
|
||||
// ============================================================================
|
||||
|
||||
enum class GuidSemanticField
|
||||
{
|
||||
QuantityType, // tagQuantityTypeID
|
||||
ValueType, // tagValueTypeID
|
||||
QuantityCharacteristic, // tagQuantityCharacteristicID
|
||||
DisturbanceCategory // tagDisturbanceCategoryID
|
||||
};
|
||||
|
||||
struct GuidSemanticEntry
|
||||
{
|
||||
GUID raw_guid; // ԭʼ GUID ֵ
|
||||
GuidSemanticField field; // <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
const char* standard_name; // <20><><EFBFBD><D7BC>/ͷ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID_QT_VALUELOG
|
||||
const char* display_name; // <20><><EFBFBD><EFBFBD>չʾ<D5B9><CABE>
|
||||
const char* source_tag; // <20><>Ӧ<EFBFBD>ı<EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>
|
||||
const char* comment; // <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// <20>ġ<EFBFBD><C4A1>̶<EFBFBD><CCB6><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݹ̶<DDB9><CCB6><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>registry ֻ<>Dz<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ============================================================================
|
||||
|
||||
extern const UIntSemanticEntry kPhaseTable[];
|
||||
extern const std::size_t kPhaseTableSize;
|
||||
|
||||
extern const UIntSemanticEntry kQuantityMeasuredTable[];
|
||||
extern const std::size_t kQuantityMeasuredTableSize;
|
||||
|
||||
extern const UIntSemanticEntry kQuantityUnitsTable[];
|
||||
extern const std::size_t kQuantityUnitsTableSize;
|
||||
|
||||
extern const UIntSemanticEntry kStorageMethodTable[];
|
||||
extern const std::size_t kStorageMethodTableSize;
|
||||
|
||||
extern const UIntSemanticEntry kTriggerMethodTable[];
|
||||
extern const std::size_t kTriggerMethodTableSize;
|
||||
|
||||
extern const GuidSemanticEntry kQuantityTypeTable[];
|
||||
extern const std::size_t kQuantityTypeTableSize;
|
||||
|
||||
extern const GuidSemanticEntry kValueTypeTable[];
|
||||
extern const std::size_t kValueTypeTableSize;
|
||||
|
||||
extern const GuidSemanticEntry kQuantityCharacteristicTable[];
|
||||
extern const std::size_t kQuantityCharacteristicTableSize;
|
||||
|
||||
extern const GuidSemanticEntry kDisturbanceCategoryTable[];
|
||||
extern const std::size_t kDisturbanceCategoryTableSize;
|
||||
|
||||
// ============================================================================
|
||||
// <20>塢<EFBFBD><E5A1A2>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>
|
||||
// ============================================================================
|
||||
|
||||
const UIntSemanticEntry* FindUIntSemantic(
|
||||
const UIntSemanticEntry* table,
|
||||
std::size_t table_size,
|
||||
uint32_t raw_value);
|
||||
|
||||
const UIntSemanticEntry* FindPhase(uint32_t raw_value);
|
||||
const UIntSemanticEntry* FindQuantityMeasured(uint32_t raw_value);
|
||||
const UIntSemanticEntry* FindQuantityUnits(uint32_t raw_value);
|
||||
const UIntSemanticEntry* FindStorageMethod(uint32_t raw_value);
|
||||
const UIntSemanticEntry* FindTriggerMethod(uint32_t raw_value);
|
||||
|
||||
std::string FindPhaseName(uint32_t raw_value);
|
||||
std::string FindQuantityMeasuredName(uint32_t raw_value);
|
||||
std::string FindQuantityUnitsName(uint32_t raw_value);
|
||||
std::string FindStorageMethodName(uint32_t raw_value);
|
||||
std::string FindStorageMethodFlagsName(uint32_t raw_value);
|
||||
std::string FindTriggerMethodName(uint32_t raw_value);
|
||||
|
||||
// ============================================================================
|
||||
// <20><><EFBFBD><EFBFBD>GUID ע<><D7A2><EFBFBD><EFBFBD>
|
||||
// ----------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ݹ̶<DDB9><CCB6><EFBFBD>registry ֻ<>ǰѹ̶<D1B9><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF>ٲ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ============================================================================
|
||||
|
||||
class GuidSemanticRegistry
|
||||
{
|
||||
public:
|
||||
GuidSemanticRegistry();
|
||||
|
||||
const GuidSemanticEntry* Find(GuidSemanticField field, const GUID& raw_guid) const;
|
||||
std::string FindName(GuidSemanticField field, const GUID& raw_guid, const char* fallback = "UNKNOWN_GUID") const;
|
||||
|
||||
private:
|
||||
struct Key
|
||||
{
|
||||
GuidSemanticField field;
|
||||
GUID guid;
|
||||
};
|
||||
|
||||
struct KeyHash
|
||||
{
|
||||
std::size_t operator()(const Key& k) const noexcept
|
||||
{
|
||||
std::size_t h1 = std::hash<int>{}(static_cast<int>(k.field));
|
||||
std::size_t h2 = GuidHash{}(k.guid);
|
||||
return h1 ^ (h2 << 1);
|
||||
}
|
||||
};
|
||||
|
||||
struct KeyEq
|
||||
{
|
||||
bool operator()(const Key& a, const Key& b) const noexcept
|
||||
{
|
||||
return a.field == b.field && GuidEqual(a.guid, b.guid);
|
||||
}
|
||||
};
|
||||
|
||||
std::unordered_map<Key, const GuidSemanticEntry*, KeyHash, KeyEq> map_;
|
||||
};
|
||||
|
||||
const GuidSemanticRegistry& GetGuidSemanticRegistry();
|
||||
|
||||
// ============================================================================
|
||||
// <20>ߡ<EFBFBD>ͳ<EFBFBD><CDB3>ӳ<EFBFBD>䳣<EFBFBD><E4B3A3> helper
|
||||
// ----------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>Դ<EFBFBD>Ҷ<EFBFBD>ͳ<EFBFBD><CDB3>ӳ<EFBFBD>䳣<EFBFBD>á<EFBFBD><C3A1><EFBFBD><EFBFBD>жϡ<D0B6>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><C2B2><EFBFBD> helper<65><72>
|
||||
// ============================================================================
|
||||
|
||||
bool IsQuantityTypeValueLog(const GUID& raw_guid);
|
||||
bool IsValueTypeTime(const GUID& raw_guid);
|
||||
bool IsValueTypeVal(const GUID& raw_guid);
|
||||
bool IsValueTypeMin(const GUID& raw_guid);
|
||||
bool IsValueTypeMax(const GUID& raw_guid);
|
||||
bool IsValueTypeAvg(const GUID& raw_guid);
|
||||
bool IsValueTypeInterval(const GUID& raw_guid);
|
||||
bool IsCharacteristicFrequency(const GUID& raw_guid);
|
||||
bool IsCharacteristicRms(const GUID& raw_guid);
|
||||
bool IsCharacteristicTotalThd(const GUID& raw_guid);
|
||||
bool IsUnitHertz(uint32_t raw_value);
|
||||
bool IsTriggerPeriodicStats(uint32_t raw_value);
|
||||
|
||||
} // namespace pqdif_sem#pragma once
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
||||
#pragma once
|
||||
#pragma once
|
||||
|
||||
#include <ctime>
|
||||
#include <cstddef>
|
||||
#include <complex>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@@ -10,75 +10,759 @@
|
||||
#include "pqdif/include/pqdif_ph.h"
|
||||
|
||||
// ============================
|
||||
// ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩ
|
||||
// 新版:完整 PQDIF 逻辑结构
|
||||
// 说明:
|
||||
// 1) 该结构尽量忠实表达 PQDIF 的“文件 -> 记录 -> 定义/实例 -> 数组值”关系;
|
||||
// 2) 后续所有映射、归并、按时刻整合都应该基于这些结构做;
|
||||
// 3) 对暂未显式建模的标签,统一进入 extra_tags,避免丢失信息。
|
||||
// ============================
|
||||
struct RawChannelTagMeta
|
||||
|
||||
using PqdifExtraTagMap = std::map<std::string, std::string>;
|
||||
|
||||
// GUID 及其可读名称
|
||||
struct PqdifGuidValue
|
||||
{
|
||||
std::string raw_channel_name; // ԭʼ tagChannelName
|
||||
std::string normalized_channel_name; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD>õĹ淶<EFBFBD><EFBFBD> key
|
||||
GUID value{}; // 原始 GUID 值
|
||||
std::string symbolic_name; // 通过 PQDIF 信息表解析出的标准名,如 tagPhaseID / ID_QT_VALUELOG 等
|
||||
};
|
||||
|
||||
long phase_id = -1; // tagPhaseID
|
||||
GUID quantity_type_id{}; // tagQuantityTypeID
|
||||
long quantity_measured_id = -1; // tagQuantityMeasuredID
|
||||
// PQDIF 原始时间戳
|
||||
struct PqdifTimestampValue
|
||||
{
|
||||
UINT4 day = 0; // 自 1900-01-01 起的天数,PQDIF 原始 day 字段
|
||||
double second = 0.0; // 当天起算的秒,PQDIF 原始 sec 字段
|
||||
time_t unix_time = 0; // 转换后的 Unix 时间戳,便于上层使用
|
||||
std::string text; // 格式化后的本地时间文本,便于调试和日志输出
|
||||
};
|
||||
|
||||
double channel_frequency = 0.0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int group_id = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6>г<EFBFBD><D0B3><EFBFBD><EFBFBD>
|
||||
// 记录头信息
|
||||
struct PqdifRecordHeaderInfo
|
||||
{
|
||||
long record_index = -1; // 本记录在文件中的顺序索引
|
||||
long file_position = 0; // 记录头在文件中的偏移
|
||||
PqdifGuidValue record_type; // 记录类型,如 tagContainer / tagRecDataSource / tagRecObservation
|
||||
long header_size = 0; // 记录头字节数
|
||||
long data_size = 0; // 记录体字节数
|
||||
long next_record_position = 0; // 下一条记录偏移
|
||||
unsigned int checksum = 0; // 记录校验值
|
||||
};
|
||||
|
||||
// 通用数组值容器:用于保存 PQDIF 向量/序列的真正数组内容
|
||||
struct PqdifValueArray
|
||||
{
|
||||
int physical_type = -1; // PQDIF 物理类型 ID,例如 REAL8 / UINT4 / TIMESTAMPPQDIF
|
||||
long count = 0; // 数组点数
|
||||
|
||||
std::vector<bool> bool_values; // 布尔数组
|
||||
std::vector<long long> int_values; // 有符号整数数组
|
||||
std::vector<unsigned long long> uint_values; // 无符号整数数组
|
||||
std::vector<double> real_values; // 浮点数组,最常见的统计值/波形值
|
||||
std::vector<std::complex<double>> complex_values; // 复数数组
|
||||
std::vector<PqdifTimestampValue> timestamp_values; // 时间戳数组
|
||||
std::vector<PqdifGuidValue> guid_values; // GUID 数组
|
||||
std::vector<std::string> text_values; // 字符串数组(CHAR1/CHAR2)
|
||||
};
|
||||
|
||||
// Container / General Record:文件级元数据
|
||||
struct PqdifContainerRecord
|
||||
{
|
||||
PqdifRecordHeaderInfo header; // 记录头
|
||||
|
||||
std::vector<unsigned int> version_info; // tagVersionInfo,格式版本号数组
|
||||
std::string file_name; // tagFileName,原始文件名
|
||||
PqdifTimestampValue creation_time; // tagCreation,文件创建时间
|
||||
PqdifTimestampValue last_saved_time; // tagLastSaved,最后保存时间
|
||||
unsigned int times_saved = 0; // tagTimesSaved,保存次数
|
||||
|
||||
std::string language; // tagLanguage,语言
|
||||
std::string title; // tagTitle,标题
|
||||
std::string subject; // tagSubject,主题
|
||||
std::string author; // tagAuthor,作者
|
||||
std::string keywords; // tagKeywords,关键字
|
||||
std::string comments; // tagComments,备注
|
||||
std::string last_saved_by; // tagLastSavedBy,最后保存者
|
||||
std::string application; // tagApplication,生成软件
|
||||
|
||||
PqdifGuidValue compression_style_id; // tagCompressionStyleID,压缩风格
|
||||
unsigned int compression_algorithm_id = 0; // tagCompressionAlgorithmID,压缩算法
|
||||
unsigned int compression_checksum = 0; // tagCompressionChecksum,压缩校验值
|
||||
|
||||
std::string owner; // tagOwner,所有者
|
||||
std::string copyright; // tagCopyright,版权
|
||||
std::string trademarks; // tagTrademarks,商标
|
||||
std::string notes; // tagNotes,附加说明
|
||||
|
||||
std::string address1; // tagAddress1,地址行 1
|
||||
std::string address2; // tagAddress2,地址行 2
|
||||
std::string city; // tagCity,城市
|
||||
std::string state; // tagState,州/省
|
||||
std::string postal_code; // tagPostalCode,邮编
|
||||
std::string country; // tagCountry,国家
|
||||
std::string phone_voice; // tagPhoneVoice,电话
|
||||
std::string phone_fax; // tagPhoneFAX,传真
|
||||
std::string email; // tagEmail,邮箱
|
||||
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// Series Definition:序列定义,描述“这一列是什么”
|
||||
struct PqdifSeriesDefinition
|
||||
{
|
||||
int series_def_index = -1; // 序列定义在所属通道定义中的顺序索引
|
||||
|
||||
unsigned int quantity_units_id = 0; // tagQuantityUnitsID,单位 ID
|
||||
PqdifGuidValue quantity_characteristic_id; // tagQuantityCharacteristicID,特征量 ID
|
||||
PqdifGuidValue value_type_id; // tagValueTypeID,值类型 ID,例如 TIME / AVG / MAX / MIN / VAL
|
||||
unsigned int storage_method_id = 0; // tagStorageMethodID,序列存储方式
|
||||
|
||||
unsigned int significant_digits_id = 0; // tagQuantitySignificantDigitsID,有效位定义
|
||||
double quantity_resolution = 0.0; // tagQuantityResolutionID / 解析出的分辨率
|
||||
double nominal_quantity = 0.0; // tagSeriesNominalQuantity,标称值
|
||||
|
||||
std::string value_type_name; // tagValueTypeName,值类型显示名
|
||||
unsigned int hint_greek_prefix_id = 0; // tagHintGreekPrefixID,显示前缀提示
|
||||
unsigned int hint_preferred_units_id = 0; // tagHintPreferredUnitsID,优选单位提示
|
||||
unsigned int hint_default_display_id = 0; // tagHintDefaultDisplayID,默认显示方式提示
|
||||
double prob_interval = 0.0; // tagProbInterval,概率间隔
|
||||
double prob_percentile = 0.0; // tagProbPercentile,概率百分位
|
||||
PqdifTimestampValue effective_time; // tagEffective,定义生效时间
|
||||
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// Channel Definition:通道定义,描述“这个通道测什么”
|
||||
struct PqdifChannelDefinition
|
||||
{
|
||||
int channel_def_index = -1; // 通道定义在数据源中的顺序索引
|
||||
|
||||
std::string channel_name; // tagChannelName,通道名称
|
||||
unsigned int phase_id = 0; // tagPhaseID,相别
|
||||
std::string other_channel_identifier; // tagOtherChannelIdentifier,附加通道标识
|
||||
std::string group_name; // tagGroupName,组名称
|
||||
|
||||
PqdifGuidValue quantity_type_id; // tagQuantityTypeID,量类型(如 VALUELOG / PHASOR)
|
||||
unsigned int quantity_measured_id = 0; // tagQuantityMeasuredID,被测量对象(如电压/电流/频率)
|
||||
unsigned int physical_channel = 0; // tagPhysicalChannel,物理通道编号
|
||||
std::string quantity_name; // tagQuantityName,自定义量名称
|
||||
int primary_series_index = -1; // tagPrimarySeriesIdx,主序列索引
|
||||
|
||||
std::vector<PqdifSeriesDefinition> series_definitions; // 该通道下的全部序列定义
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// Data Source Record:数据源定义,描述设备和通道体系
|
||||
struct PqdifDataSourceRecord
|
||||
{
|
||||
PqdifRecordHeaderInfo header; // 记录头
|
||||
int data_source_index = -1; // 在文件中解析出的数据源顺序索引
|
||||
long record_index = -1; // 对应文件记录索引,便于关联 Observation
|
||||
|
||||
PqdifGuidValue data_source_type_id; // tagDataSourceTypeID,数据源类型
|
||||
PqdifGuidValue vendor_id; // tagVendorID,厂商 ID
|
||||
PqdifGuidValue equipment_id; // tagEquipmentID,设备型号 ID
|
||||
std::string custom_source_info; // tagCustomSourceInfo,扩展来源信息
|
||||
|
||||
PqdifGuidValue instrument_type_id; // tagInstrumentTypeID,仪器类型
|
||||
std::string instrument_model_name; // tagInstrumentModelName,仪器型号名称
|
||||
std::string instrument_model_number; // tagInstrumentModelNumber,仪器型号编号
|
||||
std::string serial_number; // tagSerialNumberDS,序列号
|
||||
std::string version; // tagVersionDS,版本号
|
||||
std::string name; // tagNameDS,设备名称
|
||||
std::string owner; // tagOwnerDS,设备归属
|
||||
std::string location; // tagLocationDS,安装位置
|
||||
std::string time_zone; // tagTimeZoneDS,时区文本
|
||||
std::string coordinates; // tagCoordinatesDS,坐标信息
|
||||
|
||||
std::vector<PqdifChannelDefinition> channel_definitions; // 数据源下的全部通道定义
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// Monitor Settings 中单通道的配置
|
||||
struct PqdifChannelSetting
|
||||
{
|
||||
int channel_setting_index = -1; // 通道设置在监测设置记录中的顺序索引
|
||||
int channel_def_index = -1; // tagChannelDefnIdx,关联的数据源通道定义索引
|
||||
|
||||
unsigned int trigger_type_id = 0; // tagTriggerTypeID,触发类型
|
||||
double full_scale = 0.0; // tagFullScale,满量程
|
||||
double noise_floor = 0.0; // tagNoiseFloor,噪声底
|
||||
PqdifValueArray trigger_shape_param; // tagTriggerShapeParam,触发曲线/参数数组
|
||||
|
||||
unsigned int xd_transformer_type_id = 0; // tagXDTransformerTypeID,互感器类型
|
||||
double xd_system_side_ratio = 0.0; // tagXDSystemSideRatio,一次侧变比
|
||||
double xd_monitor_side_ratio = 0.0; // tagXDMonitorSideRatio,监测侧变比
|
||||
PqdifValueArray xd_frequency_response; // tagXDFrequencyResponse,频率响应数组
|
||||
|
||||
double cal_time_skew = 0.0; // tagCalTimeSkew,校准时延
|
||||
double cal_offset = 0.0; // tagCalOffset,校准偏移
|
||||
double cal_ratio = 0.0; // tagCalRatio,校准比例
|
||||
bool cal_must_use_arcal = false; // tagCalMustUseARCal,是否必须使用校准曲线
|
||||
PqdifValueArray cal_applied; // tagCalApplied,校准应用值数组
|
||||
PqdifValueArray cal_recorded; // tagCalRecorded,校准记录值数组
|
||||
|
||||
double trigger_high_high = 0.0; // tagTriggerHighHigh,高高阈值
|
||||
double trigger_high = 0.0; // tagTriggerHigh,高阈值
|
||||
double trigger_low = 0.0; // tagTriggerLow,低阈值
|
||||
double trigger_low_low = 0.0; // tagTriggerLowLow,低低阈值
|
||||
double trigger_deadband = 0.0; // tagTriggerDeadband,死区
|
||||
double trigger_rate = 0.0; // tagTriggerRate,触发速率
|
||||
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// Monitor Settings Record:监测装置配置
|
||||
struct PqdifMonitorSettingsRecord
|
||||
{
|
||||
PqdifRecordHeaderInfo header; // 记录头
|
||||
int settings_index = -1; // 在文件中解析出的监测设置顺序索引
|
||||
long record_index = -1; // 对应文件记录索引,便于关联 Observation
|
||||
|
||||
PqdifTimestampValue effective_time; // tagEffective,配置生效时间
|
||||
PqdifTimestampValue time_installed; // tagTimeInstalled,安装时间
|
||||
PqdifTimestampValue time_removed; // tagTimeRemoved,拆除时间
|
||||
|
||||
bool use_calibration = false; // tagUseCalibration,是否使用校准
|
||||
bool use_transducer = false; // tagUseTransducer,是否使用传感器/互感器
|
||||
double nominal_frequency = 0.0; // tagNominalFrequency,额定频率
|
||||
unsigned int physical_connection = 0; // tagSettingPhysicalConnection,物理接线方式
|
||||
double nominal_voltage = 0.0; // tagNominalVoltage,额定电压
|
||||
bool is_pcc = false; // tagIsPCC,是否为 PCC 点
|
||||
|
||||
std::vector<PqdifChannelSetting> channel_settings; // 各通道的监测配置
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// Observation 中单个序列实例:保存某一次观测里的一个真实数组
|
||||
struct PqdifSeriesInstance
|
||||
{
|
||||
int series_instance_index = -1; // 序列实例在通道实例中的顺序索引
|
||||
int series_def_index = -1; // 关联的数据源序列定义索引(通常与定义层顺序一致)
|
||||
|
||||
unsigned int quantity_units_id = 0; // tagQuantityUnitsID,本实例对应的单位 ID
|
||||
PqdifGuidValue quantity_characteristic_id; // tagQuantityCharacteristicID,本实例特征量 ID
|
||||
PqdifGuidValue value_type_id; // tagValueTypeID,本实例值类型 ID
|
||||
|
||||
long series_base_type = -1; // 当前库暴露的底层序列物理类型
|
||||
double series_base_quantity = 0.0; // tagSeriesBaseQuantity,序列基值
|
||||
double scale = 1.0; // tagSeriesScale,缩放系数
|
||||
double offset = 0.0; // tagSeriesOffset,偏移量
|
||||
double nominal_quantity = 0.0; // 关联定义层解析出的标称量
|
||||
unsigned int significant_digits_id = 0; // 关联定义层解析出的有效位配置
|
||||
double quantity_resolution = 0.0; // 关联定义层解析出的分辨率
|
||||
|
||||
int share_channel_index = -1; // tagSeriesShareChannelIdx,共享通道索引
|
||||
int share_series_index = -1; // tagSeriesShareSeriesIdx,共享序列索引
|
||||
|
||||
PqdifValueArray values; // tagSeriesValues,真正的数组值
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// Observation 中单个通道实例:保存某一次观测里的一个真实通道块
|
||||
struct PqdifChannelInstance
|
||||
{
|
||||
int channel_instance_index = -1; // 通道实例在观测中的顺序索引
|
||||
int channel_def_index = -1; // 关联的数据源通道定义索引
|
||||
|
||||
std::string channel_name; // 从 Observation 读出的通道名
|
||||
unsigned int phase_id = 0; // 相别
|
||||
PqdifGuidValue quantity_type_id; // 量类型
|
||||
unsigned int quantity_measured_id = 0; // 被测量对象
|
||||
int primary_series_index = -1; // 主序列索引
|
||||
|
||||
double charact_duration = 0.0; // tagCharactDuration,特征持续时间
|
||||
double charact_magnitude = 0.0; // tagCharactMagnitude,特征幅值
|
||||
double charact_frequency = 0.0; // tagCharactFrequency,特征频率
|
||||
double channel_frequency = 0.0; // tagChannelFrequency,通道频率
|
||||
int channel_group_id = 0; // tagChannelGroupID,通道分组
|
||||
|
||||
std::vector<PqdifSeriesInstance> series_instances; // 该通道实例下的所有序列实例
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// Observation Record:一次真实观测
|
||||
struct PqdifObservationRecord
|
||||
{
|
||||
PqdifRecordHeaderInfo header; // 记录头
|
||||
int observation_index = -1; // 在文件中解析出的观测顺序索引
|
||||
long record_index = -1; // 对应文件记录索引
|
||||
|
||||
int related_data_source_index = -1; // 该观测关联的数据源顺序索引
|
||||
long related_data_source_record_index = -1; // 该观测关联的数据源记录索引
|
||||
int related_settings_index = -1; // 该观测关联的监测设置顺序索引
|
||||
long related_settings_record_index = -1; // 该观测关联的监测设置记录索引
|
||||
|
||||
std::string observation_name; // tagObservationName,观测名称
|
||||
PqdifTimestampValue time_create; // tagTimeCreate,观测记录创建时间
|
||||
PqdifTimestampValue time_start; // tagTimeStart,观测起始时间
|
||||
|
||||
unsigned int trigger_method_id = 0; // tagTriggerMethodID,触发方式
|
||||
PqdifTimestampValue time_triggered; // tagTimeTriggered,触发时刻
|
||||
std::vector<int> channel_trigger_indexes; // tagChannelTriggerIdx,触发通道索引数组
|
||||
|
||||
unsigned int observation_serial = 0; // tagObservationSerial,观测序号
|
||||
unsigned int observation_aggregation_serial = 0; // tagObservationAggregationSerial,聚合序号
|
||||
PqdifGuidValue disturbance_category_id; // tagDisturbanceCategoryID,扰动分类
|
||||
|
||||
std::vector<PqdifChannelInstance> channel_instances; // 本次观测中的所有通道实例
|
||||
PqdifExtraTagMap extra_tags; // 当前结构未单独建模但已读出的标签
|
||||
};
|
||||
|
||||
// 文件级完整逻辑对象
|
||||
struct PqdifLogicalFile
|
||||
{
|
||||
std::vector<PqdifRecordHeaderInfo> record_headers; // 文件中所有记录的头信息,保留顺序
|
||||
std::vector<PqdifContainerRecord> containers; // Container / General 记录,一般只有一个
|
||||
std::vector<PqdifDataSourceRecord> data_sources; // 全部数据源记录
|
||||
std::vector<PqdifMonitorSettingsRecord> monitor_settings; // 全部监测设置记录
|
||||
std::vector<PqdifObservationRecord> observations; // 全部观测记录
|
||||
};
|
||||
|
||||
// ============================
|
||||
// ϵ<EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>ǩ
|
||||
// 统计识别与同一时间聚合层
|
||||
// 说明:
|
||||
// 1) 这一层只服务于“从完整 PQDIF 结构中识别目标统计指标并按时间聚合”;
|
||||
// 2) 当前阶段先不做 tagPqData_Float 映射;
|
||||
// 3) 当前阶段只处理“筛选出的统计类 observation”,其他 observation 暂不参与识别。
|
||||
// ============================
|
||||
struct RawSeriesTagMeta
|
||||
{
|
||||
long quantity_units_id = -1; // tagQuantityUnitsID
|
||||
GUID quantity_characteristic_id{}; // tagQuantityCharacteristicID
|
||||
GUID value_type_id{}; // tagValueTypeID
|
||||
|
||||
long series_base_type = -1; // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṩ<EFBFBD><E1B9A9><EFBFBD><EFBFBD>Ϣ
|
||||
double series_scale = 1.0; // <20><><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
|
||||
double series_offset = 0.0; // ƫ<><C6AB>
|
||||
// 解析得到的接线方式
|
||||
// 用于区分星型 / 角型 两套指标规则。
|
||||
enum class ParsedConnectionKind
|
||||
{
|
||||
Unknown = 0, // 未知 / 无法确认
|
||||
Wye, // 星型 / Y
|
||||
Delta // 角型 / Δ
|
||||
};
|
||||
|
||||
// ============================
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ԭʼͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><>ǰ<EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩ + ԭʼֵ
|
||||
// ============================
|
||||
struct RawChannelSeries
|
||||
// 当前支持的业务指标 ID
|
||||
// 后续如果新增指标,只需要继续往这里加枚举,并在 cpp 里的识别规则补充即可。
|
||||
enum class StatMetricId
|
||||
{
|
||||
RawChannelTagMeta channel_tag;
|
||||
Unknown = 0,
|
||||
|
||||
RawSeriesTagMeta time_meta;
|
||||
RawSeriesTagMeta max_meta;
|
||||
RawSeriesTagMeta min_meta;
|
||||
RawSeriesTagMeta avg_meta;
|
||||
RawSeriesTagMeta cp95_meta;
|
||||
RawSeriesTagMeta val_meta;
|
||||
// 相电压有效值
|
||||
UaRms,
|
||||
UbRms,
|
||||
UcRms,
|
||||
|
||||
std::vector<time_t> times;
|
||||
std::vector<double> max_values;
|
||||
std::vector<double> min_values;
|
||||
std::vector<double> avg_values;
|
||||
std::vector<double> cp95_values;
|
||||
std::vector<double> val_values;
|
||||
// 相电流有效值
|
||||
IaRms,
|
||||
IbRms,
|
||||
IcRms,
|
||||
|
||||
// 线电压有效值
|
||||
UabRms,
|
||||
UbcRms,
|
||||
UcaRms,
|
||||
|
||||
// 相电压偏差
|
||||
UaDeviation,
|
||||
UbDeviation,
|
||||
UcDeviation,
|
||||
|
||||
// 线电压偏差
|
||||
UabDeviation,
|
||||
UbcDeviation,
|
||||
UcaDeviation,
|
||||
|
||||
// 频率
|
||||
Frequency,
|
||||
|
||||
// 频率偏差
|
||||
FrequencyDeviation,
|
||||
|
||||
// 电压序分量
|
||||
UZeroSeq, // 电压零序分量
|
||||
UNegSeq, // 电压负序分量
|
||||
UPosSeq, // 电压正序分量
|
||||
|
||||
// 电压负序不平衡,通常对应 S2/S1,单位可能为 % 或 pu
|
||||
UNegSeqUnbalance,
|
||||
|
||||
// 电流序分量
|
||||
IZeroSeq, // 电流零序分量
|
||||
INegSeq, // 电流负序分量
|
||||
IPosSeq, // 电流正序分量
|
||||
|
||||
// 电流负序不平衡,通常对应 S2/S1,单位可能为 % 或 pu
|
||||
INegSeqUnbalance,
|
||||
|
||||
|
||||
|
||||
// 功率类:三相/总有功、无功、视在功率
|
||||
PaPower,
|
||||
PbPower,
|
||||
PcPower,
|
||||
PTotalPower,
|
||||
QaPower,
|
||||
QbPower,
|
||||
QcPower,
|
||||
QTotalPower,
|
||||
SaPower,
|
||||
SbPower,
|
||||
ScPower,
|
||||
STotalPower,
|
||||
|
||||
// 功率因数类:三相/总功率因数、三相/总基波功率因数
|
||||
PFa,
|
||||
PFb,
|
||||
PFc,
|
||||
PFTotal,
|
||||
FundPFa,
|
||||
FundPFb,
|
||||
FundPFc,
|
||||
FundPFTotal,
|
||||
|
||||
// 电压变动幅值 DVC/dV/V:三相与线电压
|
||||
UaDvc,
|
||||
UbDvc,
|
||||
UcDvc,
|
||||
UabDvc,
|
||||
UbcDvc,
|
||||
UcaDvc,
|
||||
|
||||
// 闪变:三相和线电压短闪 Pst、长闪 Plt
|
||||
UaPst,
|
||||
UbPst,
|
||||
UcPst,
|
||||
UabPst,
|
||||
UbcPst,
|
||||
UcaPst,
|
||||
UaPlt,
|
||||
UbPlt,
|
||||
UcPlt,
|
||||
UabPlt,
|
||||
UbcPlt,
|
||||
UcaPlt,
|
||||
|
||||
// 基波功率:三相/总有功、无功、视在基波功率
|
||||
PaFundPower,
|
||||
PbFundPower,
|
||||
PcFundPower,
|
||||
PTotalFundPower,
|
||||
QaFundPower,
|
||||
QbFundPower,
|
||||
QcFundPower,
|
||||
QTotalFundPower,
|
||||
SaFundPower,
|
||||
SbFundPower,
|
||||
ScFundPower,
|
||||
STotalFundPower,
|
||||
|
||||
// 基波有效值与基波相角:三相电压、三相电流、线电压
|
||||
UaFundRms,
|
||||
UbFundRms,
|
||||
UcFundRms,
|
||||
UaFundAngle,
|
||||
UbFundAngle,
|
||||
UcFundAngle,
|
||||
IaFundRms,
|
||||
IbFundRms,
|
||||
IcFundRms,
|
||||
IaFundAngle,
|
||||
IbFundAngle,
|
||||
IcFundAngle,
|
||||
UabFundRms,
|
||||
UbcFundRms,
|
||||
UcaFundRms,
|
||||
UabFundAngle,
|
||||
UbcFundAngle,
|
||||
UcaFundAngle,
|
||||
|
||||
// 总谐波畸变率 THD:三相电压、三相电流、线电压
|
||||
UaThd,
|
||||
UbThd,
|
||||
UcThd,
|
||||
IaThd,
|
||||
IbThd,
|
||||
IcThd,
|
||||
UabThd,
|
||||
UbcThd,
|
||||
UcaThd,
|
||||
|
||||
// 谐波/间谐波类动态指标范围。
|
||||
//
|
||||
// 不再为 2-50 次谐波逐项声明 UaHarm02、UaHarm03 ... UcHarm50,
|
||||
// 而是用“指标族基址 + 相别 + 次数”的方式动态构造。这样后续新增
|
||||
// 电流谐波、间谐波、谐波含有率等指标时,不需要继续堆大量 enum 项。
|
||||
//
|
||||
// 当前已启用:
|
||||
// VoltageHarmonicUaBase + order => UaHarmXX, order=2..50
|
||||
// VoltageHarmonicUbBase + order => UbHarmXX, order=2..50
|
||||
// VoltageHarmonicUcBase + order => UcHarmXX, order=2..50
|
||||
// 预留区间:
|
||||
// CurrentHarmonic* 后续电流谐波
|
||||
// VoltageInterharmonic* 后续电压间谐波
|
||||
// CurrentInterharmonic* 后续电流间谐波
|
||||
// 三相电压谐波 RMS,order=2..50
|
||||
VoltageHarmonicUaBase = 10000,
|
||||
VoltageHarmonicUbBase = 10100,
|
||||
VoltageHarmonicUcBase = 10200,
|
||||
|
||||
// AB/BC/CA 线电压谐波 RMS,order=2..50
|
||||
LineVoltageHarmonicUabBase = 10300,
|
||||
LineVoltageHarmonicUbcBase = 10400,
|
||||
LineVoltageHarmonicUcaBase = 10500,
|
||||
|
||||
// 三相电流谐波 RMS,order=2..50
|
||||
CurrentHarmonicIaBase = 11000,
|
||||
CurrentHarmonicIbBase = 11100,
|
||||
CurrentHarmonicIcBase = 11200,
|
||||
|
||||
// 三相电压谐波相角,order=2..50
|
||||
VoltageHarmonicAngleUaBase = 12000,
|
||||
VoltageHarmonicAngleUbBase = 12100,
|
||||
VoltageHarmonicAngleUcBase = 12200,
|
||||
|
||||
// AB/BC/CA 线电压谐波相角,order=2..50
|
||||
LineVoltageHarmonicAngleUabBase = 12300,
|
||||
LineVoltageHarmonicAngleUbcBase = 12400,
|
||||
LineVoltageHarmonicAngleUcaBase = 12500,
|
||||
|
||||
// 三相电流谐波相角,order=2..50
|
||||
CurrentHarmonicAngleIaBase = 13000,
|
||||
CurrentHarmonicAngleIbBase = 13100,
|
||||
CurrentHarmonicAngleIcBase = 13200,
|
||||
|
||||
// 三相电压间谐波 RMS,slot=0..49 表示 0.5..49.5 次
|
||||
VoltageInterharmonicUaBase = 14000,
|
||||
VoltageInterharmonicUbBase = 14100,
|
||||
VoltageInterharmonicUcBase = 14200,
|
||||
|
||||
// AB/BC/CA 线电压间谐波 RMS,slot=0..49 表示 0.5..49.5 次
|
||||
LineVoltageInterharmonicUabBase = 14300,
|
||||
LineVoltageInterharmonicUbcBase = 14400,
|
||||
LineVoltageInterharmonicUcaBase = 14500,
|
||||
|
||||
// 三相电流间谐波 RMS,slot=0..49 表示 0.5..49.5 次
|
||||
CurrentInterharmonicIaBase = 15000,
|
||||
CurrentInterharmonicIbBase = 15100,
|
||||
CurrentInterharmonicIcBase = 15200,
|
||||
|
||||
// 谐波功率 2-50 次:三相/总 有功、无功、视在功率
|
||||
HarmonicActivePowerPaBase = 16000,
|
||||
HarmonicActivePowerPbBase = 16100,
|
||||
HarmonicActivePowerPcBase = 16200,
|
||||
HarmonicActivePowerTotalBase = 16300,
|
||||
HarmonicReactivePowerQaBase = 16400,
|
||||
HarmonicReactivePowerQbBase = 16500,
|
||||
HarmonicReactivePowerQcBase = 16600,
|
||||
HarmonicReactivePowerTotalBase = 16700,
|
||||
HarmonicApparentPowerSaBase = 16800,
|
||||
HarmonicApparentPowerSbBase = 16900,
|
||||
HarmonicApparentPowerScBase = 17000,
|
||||
HarmonicApparentPowerTotalBase = 17100,
|
||||
|
||||
// 谐波含有率 2-50 次:三相电压、三相电流、线电压
|
||||
VoltageHarmonicRatioUaBase = 18000,
|
||||
VoltageHarmonicRatioUbBase = 18100,
|
||||
VoltageHarmonicRatioUcBase = 18200,
|
||||
CurrentHarmonicRatioIaBase = 18300,
|
||||
CurrentHarmonicRatioIbBase = 18400,
|
||||
CurrentHarmonicRatioIcBase = 18500,
|
||||
LineVoltageHarmonicRatioUabBase = 18600,
|
||||
LineVoltageHarmonicRatioUbcBase = 18700,
|
||||
LineVoltageHarmonicRatioUcaBase = 18800,
|
||||
};
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
using RawChannelMap = std::map<std::string, RawChannelSeries>;
|
||||
// 统计值类型:用于把 MIN / MAX / AVG / P95 装进同一时间桶。
|
||||
enum class StatValueKind
|
||||
{
|
||||
Unknown = 0,
|
||||
Min, // 最小值
|
||||
Max, // 最大值
|
||||
Avg, // 平均值
|
||||
P95 // 95 值 / 百分位 95
|
||||
};
|
||||
|
||||
// һ<EFBFBD><EFBFBD> PQDIF <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 指标质量状态。
|
||||
// Normal 表示当前指标可正常使用;其他状态用于把“重复来源/全零/量程异常/缺失”显式暴露出来,
|
||||
// 防止后续新增指标时继续出现静默覆盖或误识别。
|
||||
enum class StatMetricQuality
|
||||
{
|
||||
Normal = 0,
|
||||
AllZero,
|
||||
DuplicateSource,
|
||||
SuspiciousRange,
|
||||
Missing
|
||||
};
|
||||
|
||||
// 单个“已展开的统计样本点”
|
||||
// 含义:某个统计 observation 中某个通道/某个序列/某个时间点的一条已还原工程值样本。
|
||||
struct ExpandedStatPoint
|
||||
{
|
||||
time_t timestamp = 0; // 样本对应的绝对时刻
|
||||
std::string timestamp_text; // 格式化后的时间文本,便于日志和调试
|
||||
|
||||
int observation_index = -1; // 来源 observation 索引
|
||||
int channel_instance_index = -1; // 来源通道实例索引
|
||||
int channel_def_index = -1; // 来源通道定义索引,便于排查同名/同相通道覆盖
|
||||
int channel_group_id = 0; // 来源通道分组 ID;部分厂家用它表示谐波次数
|
||||
int channel_spectrum_order_hint = -1; // 当 group/base/nominal 缺失时,从同类通道实例顺序推导出的谐波次数 2..50
|
||||
int channel_spectrum_block_offset = -1; // 同类通道实例块内偏移;用于排查厂家把谱线拆成多个通道但名称相同的情况
|
||||
int channel_spectrum_block_size = 0; // 同类通道实例候选总数;用于日志确认是否是 2-50 次整组数据
|
||||
int series_instance_index = -1; // 来源序列实例索引
|
||||
int series_def_index = -1; // 来源序列定义索引,便于核查 MIN/MAX/AVG/P95 的定义来源
|
||||
int sample_index = -1; // 序列内部样本点下标
|
||||
|
||||
std::string observation_name; // 来源 observation 名称
|
||||
std::string channel_name; // 通道名称(如 V RMS A)
|
||||
std::string quantity_name; // 量名称(来自定义层)
|
||||
unsigned int phase_id = 0; // 相别
|
||||
PqdifGuidValue quantity_type_id; // 量类型(VALUELOG 等)
|
||||
unsigned int quantity_measured_id = 0; // 被测量对象(Voltage / Current)
|
||||
unsigned int quantity_units_id = 0; // 单位 ID
|
||||
PqdifGuidValue quantity_characteristic_id;// 特征量(RMS / FREQUENCY)
|
||||
PqdifGuidValue value_type_id; // 值类型(MIN / MAX / AVG / P95)
|
||||
|
||||
double prob_percentile = 0.0; // 序列定义中的概率百分位(若有)
|
||||
double series_base_quantity = 0.0; // 序列基值;部分 PQDIF 厂家会用它表达谐波次数
|
||||
double nominal_quantity = 0.0; // 标称量;部分 PQDIF 厂家会用它表达谐波次数
|
||||
double value = 0.0; // 工程值(已完成 scale/offset 还原)
|
||||
|
||||
ParsedConnectionKind connection_kind = ParsedConnectionKind::Unknown; // 当前文件识别出的接线方式
|
||||
StatMetricId metric_id = StatMetricId::Unknown; // 该样本点识别出的业务指标
|
||||
StatValueKind stat_kind = StatValueKind::Unknown; // 该样本点属于 MIN/MAX/AVG/P95 哪一种
|
||||
|
||||
bool matched_by_name_fallback = false; // 是否通过名称辅助规则匹配成功
|
||||
};
|
||||
|
||||
// 某一个业务指标在某个时间点上的统计值集合
|
||||
struct AggregatedStatValues
|
||||
{
|
||||
bool has_min = false; // 是否存在最小值
|
||||
bool has_max = false; // 是否存在最大值
|
||||
bool has_avg = false; // 是否存在平均值
|
||||
bool has_p95 = false; // 是否存在 95 值
|
||||
|
||||
double min_value = 0.0; // 最小值
|
||||
double max_value = 0.0; // 最大值
|
||||
double avg_value = 0.0; // 平均值
|
||||
double p95_value = 0.0; // 95 值
|
||||
|
||||
StatMetricQuality quality = StatMetricQuality::Normal; // 指标质量状态
|
||||
std::string quality_reason; // 质量状态说明
|
||||
|
||||
int source_observation_index = -1; // 选中的来源 observation 索引
|
||||
int source_channel_instance_index = -1; // 选中的来源通道实例索引
|
||||
int source_series_instance_index = -1; // 最近一次写入该桶的来源序列实例索引
|
||||
std::string source_channel_name; // 选中的来源通道名称
|
||||
};
|
||||
|
||||
// 同一时刻聚合桶
|
||||
// 含义:在“已筛选出的统计类 observation”内,某个 timestamp 下所有已识别指标的统计值集合。
|
||||
struct TimeAggregatedStatBucket
|
||||
{
|
||||
time_t timestamp = 0; // 聚合时刻
|
||||
std::string timestamp_text; // 格式化时间文本
|
||||
|
||||
std::map<StatMetricId, AggregatedStatValues> metrics; // 当前时刻下各指标的统计值
|
||||
};
|
||||
|
||||
|
||||
// PQDIF 统计桶 Base64 子记录对象
|
||||
// 对象用途:保存“一个 PQDIF 文件 + 一个时间点 + 一种统计类型”的最终 Base64 组装结果。
|
||||
// 数据粒度:例如同一个时间点会有 Max、Min、Avg、P95 四条子记录。
|
||||
// 注意:v20 起它不再直接作为全局队列元素,而是作为
|
||||
// PqdifStatBase64TimePointPacket.records 的子对象存在。
|
||||
struct PqdifStatBase64Record
|
||||
{
|
||||
std::string pqdif_file_path; // 对象来源:PQDIF 文件全路径,便于后续处理时追溯文件
|
||||
StatValueKind value_kind = StatValueKind::Unknown; // 对象统计类型:Max / Min / Avg / P95
|
||||
std::string value_kind_name; // 对象统计类型文本:便于日志/外部队列直接查看
|
||||
int value_kind_code = 0; // 对象统计类型编码:兼容旧统计队列,1=Max, 2=Min, 3=Avg, 4=P95
|
||||
time_t timestamp = 0; // 对象时间戳:该 Base64 数据所属的桶时间点
|
||||
std::string timestamp_text; // 对象时间文本:格式化时间点,便于日志、人眼核查
|
||||
std::string base64_payload; // 对象数据主体:float 按星型/角型顺序组装后整体转换成的 Base64 字符串
|
||||
size_t float_count = 0; // 对象校验字段:本条记录实际组装的 float 数量
|
||||
size_t placeholder_count = 0; // 对象校验字段:本条记录中使用 3.14159f 占位的数量
|
||||
ParsedConnectionKind connection_kind = ParsedConnectionKind::Unknown; // 对象接线方式:星型/角型/未知
|
||||
};
|
||||
|
||||
// PQDIF Base64 时间点包对象
|
||||
// 对象用途:把同一个 PQDIF 文件、同一个时间点下的 Max/Min/Avg/P95 四类 Base64 子记录合并保存。
|
||||
// 设计原因:后续处理时可以按时间点一次性拿到四种统计类型,避免散落成单条记录。
|
||||
struct PqdifStatBase64TimePointPacket
|
||||
{
|
||||
time_t timestamp = 0; // 对象时间戳:该时间点包对应的桶时间点
|
||||
std::string timestamp_text; // 对象时间文本:格式化时间点,便于日志、人眼核查
|
||||
std::vector<PqdifStatBase64Record> records; // 对象子记录:同一时间点下的 Max/Min/Avg/P95 Base64 记录
|
||||
|
||||
size_t record_count = 0; // 对象统计字段:records.size() 的冗余统计,便于日志核查
|
||||
size_t total_float_count = 0; // 对象统计字段:当前时间点下所有子记录的 float 数量合计
|
||||
size_t total_placeholder_count = 0;// 对象统计字段:当前时间点下所有子记录的占位数量合计
|
||||
size_t total_base64_chars = 0; // 对象统计字段:当前时间点下所有子记录 base64 字符数合计
|
||||
};
|
||||
|
||||
// PQDIF Base64 文件级批次对象
|
||||
// 对象用途:保存“一个 PQDIF 文件解析完成后”的全部 Base64 时间点包。
|
||||
// 数据粒度:全局队列中的一个元素就是一个 PqdifStatBase64FileBatch,文件之间不会混合。
|
||||
struct PqdifStatBase64FileBatch
|
||||
{
|
||||
std::string pqdif_file_path; // 对象来源:PQDIF 文件全路径
|
||||
std::string source_file; // 对象来源:原始文件路径,通常与 pqdif_file_path 一致或接近
|
||||
std::string mac; // 对象来源:设备目录名/设备标识
|
||||
time_t parsed_at = 0; // 对象生成时间戳:解析完成时间
|
||||
std::string parsed_at_text; // 对象生成时间文本:格式化解析完成时间
|
||||
ParsedConnectionKind connection_kind = ParsedConnectionKind::Unknown; // 对象接线方式:星型/角型/未知
|
||||
|
||||
std::vector<PqdifStatBase64TimePointPacket> time_points; // 对象主体:文件内所有时间点包
|
||||
|
||||
size_t time_point_count = 0; // 对象统计字段:time_points.size() 的冗余统计,便于日志核查
|
||||
size_t total_record_count = 0; // 对象统计字段:文件内全部 Max/Min/Avg/P95 子记录数量
|
||||
size_t total_float_count = 0; // 对象统计字段:文件内全部 float 数量
|
||||
size_t total_placeholder_count = 0;// 对象统计字段:文件内全部占位数量
|
||||
size_t total_base64_chars = 0; // 对象统计字段:文件内全部 base64 字符数
|
||||
};
|
||||
|
||||
// 一个 PQDIF 文件的暂存对象
|
||||
struct ParsedPqdifFile
|
||||
{
|
||||
std::string mac; // <EFBFBD>豸Ŀ¼<EFBFBD><EFBFBD>
|
||||
std::string source_file; // ԭʼ<EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
|
||||
time_t parsed_at = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
||||
RawChannelMap channels; // ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
std::string mac; // 设备目录名
|
||||
std::string source_file; // 原始文件路径
|
||||
time_t parsed_at = 0; // 解析完成时间
|
||||
|
||||
// 新结构:完整 PQDIF 拆分结果
|
||||
PqdifLogicalFile logical_file;
|
||||
|
||||
// 统计识别与聚合层结果
|
||||
ParsedConnectionKind connection_kind = ParsedConnectionKind::Unknown; ///< 当前文件识别出的接线方式
|
||||
int selected_observation_index = -1; ///< 当前阶段被选中的“统计类 observation”索引
|
||||
std::string selected_observation_name; ///< 当前阶段被选中的“统计类 observation”名称
|
||||
std::vector<ExpandedStatPoint> expanded_stat_points; ///< 从 PQDIF 展开的全部统计样本点
|
||||
std::vector<TimeAggregatedStatBucket> aggregated_stat_buckets; ///< 按 timestamp 聚合后的时间桶
|
||||
};
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> PQDIF ɨ<EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
|
||||
// 启动 PQDIF 扫描线程
|
||||
void RunPqdifScanLoop();
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽӿ<EFBFBD>
|
||||
// 缓存访问接口
|
||||
bool PopOldestParsedPqdifFile(ParsedPqdifFile& out);
|
||||
bool PeekOldestParsedPqdifFile(ParsedPqdifFile& out);
|
||||
size_t GetParsedPqdifCacheSize();
|
||||
void ClearParsedPqdifCache();
|
||||
void ClearParsedPqdifCache();
|
||||
|
||||
// PQDIF 统计桶 Base64 “生成队列”访问接口
|
||||
// 对象用途:该队列由解析流程写入,RunPqdifScanLoop() 每轮循环末尾会尝试把其中一个文件批次
|
||||
// 移动到“待后续处理队列”。如果外部仍需直接读取生成队列,可以继续使用以下旧接口。
|
||||
// v20 起:队列元素 = 一个 PQDIF 文件批次。
|
||||
bool PopOldestPqdifStatBase64FileBatch(PqdifStatBase64FileBatch& out);
|
||||
bool PeekOldestPqdifStatBase64FileBatch(PqdifStatBase64FileBatch& out);
|
||||
|
||||
// 兼容旧接口:如旧代码仍按单条 Base64 子记录读取,会从文件批次队列的最早文件/最早时间点中拆出一条。
|
||||
bool PopOldestPqdifStatBase64Record(PqdifStatBase64Record& out);
|
||||
bool PeekOldestPqdifStatBase64Record(PqdifStatBase64Record& out);
|
||||
|
||||
// 返回当前生成队列文件级批次数量;如需查看内部子记录数量,使用 GetPqdifStatBase64RecordCountInQueue()。
|
||||
size_t GetPqdifStatBase64QueueSize();
|
||||
size_t GetPqdifStatBase64RecordCountInQueue();
|
||||
void ClearPqdifStatBase64Queue();
|
||||
|
||||
// PQDIF 统计桶 Base64 “待后续处理队列”访问接口
|
||||
// 对象用途:RunPqdifScanLoop() 已经从生成队列取出、准备交给后续入库/上传/推送流程的数据会放在这里。
|
||||
// 推荐后续业务优先调用 PopReadyPqdifStatBase64FileBatch(),一次取出一个完整 PQDIF 文件批次。
|
||||
bool PopReadyPqdifStatBase64FileBatch(PqdifStatBase64FileBatch& out);
|
||||
bool PeekReadyPqdifStatBase64FileBatch(PqdifStatBase64FileBatch& out);
|
||||
size_t GetReadyPqdifStatBase64QueueSize();
|
||||
size_t GetReadyPqdifStatBase64RecordCountInQueue();
|
||||
void ClearReadyPqdifStatBase64Queue();
|
||||
|
||||
Reference in New Issue
Block a user