diff --git a/Common_PF1250.TPA.mlpe b/Common_PF1250.TPA.mlpe index 463bad6..4e0fd1c 100644 --- a/Common_PF1250.TPA.mlpe +++ b/Common_PF1250.TPA.mlpe @@ -628,6 +628,9 @@ function OnPathStartAux() local Cmd = EgtSplitString( EMT.AUX) if Cmd[1] == '4' then EMT.TO_ZMAX = true + if Cmd[2] == '1' then + EMT.ROLL_IN = true + end end end @@ -907,6 +910,8 @@ function OnRapid() local dPosT = EMT.TPOS or EMT.L1op EmitParkRoller( dPosT, bSplitCut) end + -- eventuale preselezione successiva testa 2 + PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) -- eseguo movimenti local Speed = EMT.S -- se è macchina a 3 teste con gruppo truciolatore 4 assi @@ -914,10 +919,6 @@ function OnRapid() EmitMoveDataHead( 3, { Z=EMT.L3, S=Speed}) EmitMoveDataHead( 3, { B=EMT.R2, C=EMT.R1, S=Speed}) EmitMoveStartHead( 3) - -- eventuale preselezione successiva testa 2 - PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) - -- aspetto esecuzione movimento testa 3 - EmitMoveWaitHead( 3) -- se gruppo lama dedicato, senza cambio utensile elseif EgtGetHeadId( 'H38') then local B3Home = EgtGetAxisHomePos( 'B3') @@ -935,16 +936,14 @@ function OnRapid() end -- muovo in posizione finale EmitMoveDataHead( 3, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, S=Speed}) - - EmitMoveStartHead( 3) - -- eventuale preselezione successiva testa 2 - PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) - -- aspetto esecuzione movimento testa 3 - EmitMoveWaitHead( 3) - -- errore, testa non gestita else EmtSetLastError( 1212, "HEAD not managed") end + + EmitMoveStartHead( 3) + -- aspetto esecuzione movimento testa 3 + EmitMoveWaitHead( 3) + -- errore, testa non gestita end -- dati aggancio a trave local BhData = { T=EMT.L1, SetHead=0} @@ -998,17 +997,18 @@ function OnRapid() else --MyOutput( string.format( 'V1Pos=%.3f V2Pos=%.3f', EMT.V1POS, EMT.V2POS)) if not EMT.RELOAD and not EMT.ZMAX and #EMT.AUXCMD > 0 and EMT.TO_ZMAX then + local bGotoHome = EMT.HEAD == 'H38' and EMT.ROLL_IN -- caso speciale in cui bisogna solo cambiare presa aggregato lama sotto if EMT.R3_CHANGED then -- EmitZmax è fatta per essere chiamata con utensile attuale. In questo caso l'attuale è già quello con nuova rotazione -- Allora salvo l'attuale e imposto il vecchio solo momentanemente, per poi ripristinarlo local sBckTcPos = EMT.TCPOS EMT.TCPOS = EMT.PREVTCPOSREAL_H2 - EmitZmax( false, false, PrevR1, PrevR2, false, false, true) + EmitZmax( false, false, PrevR1, PrevR2, false, bGotoHome, true) EMT.TCPOS = sBckTcPos EMT.R3_CHANGED = nil else - EmitZmax( false, false, PrevR1, PrevR2, false, false, true) + EmitZmax( false, false, PrevR1, PrevR2, false, bGotoHome, true) end EMT.ZMAX = true EMT.TO_ZMAX = nil @@ -1238,6 +1238,8 @@ function OnRapid() EmitMoveWaitHead( 2) -- altrimenti testa 3 else + -- eventuale preselezione successiva testa 2 + PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) -- selezione testa (posso muovere X solo a Zmax) local MyMaxZ3 = EgtGetAxisMax( 'Z3') local dSafeZ3 = EgtGetAxisHomePos( 'Z3') @@ -1284,8 +1286,6 @@ function OnRapid() end EmitMoveStartHead( 3) - -- eventuale preselezione successiva testa 2 - PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) -- aspetto esecuzione movimento testa 3 EmitMoveWaitHead( 3) end diff --git a/Common_PF1250.mlpe b/Common_PF1250.mlpe index 467299d..b361e8c 100644 --- a/Common_PF1250.mlpe +++ b/Common_PF1250.mlpe @@ -163,6 +163,29 @@ function OnSimulStart() end -- Preparo lista collisioni vuota EMT.COLLIDE = {} + + -- si crea gruppo temporaneo appoggio controllo clamping + CLAMP_CHECK_GROUP = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'CLAMP_CHECK') + CLAMP_CHECK_INTERS = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'CLAMP_INTERS') + + if CLAMP_CHECK_GROUP then + EgtEmptyGroup( CLAMP_CHECK_GROUP) + else + local frClampCheckGroup = Frame3d( ORIG(), GDB_FR.FRONT) + CLAMP_CHECK_GROUP = EgtGroup( GDB_ID.ROOT, frClampCheckGroup) + EgtSetName( CLAMP_CHECK_GROUP, 'CLAMP_CHECK') + EgtSetLevel( CLAMP_CHECK_GROUP, GDB_LV.TEMP) + EgtSetStatus( CLAMP_CHECK_GROUP, GDB_ST.OFF) + end + + if CLAMP_CHECK_INTERS then + EgtEmptyGroup( CLAMP_CHECK_INTERS) + else + CLAMP_CHECK_INTERS = EgtGroup( GDB_ID.ROOT) + EgtSetName( CLAMP_CHECK_INTERS, 'CLAMP_INTERS') + EgtSetLevel( CLAMP_CHECK_INTERS, GDB_LV.TEMP) + EgtSetStatus( CLAMP_CHECK_INTERS, GDB_ST.OFF) + end end --------------------------------------------------------------------- @@ -1197,6 +1220,12 @@ function OnSimulMoveStart() EMT.A6n = 'Z2' local Z2 = -Head2Z + MillOffs + Mill2Offs + EMT.L3 EMT.A6 = EgtClamp( Z2, MinZ2, MaxZ2) + -- dato che la testa 2 è slave, bisogna controllare eventuale extra-corsa da post + if not( EMT.MOVE == 0 and EMT.FLAG == 2) and Z2 > MaxZ2 then + local sErr = EMT.MCHNAME..' ==> Out of Stroke: Z2 : '.. EgtNumToString( dZ2-MaxZ2, 2) + EmtSetLastError( 1220, sErr, true) + EgtOutBox( sErr, 'ERROR') + end EMT.A6m = EgtIf( ( EMT.MOVE == 2 or EMT.MOVE == 3), 'Z1', nil) EMT.A7n = 'C2' EMT.A7 = EMT.R1 @@ -1227,6 +1256,12 @@ function OnSimulMoveStart() EMT.DOU_DRILL_END = EMT.L3p - EMT.L3 Z2 = Z2 - 2 * EMT.DOU_DRILL_END end + -- dato che la testa 2 è slave, bisogna controllare eventuale extra-corsa da post + if not( EMT.MOVE == 0 and EMT.FLAG == 2) and Z2 < MinZ2 then + local sErr = EMT.MCHNAME..' ==> Out of Stroke: Z2 : '.. EgtNumToString( MinZ2-Z2, 2) + EmtSetLastError( 1220, sErr, true) + EgtOutBox( sErr, 'ERROR') + end EMT.A6 = EgtClamp( Z2, MinZ2, MaxZ2) EMT.A6m = nil EMT.A7n = 'C2' @@ -1725,16 +1760,162 @@ function ExecUnloading() end end +--------------------------------------------------------------------- +function CheckClamping( sClampName) + nIndexClamp = EgtGetAxisId( sClampName) + local idClampPath = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nIndexClamp, 'CLAMP_CHECK') or GDB_ID.NULL) + local b3ClampingArea = EgtGetBBoxGlob( idClampPath or GDB_ID.NULL, GDB_BB.STANDARD) + -- se non trovo percorso area di clamping, esco subito + if not idClampPath or not EMT.VMILL or not ClampingCoeffMin then + return + end + + function GetCurveListFromIntersection( sPosIntersPlane, sIntersPlane, vtOffset) + local idCurveList = {} + local vtIntersPlane + -- piano di interpolazione + if sIntersPlane == 'Y' then + vtIntersPlane = Y_AX() + elseif sIntersPlane == 'Z' then + vtIntersPlane = Z_AX() + end + + for i = 1, #EMT.VMILL do + local b3VMill = EgtGetBBoxGlob( EMT.VMILL[i], GDB_BB.STANDARD) + local ptPosIntersPlane + if sPosIntersPlane == 'MIN' then + ptPosIntersPlane = b3VMill:getMin() + vtOffset + elseif sPosIntersPlane == 'MAX' then + ptPosIntersPlane = b3VMill:getMax() + vtOffset + end + + local idLoop, nLoopCnt = EgtPlaneVolZmapInters( ptPosIntersPlane, vtIntersPlane, EMT.VMILL[i], CLAMP_CHECK_INTERS, GDB_RT.GLOB) + -- se c'è almeno una curva + if idLoop then + for j = 1, nLoopCnt do + local idLoopTemp = idLoop + j - 1 + table.insert( idCurveList, idLoopTemp) + end + end + end + return idCurveList + end + + function CalculateIntersectionArea( sPosIntersPlane, sIntersPlane, vtOffset) + -- test piano frontale + local idCurveList = GetCurveListFromIntersection( sPosIntersPlane, sIntersPlane, vtOffset) + + -- si copia curva intersezione e curva pinza in gruppo di confronto + local idFlatSurf, nFlatSurfCnt = EgtSurfFlatRegion( CLAMP_CHECK_GROUP, idCurveList) + local idClampSurf = EgtSurfFlatRegion( CLAMP_CHECK_GROUP, idClampPath) + + if idFlatSurf then + local dTotalArea = 0 + for k = 1, nFlatSurfCnt do + local idTempSurf = idFlatSurf + k - 1 + EgtSurfFrIntersect( idTempSurf, idClampSurf) + if idTempSurf then + dTotalArea = dTotalArea + ceil( EgtSurfArea( idTempSurf) or 0) + end + end + return dTotalArea + end + return 0 + end + + -- minima area considerata per un corretto pinzaggio + DistZClampToTable = DistZClampToTable or 0 + local MinJoin = BD.GetMinJoin( EMT.SB, EMT.HB, EgtIf( EMT.SPLIT, EMT.LT, EMT.LB)) + local MinZClamping = min( b3ClampingArea:getDimZ() + DistZClampToTable, EMT.SB) - DistZClampToTable + -- si moltiplica per un coefficiente minimo sotto al quale si da l'errore di pinzaggio + ClampingCoeffMin = EgtClamp( ClampingCoeffMin, 0.01, 1) + local dMinClampingAreaWarn = ( MinJoin * MinZClamping) * ClampingCoeffMin + local dMinClampingAreaErr = ( MinJoin * MinZClamping) * ( ClampingCoeffMin / 3) + + local bError = true + local sWrn, sErr + local bWriteWarnMessage = false + local bWriteErrMessage = false + -- controllo faccia frontale + local dArea = CalculateIntersectionArea( 'MIN', 'Y', Vector3d( 0, 1, 0)) + -- ERRORE: pinza troppo poco (meno di 1/3 del minimo richiesto) + if dArea and dArea < dMinClampingAreaErr then + -- solo se pinza almeno 1cm2, si prova un altro slice 5mm più all'interno, se aumenta al doppio non c'è errore (probabilmente siamo in presenza di un displuvio) + if dArea > 1000 then + local dNewArea = CalculateIntersectionArea( 'MIN', 'Y', Vector3d( 0, 5, 0)) + if dNewArea > dArea * 2 then + bError = false + end + end + -- pinzaggio non fattibile, errore + if bError then + sErr = 'ERROR CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)' + bWriteErrMessage = true + end + end + -- WARNING: pinza meno del minimo richiesto + if dArea and dArea < dMinClampingAreaWarn and not bWriteErrMessage then + sWrn = 'WARNING CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)' + bWriteWarnMessage = true + end + EgtEmptyGroup( CLAMP_CHECK_GROUP) + EgtEmptyGroup( CLAMP_CHECK_INTERS) + + -- controllo altro lato solo se non sono già in errore + if not bWriteErrMessage then + -- controllo faccia posteriore + dArea = CalculateIntersectionArea( 'MAX', 'Y', Vector3d( 0, -1, 0)) + -- ERRORE: pinza troppo poco (meno di 1/3 del minimo richiesto) + if dArea and dArea < dMinClampingAreaErr then + -- solo se pinza almeno 1cm2, si prova un altro slice 5mm più all'interno, se aumenta al doppio non c'è errore (probabilmente siamo in presenza di un displuvio) + if dArea > 1000 then + local dNewArea = CalculateIntersectionArea( 'MAX', 'Y', Vector3d( 0, -5, 0)) + if dNewArea > dArea * 2 then + bError = false + end + end + -- pinzaggio non fattibile, errore + if bError then + sErr = 'ERROR CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)' + bWriteErrMessage = true + end + end + -- WARNING: pinza meno del minimo richiesto + if dArea and dArea < dMinClampingAreaWarn and not bWriteWarnMessage and not bWriteErrMessage then + sWrn = 'WARNING CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)' + bWriteWarnMessage = true + end + EgtEmptyGroup( CLAMP_CHECK_GROUP) + EgtEmptyGroup( CLAMP_CHECK_INTERS) + end + + if bWriteErrMessage then + EmtSetLastError( 1213, sErr, EgtGetEnableUI()) + EgtOutBox( sErr, 'CLAMPING', 'ERROR', 'OK') + EmtSetSimulPause() + elseif bWriteWarnMessage then + EgtOutLog( sWrn) + EgtOutBox( sWrn, 'CLAMPING', 'WARNING', 'OK') + EmtSetSimulPause() + end +end + --------------------------------------------------------------------- function ExecMovePY1( bClose) SimulMoveAxes( 'PY1', EgtIf( not bClose, MaxHoOpen, EMT.HB), MCH_SIM_STEP.RAPID) SetPY1Light( bClose) + if bClose then + CheckClamping( 'PY1') + end end --------------------------------------------------------------------- function ExecMovePY2( bClose) SimulMoveAxes( 'PY2', EgtIf( not bClose, MaxHoOpen, EMT.HB), MCH_SIM_STEP.RAPID) SetPY2Light( bClose) + if bClose then + CheckClamping( 'PY2') + end end --------------------------------------------------------------------- @@ -2755,9 +2936,9 @@ end --------------------------------------------------------------------- function RollerParkingNeeded( sHead, dAng1p, dAng2p, dAng1, dAng2) if sHead == 'H11' or sHead == 'H12' or sHead == 'H13' or sHead == 'H16' then - return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1 % 180.0) > 1)) + return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1) % 180.0 > 1)) elseif sHead == 'H21' or sHead == 'H22' then - return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1 % 180.0) > 1)) + return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1) % 180.0 > 1)) elseif sHead == 'H38' then return ( abs( dAng1 - dAng1p) > 1 or abs( dAng2 - dAng2p) > 1) end diff --git a/Essetre-PF1500MAXrl-3T.mlde b/Essetre-PF1500MAXrl-3T.mlde index a6e1143..b2743f6 100644 --- a/Essetre-PF1500MAXrl-3T.mlde +++ b/Essetre-PF1500MAXrl-3T.mlde @@ -5,8 +5,8 @@ require( 'EmtGenerator') EgtEnableDebug( false) -PP_VER = '2.7i2' -PP_NVER = '2.7.9.2' +PP_VER = '2.7k1' +PP_NVER = '2.7.11.1' MIN_MACH_VER = '2.7d2' MACH_NAME = string.match( EgtGetCurrMachineDir(), "[^\\]+$") -- si ricava il nome della macchina dal direttorio diff --git a/UpdateLog.txt b/UpdateLog.txt index 584e347..605c16c 100644 --- a/UpdateLog.txt +++ b/UpdateLog.txt @@ -1,5 +1,12 @@ ==== Common_PF1250 Update Log ==== +Versione 2.7k1 (19/11/2025) +- (GEN) Preselzione testa 1 spostata prima della selezione testa 3. Ticket#2513 +- (SIM-GEN) Corretto calcolo per decidere se serve aprire i rulli +- (SIM) Aggiunto controllo Extra-Corsa testa 2 in caso di lavorazione in doppio. Ticket#2201 +- (SIM) Prima versione controllo pinzaggio su VMILL. Per attivarlo serve modifica della macchina a MLDE e NGE. +- (GEN) Simulazione non allineata a generazione. Se testa H38 e si chiudono i rulli, si deve andare in home. Ticket#2703 + Versione 2.7i1 (08/09/2025) - (GEN) Se fase start o restart, si aggiorna la posizione in X dell'asse per calcolare il link corretto. Serve CAM5 2.7h1 (facoltativo) - (EST) La stima tempi considera ora le accelerazoni degli assi diff --git a/Version.lua b/Version.lua index 98be1e5..bd30eb6 100644 --- a/Version.lua +++ b/Version.lua @@ -3,7 +3,7 @@ local InfoCommon_STD_PP = { NAME = 'Common_PF1250', -- nome script PP standard - VERSION = '2.7i1', -- versione script + VERSION = '2.7k1', -- versione script MIN_MACH_VER_PP_COMMON = '2.5k1' -- versione minima kernel }