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

📄 coderdlg.cpp

📁 一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
							//读取符号位
							dSignflag = data2[m_lStrStartpos+2]=='-'?  -1:1;
							//读取角度,三个值
							for(j=0;j<3;j++)
								strAngle += data2[m_lStrStartpos+3+j];
								strAngle +='\0';

								dAngle = atof(strAngle);
							//读取分,两个值
							for(j=0;j<2;j++)
								strCent += data2[m_lStrStartpos+7+j];
								strCent +='\0';

								dCent = atof(strCent);
								dCent = dCent/60;
							//读取秒,两个值
							for(j=0;j<2;j++)
								strSecond += data2[m_lStrStartpos+10+j];
								strSecond +='\0';

								dSecond = atof(strSecond);
								dSecond = dSecond/3600;
							//最后一位
								strLast = data2[m_lStrStartpos+13];
								strLast +='\0';

								dLast = atof(strLast);
								dLast = dLast/7200;
								
								//将数据组合成以度为单位的值
								dSeconddata = dSignflag*(dAngle+dCent+dSecond+dLast);

								//将读取的数据放在数据缓存数组
								m_pCoderData[m_nCoderRdn++] =dSeconddata;

								//将组合成的数据转换成字符串
								m_strTurn.Format("%0.8f",dSeconddata);
								m_strTurn +='\0';
								
							//第二次读取
							m_bCoderRTflag = FALSE;									
						}
					}					
				}		
			}
		}

///*	
		else 	// 第二次读数
		{
			variant_inp = m_cCoderCom.GetInput();   //读缓冲区
			data=(char*)(unsigned char*)variant_inp.parray->pvData;
			k=0;
			
			data1=data;
			while(k<len)
			{
				data2[k]= * data1;
				k++;
				data1++;				
			}

			//查找已读取字符串中的起始字符
			for (k=0;k<len;k++)
			{
				if(data2[k]=='$')			
				{
					m_lStrStartpos=k;
					m_lStarttoEnd=len-k;
					if (m_lStarttoEnd>12)
					{
					  	if((data2[m_lStrStartpos+13]>='0')
							&&(data2[m_lStrStartpos+13]<='9'))
						{
							for(j=0;j<14;j++)						
						 	m_strReceive +=data2[m_lStrStartpos+j];
							m_strReceive +='\0';
							
							//MessageBox(m_strReceive);
		/*	
		//将原始数据显示在列表控制框中
		m_cCoderRdata.InsertItem(LVIF_TEXT|LVIF_STATE,
									0, //要插入条目的索引号
									m_strReceive, //第一栏要插入的字符串
									LVIS_SELECTED|LVIS_FOCUSED, 
									LVIS_SELECTED|LVIS_FOCUSED,
									0,
									0);						
		*/
							//读取符号位
							dSignflag = data2[m_lStrStartpos+2]=='-'?  -1:1;
							//读取角度,三个值
							for(j=0;j<3;j++)
								strAngle += data2[m_lStrStartpos+3+j];
								strAngle +='\0';

								dAngle = atof(strAngle);
							//读取分,两个值
							for(j=0;j<2;j++)
								strCent += data2[m_lStrStartpos+7+j];
								strCent +='\0';

								dCent = atof(strCent);
								dCent = dCent/60;
							//读取秒,两个值
							for(j=0;j<2;j++)
								strSecond += data2[m_lStrStartpos+10+j];
								strSecond +='\0';

								dSecond = atof(strSecond);
								dSecond = dSecond/3600;
							//最后一位
								strLast = data2[m_lStrStartpos+13];
								strLast +='\0';

								dLast = atof(strLast);
								dLast = dLast/7200;
								
								//将数据组合成以度为单位的值
								dFirstdata = dSignflag*(dAngle+dCent+dSecond+dLast);

								//将读取的数据放在数据缓存数组
								m_pCoderData[m_nCoderRdn++] =dFirstdata;

								//将组合成的数据转换成字符串
								m_strTurn.Format("%0.8f",dFirstdata);
								m_strTurn +='\0';

		//将转换后的数据显示在列表控制框中
		//m_cCoderRdata.SetItemText(0,1,m_strTurn);//条目的索引号,第几栏(从0开始),要设置的字符串							

							//第一次读取
							m_bCoderRTflag = TRUE;							
						}
					}					
				}		      
			}
		}
///*
	if(m_nCoderRTime >2)
	{
		//先将列表控制框中的内容清除
		m_cCoderRdata.DeleteAllItems();

		//将原始数据显示在列表控制框中
		m_cCoderRdata.InsertItem(LVIF_TEXT|LVIF_STATE,
									0, //要插入条目的索引号
									m_strReceive, //第一栏要插入的字符串
									LVIS_SELECTED|LVIS_FOCUSED, 
									LVIS_SELECTED|LVIS_FOCUSED,
									0,
									0);
		//将转换后的数据显示在列表控制框中
		m_cCoderRdata.SetItemText(0,1,m_strTurn);//条目的索引号,
		                                             //第几栏(从0开始),要设置的字符串
		//读数计数器赋为0
		m_nCoderRTime = 0;		
	}
//*/
	if (m_nCoderRdn>3)//读取到了4个数据
	{
		m_nCoderRdn=0;//组读数计数清零
		//数据之间相差不大于2秒,即一次读数完成
	if (fabs((m_pCoderData[0]+m_pCoderData[3])-(m_pCoderData[1]+m_pCoderData[2]))<MINIDATA)
		{
				switch(hitnumber)
				{
				case 0x013:		//传动精度试验				
				//发送消息至主控窗口
				pApp->pMotorDlgBase->prvDlg.SendMessage(WM_CODERDAQ_ONE,0,0);
					break;
				case 0x016:		//空程回差试验
				//发送消息至画图对话框
				//pApp->pCTestFormView->overDrawDlg.SendMessage(WM_CODERDAQ_ONE,0,0);
					break;
				default:
					break;
				}
			//第四次读数作为有效数据
			pApp->pCTestFormDoc->pCoderData[m_nCoderRdOnen]=m_pCoderData[3];
			pApp->pCTestFormDoc->pCoderDatapos[m_nCoderRdOnen]=m_pCoderDataposi[m_nCoderRdOnen];
			m_nCoderRdOnen++;
			
			/*刚度及回差试验所需代码*/
			////-------------------------////
			if (m_bCoderRigon)//进行刚度及回差试验
			{
				if (m_bCoderRigFirstRD)//首次读数
				{
					m_bCoderRigFirstRD=FALSE;
					m_nCoderRdOnen=0;
				}
				if (m_bCoderRigload&&m_bCoderRigcload)//点击了加载按钮同时又点击了取消加载按钮
				{
					m_nCoderRdOnen--;//剔除此次读数
					m_bCoderRigcload=FALSE;//重新读取一个数据
				}
				if (m_bCoderRigunload&&m_bCoderRigcunload)//点击了卸载按钮同时又点击了取消卸载按钮
				{
					m_nCoderRdOnen--;//剔除此次读数
					m_bCoderRigcunload=FALSE;//重新读取一个数据
				}
				if (!(m_bCoderRigload&&m_bCoderRigcload)&&
					(m_bCoderRigunload&&m_bCoderRigcunload))
				{
					m_nCoderRdOnen--;//剔除此次读数
				}
					//读完一次数据后,即停止读数,此处通过使两个布尔变量有效
						//相当于同时点击了加载、取消加载按钮
					m_bCoderRigload=TRUE;
					m_bCoderRigcload=TRUE;
			}
			////-------------------------////

			//编码器读数达到设定值即采集到了m_nCoderRdTotaln+1个数据
			if (m_nCoderRdOnen>m_nCoderRdTotaln)
			{
				//m_bCoderReceive=FALSE;//停止接收数据

				m_nCoderRdOnen=0;//重新读取一组数据

				switch(hitnumber)
				{
				case 0x013:		//传动精度试验
				//发送消息至绘图窗口
				pApp->pCTestFormView->prvDrawDlg.SendMessage(WM_CODERDAQ_FINISH,0,0);
				m_bCoderReceive=FALSE;//停止接收数据
					break;
				case 0x016:		//空程回差试验
				//发送消息至画图对话框
				//pApp->pCTestFormView->overDrawDlg.SendMessage(WM_CODERDAQ_ONE,0,0);
					break;
				case 0x017:		//刚度及回差试验
				//发送消息给主控窗口
				pApp->pMotorDlgBase->rigidDlg.SendMessage(WM_CODERDAQ_FINISH,m_nCoderRigSmtime,0);
//发送消息给画图窗口
pApp->pCTestFormView->rigidDrawDlg.SendMessage(WM_CODERDAQ_FINISH,m_nCoderRigSmtime,m_nCoderRdOnen);				
m_nCoderRigSmtime++;//发送消息次数加1
					break;
				default:
					break;
				}

				if(m_nCoderRigSmtime>1)//刚度及回差试验发送了两次数据
					m_bCoderReceive=FALSE;//停止接收数据
			}			
		}
	}
	/*//////////////////////////////////
    if (fabs(dSeconddata - dFirstdata)<MINIDATA)	//两次读数之间相差不大于1秒    
		m_bCoderReceive = FALSE;
	else 
		m_bCoderReceive = TRUE;
	*//////////////////////////////////
		}	
	}
	free(data);	
	free(data1);	
}

//点击传动精度试验主控窗口开始按钮消息响应函数
void CCoderDlg::OnMotprvstarthit(WPARAM wParam, LPARAM lParam)
{
	//MessageBox("1");
	m_nCoderRdTotaln=(int) wParam;//输出轴一转内测试的点数即编码器需要读取的数据总数
// 	OnBucoderSet();//设置串口
//	CoderOpenport();//打开串口
	OnBucoderReceive();//接收数据	
}

//点击启动力矩试验主控窗口开始按钮消息响应函数
void CCoderDlg::OnMotstartstarthit(WPARAM wParam, LPARAM lParam)
{	
	OnBucoderReceive();//接收数据	
	//MessageBox("123");
}

//点击刚度及回差试验主控窗口开始按钮消息响应函数
void CCoderDlg::OnMotrigstarthit(WPARAM wParam, LPARAM lParam)
{	
	//进行刚度及回差试验
	m_bCoderRigon=TRUE;
	//刚度及回差试验时输出轴单向加载次数即编码器需要读取的数据总数
	m_nCoderRdTotaln=(int) wParam;
	//接收数据
	OnBucoderReceive();
	//MessageBox("123");
}

//点击刚度及回差试验主控窗口加载按钮消息响应函数
void CCoderDlg::OnMotrigloadhit(WPARAM wParam, LPARAM lParam)
{
	m_bCoderRigload=TRUE;		//点击了加载按钮
	m_bCoderRigcload=FALSE;		//未点击取消加载按钮
	m_bCoderRigunload=FALSE;	//未点击了卸载按钮
	m_bCoderRigcunload=FALSE;	//未点击了取消卸载按钮

	OnBucoderReceive();//接收数据
}

//点击刚度及回差试验主控窗口取消加载按钮消息响应函数
void CCoderDlg::OnMotrigcloadhit(WPARAM wParam, LPARAM lParam)
{
	m_bCoderRigcload=TRUE;		//点击了取消加载按钮
	m_bCoderRigload=TRUE;		//点击了加载按钮
	m_bCoderRigunload=FALSE;	//未点击了卸载按钮
	m_bCoderRigcunload=FALSE;	//未点击了取消卸载按钮

	OnBucoderReceive();//接收数据
}

//点击刚度及回差试验主控窗口卸载按钮消息响应函数
void CCoderDlg::OnMotrigunloadhit(WPARAM wParam, LPARAM lParam)
{
	m_bCoderRigunload=TRUE;		//点击了卸载按钮
	m_bCoderRigunload=FALSE;	//未点击取消卸载按钮
	m_bCoderRigload=FALSE;		//未点击了加载按钮
	m_bCoderRigcload=FALSE;		//未点击了取消加载按钮

	OnBucoderReceive();//接收数据
}

//点击刚度及回差试验主控窗口取消卸载按钮消息响应函数
void CCoderDlg::OnMotrigcunloadhit(WPARAM wParam, LPARAM lParam)
{
	m_bCoderRigunload=TRUE;		//点击了取消卸载按钮
	m_bCoderRigunload=TRUE;		//点击了卸载按钮	
	m_bCoderRigload=FALSE;		//未点击了加载按钮
	m_bCoderRigcload=FALSE;		//未点击了取消加载按钮

	OnBucoderReceive();//接收数据
}

⌨️ 快捷键说明

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