📄 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 + -