⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addoc.cpp

📁 AD 数据采集卡基本的采集界面
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ADDoc.cpp : implementation of the CADDoc class
//
#include "stdafx.h"
#include "Sys.h"
#include "ADDoc.h"
#include "ADDigitView.h"
#include "ADWaveView.h"
#include "ADStatusView.h"
#include "ParaCfgView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

////////////////////////////////////////////////////////////////////////
SHORT ADBuffer[MAX_SEGMENT][16384]; // 缓冲队列
BOOL bNewSegmentData[MAX_SEGMENT]; // 用于确定当前段数据是否为最新数据
int CurrentIndex=13; // AD数据处理线程当前缓冲区索引号
int ReadIndex;    // AD数据采集线程当前缓冲区索引号
BOOL bNewData = FALSE;
BOOL bDeviceADRun=FALSE;
PCI2006_PARA_AD ADPara;
BOOL bCheckOverflow=FALSE; // 是否检测FIFO溢出标志
ULONG WroteMB=0;  
BOOL bFirstDisp=TRUE;//首屏标志
UINT ProccessDataThread(PVOID hWnd);  // 绘制数据线程
WORD m_DAData;//DA原始数据
BOOL m_bFirstCreateDeviceFile;
int  m_ProcessGraphicMode;//为1,波形显示
BOOL m_FirstScreenStop;//此变量控制是否首屏停止
BOOL m_BounceStop;//控制串道停止
BOOL m_AnalyzeCheck;//控制精度分析
BOOL m_StopUpdateView;//视图是否更新
int  m_AnalyzeChannel;
int  m_ScreenVolume;//设置屏幕显示的量程
int  m_TriggerVolt;//触发电压
int m_MiddleLsb;
int  ChannelCount;
float PerLsbVolt; // 单位LSB的电压值
CEdit* pCountEdit;
CEdit* pRangeEdit;
CEdit* pRatioEdit;
float m_AnalyzeAllCount;
UINT m_OverLimitCount;
int m_ProcessMoveVolt;//为1时,平移电压
BOOL bCreateDevice;
BOOL m_bProgress;  // 是否更新进度条
int nProcessMode;  // 数据处理方式 1:数字显示  2:波形显示  3:数据存盘
ULONGLONG FileLenghtWords; //显示数据存盘使用
CADDigitView* m_pDigitView;
CADWaveView* m_pWaveView;
int CurrentProgress; // 更新进度的值,它由处理线程改变,由ADFrm.Timer事件使用

CADStatusView* pADStatusView;
CParaCfgView* pParaCfgView;
BOOL FlagColorList;
HANDLE hEvent;  // 采集线程与绘制线程的同步信号
int m_DigitalDataShowMode; // 数字窗口显示模式
int DeviceID;   // 该程序使用的设备ID
HANDLE hFileObject;

BOOL m_bCloseFile;
HANDLE hExitEvent;
int Center, PerY;
CRect ClientRect;
float middle1;
BOOL bDrawing=FALSE;
int Volt_Range ; //电压处理方式 1:正负5伏 2:正负10伏 3:0至5伏 4:0至2.5伏
int nSampleMode;//采集模式变量
ULONG nLoopSize;
int  m_nBounceChannel;//分析的通道号
int m_nLower;//串道分析 下限
int m_nUpper;//串道分析 上限
BOOL m_bPointsAnalyze=FALSE;//是否多点分析
BOOL m_bBounce=FALSE;//是否串道分析
int  m_nBounceNum=0;//串道次数
int  m_nBouncePointsCount=1;//多点分析所需要的点数
BOOL bDataProcessing=FALSE;
int DrawIndex=0;

//##############################################
//使用多媒体定时器以每秒50帧或以下的速度刷新屏幕
#include "stdio.h"
#include "MmSystem.h"

void PASCAL DrawWindowProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2);
#define ONE_MILLI_SECOND 1
#define TWO_SECOND 2000
// 定 义 时 钟 分 辨 率, 以 毫 秒 为 单 位 ---- 
#define TIMER_ACCURACY 1
UINT wAccuracy;  // 定 义 分 辨 率
UINT TimerID; // 定 义 定 时 器 句 柄 

////////////////////////////////////////////////////////////////////////////
// CADDoc

IMPLEMENT_DYNCREATE(CADDoc, CDocument)

BEGIN_MESSAGE_MAP(CADDoc, CDocument)
	//{{AFX_MSG_MAP(CADDoc)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// CADDoc construction/destruction

CADDoc::CADDoc()
{
	
	// TODO: add one-time construction code here
	m_FirstScreenStop=FALSE; // 不停止首屏显示
	m_bProgress=TRUE; // 一开始不更新进度条
	nProcessMode=1;    // 默认方式:数字显示
	m_TriggerVolt=(int)VOLT_RANGE;	// 置触发电平的初值为其最大量程
	m_bFirstCreateDeviceFile=TRUE;  // 一开始,为第一次创建文件对象
	
	m_bCloseFile=TRUE; // 没有打开文件时,认为文件被关闭	
	
}

