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

📄 beihangdlg.cpp

📁 基于固高运动控制卡的二轴步进电机控制软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}
void CBeihangDlg::OnButtonZPause() 
{
	// TODO: Add your control notification handler code here
	unsigned short Curren_Axis=1,Status;long sit;
	short rtn=GT_GetSts(&Status);
	if(!(Status&1))
	{rtn=GT_AbptStp();
		if(rtn==-1)//DLL_SngAxis_eStop(Curren_Axis))
		{	
			AfxMessageBox("Z轴停车失败");
		}
	else
		{	
		rtn=GT_GetAtlPos(&sit);
		GetSystemTime(&t2);
		ltime=(t2.wDay-t1.wDay)*3600*24+(t2.wHour-t1.wHour)*3600+\
			(t2.wMinute-t1.wMinute)*60+t2.wSecond-t1.wSecond\
			+(t2.wMilliseconds-t1.wMilliseconds)/1000.0;
		m_dblZCurPos-=m_ZObjPos;
		m_dblZCurPos+=((int)(curspeed*ltime*10))/10.;
		m_ZObjPos=0;
		curspeed=0;
	//	m_dblZCurPos+=params.atlzpos();
		GT_ClrSts();
		UpdateData(0);
		}
	}
}

void CBeihangDlg::OnButtonZZero() 
{
	// TODO: Add your control notification handler code here
m_dblZCurPos=0;
UpdateData(0);
}

void CBeihangDlg::OnButtonRZero() 
{
	// TODO: Add your control notification handler code here
	m_dblRCurPos=0;
	UpdateData(0);
}
void CBeihangDlg::OnButtonZero() 
{
	// TODO: Add your control notification handler code here
	//DLL_SetZero(2);
	long ctime,t;

	zerosit=-1;
//	m_ZObjPos=-m_dblZCurPos;
	m_dblRCurPos=-m_dblConRStart;
	m_dblZCurPos=-m_dblConZStart;
	OnBtnZGoto();
	time(&ctime);t=ctime;
	while(t<ctime+etime)
		time(&t);
//	m_dblRObjPos=-m_dblRCurPos;
	OnButtonRGoto();
	m_dblRCurPos=0;
	m_dblZCurPos=0;
	m_ZObjPos=0;
	m_dblRObjPos=0;
	m_dblConRStart=0;
	m_dblConZStart=0;
	UpdateData(0);
	zerosit=1;
}
void CBeihangDlg::OnButtonClear() 
{
	// TODO: Add your control notification handler code here
	//DLL_SetZero(2);
	runinfocnt=0;
	m_dblRCurPos=0;
	m_dblZCurPos=0;
	m_dblConRStart=0;
	m_dblConZStart=0;
	UpdateData(0);
}
int CBeihangDlg::OnButtonScanStart() 
{	bBreak=0;
	tasknum=1;
	if (SetTimer(1,200,NULL))
	{
		flag=0;
		return 1;
	}
	pv->draw();
	return 0;
}
void CBeihangDlg::OnButtonScanConEnd() 
{
	// TODO: Add your control notification handler code here
	flag=1;
	KillTimer(2);double temp;
	unsigned short Curren_Axis=2;
	if(!DLL_SngAxis_eStop(Curren_Axis))
	{	
		AfxMessageBox("R轴停车失败");
	}
	else
	{
		GetSystemTime(&t2);
		ltime=(t2.wDay-t1.wDay)*3600*24+(t2.wHour-t1.wHour)*3600+\
			(t2.wMinute-t1.wMinute)*60+t2.wSecond-t1.wSecond\
			+(t2.wMilliseconds-t1.wMilliseconds)/1000.0;
		temp=abs(((int)(curspeedr*ltime*10))/10.);
	}
	Curren_Axis=1;
	if(!DLL_SngAxis_eStop(Curren_Axis))
	{	
		AfxMessageBox("Z轴停车失败");
	}
	else
	{
		
	//	UpdateData();
	}
	if(m_dblConRStart<0)
		temp=-temp;
	params.axisRrun(60,-m_dblConRStart+temp);
			long time_start,time_temp;
			time(&time_start);	time_temp=0;
			while((double)(time_temp-time_start)<(abs(temp)/60+1))
			time(&time_temp);			
	 m_dblConRStart=0;
	 m_dblRCurPos=0;
	 //sign*=-1;
	 UpdateData(0);
}
void CBeihangDlg::OnButtonScanEnd() 
{
	// TODO: Add your control notification handler code here
	flag=1;
	unsigned short Curren_Axis=1;
	if(!DLL_SngAxis_eStop(Curren_Axis))
	{	
		AfxMessageBox("Z轴停车失败");
	}
	else
	{
		m_dblZCurPos+=params.atlzpos();
		UpdateData();
	}
}

int CBeihangDlg::OnBtnScanconStart() 
{tasknum=2;
bBreak=0;
	runinfocnt=0;
	UpdateData(true);
	RFinFlag=0;
	RRunFlag=0;
    ZFinFlag=0;
    ZRunFlag=0;
	double m_dblZStepDis=m_dblConZStep;
	
	nArrAxisZ.RemoveAll();
	nArrAxisR.RemoveAll();
	nArrAxisZ.SetSize(0);
	nArrAxisR.SetSize(0);
	
	nArrAxisZ.Add(m_dblConZStart);
	nArrAxisR.Add(m_dblConRStart);
	
	int m_nZSngStepNo=(int)(abs(m_dblConZDis/m_dblConZStep));
	for (int j=1;j<=m_nScanNumber*2;j++)
	{
		for(int i=1;i<=m_nZSngStepNo;i++)
		{	sign*=-1;
			m_dblConRDistance=sign * m_dblConRDistance;
			nArrAxisR.Add(m_dblConRDistance);
			nArrAxisZ.Add(m_dblZStepDis);
		}
		sign*=-1;
		nArrAxisR.Add(sign * m_dblConRDistance);
		nArrAxisZ.Add(0);
		m_dblZStepDis=-1 * m_dblZStepDis;
	}
	m_nTwoConTimes=0;
	m_nTwoNo=nArrAxisR.GetSize();
	int cc=m_nTwoNo;
	CArray<int,int> *p=(CArray<int,int> *)&nArrAxisZ;
	int c=m_nTwoNo;

	if (SetTimer(2,200,NULL))
		return 1;
	return 0;
}

HANDLE hSyncEvent,hSubThread;//信号量和线程句柄
bool stopflag;
void CBeihangDlg::OnDestroy() 
{
	
	
	// Close the servo and close the card
	short rtn;
	stopflag=true;
	if(hSyncEvent) 
		SetEvent(hSyncEvent);		//唤醒中断线程
	if(hSubThread) 
		CloseHandle(hSubThread);	//关闭中断线程	
	for(unsigned short i=1;i<3;i++) {
		rtn=GT_Axis(i);//	/error(rtn);
		rtn=GT_AbptStp();
		rtn=GT_AxisOff();//	error(rtn);
	}
	rtn=GT_Close();	//err(rtn);
	pv->draw();
  // KillTimer(1);
	CDialog::OnDestroy();
}


/*void CBeihangDlg::OnAxisMotion() 
{
	MessageBox("These routin illustrate how to make the axis run and how to respond\
		interrupt with background command.");

#define MAX_SIZE	500
	PBACKGROUND_COMMAND pBackCmd;
	PGENERAL_COMMAND pCmd;
	//指定要为多少种中断设置后台命令
	BgCmdSet.Count=1;			 //要为两种中断设置后台命令
	//分别为每个中断设置命令数组,对同一个中断允许设多条命令
	pBackCmd=BgCmdSet.BackgroundCommand;
	
	pBackCmd->InterruptMask=0x04;		//指定中断原因
	pBackCmd->CommandCount=1;		//产生本中断时要执行的命令数量
	//分别填充每一条命令
	//第一条命令
	pCmd=pBackCmd->GenCommand;
	pCmd->usCommand= Intr_GT_GetAtlPos; 	//设定命令类型字
	pCmd->OutputLength=0;	//该命令执行时,需要向DSP输出多少个字长度的数据
	pCmd->InputLength=2;		//该命令执行时,需要从DSP输入多少个字长度的数据
	pCmd->in.lData=5000;		//输入数据
	pCmd->out.lData=0;		//输出数据
	//将命令缓冲传给设备ISR
	short rtn=GT_SetBgCommandSet(&BgCmdSet,MAX_SIZE);  // err(rtn);
//之后释放内存
}*/
double sit[500][2];
static unsigned long count=0;
DWORD WINAPI CBeihangDlg::intproc(LPVOID param)
{	CBeihangDlg* pd=(CBeihangDlg*)param;
	double ltime,temp;
	unsigned short Status=0;
	short rtn;
	for(int i=0;i<500;i++)
	{
	sit[i][0]=0;sit[i][1]=0;	
	}
	ResetEvent(hSyncEvent);
	rtn=GT_CaptProb();
	while(1)
	{//waiting for interrupt happen
		WaitForSingleObject(hSyncEvent,INFINITE);
	if(!pd->bBreak)		
	{if(runinfocnt==0)
		{sit[0][0]=pd->m_dblZCurPos;
		sit[0][1]=pd->m_dblRCurPos;
		}
		GetSystemTime(&t2);
		if(stopflag)		break;
		//add your code for handling intrerrupt event here
/*very important!!!!!!!
*very important!!!!!!!!*/
 //error(rtn);
		rtn=GT_ExInpt(&Status);
		if(Status&0x1&&brun==1)
		{		
			//pgv->draw();
			pd->pv->draw();
			brun=0;
			break;

		}
		ltime=(t2.wDay-t1.wDay)*3600*24+(t2.wHour-t1.wHour)*3600+\
			(t2.wMinute-t1.wMinute)*60+t2.wSecond-t1.wSecond\
			+(t2.wMilliseconds-t1.wMilliseconds)/1000.0;
		if(!Status&0x01&&runinfocnt<100)
		{	if(pd->bstop)
			{GT_Axis(1);
			GT_AbptStp();
			GT_Axis(2);
			GT_AbptStp();
			if(pd->tasknum==1)
				pd->KillTimer(1);
			else if(pd->tasknum==2)
				pd->KillTimer(2);
			pd->bBreak=1;
			goto jmp;
			}
			temp=abs(((int)(pd->curspeed*ltime*10))/10.);
		
			if(temp>.2)
			{if(*pcuraxis==1)
				{
				sit[runinfocnt+1][0]=pd->m_dblZCurPos+temp;
				sit[runinfocnt+1][1]=pd->m_dblRCurPos;
				}
			else
				{
				sit[runinfocnt+1][0]=pd->m_dblZCurPos;
				sit[runinfocnt+1][1]=pd->m_dblRCurPos+temp;
				}
			//reset event state
			Beep(262,100);
			Beep(288,100);
			Beep(320,100);
			ResetEvent(hSyncEvent);
			if(runinfocnt>100)
				break;
			else if(abs(sit[runinfocnt+1][0]-sit[runinfocnt][0])>.2||\
				abs(sit[runinfocnt+1][1]-sit[runinfocnt][1])>10)
				runinfocnt++;
			}
			
		}
	}
		jmp:;
	}

	rtn=GT_SetIntSyncEvent(NULL);	 
	if(rtn) AfxMessageBox("Some function return a error!");
	//close Synchronize Event Handle 
	CloseHandle(hSyncEvent);
	ExitThread(0);
	return 0;
}


