📄 plotdatastream.cpp
字号:
// PlotDataStream.cpp: implementation of the CPlotDataStream class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PlotDataStream.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//交换字节顺序
void Swap(char *pChar1, char *pChar2)
{
char tmp;
tmp = *pChar1;
*pChar1 = *pChar2;
*pChar2 = tmp;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
CPlotDataStream::CPlotDataStream():m_bFileOpened(FALSE)
{
}
CPlotDataStream::~CPlotDataStream()
{
this->Cleanup();
}
BOOL CPlotDataStream::InitFile(LPCTSTR szFile)
{
if (::strlen(szFile) <=4)
return FALSE;
this->Cleanup();
m_bFileOpened = m_sDataFile.Open(szFile, CFile::modeCreate |CFile::modeWrite|CFile::typeBinary);
return m_bFileOpened;
}
//写入单点实时数据
void CPlotDataStream::Stream(char cVal[], ULONG nChnlNum)
{
if (m_bFileOpened)
{
m_sDataFile.Write(cVal, nChnlNum*sizeof(char)); //写入每记录块
}
}
void CPlotDataStream::Cleanup()
{
if (m_bFileOpened)
{
m_sDataFile.Close();
m_bFileOpened = FALSE;
}
}
//连续显示数据
#define PI 1.4142
#define AC_REFVOLTAGE 2.43
#define AC_CALCOEFF1 4.0*PI/4.0 //-校准系统
#define DC_CALCOEFF1 25.45 //已校准
#define _USETESTWAVEHEADERTAG
#include "analysis.h"
#define CHNLNUMBYTE 4
typedef struct _tagMultiChnlData
{
unsigned short CH1;
unsigned short CH2;
}MultiChnlData;
void CPlotDataStream::ContShowData(pfnCallBack fpShowData, LPCTSTR szFile)
{
ASSERT(szFile);
if (::strlen(szFile) < 10)
return ;
CFile sDataFile;
CFileStatus fs;
double *dbBuffers[2];
ULONG dbBufferSize[2];
union
{
MultiChnlData sMultiData;
char szBuff[4];
}_pp;
TRY
{
BOOL bFileOpened = sDataFile.Open(szFile, CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone);
if (bFileOpened)
{
sDataFile.GetStatus(fs);
#ifdef _USETESTWAVEHEADERTAG
if (fs.m_size <= 4096*3)
return;
//得到桢数
ULONG numOfDataSize = (fs.m_size-4096*2)/(CHNLNUMBYTE);
sDataFile.Seek(4096*2, CFile::begin);
#else
ULONG numOfDataSize = fs.m_size/(CHNLNUMBYTE);
#endif
dbBufferSize[0] = numOfDataSize;
dbBufferSize[1] = numOfDataSize;
for (int k=0; k<CHNLNUMBYTE/2; k++)
dbBuffers[k] = (double*)::malloc(numOfDataSize*sizeof(double));
for (ULONG j=0; j<numOfDataSize; j++)
{
sDataFile.Read(_pp.szBuff, CHNLNUMBYTE*sizeof(char));
::Swap(&_pp.szBuff[0], &_pp.szBuff[1]);
::Swap(&_pp.szBuff[2], &_pp.szBuff[3]);
dbBuffers[0][j] = (_pp.sMultiData.CH1*AC_REFVOLTAGE/(1024*1.0)-AC_REFVOLTAGE/2.0)*AC_CALCOEFF1+0.002; //交流通道
dbBuffers[1][j] = _pp.sMultiData.CH2*AC_REFVOLTAGE/(65536*1.00)*DC_CALCOEFF1; //直流通道
//限制最大值
if (dbBuffers[1][j] >= 59.0)
{
numOfDataSize = j;
for (int n=0; n<CHNLNUMBYTE/2; n++)
dbBufferSize[n] = j;
break;
}
}
//////////////////////////////////////////////////////////////////////////////
#if 0
//2.求交流的有效值和剔除异常点
double rms =0;
::RMS(dbBuffers[0], numOfDataSize, &rms);
for (ULONG h=0; h<numOfDataSize; h++)
{
if (dbBuffers[0][h] > rms*PI)
dbBuffers[0][h] = rms*PI;
if (dbBuffers[0][h] < (0.0-rms)*PI)
dbBuffers[0][h] = (0.0-rms)*PI;
}
#endif
/////////////////////////////////////////////////////////////////////////////
//3.显示波形
(*fpShowData)(dbBuffers, dbBufferSize, CHNLNUMBYTE/2);
for (int m=0; m<CHNLNUMBYTE/2; m++)
if (dbBuffers[m])
{
::free(dbBuffers[m]);
dbBuffers[m] = NULL;
}
// if (dbBuffers[1])
// {
// ::free(dbBuffers[1]);
// dbBuffers[1] = NULL;
// }
sDataFile.Close();
if (numOfDataSize >0)
{
::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(), _T("已完成数据文件的显示!"),
_T("读取文件结束"), MB_ICONINFORMATION);
}
}
}
CATCH(CFileException, ef)
{
::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(),
_T("无法访问指定的文件,检查文件是否存在!"),
_T("访问文件错误"), MB_ICONERROR);
}
CATCH_ALL(e)
{
::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(),
_T("显示历史趋势数据出现错误,检查文件损坏或是否有效趋势数据!\n\n"),
_T("无法识别文件错误"), MB_ICONERROR);
}
END_CATCH_ALL
}
void CPlotDataStream::FetchRealData(int nSize, UINT IndPtArr[], double *dbDCValue[2]/*直流通道数据*/,
double *dbACValue[2], LPCTSTR szFile)
{
ASSERT(szFile);
CFile sDataFile;
CFileStatus fs;
int nEnumCount = 0;
union
{
MultiChnlData sMultiData;
char szBuff[4];
}_pp;
TRY
{
BOOL bFileOpened = sDataFile.Open(szFile, CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone);
if (bFileOpened)
{
sDataFile.GetStatus(fs);
#ifdef _USETESTWAVEHEADERTAG
if (fs.m_size <= 4096*3)
return;
/////////////////////////////////////////////////////////////
//读取每字节显示
ULONG numOfDataSize = (fs.m_size-4096*3)/(CHNLNUMBYTE);
sDataFile.Seek(4096*3, CFile::begin);
#else
ULONG numOfDataSize = fs.m_size/(CHNLNUMBYTE);
#endif
for (ULONG j=0; j<numOfDataSize; j++)
{
sDataFile.Read(_pp.szBuff, CHNLNUMBYTE*sizeof(char));
if (IndPtArr[nEnumCount] == j)
{
::Swap(&_pp.szBuff[0], &_pp.szBuff[1]);
::Swap(&_pp.szBuff[2], &_pp.szBuff[3]);
dbACValue[0][nEnumCount] = (_pp.sMultiData.CH1*AC_REFVOLTAGE/(1024*1.0)-AC_REFVOLTAGE/2.0)*AC_CALCOEFF1; //交流通道
dbDCValue[0][nEnumCount] = _pp.sMultiData.CH2*AC_REFVOLTAGE/(65536*1.00)*DC_CALCOEFF1; //直流通道
nEnumCount++;
}
}
//////////////////////////////////////////////////////////////
sDataFile.Close();
}
}
CATCH(CFileException, ef)
{
::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(),
_T("无法访问指定的文件,检查文件是否存在!"),
_T("访问文件错误"), MB_ICONERROR);
}
CATCH_ALL(e)
{
::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(),
_T("显示历史趋势数据出现错误,检查文件损坏或是否有效趋势数据!\n\n"),
_T("无法识别文件错误"), MB_ICONERROR);
}
END_CATCH_ALL
}
ULONG CPlotDataStream::FetchSize(LPCTSTR szFile)
{
CFile sDataFile;
CFileStatus fs;
ULONG numOfDataSize = 0;
TRY
{
BOOL bFileOpened = sDataFile.Open(szFile, CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone);
if (bFileOpened)
{
sDataFile.GetStatus(fs);
#ifdef _USETESTWAVEHEADERTAG
if (fs.m_size <= 4096*3)
return 0;
//读取每字节显示
numOfDataSize = (fs.m_size-4096*3)/(CHNLNUMBYTE);
//sDataFile.Seek(4096*3, CFile::begin);
#else
numOfDataSize = fs.m_size/(CHNLNUMBYTE);
#endif
}
}
CATCH(CFileException, ef)
{
numOfDataSize = 0;
::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(),
_T("无法访问指定的文件,检查文件是否存在!"),
_T("访问文件错误"), MB_ICONERROR);
}
CATCH_ALL(e)
{
numOfDataSize = 0;
::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(),
_T("显示历史趋势数据出现错误,检查文件损坏或是否有效趋势数据!\n\n"),
_T("无法识别文件错误"), MB_ICONERROR);
}
END_CATCH_ALL
return numOfDataSize;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -