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

📄 ncapdlg.cpp

📁 功能非常强大的数据采集系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	CRect rect;
	GetWindowRect(rect);
	ScreenToClient(rect);

	CRect ctrrect;
/*
	CWnd* pWnd = GetDlgItem(ID_BTN_ADD);

	if (pWnd)
	{
		pWnd->GetWindowRect(ctrrect);
		ScreenToClient(ctrrect);

		CRect newrect(rect.right - ctrrect.Width() - 10, rect.bottom - ctrrect.Height() - 40, rect.right - 10, rect.bottom - 40);
		pWnd->MoveWindow(newrect);
	}

	pWnd = GetDlgItem(IDOK);
	if (pWnd)
	{
		pWnd->GetWindowRect(ctrrect);
		ScreenToClient(ctrrect);

		CRect newrect(rect.right - ctrrect.Width() - 10, rect.bottom - ctrrect.Height() - 15, rect.right - 10, rect.bottom - 15);
		pWnd->MoveWindow(newrect);
	}
	
	pWnd = GetDlgItem(IDC_ADDDATA);
	if (pWnd)
	{
		pWnd->GetWindowRect(ctrrect);
		ScreenToClient(ctrrect);

		CRect newrect(rect.right - ctrrect.Width() - 10, rect.bottom - ctrrect.Height() - 65, rect.right - 10, rect.bottom - 65);
		pWnd->MoveWindow(newrect);
	}
	
	pWnd = GetDlgItem(IDC_COMBO1);
	if (pWnd)
	{
		pWnd->GetWindowRect(ctrrect);
		ScreenToClient(ctrrect);

		CRect newrect(rect.right - ctrrect.Width() - 10, ctrrect.top, rect.right - 10, ctrrect.bottom);
		pWnd->MoveWindow(newrect);
	}
*/
	if (v_pCurveCtrl)
	{
		v_pCurveCtrl->GetWindowRect(ctrrect);
		ScreenToClient(ctrrect);

		CRect newrect(ctrrect.left, ctrrect.top, rect.right - 15,  rect.bottom - 15);
		v_pCurveCtrl->MoveWindow(newrect);
	}

	Invalidate();
}

//-------------------------------------------------------------------------------------------------
// 开始数据采集处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnStart() 
{
	// TODO: Add your control notification handler code here
	CString			v_sTemp;											//临时变量
	int				v_iIndex;											//临时变量
	unsigned int	*v_pVol_float;										//临时变量
	void			*v_pVol_char;										//临时变量
	unsigned int	v_iVoltage;											//临时变量
	CByteArray	v_cData;												//定义字节数组

	UpdateData(true);													//获取信息
	if(!v_bStart)
	{
		SetTimer(1,v_iInput,NULL);										//定时1:采集定时开始
		m_cStart.SetWindowText("停止采集");								//显示处理
		if(!v_bStart_new)
		{
			v_bStart_new=true;											//新的数据采集标志
			v_pCurveCtrl->m_fHoriBegin=float(0);						//初始化显示X坐标:原点为0
			v_pCurveCtrl->m_fHoriEnd=float(theApp.a_iNumber_page);		//初始化显示X坐标:最大值为0
			m_iPage=theApp.a_iNumber_page;								//一屏显示点数
			v_iIndex = v_pCurveCtrl->AddCurve("Test_0", v_sColours[0 % v_iColourCount].crColour);	
																		//增加一条曲线、名称及其显示色彩
//			v_pCurveCtrl->GetCurve(v_iIndex)->ShowCurve();				//显示无效(false)
			v_pCurveCtrl->SetVertLabel(m_sUnit);						//设置实验物理量
			v_pCurveCtrl->SetHoriLabel(theApp.a_sXunit);				//设置x轴显示内容
			m_cInput.EnableWindow(false);								//时间间隔无效
			m_cInput_number.EnableWindow(false);						//采集点数无效
			m_cPara.EnableWindow(false);								//参数设置无效
			m_cQuery.EnableWindow(false);								//数据查询无效
			if(theApp.a_iChannel==0)									//正弦曲线参数预处理
			{
				v_bAuto_stop=false;
				m_cStop.SetCheck(false);								//自动停止无效
				v_bAuto_save=false;
				m_cSave.SetCheck(false);								//自动保存无效
				m_iMove=1;												//自动增加点数
			}

			//设置初始电位
			if (theApp.a_iChannel==2)									//串口数据处理
			{
				float	v_fVoltage=theApp.a_fVoltage*1000;				//计算初始电位数值
				v_iVoltage=(unsigned int)v_fVoltage;
				v_pVol_float=&v_iVoltage;								//获得指针
				v_pVol_char=v_pVol_float;								//指针变换
				v_cData.Add(0x01);										//起始
				v_cData.Add(0x07);										//命令长度(全部)
				v_cData.Add(0x33);										//命令:设置初始电位
				v_cData.Add(0x02);										//数据开始
				v_cData.Add(*((unsigned char*)v_pVol_char+1));			//高位
				v_cData.Add(*(unsigned char*)v_pVol_char);				//低位
				v_cData.Add(0x03);										//结束
				m_cComm.SetOutput(COleVariant(v_cData));				//串口发送
			}
		}
		m_cSave_man.EnableWindow(false);								//手动保存无效
		m_cClear.EnableWindow(false);									//图形清除无效
	}
	else
	{
		KillTimer(1);													//定时1:采集定时结束
		m_cStart.SetWindowText("开始采集");
		m_cSave_man.EnableWindow(true);									//手动保存有效
		m_cClear.EnableWindow(true);									//图形清除有效
	}
	v_bStart=!v_bStart;
	UpdateData(false);													//更新显示
}

