?? ioport.h
字號:
#include "PCI2006.h"
//----------------------------------------------------------------------
#define Length 150// 濾波的長度
#define m 30//首尾去掉數據的長度
class IOPort
{
private:
BOOL m_bPortOpen;//采集卡工作狀態變量
HANDLE m_hDevice;//采集卡設備句柄
PCI2006_PARA_AD m_ADPara;//采集卡參數設置變量
BOOL filter[3];
double ADbuffer[3][Length];
HANDLE hFileObject;
public:
HANDLE NewFile()
{
hFileObject=PCI2006_CreateFileObject(m_hDevice,"d:\\date.Dat",PCI2006_modeCreate|PCI2006_modeWrite);
return hFileObject;
}
void ShowLogCofig()//顯示系統中數據采集卡的硬件配置情況
{
PCI2006_ListDeviceDlg (m_hDevice);
}
BOOL IsPortOpen(void)//返回采集的工作狀態
{ return m_bPortOpen;
}
void WriteData(double* value)//寫入DA數據
{
double val = 0;
for(int dim = 0; dim < 2; dim ++)
{
val = value[dim];
if(val>10)
val=10;
if(val<0)
val=0;
val=val/10.*4096;
if(val>=4096)
val=4095;
PCI2006_WriteDevProDA(m_hDevice, (WORD)val, dim); // DA通道(0-1)
}
}
void ReadData(double* value)//讀取AD數據;
{
short shADVal[9];
//Open AD
PCI2006_InitDeviceProAD(m_hDevice, &m_ADPara);//初始化AD
//Start AD
PCI2006_StartDeviceProAD(m_hDevice);//初始化后啟動0號設備(0號數據采集卡)
//Read AD
PCI2006_ReadDeviceProAD_NotEmpty(m_hDevice, shADVal, 9);//用非空方式讀取設備的AD數據
//Close AD
PCI2006_ReleaseDeviceProAD(m_hDevice);
int dim = 0;
for(dim = 0; dim < 3; dim ++)
{
//雙極性輸入
//shADVal[dim] = ((shADVal[dim]^0x2000)&0x3fff);
//單極性輸入
shADVal[dim] = (shADVal[6+ dim] & 0x3fff);//屏蔽高2位,得到14位的DA值
value[dim]=shADVal[dim];
}
//------------------------------------------------------------------------------------------------------------------
double filteredval ;
for(dim = 0; dim <3; dim ++)
{
UINT i;
//filter data
if(filter[dim] == TRUE)
{
for(i = 0; i < Length; i ++)
ADbuffer[dim][i] = shADVal[dim];
filter[dim] = FALSE;
}
double sum = 0.0;
double t=0;
//move data forward
for(i = 1; i < Length; i ++)
{
// sum += ADbuffer[dim][i];
ADbuffer[dim][i - 1] = ADbuffer[dim][i];
}
//sum += shADVal[dim];
ADbuffer[dim][Length-1] = shADVal[dim];
//---------------------------------------------------------------------------//排序
int j;
double temp;
double a[Length];
for(i=0;i<Length;i++)
{
a[i]=ADbuffer[dim][i];
}
for(i=0;i<Length;i++)
for(j=i+1;j<Length;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
//---------------------------------------------------------------------------//end of 排序
for(i=m;i<(Length-m);i++)
{
sum += a[i];
}
filteredval = sum / (Length-2*m);
//filteredval = sum / Length;
value[dim] = filteredval; //return the filtered value!!
}//for each state dim
//--------------------------------------------------------------------------------------------------------------------
}
void Close()//停止設備,nID:設備號0-1
{
if(m_hDevice != NULL)
{
//for each DA channel
for(int dim = 0; dim < 2; dim ++)
PCI2006_WriteDevProDA(m_hDevice, 0x0000, dim);//0號設備的所有DA通道值為0
PCI2006_ReleaseDevice(m_hDevice);
}
m_bPortOpen = FALSE;
}
BOOL IOPort::Open(UINT nID)
{
int dim = 0;
for(dim = 0; dim < 3; dim ++)
{
m_ADPara.ChannelArray[dim].ADChannel = dim;
m_ADPara.ChannelArray[dim].ADGains = 0;//通道增益
}
m_ADPara.ChannelCount = dim;//通道總數
m_ADPara.ADMode = PCI2006_SEQUENCE_MODE; //or PCI2006_OUT_TRIGGER,連續采集
m_ADPara.Frequency = 410000; //in Hz 采樣頻率
m_ADPara.GroupInterval = 1000; //in mu_s分組采樣時相鄰組的時間間隔
m_ADPara.TriggerSource = PCI2006_IN_TRIGGER; //or PCI2006_OUT_TRIGGER內部觸發
m_ADPara.OutTriggerEdge = PCI2006_RISING_EDGE; //or PCI2006_FALLING_EDGE外觸發上升沿
m_ADPara.OutDigitAnalog = PCI2006_ANALOG_TRIGGER; //or PCI2006_DIGIT_TRIGGER外觸發模擬方式
m_ADPara.ClockSource = PCI2006_IN_CLOCK; //or PCI2006_OUT_CLOCK 允許內部時鐘
//create device
m_hDevice = PCI2006_CreateDevice(nID); //為設備號為nID的數據采集卡創建設備句柄
//start DA
for(dim = 0; dim < 2; dim ++)
{
PCI2006_InitDevProDA(m_hDevice, PCI2006_RESET_MODE_ZERO, dim);//nID號設備進行復位方式為零點的通道的數據傳輸
PCI2006_WriteDevProDA(m_hDevice, 0x0000, dim);//nID號設備的DA通道寫入0值
}
if(m_hDevice == INVALID_HANDLE_VALUE)
{
m_bPortOpen = FALSE;
m_hDevice = NULL;
}
else
m_bPortOpen = TRUE;
return m_bPortOpen;
}
IOPort()
{
m_bPortOpen = FALSE;
m_hDevice = NULL;
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<Length;j++)
ADbuffer[i][j]=0.0;
filter[i]=TRUE;
}
}
virtual ~IOPort()
{
}
void reset()
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<Length;j++)
ADbuffer[i][j]=0.0;
filter[i]=TRUE;
}
}
};
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -