From 33701162bf14c622d81f71bc5ed9740fc0c4791d Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 11 Nov 2024 00:44:31 +0100 Subject: [PATCH] EgtMachKernel 2.6k3 : - modifiche per simulazione multi-processo. --- EgtMachKernel.rc | Bin 11782 -> 11782 bytes OutputConst.h | 1 + SimulatorMP.cpp | 29 ++++++++----- SimulatorMP.h | 103 ++++++++++++++++++++++++----------------------- 4 files changed, 71 insertions(+), 62 deletions(-) diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 608eaa1a24e07132375c341115d72d0220094c84..87cf3133a49989f46516b1dc061b8d0316a0b8ad 100644 GIT binary patch delta 97 zcmZpRX^YwLhmFyA^ItYwW=7-5j>5W|vxM9jH?QON0rG*u7nvrX5iEd9O=7{OSQ@Kh Hr8(RHPhB8F delta 97 zcmZpRX^YwLhmFx_^ItYwW=5mQj>5W|vxM9jH?QON0rG*u7nvrX5iEd9O=7{OSQ@Kh Hr8(RHP01iS diff --git a/OutputConst.h b/OutputConst.h index 7736a71..9dbf140 100644 --- a/OutputConst.h +++ b/OutputConst.h @@ -186,6 +186,7 @@ static const std::string GVAR_SIMVMID = ".SIMVMID" ; // (int) identific static const std::string GVAR_SIMCOBIND = ".SIMCOBIND" ; // (int) indice oggetto in collisione static const std::string GVAR_MPSIM = ".MPSIM" ; // (bool) flag simulazione multiprocesso static const std::string GVAR_RECORD = ".RECORD" ; // (bool) flag modalità registrazione comandi in simulazione +static const std::string GVAR_OPERID = ".OPERID" ; // (int/s) identificativi ordinati operazioni per simulazione multiprocesso // Funzioni generazione static const std::string ON_START = "OnStart" ; static const std::string ON_END = "OnEnd" ; diff --git a/SimulatorMP.cpp b/SimulatorMP.cpp index ae8749b..acdc99a 100644 --- a/SimulatorMP.cpp +++ b/SimulatorMP.cpp @@ -229,8 +229,8 @@ SimulatorMP::Start( bool bFirst) bOk = false ; // Verifico la disposizione iniziale della macchinata + m_nOpInd = 0 ; m_nOpId = m_pMchMgr->GetFirstActiveOperation() ; - m_nOpInd = 1 ; if ( m_pMchMgr->GetOperationType( m_nOpId) != OPER_DISP) bOk = false ; @@ -245,6 +245,7 @@ SimulatorMP::Start( bool bFirst) // Se appena entrati in simulazione if ( m_nStatus == SIS_INITIALIZED) { + m_vOperId.clear() ; if ( ! OnInit()) bOk = false ; m_nStatus = SIS_READYTOSTART ; @@ -775,11 +776,15 @@ SimulatorMP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nChange // recupero la nuova operazione if ( nChangeTool == 0) { if ( bStart) { - m_nOpId = m_pMchMgr->GetFirstActiveOperation() ; + //m_nOpId = m_pMchMgr->GetFirstActiveOperation() ; m_nOpInd = 0 ; + m_nOpId = ( m_nOpInd < int( m_vOperId.size()) ? m_vOperId[m_nOpInd] : GDB_ID_NULL) ; + } + else { + // m_nOpId = m_pMchMgr->GetNextActiveOperation( m_nOpId) ; + ++ m_nOpInd ; + m_nOpId = ( m_nOpInd < int( m_vOperId.size()) ? m_vOperId[m_nOpInd] : GDB_ID_NULL) ; } - else - m_nOpId = m_pMchMgr->GetNextActiveOperation( m_nOpId) ; } // ciclo sulle successive operazioni while ( m_nOpId != GDB_ID_NULL) { @@ -796,7 +801,6 @@ SimulatorMP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nChange } if ( nChangeTool != 0) return true ; - ++ m_nOpInd ; // imposto la lavorazione come corrente m_pMchMgr->SetCurrMachining( m_nOpId) ; // recupero punti di minimo e massimo ingombro @@ -833,7 +837,7 @@ SimulatorMP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nChange // se con movimenti autonomi if ( ! bEmpty) { // richiamo gestione evento appena prima di inizio disposizione - if ( ! OnDispositionStarting( m_nOpId, m_nOpInd, nPhase, sTable, ptOri1, false, bSomeByHand)) { + if ( ! OnDispositionStarting( m_nOpId, m_nOpInd - 1, nPhase, sTable, ptOri1, false, bSomeByHand)) { nStatus = CalcStatusOnError( ERR_NONE) ; return false ; } @@ -847,7 +851,6 @@ SimulatorMP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nChange return false ; } } - ++ m_nOpInd ; // richiamo gestione evento inizio disposizione if ( ! OnDispositionStart( m_nOpId, m_nOpInd, nPhase, sTable, ptOri1, false, bSomeByHand)) { nStatus = CalcStatusOnError( ERR_NONE) ; @@ -861,13 +864,12 @@ SimulatorMP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nChange // altrimenti disposizione passiva else { // richiamo gestione evento appena prima di inizio disposizione - if ( ! OnDispositionStarting( m_nOpId, m_nOpInd, nPhase, sTable, ptOri1, true, bSomeByHand)) { + if ( ! OnDispositionStarting( m_nOpId, m_nOpInd - 1, nPhase, sTable, ptOri1, true, bSomeByHand)) { nStatus = CalcStatusOnError( ERR_NONE) ; return false ; } // cambio fase m_pMchMgr->SetCurrPhase( nPhase, ( nPhase == 1)) ; - ++ m_nOpInd ; // richiamo gestione evento inizio e fine disposizione if ( ! OnDispositionStart( m_nOpId, m_nOpInd, nPhase, sTable, ptOri1, true, bSomeByHand) || ! OnDispositionEnd()) { @@ -882,7 +884,9 @@ SimulatorMP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nChange } } // passo alla operazione successiva - m_nOpId = m_pMchMgr->GetNextActiveOperation( m_nOpId) ; + ++ m_nOpInd ; + m_nOpId = ( m_nOpInd < int( m_vOperId.size()) ? m_vOperId[m_nOpInd] : GDB_ID_NULL) ; + //m_nOpId = m_pMchMgr->GetNextActiveOperation( m_nOpId) ; } return true ; } @@ -1708,7 +1712,10 @@ bool SimulatorMP::OnInit( void) { // chiamo la funzione di ingresso nella simulazione - return CallFunction( ON_SIMUL_INIT) ; + bool bOk = CallFunction( ON_SIMUL_INIT) ; + // recupero i dati di ritorno + bOk = m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_OPERID, m_vOperId) && bOk ; + return bOk ; } //---------------------------------------------------------------------------- diff --git a/SimulatorMP.h b/SimulatorMP.h index d25e19b..e2ac0ac 100644 --- a/SimulatorMP.h +++ b/SimulatorMP.h @@ -157,55 +157,56 @@ class SimulatorMP : public ISimulator typedef std::vector CMDVECTOR ; private : - MachMgr* m_pMchMgr ; // puntatore al gestore di tutte le lavorazioni - IGeomDB* m_pGeomDB ; // puntatore al DB geometrico - Machine* m_pMachine ; // puntatore alla macchina - PerformanceCounter* m_pPerfCnt ; // timer per calcolo FPS - int m_nStatus ; // stato interno del simulatore (creato, inizializzato, pronto al movimento) - double m_dStep ; // lunghezza di riferimento per la velocità di simulazione - int m_nUiStatus ; // stato simulazione a livello utente - int m_nOpId ; // identificativo della operazione (lavoraz.) corrente - int m_nOpInd ; // contatore della operazione (lavoraz.) corrente - int m_nCLPathId ; // identificativo del percorso di lavoro corrente - int m_nCLPathInd ; // contatore del percorso di lavoro corrente nell'operazione - int m_nEntId ; // identificativo dell'entità corrente - int m_nEntInd ; // contatore dell'entità corrente nel percorso di lavoro - double m_dCoeff ; // coefficiente di esecuzione del movimento corrente (0...1) - int m_nChangeTool ; // stato di carico e scarico dell'utensile - int m_nAuxSTot ; // numero totale movimenti ausiliari di inizio percorso - int m_nAuxSInd ; // indice del movimento ausiliario di inizio percorso corrente - int m_nAuxETot ; // numero totale movimenti ausiliari di fine percorso - int m_nAuxEInd ; // indice del movimento ausiliario di fine percorso corrente - std::string m_sTool ; // nome dell'utensile corrente - std::string m_sHead ; // nome della testa corrente - int m_nExit ; // indice dell'uscita corrente - double m_dTDiam ; // diametro dell'utensile corrente - bool m_bCutOnTip ; // flag capacità di lavorare di testa dell'utensile corrente - bool m_bEnableVm ; // flag abilitazione Virtual Milling - INTVECTOR m_VmId ; // vettore identificativi Zmap per Virtual Milling - INTVECTOR m_CdId ; // vettore identificativi Zmap per Collision Detection - VMTVECTOR m_VmTool ; // vettore utensili attivi per virtual milling - COBVECTOR m_CollObj ; // vettore oggetti da testare per collisione con grezzo - double m_dSafeDist ; // distanza di sicurezza per verifica collisioni - INTVECTOR m_nCollMarkId ; // elenco oggetti marcati per visualizzare meglio la collisione rilevata - int m_nAxesMask ; // maschera a bit di abilitazione movimento assi (solo se rapido) - bool m_bEnabAxes ; // flag abilitazione movimento assi attivi - bool m_bShowAxes ; // flag visualizzazione assi attivi - STRVECTOR m_AxesName ; // nomi degli assi macchina attivi - STRVECTOR m_AxesToken ; // token degli assi macchina attivi - BOOLVECTOR m_AxesInvert ; // flag di asse con verso invertito degli assi macchina attivi - DBLVECTOR m_AxesOffset ; // valore di offset delgli assi macchina ttivi - BOOLVECTOR m_AxesLinear ; // flag di lineare degli assi macchina attivi - DBLVECTOR m_AxesVal ; // valori degli assi macchina all'inizio del movimento corrente - STRVECTOR m_AuxAxesName ; // nomi degli assi macchina ausiliari abilitati - STRVECTOR m_AuxAxesToken ; // token degli assi macchina ausiliari abilitati - BOOLVECTOR m_AuxAxesInvert ; // flag di asse con verso invertito degli assi macchina ausiliari abilitati - DBLVECTOR m_AuxAxesOffset ; // valore di offset degli assi macchina ausiliari abilitati - BOOLVECTOR m_AuxAxesLinear ; // flag di lineare degli assi macchina ausiliari abilitati - DBLVECTOR m_AuxAxesVal ; // valori degli assi macchina ausiliari all'inizio del movimento corrente - DBLVECTOR m_AuxAxesEnd ; // valori degli assi macchina ausiliari alla fine del movimento corrente - INTVECTOR m_AuxAxesLink ; // indice + 1 asse principale di aggancio (negativo valore opposto, 0 nessuno) - CMDVECTOR m_CmdData ; // vettore comandi in attesa di esecuzione - int m_nCmdInd ; // indice prossimo comando da eseguire - double m_dCmdCoeff ; // coefficiente di movimento nel comando + MachMgr* m_pMchMgr ; // puntatore al gestore di tutte le lavorazioni + IGeomDB* m_pGeomDB ; // puntatore al DB geometrico + Machine* m_pMachine ; // puntatore alla macchina + PerformanceCounter* m_pPerfCnt ; // timer per calcolo FPS + int m_nStatus ; // stato interno del simulatore (creato, inizializzato, pronto al movimento) + double m_dStep ; // lunghezza di riferimento per la velocità di simulazione + int m_nUiStatus ; // stato simulazione a livello utente + INTVECTOR m_vOperId ; // vettore identificativi operazioni ordinate per simulazione + int m_nOpId ; // identificativo della operazione (lavoraz.) corrente + int m_nOpInd ; // contatore della operazione (lavoraz.) corrente + int m_nCLPathId ; // identificativo del percorso di lavoro corrente + int m_nCLPathInd ; // contatore del percorso di lavoro corrente nell'operazione + int m_nEntId ; // identificativo dell'entità corrente + int m_nEntInd ; // contatore dell'entità corrente nel percorso di lavoro + double m_dCoeff ; // coefficiente di esecuzione del movimento corrente (0...1) + int m_nChangeTool ; // stato di carico e scarico dell'utensile + int m_nAuxSTot ; // numero totale movimenti ausiliari di inizio percorso + int m_nAuxSInd ; // indice del movimento ausiliario di inizio percorso corrente + int m_nAuxETot ; // numero totale movimenti ausiliari di fine percorso + int m_nAuxEInd ; // indice del movimento ausiliario di fine percorso corrente + std::string m_sTool ; // nome dell'utensile corrente + std::string m_sHead ; // nome della testa corrente + int m_nExit ; // indice dell'uscita corrente + double m_dTDiam ; // diametro dell'utensile corrente + bool m_bCutOnTip ; // flag capacità di lavorare di testa dell'utensile corrente + bool m_bEnableVm ; // flag abilitazione Virtual Milling + INTVECTOR m_VmId ; // vettore identificativi Zmap per Virtual Milling + INTVECTOR m_CdId ; // vettore identificativi Zmap per Collision Detection + VMTVECTOR m_VmTool ; // vettore utensili attivi per virtual milling + COBVECTOR m_CollObj ; // vettore oggetti da testare per collisione con grezzo + double m_dSafeDist ; // distanza di sicurezza per verifica collisioni + INTVECTOR m_nCollMarkId ; // elenco oggetti marcati per visualizzare meglio la collisione rilevata + int m_nAxesMask ; // maschera a bit di abilitazione movimento assi (solo se rapido) + bool m_bEnabAxes ; // flag abilitazione movimento assi attivi + bool m_bShowAxes ; // flag visualizzazione assi attivi + STRVECTOR m_AxesName ; // nomi degli assi macchina attivi + STRVECTOR m_AxesToken ; // token degli assi macchina attivi + BOOLVECTOR m_AxesInvert ; // flag di asse con verso invertito degli assi macchina attivi + DBLVECTOR m_AxesOffset ; // valore di offset delgli assi macchina ttivi + BOOLVECTOR m_AxesLinear ; // flag di lineare degli assi macchina attivi + DBLVECTOR m_AxesVal ; // valori degli assi macchina all'inizio del movimento corrente + STRVECTOR m_AuxAxesName ; // nomi degli assi macchina ausiliari abilitati + STRVECTOR m_AuxAxesToken ; // token degli assi macchina ausiliari abilitati + BOOLVECTOR m_AuxAxesInvert ; // flag di asse con verso invertito degli assi macchina ausiliari abilitati + DBLVECTOR m_AuxAxesOffset ; // valore di offset degli assi macchina ausiliari abilitati + BOOLVECTOR m_AuxAxesLinear ; // flag di lineare degli assi macchina ausiliari abilitati + DBLVECTOR m_AuxAxesVal ; // valori degli assi macchina ausiliari all'inizio del movimento corrente + DBLVECTOR m_AuxAxesEnd ; // valori degli assi macchina ausiliari alla fine del movimento corrente + INTVECTOR m_AuxAxesLink ; // indice + 1 asse principale di aggancio (negativo valore opposto, 0 nessuno) + CMDVECTOR m_CmdData ; // vettore comandi in attesa di esecuzione + int m_nCmdInd ; // indice prossimo comando da eseguire + double m_dCmdCoeff ; // coefficiente di movimento nel comando } ;