diff --git a/Beam/BeamData.lua b/Beam/BeamData.lua index 3390de2..0259405 100644 --- a/Beam/BeamData.lua +++ b/Beam/BeamData.lua @@ -114,6 +114,7 @@ if EgtExistsFile( sDataBeam) then BeamData.LEN_VERY_SHORT_PART = Machine.Offsets.LEN_VERY_SHORT_PART or BeamData.LEN_VERY_SHORT_PART BeamData.LEN_SHORT_PART = Machine.Offsets.LEN_SHORT_PART or BeamData.LEN_SHORT_PART BeamData.OVM_MID = Machine.Offsets.OVM_MID or BeamData.OVM_MID + if Machine.Offsets.CUT_SIC then BeamData.CUT_SIC = EgtClamp( Machine.Offsets.CUT_SIC, 15, 50) end end if Machine.Trave then BeamData.MIN_WIDTH = Machine.Trave.XMIN or BeamData.MIN_WIDTH diff --git a/Common_PF1250.TPA.mlpe b/Common_PF1250.TPA.mlpe index 33fbb23..a45cc38 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 diff --git a/Common_PF1250.mlpe b/Common_PF1250.mlpe index 470c4f4..6b2f2f6 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 --------------------------------------------------------------------- @@ -1058,6 +1081,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 @@ -1088,6 +1117,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' @@ -1584,16 +1619,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 --------------------------------------------------------------------- @@ -2627,9 +2808,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 115d9bb..48c11bc 100644 --- a/Essetre-PF1500MAXrl-3T.mlde +++ b/Essetre-PF1500MAXrl-3T.mlde @@ -5,8 +5,8 @@ require( 'EmtGenerator') EgtEnableDebug( true) -PP_VER = '2.7i2_DEV1' -PP_NVER = '2.7.9.2' +PP_VER = '2.7k1_DEV1' +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 }