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

📄 mastercontroldlg.cpp

📁 Source code for cnc controlling three dimentioal machine
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    m_YLocVar = YCurrent; 
    m_ZLocVar = ZCurrent; 
	UpdateData(false);
}

void CMasterControlDlg::OnHomey() 
{
	if( ! Enable )
   {
	   MessageBox( " --- Emergency Stop ---- " );
	   return;
   }
	GoToPos( XCurrent, 0 , ZCurrent );
    m_XLocVar = XCurrent; 
    m_YLocVar = YCurrent; 
    m_ZLocVar = ZCurrent; 
	UpdateData(false);
	
}

void CMasterControlDlg::OnHomez() 
{
	if( ! Enable )
   {
	   MessageBox( " --- Emergency Stop ---- " );
	   return;
   }
	GoToPos( XCurrent, YCurrent, 0 );
    m_XLocVar = XCurrent; 
    m_YLocVar = YCurrent; 
    m_ZLocVar = ZCurrent; 
	UpdateData(false);
	
}

void CMasterControlDlg::OnSethome() 
{
	m_XLocVar = XCurrent = 0; 
    m_YLocVar = YCurrent = 0; 
    m_ZLocVar = ZCurrent = 0; 
	XDigPos =0; YDigPos = 0; ZDigPos = 0;
	m_LEDXHome.Depress(TRUE);
	m_LEDYHome.Depress(TRUE);
	m_LEDZHome.Depress(TRUE);
	UpdateData(false);
}

BOOL CMasterControlDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CDialog::Create(IDD, pParentWnd);
}

int CMasterControlDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	 
	
if (CDialog::OnCreate(lpCreateStruct) == -1)
      return -1;
   
  
	
	return 0;
}

void CMasterControlDlg::OnDeltaposCurspin(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	
	*pResult = 0;
}

void CMasterControlDlg::OnDispoff() 
{
    DispOn = false;
	m_DispOnLed.Depress( false );
	m_DispOffLed.Depress( true );

}

void CMasterControlDlg::OnDispon() 
{
	DispOn = true;
	m_DispOnLed.Depress( true );
	m_DispOffLed.Depress( false );

	
}


void CMasterControlDlg::DoRun() 		  // gets called from OnIdle();
{
	Line data;
	if( !RUN ) return;
	KillTimer(1);
	 
	while ( curline < lastline )
	{
	 
		data = DecodeLine( curline );
		if (data.xloc < 9999) m_XLocVar = data.xloc;
		   else m_XLocVar = XCurrent;
        if( data.yloc < 9999) m_YLocVar = data.yloc;
		   else m_YLocVar = YCurrent;
        if( data.zloc < 9999) m_ZLocVar = data.zloc;
		   else m_ZLocVar = ZCurrent;
        if( data.ival < 9999) m_ILocVar = data.ival;
		   else m_ILocVar = XCurrent;
        if( data.jval < 9999) m_JLocVar = data.jval;
		   else m_JLocVar = YCurrent;
        if( data.kval < 9999) m_KLocVar = data.kval;
		   else m_KLocVar = ZCurrent;
        if( data.gmode < 9999 ) GMode = data.gmode;


		if( data.tool != 9999 && !Simulate ) 
		{
			if( ToolChange )
			{
			  GoToPos( XCurrent, YCurrent, ToolChangeZ );
			  GoToPos( ToolChangeX , ToolChangeY, ToolChangeZ);
			}
			AfxMessageBox( "Tool Change" , MB_OK , 0 );	
			if( ToolChange )
			{
			GoToPos( XCurrent, YCurrent, ToolChangeZ );
			GoToPos( XCurrent, YCurrent, ZCurrent );
			}

		}
		//if(  data.rval < 9999)
		//{
		//	AfxMessageBox( "R Data found. Aborting..." );
		//	RUN = FALSE;
		//	return;
		//}
  if( GMode == 4) Sleep( 250 );
   else
  if( GMode == 3 && Axis == 1) G03();                      // circular CCW
   else
  if( GMode == 2 && Axis == 1) G02();                      // circular CW
   else
  if( GMode == 3 && Axis == 2) G032();                      // circular CCW
   else
  if( GMode == 2 && Axis == 2) G022();  
   else
  if( GMode == 3 && Axis == 3) G033();                      // circular CCW
   else
  if( GMode == 2 && Axis == 3) G023();  
   else
	  GoToPos( m_XLocVar, m_YLocVar, m_ZLocVar);     // Linear
        curline++;
	 	if( curline >= lastline ) break;
		if( !vector[curline] ) break;  
		if( !Enable ) break;
	
	}
  m_CurLineInt = curline;
  if( !Simulate && Simulated) 
  {  int left = (int) (TimeCalc - TimeEstimate);
     int a = (int) (left / 3600);
     int b = (int) (left-(a*3600)) / 60;
     int c = (int) left - (a*3600) - (b*60); 
     m_TimeLeft.Format( "%u:%u:%u" , a, b, c);
  }
  UpdateData(FALSE);
  UpdateWindow();
  //if( rightnow - started  >  3962 ) curline++;							   // protection line
  if( !Simulate) SetTimer(1, StopDelay ,NULL); else SetTimer( 1,1,NULL );
  if( Simulate && curline >= lastline ) EndSimulate();
  if( curline >= lastline) 
  { 
	  m_Running.Depress( false); 
	  RUN = FALSE; 
	  RouterOff(); 
	  Axis = 1;
	  GMode = 0;
	  if( Automatic ) Emergency();
	  AfxMessageBox( "Program Complete" );
  }	
}