//-------------------------------------------------------------------------------------------------
// 采集时间变化处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnQuery() 
{
	// TODO: Add your control notification handler code here
	DLG_QUERY v_cDlg;
	v_cDlg.DoModal();	
}

//-------------------------------------------------------------------------------------------------
// 采集时间变化处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnPara() 
{
	// TODO: Add your control notification handler code here
	DLG_PARA v_cDlg;
	v_cDlg.v_iDs_time=theApp.a_iDs_time;								//时间间隔
	v_cDlg.v_iNumber=theApp.a_iNumber;									//采样点数
	v_cDlg.v_iMove=theApp.a_iNumber_move;								//自动移动点数
	v_cDlg.v_iPage=theApp.a_iNumber_page;								//一屏显示点数
	v_cDlg.v_iAppend=theApp.a_iNumber_append;							//自动增加点数
	v_cDlg.v_sIp=theApp.a_sIp;											//网络IP
	v_cDlg.v_iPort=theApp.a_iPort;										//网络port
	v_cDlg.v_iCom=theApp.a_iCom;										//串口端口
	v_cDlg.v_iCom_bit=theApp.a_iBit;									//串口速率
	v_cDlg.v_iChannel=theApp.a_iChannel;								//采集通道
	v_cDlg.v_bSave=theApp.a_bAuto_save;									//保存
	v_cDlg.v_bStop=theApp.a_bAuto_stop;									//停止						
	v_cDlg.v_iAuto_move=theApp.a_iAuto_move;							//移动、增加选择
	v_cDlg.v_sUnit=theApp.a_sUnit;										//物理量
	v_cDlg.v_sName=theApp.a_sName;										//实验名称
	v_cDlg.v_iMultiple=theApp.a_iMultiple;								//放大倍数
	v_cDlg.v_fVoltage=theApp.a_fVoltage;									//放大倍数
	if (v_cDlg.DoModal()==IDOK)
		We_status();													//状态显示
}

//-------------------------------------------------------------------------------------------------
// 功能:自动保存复选窗处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnSave() 
{
	// TODO: Add your control notification handler code here
	v_bAuto_save=m_cSave.GetCheck();									//获得自动保存标志
}

//-------------------------------------------------------------------------------------------------
// 功能:自动采集停止处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnStop() 
{
	// TODO: Add your control notification handler code here
	v_bAuto_stop=m_cStop.GetCheck();									//获得自动停止采集标志
}

//-------------------------------------------------------------------------------------------------
// 采集时间变化处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnChangeInput() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);													//获取屏幕数据
	v_iInput=m_iInput;													//赋值
}

//-------------------------------------------------------------------------------------------------
// 采集点数变化处理
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnChangeInputNumber() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);													//获取屏幕数据
	v_iInput_number=m_iInput_number;									//赋值
}

//-------------------------------------------------------------------------------------------------
// 清除所有绘制的图形
// 参数:无
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnClear() 
{
	// TODO: Add your control notification handler code here

	//清除参比电极电压(设置为零)
	if (theApp.a_iChannel==2)											//串口数据处理
	{
		CByteArray		v_cData;										//定义字节数组
		v_cData.Add(0x01);												//起始
		v_cData.Add(0x07);												//命令长度(全部)
		v_cData.Add(0x33);												//命令:设置初始电位
		v_cData.Add(0x02);												//数据开始
		v_cData.Add(0x00);												//高位:00
		v_cData.Add(0x00);												//低位:00
		v_cData.Add(0x03);												//结束
		m_cComm.SetOutput(COleVariant(v_cData));						//串口发送
	}

	//采集数据、图形显示处理
	v_pCurveCtrl->RemoveAll();											//清除所有绘制的图形
	v_pCurveCtrl->m_fVertMax=-FLT_MAX / 2;								//数据最大值复位
	v_pCurveCtrl->m_fVertMin=FLT_MAX / 2;								//数据最小值复位
	v_pCurveCtrl->Invalidate();											//显示处理
	v_iX_number=-1;														//数据采集x计数复位
	v_iCurveCount=0;													//绘制图形序号

	v_bStart_new=false;													//新的数据采集标志
	m_iPage=theApp.a_iNumber_page;										//一屏显示点数
	m_cSave_man.EnableWindow(false);									//手动保存无效
	m_cClear.EnableWindow(false);										//图形清除无效
	m_cInput.EnableWindow(true);										//时间间隔有效
	m_cInput_number.EnableWindow(true);									//采集点数有效
	m_cPara.EnableWindow(true);											//参数设置有效
	m_cQuery.EnableWindow(true);										//数据查询有效
	m_cStart.EnableWindow(true);										//开始采集有效
}

