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

📄 ioport.h

📁 三容水箱的模糊控制设计
💻 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 + -