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

📄 mastercontroldlg.cpp

📁 Source code for cnc controlling three dimentioal machine
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}

void CMasterControlDlg::DoPulse()
{
 
 double delay = 0;
 double delay1 = 0;
 if( ! (XPulse || ZPulse || YPulse) ) return;
    
 if( Simulate ) return;	   // go away if simulating

 if( Spindle ) cOutData = SpindleMask;			   // port data to zero
   else
	           cOutData = 0;

	if(IO48)
	{
	_outp( DA , IO48data & 0xff );
	_outp( DB , (IO48data >> 8) & 0xff );	  // for large table
	_outp( DC , (IO48data >> 16) & 0xff );
	}

	delay = 0;
	if( XPulse ) delay = XOverLap;
	if( YPulse ) delay = __max(	YOverLap , delay );
	if( ZPulse ) delay = __max( ZOverLap , delay );		 // get overlap delay


	if( XDir ) cOutData |=  XDirMask;
	if( YDir ) cOutData |=  YDirMask;		// for printer port	direction pulses
	if( ZDir ) cOutData |=  ZDirMask;

	// step one....send dir pulse

	int retval=DeviceIoControl(hDevice, PORTIO_SEND_BYTE_TO_PINS2_TO_9,
		                       &cOutData, sizeof(cOutData), NULL, 0, &hold, NULL);



	Delay( delay );									// Delay for overlap time with dir on.

	if( IO48 && ZPulse )
	{
		  IO48data &= 0x7fffff;
		   _outp( DC , (IO48data >> 16) & 0xff );	// set z-clock pulse ...negative for drive
	}

	delay1 = 0;
	if( XPulse)  delay1 = XWidth;
	if( YPulse ) delay1 = __max( YWidth , delay1 );
	if( ZPulse ) delay1 = __max( ZWidth , delay1 );

	if( XPulse ) cOutData |= XStepMask;
	if( YPulse ) cOutData |= YStepMask;			 // for printer port clock pulses
	if( ZPulse ) cOutData |= ZStepMask;
	retval=DeviceIoControl(hDevice, PORTIO_SEND_BYTE_TO_PINS2_TO_9,
		                       &cOutData, sizeof(cOutData), NULL, 0, &hold, NULL);
	
	Delay( delay1 );									// Delay for Width time





	if( IO48  &&  ZPulse )
	{
		IO48data |= 0x800000;
		_outp( DC, (IO48data >> 16) & 0xff );		// clear z clock ... positive for clear
	}

	if( XPulse ) cOutData &=  (XStepMask ^ 0xff );
	if( YPulse ) cOutData &=  (YStepMask ^ 0xff );			 // turn off the clock pulse
	if( ZPulse ) cOutData &=  (ZStepMask ^ 0xff );

	retval=DeviceIoControl(hDevice, PORTIO_SEND_BYTE_TO_PINS2_TO_9,
		                       &cOutData, sizeof(cOutData), NULL, 0, &hold, NULL);
	Delay( delay );									// Delay for overlap again;
	if( IO48 )
		IO48data |=  0x400000;						//set z-direction bit;

	if( XPulse ) cOutData &=  (XDirMask ^ 0xff);
	if( YPulse ) cOutData &=  (YDirMask ^ 0xff );			 // turn off the dir pulse
	if( ZPulse ) cOutData &=  (ZDirMask ^ 0xff );

	 
	retval=DeviceIoControl(hDevice, PORTIO_SEND_BYTE_TO_PINS2_TO_9,
		                       &cOutData, sizeof(cOutData), NULL, 0, &hold, NULL);






	XPulse = false; YPulse = false; ZPulse = false;	 // clear the semaphores
	YDir   = false;	XDir   = false; ZDir   = false;	 // for movement
    LimitsIn();
	if( EStop ) Emergency();
	
	
}

void CMasterControlDlg::Delay(double delay)
{
	static first = 0;

	LARGE_INTEGER  since,now;
    double sofar = 0;
	QueryPerformanceCounter( &since );
	
	while( sofar < delay)
	{
	QueryPerformanceCounter( &now );
	__int64 temp = (now.QuadPart - since.QuadPart);
    sofar = ((double)temp) / frequency.QuadPart;
	}

	if( first==0  ) { started = sofar; first = 1; }
	rightnow = sofar;
  

}

void CMasterControlDlg::GoToPos(double newx, double newy, double newz)
{
   if( !Enable ) return;
   cOutData = 0;
   int sArray;
   long int nx,ny,nz;
   nx = (long int)  (newx / (double)XRes);
   ny = (long int)  (newy / (double)YRes);
   nz = (long int)  (newz / (double)ZRes);
   
   int xinc = abs( XDigPos - (UINT)nx);
   int yinc = abs( YDigPos - (UINT)ny);
   int zinc = abs( ZDigPos - (UINT)nz);

   sArray = __max( xinc,yinc );
   sArray = __max( sArray, zinc );
   if( Movements ) { delete[] Movements; Movements = NULL; }
   if( sArray != 0)  Movements = (unsigned char*)	new char[sArray];
   int index = 0;
   Moves = sArray;

   double xcount = 0, ycount = 0, zcount = 0;

   while( nx != XDigPos || ny != YDigPos || nz != ZDigPos)
   {
	 Movements[index] = 0;
     xcount += xinc;
     ycount += yinc;
     zcount += zinc;
     if( nz != ZDigPos )
	 {
        if( zcount >= max( xinc,yinc))
		{ 
	      if ( nz < ZDigPos ) { ZDigPos --;	Movements[index] |= 0x44; }	// z-step and dir = false
          else                { ZDigPos ++; Movements[index] |= 0x04; } // just z-step for true
          zcount -= max( xinc,yinc );
		}
	 }
     if( ny != YDigPos )
	 {
        if( ycount >= max(xinc,zinc) )
		{
	       if ( ny < YDigPos)  { YDigPos--; Movements[index] |= 0x22; }
           else                { YDigPos++; Movements[index] |= 0x02; }
           ycount -= max( xinc,zinc );
		}
	 }
     if( nx != XDigPos )
	 {
        if( xcount >= max(yinc,zinc) )
		{
	       if (nx < XDigPos) { XDigPos--; Movements[index] |= 0x11; }
           else              { XDigPos++; Movements[index] |= 0x01; }
           xcount -= max( yinc,zinc );
		}    
	 }
     index++; 
   }
   CalcRamp();
   BurstOut();
                // set new current location;
   XCurrent = (double)XDigPos * XRes;
   YCurrent = (double)YDigPos * YRes;
   ZCurrent = (double)ZDigPos * ZRes;

   if(XCurrent == 0 )   m_LEDXHome.Depress( true ); else  m_LEDXHome.Depress( false );
   if(YCurrent == 0 )	m_LEDYHome.Depress( true ); else  m_LEDYHome.Depress( false );
   if(ZCurrent == 0 )	m_LEDZHome.Depress( true ); else  m_LEDZHome.Depress( false );

   if( DispOn ) DrawTo();


}

void CMasterControlDlg::OnXplus() 
{
	if( ! Enable )
   {
	   MessageBox( " --- Emergency Stop ---- " );
	   return;
   }
	GMode = 1;
	 UpdateData(TRUE);
	 GoToPos( XCurrent + m_JogDist, YCurrent, ZCurrent);
	 m_XLocVar = XCurrent;
	 m_YLocVar = YCurrent;
     m_ZLocVar = ZCurrent;
	 UpdateData(false);

}

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

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

void CMasterControlDlg::OnYplus() 
{
	if( ! Enable )
   {
	   MessageBox( " --- Emergency Stop ---- " );
	   return;
   }
	GMode = 1;
    UpdateData(TRUE);
	GoToPos( XCurrent , YCurrent + m_JogDist, ZCurrent);
	m_XLocVar = XCurrent;  
	m_YLocVar = YCurrent;  
    m_ZLocVar = ZCurrent; 
	UpdateData(false);
}

void CMasterControlDlg::OnUp() 
{
	if( ! Enable )
   {
	   MessageBox( " --- Emergency Stop ---- " );
	   return;
   }
	GMode = 1;
	UpdateData(TRUE);
	GoToPos( XCurrent , YCurrent, ZCurrent+ m_JogDist);
	m_XLocVar = XCurrent; 
	m_YLocVar = YCurrent;  
    m_ZLocVar = ZCurrent;  
	UpdateData(false);
}

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

