EgtMachKernel :

- corretto gestione asse indeterminato in presenza di un asse bloccato.
This commit is contained in:
Dario Sassi
2017-02-28 09:53:22 +00:00
parent 4ed628593e
commit 0941600e08
+38 -13
View File
@@ -777,10 +777,17 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
// porto gli angoli ai valori più vicini ai precedenti con offset di uno o più giri
for ( size_t i = 0 ; i < vAng1.size() ; ++ i)
m_pMchMgr->GetNearestAngleInStroke( int( i), vAxRotPrec[i], vAng1[i]) ;
// se sol.ne indeterminata (sempre il primo asse), assegno il precedente, limitandolo alla corsa
// se sol.ne indeterminata (sempre il primo asse libero), assegno il precedente, limitandolo alla corsa
if ( nRStat < 0 && vAng1.size() >= 1) {
vAng1[0] = vAxRotPrec[0] ;
m_pMchMgr->LimitAngleToStroke( 0, vAng1[0]) ;
for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) {
// ignoro gli assi bloccati
if ( m_pMchMgr->IsKinematicRotAxisBlocked( i))
continue ;
// assegno il precedente
vAng1[i] = vAxRotPrec[i] ;
m_pMchMgr->LimitAngleToStroke( i, vAng1[i]) ;
break ;
}
}
}
// per movimenti successivi
@@ -788,9 +795,15 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
// scelgo gli angoli più vicini, per continuità non applico offset per stare nelle corse
for ( size_t i = 0 ; i < vAng1.size() ; ++ i)
vAng1[i] = AngleNearAngle( vAng1[i], vAxRotPrec[i]) ;
// se sol.ne indeterminata (sempre il primo asse), assegno il precedente
// se sol.ne indeterminata (sempre il primo asse libero), assegno il precedente
if ( nRStat < 0 && vAng1.size() >= 1) {
vAng1[0] = vAxRotPrec[0] ;
for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) {
// ignoro gli assi bloccati
if ( m_pMchMgr->IsKinematicRotAxisBlocked( i))
continue ;
// assegno il precedente
vAng1[i] = vAxRotPrec[i] ;
}
}
}
}
@@ -802,11 +815,17 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
m_pMchMgr->GetNearestAngleInStroke( int( i), vAxRotPrec[i], vAng1[i]) ;
m_pMchMgr->GetNearestAngleInStroke( int( i), vAxRotPrec[i], vAng2[i]) ;
}
// se sol.ne indeterminata (sempre il primo asse), assegno il precedente, limitandolo alla corsa
// se sol.ne indeterminata (sempre il primo asse libero), assegno il precedente, limitandolo alla corsa
if ( nRStat < 0 && vAng1.size() >= 1) {
vAng1[0] = vAxRotPrec[0] ;
m_pMchMgr->LimitAngleToStroke( 0, vAng1[0]) ;
vAng2[0] = vAng1[0] ;
for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) {
// ignoro gli assi bloccati
if ( m_pMchMgr->IsKinematicRotAxisBlocked( i))
continue ;
// assegno il precedente
vAng1[i] = vAxRotPrec[i] ;
m_pMchMgr->LimitAngleToStroke( i, vAng1[i]) ;
vAng2[i] = vAng1[i] ;
}
}
}
else {
@@ -814,14 +833,20 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
for ( size_t i = 0 ; i < vAng1.size() ; ++ i) {
vAng1[i] = AngleNearAngle( vAng1[i], vAxRotPrec[i]) ;
vAng2[i] = AngleNearAngle( vAng2[i], vAxRotPrec[i]) ;
// se sol.ne indeterminata (sempre il primo asse), assegno il precedente
// se sol.ne indeterminata (sempre il primo asse libero), assegno il precedente
if ( nRStat < 0 && vAng1.size() >= 1) {
vAng1[0] = vAxRotPrec[0] ;
vAng2[0] = vAng1[0] ;
for ( int i = 0 ; i < int( vAng1.size()) ; ++ i) {
// ignoro gli assi bloccati
if ( m_pMchMgr->IsKinematicRotAxisBlocked( i))
continue ;
// assegno il precedente
vAng1[i] = vAxRotPrec[i] ;
vAng2[i] = vAng1[i] ;
}
}
}
}
// scelgo la soluzione più vicina ai precedenti
// scelgo la soluzione più vicina alla precedente
double dDelta1 = 0 ;
double dDelta2 = 0 ;
for ( size_t i = 0 ; i < vAng1.size() ; ++ i) {