void CBeihangDlg::SetGTTimer() 
{
	//Create Sync event

	hSyncEvent=CreateEvent(NULL,true,false,NULL);
	if(hSyncEvent==INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("Create Synchnorize Event fail\n");
		return ;
	}
	short rtn;
	//将应用程序的事件与底层中断相关连
	rtn=GT_SetIntSyncEvent(hSyncEvent);	//	err(rtn);
	//设置中断时间
	rtn=GT_SetIntrTm(500);
	//rtn=GT_EvntIntr();//	err(rtn);
	//中断模式为事件中断
	rtn=GT_TmrIntr();	//	err(rtn);
	//中断模式设为时间中断
	//开设中断服务线程
	stopflag=false;
	DWORD idSubThread;

	hSubThread=CreateThread(NULL,
						0,
						(LPTHREAD_START_ROUTINE)CBeihangDlg::intproc, // the route handling interrupt
						this,//the parameter of intproc
						0,
						&idSubThread);

	//.......wait for interrupt----I do it in timer
	
}

void CBeihangDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(nChar==VK_CONTROL&&bstop)
	{flag=1;
	unsigned short Curren_Axis=1;
	if(!DLL_SngAxis_eStop(Curren_Axis))
	{	
		AfxMessageBox("Z轴停车失败");
	}
	else
	{
		//m_dblZCurPos+=params.atlzpos();
		//	UpdateData();
	}
	Curren_Axis=2;
	if(!DLL_SngAxis_eStop(Curren_Axis))
	{	
		AfxMessageBox("R轴停车失败");
	}
	else
	{
		//m_dblZCurPos+=params.atlzpos();
		//	UpdateData();
	}
	}
	
	CDialog::OnChar(nChar, nRepCnt, nFlags);
}

void CBeihangDlg::OnOK() 
{
	// TODO: Add your message handler code here and/or call default
		if(!DLL_SngAxis_eStop(1))
	{	
		AfxMessageBox("Z轴停车失败");
	}
	if(!DLL_SngAxis_eStop(2))
	{	
		AfxMessageBox("R轴停车失败");
	}
	CDialog::OnCancel();
}
void CBeihangDlg::OnFailureStop() 
{
	// TODO: Add your message handler code here and/or call default
	CWnd* p=this->GetDlgItem(IDC_BUTTON3);
	if(bstop==1)
	{	bstop=0;
		p->SetWindowText("缺陷纪录");
	}
	else
	{	bstop=1;
	p->SetWindowText("缺陷停止");
	}
}
void CBeihangDlg::OnCANCEL() 
{
	// TODO: Add your message handler code here and/or call default
	KillTimer(2);
	if(!DLL_SngAxis_eStop(2))
	{	
		AfxMessageBox("R轴停车失败");
	}
	if(!DLL_SngAxis_eStop(1))
	{	
		AfxMessageBox("Z轴停车失败");
	}
	CDialog::OnCancel();
}
void CBeihangDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
		if(nChar==VK_CONTROL&&bstop)
	{flag=1;
	unsigned short Curren_Axis=1;
	if(!DLL_SngAxis_eStop(Curren_Axis))
	{	
		AfxMessageBox("Z轴停车失败");
	}
	else
	{
		//m_dblZCurPos+=params.atlzpos();
		//	UpdateData();
	}
	Curren_Axis=2;
	if(!DLL_SngAxis_eStop(Curren_Axis))
	{	
		AfxMessageBox("R轴停车失败");
	}
	else
	{
		//m_dblZCurPos+=params.atlzpos();
		//	UpdateData();
	}
	}
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

⌨️ 快捷键说明

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