void CMasterControlDlg::OnTimer(UINT nIDEvent) 
{
	if( nIDEvent == 2 )
	{
		if( EStopFlash ) EStopFlash = false; else EStopFlash = true;
		if( EStopFlash ) m_LEDEmerg.Depress(false);
		else m_LEDEmerg.Depress(true);
		CDialog::OnTimer(nIDEvent);
	}

    DoRun();
	CDialog::OnTimer(nIDEvent);
}

void CMasterControlDlg::OnRun() 
{
	if( ! Enable )
   {
	   MessageBox( " --- Emergency Stop ---- " );
	   return;
   }
  if( !FileLoaded ) return;
  TimeEstimate = 0;
  m_Running.Depress( true );
  SetTimer( 1, 250, NULL );
  RUN = true;
}

void CMasterControlDlg::OnPause() 
{
  m_Running.Depress( false );
  RUN = false;
  KillTimer( 1 );

  //terp.SetInterp( 0, 100,50,0 ); // set pos 1 to 0,0,0
  //terp.SetInterp( 1, 0,0,10 );
  //terp.SetInterp( 2, -100,50,20 );
  //float t =.5;
  //terp.DoInterp( t );

	
}

void CMasterControlDlg::DrawTo()
{
  static int  x = 0, y=0;

  if( !FileLoaded ) return;

  if( x == (int) XCurrent &&  y == (int) YCurrent ) return;

  CDC *dc = m_Display.GetDC();

  dc->MoveTo( x , 179 - y );

  int nx = (int) ( XCurrent * bitmapX );
  int ny = (int) ( YCurrent * bitmapY );
  int nz;
  if (ZCurrent < 0) nz = (int) ( ZCurrent * bitmapZ );
  else 
	  nz = 255;
  if( nz < 0) nz = -nz;
  if( nz > 100) nz = 255;
  nz = 128-nz;
  
  CPen BlackPen( PS_SOLID, 0, RGB( nz, nz, nz ));
  CPen RedPen( PS_SOLID, 0, RGB( 128-nz, 0,0));

  CPen *oldPen;
	  
  if( Simulate ) oldPen = dc->SelectObject(&BlackPen);
	  else
		         oldPen = dc->SelectObject(&RedPen);

  if( nx > 179) nx = 179;
  if( ny > 179) ny = 179;
  if( nx < 0 ) nx = 0;
  if( ny < 0 ) ny = 0;
  x = nx; y = ny;
  dc->LineTo( nx, 179 - ny );
   
   
  dc->SelectObject( oldPen );
  m_Display.ReleaseDC( dc );
  //dc->DeleteDC();


}

void CMasterControlDlg::OnSimulate() 
{
  if( !FileLoaded ) return;
  Simulate = true;
  curline = 0;
  TimeEstimate = 0;
  RUN = true;
  SetTimer( 1,1,NULL );
  
}

void CMasterControlDlg::EndSimulate()
{
 Simulate = false;
 Simulated = true;
 RUN = false;
 KillTimer(1);
  TimeCalc = TimeEstimate;
  int a = (int) TimeCalc / 3600;
  int b = (int) (TimeCalc - (a*3600) ) / 60;
  int c = (int) TimeCalc - (a*3600) - (b*60); 
  m_Estimate.Format( "%d:%d:%d" , a, b, c);
  UpdateData( false );			 // set the estimed time here with TimeEstimate
  curline = 0;
   
  TimeEstimate = 0;
  	m_XLocVar = XCurrent = 0; 
    m_YLocVar = YCurrent = 0; 
    m_ZLocVar = ZCurrent = 0; 
	XDigPos =0; YDigPos = 0; ZDigPos = 0;
	m_LEDXHome.Depress(TRUE);
	m_LEDYHome.Depress(TRUE);
	m_LEDZHome.Depress(TRUE);
	UpdateData(false);
    m_LEDRoute.Depress(false);
	 
	Spindle = false;
    
}

void CMasterControlDlg::OnReset() 
{

 m_CurLineInt = 0;
 curline = 0;
 UpdateData( false );	
	
}

double CMasterControlDlg::GetTime()
{

	LARGE_INTEGER  now;

    double seconds = 0;
	QueryPerformanceCounter( &now );
	
	__int64 temp = now.QuadPart;
    seconds = ((double)temp) / frequency.QuadPart;

  	return seconds;

}

double CMasterControlDlg::CalcLatency()
{
	double start = GetTime();
	XPulse = true; YPulse = true; ZPulse = true;
	DoPulse();
	double now = GetTime();
	return now - start;

}

 

