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

📄 powerdlg.cpp

📁 一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			for (k=2;k<len-1;k++)
			{
				BYTE bt =*(char *)(data2+k);
				//data3[k-2] =*(char *)(data2+k);
				//str +=data3[k-2];
				strtemp.Format("%c",bt);				
				str +=strtemp;
			}
				str+='\0';
				strcpy(data3,str);
				
				/*/////////////////////
				strtemp.Format("%c",data3[3]);				
				MessageBox(strtemp);
				*//////////////////////

			for (k=0;k<7;k++)
			{
				outputTorque +=data3[k];
				outputRate +=data3[k+7];
				inputTorque +=data3[k+14];
				inputRate +=data3[k+21];
			}

				outputTorque +='\0';
				outputRate +='\0';
				inputTorque +='\0';
				inputRate +='\0';
				
				//MessageBox(outputTorque);

			doutputTorque = atof(outputTorque);
			doutputRate = atof(outputRate);
			dinputRate = atof(inputRate);
			dinputTorque = atof(inputTorque);

			if(m_bPowerRTflag) //第一次读
			{				
				dinputTorque1 =dinputTorque;
				m_bPowerRTflag =FALSE;
			}
			else
			{			
				dinputTorque2 =dinputTorque;
				m_bPowerRTflag =TRUE;
			}			
			
			//dpower = (doutputTorque*doutputRate)/(dinputTorque*dinputRate);
			dpower = fabs(doutputTorque/(dinputTorque*160));

		if(dpower<2.5)//效率值小于2.5,数据正常
		{
			m_nTotalnumber++;//读取的次数加1
			m_nRdNumber++;//每组读取的次数加1
			m_nReadNumber++;  //读数次数加1
			pApp->pCTestFormDoc->pPowerInRate[m_nRdNumber-1] =dinputRate;
			pApp->pCTestFormDoc->pPowerOutRate[m_nRdNumber-1] =doutputRate;
			pApp->pCTestFormDoc->pPowerInTorque[m_nRdNumber-1] =dinputTorque;
			pApp->pCTestFormDoc->pPowerOutTorque[m_nRdNumber-1] =doutputTorque;
			pApp->pCTestFormDoc->pPowerData[m_nRdNumber-1] =dpower;	
		}
		else
			m_nPowerRTime --;	//计数器减1,放弃此次读数
			/*///-------测试开始------------////
			CString string,string5;
			string.Format("%d",m_nTotalnumber);			
			string5.Format("%5.3f",dpower);
			MessageBox(string);
			MessageBox(inputRate);
			MessageBox(outputRate);
			MessageBox(inputTorque);
			MessageBox(outputTorque);
			MessageBox(string5);
			////-------测试结束------------///*/

			//m_bPowerRTflag = FALSE;
			//过度过程试验所需操作
			////---------------过度过程试验所需操作开始-------------------////
			if (m_bResepOn)
			{
				//获得输出转速上升时间的起点
				if (m_bOutputRate_timef&&(doutputRate>=(m_dOutputRate_set*m_dOutputRate_ratef)))
				{
					m_bOutputRate_timef=FALSE;//不再读取系统时间
					pApp->pCTestFormDoc->pPowerRespData[0]=GetSystemTime();//获得系统时间
					pApp->pCTestFormDoc->pPowerRespData[1]=doutputRate;
					pApp->pCTestFormDoc->pPowerRespData[2]=m_nTotalnumber;
				}
				//获得输出转速上升时间的终点
				if (m_bOutputRate_timet&&(doutputRate>=(m_dOutputRate_set*m_dOutputRate_ratet)))
				{
					m_bOutputRate_timet=FALSE;//不再读取系统时间					
					pApp->pCTestFormDoc->pPowerRespData[3]=GetSystemTime();//获得系统时间
					pApp->pCTestFormDoc->pPowerRespData[4]=doutputRate;
					pApp->pCTestFormDoc->pPowerRespData[5]=m_nTotalnumber;
				}
				//获得输出转速峰值所对应的时间
				////----------------////
				//进行了3次读数
				if (m_nReadNumber>3)
				{
					double rdata,mdata,ldata;
					//寻找峰值
					//右侧值
					rdata=pApp->pCTestFormDoc->pPowerOutRate[m_nRdNumber-1];
					//中间值
					mdata=pApp->pCTestFormDoc->pPowerOutRate[m_nRdNumber-2];
					//左侧值
					ldata=pApp->pCTestFormDoc->pPowerOutRate[m_nRdNumber-3];
					//是峰值且该值比稳定的输出转速大,则该值即为所找峰值
					if (m_bOutputRate_times&&(mdata>=rdata)&&(mdata<=ldata)&&mdata>m_dOutputRate_set)
					{
						//获取该时刻的系统时间
						m_bOutputRate_timep=FALSE;//不再读取系统时间
						pApp->pCTestFormDoc->pPowerRespData[6]=GetSystemTime();//获得系统时间
					    pApp->pCTestFormDoc->pPowerRespData[7]=doutputRate;	
						pApp->pCTestFormDoc->pPowerRespData[8]=m_nTotalnumber;
					}
				}
				////----------------////
				//获得输出转速在稳定范围内的次数
				////----------------////
				if (m_bOutputRate_times&&(doutputRate>=(m_dOutputRate_set*(1-m_dOutputRate_stable)))
					&&(doutputRate<=(m_dOutputRate_set*(1+m_dOutputRate_stable))))
				{
					m_nOutputRate_redn++;				
				}
				if (m_bOutputRate_times&&(m_nReadNumber>10))//已经进行了10次读数
				{
					double divide=m_nReadNumber/m_nOutputRate_redn;
					if (divide>dividerate)
					{
						m_bOutputRate_times=FALSE;//不再读取系统时间
						pApp->pCTestFormDoc->pPowerRespData[9]=GetSystemTime();//获得系统时间
						pApp->pCTestFormDoc->pPowerRespData[10]=m_nTotalnumber-10;
						m_nOutputRate_addn =m_nTotalnumber/3; 
						m_nReadNumber=1;  //读数次数清零
					}
					m_nReadNumber=1;
					m_nOutputRate_redn=1;
				}
				////----------------////
			}
			////----------------过度过程试验所需操作结束-------------------////

		if (m_nPowerRTime > 0)
		{
			//先将列表控制框中的内容清除
			m_cPowerRdata.DeleteAllItems();

			//将输出扭矩显示在列表控制框中			
			m_cPowerRdata.InsertItem(LVIF_TEXT|LVIF_STATE,
									0, //要插入条目的索引号
									outputTorque, //第一栏要插入的字符串
									LVIS_SELECTED|LVIS_FOCUSED, 
									LVIS_SELECTED|LVIS_FOCUSED,
									0,
									0);
			//将输出转速显示在列表控制框中
			m_cPowerRdata.SetItemText(0,1,outputRate);//条目的索引号,
		                                             //第几栏(从0开始),要设置的字符串
			
			//将输入扭矩显示在列表控制框中
			m_cPowerRdata.SetItemText(0,2,inputTorque);
			//将输入转速显示在列表控制框中
			m_cPowerRdata.SetItemText(0,3,inputRate);

			//读数计数器赋为0
			m_nPowerRTime = 0;
		}

		//用于判断效率仪读取的数据是否为m_nNumber(4)的倍数
		int nresidue =m_nTotalnumber%m_nNumber;
		int nresidue1 =m_nTotalnumber%64;	
			if ((nresidue==0)&&m_nTotalnumber>0)
			{			
				switch(hitnumber)
				{
				case 0x011:		//效率试验
				pApp->pCTestFormDoc->nPowerNumber = m_nRdNumber;
				pApp->pCTestFormDoc->nTotalPowerNumber = m_nTotalnumber;
				//发送消息至画图对话框
				pApp->pCTestFormView->powerDrawDlg.SendMessage(WM_POWERDAQ_FINISH,0,0);
					break;
				case 0x012:		//超载试验
				pApp->pCTestFormDoc->nPowerNumber = m_nNumber;
				pApp->pCTestFormDoc->nTotalPowerNumber = m_nTotalnumber;
				//发送消息至画图对话框
				pApp->pCTestFormView->overDrawDlg.SendMessage(WM_POWERDAQ_FINISH,0,0);
					break;
				default:
					break;
				}
				if(nresidue1==0)				
				m_nRdNumber=0;//重新开始一组读数
			}
			////-----------度过程试验所需操作开始----------------////
			if (m_bResepOn&&(m_nReadNumber>m_nOutputRate_addn))
			{
				//停止接收数据,并发送消息至过度过程试验绘图窗口,触发画图
				m_bPowerReceive =FALSE;
				pApp->pCTestFormDoc->nPowerNumber = m_nTotalnumber;
				pApp->pCTestFormDoc->nTotalPowerNumber = m_nTotalnumber;
				pApp->pCTestFormView->respDrawDlg.SendMessage(WM_POWERDAQ_FINISH,0,0);
			}
			////-----------度过程试验所需操作结束----------------////
		//////////////////////////////////////////

		/*/两次读得的输入扭矩相差不到0.01,停止接收数据
		if(fabs(dinputTorque2 - dinputTorque1)<0.01)
			m_bPtestReceive = FALSE;
		else 
			m_bPtestReceive = TRUE;
		*///
		//////////////////////////////////
		}	
	}	
}
//响应点击过渡过程试验中开始试验按钮的函数
void PowerDlg::OnMotrespstarthit(WPARAM wParam, LPARAM lParam)
{
//	MessageBox("0");	
	m_bResepOn =TRUE;//进行过度过程试验
	//获得输出值的设定比例值
	int rate = (int)wParam;
	//获得输出值的设定值
	m_dOutputRate_set = (double)lParam;
	//获取过度过程各个设定值
	switch(rate) 
	{
	case 0x000:
		m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
		m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
		m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
		//MessageBox("0");
		break;
	case 0x001:
		m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
		m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
		m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
		//MessageBox("1");
		break;
	case 0x010:
		m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
		m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
		m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
		break;
	case 0x011:
		m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
		m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
		m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
		break;
	case 0x100:
		m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
		m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
		m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
		break;
	case 0x101:
		m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
		m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
		m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
		break;
	case 0x110:
		m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
		m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
		m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
		//MessageBox("110");
		break;
	case 0x111:
		m_dOutputRate_ratef=0.0;//用于存放过度过程试验中输出转速的上升起点
		m_dOutputRate_ratet=1.0;//用于存放过度过程试验中输出转速的上升终点
		m_dOutputRate_stable=0.10;//用于存放过度过程试验中输出转速的稳定范围
		break;
	default:
		//MessageBox("0");
		break;
	}
	//开始接收数据
	//PowerOpenport();
	OnBupowerReceive();
	//获得过度过程试验开始读数的系统时间
	m_dReadDatatime_start = GetSystemTime();
}

//获得系统时间
double PowerDlg::GetSystemTime()
{
	CString strTime; 
	double dmin,dsec,dtime;
	CTime CurrentTime=CTime::GetCurrentTime();

	dmin=CurrentTime.GetMinute();
	dsec=CurrentTime.GetSecond();

	dtime=dmin+dsec/60.0; 

	return dtime;
}

//点击效率试验主控窗口开始按钮消息响应函数
void PowerDlg::OnMotpowstarthit(WPARAM wParam, LPARAM lParam)
{
	//MessageBox("123");
	//开始接收数据
	//PowerOpenport();
	OnBupowerReceive();
}

//点击超载试验主控窗口开始按钮消息响应函数
void PowerDlg::OnMotoverstarthit(WPARAM wParam, LPARAM lParam)
{
	//MessageBox("123");
	//开始接收数据	
	OnBupowerReceive();
}

⌨️ 快捷键说明

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