EgtMachKernel 1.6l11 :

- migliorie alla risalita in Z tra una lavorazione e l'altra.
This commit is contained in:
Dario Sassi
2016-02-03 07:24:37 +00:00
parent def6461dc5
commit d20bc015d6
3 changed files with 67 additions and 7 deletions
+66 -7
View File
@@ -728,11 +728,15 @@ Machining::AdjustStartMovements(void)
DBLVECTOR vAxIni ;
if ( ! pPrevMch->GetFinalAxesValues( vAxVal) || ! GetInitialAxesValues( vAxIni))
return false ;
if ( vAxVal.size() >= 5 && vAxIni.size() >= 5 &&
fabs( vAxVal[4] - vAxIni[4]) > 15) {
double dDelta = max( vAxVal[2], vAxIni[2]) - vAxVal[2] + 200 ;
if ( ! pPrevMch->AddRise( vAxVal, dDelta))
// determino delta Z rispetto a posizione finale
if ( vAxVal.size() >= 4 && vAxIni.size() >= 4) {
double dDelta = 0 ;
if ( ! CalcDeltaZForHeadRotation( vAxVal, vAxIni, dDelta))
return false ;
if ( dDelta > EPS_SMALL) {
if ( ! pPrevMch->AddRise( vAxVal, dDelta))
return false ;
}
}
}
// altrimenti aggiungo uscita per cambio utensile alla lavorazione precedente e parto da questa
@@ -866,7 +870,7 @@ Machining::AddRise( DBLVECTOR& vAxVal, double dDelta)
vAxVal = pCam->GetAxisVal() ;
// flag di movimento in rapido
int nFlag = 0 ;
// se delta positivo lo uso come incremeto di Z
// se delta positivo lo uso come incremento di Z
if ( dDelta > 0) {
vAxVal[2] += dDelta ;
nFlag = 0 ; // movimento standard
@@ -878,13 +882,22 @@ Machining::AddRise( DBLVECTOR& vAxVal, double dDelta)
vAxVal[2] = vAxHome[2] ;
nFlag = 3 ; // movimento a Zmax
}
pCam->SetAxes( CamData::AS_OK, vAxVal) ;
// verifico extra-corsa dell'asse Z
double dL1 = vAxVal[0] ;
double dL2 = vAxVal[1] ;
double dL3 = vAxVal[2] ;
double dR1 = ( vAxVal.size() >= 4 ? vAxVal[3] : 0) ;
double dR2 = ( vAxVal.size() >= 5 ? vAxVal[4] : 0) ;
int nStat ;
bool bOk = ( m_pMchMgr->VerifyOutstroke( dL1, dL2, dL3, dR1, dR2, nStat) && nStat == 0) ;
// assegno i dati
pCam->SetAxes( (bOk ? CamData::AS_OK : CamData::AS_OUTSTROKE), vAxVal) ;
pCam->SetFeed( 0) ;
pCam->SetFlag( nFlag) ;
// associo questo oggetto a quello geometrico
m_pGeomDB->SetUserObj( nId, Release( pCam)) ;
return true ;
return bOk ;
}
//----------------------------------------------------------------------------
@@ -908,3 +921,49 @@ Machining::RemoveRise( void)
return true ;
}
//----------------------------------------------------------------------------
bool
Machining::CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, double& dDeltaZ)
{
// il numero di assi deve essere costante
if ( vAxStart.size() != vAxEnd.size())
return false ;
// se ci sono solo assi lineari, non delta Z nullo
if ( vAxStart.size() <= 3) {
dDeltaZ = 0 ;
return true ;
}
// determino gli estremi del movimento rotatorio
double dR1Start = ( vAxStart.size() >= 4 ? vAxStart[3] : 0) ;
double dR2Start = ( vAxStart.size() >= 5 ? vAxStart[4] : 0) ;
double dR1End = ( vAxEnd.size() >= 4 ? vAxEnd[3] : 0) ;
double dR2End = ( vAxEnd.size() >= 5 ? vAxEnd[4] : 0) ;
// determino le variazioni di ciascun asse
double dR1Delta = dR1End - dR1Start ;
double dR2Delta = dR2End - dR2Start ;
// divido il movimento in step di massimo 15 gradi
int nStep = int( max( abs( dR1Delta), abs( dR2Delta)) / 15.0) + 1 ;
double dR1Step = dR1Delta / nStep ;
double dR2Step = dR2Delta / nStep ;
// calcolo
double dL1 = vAxStart[0] ;
double dL2 = vAxStart[1] ;
double dL3 = vAxStart[2] ;
double dZStart, dZmin ;
for ( int i = 0 ; i <= nStep ; ++ i) {
double dR1 = dR1Start + i * dR1Step ;
double dR2 = dR2Start + i * dR2Step ;
Point3d ptTip ;
if ( ! m_pMchMgr->GetCalcTipFromPositions( dL1, dL2, dL3, dR1, dR2, true, ptTip))
return false ;
if ( i == 0) {
dZStart = ptTip.z ;
dZmin = dZStart ;
}
else if ( ptTip.z < dZmin)
dZmin = ptTip.z ;
}
dDeltaZ = dZStart - dZmin ;
return true ;
}