//-------------------------------------------------------------------------------------------------
// 功能:手动保存采集数据
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnSaveMan() 
{
	// TODO: Add your control notification handler code here
	CString		v_sSql,v_sSql1,v_sName,v_sDs_time,v_sNumber,v_sChannel,v_sUnit;	
																		//临时变量
	CTime		v_tTime;												//临时变量
	int			v_iNum;													//临时变量
	bool		v_bFlag;												//临时变量
	
	UpdateData(true);													//获取屏幕输入数据
	v_sName=m_sName;													//实验名称
	v_sName.TrimLeft();
	v_sUnit=m_sUnit;													//实验物理单位
	v_sUnit.TrimLeft();
	v_tTime=CTime::GetCurrentTime();
	v_sDs_time.Format("%d",v_iInput);									//时间间隔
	v_sNumber.Format("%d",v_iX_number);									//实际采集点数
	v_sChannel.Format("%d",theApp.a_iChannel);							//通道号
	//把采集数的据保存到数据库
	v_sSql="INSERT INTO query (znum,zname,zdate,zds_time,znumber,zchannel,zunit) VALUES ('"
			+m_sNumber													//实验编号
			+"','"+v_sName												//实验名称
			+"','"+v_tTime.Format("%Y-%m-%d")+" "+v_tTime.Format("%H:%M:%S")
																		// 设置日期
			+"',"+v_sDs_time											//时间间隔
			+","+v_sNumber												//采集点数
			+","+v_sChannel												//通道
			+",'"+v_sUnit+"')";											//物理单位
	We_save(v_sSql);													//数据库保存:实验运行信息数据库
	
	v_bFlag=true;
	for(v_iNum=0;v_iNum<=v_iX_number;v_iNum++)							//保存采集数据到数据库
	{
		if (v_bFlag)
		{
			v_bFlag=false;
			v_sSql="INSERT INTO information (znum";
			v_sSql1=") VALUES ('"+m_sNumber+"'";
		}
		v_sName.Format("%02d",v_iNum%50);
		v_sSql+=",znr"+v_sName;
		v_sName.Format("%.4f",v_fData[v_iNum]);
		v_sSql1+=","+v_sName;											//采集数据
		if(((v_iNum+1)%50==0)||(v_iNum==v_iX_number))
		{
			v_sSql+=v_sSql1+")";
			We_save(v_sSql);											//数据库保存:实验数据采集数据库
			v_bFlag=true;
		}
	}
	//保存后运行参数及显示处理
	m_cStart.EnableWindow(false);										//开始采集无效
	m_cSave_man.EnableWindow(false);									//手动保存无效
	theApp.a_iNum++;													//实验序号加一
	v_sSql.Format("%d",theApp.a_iNum);
	v_sSql="UPDATE state SET znum="+v_sSql;								//sql命令
	We_save(v_sSql);													//数据库保存
	m_sNumber.Format("%04d",theApp.a_iNum);
	m_sNumber=theApp.a_sDate+"_"+m_sNumber;								//实验编号
	UpdateData(false);													//显示信息
}

//-------------------------------------------------------------------------------------------------
// 定时处理
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	float		v_fX,v_fY;												//座标变量
	CString		v_sTemp;												//临时变量
	int			v_iIndex;												//临时变量

	switch(nIDEvent)
	{
	case 1:																//定时1:
		//正弦数据处理
		if (theApp.a_iChannel==0)										//正弦数据处理
		{
			v_iX_number=-1;												//数据采集x计数复位
			v_iCurveCount++;											//绘制图形序号
			v_sTemp.Format("Test_%d", v_iCurveCount);					//曲线名称
			v_iIndex=v_pCurveCtrl->AddCurve(v_sTemp, v_sColours[v_iCurveCount % v_iColourCount].crColour);
																		//增加一条曲线、名称及其显示色彩
			for (v_fX = 0 ; v_fX <128; v_fX++)
			{
				v_iX_number=v_iX_number+v_iCurveCount;					//数据采集x计数
				v_fY=float(10.0)*float(v_iCurveCount)*float((sin(v_fX/20)));
				We_adddate(v_fX*v_iCurveCount,v_fY,v_iIndex);			//增加绘图数据
																		//数值计算
			}
		}

⌨️ 快捷键说明

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