void CMasterControlDlg::G02()
{

   double AngStart,AngFinish,AngIterate,XIterate,YIterate,ZIterate;
   double XOffset,YOffset,ZOffset,Radius,TotalAngle,DeltaAngle;
   
   XOffset = XCurrent - m_ILocVar;        // find start Angle
   YOffset = YCurrent - m_JLocVar;
   ZOffset = ZCurrent - m_ZLocVar;

   Radius = sqrt( pow(XOffset,2) + pow(YOffset,2) );
    
   AngStart = atan2( XOffset , YOffset ); // this should work for all quadrants;

   XOffset = m_XLocVar - m_ILocVar;       // and end angle;
   YOffset = m_YLocVar - m_JLocVar;
   ZOffset = m_ZLocVar - ZCurrent;

   AngFinish = atan2( XOffset, YOffset );

   if( AngFinish >= AngStart ) AngFinish -= 6.2831852;   // two times PI
        
   if( Radius == 0 ) return;          // we now have a 3d Radius value 
   TotalAngle = AngStart - AngFinish;
   if( TotalAngle < 0) TotalAngle += 6.2831852;
   if( TotalAngle == 0) TotalAngle = 6.2831852;

   DeltaAngle = TotalAngle / ((6.2831852 * Radius * ( TotalAngle / 6.2831852)) / MaxRes);
   ZIterate = ZOffset / ( TotalAngle / DeltaAngle );   
        // angle step for max resolution detremined from circumferance / Maximun resolution.
   AngIterate = AngStart; XIterate = XCurrent; YIterate = YCurrent;
   double ZHold = 0;
   double ZHolder = ZCurrent;
   while( AngIterate > ( AngFinish - DeltaAngle))
   {
	   YIterate = (Radius * cos( AngIterate)) + m_JLocVar; // new x
	   XIterate = (Radius * sin( AngIterate)) + m_ILocVar; // new Y
	   double dist = XIterate - XCurrent;
	   double dist1 = YIterate - YCurrent;
	   if( dist < 0) dist = -dist;
	   if( dist1 < 0) dist1 = -dist1;
	   ZHold += ZIterate;
	   if( dist >= MaxRes || dist1 >= MaxRes)
              GoToPos( XIterate, YIterate, ZHolder + ZHold);           // go there
	   AngIterate -= DeltaAngle;                         // next angle
   }
   GoToPos( m_XLocVar, m_YLocVar, m_ZLocVar );

}
 


void CMasterControlDlg::G03()
{

double AngStart,AngFinish,AngIterate,XIterate,YIterate,ZIterate;
double XOffset,YOffset,ZOffset,Radius,TotalAngle,DeltaAngle;

    
   
   XOffset = XCurrent - m_ILocVar;        // find start Angle
   YOffset = YCurrent - m_JLocVar;
   ZOffset = ZCurrent - m_ZLocVar;

   Radius = sqrt( pow(XOffset,2) + pow(YOffset,2) );
    
   AngStart = atan2( XOffset , YOffset ); // this should work for all quadrants;

   XOffset = m_XLocVar - m_ILocVar;       // and end angle;
   YOffset = m_YLocVar - m_JLocVar;
   ZOffset = m_ZLocVar - ZCurrent;

   AngFinish = atan2( XOffset, YOffset );

   if( AngFinish <= AngStart ) AngFinish += 6.2831852;   // two times PI
        
   if( Radius == 0 ) return;          // we now have a 3d Radius value 
   TotalAngle = AngStart - AngFinish;
   if( TotalAngle < 0) TotalAngle += 6.2831852;
   if( TotalAngle == 0) TotalAngle = 6.2831852;

   DeltaAngle = TotalAngle / ((6.2831852 * Radius * ( TotalAngle / 6.2831852)) / MaxRes);
   ZIterate = ZOffset / ( TotalAngle / DeltaAngle );   
        // angle step for max resolution detremined from circumferance / Maximun resolution.
   AngIterate = AngStart; XIterate = XCurrent; YIterate = YCurrent;
   double ZHold = 0;
   double ZHolder = ZCurrent;
   while( AngIterate < ( AngFinish - DeltaAngle))
   {
	   YIterate = (Radius * cos( AngIterate)) + m_JLocVar; // new x
	   XIterate = (Radius * sin( AngIterate)) + m_ILocVar; // new Y
	   double dist = XIterate - XCurrent;
	   double dist1 = YIterate - YCurrent;
	   if( dist < 0) dist = -dist;
	   if( dist1 < 0) dist1 = -dist1;
	   ZHold += ZIterate;
	   if( dist >= MaxRes || dist1 >= MaxRes)
              GoToPos( XIterate, YIterate, ZHolder + ZHold);           // go there
	   AngIterate += DeltaAngle;                         // next angle
   }
   GoToPos( m_XLocVar, m_YLocVar, m_ZLocVar );
}

void CMasterControlDlg::G032()
{
	double AngStart,AngFinish,AngIterate,XIterate,YIterate,ZIterate;
   double XOffset,YOffset,ZOffset,Radius,TotalAngle,DeltaAngle;
   
   XOffset = XCurrent - m_X

⌨️ 快捷键说明

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