CADDoc::~CADDoc()
{
}

BOOL CADDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CADDoc serialization

void CADDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CADDoc diagnostics

#ifdef _DEBUG
void CADDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CADDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG


void CADDoc::StartDeviceAD() 
{

	memset(ADBuffer, 0x00, sizeof(ADBuffer));
	CSysApp *pApp=(CSysApp *)AfxGetApp();	
	DeviceID = pApp->m_CurrentDeviceID;  // 取得当前应用程序使用的设备ID号
	////////////////////////////////////////////////////////////////////////
	if(pApp->m_hDevice==INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("对不起,无PCI设备存在...",MB_ICONERROR);
		return;
	}
	FileLenghtWords=256;	//文件长度初始化
	// 建立视图对象,以便让绘图定时器高速绘图
	CADDigitView* m_pDigitView=(CADDigitView*)(CWnd::FromHandle(m_hWndDigit)); 
	CADWaveView* m_pWaveView=(CADWaveView*)(CWnd::FromHandle(m_hWndWave)); 
	// 创建窗口绘制子线程
	m_DrawWindowThread=AfxBeginThread(ProccessDataThread,NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
	m_DrawWindowThread->m_bAutoDelete=false;    
	// 创建数据采集与窗口绘制同步事件对象
	hEvent = PCI2006_CreateSystemEvent();
	hExitEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
	bCollectData=TRUE;  // 创建设备对象后,可以进行数据采集
	m_MiddleLsb=0;
	m_StopUpdateView=true;

	CString str1;
	pParaCfgView->ReadPara();
	ChannelCount=ADPara.ChannelCount;  	// 在开始采集时,确定通道数	
	if(!m_bFirstCreateDeviceFile) // 如果创建了文件对象
	{
		FILE_HEADER header;
		header.BusType =PCI_BUS;  // 我公司厂商ID号
		header.DeviceID =0x2006;
		header.HeaderSizeBytes =sizeof(FILE_HEADER);
		header.ADMode=ADPara.ADMode ;              // 连续采集和分组采集方式选择
		header.ChannelCount=ADPara.ChannelCount;		   // 通道总数(1-32)
		switch(Volt_Range)
		{
		case RANGE_N5000_TO_P5000:
			header.VoltBottomRange =-5;
			header.VoltTopRange =5;
			break;
		case RANGE_N10000_TO_P10000:
			header.VoltBottomRange =-10;
			header.VoltTopRange =10;
			break;
		case RANGE_0_TO_P5000:
			header.VoltBottomRange =0;
			header.VoltTopRange =5;
			break;
		case RANGE_0_TO_P2500:
			header.VoltBottomRange =0;
			header.VoltTopRange =2.5;
			break;
		}

		for(int i=0; i<32; i++) 
		{
			header.ChannelArray[i].ADChannel = ADPara.ChannelArray[i].ADChannel;
			header.ChannelArray[i].ADGains = ADPara.ChannelArray[i].ADGains;
		}

		header.Frequency=ADPara.Frequency ;           // AD采集频率(Hz)
		header.GroupInterval=ADPara.GroupInterval ;	   // 分组采样时,相邻组的时间间隔(uS)
		header.TriggerSource=ADPara.TriggerSource ;	   // 内触发和外触发方式选择
		header.OutTriggerEdge=ADPara.OutTriggerEdge ;	   // 外触发上升沿和下降沿类型选择
		header.OutDigitAnalog=ADPara.OutDigitAnalog ;	   // 外触发数字和模拟方式选择
		header.ClockSource=ADPara.ClockSource ;         // 允许使用外部时钟
		header.FileEndFlag =0xAA55AA55;
		PCI2006_WriteFile(hFileObject,(SHORT*)&header,sizeof(FILE_HEADER)); 
	}

	// 根据通道数,重新设置视图滚动范围
	CADDigitView* pDigitView=(CADDigitView*)(CWnd::FromHandle(m_hWndDigit)); 
    CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(m_hWndWave)); 
	CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
	// 在设备开始运行时,禁止操作硬件参数

	CProgressCtrl* pProgress=(CProgressCtrl*)(pShow->m_wndShowStatus1.GetDlgItem(IDC_PROGRESS));
	pProgress->SetPos(0);  // 释放设备时,置进度条为起值

	if(ADPara.TriggerSource==PCI2006_OUT_TRIGGER) // 如果外触发且属模拟触发
	{
		if(ADPara.OutDigitAnalog==PCI2006_ANALOG_TRIGGER)
		{
			PCI2006_InitDevProDA(pApp->m_hDevice, PCI2006_RESET_MODE_NEGATIVE,0); //PCI2006_RESET_MODE_ZERO);
			PCI2006_WriteDevProDA(pApp->m_hDevice, m_DAData,0); // 置触发电平
		}
	
	}
	m_nBounceNum=0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -