EgtMachKernel 1.8d5 :
- aggiunta possibilità in simulazione senza muovere gli assi attivi ma solo quelli ausiliari.
This commit is contained in:
+65
-33
@@ -44,6 +44,7 @@ Simulator::Simulator( void)
|
||||
m_nAuxSInd = 0 ;
|
||||
m_nAuxETot = 0 ;
|
||||
m_nAuxEInd = 0 ;
|
||||
m_bEnabAxes = true ;
|
||||
m_AxesName.reserve( 8) ;
|
||||
m_AxesToken.reserve( 8) ;
|
||||
m_AxesLinear.reserve( 8) ;
|
||||
@@ -701,42 +702,65 @@ Simulator::ManageMove( int& nStatus)
|
||||
}
|
||||
}
|
||||
|
||||
// Calcolo distanza di movimento
|
||||
double dSqDist = 0 ;
|
||||
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
|
||||
// coefficiente moltiplicativo per differenziare assi lineari (primi3) e rotanti (altri)
|
||||
double dSqCoeff = (( i >= 3) ? 100 : 1) ;
|
||||
dSqDist += dSqCoeff * ( AxesEnd[i] - m_AxesVal[i]) * ( AxesEnd[i] - m_AxesVal[i]) ;
|
||||
}
|
||||
double dDist = sqrt( dSqDist) ;
|
||||
m_dCoeff += ( nMoveType == 0 ? 4 : 1) * m_dStep / dDist ;
|
||||
if ( m_dCoeff > 1)
|
||||
m_dCoeff = 1 ;
|
||||
|
||||
// Eseguo movimento rapido o lineare
|
||||
if ( nMoveType != 2 && nMoveType != 3) {
|
||||
if ( m_bEnabAxes) {
|
||||
// Calcolo distanza di movimento
|
||||
double dSqDist = 0 ;
|
||||
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
|
||||
double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[i], dVal) ;
|
||||
// coefficiente moltiplicativo per differenziare assi lineari (primi3) e rotanti (altri)
|
||||
double dSqCoeff = (( i < 3) ? 1 : 100) ;
|
||||
dSqDist += dSqCoeff * ( AxesEnd[i] - m_AxesVal[i]) * ( AxesEnd[i] - m_AxesVal[i]) ;
|
||||
}
|
||||
double dDist = sqrt( dSqDist) ;
|
||||
if ( dDist > EPS_SMALL) {
|
||||
m_dCoeff += ( nMoveType == 0 ? 4 : 1) * m_dStep / dDist ;
|
||||
if ( m_dCoeff > 1)
|
||||
m_dCoeff = 1 ;
|
||||
}
|
||||
else
|
||||
m_dCoeff = 1 ;
|
||||
|
||||
// Eseguo movimento rapido o lineare
|
||||
if ( nMoveType != 2 && nMoveType != 3) {
|
||||
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
|
||||
double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[i], dVal) ;
|
||||
}
|
||||
}
|
||||
// Eseguo movimento su arco
|
||||
else {
|
||||
// primi due assi lineari
|
||||
Point3d ptCen = pCamData->GetAxesCen() ;
|
||||
double dAngCen = pCamData->GetAxesAngCen() ;
|
||||
Vector3d vtN = pCamData->GetAxesNormDir() ;
|
||||
Vector3d vtRot = Point3d( m_AxesVal[0], m_AxesVal[1], m_AxesVal[2]) - ptCen ;
|
||||
vtRot.Rotate( vtN, m_dCoeff * dAngCen) ;
|
||||
double dDeltaN = ( Point3d( AxesEnd[0], AxesEnd[1], AxesEnd[2]) - ptCen) * vtN ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[0], ptCen.x + vtRot.x + m_dCoeff * dDeltaN * vtN.x) ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[1], ptCen.y + vtRot.y + m_dCoeff * dDeltaN * vtN.y) ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[2], ptCen.z + vtRot.z + m_dCoeff * dDeltaN * vtN.z) ;
|
||||
// altri assi
|
||||
for ( size_t i = 3 ; i < m_AxesName.size() ; ++ i) {
|
||||
double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[i], dVal) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Eseguo movimento su arco
|
||||
else {
|
||||
// primi due assi lineari
|
||||
Point3d ptCen = pCamData->GetAxesCen() ;
|
||||
double dAngCen = pCamData->GetAxesAngCen() ;
|
||||
Vector3d vtN = pCamData->GetAxesNormDir() ;
|
||||
Vector3d vtRot = Point3d( m_AxesVal[0], m_AxesVal[1], m_AxesVal[2]) - ptCen ;
|
||||
vtRot.Rotate( vtN, m_dCoeff * dAngCen) ;
|
||||
double dDeltaN = ( Point3d( AxesEnd[0], AxesEnd[1], AxesEnd[2]) - ptCen) * vtN ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[0], ptCen.x + vtRot.x + m_dCoeff * dDeltaN * vtN.x) ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[1], ptCen.y + vtRot.y + m_dCoeff * dDeltaN * vtN.y) ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[2], ptCen.z + vtRot.z + m_dCoeff * dDeltaN * vtN.z) ;
|
||||
// altri assi
|
||||
for ( size_t i = 3 ; i < m_AxesName.size() ; ++ i) {
|
||||
double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ;
|
||||
m_pMachine->SetAxisPos( m_AxesName[i], dVal) ;
|
||||
// Calcolo distanza di movimento
|
||||
double dSqDist = 0 ;
|
||||
for ( size_t i = 0 ; i < m_AuxAxesName.size() ; ++ i) {
|
||||
// coefficiente moltiplicativo per differenziare assi lineari e rotanti
|
||||
double dSqCoeff = ( m_AuxAxesLinear[i] ? 1 : 100) ;
|
||||
dSqDist += dSqCoeff * ( m_AuxAxesEnd[i] - m_AuxAxesVal[i]) * ( m_AuxAxesEnd[i] - m_AuxAxesVal[i]) ;
|
||||
}
|
||||
double dDist = sqrt( dSqDist) ;
|
||||
if ( dDist > EPS_SMALL) {
|
||||
m_dCoeff += ( nMoveType == 0 ? 4 : 1) * m_dStep / dDist ;
|
||||
if ( m_dCoeff > 1)
|
||||
m_dCoeff = 1 ;
|
||||
}
|
||||
else
|
||||
m_dCoeff = 1 ;
|
||||
}
|
||||
|
||||
// Muovo eventuali assi ausiliari
|
||||
@@ -747,8 +771,10 @@ Simulator::ManageMove( int& nStatus)
|
||||
|
||||
// Se arrivato a fine interpolazione movimento, salvo posizioni e segnalo
|
||||
if ( m_dCoeff > 0.999) {
|
||||
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i)
|
||||
m_AxesVal[i] = AxesEnd[i] ;
|
||||
if ( m_bEnabAxes) {
|
||||
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i)
|
||||
m_AxesVal[i] = AxesEnd[i] ;
|
||||
}
|
||||
nStatus = MCH_SIM_END_STEP ;
|
||||
// richiamo gestione evento fine entità
|
||||
if ( ! OnMoveEnd()) {
|
||||
@@ -1046,6 +1072,8 @@ Simulator::OnMoveStart( const CamData* pCamData)
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GetGlobVarAxisValue( i)) ;
|
||||
}
|
||||
}
|
||||
// reset abilitazione assi attivi
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GLOB_VAR + GVAR_ENABAXES) ;
|
||||
// reset numero assi ausiliari
|
||||
bOk = bOk && m_pMachine->LuaResetGlobVar( GLOB_VAR + GVAR_AUXAXES) ;
|
||||
|
||||
@@ -1069,6 +1097,8 @@ Simulator::OnMoveStart( const CamData* pCamData)
|
||||
ResetAuxAxes() ;
|
||||
|
||||
// recupero i dati di ritorno
|
||||
if ( ! m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_ENABAXES, m_bEnabAxes))
|
||||
m_bEnabAxes = true ;
|
||||
int nNumAuxAxes = 0 ;
|
||||
if ( ! m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_AUXAXES, nNumAuxAxes) || nNumAuxAxes == 0)
|
||||
return true ;
|
||||
@@ -1113,6 +1143,8 @@ Simulator::OnMoveEnd( void)
|
||||
bool bOk = m_pMachine->LuaCallFunction( ON_SIMUL_MOVE_END) ;
|
||||
// forzo aggiornamento posizione assi (possono essere stati mossi nello script)
|
||||
UpdateAxesPos() ;
|
||||
// in ogni caso forzo riabilitazione assi attivi
|
||||
m_bEnabAxes = true ;
|
||||
return bOk ;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user