From a36992035478a3ff211be52e5aaa26759a7aa91e Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 16 Nov 2016 18:47:13 +0000 Subject: [PATCH] EgtMachKernel 1.6w4 : - migliorie varie per gestire tre assi rotanti - aggiunta a MachMgr funzione GetAxisToken. --- EgtMachKernel.rc | Bin 11782 -> 11782 bytes MachMgr.h | 3 +++ MachMgrMachines.cpp | 22 ++++++++++++++++++++-- Machine.h | 8 ++++---- MachineCalc.cpp | 29 +++++++++++++++++++---------- Operation.cpp | 20 +++++++++++++------- OutputConst.h | 2 +- 7 files changed, 60 insertions(+), 24 deletions(-) diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 340bef083e145ec2ff511c645b896217b469fcb6..fbe08416ebddd3ba4969b0c8555d9c3e0ed85a64 100644 GIT binary patch delta 97 zcmZpRX^YwLhmFx>^ItYwW=50Aj>5W|vxM9jH?QON0rG*u7nvrX5iEd9O=7{OSQ@Kh Hr8(RHQ1Kv2 delta 97 zcmZpRX^YwLhmFyA^ItYwW=7-5j>5W|vxM9jH?QON0rG*u7nvrX5iEd9O=7{OSQ@Kh Hr8(RHPhB8F diff --git a/MachMgr.h b/MachMgr.h index 2f3dace..6626252 100644 --- a/MachMgr.h +++ b/MachMgr.h @@ -258,6 +258,8 @@ class MachMgr : public IMachMgr int& nStat, double& dX, double& dY, double& dZ) const ; bool GetCalcTipFromPositions( double dX, double dY, double dZ, double dAngA, double dAngB, bool bOverall, bool bBottom, Point3d& ptTip) const override ; + bool GetCalcTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng, + bool bOverall, bool bBottom, Point3d& ptTip) const ; bool GetCalcToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const override ; bool GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const override ; bool LimitAngleToStroke( int nInd, double& dAng) const override ; @@ -269,6 +271,7 @@ class MachMgr : public IMachMgr int GetTableId( const std::string& sTable) const override ; int GetAxisId( const std::string& sAxis) const override ; int GetHeadId( const std::string& sHead) const override ; + bool GetAxisToken( const std::string& sAxis, std::string& sToken) const override ; bool SetAxisPos( const std::string& sAxis, double dVal) override ; bool GetAxisPos( const std::string& sAxis, double& dVal) const override ; bool GetAxisHomePos( const std::string& sAxis, double& dHomeVal) const override ; diff --git a/MachMgrMachines.cpp b/MachMgrMachines.cpp index 868a6c9..cb5e06a 100644 --- a/MachMgrMachines.cpp +++ b/MachMgrMachines.cpp @@ -200,6 +200,15 @@ MachMgr::GetHeadId( const string& sHead) const return ( ( pMch != nullptr) ? pMch->GetHeadId( sHead) : GDB_ID_NULL) ; } +//---------------------------------------------------------------------------- +bool +MachMgr::GetAxisToken( const string& sAxis, string& sToken) const +{ + Machine* pMch = GetCurrMachine() ; + // restituisco token dell'asse indicato nella macchina corrente + return ( ( pMch != nullptr) ? pMch->GetAxisToken( sAxis, sToken) : false) ; +} + //---------------------------------------------------------------------------- bool MachMgr::SetAxisPos( const string& sAxis, double dVal) @@ -423,14 +432,23 @@ MachMgr::GetCalcPositions( const Point3d& ptP, DBLVECTOR& vAng, return ( ( pMch != nullptr) ? pMch->GetPositions( ptP, vAng, nStat, dX, dY, dZ) : false) ; } - //---------------------------------------------------------------------------- bool MachMgr::GetCalcTipFromPositions( double dX, double dY, double dZ, double dAngA, double dAngB, bool bOverall, bool bBottom, Point3d& ptTip) const { + DBLVECTOR vAng( 2) ; vAng[0] = dAngA ; vAng[1] = dAngB ; Machine* pMch = GetCurrMachine() ; - return ( ( pMch != nullptr) ? pMch->GetTipFromPositions( dX, dY, dZ, dAngA, dAngB, bOverall, bBottom, ptTip) : false) ; + return ( ( pMch != nullptr) ? pMch->GetTipFromPositions( dX, dY, dZ, vAng, bOverall, bBottom, ptTip) : false) ; +} + +//---------------------------------------------------------------------------- +bool +MachMgr::GetCalcTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng, + bool bOverall, bool bBottom, Point3d& ptTip) const +{ + Machine* pMch = GetCurrMachine() ; + return ( ( pMch != nullptr) ? pMch->GetTipFromPositions( dX, dY, dZ, vAng, bOverall, bBottom, ptTip) : false) ; } //---------------------------------------------------------------------------- diff --git a/Machine.h b/Machine.h index 0a0ca25..631e3ac 100644 --- a/Machine.h +++ b/Machine.h @@ -95,11 +95,11 @@ class Machine int& nStat, DBLVECTOR& vAng1, DBLVECTOR& vAng2) const ; bool GetPositions( const Point3d& ptP, double dA, double dB, int& nStat, double& dX, double& dY, double& dZ) const ; - bool GetPositions( const Point3d& ptP, DBLVECTOR vAng, + bool GetPositions( const Point3d& ptP, const DBLVECTOR& vAng, int& nStat, double& dX, double& dY, double& dZ) const ; - bool GetHeadOffsetDelta( DBLVECTOR vAng, + bool GetHeadOffsetDelta( const DBLVECTOR& vAng, double& dRecX, double& dRecY, double& dRecZ) const ; - bool GetTipFromPositions( double dX, double dY, double dZ, double dAngA, double dAngB, + bool GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool bBottom, bool bOverall, Point3d& ptTip) const ; bool GetToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const ; bool GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const ; @@ -182,7 +182,7 @@ class Machine const Vector3d& vtDirH, const Vector3d& vtDirI, int nNumRotAx, const KinAxis& RotAx1, const KinAxis& RotAx2, int& nStat, double& dAngA1, double& dAngB1, double& dAngA2, double& dAngB2) const ; - bool GetDirection( const Vector3d& vtDir, double dAngA, double dAngB, Vector3d& vtNew) const ; + bool GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& vtNew) const ; bool VerifyScc( const Vector3d& vtDirI, const Vector3d& vtDirA, int nSolCh) const ; bool AdjustAngleInStroke( const STROKE& Stroke, double& dAng) const ; bool LuaInit( const std::string& sMachineName) ; diff --git a/MachineCalc.cpp b/MachineCalc.cpp index 433a14e..d83dc4c 100644 --- a/MachineCalc.cpp +++ b/MachineCalc.cpp @@ -828,7 +828,7 @@ Machine::GetPositions( const Point3d& ptP, double dAngA, double dAngB, //---------------------------------------------------------------------------- bool -Machine::GetPositions( const Point3d& ptP, DBLVECTOR vAng, +Machine::GetPositions( const Point3d& ptP, const DBLVECTOR& vAng, int& nStat, double& dX, double& dY, double& dZ) const { // la posizione deve essere espressa rispetto allo ZERO MACCHINA @@ -881,7 +881,7 @@ Machine::GetPositions( const Point3d& ptP, DBLVECTOR vAng, //---------------------------------------------------------------------------- bool -Machine::GetHeadOffsetDelta( DBLVECTOR vAng, +Machine::GetHeadOffsetDelta( const DBLVECTOR& vAng, double& dRecX, double& dRecY, double& dRecZ) const { // ovviamente tutto è espresso nel riferimento ZERO MACCHINA @@ -917,20 +917,29 @@ Machine::GetHeadOffsetDelta( DBLVECTOR vAng, //---------------------------------------------------------------------------- bool -Machine::GetDirection( const Vector3d& vtDir, double dAngA, double dAngB, Vector3d& vtNew) const +Machine::GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& vtNew) const { // è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa) // direzione a riposo vtNew = vtDir ; + // se c'è terzo asse rotante di testa + if ( m_vCalcRotAx.size() >= 3 && m_vCalcRotAx[2].bHead) { + // posizione e direzione secondo asse rotante + Point3d ptAx3 = m_vCalcRotAx[2].ptPos ; + Vector3d vtAx3 = m_vCalcRotAx[2].vtDir ; + // ruoto dati a riposo + vtNew.Rotate( vtAx3, vAng[2]) ; + } + // se c'è secondo asse rotante di testa if ( m_vCalcRotAx.size() >= 2 && m_vCalcRotAx[1].bHead) { - // posizione e direzione primo asse rotante + // posizione e direzione secondo asse rotante Point3d ptAx2 = m_vCalcRotAx[1].ptPos ; Vector3d vtAx2 = m_vCalcRotAx[1].vtDir ; // ruoto dati a riposo - vtNew.Rotate( vtAx2, dAngB) ; + vtNew.Rotate( vtAx2, vAng[1]) ; } // se c'è primo asse rotante di testa @@ -939,14 +948,14 @@ Machine::GetDirection( const Vector3d& vtDir, double dAngA, double dAngB, Vector Point3d ptAx1 = m_vCalcRotAx[0].ptPos ; Vector3d vtAx1 = m_vCalcRotAx[0].vtDir ; // ruoto dati a riposo - vtNew.Rotate( vtAx1, dAngA) ; + vtNew.Rotate( vtAx1, vAng[0]) ; } return true ; } //---------------------------------------------------------------------------- bool -Machine::GetTipFromPositions( double dX, double dY, double dZ, double dAngA, double dAngB, +Machine::GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool bOverall, bool bBottom, Point3d& ptTip) const { // la posizione deve essere espressa rispetto allo ZERO MACCHINA @@ -954,7 +963,6 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, double dAngA, dou // Calcoli recuperi della testa e lunghezza utensile per orientamento double dRecX, dRecY, dRecZ ; - DBLVECTOR vAng( 2) ; vAng[0] = dAngA ; vAng[1] = dAngB ; if ( ! GetHeadOffsetDelta( vAng, dRecX, dRecY, dRecZ)) return false ; ptTip.Set( dX - dRecX, dY - dRecY, dZ - dRecZ) ; @@ -963,7 +971,7 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, double dAngA, dou if ( bOverall || bBottom) { // calcolo la direzione fresa Vector3d vtDirT ; - if ( ! GetDirection( m_vtCalcDir, dAngA, dAngB, vtDirT)) + if ( ! GetDirection( m_vtCalcDir, vAng, vtDirT)) return false ; // se richiesto ingombro totale if ( bOverall) @@ -987,7 +995,8 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, double dAngA, dou bool Machine::GetToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const { - return GetDirection( m_vtCalcDir, dAngA, dAngB, vtDir) ; + DBLVECTOR vAng( 2) ; vAng[0] = dAngA ; vAng[1] = dAngB ; + return GetDirection( m_vtCalcDir, vAng, vtDir) ; } //---------------------------------------------------------------------------- diff --git a/Operation.cpp b/Operation.cpp index 74b424c..0e70058 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -996,7 +996,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool DBLVECTOR vAxNew = vAxCurr ; vAxNew[2] = vAxPrev[2] ; pCamData->SetAxes( CamData::AS_OK, vAxNew) ; - pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ; + pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2 | CamData::MSK_R3) ; pCamData->SetFlag( 2) ; } // verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola @@ -1035,7 +1035,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool DBLVECTOR vAxNew2 = vAxCurr ; vAxNew2[2] = dHomeZ ; pNew2CamData->SetAxes( CamData::AS_OK, vAxNew2) ; - pNew2CamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ; + pNew2CamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2 | CamData::MSK_R3) ; pNew2CamData->SetFlag( 2) ; } // altrimenti @@ -1064,7 +1064,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool DBLVECTOR vAxNew = vAxCurr ; vAxNew[2] = vAxPrev[2] ; pCamData->SetAxes( CamData::AS_OK, vAxNew) ; - pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2) ; + pCamData->ChangeAxesMask( CamData::MSK_L1 | CamData::MSK_L2 | CamData::MSK_R1 | CamData::MSK_R2 | CamData::MSK_R3) ; pCamData->SetFlag( 2) ; } } @@ -1281,25 +1281,31 @@ Operation::CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR // determino gli estremi del movimento rotatorio double dR1Start = ( vAxStart.size() >= 4 ? vAxStart[3] : 0) ; double dR2Start = ( vAxStart.size() >= 5 ? vAxStart[4] : 0) ; + double dR3Start = ( vAxStart.size() >= 6 ? vAxStart[5] : 0) ; double dR1End = ( vAxEnd.size() >= 4 ? vAxEnd[3] : 0) ; double dR2End = ( vAxEnd.size() >= 5 ? vAxEnd[4] : 0) ; + double dR3End = ( vAxEnd.size() >= 6 ? vAxEnd[5] : 0) ; // determino le variazioni di ciascun asse double dR1Delta = dR1End - dR1Start ; double dR2Delta = dR2End - dR2Start ; + double dR3Delta = dR3End - dR3Start ; // divido il movimento in step di massimo 5 gradi - int nStep = int( max( abs( dR1Delta), abs( dR2Delta)) / 5.0) + 1 ; + int nStep = int( max( abs( dR1Delta), max( abs( dR2Delta), abs( dR3Delta))) / 5.0) + 1 ; double dR1Step = dR1Delta / nStep ; double dR2Step = dR2Delta / nStep ; + double dR3Step = dR3Delta / nStep ; // calcolo double dL1 = vAxStart[0] ; double dL2 = vAxStart[1] ; double dL3 = vAxStart[2] ; double dZStart, dZmin ; + DBLVECTOR vAng( 3) ; for ( int i = 0 ; i <= nStep ; ++ i) { - double dR1 = dR1Start + i * dR1Step ; - double dR2 = dR2Start + i * dR2Step ; + vAng[0] = dR1Start + i * dR1Step ; + vAng[1] = dR2Start + i * dR2Step ; + vAng[2] = dR3Start + i * dR2Step ; Point3d ptTip ; - if ( ! m_pMchMgr->GetCalcTipFromPositions( dL1, dL2, dL3, dR1, dR2, true, true, ptTip)) + if ( ! m_pMchMgr->GetCalcTipFromPositions( dL1, dL2, dL3, vAng, true, true, ptTip)) return false ; if ( i == 0) { dZStart = ptTip.z ; diff --git a/OutputConst.h b/OutputConst.h index 9927f3c..2ad4e0f 100644 --- a/OutputConst.h +++ b/OutputConst.h @@ -77,7 +77,7 @@ static const std::string GVAR_L3 = ".L3" ; // (num) valore del static const std::string GVAR_R1 = ".R1" ; // (num) valore del primo asse rotante static const std::string GVAR_R2 = ".R2" ; // (num) valore del secondo asse rotante static const std::string GVAR_R3 = ".R3" ; // (num) valore del terzo asse rotante -static const std::string GVAR_R4 = ".R4" ; // (num) valore del quartoo asse rotante +static const std::string GVAR_R4 = ".R4" ; // (num) valore del quarto asse rotante static const std::string GVAR_C1 = ".C1" ; // (num) valore del primo asse lineare per centro arco static const std::string GVAR_C2 = ".C2" ; // (num) valore del secondo asse lineare per centro arco static const std::string GVAR_C3 = ".C3" ; // (num) valore del terzo asse lineare per centro arco