void CMasterControlDlg::CalcRamp()
{

   
  double cXIncAcc,cYIncAcc,cZIncAcc;
  double cXIncDec,cYIncDec,cZIncDec;

  if( GMode != 0 ) 
  { cXIncAcc  = XIncAccCut;
	cXIncDec  = XIncDecCut;
	cYIncAcc  = YIncAccCut;
	cYIncDec  = YIncDecCut;
	cZIncAcc  = ZIncAccCut;
	cZIncDec  = ZIncDecCut;
  }
  else
  {
   cXIncAcc  = XIncAcc;
   cXIncDec  = XIncDec;
   cYIncAcc  = YIncAcc;
   cYIncDec  = YIncDec;
   cZIncAcc  = ZIncAcc;
   cZIncDec  = ZIncDec;
  }

  int x;
  double hold;
  if( Times ) {delete[] Times; Times = NULL; }
  if( Moves == 0) return;
  Times = (double*) new double[Moves];
  for( x=0; x< Moves; x++)
  {
	 hold = 0;
	 if( Movements[x] & 0x01 ) hold = XMaxDelay;
	 if( Movements[x] & 0x02 ) hold = __max( hold, YMaxDelay );
	 if( Movements[x] & 0x04 ) hold = __max( hold, ZMaxDelay );
	 Times[ x ] = hold;
  }
  for( x= 0; x < Moves; x++)
  {
	 int y = x;
	 double temp = Times[ x];
	 while( Times[x++] == temp) if( x == Moves) break;
	 int len = (x-1) - y;
	 int ramp = 0;
	 if( temp == XMaxDelay && XRamp )
	 {
	    
	   if( len < 10) break;
	   int front = 0;
	   int back = 0;
	   if ( (len/2) > (int)(XAcc * XPpi)) front = (int)(XAcc*XPpi); else front = len/2;
	   if ( (len/2) > (int)(XDec * XPpi)) back =  (int)(XDec*XPpi); else back = len/2;
	   double holder = temp;
	   for( int z = 0; z < len; z++)
	   {
		   if( z < front)  holder -= cXIncAcc;
		   if( z > len - back ) holder += cXIncDec;
		   Times[ y + z ] = holder;
	   }
	 }
	 if( temp == YMaxDelay && YRamp )				// no ramp for autoZSlow
	 {
	    
	   if( len < 10) break;
	   int front = 0;
	   int back = 0;
	   if ( (len/2) > (int)(YAcc * YPpi)) front = (int)(YAcc*YPpi); else front = len/2;
	   if ( (len/2) > (int)(YDec * YPpi)) back =  (int)(YDec*YPpi); else back = len/2;
	   double holder = temp;
	   for( int z = 0; z < len; z++)
	   {
		   if( z < front)  holder -= cYIncAcc;
		   if( z > len - back ) holder += cYIncDec;
		   Times[ y + z ] = holder;
	   }
	 }
	 if( temp == ZMaxDelay && ZRamp )
	 {
	   if( len < 10) break;
	   int front = 0;
	   int back = 0;
	   if ( (len/2) > (int)(ZAcc * ZPpi)) front = (int)(ZAcc*ZPpi); else front = len/2;
	   if ( (len/2) > (int)(ZDec * ZPpi)) back =  (int)(ZDec*ZPpi); else back = len/2;
	   double holder = temp;
	   for( int z = 0; z < len; z++)
	   {
		   if( z < front)  holder -= cZIncAcc;
		   if( z > len - back ) holder += cZIncDec;
		   Times[ y + z ] = holder;
	   }
	 }


  }

}

void CMasterControlDlg::OnGo() 
{
   if( ! Enable )
   {
	   MessageBox( " --- Emergency Stop ---- " );
	   return;
   }
   GMode = 1;
   UpdateData( true );
   GoToPos( m_XGotoVar, m_YGotoVar,  m_ZGotoVar);
   m_XLocVar = XCurrent; 
   m_YLocVar = YCurrent; 
   m_ZLocVar = ZCurrent; 
   UpdateData(false);

}

BOOL CMasterControlDlg::DestroyWindow() 
{
   if(Movements) delete[] Movements;
   if(Times) delete[] Times;
	return CDialog::DestroyWindow();
}

void CMasterControlDlg::BurstOut()
{
  int x;
  unsigned char now;
  for( x = 0; x < Moves; x++)
  {
    now = Movements[x];
	if( now & 0x01 ) { if( now & 0x10 ) PulseX( true ); else PulseX( false ); }
	if( now & 0x02 ) { if( now & 0x20 ) PulseY( true ); else PulseY( false ); }
	if( now & 0x04 ) { if( now & 0x40 ) PulseZ( false ); else PulseZ( true ); }
	DoPulse();
	if( !Simulate )Delay( Times[ x ] );
	TimeEstimate += Times[ x ]+latency;
	if( !Enable) break;
  }
}



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

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

⌨️ 快捷键说明

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