diff --git a/Common_PF1250.TPA.mlpe b/Common_PF1250.TPA.mlpe index 6c26082..d71475d 100644 --- a/Common_PF1250.TPA.mlpe +++ b/Common_PF1250.TPA.mlpe @@ -1,5 +1,6 @@ --- Processore macchina Essetre-PF1250 by Egalware s.r.l. 2024/01/22 +-- Processore macchina Essetre-PF1250 by Egalware s.r.l. 2025/11/13 -- Con controllo numerico TPA +-- 2025/11/13 DS Modifiche per lavorazioni in doppio. -- Carico libreria local BD = require( 'BeamData') @@ -202,7 +203,7 @@ function OnDispositionEnd() -- reset recupero sovramateriale in X non più presente EMT.X_OFF = nil -- gruppo con info da BTL - local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL + local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL -- dati del grezzo local LBarra = EMT.LB local HBarra = EMT.HB @@ -376,7 +377,10 @@ function OnRawMoveData() if PartId then EMT.IDT = PartId EMT.IT = EgtGetInfo( PartId, 'PDN', 'i') or 0 + -- recupero il solido + local b3Raw = EgtGetBBoxGlob( EgtGetFirstNameInGroup( EgtGetFirstRawPart(), 'RawSolid'), GDB_BB.STANDARD) local b3Part = EgtGetBBoxGlob( EgtGetFirstNameInGroup( PartId, 'Box'), GDB_BB.STANDARD) + EMT.LR = b3Raw:getDimX() EMT.LT = b3Part:getDimX() EMT.HT = b3Part:getDimY() EMT.ST = b3Part:getDimZ() @@ -392,6 +396,7 @@ function OnRawMoveData() else EMT.IDT = GDB_ID.NULL EMT.IT = -1 + EMT.LR = 0 EMT.LT = 0 EMT.HT = EMT.HT or 0 EMT.ST = EMT.ST or 0 @@ -429,6 +434,7 @@ function OnMachiningStart() EMT.MCHNAME = EgtGetOperationName( EMT.MCHID) EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE) EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES) + EMT.MCHSPLIT = ( EMT.MCHUSERNOTES:find( 'Split;', 1, true) ~= nil) EMT.MCHPRECUT = ( EMT.MCHUSERNOTES:find( 'Precut;', 1, true) ~= nil) EMT.MCHCUT = ( EMT.MCHUSERNOTES:find( 'Cut;', 1, true) ~= nil) @@ -501,6 +507,8 @@ function OnMachiningEnd() --MyOutput( ';Mach End') -- Emissione split if #EMT.MDCHAR > 0 then + -- resetto piano + EmitResetMachining( true) if EMT.AUXTYPE == 'S' then EmitRemark( 'PART SPLIT') EMT.LB = EMT.LT @@ -514,10 +522,9 @@ function OnMachiningEnd() if EMT.PREROT then EmitRemark( 'PART ROTATION') elseif EMT.FALL then - if EMT.TO_ZMAX and not EMT.ZMAX then - EMT.TO_ZMAX = nil - end EmitRemark( 'PART FALL') + elseif EMT.UNLOAD and not nNextPathId and not nNextMchId then + EmitRemark( 'PART UNLOAD ON LOAD POSITION') else EmitRemark( 'PART SPLIT 2') end @@ -583,7 +590,10 @@ function OnMachiningEnd() EMT.AUXTYPE = nil EMT.TO_ZMAX = nil EMT.PREVTOOL = EMT.TOOL + EMT.PREVHEAD = EMT.HEAD + EMT.PREVTCPOS = EMT.TCPOS EMT.DOU_TYPE = nil + -- se taglio finale, aggiorno lunghezza barra if EMT.MCHCUT then EMT.LB = EMT.LT + ( EMT.X_OFF or 0) @@ -595,13 +605,11 @@ function OnMachiningEnd() EMT.PREVTOOL_H1 = EMT.TOOL EMT.PREVHEAD_H1 = EMT.HEAD EMT.PREVTCPOS_H1 = EMT.TCPOS - --EMT.PREVTCPOSREAL_H1 = EMT.TCPOSREAL -- per gruppo testa 2 elseif nSetHead == 2 then EMT.PREVTOOL_H2 = EMT.TOOL EMT.PREVHEAD_H2 = EMT.HEAD EMT.PREVTCPOS_H2 = EMT.TCPOS - --EMT.PREVTCPOSREAL_H2 = EMT.TCPOSREAL end end @@ -616,7 +624,6 @@ function OnPathStart() -- primo posizionamento sempre in globale EMT.REFLOC = nil EMT.IPLGL = false - -- se taglio di precut verifico quanto è più lungo il grezzo rispetto al pezzo (non tiene conto dell'ultimo cubetto) EMT.DELTA_LT = 0 if EMT.MCHPRECUT then @@ -624,6 +631,29 @@ function OnPathStart() EMT.DELTA_LT = max( EMT.XMINT - Point3d( EMT.MMAX):getX() - dCosA * EMT.TDIAM / 2, 0) end + -- se taglio di separazione, verifico se ci sarà caduta + if EMT.MCHSPLIT then + local sCmd = EgtGetInfo( EMT.PATHID, 'AE1') or '' + if sCmd:find( 'Fall', 1, true) then + EMT.TO_FALL = true + end + end + + -- leggo se ancora presa iniziale carrello + -- EMT.CNT = EgtGetInfo( EMT.PATHID, 'CNT', 'i') + --MyOutput( 'CNT='.. tostring( EMT.CNT or 0)) + -- se utensile non cambiato, salvo eventuali precedenti rotanti + if EMT.TOOL == EMT.PREVTOOL and not EMT.ZMAX then + EMT.L2pp = EMT.L2op + EMT.L3pp = EMT.L3op + EMT.R1pp = EMT.R1p or EMT.R1pp + EMT.R2pp = EMT.R2p or EMT.R2pp + else + EMT.L2pp = nil + EMT.L3pp = nil + EMT.R1pp = nil + EMT.R2pp = nil + end -- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento) EmtResetPrev() EMT.AUXCMD = {} @@ -647,9 +677,6 @@ function OnPathEnd() if EMT.OPEISDISP then return end - if not EMT.ZMAX then - EmitResetMachining( true) - end -- salvo dati precedenti EMT.L2pp = EMT.L2o @@ -660,6 +687,7 @@ function OnPathEnd() EMT.SPLITROT = nil EMT.CHY_ON = nil EMT.FALL = nil + EMT.TO_FALL = nil EMT.MDCHAR = {} EMT.PREVTOOL = EMT.TOOL end @@ -669,14 +697,6 @@ function OnPathStartAux() --EgtOutLog( 'OnPathStartAux - ' .. EgtNumToString( EMT.AUXIND, 0) .. ' - ' .. EMT.AUX) -- salvo il comando per processarlo successivamente table.insert( EMT.AUXCMD, EMT.AUX) - -- gestione speciale per richiesta di movimento a ZMAX - 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 --------------------------------------------------------------------- @@ -765,8 +785,13 @@ function OnRapid() local bStdRise = ( EMT.FLAG2 ~= 2 and EMT.FLAG == 3) local bStdMachRapid = ( EMT.FLAG2 == 0 and ( EMT.FLAG == 0 or EMT.FLAG == 1)) - -- se Split e non Caduta lascio agganciata solo la pinza Y2 alla fine dei movimenti - local bSplitMach = ( EMT.MCHUSERNOTES:find( 'Split', 1, true) ~= nil) + -- recupero eventuali flag da Info del movimento + local bSplit = EgtGetInfo( EMT.MOVEID, 'Split', 'b') + local sPostMove = '' + + local sHeadToMoveFirst = EgtGetInfo( EMT.MOVEID, 'HeadToMoveFirst', 's') or false + local bFirstMoveOnlyH1 = sHeadToMoveFirst and sHeadToMoveFirst == 'H1' + local bFirstMoveOnlyH2 = sHeadToMoveFirst and sHeadToMoveFirst == 'H2' -- tutte le teste devono passare dalla gestione nuovi link, altrimenti errore if not IsNewLinkHead( EMT.HEAD) then @@ -778,13 +803,12 @@ function OnRapid() -- se primo movimento della lavorazione, gestione speciale if EMT.MCHFIRST then - MyAdjustLinearAxes() - EmtAdjustRotaryAxes() - - EmtResetPrev() - - -- se carico trave + -- se prima lavorazione if EMT.LOAD then + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + EmtResetPrev() + EMT.V2POS = ParkV2 -- primo posizionamento local bOnlyCharY = true @@ -792,8 +816,8 @@ function OnRapid() ProcessPathStartAux( EMT.AUXCMD[i], i) end EMT.AUXCMD = {} - local bFall = ( bSplitMach and FindFallAtEndAux( EMT.PATHID)) - if ( bSplitMach and not bFall and #EMT.MDCHAR > 0) then + -- se Split lascio agganciata solo la pinza Y2 alla fine dei movimenti + if EMT.MCHSPLIT and #EMT.MDCHAR > 0 and not EMT.TO_FALL and not EMT.TO_SPECSPLIT then EMT.MDCHAR[#EMT.MDCHAR].FinStatY1 = 1 end for i = 1, #EMT.MDCHAR do @@ -801,6 +825,32 @@ function OnRapid() if EMT.MDCHAR[i].MovType ~= 1 then bOnlyCharY = false end end EMT.MDCHAR = {} + + local bParkV = false + + -- verifica se serve aprire i carrelli + local bCondBase = ( EMT.MCHFIRST or EMT.MOVE == 0) + local bCondPosition = EMT.V1POS < EMT.V1NEXTPOS - 1 or + EMT.V2POS > EMT.V2NEXTPOS + 1 or + RollerParkingNeeded( EMT.HEAD, EMT.R1, EMT.R2, EMT.R1, EMT.R2) + + if bCondBase and bCondPosition then + bParkV = true + end + + local bNlhParkV = ( EMT.MOVE == 0 and ( EMT.FLAG2 == 1 or EMT.FLAG2 == 2)) + if bNlhParkV then + bParkV = ( EMT.FLAG == 2 and bParkV) or ( not EMT.MCHSPLIT or bSplit) + end + + if bParkV or bNlhParkV then + local bMchSplit = ( bNlhParkV and EMT.MCHSPLIT and bSplit) + if EMT.SPLIT_Y1DELTA and not EMT.MCHSPLIT then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end + local dPosT = EMT.TPOS or EMT.L1op + EmitParkRoller( dPosT, bMchSplit) + end + if EMT.SPLIT_Y1DELTA then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end + EmitMoveStartChars( EgtIf( bOnlyCharY, 1, 3)) EmitRemark( ' *** '..EMT.MCHNAME..'/'..EMT.TOOL..' *** ') @@ -810,24 +860,37 @@ function OnRapid() EmitMoveWaitHead( nHSet) EmitMoveWaitChars( EgtIf( bOnlyCharY, 1, 3)) + -- altrimenti lavorazione successiva else - -- se primo rapido della lavorazione è un movimento standard, e c'è ancora piano attivo dalla lavorazione precedente, allora questo è un climb if bStdMachRapid then bStdMachRapid = false bStdClimb = true end + + -- si disattiva piano a meno che non sia lavorazione con stesso utensile e stesso orientamento assi if EMT.PLANEACTIVE then EmitResetMachining( false) end + + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + EmtResetPrev() + EmitRemark( ' *** '..EMT.MCHNAME..'/'..EMT.TOOL..' *** ') -- eventuale movimento carrelli for i = 1, #EMT.AUXCMD do ProcessPathStartAux( EMT.AUXCMD[i], i) + -- se ultimo comando e lavorazione di split, sgancio il carro Y1 + if i == #EMT.AUXCMD and EMT.MCHSPLIT and not EMT.TO_FALL then + EMT.SPLIT_Y1DELTA = EMT.Y1DELTA + EMT.Y1DELTA = nil + end end EMT.AUXCMD = {} - -- recupero eventuali flag da Info del movimento - local bFall = ( bSplitMach and FindFallAtEndAux( EMT.PATHID)) - if ( bSplitMach and not bFall and #EMT.MDCHAR > 0) then + + -- se Split e non Caduta lascio agganciata solo la pinza Y2 alla fine dei movimenti + local bFall = ( EMT.MCHSPLIT and FindFallAtEndAux( EMT.PATHID)) + if ( EMT.MCHSPLIT and not bFall and #EMT.MDCHAR > 0) then EMT.MDCHAR[#EMT.MDCHAR].FinStatY1 = 1 end for i = 1, #EMT.MDCHAR do @@ -845,8 +908,8 @@ function OnRapid() -- verifica se serve aprire i carrelli local bCondBase = EMT.MCHFIRST or EMT.MOVE == 0 local bCondPosition = EMT.V1POS < EMT.V1NEXTPOS - 1 or - EMT.V2POS > EMT.V2NEXTPOS + 1 or - RollerParkingNeeded( EMT.HEAD, EMT.R1prec, EMT.R2prec, EMT.R1, EMT.R2) + EMT.V2POS > EMT.V2NEXTPOS + 1 or + RollerParkingNeeded( EMT.HEAD, EMT.R1prec, EMT.R2prec, EMT.R1, EMT.R2) if bCondBase and bCondPosition then bParkV = true @@ -854,39 +917,49 @@ function OnRapid() local bNlhParkV = ( EMT.MOVE == 0 and ( EMT.FLAG2 == 1 or EMT.FLAG2 == 2)) if bNlhParkV then - bParkV = ( EMT.FLAG == 2 and bParkV) or not bSplitMach + bParkV = ( EMT.FLAG == 2 and bParkV) or ( not EMT.MCHSPLIT or bSplit) end - if bParkV then - local bMchSplit = bNlhParkV and bSplitMach + if bParkV or bNlhParkV then + local bMchSplit = ( bNlhParkV and EMT.MCHSPLIT and bSplit) + if EMT.SPLIT_Y1DELTA and not EMT.MCHSPLIT then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end local dPosT = EMT.TPOS or EMT.L1op EmitParkRoller( dPosT, bMchSplit) end + if EMT.SPLIT_Y1DELTA then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end - -- se taglio di coda senza residuo da scaricare - if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Cut', 1, true) then - -- se sfrido grande, emetto comando speciale - if EMT.LB - EMT.LT > 99 then - if IsHeadExisting( 3) then - MyOutput( 'M107') - else - MyOutput( ';M107') - end + -- se la testa 1 deve andare per prima in posizione, start e attesa movimento + if bFirstMoveOnlyH2 then + if EMT.APPROACH.DBLCLIMBS and #EMT.APPROACH.DBLCLIMBS > 0 then + EmitMoveDataHead( 2, { X=-EMT.APPROACH.DBLCLIMBS[1].L2, Z=EMT.APPROACH.DBLCLIMBS[1].L3, C=EMT.APPROACH.DBLCLIMBS[1].R1, B=EMT.APPROACH.DBLCLIMBS[1].R2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED}) + EmitMoveStartHead( 2) + EmitMoveWaitHead( 2) + -- si rimuove il primo movimento + table.remove( EMT.APPROACH.DBLCLIMBS, 1) end - -- emetto M175 per accelerare il carico della barra successiva - MyOutput( ';M175') end - EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, S=CalcRealSpeed( EMT.S)}) + EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, C=EMT.R1, B=EMT.R2, S=CalcRealSpeed( EMT.S)}) + -- se la testa 1 deve andare per prima in posizione, start e attesa movimento + if bFirstMoveOnlyH1 then + EmitMoveStartHead( 1) + EmitMoveWaitHead( 1) + end end - EMT.MCHFIRST = false -- movimento standard CLIMB elseif EMT.FLAG == 2 then - MyAdjustLinearAxes() - EmtAdjustRotaryAxes() - EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, C=EMT.R1, B=EMT.R2, S=CalcRealSpeed( EMT.S)}) - -- movimento standard RISE + -- se non ho ancora impostato il piano, movimenti in assoluto + if not EMT.PLANEACTIVE then + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + + EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, C=EMT.R1, B=EMT.R2, S=CalcRealSpeed( EMT.S)}) + -- altrimenti è un rapido standard + else + bStdMachRapid = true + end + -- se movimento standard RISE elseif EMT.FLAG == 3 then EMT.REFLOC = nil EMT.IPLGL = false @@ -894,24 +967,29 @@ function OnRapid() if bFirstRise or bUniqueRise or bStdRise then EmitResetMachining( true) local dPosT = EMT.TPOS or EMT.L1op - EmitParkRoller( dPosT, bSplitMach) + EmitParkRoller( dPosT, EMT.MCHSPLIT) end MyAdjustLinearAxes() EmtAdjustRotaryAxes() + EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, C=EMT.R1, B=EMT.R2}) -- su ultimo rapido in uscita, comandi di attesa movimenti - if bLastRise or bStdRise then + if bLastRise or bUniqueRise or bStdRise then EmitMoveStartHead( nHSet) -- se lavorazione in doppio - if nHSet == 1 and ( EMT.DOU_TYPE == 2 or EMT.DOU_TYPE == 3) then - for i = 1, #EMT.APPROACH.DBLRISES do - EmitMoveDataHead( 2, { X=EMT.APPROACH.DBLRISES[i].L2, Z=EMT.APPROACH.DBLRISES[i].L3, C=EMT.APPROACH.DBLRISES[i].R1, B=EMT.APPROACH.DBLRISES[i].R2}) + if nHSet == 1 and ( EMT.DOU_TYPE == 2 or EMT.DOU_TYPE == 3) then + if EMT.APPROACH.DBLRISES and #EMT.APPROACH.DBLRISES > 0 then + for i = 1, #EMT.APPROACH.DBLRISES do + EmitMoveDataHead( 2, { X=-EMT.APPROACH.DBLRISES[i].L2, Z=EMT.APPROACH.DBLRISES[i].L3, C=EMT.APPROACH.DBLRISES[i].R1, B=EMT.APPROACH.DBLRISES[i].R2, TPos=EMT.DOU_TPOS}) + end + EmitMoveStartHead( 2) + EmitMoveWaitHead( 2) end - EmitMoveStartHead( 2) - EmitMoveWaitHead( 2) end EmitMoveWaitHead( nHSet) EMT.ZMAX = true + -- TODO preselezione testa corrente + -- ToolPreSelectionSingleHead( EMT.MCHID) end -- se altrimenti movimento in Home elseif EMT.FLAG == 4 then @@ -921,27 +999,28 @@ function OnRapid() end - -- se ultimo, oppure unico, movimento in discesa sul pezzo, attivo piano generico - if bLastClimb or bUniqueClimb or bStdClimb then + -- se ultimo, oppure unico, movimento in discesa sul pezzo, attivo piano generico. Se già attivo siginifica che è seconda lavorazione compatibile + if not EMT.PLANEACTIVE and ( bLastClimb or bUniqueClimb or bStdClimb) then EMT.ZMAX = false -- movimenti testa -- scrittura comando start movimenti testa EmitMoveStartHead( nHSet) -- se lavorazione in doppio if nHSet == 1 and ( EMT.DOU_TYPE == 2 or EMT.DOU_TYPE == 3) then - for i = 1, #EMT.APPROACH.DBLCLIMBS do - EmitMoveDataHead( 2, { X=EMT.APPROACH.DBLCLIMBS[i].L2, Z=EMT.APPROACH.DBLCLIMBS[i].L3, C=EMT.APPROACH.DBLCLIMBS[i].R1, B=EMT.APPROACH.DBLCLIMBS[i].R2}) + if EMT.APPROACH.DBLCLIMBS and #EMT.APPROACH.DBLCLIMBS > 0 then + for i = 1, #EMT.APPROACH.DBLCLIMBS do + EmitMoveDataHead( 2, { X=-EMT.APPROACH.DBLCLIMBS[i].L2, Z=EMT.APPROACH.DBLCLIMBS[i].L3, C=EMT.APPROACH.DBLCLIMBS[i].R1, B=EMT.APPROACH.DBLCLIMBS[i].R2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED}) + end + EmitMoveStartHead( 2) + EmitMoveWaitHead( 2) end - EmitMoveStartHead( 2) - EmitMoveWaitHead( 2) -- altrimenti preselezione su altra testa else PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) end -- aspetto esecuzione movimento testa 2 - EmitMoveWaitHead( nHSet) - - -- movimenti carrelli + EmitMoveWaitHead( nHSet) + if EMT.LOAD then -- dati aggancio a trave local BhData = { T=EMT.L1, SetHead=0} @@ -952,7 +1031,7 @@ function OnRapid() BhData.Y1 = ParkY1 BhData.ViseY1 = 2 end - if bSplitMach and EMT.Y2DELTA then + if EMT.MCHSPLIT and EMT.Y2DELTA then BhData.ViseY1 = 3 end if EMT.Y2DELTA then @@ -963,17 +1042,21 @@ function OnRapid() BhData.ViseY2 = 2 end if GetV1ToCloseTPA() then - BhData.V1 = EMT.V1NEXTPOS ; EMT.V1POS = BhData.V1 + BhData.V1 = EMT.V1NEXTPOS + EMT.V1POS = BhData.V1 BhData.StatV1 = -2 elseif abs( EMT.V1POS - ParkV1) > 0.1 then - BhData.V1 = ParkV1 ; EMT.V1POS = BhData.V1 + BhData.V1 = ParkV1 + EMT.V1POS = BhData.V1 BhData.StatV1 = 1 end if GetV2ToCloseTPA() then - BhData.V2 = EMT.V2NEXTPOS ; EMT.V2POS = BhData.V2 + BhData.V2 = EMT.V2NEXTPOS + EMT.V2POS = BhData.V2 BhData.StatV2 = -2 elseif abs( EMT.V2POS - ParkV2) > 0.1 then - BhData.V2 = ParkV2 ; EMT.V2POS = BhData.V2 + BhData.V2 = ParkV2 + EMT.V2POS = BhData.V2 BhData.StatV2 = 1 end EmitBeamHeadData( BhData) @@ -991,6 +1074,7 @@ function OnRapid() MyOutput( ';M107') end end + -- altrimenti lavorazione successiva else -- dati aggancio a trave local BhData = { T=EMT.L1} @@ -1001,7 +1085,7 @@ function OnRapid() BhData.Y1 = ( EMT.Y1POS or ParkY1) BhData.ViseY1 = 2 end - if bSplitMach and EMT.Y2DELTA then + if EMT.MCHSPLIT and EMT.Y2DELTA then BhData.ViseY1 = 3 end if EMT.Y2DELTA then @@ -1012,23 +1096,42 @@ function OnRapid() BhData.ViseY2 = 2 end if GetV1ToCloseTPA() then - BhData.V1 = EMT.V1NEXTPOS ; EMT.V1POS = BhData.V1 + BhData.V1 = EMT.V1NEXTPOS + EMT.V1POS = BhData.V1 BhData.StatV1 = -2 elseif abs( EMT.V1POS - ParkV1) > 0.1 then - BhData.V1 = ParkV1 ; EMT.V1POS = BhData.V1 + BhData.V1 = ParkV1 + EMT.V1POS = BhData.V1 BhData.StatV1 = 1 end if GetV2ToCloseTPA() then - BhData.V2 = EMT.V2NEXTPOS ; EMT.V2POS = BhData.V2 + BhData.V2 = EMT.V2NEXTPOS + EMT.V2POS = BhData.V2 BhData.StatV2 = -2 elseif abs( EMT.V2POS - ParkV2) > 0.1 then - BhData.V2 = ParkV2 ; EMT.V2POS = BhData.V2 + BhData.V2 = ParkV2 + EMT.V2POS = BhData.V2 BhData.StatV2 = 1 end EmitBeamHeadData( BhData) EMT.POSTROT = false EMT.RELOAD = false EMT.RELOAD2 = nil + EMT.SPLIT_Y1DELTA = nil + end + + -- se taglio di coda senza residuo da scaricare + if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Cut', 1, true) then + -- se sfrido grande, emetto comando speciale + if EMT.LB - EMT.LT > 99 then + if IsHeadExisting( 3) then + MyOutput( 'M107') + else + MyOutput( ';M107') + end + end + -- emetto M175 per accelerare il carico della barra successiva + EmtOutput( 'M175') end -- ripristino assi prima di ricalcolare su piano locale @@ -1043,22 +1146,21 @@ function OnRapid() -- trasformo i punti nel piano MyAdjustLinearAxes() EmtAdjustRotaryAxes() + EMT.L1p = nil + EMT.L2p = nil + EMT.L3p = nil MyOutput( 'M105 P1=' .. GetFaceCode() .. ' P2='..GetHeadSetCode()..' P3='..EgtIf( EMT.DOU_TYPE, 2, 0)) MyOutput( 'M98') MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true)) MyOutput( 'G24' .. EMT.IPLGLSTR) EMT.PLANEACTIVE = true - - -- EMT.L1p = nil - -- EMT.L2p = nil - -- EMT.L3p = nil - -- annullo precedenti per forzare scrittura + -- forzo successiva emissione assi rotanti EMT.R1p = nil EMT.R2p = nil -- emissione movimento local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3').. - EmtGetAxis('R2')..EmtGetAxis('R1') + EmtGetAxis('R2')..EmtGetAxis('R1') if #sAxes > 0 then if EmitRapidInG1 then local sFeed = ' F30000' @@ -1079,9 +1181,9 @@ function OnRapid() if #sAxes > 0 then if EmitRapidInG1 then local sFeed = ' F30000' - MyOutput( 'G1' .. sAxes .. sFeed) + EmtOutput( 'G1' .. sAxes .. sFeed) else - MyOutput( 'G0' .. sAxes) + EmtOutput( 'G0' .. sAxes) end end end @@ -1093,10 +1195,8 @@ function OnRapid() -- si salva posizione assi rotanti EMT.R1prec = EMT.R1 EMT.R2prec = EMT.R2 - end - --------------------------------------------------------------------- function OnLinear() -- se necessario, impostazione riferimento locale @@ -1116,15 +1216,15 @@ function OnLinear() -- trasformo i punti nel piano MyAdjustLinearAxes() EmtAdjustRotaryAxes() - -- EMT.L1p = nil - -- EMT.L2p = nil - -- EMT.L3p = nil + EMT.L1p = nil + EMT.L2p = nil + EMT.L3p = nil MyOutput( 'M105 P1=' .. GetFaceCode() .. ' P2='..GetHeadSetCode()..' P3='..EgtIf( EMT.DOU_TYPE, 2, 0)) MyOutput( 'M98') MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true)) MyOutput( 'G24' .. EMT.IPLGLSTR) EMT.PLANEACTIVE = true - + -- emissione movimento EMT.R1p = nil EMT.R2p = nil if EmitRapidInG1 then @@ -1157,15 +1257,17 @@ function OnLinear() MyAdjustLinearAxes() EmtAdjustRotaryAxes() - -- se lavorazione in doppio e fondo foro, inverto movimento punta doppia - if EMT.MCHTYPE == MCH_MY.DRILLING and not EMT.DBLHEADPARA and ( EMT.DOU_TYPE == 2 or EMT.DOU_TYPE == 3) and EMT.FLAG == 105 then - MyOutput( "M106 P1=1") + -- se lavorazione in doppio, da questo movimento bisogna passare ad accoppiamento in parallelo + if not EMT.DBLHEADPARA and ( EMT.DOU_TYPE == 2 or EMT.DOU_TYPE == 3) and + ( ( EMT.MCHTYPE == MCH_MY.DRILLING and EMT.FLAG == 105) or ( EMT.MCHTYPE == MCH_MY.POCKETING and EMT.FLAG == 405))then + EmtOutput( "M106 P1=1") EMT.DBLHEADPARA = true end - -- se lavorazione in doppio e fondo foro, muovo punta 2 e poi ripristino movimento standard punta doppia - if EMT.DBLHEADPARA and EMT.FLAG == 104 then - MyOutput( "M106 P1=2") + -- se testa accoppiata in parallelo, in uscita si disaccoppia per tornare ad accoppiamento speculare + if EMT.DBLHEADPARA and + ( ( EMT.MCHTYPE == MCH_MY.DRILLING and EMT.FLAG == 104) or ( EMT.MCHTYPE == MCH_MY.POCKETING and EMT.FLAG == 404)) then + EmtOutput( "M106 P1=2") EMT.DBLHEADPARA = nil end @@ -1182,7 +1284,6 @@ function OnLinear() -- aggiorno valori come precedenti EMT.TPOS = EMT.L1o EmtUpdatePrev() - end --------------------------------------------------------------------- @@ -1204,15 +1305,15 @@ function OnArc() -- trasformo i punti nel piano MyAdjustLinearAxes() EmtAdjustRotaryAxes() - -- EMT.L1p = nil - -- EMT.L2p = nil - -- EMT.L3p = nil + EMT.L1p = nil + EMT.L2p = nil + EMT.L3p = nil MyOutput( 'M105 P1=' .. GetFaceCode() .. ' P2='..GetHeadSetCode()..' P3='..EgtIf( EMT.DOU_TYPE, 2, 0)) MyOutput( 'M98') MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true)) MyOutput( 'G24' .. EMT.IPLGLSTR) EMT.PLANEACTIVE = true - + -- emissione movimento EMT.R1p = nil EMT.R2p = nil if EmitRapidInG1 then @@ -1248,6 +1349,13 @@ function OnArc() MyAdjustLinearAxes() EmtAdjustRotaryAxes() + -- se lavorazione in doppio, da questo movimento bisogna passare ad accoppiamento in parallelo + if not EMT.DBLHEADPARA and ( EMT.DOU_TYPE == 2 or EMT.DOU_TYPE == 3) and + ( ( EMT.MCHTYPE == MCH_MY.DRILLING and EMT.FLAG == 105) or ( EMT.MCHTYPE == MCH_MY.POCKETING and EMT.FLAG == 405))then + EmtOutput( "M106 P1=1") + EMT.DBLHEADPARA = true + end + -- valori degli assi local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3').. EmtGetAxis('R2')..EmtGetAxis('R1') @@ -1406,6 +1514,8 @@ function PrepareLoad( sCmd, nInd, bStart) EMT.BV = EgtIf( Cmd[2] ~= '0', 2, 1) if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY2 = EMT.FSY2 end elseif Cmd[1] == '21' then + EMT.Y1PREVDELTA = EMT.Y1DELTA + EMT.Y2PREVDELTA = EMT.Y2DELTA local nY1Delta = tonumber( Cmd[2]) local nY2Delta = tonumber( Cmd[3]) if nY1Delta > 0 and nY2Delta > 0 then @@ -1540,6 +1650,8 @@ function PrepareMoveChar( sCmd, nInd) EMT.BV = EgtIf( Cmd[2] ~= '0', 2, 1) if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY2 = EMT.FSY2 end elseif Cmd[1] == '21' then + EMT.Y1PREVDELTA = EMT.Y1DELTA + EMT.Y2PREVDELTA = EMT.Y2DELTA local nY1Delta = tonumber( Cmd[2]) local nY2Delta = tonumber( Cmd[3]) if nY1Delta > 0 and nY2Delta > 0 then @@ -1684,6 +1796,8 @@ function PrepareSplit( sCmd, nInd) EMT.V1POS = ParkV1 end elseif Cmd[1] == '21' then + EMT.Y1PREVDELTA = EMT.Y1DELTA + EMT.Y2PREVDELTA = EMT.Y2DELTA local nY1Delta = tonumber( Cmd[2]) local nY2Delta = tonumber( Cmd[3]) if nY1Delta > 0 and nY2Delta > 0 then @@ -1866,6 +1980,8 @@ function PreparePreRotation( sCmd, nInd) elseif Cmd[1] == '21' then local nY1Delta = tonumber( Cmd[2]) local nY2Delta = tonumber( Cmd[3]) + EMT.Y1PREVDELTA = EMT.Y1DELTA + EMT.Y2PREVDELTA = EMT.Y2DELTA if nY1Delta > 0 and nY2Delta > 0 then EMT.Y1DELTA = nY1Delta EMT.Y2DELTA = nY2Delta @@ -1914,6 +2030,8 @@ function PreparePostRotation( sCmd, nInd) elseif Cmd[1] == '12' then -- non interessa elseif Cmd[1] == '21' then + EMT.Y1PREVDELTA = EMT.Y1DELTA + EMT.Y2PREVDELTA = EMT.Y2DELTA local nY1Delta = tonumber( Cmd[2]) local nY2Delta = tonumber( Cmd[3]) if nY1Delta > 0 and nY2Delta > 0 then @@ -2033,7 +2151,7 @@ function AdjustTcPos( bLen3, sTcPos, dAxR3) end end if sPos == '101' then - if not dAxR3 then dAxR3 = EMT.R3 end + if not dAxR3 then dAxR3 = ( EMT.R3 or 0) end -- controllo che il valore esista. Altrimenti è una testa senza asse ausiliario if dAxR3 then if abs( dAxR3 - 0) < 0.1 then @@ -2194,20 +2312,19 @@ function CalcRealSpeed( dSpeed) end return dSpeed end + --------------------------------------------------------------------- -function EmitResetMachining( bNextTool) +function EmitResetMachining( bCurrTool) if EMT.PLANEACTIVE then MyOutput( 'G27') - if EMT.PREFALLCUT then + if EMT.PREFALLCUT and bCurrTool then MyOutput( 'M29') EMT.PREFALLCUT = nil end local sP12 = '' - - if ( bNextTool and EMT.TOOL ~= GetNextTool( EMT.MCHID)) or ( not bNextTool and EMT.TOOL ~= EMT.PREVTOOL) then - sP12 = EgtIf( EMT.HEAD ~= 'H21', ' P1=0'..EgtIf( EMT.DOU_TYPE, ' P2=0', ''), ' P2=0') - end - local sP4 = EgtIf( EMT.MCHUSERNOTES:find( 'Split', 1, true), ' P4=1', '') + local bChangeTool = ( bCurrTool and EMT.TOOL ~= GetNextTool( EMT.MCHID)) or ( not bCurrTool and EMT.TOOL ~= EMT.PREVTOOL) + if bChangeTool then sP12 = EgtIf( EMT.HEAD ~= 'H21', ' P1=0'..EgtIf( EMT.DOU_TYPE, ' P2=0', ''), ' P2=0') end + local sP4 = EgtIf( EMT.MCHUSERNOTES:find( 'Split', 1, true) and bCurrTool, ' P4=1', '') MyOutput( 'M99'..sP12..sP4) -- piano non più attivo EMT.PLANEACTIVE = false @@ -2231,13 +2348,13 @@ function EmitParkRoller( dPosT, bSplitCut) local DiffY2 = MyParkY2 - dPosY2 --MyOutput( string.format( 'PosT=%.3f DiffY1=%.3f DiffY2=%.3f', dPosT, DiffY1, DiffY2)) if bSplitCut then - if DiffY1 > 0.1 then - MDChar.Y1 = dPosY1 + DiffY1 - end - if DiffY2 < -0.1 then - MDChar.Y2 = dPosY2 + DiffY2 - dPosT = dPosT + DiffY2 - end + local dAddMoveY1 = ParkV1 + ( -dPosT - EMT.LR) + local dAddMoveY2 = ParkV2 + ( -dPosT - EMT.LR) + local MoveY1 = max( DiffY1, dAddMoveY1, 30.0) + local MoveY2 = min( DiffY2, dAddMoveY2, -30.0) + MDChar.Y1 = dPosY1 + MoveY1 + MDChar.Y2 = dPosY2 + MoveY2 + dPosT = dPosT + MoveY2 elseif DiffY1 > 0.1 and DiffY2 < -0.1 then EmtSetLastError( 1201, 'Error Collision in ParkRoller') elseif DiffY1 > 0.1 then @@ -2264,7 +2381,7 @@ function EmitParkRoller( dPosT, bSplitCut) local dPosY1 = dPosT + EMT.Y1DELTA local DiffY1 = MyParkY1 - dPosY1 local dMoveY1 = EgtIf( DiffY1 > 0.1, dMoveV1, 0) - local dTryMoveY1 = min( ParkV1 - dPosT - EgtIf( bSplitCut or EMT.FALL, EMT.LT, 0), MaxY1 - dPosY1 - 10) + local dTryMoveY1 = min( ParkV1 - dPosT - EgtIf( bSplitCut or EMT.FALL, EMT.LT, 0) - EMT.HOVM, MaxY1 - dPosY1 - 10) if ( dPosT > ParkV2 - ExtraParkV and dPosT < ParkV1 and dPosY1 + dTryMoveY1 < MaxY1) then dMoveY1 = max( dMoveY1, dTryMoveY1) end --MyOutput( string.format( 'PosT=%.3f PosY1=%.3f V1POS=%.3f Split=%s', dPosT, dPosY1, EMT.V1POS, EgtIf( bSplitCut, '1', '0'))) MDChar.Y1 = dPosY1 + dMoveY1 @@ -2287,6 +2404,9 @@ function EmitParkRoller( dPosT, bSplitCut) if abs( ParkV1 - EMT.V1POS) > 0.1 then MDChar.V1 = ParkV1 MDChar.IniStatV1 = 1 + if MDChar.MovType == 2 then + MDChar.MovType = 3 + end end if abs( ParkV2 - EMT.V2POS) > 0.1 then MDChar.V2 = ParkV2 @@ -2298,6 +2418,9 @@ function EmitParkRoller( dPosT, bSplitCut) MDChar.IniStatV2 = 1 end end + if EMT.SPLIT_Y1DELTA and EMT.SPLIT_Y1DELTA + dPosT < MyParkY1 then + MDChar.Y1 = MyParkY1 + end EmitMoveDataChars( MDChar) EmitMoveStartChars( MDChar.MovType) EmitMoveWaitChars( MDChar.MovType) diff --git a/Common_PF1250.mlpe b/Common_PF1250.mlpe index 5faf6ca..777dc77 100644 --- a/Common_PF1250.mlpe +++ b/Common_PF1250.mlpe @@ -231,7 +231,8 @@ function OnSimulDispositionStart() end -- Se vero inizio e abilitato creo gli Zmap EMT.VMILL = {} - if not EMT.SIM1ST and EgtGetInfo( EgtGetCurrMachGroup(), 'Vm', 'b') then + if not EMT.SIM1ST then + local bShowVMill = EgtGetInfo( EgtGetCurrMachGroup(), 'Vm', 'b') local nLastOrd = GetPhaseOrd( EgtGetPhaseCount()) local nPartRawId = EgtGetFirstRawPart() while nPartRawId do @@ -257,7 +258,7 @@ function OnSimulDispositionStart() -- determino la risoluzione dello Zmap local dTol = 4.71 if EmtGetVMillStep then - dTol = EmtGetVMillStep( b3Raw:getDimX(), b3Raw:getDimY(), b3Raw:getDimZ(), dTol) + dTol = EmtGetVMillStep( b3Raw:getDimX(), b3Raw:getDimY(), b3Raw:getDimZ(), EMT.VMILLTOL or dTol) else local dArea = b3Raw:getDimX() * b3Raw:getDimY() + b3Raw:getDimX() * b3Raw:getDimZ() + b3Raw:getDimY() * b3Raw:getDimZ() if dArea < 0.075e6 then @@ -273,21 +274,25 @@ function OnSimulDispositionStart() elseif dArea < 2.4e6 then dTol = 3.77 end + dTol = min( dTol, EMT.VMILLTOL or dTol) -- imposto dTol al valore minore tra quello per volume e quello per spessore lama end - dTol = min( dTol, EMT.VMILLTOL or dTol) -- imposto dTol al valore minore tra quello per volume e quello per spessore lama -- creo lo Zmap local VMillId = EgtVolZmapBox( nPartRawId, b3Raw:getMin(), b3Raw:getDimX(), b3Raw:getDimY(), b3Raw:getDimZ(), dTol, true, GDB_RT.GLOB) if VMillId then EgtSetName( VMillId, 'VMill') EgtSetLevel( VMillId, GDB_LV.TEMP) EgtSetColor( VMillId, EgtGetColor( nSolId), false) - -- nascondo le altre geometrie - local nId = EgtGetFirstInGroup( nPartRawId) - while nId do - if nId ~= VMillId then - EgtSetStatus( nId, GDB_ST.OFF) + if bShowVMill then + -- nascondo le altre geometrie + local nId = EgtGetFirstInGroup( nPartRawId) + while nId do + if nId ~= VMillId then + EgtSetStatus( nId, GDB_ST.OFF) + end + nId = EgtGetNext( nId) end - nId = EgtGetNext( nId) + else + EgtSetStatus( VMillId, GDB_ST.OFF) end table.insert( EMT.VMILL, VMillId) end @@ -345,7 +350,9 @@ function OnSimulDispositionStart() -- gestione eventuale scarto affettato successivo if EMT.VMILL and #EMT.VMILL > 0 then EMT.SCRAP = nScrapRawId - EgtSetStatus( EMT.SCRAP or GDB_ID.NULL, GDB_ST.OFF) + if EgtGetInfo( EgtGetCurrMachGroup(), 'Vm', 'b') then + EgtSetStatus( EMT.SCRAP or GDB_ID.NULL, GDB_ST.OFF) + end else EMT.SCRAP = nil end @@ -502,13 +509,14 @@ function OnSimulToolSelect( dPosA) -- recupero dati utensile EMT.TOOLTYPE = EgtTdbGetCurrToolParam( MCH_TP.TYPE) EMT.TLEN = EgtTdbGetCurrToolParam( MCH_TP.LEN) - EMT.TDIAM = EgtTdbGetCurrToolParam( MCH_TP.DIAM) EMT.TTOTLEN = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) + EMT.TDIAM = EgtTdbGetCurrToolParam( MCH_TP.DIAM) EMT.TUSERNOTES = EgtTdbGetCurrToolParam( MCH_TP.USERNOTES) if bToolIsChanged then -- disabilito la testa EgtSetMode( EgtGetHeadId( EMT.HEAD) or GDB_ID.NULL, GDB_MD.HIDDEN) + -- vado a quota home testa attuale if nSetHead == 1 then SimulMoveAxes( 'X1', EgtGetAxisHomePos( 'X1'), MCH_SIM_STEP.RAPID, 'Z1', EgtGetAxisHomePos( 'Z1'), MCH_SIM_STEP.RAPID, @@ -532,9 +540,9 @@ function OnSimulToolSelect( dPosA) local MyParkCSawC1 = GetChainSawCHomeFromVirtualAxis( dPosA, EMT.TTOTLEN) EmtModifyAxisHome( 'C1', MyParkCSawC1) EgtSetAxisPos( 'C1', MyParkCSawC1) - + end -- se aggregato foratura multipla, imposto subito angolo scelto per asse virtuale A - elseif EMT.HEAD == 'H14' then + if EMT.HEAD == 'H14' then -- valore dell'asse virtuale dPosA = dPosA or GetNextMultiDrillVirtualAxis( EMT.MCHID) -- imposto il valore di A @@ -543,9 +551,9 @@ function OnSimulToolSelect( dPosA) local MyParkCSawC1 = GetMultiDrillCHomeFromVirtualAxis( dPosA, EMT.TTOTLEN) EmtModifyAxisHome( 'C1', MyParkCSawC1) EgtSetAxisPos( 'C1', MyParkCSawC1) - + end -- se lama su aggregato da sotto, imposto subito angolo scelto per asse virtuale A - elseif EMT.HEAD == 'H22' then + if EMT.HEAD == 'H22' then -- se c'era un altro utensile, imposto subito asse virtuale if EMT.PREVHEAD_H2 ~= 'H22' then dPosA = dPosA or GetNextSawingVirtualAxis( EMT.MCHID) @@ -598,97 +606,97 @@ end --------------------------------------------------------------------- function OnSimulToolDeselect( dPrevA) - -- se prossimo utensile non cambia e non è cambiato senso di presa aggregato, esco - if ( EMT.NEXTTOOL == EMT.PREVTOOL_H1 or EMT.NEXTTOOL == EMT.PREVTOOL_H2) and not dPrevA then return end + -- se prossimo utensile non cambia e non è sega a catena o lama su rinvio da sotto, esco + if ( EMT.NEXTTOOL == EMT.PREVTOOL_H1 or EMT.NEXTTOOL == EMT.PREVTOOL_H2) and ( EMT.NEXTHEAD ~= 'H13' or EMT.NEXTHEAD ~= 'H14') and ( EMT.NEXTHEAD ~= 'H22' or not dPrevA) then return end -- deposito utensile EgtOutText( 'Tool change in progress...') -- recupero il gruppo attuale e il successivo local nNextSetHead = GetHeadSet( EMT.NEXTHEAD) local nSetHead = GetHeadSet( EMT.HEAD) - -- per prossima testa gruppo 1 + -- vado a quota home testa attuale if nNextSetHead == 1 then - -- se precedente su testa 3 - if nSetHead == 3 then - SimulMoveAxis( 'X3', ParkX3, MCH_SIM_STEP.RAPID) - else - -- deposito utensile fresa - if EMT.PREVHEAD_H1 == 'H11' then - local nPrevTc = GetTcForTopHeadTool( EMT.PREVTCPOS_H1) - local dPosX = EgtIf( nPrevTc ~= 2, ParkTc1X1, ParkTc2X1) - SimulMoveAxis( 'X1', dPosX, MCH_SIM_STEP.RAPID) - -- deposito utensile lama - elseif EMT.PREVHEAD_H1 == 'H12' then - -- simulo movimento - SimulMoveAxis( 'X1', ParkTc1X1, MCH_SIM_STEP.RAPID) - -- deposito utensile sega a catena - elseif EMT.PREVHEAD_H1 == 'H13' then - SimulMoveAxis( 'X1', ParkCSawX1, MCH_SIM_STEP.RAPID) - -- deposito utensile aggregato foratore multiplo - elseif EMT.PREVHEAD_H1 == 'H14' then - SimulMoveAxis( 'X1', ParkMultiDrillX1, MCH_SIM_STEP.RAPID) - -- deposito utensile seconda lama - elseif EMT.PREVHEAD_H1 == 'H16' then - SimulMoveAxis( 'X1', ParkTc2X1, MCH_SIM_STEP.RAPID) - end - end - -- per prossima testa gruppo 2 + SimulMoveAxes( 'X1', EgtGetAxisHomePos( 'X1'), MCH_SIM_STEP.RAPID, 'Z1', EgtGetAxisHomePos( 'Z1'), MCH_SIM_STEP.RAPID, + 'B1', EgtGetAxisHomePos( 'B1'), MCH_SIM_STEP.COLLROT, 'C1', EgtGetAxisHomePos( 'C1'), MCH_SIM_STEP.COLLROT) elseif nNextSetHead == 2 then - -- deposito lama su aggregato testa sotto - if EMT.PREVHEAD_H2 == 'H22' then - SimulMoveAxis( 'X2', ParkSawX2, MCH_SIM_STEP.RAPID) - else - SimulMoveAxis( 'X2', ParkX2, MCH_SIM_STEP.RAPID) - end - -- per prossima testa gruppo 3 + SimulMoveAxes( 'X2', EgtGetAxisHomePos( 'X2'), MCH_SIM_STEP.RAPID, 'Z2', EgtGetAxisHomePos( 'Z2'), MCH_SIM_STEP.RAPID, + 'B2', EgtGetAxisHomePos( 'B2'), MCH_SIM_STEP.COLLROT, 'C2', EgtGetAxisHomePos( 'C2'), MCH_SIM_STEP.COLLROT) elseif nNextSetHead == 3 then - -- se precedente su testa 1 - if nSetHead == 1 then - -- deposito utensile prelevato da posizioni speciali - if EMT.PREVTCPOS_H1 == 'T101' or EMT.PREVTCPOS_H1 == 'T111' or EMT.PREVTCPOS_H1 == 'T121' then - -- visualizzo utensile su TcPos - ShowToolInTcPos( EMT.PREVTCPOS_H1, true) - -- nascondo l'utensile sulla testa - EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H1 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) - - local sTool, sTcPos, sHead - local vTools = EgtGetToolsInCurrSetupPos( DefTcPos1) - if vTools and vTools[1] then - sTool = vTools[1] - sTcPos = DefTcPos1 - sHead = GetAdjHeadFromTcPos( 1, sTcPos) - -- carico l'utensile - EgtLoadTool( sHead, 1, sTool) - ShowToolInTcPos( DefTcPos1, false) - end - EMT.PREVTOOL_H1 = sTool - EMT.PREVHEAD_H1 = sHead - EMT.PREVTCPOS_H1 = DefTcPos1 - end - SimulMoveAxis( 'X1', ParkX1, MCH_SIM_STEP.RAPID) - end + SimulMoveAxes( 'X3', EgtGetAxisHomePos( 'X3'), MCH_SIM_STEP.RAPID, 'Z3', EgtGetAxisHomePos( 'Z3'), MCH_SIM_STEP.RAPID, + 'B3', EgtGetAxisHomePos( 'B3'), MCH_SIM_STEP.COLLROT, 'C3', EgtGetAxisHomePos( 'C3'), MCH_SIM_STEP.COLLROT) end - -- dopo essere arrivati in posizione di parcheggio testa, si scarica utensile - -- se testa gruppo 1 - if nNextSetHead == 1 and EMT.PREVTCPOS_H1 then - -- breve pausa - EgtPause( 100) - -- visualizzo utensile su TcPos - ShowToolInTcPos( EMT.PREVTCPOS_H1, true) - -- nascondo l'utensile sulla testa - EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H1 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) -- per testa gruppo 2 - elseif nNextSetHead == 2 and EMT.PREVTCPOS_H2 then + if nNextSetHead == 2 then -- breve pausa EgtPause( 100) -- visualizzo utensile su TcPos ShowToolInTcPos( EMT.PREVTCPOS_H2, true) -- nascondo l'utensile sulla testa EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H2 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) + -- se testa gruppo 1 + elseif nNextSetHead == 1 and EMT.PREVTCPOS_H1 then + -- breve pausa + EgtPause( 100) + -- visualizzo utensile su TcPos + ShowToolInTcPos( EMT.PREVTCPOS_H1, true) + -- nascondo l'utensile sulla testa + EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H1 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) + end + -- se passo da testa 1 a 3 scarico aggregato + if nNextSetHead == 3 then + -- deposito utensile prelevato da posizioni speciali + if EMT.PREVTCPOS_H1 == 'T101' or EMT.PREVTCPOS_H1 == 'T111' or EMT.PREVTCPOS_H1 == 'T121' then + -- visualizzo utensile su TcPos + ShowToolInTcPos( EMT.PREVTCPOS_H1, true) + -- nascondo l'utensile sulla testa + EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H1 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) + + local sTool, sTcPos, sHead + local vTools = EgtGetToolsInCurrSetupPos( DefTcPos1) + if vTools and vTools[1] then + sTool = vTools[1] + sTcPos = DefTcPos1 + sHead = GetAdjHeadFromTcPos( 1, sTcPos) + -- carico l'utensile + EgtLoadTool( sHead, 1, sTool) + ShowToolInTcPos( DefTcPos1, false) + end + EMT.PREVTOOL_H1 = sTool + EMT.PREVHEAD_H1 = sHead + EMT.PREVTCPOS_H1 = DefTcPos1 + end + end + -- movimento per prendere nuovo utensile + -- prendo utensile fresa + if EMT.NEXTHEAD == 'H11' then + -- simulo movimento + -- prendo utensile lama + elseif EMT.NEXTHEAD == 'H12' then + -- simulo movimento + -- prendo utensile sega a catena + elseif EMT.NEXTHEAD == 'H13' then + -- simulo movimento + -- prendo aggregato multi drill + elseif EMT.NEXTHEAD == 'H14' then + -- simulo movimento + -- prendo utensile seconda lama + elseif EMT.NEXTHEAD == 'H16' then + -- simulo movimento + -- prendo utensile su CU margherita testa sotto + elseif EMT.NEXTHEAD == 'H21' then + -- simulo movimento + -- prendo utensile lama su aggregato + elseif EMT.NEXTHEAD == 'H22' then + -- aggiungo utensile per verifica collisione + local nInd = 1000 + tonumber( string.sub( EMT.NEXTHEAD, 2)) + AddToolToCollisionObj( EMT.NEXTTOOL, EMT.NEXTHEAD, EMT.NEXTEXIT, nInd, false) + AddToolHolderToCollisionObj( EMT.NEXTTOOL, EMT.NEXTHEAD, EMT.NEXTEXIT, nInd + 100) + -- simulo movimento end end + --------------------------------------------------------------------- function OnSimulMachiningStart() EgtOutLog( '===> Start Machining : ' .. EgtGetName( EMT.MCHID), 4) @@ -788,13 +796,13 @@ function OnSimulMachiningStart() local nPrevExit_H1 = 1 local nInd_H1 = 1000 + tonumber( string.sub( EMT.PREVHEAD_H1, 2)) AddToolToCollisionObj( EMT.PREVTOOL_H1, EMT.PREVHEAD_H1, nPrevExit_H1, nInd_H1, true) - AddToolHolderToCollisionObj( EMT.PREVTOOL_H1, EMT.PREVHEAD_H1, nPrevExit_H1, nInd_H1 + 1) + AddToolHolderToCollisionObj( EMT.PREVTOOL_H1, EMT.PREVHEAD_H1, nPrevExit_H1, nInd_H1 + 100) end if nSetHead ~= 2 and ( EMT.PREVTOOL_H2 and EMT.PREVHEAD_H2) then local nPrevExit_H2 = 1 local nInd_H2 = 1000 + tonumber( string.sub( EMT.PREVHEAD_H2, 2)) AddToolToCollisionObj( EMT.PREVTOOL_H2, EMT.PREVHEAD_H2, nPrevExit_H2, nInd_H2, true) - AddToolHolderToCollisionObj( EMT.PREVTOOL_H2, EMT.PREVHEAD_H2, nPrevExit_H2, nInd_H2 + 1) + AddToolHolderToCollisionObj( EMT.PREVTOOL_H2, EMT.PREVHEAD_H2, nPrevExit_H2, nInd_H2 + 100) end if nSetHead ~= 3 and IsHeadExisting( 3) then local sHeadName @@ -811,8 +819,6 @@ function OnSimulMachiningStart() AddToolHolderToCollisionObj( nil, sHeadName, nPrevExit_H3, nInd_H3 + 100) end end - -- non ancora iniziata la lavorazione - EMT.MCHFIRST = true end --------------------------------------------------------------------- @@ -830,6 +836,10 @@ function OnSimulMachiningEnd() -- salvo dati utensile local nSetHead = GetHeadSet( EMT.HEAD) + EMT.PREVTOOL = EMT.TOOL + EMT.PREVHEAD = EMT.HEAD + EMT.PREVTCPOS = EMT.TCPOS + -- per gruppo testa 1 if nSetHead == 1 then EMT.PREVTOOL_H1 = EMT.TOOL @@ -876,7 +886,7 @@ function OnSimulPathStart() EgtOutLog( 'PreCutDeltaLT='..EgtNumToString( EMT.DELTA_LT, 3), 5) end - + -- si salvano gli approcci e retrazioni della lavorazione EMT.APPROACH = {} EMT.APPROACH.CLIMBS = EmtGetClimbs( EMT.PATHID) @@ -895,13 +905,12 @@ function OnSimulPathEnd() -- rimozione sfridi ExecRemoveScraps() -- se non ci sono comandi ausiliari associati e richiesta risalita a Zmax - if EMT.AUXTOT == 0 and EMT.TO_ZMAX then + if EMT.AUXTOT == 0 then if EMT.MCHSPLIT and not EMT.TO_FALL then EMT.SPLIT_Y1DELTA = EMT.Y1DELTA EMT.Y1DELTA = nil ExecMovePY1( false) end - EMT.TO_ZMAX = nil end end @@ -921,14 +930,28 @@ end function OnSimulPathEndAux() -- eseguo il comando ExecAuxCmd( EMT.AUX, false) - -- se ultimo comando e richiesta risalita a Zmax - if EMT.AUXIND == EMT.AUXTOT and EMT.TO_ZMAX then - EMT.TO_ZMAX = nil - end end --------------------------------------------------------------------- function OnSimulMoveStart() + + -- tipo di movimento + local bFirstClimb = EgtGetInfo( EMT.MOVEID, 'FirstClimb', 'b') + local bLastClimb = EgtGetInfo( EMT.MOVEID, 'LastClimb', 'b') + local bFirstRise = EgtGetInfo( EMT.MOVEID, 'FirstRise', 'b') + local bLastRise = EgtGetInfo( EMT.MOVEID, 'LastRise', 'b') + local bUniqueClimb = EgtGetInfo( EMT.MOVEID, 'UniqueClimb', 'b') + local bUniqueRise = EgtGetInfo( EMT.MOVEID, 'UniqueRise', 'b') + -- se il link non arriva dalla OnSpecial, non ha nessuna nota + local bStdClimb = ( EMT.FLAG2 ~= 2 and EMT.FLAG == 2) + local bStdRise = ( EMT.FLAG2 ~= 2 and EMT.FLAG == 3) + local bStdMachRapid = ( EMT.FLAG2 == 0 and ( EMT.FLAG == 0 or EMT.FLAG == 1)) + local sHeadToMoveFirst = EgtGetInfo( EMT.MOVEID, 'HeadToMoveFirst', 's') + + -- se primo rapido della lavorazione è un movimento standard, allora questo è l'ultimo climb + if bStdMachRapid and EMT.MCHFIRST then + bStdClimb = true + end if EMT.MCHFIRST then EgtOutText( '') end -- recupero eventuali flag da Info del movimento local bSplit = EgtGetInfo( EMT.MOVEID, 'Split', 'b') @@ -984,7 +1007,7 @@ function OnSimulMoveStart() EMT.A4 = EgtIf( GetV2ToClose(), EMT.V2NEXTPOS, ParkV2) local bParkV = false -- verifica se serve aprire i carrelli - local bCondBase = EMT.MCHFIRST or EMT.MOVE == 0 + local bCondBase = ( EMT.MCHFIRST or EMT.MOVE == 0) local bCondPosition = V1Pos < EMT.V1NEXTPOS - 1 or V2Pos > EMT.V2NEXTPOS + 1 or RollerParkingNeeded( EMT.HEAD, EMT.R1p, EMT.R2p, EMT.R1, EMT.R2) @@ -993,7 +1016,8 @@ function OnSimulMoveStart() bParkV = true end - local bNlhParkV = ( EMT.MOVE == 0 and (EMT.FLAG2 == 1 or EMT.FLAG2 == 2)) + -- nei movimenti con new link si tengono paratie aperte fino a che non arriva uno split + local bNlhParkV = ( EMT.MOVE == 0 and ( EMT.FLAG2 == 1 or EMT.FLAG2 == 2)) if bNlhParkV then bParkV = ( EMT.FLAG == 2 and bParkV) or ( not EMT.MCHSPLIT or bSplit) end @@ -1009,11 +1033,16 @@ function OnSimulMoveStart() VerifyV1Stroke( EMT.A3) VerifyV2Stroke( EMT.A4) + + -- se devo subito parcheggiare i rulli local nRes = 0 - if bParkV then - local bMchSplit = ( bNlhParkV and EMT.MCHSPLIT and bSplit) - local bAgg = EgtExistsInfo( EMT.PATHID, 'CNT') + if bParkV or bNlhParkV then + local bMchSplit = ( bNlhParkV and EMT.MCHSPLIT and bSplit) + local bAgg = EgtExistsInfo( EMT.PATHID, 'CNT') + -- se la lavorazione è un taglio di separazione, se necessario, ripristino posizione di Y1DELTA prima di aprire i rulli + if EMT.SPLIT_Y1DELTA and not EMT.MCHSPLIT then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end nRes = ExecParkRoller( Y1Pos, Y2Pos, V1Pos, V2Pos, bMchSplit, bAgg) + if EMT.SPLIT_Y1DELTA then EMT.Y1DELTA = nil end end -- se lavorazione split, muovo per riaggancio del carro Y1 @@ -1021,13 +1050,14 @@ function OnSimulMoveStart() EMT.Y1DELTA = EMT.SPLIT_Y1DELTA EMT.A1 = EMT.L1 + EMT.Y1DELTA end + -- se lavorazione in doppio if EMT.DOU_TYPE then - if EgtGetInfo( EMT.MOVEID, 'FirstClimb', 'b') or EgtGetInfo( EMT.MOVEID, 'UniqueClimb', 'b') then + if bFirstClimb or bUniqueClimb or bStdClimb then EMT.IS_CLIMB = true EMT.IS_RISE = false EMT.INDEX_APPROACH_MOVE = 0 - elseif EgtGetInfo( EMT.MOVEID, 'FirstRise', 'b') or EgtGetInfo( EMT.MOVEID, 'UniqueRise', 'b') then + elseif bFirstRise or bUniqueRise or bStdRise then EMT.IS_CLIMB = false EMT.IS_RISE = true EMT.INDEX_APPROACH_MOVE = 0 @@ -1049,6 +1079,7 @@ function OnSimulMoveStart() -- controllo collisione tra utensili in doppio -- doppio in orizzontale if EMT.DOU_TYPE == 2 then + EMT.A6m = 'Z1' -- controllo minima distanza tra utensili di X1 e X2 local dDeltaX1X2 = EMT.L2 - EMT.A5 - Head2Y local dDistToolX1X2 = -dDeltaX1X2 - MillOffs - EMT.TTOTLEN - Mill2Offs - EMT.DOU_TTOTLEN @@ -1060,6 +1091,7 @@ function OnSimulMoveStart() end -- doppio verticale else + EMT.A5m = 'X1' -- controllo minima distanza tra utensili di X1 e X2 (lungo Z) local dDeltaZ1Z2 = EMT.L3 - EMT.A6 - Head2Z local dDistToolZ1Z2 = dDeltaZ1Z2 - EMT.TTOTLEN - EMT.DOU_TTOTLEN @@ -1073,26 +1105,41 @@ function OnSimulMoveStart() -- movimento di approccio o retrazione else - -- incremento indice approccio - EMT.INDEX_APPROACH_MOVE = EMT.INDEX_APPROACH_MOVE + 1 - -- se non esiste movimento sulla testa due, significa che gli approcci della testa 1 sono in maggior numero - if ( EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE] and EMT.IS_CLIMB) or ( EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE] and EMT.IS_RISE) then - EMT.AuxAxes = 4 + 4 - EMT.A5n = 'X2' - EMT.A6n = 'Z2' - EMT.A7n = 'C2' - EMT.A8n = 'B2' - - if EMT.IS_CLIMB then + local bFirstMoveOnlyH1 = sHeadToMoveFirst and sHeadToMoveFirst == 'H1' + local bFirstMoveOnlyH2 = sHeadToMoveFirst and sHeadToMoveFirst == 'H2' + -- se bisogna muovere prima la testa 2, si esegue subito il primo movimento della testa, priam di muovere la testa 1 + if bFirstMoveOnlyH2 then + if #EMT.APPROACH.DBLCLIMBS > 0 then + EMT.INDEX_APPROACH_MOVE = EMT.INDEX_APPROACH_MOVE + 1 EMT.A5 = EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE].L2 EMT.A6 = EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE].L3 EMT.A7 = EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE].R1 EMT.A8 = EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE].R2 - elseif EMT.IS_RISE then - EMT.A5 = EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE].L2 - EMT.A6 = EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE].L3 - EMT.A7 = EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE].R1 - EMT.A8 = EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE].R2 + SimulMoveAxes( 'X2', EMT.A5, MCH_SIM_STEP.RAPID, 'Z2', EMT.A6, MCH_SIM_STEP.RAPID, 'C2', EMT.A7, MCH_SIM_STEP.COLLROT, 'B2', EMT.A8, MCH_SIM_STEP.COLLROT) + end + -- se bisogna muovere prima la testa 1, il movimento della testa 2 non si esegue adesso + elseif not bFirstMoveOnlyH1 then + -- incremento indice approccio + EMT.INDEX_APPROACH_MOVE = EMT.INDEX_APPROACH_MOVE + 1 + -- se non esiste movimento sulla testa due, significa che gli approcci della testa 1 sono in maggior numero + if ( EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE] and EMT.IS_CLIMB) or ( EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE] and EMT.IS_RISE) then + EMT.AuxAxes = 4 + 4 + EMT.A5n = 'X2' + EMT.A6n = 'Z2' + EMT.A7n = 'C2' + EMT.A8n = 'B2' + + if EMT.IS_CLIMB then + EMT.A5 = EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE].L2 + EMT.A6 = EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE].L3 + EMT.A7 = EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE].R1 + EMT.A8 = EMT.APPROACH.DBLCLIMBS[EMT.INDEX_APPROACH_MOVE].R2 + elseif EMT.IS_RISE then + EMT.A5 = EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE].L2 + EMT.A6 = EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE].L3 + EMT.A7 = EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE].R1 + EMT.A8 = EMT.APPROACH.DBLRISES[EMT.INDEX_APPROACH_MOVE].R2 + end end end end @@ -1121,7 +1168,7 @@ function OnSimulMoveStart() 'Z2', EMT.L3, MCH_SIM_STEP.RAPID, 'C2', EMT.R1, MCH_SIM_STEP.COLLROT, 'B2', EMT.R2, MCH_SIM_STEP.COLLROT) - elseif bParkV and not bNlhParkV then + else SimulMoveAxes( 'X3', EMT.L2, MCH_SIM_STEP.RAPID, 'Z3', EMT.L3, MCH_SIM_STEP.RAPID, 'C3', EMT.R1, MCH_SIM_STEP.COLLROT, @@ -1131,7 +1178,7 @@ function OnSimulMoveStart() if EMT.DOU_TYPE then -- se testa 2 ha più movimenti della testa 1, eseguo tutti i movimenti della testa due che mancano - if EgtGetInfo( EMT.MOVEID, 'LastClimb', 'b') or EgtGetInfo( EMT.MOVEID, 'UniqueClimb', 'b') then + if bLastClimb or bUniqueClimb or bStdClimb then if #EMT.APPROACH.DBLCLIMBS > #EMT.APPROACH.CLIMBS then while EMT.INDEX_APPROACH_MOVE < #EMT.APPROACH.DBLCLIMBS do EMT.INDEX_APPROACH_MOVE = EMT.INDEX_APPROACH_MOVE + 1 @@ -1142,7 +1189,7 @@ function OnSimulMoveStart() SimulMoveAxes( 'X2', EMT.A5, MCH_SIM_STEP.RAPID, 'Z2', EMT.A6, MCH_SIM_STEP.RAPID, 'C2', EMT.A7, MCH_SIM_STEP.COLLROT, 'B2', EMT.A8, MCH_SIM_STEP.COLLROT) end end - elseif EgtGetInfo( EMT.MOVEID, 'LastRise', 'b') or EgtGetInfo( EMT.MOVEID, 'UniqueRise', 'b') then + elseif bLastRise or bUniqueRise or bStdRise then if #EMT.APPROACH.DBLRISES > #EMT.APPROACH.RISES then while EMT.INDEX_APPROACH_MOVE < #EMT.APPROACH.DBLRISES do EMT.INDEX_APPROACH_MOVE = EMT.INDEX_APPROACH_MOVE + 1 @@ -1160,8 +1207,7 @@ function OnSimulMoveStart() EMT.A3 = EgtIf( GetV1ToClose(), EMT.V1NEXTPOS, ParkV1) EMT.A4 = EgtIf( GetV2ToClose(), EMT.V2NEXTPOS, ParkV2) end - EMT.ZMAX = nil - EMT.TO_ZMAX = nil + -- se aggregato flottante su inizio attacco va compresso if EMT.TFLOAT and not EMT.TFLOAT_CMP and EMT.MOVE == 1 and EgtGetName( EMT.MOVEID) == 'LI' then -- recupero lunghezza @@ -1173,6 +1219,13 @@ function OnSimulMoveStart() -- dichiaro che è compresso (assegnando Id entità di movimento) EMT.TFLOAT_CMP = EMT.MOVEID end + + -- reset movimenti + if EMT.IS_CLIMB and EMT.APPROACH.DBLCLIMBS and #EMT.APPROACH.DBLCLIMBS == EMT.INDEX_APPROACH_MOVE then + EMT.APPROACH.DBLCLIMBS = {} + elseif EMT.IS_RISE and EMT.APPROACH.DBLRISES and #EMT.APPROACH.DBLRISES == EMT.INDEX_APPROACH_MOVE then + EMT.APPROACH.DBLRISES = {} + end end --------------------------------------------------------------------- @@ -1232,7 +1285,8 @@ function OnSimulCollision() -- se prima collisione della lavorazione, la segnalo if EMT.MCHNAME ~= EMT.LAST_MCHNAME_COLLIDE then -- speciale per utensile flottante (suo holder contro il grezzo) - if EMT.TFLOAT and EMT.TFLOAT_CMP and EMT.SIMCOBIND == 1002 and EMT.SIMVMID == EMT.VMILL[1] then + local nIndexToCheck = 1000 + tonumber( string.sub( EMT.HEAD, 2)) + 100 + if EMT.TFLOAT and EMT.TFLOAT_CMP and EMT.SIMCOBIND == nIndexToCheck and EMT.SIMVMID == EMT.VMILL[1] then if EMT.MOVEID == EMT.TFLOAT_CMP then EMT.TFLOAT_TH_COMPR_COLL = true end @@ -1408,20 +1462,7 @@ end --------------------------------------------------------------------- function ExecMoveHome( bNearV, bMchSplit) - -- risalita a Zmax - -- se testa sotto e macchina a 3 teste e gruppo truciolatore a 4 assi - if GetHeadSet( EMT.HEAD) == 2 and IsHeadExisting( 3) then - if not SimulMoveAxis( 'X2', EgtIf( EMT.HEAD == 'H22', SafeX2, ParkX2), MCH_SIM_STEP.RAPID) then - EgtOutLog( 'Error on MoveHome : X2') - end - -- se gruppo truciolatore a 4 assi - if EgtGetHeadId( 'H39') then - if not SimulMoveAxis( 'Z2', ParkInLavZ2, MCH_SIM_STEP.RAPID) then - EgtOutLog( 'Error on MoveHome : Z2') - end - end - end - EMT.TO_ZMAX = nil + -- se richiesto, avvicino i rulli if bNearV then ExecOpenRoller( 1) @@ -1437,6 +1478,8 @@ end function ExecUnloading() if EMT.VMILL and #EMT.VMILL > 0 then local vMillId = EMT.VMILL[1] + -- grezzo di appartenenza + local nPartRawId = EgtGetParent( vMillId) -- gruppo dei Vmill local nVmGrpId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill') local sUnloadType = '' @@ -1468,9 +1511,9 @@ function ExecUnloading() -- creo un nuovo layer e vi inserisco il nuovo pezzo local nLayId = EgtGroup( nVmGrpId, EgtGetGlobFrame( vMillId)) EgtRelocate( vMillId, nLayId) - local vtMove = Vector3d( 0, EgtIf( BD.RIGHT_LOAD, 1900, -1900), 0) - if EMT.FALL then vtMove = Vector3d( 0, EgtIf( BD.RIGHT_LOAD, 3200, -2600), -1150) end + EgtSetInfo( nLayId, 'UNLOAD_TYPE', sUnloadType) EgtMove( nLayId, vtMove, GDB_RT.GLOB) + EgtSetStatus( vMillId, GDB_ST.ON) EgtSetLevel( vMillId, GDB_LV.USER) -- aggiungo gli spigoli if EgtVolZmapSetShowEdges then @@ -1489,6 +1532,12 @@ function ExecUnloading() EgtDraw() -- se finito if EMT.PHASE == EgtGetPhaseCount() then + -- in ogni caso, nascondo ultimo pezzo + local nId = EgtGetFirstInGroup( nPartRawId) + while nId do + EgtSetStatus( nId, GDB_ST.OFF) + nId = EgtGetNext( nId) + end -- se impostato di salvare i Vmill, lo faccio local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini' if EgtGetStringFromIni( 'VMill', 'Save', '', sMachIni) == '1' then @@ -1657,7 +1706,7 @@ end --------------------------------------------------------------------- function ExecMovePY2( bClose) - SimulMoveAxes( 'PY2', EgtIf( not bClose, MaxHoOpen, EMT.HB), MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'PY2', EgtIf( not bClose, MaxHoOpen, EMT.HB), MCH_SIM_STEP.RAPID) SetPY2Light( bClose) if bClose then CheckClamping( 'PY2') @@ -1690,30 +1739,45 @@ function ExecParkRoller( PosY1, PosY2, PosV1, PosV2, bSpliCut, bAgg) PosY2 = PosY2 or EgtGetAxisPos( 'Y2') PosV1 = PosV1 or EgtGetAxisPos( 'V1') PosV2 = PosV2 or EgtGetAxisPos( 'V2') + -- se entrambe già parcheggiate, non devo fare alcunché + if ( PosV1 - ParkV1) > -0.1 and ( PosV2 - ParkV2) < 0.1 then return end -- Parcheggi pinze local MyParkY1 = ParkY1 + EgtIf( bAgg, AggLoad, 0) local MyParkY2 = ParkY2 -- Apro i rulli, se necessario if abs( ParkV1 - PosV1) > 0.1 then ExecOpenRoller( 1) end -- Se pezzo a caduta con rulliera V2 attiva (pinza 3), aspetta ad aprire la rulliera - if abs( ParkV2 - PosV2) > 0.1 and ( not bSpliCut and not EMT.TO_FALL) then ExecOpenRoller( 2) end + local bWaitRollerOpeningV2 = false + if abs( ParkV2 - PosV2) > 0.1 and ( not bSpliCut and not EMT.TO_FALL) then + ExecOpenRoller( 2) + bWaitRollerOpeningV2 = true + end -- Eseguo spostamenti if EMT.Y1DELTA and EMT.Y2DELTA then local DiffY1 = MyParkY1 - PosY1 local DiffY2 = MyParkY2 - PosY2 -- se appena eseguito taglio di separazione if bSpliCut then + local dAddMoveY1 = ParkV1 + ( -PosT - EMT.LR) + local dAddMoveY2 = ParkV2 + ( -PosT - EMT.LR) + local MoveY1 = max( DiffY1, dAddMoveY1, 30.0) + local MoveY2 = min( DiffY2, dAddMoveY2, -30.0) + -- aggancio i pezzi rimanenti all'asse Y1 LinkRemainingPartsToY1() -- eseguo i movimenti - if not SimulMoveAxes( 'T', PosT + min( DiffY2, 0.0), MCH_SIM_STEP.RAPID, + if not SimulMoveAxes( 'T', PosT + MoveY2, MCH_SIM_STEP.RAPID, 'V1', ParkV1, MCH_SIM_STEP.RAPID, 'V2', ParkV2, MCH_SIM_STEP.RAPID, - 'Y1', PosY1 + max( DiffY1, 0.0), MCH_SIM_STEP.RAPID, - 'Y2', PosY2 + min( DiffY2, 0.0), MCH_SIM_STEP.RAPID) then + 'Y1', PosY1 + MoveY1, MCH_SIM_STEP.RAPID, + 'Y2', PosY2 + MoveY2, MCH_SIM_STEP.RAPID) then EMT.ERR = 2 EmtSetLastError( 1202, 'Error on MoveAxes in ParkRoller (12A)') end + -- Se ha aspettato ad aprire la rulliera su pezzo a caduta con rulliera V2 attiva (pinza 3), apre adesso la rulliera dopo il posizionamento dei V2 + if bWaitRollerOpeningV2 then + ExecOpenRoller( 2) + end EMT.Y1DELTA = nil EMT.Y1SPEC = true return 32 @@ -1752,7 +1816,7 @@ function ExecParkRoller( PosY1, PosY2, PosV1, PosV2, bSpliCut, bAgg) local MoveV1 = ParkV1 - PosV1 local DiffY1 = MyParkY1 - PosY1 local MoveY1 = EgtIf( DiffY1 > 0.1, MoveV1, 0) - local TryMoveY1 = min( ParkV1 - PosT - EgtIf( bSpliCut or EMT.FALL, EMT.LT, 0), MaxY1 - PosY1 - 10) + local TryMoveY1 = min( ParkV1 - PosT - EgtIf( bSpliCut or EMT.FALL, EMT.LT, 0) - EMT.HOVM, MaxY1 - PosY1 - 10) if ( PosT > ParkV2 - ExtraParkV and PosT < ParkV1 and PosY1 + TryMoveY1 < MaxY1) then MoveY1 = max( MoveY1, TryMoveY1) end -- se appena eseguito taglio di separazione if bSpliCut then @@ -1767,8 +1831,10 @@ function ExecParkRoller( PosY1, PosY2, PosV1, PosV2, bSpliCut, bAgg) EMT.ERR = 2 EmtSetLastError( 1205, 'Error on MoveAxes in ParkRoller (1)') end - -- Se pezzo a caduta con rulliera V2 attiva (pinza 3), apre la rulliera dopo il posizionamento dei V2 - if abs( ParkV2 - PosV2) > 0.1 and ( bSpliCut and EMT.TO_FALL) then ExecOpenRoller( 2) end + -- Se ha aspettato ad aprire la rulliera su pezzo a caduta con rulliera V2 attiva (pinza 3), apre adesso la rulliera dopo il posizionamento dei V2 + if bWaitRollerOpeningV2 then + ExecOpenRoller( 2) + end else if not SimulMoveAxes( 'T', PosT + MoveY1, MCH_SIM_STEP.RAPID, 'V1', ParkV1, MCH_SIM_STEP.RAPID, @@ -2104,9 +2170,9 @@ end --------------------------------------------------------------------- function IsNewLinkHead( sHead) - return ( sHead == 'H11' or sHead == 'H12' or sHead == 'H13' or sHead == 'H14' or sHead == 'H16' or - sHead == 'H21' or sHead == 'H22' or - sHead == 'H38' or sHead == 'H39') + return ( sHead == 'H11' or sHead == 'H12' or sHead == 'H13' or sHead == 'H14' or sHead == 'H16') or + ( sHead == 'H21' or sHead == 'H22') or + ( sHead == 'H38') end --------------------------------------------------------------------- @@ -2419,10 +2485,13 @@ function OnEstimRapid() -- calcolo tempo local dTime = RAPID_MIN_T + --local dT1 = abs( dL1) / RAPID_X_FEED * 60 local dT1 = CalcMoveTime( abs( dL1), RAPID_X_FEED, EMT.SPLIT) if dT1 > dTime then dTime = dT1 end + --local dT2 = abs( dL2) / RAPID_Y_FEED * 60 local dT2 = CalcMoveTime( abs( dL2), EMT.FMAXPINZE, EMT.SPLIT) if dT2 > dTime then dTime = dT2 end + --local dT3 = abs( dL3) / RAPID_Z_FEED * 60 local dT3 = CalcMoveTime( abs( dL3), RAPID_Z_FEED, EMT.SPLIT) if dT3 > dTime then dTime = dT3 end local dT4 = abs( dR1) / RAPID_C_FEED * 60 @@ -2447,6 +2516,7 @@ function OnEstimLinear() local dLen = sqrt( dL1 * dL1 + dL2 * dL2 + dL3 * dL3) EMT.MCHCUTLEN = EMT.MCHCUTLEN + dLen -- calcolo tempo + --local dTime = dLen / EMT.F * 60 local dTime = CalcMoveTime( dLen, EMT.F, EMT.SPLIT) EMT.MCHCUTTIME = EMT.MCHCUTTIME + dTime EgtOutLog( string.format( ' G1 Len=%.0f Time=%.2f', dLen, dTime), 5) diff --git a/Common_PF1250.mlse b/Common_PF1250.mlse index c0775c0..d998cce 100644 --- a/Common_PF1250.mlse +++ b/Common_PF1250.mlse @@ -7,6 +7,9 @@ EgtEnableDebug( false) -- Carico libreria local BD = require( 'BeamData') +-- sicurezza aggiuntiva +local SAFE_DIST = 50 + --------------------------------------------------------------------- -- *** Generic Machinings *** --------------------------------------------------------------------- @@ -47,6 +50,7 @@ function OnSpecialGetPrevMachiningOffset() -- default EMC.ERR = 0 EMC.PREVOFFSX = 0 + -- se c'è cambio di fase tra le lavorazioni (quindi la precedente è l'ultima della sua fase e la corrente la prima) if EMC.PREVPHASE ~= EMC.CURRPHASE then -- se la fase corrente è di inizio lavorazione di nuova trave @@ -69,19 +73,6 @@ end --------------------------------------------------------------------- -- *** Special Link moves *** --------------------------------------------------------------------- ------------------------------------------------------------------------------------------ -local function IsPrevSplit() - local sPrevUserNotes = '' - if EMC.LINKTYPE == 2 then - sPrevUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) - elseif EMC.LINKTYPE == 3 then - EgtSetCurrMachining( EMC.PREVMCHID) - sPrevUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) - EgtSetCurrMachining( EMC.NEXTMCHID) - end - return ( sPrevUserNotes:find( 'Split;', 1, true) ~= nil) -end - ----------------------------------------------------------------------------------------- local function GetActiveRawBBox() local b3Raw = BBox3d() @@ -97,23 +88,79 @@ local function GetActiveRawBBox() end ----------------------------------------------------------------------------------------- -local function IsLinkSafety( vtFinal, vtInit) +local function IsPrevSplit() + local sPrevUserNotes = '' + if EMC.LINKTYPE == 2 then + sPrevUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) + elseif EMC.LINKTYPE == 3 then + EgtSetCurrMachining( EMC.PREVMCHID) + sPrevUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) + EgtSetCurrMachining( EMC.NEXTMCHID) + end + return ( sPrevUserNotes:find( 'Split;', 1, true) ~= nil) +end + +----------------------------------------------------------------------------------------- +local function IsMachDoubleHoriz( bOther, nMchIdOther) + local sPrevUserNotes = '' + if bOther then + local nCurrMchId = EgtGetCurrMachining() + EgtSetCurrMachining( nMchIdOther) + sPrevUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) + EgtSetCurrMachining( nCurrMchId) + else + sPrevUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) + end + return EgtGetValInNotes( sPrevUserNotes, 'DOUBLE', 'i') == 2 +end + +----------------------------------------------------------------------------------------- +local function GetHeadDeltaYApproachOnDouble( bPrev) + local dDeltaY = false + -- recupero ingombro del primo grezzo in lavoro + local b3Raw = GetActiveRawBBox() + local dMinRawX2 = b3Raw:getMin():getY() - Head2Y + local dMaxRawX2 = b3Raw:getMax():getY() - Head2Y + local vtToolDir = EgtGetCalcToolDirFromAngles( EgtIf( bPrev, EMC.R1p, EMC.R1), EgtIf( bPrev, EMC.R2p, EMC.R2)) + local dCurrY = EgtIf( bPrev, EMC.L2p, EMC.L2) + local dToolTipY = dCurrY - ( ( EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) + Mill2Offs) * vtToolDir:getY()) + -- se la punta dell'utensile si trova all'interno del pezzo + if dToolTipY > dMinRawX2 and dToolTipY < dMaxRawX2 then + if vtToolDir:getY() > 0 then + dDeltaY = dMaxRawX2 - dToolTipY + SAFE_DIST + else + dDeltaY = dMinRawX2 - dToolTipY - SAFE_DIST + end + end + return dDeltaY +end + +----------------------------------------------------------------------------------------- +local function IsLinkSafe( vPrec, vNext) local bSafeMove = true - local DirectionsToTest = { {vtInit[3],vtInit[4], vtInit[5]}, {vtFinal[3],vtFinal[4], vtFinal[5]}} + local DirectionsToTest = { { Z=vPrec[3], C=vPrec[4], B=vPrec[5]}, { Z=vNext[3], C=vNext[4], B=vNext[5]}} -- aggiungo anche il punto medio - table.insert( DirectionsToTest, {(vtInit[3]+vtFinal[3])/2,(vtInit[4]+vtFinal[4])/2,(vtInit[5]+vtFinal[5])/2}) + table.insert( DirectionsToTest, { Z=( vNext[3] + vPrec[3]) / 2, C=( vNext[4] + vPrec[4]) / 2, B=( vNext[5] + vPrec[5]) / 2}) for t=1, #DirectionsToTest do - local vtToolDir = EgtGetCalcToolDirFromAngles( DirectionsToTest[t][2], DirectionsToTest[t][3]) + local vtToolDir = EgtGetCalcToolDirFromAngles( DirectionsToTest[t].C, DirectionsToTest[t].B) + -- se testa standard + if EMC.HEAD == 'H11' then + -- TODO considerare caso sotto la traversa + -- se sotto la traversa + if vtToolDir:getX() > -0.1 then + bSafeMove = true + end -- se lama su aggregato - if EMC.HEAD == 'H12' then + elseif EMC.HEAD == 'H12' then + -- se sotto la traversa if vtToolDir:getX() < 0.342 then local dLen = SawOffsZ - MillOffs local dToolRadius = 275 -- leggere dall'utensile!! - local dDeltaMaxZ = dToolRadius - ( dToolRadius * sin( DirectionsToTest[t][3]) + dLen * cos( DirectionsToTest[t][3])) - local dMaxZ = ParkZ1 + dDeltaMaxZ - if dMaxZ < DirectionsToTest[t][1] then + local dNewOffZ = ( dLen * cos( DirectionsToTest[t].B) + dToolRadius * abs( sin( DirectionsToTest[t].B))) - dToolRadius + local dMaxZ = ParkZ1 - dNewOffZ + if dMaxZ < DirectionsToTest[t].Z then bSafeMove = false break end @@ -131,10 +178,18 @@ function OnSpecialLink() if EMC.HEAD == 'H11' then -- se inizio lavorazione con prelievo utensile if EMC.LINKTYPE == 1 then + -- se lavorazione in doppio e altra ha collegamento diretto, si muove prima l'altra + local sHeadToMoveFirst = '' + if EMC.OTHERLINKTYPE == 3 then + sHeadToMoveFirst = 'HeadToMoveFirst=H2;' + end -- approccio EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;') - if abs( EMC.R1 - EMC.R1p) > 1 or abs( EMC.R2 - EMC.R2p) > 1 then + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;'..sHeadToMoveFirst) + -- se asse B resta girato verso home e C resta vicino alla home + if abs( EMC.R2 - EMC.R2p) < 90 and abs( EMC.R1 - EMC.R1p) < 5 then + ; -- discesa diretta + elseif abs( EMC.R1 - EMC.R1p) > 1 or abs( EMC.R2 - EMC.R2p) > 1 then EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, 0}, 30, 2, 2) if abs( EMC.R1 - EMC.R1p) > 1 then EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, 0}, 30, 2, 2) @@ -159,10 +214,17 @@ function OnSpecialLink() -- altrimenti collegamento tra due lavorazioni (3) else -- recupero quota massima di collegamento - local vLFiAx = EmtGetFinalAxesPos( EMC.PREVMCHID, EMC.PREVMAIN, false) - local vLInAx = EmtGetInitialAxesPos( EMC.NEXTMCHID, EMC.NEXTMAIN, false) + local vFinalAxLink = EmtGetFinalAxesPos( EMC.PREVMCHID, EMC.PREVMAIN, false) + local vInitAxLink = EmtGetInitialAxesPos( EMC.NEXTMCHID, EMC.NEXTMAIN, false) + local bSafeMove = IsLinkSafe( vFinalAxLink, vInitAxLink) + + -- se gli assi rotanti non sono cambiati e il collegamento è come ultimo punto della lavorazione + if abs( EMC.R1 - EMC.R1p) < 1 and abs( EMC.R2 - EMC.R2p) < 1 and abs( EMC.L3p - vFinalAxLink[3]) < 1 and abs( EMC.L3 - vInitAxLink[3]) < 1 then + bSafeMove = true + end + -- se superata quota massima ammessa - if max( vLFiAx[3], vLInAx[3]) > ParkZ1 + 1 then + if not bSafeMove then -- retrazione EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1, EMC.R1p, 0}, 30, 3, 2, 'UniqueRise=1;') @@ -170,6 +232,18 @@ function OnSpecialLink() EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, MaxZ1, EMC.R1, 0}, 30, 2, 2, 'FirstClimb=1;') EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') + else + -- GESTIONE PER DOPPIO + -- se altra testa arriva da home o diretta, devo per forza avere un CLIMB, creo il punto + if EMC.OTHERLINKTYPE == 1 then + EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, vInitAxLink, 30, 2, 2, 'FirstClimb=1;HeadToMoveFirst=H1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') + -- se altra testa deve andare in home, devo per forza avere un RISE, creo il punto + elseif EMC.OTHERLINKTYPE == 2 then + EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, vFinalAxLink, 30, 3, 2, 'UniqueRise=1;') + end end end @@ -182,65 +256,71 @@ function OnSpecialLink() if EMC.LINKTYPE == 1 then -- approccio EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) - - -- se solo in zmax - if EMC.STARTZMAX > 0 then - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, 0}, 30, 2, 2, 'FirstClimb=1;') - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, 0}, 30, 2, 2) + -- se approccio dopo un cambio pinze + if EMC.STARTZMAX == 11 then + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, 0}, 30, 2, 2, 'FirstClimb=1;') + -- se approccio da home else - -- altrimenti discesa diretta - if abs( EMC.R1 - EMC.R1p) < 10 and abs( EMC.R2 - EMC.R2p) < 90 then - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;') - -- se assi cambiano di molto - else - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2) + -- se asse B cambia di molto + if abs( 0 - EMC.R2p) > 1 then EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, 0}, 30, 2, 2) + end + -- se assi cambiano di molto + if abs( EMC.R1 - EMC.R1p) > 10 then EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, 0}, 30, 2, 2) end end - if abs( EMC.R2) > 75 then EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, ParkZ1, EMC.R1, EgtClamp( EMC.R2, -90, 90)}, 30, 2, 2) end EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') + -- se fine lavorazione con deposito utensile elseif EMC.LINKTYPE == 2 then -- retrazione EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) - if abs( EMC.R1 - EMC.R1p) > 1 or abs( EMC.R2 - EMC.R2p) > 1 then - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;') - if EMC.STARTZMAX > 0 then - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, 0}, 30, 3, 2, 'LastRise=1;') - else - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1, 0}, 30, 3, 2) - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2, 'LastRise=1;') - end + -- se risalita solo per cambio pinze + if EMC.STARTZMAX == 11 then + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'UniqueRise=1;') + -- se risalita per andare in home else - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, EMC.R2p}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'UniqueRise=1;') + if abs( EMC.R1 - EMC.R1p) > 1 or abs( EMC.R2 - EMC.R2p) > 1 then + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;') + -- se assi cambiano di molto + if abs( EMC.R1 - EMC.R1p) > 10 then + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1, 0}, 30, 3, 2) + end + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2, 'LastRise=1;') + else + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, EMC.R2p}, 30, 3, 2, 'UniqueRise=1;') + end end -- altrimenti collegamento tra due lavorazioni (3) else - -- TODO - -- 1) se il pezzo si allontana dalla testa, si muove prima il pezzo e poi la testa - -- se il pezzo si avvicina alla testa, prima la testa e poi il pezzo - -- 2) per capire se ruotando ci passiamo, si può verificare il punto iniziale, quello finale , e un punto a metà. Se tutti non in collisione, si va diretti. - - -- recupero quota massima di collegamento - local vtFinalAxLink = EmtGetFinalAxesPos( EMC.PREVMCHID, EMC.PREVMAIN, false) - local vtInitAxLink = EmtGetInitialAxesPos( EMC.NEXTMCHID, EMC.NEXTMAIN, false) - local bSafeMove = IsLinkSafety( vtFinalAxLink, vtInitAxLink) + local vFinalAxLink = EmtGetFinalAxesPos( EMC.PREVMCHID, EMC.PREVMAIN, false) + local vInitAxLink = EmtGetInitialAxesPos( EMC.NEXTMCHID, EMC.NEXTMAIN, false) + local bSafeMove = IsLinkSafe( vFinalAxLink, vInitAxLink) + + -- se gli assi rotanti non sono cambiati e il collegamento è come ultimo punto della lavorazione + if abs( EMC.R1 - EMC.R1p) < 1 and abs( EMC.R2 - EMC.R2p) < 1 and abs( EMC.L3p - vFinalAxLink[3]) < 1 and abs( EMC.L3 - vInitAxLink[3]) < 1 then + bSafeMove = true + end + -- se superata quota massima ammessa if not bSafeMove then -- retrazione EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) if abs( EMC.R2) > 91 then - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1p, EMC.L2p, ParkZ1, EMC.R1p, EgtClamp( EMC.R2, -90, 90)}, 30, 2, 2) + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, ParkZ1, EMC.R1p, EgtClamp( EMC.R2p, -90, 90)}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;') + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1Blade, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'LastRise=1;') + else + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1Blade, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'UniqueRise=1;') end - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1Blade, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;') - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1Blade, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'LastRise=1;') -- approccio EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, MaxZ1Blade, EMC.R1, 0}, 30, 2, 2, 'FirstClimb=1;') @@ -255,14 +335,19 @@ function OnSpecialLink() elseif EMC.HEAD == 'H13' then -- recupero se split da note utente di lavorazione precedente local bSplit = IsPrevSplit() - -- se inizio lavorazione con prelievo utensile if EMC.LINKTYPE == 1 then -- approccio EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, EMC.R2p, EMC.R3p}, 30, 2, 2, 'FirstClimb=1;') - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, EMC.R2, EMC.R3}, 30, 2, 2) - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2, EMC.R3}, 30, 2, 2, 'LastClimb=1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2p, EMC.L3p, EMC.R1p, EMC.R2p, EMC.R3}, 30, 2, 2, 'FirstClimb=1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, EMC.R2p, EMC.R3}, 30, 2, 2) + -- si muove trave mentre si è ancora a Z massima + if abs( EMC.R3) < 0.1 then + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, ParkCSaw0Z1, EMC.R1, EMC.R2, EMC.R3}, 31, 2, 2) + else + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, EMC.R2, EMC.R3}, 31, 2, 2) + end + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2, EMC.R3}, 31, 2, 2, 'LastClimb=1;') -- se fine lavorazione con deposito utensile elseif EMC.LINKTYPE == 2 then @@ -274,7 +359,6 @@ function OnSpecialLink() else end - -- se aggregato foratore multiplo su testa 1 elseif EMC.HEAD == 'H14' then @@ -309,17 +393,82 @@ function OnSpecialLink() if EMC.LINKTYPE == 1 then -- approccio EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, SafeX2RotAxis, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;') - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, EMC.R2}, 30, 2, 2) - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') + -- se doppia orizzontale mi serve movimento extra in Y per svincolo testa 2 + -- Il movimento è calcolato sulla testa 1 e se entra da sopra, non c'è svincolo in Y e la testa 2 scende diretta entrando nel pezzo + local dDeltaYApproach = nil + if IsMachDoubleHoriz( false) then + dDeltaYApproach = GetHeadDeltaYApproachOnDouble( false) + end + -- se serve un approccio diverso + if dDeltaYApproach then + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2 + dDeltaYApproach, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2 + dDeltaYApproach, EMC.L3p, EMC.R1, EMC.R2}, 30, 2, 2) + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2 + dDeltaYApproach, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2) + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') + else + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, EMC.R2}, 30, 2, 2) + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') + end -- se fine lavorazione con deposito utensile elseif EMC.LINKTYPE == 2 then -- retrazione EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, EMC.R2p}, 30, 3, 2, 'FirstRise=1;') - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, SafeX2RotAxis, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2) - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2, 'LastRise=1;') + -- se doppia orizzontale mi serve movimento extra in Y per svincolo testa 2 + -- Il movimento è calcolato sulla testa 1 e se entra da sopra, non c'è svincolo in Y e la testa 2 scende diretta entrando nel pezzo + local dDeltaYApproach = nil + if IsMachDoubleHoriz( true, EMC.PREVMCHID) then + dDeltaYApproach = GetHeadDeltaYApproachOnDouble( true) + end + -- se serve un approccio diverso + if dDeltaYApproach then + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p + dDeltaYApproach, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 3, 2, 'FirstRise=1;') + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p + dDeltaYApproach, EMC.L3, EMC.R1p, EMC.R2p}, 30, 3, 2) + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p + dDeltaYApproach, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2) + else + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, EMC.R2p}, 30, 3, 2, 'FirstRise=1;') + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2) + end + -- se 33 c'è stato un collegamento tra due lavorazioni doppie che passano da sopra il pezzo a sotto che avrebbe mandato teta 2 in collisione + if EMC.STARTZMAX ~= 33 then + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2, 'LastRise=1;') + end + + -- altrimenti collegamento tra due lavorazioni (3) + else + -- se doppia orizzontale mi serve movimento extra in Y per svincolo testa 2 + -- Il movimento è calcolato sulla testa 1 e se entra da sopra, non c'è svincolo in Y e la testa 2 scende diretta entrando nel pezzo + if EMC.OTHERLINKTYPE ~= 3 and ( IsMachDoubleHoriz( true, EMC.PREVMCHID) or IsMachDoubleHoriz( false)) then + local dDeltaYApproach = nil + dDeltaYApproach = GetHeadDeltaYApproachOnDouble( true) + -- se serve un approccio diverso + if dDeltaYApproach then + -- retrazione + EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) + -- recupero quota massima di collegamento + local vLInAx = EmtGetInitialAxesPos( EMC.NEXTMCHID, EMC.NEXTMAIN, false) + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p + dDeltaYApproach, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 3, 2, 'FirstRise=1;') + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p + dDeltaYApproach, vLInAx[3], EMC.R1p, EMC.R2p}, 30, 3, 2, 'LastRise=1;') + end + + dDeltaYApproach = nil + dDeltaYApproach = GetHeadDeltaYApproachOnDouble( false) + -- se serve un approccio diverso + if dDeltaYApproach then + -- approccio + EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) + -- recupero quota massima di collegamento + local vLFiAx = EmtGetFinalAxesPos( EMC.PREVMCHID, EMC.PREVMAIN, false) + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2 + dDeltaYApproach, vLFiAx[3], EMC.R1, EMC.R2}, 30, 2, 2, 'FirstClimb=1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2 + dDeltaYApproach, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2) + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') + end + elseif EMC.OTHERLINKTYPE == 3 then + -- approccio + EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 1) + end end -- se lama su testa 2 @@ -329,21 +478,19 @@ function OnSpecialLink() -- approccio EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1p, EMC.R2p}, 30, 2, 2, 'FirstClimb=1;') - EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') + EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3p, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;') -- se fine lavorazione con deposito utensile elseif EMC.LINKTYPE == 2 then -- retrazione EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1p, EMC.R2p}, 30, 3, 2, 'FirstRise=1;') - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2) + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, SafeX2, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2) EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2, 'LastRise=1;') end -- se lama su testa 3 elseif EMC.HEAD == 'H38' then - -- sicurezza aggiuntiva - local SAFE_DIST = 50 local dExtraDist = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM) / 2 + SAFE_DIST -- recupero se split da note utente di lavorazione precedente local bSplit = IsPrevSplit() @@ -372,7 +519,7 @@ function OnSpecialLink() -- retrazione EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) local dSafeX3 = EgtIf( EMC.L2p < dMidRawX3, dMinRawX3 - dExtraDist, dMaxRawX3 + dExtraDist) - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, dSafeX3, SafeZ3RotAxis, EMC.R1p, EMC.R2p}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;') + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, dSafeX3, SafeZ3RotAxis, EMC.R1p, EMC.R2p}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..' FirstRise=1;') if abs( EMC.R1 - EMC.R1p) > 1 or abs( EMC.R2 - EMC.R2p) > 1 then EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, dSafeX3, SafeZ3RotAxis, EMC.R1, EMC.R2}, 30, 3, 2) EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, dSafeX3, EMC.L3, EMC.R1, EMC.R2}, 30, 3, 2) @@ -388,7 +535,7 @@ function OnSpecialLink() if max( vLFiAx[3], vLInAx[3]) > SafeZ3RotAxis + 1 then -- retrazione EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN) - EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, SafeZ3RotAxis, EMC.R1p, EMC.R2p}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;') + EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, SafeZ3RotAxis, EMC.R1p, EMC.R2p}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..' FirstRise=1;') EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, SafeZ3RotAxis, EMC.R1p, 0}, 30, 3, 2, 'LastRise=1;') -- approccio EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN) @@ -553,7 +700,7 @@ end local function EmitComment( vCmd, sOut) EgtOutLog( ' ' .. sOut, 1) if Test then - table.insert( vCmd, { 0, sOut}) + table.insert( vCmd, { 0, sOut}) end end @@ -761,12 +908,19 @@ function OnSpecialApplyMachining() EMC.ERR = 0 EMC.ZMAX = false + EMC.ENDZMAX = false -- Verifico flag di separazione e fase di scarico local sNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) - local sPrevTool, dPrevValR3 - + local bZMaxForced = false + if EgtGetValInNotes( sNotes, 'StartZmax', 's') == 'FORCED' then + bZMaxForced = true + end + -- si cancella eventuale flag per risalita in ZMAX sNotes = EgtSetValInNotes( sNotes, 'StartZmax') + EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes) + + local sPrevTool, dPrevValR3 -- Recupero la posizione della trave e dei carrelli al termine della precedente operazione local nPrevOpeId = EgtGetPrevActiveOperation( EMC.MCHID) @@ -844,9 +998,6 @@ function OnSpecialApplyMachining() local nNextOpeId = EgtGetNextActiveOperation( EMC.MCHID) local bMchLast = ( not nNextOpeId or EgtGetOperationPhase( nNextOpeId) ~= EMC.PHASE) - -- Verifico flag di separazione e fase di scarico - sNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) - -- bPreSplit sempre a falso per obbligare a pinzare il pezzo con 1 morsa anche se iniziato il taglio che dividerà grezzo e finito (in genere per sezioni grandi con 2 tagli di lama) -- Tra un taglio e l'altro infatti c'e' inversione del braccio e quindi un'apertura delle rulliere. Se pinzano entrambe le pinze, potrebbero esserci problemi di collisone rulli-morse local bPreSplit = false --( sNotes:find( 'Presplit', 1, true) ~= nil) @@ -873,7 +1024,7 @@ function OnSpecialApplyMachining() local OriY2Delta = EMC.Y2DELTA local OriV1Pos = EMC.V1POS local OriV2Pos = EMC.V2POS - local OriCnt = EMC.CNT + local OriCnt = EMC.CNT -- eseguo le elaborazioni SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bLast and bUnload) -- se separazione, verifico il risultato @@ -936,7 +1087,7 @@ function OnSpecialApplyMachining() end -- Se richiesto movimento preliminare della testa a Zmax perchè c'è stato un riposizionamento delle pinze - if EMC.ZMAX then + if EMC.ZMAX or bZMaxForced then sNotes = EgtSetValInNotes( sNotes, 'StartZmax', 11) EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes) end @@ -945,6 +1096,29 @@ function OnSpecialApplyMachining() sNotes = EgtSetValInNotes( sNotes, 'StartZmax', 12) EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes) end + + -- se due lavorazioni in doppio e si cambia lato, si forza a Z massima per essere sicuri di fare approccio corretto + if IsMachDoubleHoriz( false) then + local bPrevMachId = EgtGetPrevActiveOperation( EMC.MCHID) + if bPrevMachId and IsMachDoubleHoriz( true, bPrevMachId) and EgtGetOperationType( nPrevOpeId) ~= MCH_OY.DISP then + -- recupero ptMin ptMax della lavorazione corrente + local nClId2Curr = EgtGetFirstNameInGroup( EMC.MCHID, 'CL') + local ptMinCurr = EgtGetInfo( nClId2Curr, 'MMIN', 'p') + local ptMaxCurr = EgtGetInfo( nClId2Curr, 'MMAX', 'p') + -- recupero ptMin ptMax della lavorazione precedente + local nClIdPrev = EgtGetFirstNameInGroup( bPrevMachId, 'CL') or GDB_ID.NULL + local ptMinPrev = EgtGetInfo( nClIdPrev, 'MMIN', 'p') + local ptMaxPrev = EgtGetInfo( nClIdPrev, 'MMAX', 'p') + + -- controlo se si passa da una lavorazione sopra ad una sotto + if ( ptMaxPrev:getZ() > EMC.RAWBOX:getMax():getZ() and ptMinCurr:getZ() < EMC.RAWBOX:getMin():getZ()) or + ( ptMinPrev:getZ() < EMC.RAWBOX:getMin():getZ() and ptMaxCurr:getZ() > EMC.RAWBOX:getMax():getZ()) then + + sNotes = EgtSetValInNotes( sNotes, 'StartZmax', 33) + EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes) + end + end + end end --------------------------------------------------------------------- @@ -963,7 +1137,7 @@ function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload) AuxInfoMach.bPreCut = bPreCut AuxInfoMach.bCutting = bCutting AuxInfoMach.bUnload = bUnload - + -- Assegno flag di pezzo separato dal resto del grezzo SPLIT = IsEndPhase( EMC.PHASE) @@ -1000,6 +1174,7 @@ function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload) EMC.SB = b3Tot:getDimY() EMC.HB = b3Tot:getDimZ() EMC.LT = b3Raw:getDimX() + EMC.RAWBOX = b3Raw EgtOutLog( ' BarLen='..EgtNumToString( EMC.LB, 1), 3) -- Aggiorno limiti di presa @@ -1130,7 +1305,7 @@ function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload) EgtSetInfo( NextDispId, 'V1POS', EMC.V1POS) EgtSetInfo( NextDispId, 'V2POS', EMC.V2POS) end - end + end -- Se previsto scarico, lo eseguo if bUnload then @@ -1393,9 +1568,7 @@ function SpecCalcCarriages( dDistFront, dDistBack, dRollFront, dRollBack, dY1Del WorkTab.dY1DeltaMaxF = min( EMC.LB - MinJoin, MaxY1 + dDistFront + dRollFront + AGG_V) WorkTab.dY2DeltaMinF = nil WorkTab.dY2DeltaMaxF = nil - if dY1DeltaMaxSP and dY1DeltaMaxSP > WorkTab.dY1DeltaMinF then - WorkTab.dY1DeltaMaxF = min( WorkTab.dY1DeltaMaxF, dY1DeltaMaxSP) - end + if dY1DeltaMaxSP then WorkTab.dY1DeltaMaxF = min( WorkTab.dY1DeltaMaxF, dY1DeltaMaxSP) end WorkTab.dV1PosF = dRollBack WorkTab.bV1CloseF = false WorkTab.dV2PosF = -dRollFront @@ -1620,12 +1793,6 @@ function SpecCalcUnloadOnLoadPos() table.insert( vCmd, { 11, 1}) end end - -- se l'ultima posizione di Y1 (calcolata in modo che PosT sia nella posizione di scarico) è fuori dalla corsa massima ricalcola le due quote alla quota massima raggiungibile - if dY1Move > MaxY1 then - dRotT = dRotT - ( dY1Move - MaxY1) - dY1Move = MaxY1 - EgtOutLog( ' Warning : Impossible to Reach Unloading on Load Position') - end table.insert( vCmd, { 2, 'Y1', dY1Move, 'T', dRotT, 'BrakeBeam'}) -- apro la morsa table.insert( vCmd, { 11, 0}) @@ -1921,7 +2088,7 @@ local function PosForEnl1FY1( dY1a, dY2a, dTa, dExtra, dCorsaY1e, dCorsaY2Te) if dDispl/2 <= dCorsaY1e then dY1a = dY1a + dDispl / 2 dY2a = dY2a - dDispl / 2 - dTa = dTa - dDispl / 2 + dTa = dTa - dDispl / 2 else dY1a = dY1a + dCorsaY1e dY2a = dY2a - (dDispl - dCorsaY1e) @@ -1943,7 +2110,7 @@ local function PosForEnl1FY2( dY1a, dY2a, dTa, dExtra, dCorsaY1Te, dCorsaY2e) if dDispl/2 <= dCorsaY1Te then if dDispl/2 <= dCorsaY2e then dY1a = dY1a + dDispl / 2 - dTa = dTa + dDispl / 2 + dTa = dTa + dDispl / 2 dY2a = dY2a - dDispl / 2 else dY2a = dY2a - dCorsaY2e @@ -1971,7 +2138,7 @@ local function MaxDispl( TabI, vCmd, sType) -- allontano (Y1+T) e (Y2) dY1a = MaxY1 dY2a = MinY2 - dTa = ( dY1a - TabI.dY1PosI) + dTa + dTa = ( dY1a - TabI.dY1PosI) + dTa -- **[M2]** = allontanamento dei trascinatori con Y2 in presa elseif sType == 'M2' then EmitComment( vCmd, '[M2]') @@ -1982,7 +2149,7 @@ local function MaxDispl( TabI, vCmd, sType) -- allontano (Y2+T) e (Y1) dY1a = MaxY1 dY2a = MinY2 - dTa = ( dY2a - TabI.dY2PosI) + dTa + dTa = ( dY2a - TabI.dY2PosI) + dTa -- **[M3]** = accentramento dei trascinatori con Y1 in presa elseif sType == 'M3' then EmitComment( vCmd, '[M3]') @@ -1992,7 +2159,7 @@ local function MaxDispl( TabI, vCmd, sType) -- accentro (Y1+T) e (Y2) dY1a = TabI.MyMinY1V1 dY2a = TabI.MaxY2V2 - dTa = ( dY1a - TabI.dY1PosI) + dTa + dTa = ( dY1a - TabI.dY1PosI) + dTa -- **[M4]** = accentramento dei trascinatori con Y2 in presa elseif sType == 'M4' then EmitComment( vCmd, '[M4]') @@ -2003,7 +2170,7 @@ local function MaxDispl( TabI, vCmd, sType) -- accentro (Y2+T) e (Y1) dY1a = TabI.MyMinY1V1 dY2a = TabI.MaxY2V2 - dTa = ( dY2a - TabI.dY2PosI) + dTa + dTa = ( dY2a - TabI.dY2PosI) + dTa end -- table.insert( vCmd, { 3, 'Y1', dY1a, 'Y2', dY2a, 'T', dTa, EMC.CNT}) @@ -2291,7 +2458,7 @@ local function PosY1Y2B( TabI, vCmd) PosY2FromY1B( TabI, vCmd) end end - bXW = false + bXW = false -- se posso posizionare 'direttamente' Y2 all'interno dell'intervallo I2 (casi [rp] o [ri]) else -- |POSIZIONO MORSA 2| e poi MORSA 1 @@ -2302,7 +2469,7 @@ local function PosY1Y2B( TabI, vCmd) TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then PosY2FromY1A( TabI, vCmd) PosY1FromY2B( TabI, vCmd) - bXW = false + bXW = false end -- in **accentramento** else @@ -2311,9 +2478,9 @@ local function PosY1Y2B( TabI, vCmd) TabI.dY1PosI <= TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then PosY2FromY1B( TabI, vCmd) PosY1FromY2B( TabI, vCmd) - bXW = false - end - end + bXW = false + end + end end if bXW then -- Massimo trascinamento della trave in direzione positiva (casi **[xw]** ) @@ -2323,10 +2490,10 @@ local function PosY1Y2B( TabI, vCmd) TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then -- allontanamento morse, trascinamento trave con Y1 MaxDispl( TabI, vCmd, 'M1') - else + else -- accentramento morse, trascinamento trave con Y2 MaxDispl( TabI, vCmd, 'M4') - end + end end nCnt = nCnt + 1 if nCnt > 10 then return end @@ -2505,7 +2672,6 @@ function SpecAdjustCarrA( WorkTab) -- eseguo eventuale posizionamento sicuro di teste e rulli if WorkTab.bCloseV then EnsureZmax( true, vCmd) - EMC.ZMAX = true MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1 + AggLoad, MinY1) MaxY2V2 = MaxY2 end @@ -2611,7 +2777,6 @@ function SpecAdjustCarrB1( WorkTab) -- ------------------------------------------ if WorkTab.bCloseV then EnsureZmax( true, vCmd) - EMC.ZMAX = true MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1 + AggLoad, MinY1) MaxY2V2 = MaxY2 end @@ -2683,7 +2848,6 @@ function SpecAdjustCarrB2( WorkTab) -- eseguo eventuale posizionamento sicuro di teste e rulli if WorkTab.bCloseV then EnsureZmax( true, vCmd) - EMC.ZMAX = true MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1 + AggLoad, MinY1) MaxY2V2 = MaxY2 end @@ -2754,7 +2918,6 @@ function SpecAdjustCarrC( WorkTab) -- eseguo eventuale posizionamento sicuro di teste e rulli if WorkTab.bCloseV then EnsureZmax( true, vCmd) - EMC.ZMAX = true MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1 + AggLoad, MinY1) MaxY2V2 = MaxY2 end @@ -2891,6 +3054,14 @@ function SpecOutputCmds( vCmd, bEnd) elseif Cmd[1] == 4 then local sInfo = '4,'..EgtNumToString( Cmd[2],0) EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- se chiusura rulli + if Cmd[2] == 1 then + if bEnd then + EMC.ENDZMAX = true + else + EMC.ZMAX = true + end + end -- apertura/chiusura morsa Y elseif Cmd[1] == 11 then local sInfo = '11,'..EgtNumToString( Cmd[2],0) @@ -2953,8 +3124,26 @@ function SpecOutputCmds( vCmd, bEnd) EgtSetInfo( NextDispId, 'V1POS', EMC.V1POS) EgtSetInfo( NextDispId, 'V2POS', EMC.V2POS) end + -- se bisogna andare a ZMAX alla fine, si setta il parametro sulla lavorazione successiva in modo che la corrente vada in home + if EMC.ENDZMAX and EMC.MCHID then + -- recupero lavorazione successiva + local nNextMchId = EgtGetNextActiveOperation( EMC.MCHID, true) + while nNextMchId do + if EgtGetOperationType( nNextMchId) ~= MCH_OY.DISP then + if EgtSetCurrMachining( nNextMchId) then + -- Verifico flag di separazione e fase di scarico + local sNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) + -- si cancella eventuale flag per risalita in ZMAX + sNotes = EgtSetValInNotes( sNotes, 'StartZmax', 'FORCED') + EgtSetMachiningParam( MCH_MP.USERNOTES, sNotes) + EgtSetCurrMachining( EMC.MCHID) + break + end + end + nNextMchId = EgtGetNextActiveOperation( nNextMchId, true) + end + end end - end --------------------------------------------------------------------- diff --git a/Essetre-PF1250.ini b/Essetre-PF1250.ini index 946213c..acc4be0 100644 --- a/Essetre-PF1250.ini +++ b/Essetre-PF1250.ini @@ -36,6 +36,7 @@ Chiseling=0 SawRoughing=0 SawFinishing=0 DrillingDoubleNT=1 +PocketingDoubleNT=1 [Machining] InitScript=InitMach.lua @@ -64,5 +65,6 @@ Enable=1 WinPlace=0,514,138,628,810 [VMill] -Enable=1 +Enable=2 Save=0 + diff --git a/Essetre-PF1250.mlde b/Essetre-PF1250.mlde index 8122b27..cbb8f6f 100644 --- a/Essetre-PF1250.mlde +++ b/Essetre-PF1250.mlde @@ -28,11 +28,11 @@ -- Intestazioni require( 'EmtGenerator') -EgtEnableDebug( true) +EgtEnableDebug( false) -PP_VER = '3.1h1' +PP_VER = '3.1g1_NL_DEV1' PP_NVER = '3.1.8.1' -MIN_MACH_VER = '2.7d2' +MIN_MACH_VER = '3.1h3' MACH_NAME = EgtGetCurrMachineName() -- Carico i dati globali @@ -96,7 +96,7 @@ SawB2Offs = 0 MinX1 = 0 MaxX1 = 3300 MinZ1 = -1550 -MaxZ1 = -50 +MaxZ1 = 0 MaxZ1Blade = -100 MaxZ1LongTool = -200 MinC1 = -275 @@ -142,7 +142,7 @@ SafeX2RotAxis = -1000 ParkZ2 = 0 ParkC2 = -90 ParkB2 = -90 -MinDistToolX1X2 = 40 +MinDistToolX1X2 = 20 TurnerOffs = 120.0 AggLoad = 50 DeltaTabY = 2467.0 @@ -355,12 +355,12 @@ local H11Id = EmtHead { Type = MCH_HT.STD, Pos = Point3d(0,0,0), TDir = Z_AX(), - ADir = -Y_AX(), - Rot1W = 0.2, + ADir = X_AX(), + MaxDeltaR2OnFirst = false, + Rot1W = 2, Rot2Stroke = { MinB1, MaxB1}, OthColl = {'B1/SOLID', 'C1/SOLID'}, Geo = 'H11_HEAD/GEO'} -EgtSetInfo( H11Id, 'ZEXTRA', '250,60') -- Lama local H12Id = EmtHead { Name = 'H12', @@ -374,7 +374,6 @@ local H12Id = EmtHead { Rot2Stroke = { MinB1b, MaxB1b}, OthColl = {'B1/SOLID', 'C1/SOLID'}, Geo = 'H12_HEAD/GEO'} -EgtSetInfo( H12Id, 'ZEXTRA', '160,60') EgtSetInfo( H12Id, 'ZMAXONROT', '1,190') -- Lama 2 if SecondSaw then @@ -390,7 +389,6 @@ if SecondSaw then Rot2Stroke = { MinB1b, MaxB1b}, OthColl = {'B1/SOLID', 'C1/SOLID'}, Geo = 'H16_HEAD/GEO'} - EgtSetInfo( H16Id, 'ZEXTRA', '160,60') EgtSetInfo( H16Id, 'ZMAXONROT', '1,190') end -- Sega a catena @@ -417,7 +415,6 @@ local H13Id = EmtHead { SolCh = MCH_SCC.ADIR_NEAR, OthColl = {'B1/SOLID', 'C1/SOLID'}, Geo = 'H13_HEAD/GEO'} -EgtSetInfo( H13Id, 'ZEXTRA', '200') EgtSetInfo( H13Id, 'ZSAFEDELTA', '60') EgtSetInfo( H13Id, 'ZMAXONROT', '1,80') -- *** Testa 2 *** @@ -491,7 +488,9 @@ local H21Id = EmtHead { Type = MCH_HT.STD, Pos = Point3d( Head2X, Head2Y, Head2Z), TDir = -Z_AX(), - Rot1W = 0.2, + ADir = X_AX(), + MaxDeltaR2OnFirst = false, + Rot1W = 2, Rot2Stroke = { MinB2, MaxB2}, OthColl = {'B2/SOLID', 'C2/SOLID'}, Geo = 'H21_HEAD/GEO'} @@ -1038,7 +1037,7 @@ function GetChainSawZHomeFromVirtualAxis( dPosA, dCSawLength) if dCSawLength >= MinLengthLongCSaw then EmtSetLastError( 1200, 'ChainSaw too long: orientation forbidden') end - return ParkCSaw0Z1 + return ParkCSawZ1 -- altrimenti A=-90 -> T102 o A=90 -> T104 -> HomeZ = -100 else if dCSawLength >= MinLengthLongCSaw then diff --git a/UpdateLog.txt b/UpdateLog.txt index 49fc95b..26aa2e0 100644 --- a/UpdateLog.txt +++ b/UpdateLog.txt @@ -1,5 +1,11 @@ ==== Common_PF1250 Update Log ==== +Versione 3.1-- (--/--/2026) +- (ALL) Prima versione NEW LINK. Serve attivazione in MLDE +- (SIM-INI) Con CAM5 v.3.1h2 è possibile abilitare/disabilitare VMILL durante lavorazione. Serve Modifica INI macchina "Enable=2" in sezione "[VMill]". + Il flag non è più di creazione, ma di visualizzazione, e il controllo collisioni è comunque garantito. +- (SIM) Corretta gestione collisione con utensile flottante + Versione 3.1h1 (07/08/2026) - (SIM-GEN) Se pezzo a caduta con rulliera V2 attiva (pinza 3), prima muove la rulliera e poi la apre. Ticket#3116 diff --git a/Version.lua b/Version.lua index cb28499..420baef 100644 --- a/Version.lua +++ b/Version.lua @@ -3,7 +3,7 @@ local InfoCommon_STD_PP = { NAME = 'Common_PF1250', -- nome script PP standard - VERSION = '3.1h1', -- versione script + VERSION = '3.1--', -- versione script MIN_MACH_VER_PP_COMMON = '3.1b2' -- versione minima kernel }