-- Processore standard macchine FAST by EgalWare s.r.l. 2024/02/23 -- Con controllo numerico TPA -- carico librerie local INFO_STD_PP = require( 'Version') -- Variabili di modulo local CSP_INFO = INFO_STD_PP.NAME..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.' local MACHINE_INFO = MACH_NAME..' ver.'..PP_VER local TEST_USE = false --------------------------------------------------------------------- -- *** GENERATION *** --------------------------------------------------------------------- function OnStart() -- controllo versione programma if not EMT.VER or EMT.VER < MIN_MACH_VER then EmtSetLastError( 1200, 'A newer version of the program is required (minimum EgtMachKernel '..MIN_MACH_VER..')') end EMT.USETO1 = false -- abilitazione uso origine tavola EMT.MODAL = true -- abilitazione emissione modale EMT.INCHES = false -- unità di misura mm/inches EMT.DECNUM = 5 -- numero di decimali dopo la virgola EMT.NUM = false -- abilitazione numerazione linee --EMT.Nt = 'N' -- token per la numerazione di linea --EMT.LINENBR = 0 -- numero di linea --EMT.LINEINC = 1 -- incremento numerazione linee --EMT.Ft = 'F' -- token per feed --EMT.St = 'S' -- token per speed EMT.FMAXPINZE = 154000 -- feed massima pinze end --------------------------------------------------------------------- function OnEnd() -- Ripristino fase iniziale come corrente EgtSetCurrPhase( 1) end --------------------------------------------------------------------- function OnProgramStart() -- aggiungo prefisso per commentae commenti iniziali se la macchina è utilizzata per fare i test local sPrefixCommentLine = '' ; if IS_TEST_MACHINE or EgtEndsWith( EgtGetCurrMachineDir(), '.TEST') then sPrefixCommentLine = '//' end -- Intestazioni if EMT.INFO then ParkLine( sPrefixCommentLine..'('..EMT.INFO..')') else ParkLine( '(Program Start)') end ParkLine( sPrefixCommentLine..'('.. CSP_INFO..')') ParkLine( sPrefixCommentLine..'('.. MACHINE_INFO..')') -- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente) if TEST_USE then ParkLine( 'M199') end -- Cerco primo utensile su testa 1 EMT.TOOL_1, EMT.TLEN_1 = FindFirstToolOnHead( 'H1') -- Dichiaro inizio EMT.FIRST = true EMT.TLAST = nil -- Inizializzazioni varie ParkLine( 'M6 T000000') ParkLine( 'G49') -- Inizio lista utensili ParkLine( 'M993 (Tool List Start)') end --------------------------------------------------------------------- function OnProgramEnd() -- Arresto mandrino EmtOutput( 'M05') -- Emissione scarico --for i = 1, #EMT.AUXCMD do -- EmtOutput( '( ' .. EMT.AUXCMD[i] .. ' )') --end EMT.AUXCMD = {} for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end if #EMT.AUXSTR > 0 then if EMT.AUXTYPE == 'S' then EmtOutput( 'M111 P1=20') EmtOutput( 'M111 P1=30') elseif EMT.AUXTYPE == 'R' then EmtOutput( 'M111 P1=20') EmtOutput( 'M111 P1=30') elseif EMT.AUXTYPE == 'U' then local sP1x = EgtIf( EMT.CHY_ON, '0', '2') EmtOutput( 'M111 P1=2'..sP1x) EmtOutput( EgtIf( EMT.U_STD, ';', '')..'M111 P1=3'..sP1x) -- emissione conclusione pezzo precedente (se non si è in test) if not TEST_USE and EMT.PRODID then local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2' EmtOutput( sEnd) end end end EMT.AUXSTR = {} EMT.AUXTYPE = nil EMT.U_STD = nil EMT.UNL = nil EMT.PREROT = nil EMT.SPLITROT = nil EMT.CHY_ON = nil EMT.FALL = nil EMT.RELOAD = nil EMT.RELOAD2 = nil -- Termino il programma EmtOutput( 'M02') end --------------------------------------------------------------------- function OnToolData() -- emissione dati utensili if EMT.HEAD == 'H1' then local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) .. ' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, 3) ParkLine( sOut) -- cerco posizione di attrezzaggio del primo utensile di lavorazione if EMT.TOOL == EMT.TOOL_1 and EMT.TLEN_1 < LONG_TOOL_MINLEN then EMT.TCPOS_1 = EMT.TCPOS end -- emissione dati lama elseif EMT.HEAD == 'H2' then local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) .. ' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, 3) ParkLine( sOut) -- emissione dati sega a catena elseif EMT.HEAD == 'H3' then if EMT.TDIST and abs( EMT.TDIST) < 0.1 then EMT.TDIST = nil end local sData = ' P2=' .. EmtLenToString( ( EMT.TDIST or ChSawLen), 3) .. ' P3=' .. EmtLenToString( EMT.TLEN, 3) .. ' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( ( EMT.TDIST or ChSawLen), 3) if EMT.TCPOS == 'T101' then ParkLine( 'M992 P1=101' .. sData) ParkLine( 'M992 P1=102' .. sData) ParkLine( 'M992 P1=103' .. sData) ParkLine( 'M992 P1=104' .. sData) else ParkLine( 'M992 P1=111' .. sData) ParkLine( 'M992 P1=112' .. sData) ParkLine( 'M992 P1=113' .. sData) ParkLine( 'M992 P1=114' .. sData) end -- emissione dati rinvio elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' then local nPos = EgtIf( EMT.HEAD == 'H5', 91, 93) if EMT.EXIT == 2 then nPos = nPos + 1 end local sOut = 'M992 P1=' .. EgtNumToString( nPos, 0) .. ' P2=' .. EmtLenToString( EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) .. ' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, 3) ParkLine( sOut) -- altro non previsto else EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD) end end --------------------------------------------------------------------- function OnDispositionStart() --EmtOutput( '(Disposition '..EMT.DISPIND..' = '..EMT.DISPID..')') EMT.OPEISDISP = true -- Assegnazione parametri disposizione EMT.TPOS = EgtGetInfo( EMT.DISPID, 'TPOS', 'd') EMT.YPOS = EgtGetInfo( EMT.DISPID, 'YPOS', 'd') -- Se prima disposizione if EMT.PHASE == 1 then -- terminazione lista utensili ParkLine( 'G990 (Tool List End)') -- abilito numerazione linee EMT.NUM = false EMT.LINENBR = 0 ParkLine( 'M28') -- emissione dati di macchina local sOut = 'M114'..' P1='..EmtLenToString( LoadT, 2)..' P2='..EmtLenToString( MinY, 2)..' P3='..EmtLenToString( MaxY, 2).. ' P4='..EmtLenToString( MinV, 2)..' P5='..EmtLenToString( MaxV, 2)..' P6='..EmtLenToString( MillOffs, 2).. ' P7='..EmtLenToString( SawOffs, 2)..' P8='..EmtLenToString( ParkY, 2)..' P9='..EmtLenToString( ParkV, 2).. ' P10='..EmtLenToString( TurnerOffs, 2)..' P11='..EmtLenToString( -DeltaTabY, 2)..' P12='..EmtLenToString( DeltaTabZ - MillOffs, 2) if SecondSupport >= 3 then sOut = sOut ..' P13='..EmtLenToString( AngTr1Len, 2) ..' P14='..EmtLenToString( AngTr1Offs + MillOffs,2) end ParkLine( sOut) -- carico barra EMT.LOAD = true else EMT.LOAD = false if IsEnd2Phase( EMT.PHASE - 1) then EMT.RELOAD = true EMT.RELOAD2 = false elseif IsStartPhase( EMT.PHASE) then EMT.YDELTA = EMT.YPOS - LoadT EMT.VDELTA = nil end end end --------------------------------------------------------------------- function OnDispositionEnd() -- Se disposizione inizio o rimanenza if IsStartOrRestPhase( EMT.PHASE) then -- reset recupero sovramateriale in X non più presente EMT.X_OFF = nil -- gruppo con info da BTL (se mancano prova dal gruppo di lavoro corrente) local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL -- dati del grezzo local LBarra = EMT.LB -- dati del pezzo local IdTrave = EMT.IT local LTrave = EMT.LT local HTrave = EMT.HT local STrave = EMT.ST local HOverM = EMT.HOVM -- calcolo dati pinze local TempAccPinze, TempMinAccPinze, RidFeed = CalcDinamicaPinze( HTrave, STrave, LBarra) local TempAccPinz1, TempMinAccPinz1, RidFeed1 = CalcDinamicaPinze( HTrave, STrave, LBarra - LTrave) local TempAccPinz2, TempMinAccPinz2, RidFeed2 = CalcDinamicaPinze( HTrave, STrave, LTrave) if IdTrave >= 0 then local sPrt = '( *** Part '.. EgtNumToString( IdTrave, 0) ..' ***)' local sOut = '( SN=' .. IdTrave .. ' LBarra=' .. EmtLenToString( LBarra, 3) .. ' L='..EmtLenToString( LTrave, 3) .. ' H=' .. EmtLenToString( HTrave, 3) .. ' S=' .. EmtLenToString( STrave, 3) .. ' )' EMT.PRODID = EgtGetInfo( BtlInfoId, 'PRODID', 'i') or 0 EMT.PATTID = EgtGetInfo( BtlInfoId, 'PATTID', 'i') or 0 EMT.CUTID = EgtGetInfo( EMT.IDT, 'CUTID', 'i') or 0 local sStart = 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=1' if EMT.LOAD then ParkLine( sPrt) ParkLine( sOut) if not TEST_USE then ParkLine( sStart) end else EmtOutput( sPrt) EmtOutput( sOut) if not TEST_USE then EmtOutput( sStart) end end else EmtOutput( '(REMAIN UNLOAD)') EMT.PRODID = nil EMT.PATTID = nil EMT.CUTID = nil end -- imposto dati pezzo local nLoad90 = EgtGetInfo( BtlInfoId, 'LOAD90', 'i') or 0 -- se carico barra if EMT.LOAD or EMT.RELOAD then sOut = 'M115 P1=' .. EmtLenToString( LBarra, 2) .. ' P2=' .. EmtLenToString( HTrave, 2) .. ' P3=' .. EmtLenToString( STrave, 2) .. ' P4=' .. EmtLenToString( HOverM, 2) .. ' P5=' .. tostring( nLoad90) .. ' P6=' .. EmtLenToString( LTrave, 2) .. ' P7=' .. EgtNumToString( TempAccPinze, 2) .. ' P8=' .. EgtNumToString( TempAccPinz2, 2) .. ' P9=' .. EgtNumToString( TempAccPinz1, 2) if EMT.LOAD then ParkLine( sOut) SetStartValue( 1, LBarra) SetStartValue( 2, HTrave) SetStartValue( 3, STrave) SetStartValue( 6, HOverM) SetStartValue( 7, nLoad90) else EmtOutput( sOut) end -- altrimenti recupero rimanenza else sOut = 'M115 P1=' .. EmtLenToString( LBarra, 2) .. ' P2=' .. EmtLenToString( HTrave, 2) .. ' P3=' .. EmtLenToString( STrave, 2) .. ' P4=' .. EmtLenToString( HOverM, 2) .. ' P5=' .. tostring( nLoad90) .. ' P6=' .. EmtLenToString( EgtIf( IdTrave >= 0, LTrave, LBarra), 2) .. ' P7=' .. EgtNumToString( TempAccPinze, 2) .. ' P8=' .. EgtNumToString( TempAccPinz2, 2) .. ' P9=' .. EgtNumToString( TempAccPinz1, 2) EmtOutput( sOut) EmtOutput( 'M112'..' P1='..EmtLenToString( LoadT, 3).. ' P5=1 P6='..EmtLenToString( EMT.YPOS, 3)..' P7='..EmtLenToString( ParkV, 3) ..' P9='..GetFmaxClamp()) -- aggiorno dati aggancio carrelli alla trave EMT.YDELTA = EMT.YPOS - LoadT EMT.VDELTA = nil end -- eventuale preparazione per rotazione immediata if IsStartPhase( EMT.PHASE) and EMT.AUXSTR then -- emissione movimento carrelli per rotazione EMT.AUXCMD = {} if #EMT.AUXSTR > 0 then EmtOutput( '( ** Rotation ** )') end for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end if #EMT.AUXSTR > 0 then EmtOutput( 'M111 P1=20') EmtOutput( 'M111 P1=30') end EMT.AUXSTR = {} EMT.AUXTYPE = nil end -- se altrimenti disposizione intermedia, eventuale rotazione elseif IsMidPhase( EMT.PHASE) or IsEnd2Phase( EMT.PHASE) then -- se rotazioni diverse, emetto il comando e aggiorno lo stato if VerifyEmitRotation() then -- imposto stato post-rotazione EMT.POSTROT = true -- imposto recupero sovramateriale in X non più presente EMT.X_OFF = EMT.HOVM end -- se altrimenti disposizione intermedia speciale con eventuale rotazione elseif IsMid2Phase( EMT.PHASE) then -- emissione movimento carrelli EMT.AUXCMD = {} if #EMT.AUXSTR > 0 then EmtOutput( '( ** Rotation ** )') end for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end if #EMT.AUXSTR > 0 then EmtOutput( 'M111 P1=20') EmtOutput( 'M111 P1=30') end EMT.AUXSTR = {} EMT.AUXTYPE = nil -- se rotazioni diverse, emetto il comando e aggiorno lo stato if VerifyEmitRotation() then -- imposto stato post-rotazione EMT.POSTROT = true -- imposto recupero sovramateriale in X non più presente EMT.X_OFF = EMT.HOVM end -- altrimenti disposizione finale, eventuale scarico pezzo lavorato se non ci sono lavorazioni else EMT.AUXCMD = {} if #EMT.AUXSTR > 0 then EmtOutput( '( ** Unload ** )') end for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end if #EMT.AUXSTR > 0 then EmtOutput( 'M111 P1=22') -- se dopo c'è scarico spezzone devo mettere attesa termine esecuzione if IsRestPhase( EMT.PHASE + 1) then EmtOutput( 'M111 P1=32') else EmtOutput( EgtIf( EMT.U_STD, ';', '')..'M111 P1=32') end -- emissione conclusione pezzo precedente (se non in modalità test) if not TEST_USE and EMT.PRODID then local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2' EmtOutput( sEnd) end end EMT.AUXSTR = {} EMT.AUXTYPE = nil EMT.U_STD = nil end EMT.OPEISDISP = false end --------------------------------------------------------------------- function OnTableData() end --------------------------------------------------------------------- function OnFixtureData() end --------------------------------------------------------------------- function OnRawMoveData() -- Se disposizione inizio o rimanenza if IsStartOrRestPhase( EMT.PHASE) then -- se primo grezzo, reset lunghezza barra if EMT.RAWIND == 1 then EMT.LB = 0 end -- aggiungo la lunghezza del grezzo (solo se movimento in corner) if EMT.RAWTYPE == 1 then local b3Raw = EgtGetBBoxGlob( EgtGetFirstNameInGroup( EMT.RAWID, 'RawSolid'), GDB_BB.STANDARD) local LBarra = b3Raw:getDimX() EMT.LB = EMT.LB + LBarra end -- se primo grezzo, calcolo dati del pezzo if EMT.RAWIND == 1 then local PartId = EgtGetFirstPartInRawPart( EMT.RAWID) if PartId then EMT.IDT = PartId EMT.IT = EgtGetInfo( PartId, 'PDN', 'i') or 0 local b3Part = EgtGetBBoxGlob( EgtGetFirstNameInGroup( PartId, 'Box'), GDB_BB.STANDARD) EMT.LT = b3Part:getDimX() EMT.HT = b3Part:getDimY() EMT.ST = b3Part:getDimZ() EMT.HOVM = EgtGetInfo( EMT.RAWID, 'HOVM', 'd') or 0 else EMT.IDT = GDB_ID.NULL EMT.IT = -1 EMT.LT = 0 EMT.HT = EMT.HT or 0 EMT.ST = EMT.ST or 0 EMT.HOVM = 0 end end end end --------------------------------------------------------------------- function OnToolSelect() -- se utensile definito (non definito per disposizioni con movimento) if EMT.TOOL ~= '' then -- verifiche su utensile local sTool = EgtTdbGetToolFromUUID( EgtGetMachiningParam( MCH_MP.TUUID) or "") if sTool ~= EMT.TOOL then error( "Tool name mismatch") end -- predefinite EMT.TCPOS EMT.HEAD EMT.EXIT EMT.TOOLTYPE = EgtTdbGetCurrToolParam( MCH_TP.TYPE) EMT.TOOLSEL = EMT.TCPOS..' M06' EMT.TDIAM = EgtTdbGetCurrToolParam( MCH_TP.DIAM) EMT.TTOTDIAM = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM) EMT.TLEN = EgtTdbGetCurrToolParam( MCH_TP.LEN) EMT.TTOTLEN = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) if MCH_TP.DIST then EMT.TDIST = EgtTdbGetCurrToolParam( MCH_TP.DIST) end if EMT.TDIST and abs( EMT.TDIST) < 0.1 then EMT.TDIST = nil end end end --------------------------------------------------------------------- function OnToolDeselect() end --------------------------------------------------------------------- function OnMachiningStart() --EMT.MCHNAME = EgtGetMachiningParam( MCH_MP.NAME) EMT.MCHNAME = EgtGetOperationName( EMT.MCHID) EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE) EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES) -- sistemazione speed (la speed della lama va moltiplicata per 6) if EMT.HEAD == 'H2' then EMT.S = EMT.S * 6 elseif EMT.HEAD == 'H5' and EMT.EXIT == 1 then EMT.S = -EMT.S elseif EMT.HEAD == 'H6' and EMT.EXIT == 1 then EMT.S = -EMT.S end -- determino subito se taglio di separazione di pezzo a caduta EMT.PREFALLCUT = nil if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Split') then local ClId = EgtGetFirstNameInGroup( EMT.MCHID, 'CL') local P1Id = EgtGetFirstNameInGroup( ClId or GDB_ID.NULL, 'P1') local sAE1 = EgtGetInfo( P1Id or GDB_ID.NULL, 'AE1') or '' if sAE1 == '0,Fall' then EMT.PREFALLCUT = true end end end --------------------------------------------------------------------- function OnMachiningEnd() --EmtOutput( ';Mach End') -- Emissione split --for i = 1, #EMT.AUXCMD do -- EmtOutput( '( ' .. EMT.AUXCMD[i] .. ' )') --end EMT.AUXCMD = {} if #EMT.AUXSTR > 0 then if EMT.AUXTYPE == 'S' then EmtOutput( '( ** Split ** )') elseif EMT.AUXTYPE == 'U' then if not EMT.ZMAX then EmitZmax() end EmtOutput( '( ** Unload ** )') elseif EMT.AUXTYPE == 'P' then if EMT.PREROT then EmitZmax() EmtOutput( '( ** Rotation ** )') elseif EMT.FALL then if not EMT.ZMAX then EmitZmax() end EmtOutput( '( ** Fall ** )') else EmitZmax() EmtOutput( '( ** Split 2 ** )') end end end for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end if #EMT.AUXSTR > 0 then if EMT.AUXTYPE == 'S' then EmtOutput( 'M111 P1=20') EmtOutput( 'M111 P1=30') elseif EMT.AUXTYPE == 'U' then local sP1x = EgtIf( EMT.CHY_ON, '0', '2') EmtOutput( 'M111 P1=2'..sP1x) -- se dopo cè scarico spezzone devo mettere attesa termine esecuzione if IsRestPhase( EMT.PHASE +1) then EmtOutput( 'M111 P1=3'..sP1x) else EmtOutput( EgtIf( EMT.U_STD, ';', '')..'M111 P1=3'..sP1x) end -- emissione conclusione pezzo precedente (se non è modalità test) if not TEST_USE and EMT.PRODID then local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2' EmtOutput( sEnd) end elseif EMT.AUXTYPE == 'P' then EmtOutput( 'M111 P1=20') EmtOutput( 'M111 P1=30') if EMT.FALL then EmtOutput( 'M155') -- emissione conclusione pezzo (se non in modalità test) if not TEST_USE and EMT.PRODID then local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2' EmtOutput( sEnd) end elseif not EMT.PREROT then EmtOutput( 'M77') end end end EMT.AUXSTR = {} EMT.AUXTYPE = nil EMT.U_STD = nil EMT.PREVTOOL = EMT.TOOL EMT.PREVHEAD = EMT.HEAD EMT.PREVS = EMT.S end --------------------------------------------------------------------- function OnPathStart() -- non ancora iniziata la lavorazione EMT.MCHFIRST = true EMT.MCHFIRSTFEED = true -- primo posizionamento sempre in globale EMT.REFLOC = nil EMT.IPLGL = false -- salvo precedenti rotanti EMT.R1pp = EMT.R1p EMT.R2pp = EMT.R2p -- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento) EmtResetPrev() EMT.AUXCMD = {} EMT.AUXSTR = {} end --------------------------------------------------------------------- function OnPathEnd() if not EMT.ZMAX then EmtOutput( 'G27') EmtOutput( 'M6 T000000') EmtOutput( 'M99') end EMT.AUXTYPE = nil EMT.UNL = nil EMT.PREROT = nil EMT.SPLITROT = nil EMT.CHY_ON = nil EMT.FALL = nil EMT.AUXCMD = {} EMT.AUXSTR = {} end --------------------------------------------------------------------- function OnPathStartAux() --EgtOutLog( 'OnPathStartAux - ' .. EgtNumToString( EMT.AUXIND, 0) .. ' - ' .. EMT.AUX) -- se richiesto, preparo il carico barra if EMT.LOAD or EMT.RELOAD then PrepareLoad( EMT.AUX, true) -- se altrimenti carico dopo rotazione elseif EMT.POSTROT then PreparePostRotation( EMT.AUX) -- altrimenti, preparo lo spostamento carrelli else PrepareMoveChar( EMT.AUX) end end --------------------------------------------------------------------- function OnPathEndAux() --EgtOutLog( 'OnPathEndAux - ' .. EgtNumToString( EMT.AUXIND, 0) .. ' - ' .. EMT.AUX) -- verifico tipo di emissione if EMT.OPEISDISP then if not EMT.AUXTYPE then local Cmd = EgtSplitString( EMT.AUX) if Cmd[1] == '0' and Cmd[2] == 'Unloading' then EMT.AUXTYPE = 'U' elseif EgtGetInfo( EMT.DISPID, 'TYPE') == 'REST' then EMT.AUXTYPE = 'R' else EMT.AUXTYPE = 'P' end end else if not EMT.AUXTYPE then local Cmd = EgtSplitString( EMT.AUX) if Cmd[1] == '0' and Cmd[2] == 'Split' then EMT.AUXTYPE = 'S' elseif Cmd[1] == '0' and Cmd[2] == 'Unloading' then EMT.AUXTYPE = 'U' else EMT.AUXTYPE = 'P' if Cmd[1] == '0' and Cmd[2] == 'Fall' then EMT.FALL = true end end elseif EMT.AUXTYPE == 'P' then local Cmd = EgtSplitString( EMT.AUX) if Cmd[1] == '0' and Cmd[2] == 'Unloading' then EMT.CHY_ON = true EMT.AUXTYPE = 'U' end end end -- preparo a seconda del tipo if EMT.AUXTYPE == 'R' then -- per il carico della rimanenza dopo rotazione speciale if EMT.RELOAD and not EMT.RELOAD2 then PrepareLoad( EMT.AUX, false) -- per lo scarico della rimanenza else PrepareResidue( EMT.AUX) end elseif EMT.AUXTYPE == 'S' then -- per lo split PrepareSplit( EMT.AUX) elseif EMT.AUXTYPE == 'U' then -- per lo scarico PrepareUnload( EMT.AUX) elseif EMT.AUXTYPE == 'P' then -- per la pre-rotazione PreparePreRotation( EMT.AUX) end end --------------------------------------------------------------------- function OnRapid() MyBackupAxes() -- se primo movimento della lavorazione, gestione speciale if EMT.MCHFIRST and not EMT.OPEISDISP then -- decido se muovere prima testa o carrelli (standard prima testa) local bHeadFirst = true if not ( EMT.LOAD or EMT.RELOAD) and not EMT.ZMAX then local DeltaT = EMT.L1 - EMT.TLAST if ( DeltaT < -GEO.EPS_SMALL and EMT.VDELTA) or ( DeltaT > GEO.EPS_SMALL and EMT.YDELTA) then bHeadFirst = false end end -- sistemo movimenti MyAdjustLinearAxes() EmtAdjustRotaryAxes() if not ( EMT.LOAD or EMT.RELOAD) then if not EMT.ZMAX and #EMT.AUXSTR > 0 then EmitZmax() bHeadFirst = false end end -- primo posizionamento local MyZHome = EgtGetAxisHomePos( 'Z') local bZmax = ( #EMT.AUXSTR > 0 or EMT.TOOL ~= EMT.PREVTOOL or EMT.L3 > -1) -- se avevo motosega, torno in zona sicura senza ruotare assi rotanti if ( EMT.PREVHEAD == 'H3' or EMT.TTOTLEN > 200) and EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then local sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, 3) .. ' P3=' .. EmtLenToString( MyZHome, 3) .. ' P4=' .. EgtNumToString( EMT.R2pp, 3) .. ' P5=' .. EgtNumToString( EMT.R1pp, 3) .. ' P6=' .. EgtNumToString( EMT.PREVTCPOS, 3) .. ' P7=' .. EgtNumToString( EMT.PREVS, 0) .. ' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4') EmtOutput( sOutPreMove) EmtOutput( 'M101 P1=2') EmtOutput( 'M101 P1=3') end if not EMT.LOAD then local sOut = string.gsub( string.gsub( EMT.MCHNAME..'/'..EMT.TOOL, '%(', '['), '%)', ']') EmtOutput( '( * ' .. sOut .. ' * )') end -- se carico motosega, ruoto in zona sicura prima di approcciare la lavorazione if ( EMT.HEAD == 'H3' or EMT.TTOTLEN > 200) and EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then local sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, 3) .. ' P3=' .. EmtLenToString( MyZHome, 3) .. ' P4=' .. EgtNumToString( EMT.R2, 3) .. ' P5=' .. EgtNumToString( EMT.R1, 3) .. ' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) .. ' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4') EmtOutput( sOutPreMove) EmtOutput( 'M101 P1=2') EmtOutput( 'M101 P1=3') end -- resetto valori precedenti EmtResetPrev() local MyZPos = EMT.L3 -- se sono su pezzi alti e movimento da emettere, per sicurezza a Z massima if EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then MyZPos = MyZHome end local sOut = 'M101 P1=1' .. ' P2=' .. EmtLenToString( EMT.L2, 3) .. ' P3=' .. EmtLenToString( MyZPos, 3) .. ' P4=' .. EgtNumToString( EMT.R2, 3) .. ' P5=' .. EgtNumToString( EMT.R1, 3) .. ' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) .. ' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4') if EMT.LOAD then ParkLine( sOut) else EmtOutput( sOut) end sOut = 'M101 P1=2' if EMT.LOAD then ParkLine( sOut) else if bHeadFirst then EmtOutput( sOut) end end -- se prima lavorazione if EMT.LOAD then --for i = 1, #EMT.AUXCMD do -- EmtOutput( '( ' .. EMT.AUXCMD[i] .. ' )') --end EMT.AUXCMD = {} local bOnlyCharY = true for i = 1, #EMT.AUXSTR do ParkLine( EMT.AUXSTR[i]) if string.find( EMT.AUXSTR[i], 'P1=10', 1, true) then bOnlyCharY = false end end EMT.AUXSTR = {} sOut = EgtIf( bOnlyCharY, 'M111 P1=21', 'M111 P1=20') ParkLine( sOut) sOut = EgtIf( bOnlyCharY, 'M111 P1=31', 'M111 P1=30') ParkLine( sOut) sOut = string.gsub( string.gsub( EMT.MCHNAME..'/'..EMT.TOOL, '%(', '['), '%)', ']') ParkLine( '( * ' .. sOut ..' * )') sOut = 'M101 P1=3' ParkLine( sOut) local sY, sA if EMT.YDELTA then sY = EmtLenToString( EMT.L1 + EMT.YDELTA) sA = '1' else sY = EmtLenToString( ParkY) sA = '2' end local sV, sB if EMT.VDELTA then sV = EmtLenToString( EMT.L1 + EMT.VDELTA) sB = '1' else sV = EmtLenToString( ParkV) sB = '2' end sOut = 'M112 P1='..EmtLenToString( EMT.L1, 3)..' P3='..sA..' P4='..sB..' P5=0 P6='..sY..' P7='..sV..' P9='..GetFmaxClamp() ParkLine( sOut) EMT.LOAD = false -- emissione prime linee speciali e linee parcheggiate EmitStartValues() EmtOutput( ';LISTA = ' .. tostring( EMT.PRODID)) EmitParkedLines() -- altrimenti lavorazione successiva else -- eventuale G111 --for i = 1, #EMT.AUXCMD do -- EmtOutput( '( ' .. EMT.AUXCMD[i] .. ' )') --end EMT.AUXCMD = {} for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end if #EMT.AUXSTR > 0 then if not ( EMT.POSTROT or EMT.RELOAD) then EmtOutput( 'M111 P1=20') EmtOutput( 'M111 P1=30') else EmtOutput( 'M111 P1=21') EmtOutput( 'M111 P1=31') end end EMT.AUXSTR = {} local sY, sA if EMT.YDELTA then sY = EmtLenToString( EMT.L1 - ( EMT.X_OFF or 0) + EMT.YDELTA) sA = '1' else sY = EmtLenToString( EgtIf( EMT.YPOS, EMT.YPOS, ParkY)) sA = '2' end local sV, sB if EMT.VDELTA then sV = EmtLenToString( EMT.L1 - ( EMT.X_OFF or 0) + EMT.VDELTA) sB = '1' else sV = EmtLenToString( ParkV) sB = '2' end -- se taglio di coda senza residuo da scaricare, emetto M175 per accelerare il carico della barra successiva if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Cut') and ( IsEndPhase( EMT.PHASE+1) or IsEnd2Phase( EMT.PHASE+1)) then EmtOutput( 'M175') end if bHeadFirst then sOut = 'M101 P1=3' EmtOutput( sOut) end sOut = 'M112 P1=' .. EmtLenToString( EMT.L1, 3) ..' P3='..sA..' P4='..sB..' P6='..sY..' P7='..sV..' P9=' .. GetFmaxClamp() EmtOutput( sOut) if not bHeadFirst then sOut = 'M101 P1=2' EmtOutput( sOut) sOut = 'M101 P1=3' EmtOutput( sOut) end EMT.POSTROT = false EMT.RELOAD = false EMT.RELOAD2 = nil end -- se taglio di separazione prima di scarico a caduta, emissione stop tappeto scarico trucioli if EMT.PREFALLCUT then EmtOutput( 'M29') EMT.PREFALLCUT = nil end EMT.REFLOC = 0 EMT.MCHFIRST = false EMT.ZMAX = false -- se alto in Z (non serve l'avvicinamento finale) if EMT.FLAG == 2 then -- aggiorno valori come precedenti EMT.TLAST = EMT.L1b EmtUpdatePrev() return -- altrimenti ripristino i valori originali degli assi else MyRestoreAxes() end end -- se standard if EMT.FLAG == 0 or EMT.FLAG == 1 or EMT.FLAG == 2 then -- se necessario, impostazione riferimento locale if EMT.REFLOC == 0 then -- calcolo per piano generico CalcInterpPlane() EMT.REFLOC = 1 -- trasformo i punti nel piano MyAdjustLinearAxes() EmtAdjustRotaryAxes() EMT.L1p = nil EMT.L2p = nil EMT.L3p = nil EmtOutput( 'M102 P1=' .. GetFaceCode()) EmtOutput( 'M98') sOut = 'M6 T1' .. AdjustToolKinematic() .. AdjustTcPos( true) EmtOutput( sOut) EmtOutput( 'G24' .. EMT.IPLGLSTR) -- forzo successiva emissione assi rotanti EMT.R1p = nil EMT.R2p = nil else MyAdjustLinearAxes() EmtAdjustRotaryAxes() end -- emissione movimento local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3').. EmtGetAxis('R2')..EmtGetAxis('R1') EmtOutput( sOut) -- se altrimenti risalita a Z max a fine lavorazione elseif EMT.FLAG == 3 then EMT.REFLOC = nil EMT.IPLGL = false MyAdjustLinearAxes() EmtAdjustRotaryAxes() EmitZmax( true) EMT.ZMAX = true -- se altrimenti movimento in Home elseif EMT.FLAG == 4 then -- non previsto -- se altrimenti rotazione a Z max elseif EMT.FLAG == 5 then -- viene gestito all'inizio della lavorazione successiva -- altrimenti errore else error( "Unknown Rapid flag") end -- aggiorno valori come precedenti EMT.TLAST = EMT.L1b EmtUpdatePrev() end --------------------------------------------------------------------- function OnLinear() MyBackupAxes() EMT.TLAST = EMT.L1 -- se necessario, impostazione riferimento locale if EMT.REFLOC == 0 then -- calcolo per piano generico CalcInterpPlane() EMT.REFLOC = 1 -- salvo posizione attuale local OldL1 = EMT.L1 local OldL2 = EMT.L2 local OldL3 = EMT.L3 -- imposto posizione precedente (non contiene l'offset in X per sovramateriale di testa EMT.X_OFF) EMT.L1 = EMT.L1o EMT.L2 = EMT.L2o EMT.L3 = EMT.L3o -- trasformo i punti nel piano MyAdjustLinearAxes() EmtAdjustRotaryAxes() EMT.L1p = nil EMT.L2p = nil EMT.L3p = nil EmtOutput( 'M102 P1=' .. GetFaceCode()) EmtOutput( 'M98') local sOut = 'M6 T1' .. AdjustToolKinematic() .. AdjustTcPos( true) EmtOutput( sOut) EmtOutput( 'G24' .. EMT.IPLGLSTR) -- emissione movimento EMT.R1p = nil EMT.R2p = nil sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3').. EmtGetAxis('R2')..EmtGetAxis('R1') EmtOutput( sOut) -- ripristino posizione attuale EMT.L1 = OldL1 EMT.L2 = OldL2 EMT.L3 = OldL3 end -- se primo movimento in feed della lavorazione, dichiaro inizio lavorazione if EMT.MCHFIRSTFEED then EMT.MCHFIRSTFEED = nil EmtOutput( 'M97') end -- aggiustamento valori MyAdjustLinearAxes() EmtAdjustRotaryAxes() -- valori degli assi local sL1, bL1 = EmtGetAxis( 'L1') local sL2, bL2 = EmtGetAxis( 'L2') local sL3, bL3 = EmtGetAxis( 'L3') local sR1, bR1 = EmtGetAxis( 'R1') local sR2, bR2 = EmtGetAxis( 'R2') local sAxes = sL1 .. sL2 .. sL3 .. sR2 .. sR1 -- se nulla da emettere, esco if #sAxes == 0 then return end -- aggiungo feed local sFeed = EmtGetFeed() -- emetto linea EmtOutput( "G1"..sAxes..sFeed) -- arresto preciso in angoli di fresature per utensili (non penne) di piccolo diametro if EMT.MCHTYPE == MCH_MY.MILLING and EMT.TTOTDIAM < 15 and abs( EMT.S) > 1000 and ( bL1 or bL2) and not bL3 then EmtOutput( 'G9') -- arresto preciso in fondo al foro elseif EMT.FLAG == 101 then EmtOutput( 'G9') end -- aggiorno valori come precedenti EmtUpdatePrev() end --------------------------------------------------------------------- function OnArc() MyBackupAxes() EMT.TLAST = EMT.L1 -- se primo movimento in feed della lavorazione, dichiaro inizio lavorazione if EMT.MCHFIRSTFEED then EMT.MCHFIRSTFEED = nil EmtOutput( 'M97') end -- non modale su archi EmtResetPrevLinear() -- aggiustamento valori MyAdjustLinearAxes() EmtAdjustRotaryAxes() -- valori degli assi local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3').. EmtGetAxis('R2')..EmtGetAxis('R1') -- se nulla da emettere, esco if string.len( sAxes) == 0 then return end -- valori delle coordinate del centro EmtAdjustCenterAxes() -- coordinate centro (per ora solo archi nel piano XY) --local sCen = ' ' .. EMT.C1t .. EmtLenToString(EMT.C1,3) .. -- ' ' .. EMT.C2t .. EmtLenToString(EMT.C2,3) -- raggio local sRad = ' ' .. EMT.RRt .. EmtLenToString( EMT.RR, EMT.DECNUM) -- aggiungo feed local sFeed = EmtGetFeed() -- tipo arco local sArc = 'G' .. EgtNumToString(EMT.MOVE,0) -- emetto arco EmtOutput( sArc..sAxes..sRad..sFeed) -- aggiorno valori come precedenti EmtUpdatePrev() end --------------------------------------------------------------------- function CalcDinamicaPinze( dH, dS, dL) local MinTempoAcc = 0.3 -- [s] local MaxTempoAcc = 4.0 -- [s] local KgMtCubo= WoodDensity or 550 -- densità legno [Kg / metro cubo] local Massa = ( dH * dS * dL * KgMtCubo ) / 1e9 -- massa [Kg] local FMaxPinze = EMT.FMAXPINZE -- Feed massima pinze [mm/min] local ForzaAttrito = 350 * 9.8 * 0.2 -- Forza chiusura pinze [Kgf] * g * Coeff_Attrito -> [N] local TempoAcc = ( ( Massa * FMaxPinze) / ( 60 * ForzaAttrito) / 1000) if ( TempoAcc < MinTempoAcc) then TempoAcc = MinTempoAcc end if ( TempoAcc > MaxTempoAcc) then TempoAcc = MaxTempoAcc end local AccMaxPinze = FMaxPinze / ( 60 * MinTempoAcc) local AccPinze = FMaxPinze / ( 60 * TempoAcc) local RidFeed = 100 / Massa * 100 if RidFeed > 100 then RidFeed = 100 elseif RidFeed < 10 then RidFeed = 10 end return TempoAcc * 1000, MinTempoAcc * 1000, RidFeed end --------------------------------------------------------------------- function CalcCharStatus( sCmd, bSkipPress) -- aperto if sCmd == '0' then return '1' -- chiuso elseif sCmd == '1' then return '2' -- chiuso con pressore attivato elseif sCmd == '2' then return EgtIf( bSkipPress, '2', '0') end end --------------------------------------------------------------------- function PrepareLoad( sCmd, bStart) local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- se inizio if EMT.AUXIND == 1 then -- imposto stato pinze EMT.SA = ' P4=111' EMT.SB = ' P5=112' EMT.SC = ' P6=141' EMT.SD = ' P7=141' EMT.SE = ' P8=0' end -- se dichiarazione inizio riposizionamento carrelli if Cmd[2] == 'CARR_MOVE' then if bStart then EMT.RELOAD = false else EMT.RELOAD2 = true end for i = 1, #EMT.AUXSTR do EMT.AUXSTR[i] = string.gsub( EMT.AUXSTR[i], 'P1=11', 'P1=10') end end elseif Cmd[1] == '1' then local sMsg = Cmd[2] .. Cmd[3] table.insert( EMT.AUXCMD, sMsg) if Cmd[2] ~= 'Z' then local sPar2 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') local sOut = 'M111 P1=10'..sPar2..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) if Cmd[2] == 'Y' then EMT.YPOS = tonumber( Cmd[3]) end end elseif Cmd[1] == '2' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] table.insert( EMT.AUXCMD, sMsg) if Cmd[2] == 'Y' then local sYTaking = ' P2='..EmtLenToString( Cmd[3] + TurnerOffs) local sOut = 'M111 P1=11' .. sYTaking .. ' P4=75 P5=110 P8=0 P9=' .. GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) SetStartValue( 4, Cmd[3] + TurnerOffs) SetStartValue( 5, 110) end elseif Cmd[1] == '3' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] table.insert( EMT.AUXCMD, sMsg) local sPar2 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') local sPar4 = EgtIf( Cmd[4] == 'Y', ' P2=', ' P3=') local sPar6 = EgtIf( Cmd[6] == 'Y', ' P2=', ' P3=') local sOut = 'M111 P1=10'..(EgtIf( Cmd[2] ~= 'T', sPar2 .. Cmd[3], '')).. (EgtIf( Cmd[4] ~= 'T', sPar4 .. Cmd[5], '')).. (EgtIf( Cmd[6] ~= 'T', sPar6 .. Cmd[7], '')).. EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) elseif Cmd[1] == '11' then local sMsg = 'PY' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' P5=11' .. CalcCharStatus( Cmd[2]) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SB, sVal) end EMT.SA = ' P4=11' .. CalcCharStatus( Cmd[2]) EMT.SB = ' P5=11' .. CalcCharStatus( Cmd[2]) EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=1', ' P8=2') elseif Cmd[1] == '12' then local sMsg = 'PV' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' P7=14' .. CalcCharStatus( Cmd[2]) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) end EMT.SC = ' P6=14' .. CalcCharStatus( Cmd[2]) EMT.SD = ' P7=14' .. CalcCharStatus( Cmd[2]) EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=2', ' P8=1') elseif Cmd[1] == '21' then local nYDelta = tonumber( Cmd[2]) local nVDelta = tonumber( Cmd[3]) if nYDelta > 0 and nVDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nVDelta elseif nYDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nil elseif nVDelta > 0 then EMT.YDELTA = nil EMT.VDELTA = nVDelta end if not FindM111P4EQ76( EMT.AUXSTR) then local sYLoad = ' P2=' .. EmtLenToString( LoadT) local sOut = 'M111 P1=11' .. sYLoad .. ' P4=76 P5=110 P8=0 P9=' .. GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) end end end --------------------------------------------------------------------- function PrepareMoveChar( sCmd) local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- se inizio if EMT.AUXIND == 1 then -- imposto stato pinze EMT.SA = EgtIf( EMT.YDELTA, ' P4=112', ' P4=111') EMT.SB = EgtIf( EMT.YDELTA, ' P5=112', ' P5=111') EMT.SC = EgtIf( EMT.VDELTA, ' P6=142', ' P6=141') EMT.SD = EgtIf( EMT.VDELTA, ' P7=142', ' P7=141') EMT.SE = EgtIf( EMT.YDELTA, ' P8=1', ' P8=2') end elseif Cmd[1] == '1' then local sMsg = Cmd[2] .. Cmd[3] table.insert( EMT.AUXCMD, sMsg) if Cmd[2] ~= 'Z' then local sPar2 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') local sOut = 'M111 P1=10'..sPar2..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) if Cmd[2] == 'Y' then EMT.YPOS = tonumber( Cmd[3]) end end elseif Cmd[1] == '2' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] table.insert( EMT.AUXCMD, sMsg) local sPar2 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') local sPar4 = EgtIf( Cmd[4] == 'Y', ' P2=', ' P3=') local sOut = 'M111 P1=10'..(EgtIf( Cmd[2] ~= 'T', sPar2 .. Cmd[3], '')).. (EgtIf( Cmd[4] ~= 'T', sPar4 .. Cmd[5], '')).. EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) elseif Cmd[1] == '3' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] table.insert( EMT.AUXCMD, sMsg) local sPar2 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') local sPar4 = EgtIf( Cmd[4] == 'Y', ' P2=', ' P3=') local sPar6 = EgtIf( Cmd[6] == 'Y', ' P2=', ' P3=') local sOut = 'M111 P1=10'..(EgtIf( Cmd[2] ~= 'T', sPar2 .. Cmd[3], '')).. (EgtIf( Cmd[4] ~= 'T', sPar4 .. Cmd[5], '')).. (EgtIf( Cmd[6] ~= 'T', sPar6 .. Cmd[7], '')).. EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) elseif Cmd[1] == '11' then local sMsg = 'PY' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' P5=11' .. CalcCharStatus( Cmd[2]) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SB, sVal) end EMT.SA = ' P4=11' .. CalcCharStatus( Cmd[2]) EMT.SB = ' P5=11' .. CalcCharStatus( Cmd[2]) EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=1', ' P8=2') elseif Cmd[1] == '12' then local sMsg = 'PV' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' P7=14' .. CalcCharStatus( Cmd[2]) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) end EMT.SC = ' P6=14' .. CalcCharStatus( Cmd[2]) EMT.SD = ' P7=14' .. CalcCharStatus( Cmd[2]) EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=2', ' P8=1') elseif Cmd[1] == '21' then local nYDelta = tonumber( Cmd[2]) local nVDelta = tonumber( Cmd[3]) if nYDelta > 0 and nVDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nVDelta elseif nYDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nil elseif nVDelta > 0 then EMT.YDELTA = nil EMT.VDELTA = nVDelta end end end --------------------------------------------------------------------- function PrepareResidue( sCmd) local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- se non è scarico if Cmd[2] ~= 'Unloading' then -- se inizio o subito dopo, imposto stato iniziale pinze if EMT.AUXIND <= 2 then EMT.SA = EgtIf( EMT.YDELTA, ' P4=112', ' P4=111') EMT.SB = EgtIf( EMT.YDELTA, ' P5=112', ' P5=111') EMT.SC = EgtIf( EMT.VDELTA, ' P6=142', ' P6=141') EMT.SD = EgtIf( EMT.VDELTA, ' P7=142', ' P7=141') EMT.SE = EgtIf( EMT.YDELTA, ' P8=1', ' P8=2') end else EMT.UNL = true end elseif Cmd[1] == '1' then local sMsg = Cmd[2] .. Cmd[3] table.insert( EMT.AUXCMD, sMsg) if Cmd[2] ~= 'Z' then local sOut local sPar2 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') if not EMT.UNL then sOut = 'M111 P1=10'..sPar2..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() else sOut = 'M111 P1=10'..sPar2..Cmd[3]..' P6=141 P7=84 P8=0 P9='..GetFmaxClamp() end table.insert( EMT.AUXSTR, sOut) end elseif Cmd[1] == '2' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] table.insert( EMT.AUXCMD, sMsg) local sPar2 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') local sPar4 = EgtIf( Cmd[4] == 'Y', ' P2=', ' P3=') local sOut = 'M111 P1=10'..(EgtIf( Cmd[2] ~= 'T', sPar2 .. Cmd[3], '')).. (EgtIf( Cmd[4] ~= 'T', sPar4 .. Cmd[5], '')).. EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) elseif Cmd[1] == '3' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] table.insert( EMT.AUXCMD, sMsg) local sPar2 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') local sPar4 = EgtIf( Cmd[4] == 'Y', ' P2=', ' P3=') local sPar6 = EgtIf( Cmd[6] == 'Y', ' P2=', ' P3=') local sOut = 'M111 P1=10'..(EgtIf( Cmd[2] ~= 'T', sPar2 .. Cmd[3], '')).. (EgtIf( Cmd[4] ~= 'T', sPar4 .. Cmd[5], '')).. (EgtIf( Cmd[6] ~= 'T', sPar6 .. Cmd[7], '')).. EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) elseif Cmd[1] == '11' then local sMsg = 'PY' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' P5=11' .. CalcCharStatus( Cmd[2], true) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SB, sVal) end EMT.SA = ' P4=11' .. CalcCharStatus( Cmd[2], true) EMT.SB = ' P5=11' .. CalcCharStatus( Cmd[2], true) EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=1', ' P8=2') elseif Cmd[1] == '12' then local sMsg = 'PV' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' P7=14' .. CalcCharStatus( Cmd[2], true) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) end EMT.SC = ' P6=14' .. CalcCharStatus( Cmd[2], true) EMT.SD = ' P7=14' .. CalcCharStatus( Cmd[2], true) EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=2', ' P8=1') elseif Cmd[1] == '21' then local nYDelta = tonumber( Cmd[2]) local nVDelta = tonumber( Cmd[3]) if nYDelta > 0 and nVDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nVDelta elseif nYDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nil elseif nVDelta > 0 then EMT.YDELTA = nil EMT.VDELTA = nVDelta end end end --------------------------------------------------------------------- function PrepareSplit( sCmd) local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- non interessa elseif Cmd[1] == '1' then local sMsg = Cmd[2] .. Cmd[3] table.insert( EMT.AUXCMD, sMsg) if Cmd[2] == 'Y' then local sOut = 'M111 P1=10'..' P2='..Cmd[3]..' P4=112 P5=112 P6=142 P7=142 P8=2 P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) EMT.YPOS = tonumber( Cmd[3]) end elseif Cmd[1] == '21' then local nYDelta = tonumber( Cmd[2]) local nVDelta = tonumber( Cmd[3]) if nYDelta > 0 and nVDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nVDelta elseif nYDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nil elseif nVDelta > 0 then EMT.YDELTA = nil EMT.VDELTA = nVDelta end end end --------------------------------------------------------------------- function PrepareUnload( sCmd) local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- non interessa elseif Cmd[1] == '1' then local sMsg = Cmd[2] .. Cmd[3] table.insert( EMT.AUXCMD, sMsg) if Cmd[2] == 'V' then -- se non è ultima fase c'è una barra sulla pinza Y (1) local sP1 = EgtIf( EMT.CHY_ON, '10', '12') local sP7 = '84' if not EMT.U_STD then sP7 = EgtIf( EMT.U_MAN ~= 1, '85', '114') EMT.U_MAN = EgtIf( EMT.U_MAN == 1, nil, 1) end local sP8 = EgtIf( EMT.PHASE == EgtGetPhaseCount() or IsEnd2Phase( EMT.PHASE), '0', '1') local sOut = 'M111 P1='..sP1..' P3='..Cmd[3]..' P6=141 P7='..sP7..' P8='..sP8..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) end elseif Cmd[1] == '2' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] table.insert( EMT.AUXCMD, sMsg) if Cmd[4] == 'V' then -- se non è ultima fase c'è una barra sulla pinza Y (1) local sP1 = EgtIf( EMT.CHY_ON, '10', '12') local sP45 = EgtIf( EMT.PHASE == EgtGetPhaseCount() or IsEnd2Phase( EMT.PHASE), '111', '112') local sOut = 'M111 P1='..sP1..' P3='..Cmd[5]..' P4=' .. sP45 .. ' P5=' .. sP45 .. ' P6=142 P7=141 P8=2 P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) EMT.U_STD = true end elseif Cmd[1] == '3' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] table.insert( EMT.AUXCMD, sMsg) elseif Cmd[1] == '11' then local sMsg = 'PY' .. EgtIf( Cmd[2] == '0', ' 0', ' 1') table.insert( EMT.AUXCMD, sMsg) elseif Cmd[1] == '12' then local sMsg = 'PV' .. EgtIf( Cmd[2] == '0', ' 0', ' 1') table.insert( EMT.AUXCMD, sMsg) elseif Cmd[1] == '21' then -- non interessa end end --------------------------------------------------------------------- function PreparePreRotation( sCmd) local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- se inizio o subito dopo, imposto stato iniziale pinze if EMT.AUXIND <= 2 then EMT.SA = EgtIf( EMT.YDELTA, ' P4=112', ' P4=111') EMT.SB = EgtIf( EMT.YDELTA, ' P5=112', ' P5=111') EMT.SC = EgtIf( EMT.VDELTA, ' P6=142', ' P6=141') EMT.SD = EgtIf( EMT.VDELTA, ' P7=142', ' P7=141') EMT.SE = EgtIf( EMT.YDELTA, ' P8=1', ' P8=2') end -- se è pre-rotazione if Cmd[2] == 'Pre-Rotation' then EMT.PREROT = true elseif Cmd[2] == 'SplitRot' then EMT.SPLITROT = true EMT.SE = ' P8=2' end elseif Cmd[1] == '1' then local sMsg = Cmd[2] .. Cmd[3] table.insert( EMT.AUXCMD, sMsg) if Cmd[2] ~= 'Z' then local sOut local sP23 = EgtIf( Cmd[2] == 'Y', ' P2=', ' P3=') if not EMT.PREROT then sOut = 'M111'..' P1=10'..sP23..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() else sOut = 'M111 P1=10'..sP23..Cmd[3]..' P4=86 P5=87 P6=141 P8=0 P9='..GetFmaxClamp() end table.insert( EMT.AUXSTR, sOut) end elseif Cmd[1] == '2' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] table.insert( EMT.AUXCMD, sMsg) local sP2 = '' local sP3 = '' if Cmd[2] == 'Y' then sP2 = ' P2=' .. Cmd[3] elseif Cmd[4] == 'Y' then sP2 = ' P2=' .. Cmd[5] end if Cmd[2] == 'V' then sP3 = ' P3=' .. Cmd[3] elseif Cmd[4] == 'V' then sP3 = ' P3=' .. Cmd[5] end local sOut = 'M111 P1=10'..sP2..sP3..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) elseif Cmd[1] == '3' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] table.insert( EMT.AUXCMD, sMsg) local sP2 = '' local sP3 = '' if Cmd[2] == 'Y' then sP2 = ' P2=' .. Cmd[3] elseif Cmd[4] == 'Y' then sP2 = ' P2=' .. Cmd[5] elseif Cmd[6] == 'Y' then sP2 = ' P2=' .. Cmd[7] end if Cmd[2] == 'V' then sP3 = ' P3=' .. Cmd[3] elseif Cmd[4] == 'V' then sP3 = ' P3=' .. Cmd[5] elseif Cmd[6] == 'V' then sP3 = ' P3=' .. Cmd[7] end local sOut = 'M111 P1=10'..sP2..sP3..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) elseif Cmd[1] == '11' then local sMsg = 'PY' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' P5=11' .. CalcCharStatus( Cmd[2], true) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SB, sVal) end if EMT.SPLITROT then EMT.SA = EgtIf( Cmd[2] ~= '0', ' P4=11' .. CalcCharStatus( Cmd[2], true), ' P4=86') EMT.SB = EgtIf( Cmd[2] ~= '0', ' P5=11' .. CalcCharStatus( Cmd[2], true), ' P5=87') EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=1', ' P8=2') else EMT.SA = ' P4=11' .. CalcCharStatus( Cmd[2], true) EMT.SB = ' P5=11' .. CalcCharStatus( Cmd[2], true) EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=1', ' P8=2') end elseif Cmd[1] == '12' then local sMsg = 'PV' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' P7=14' .. CalcCharStatus( Cmd[2], true) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) end EMT.SC = ' P6=14' .. CalcCharStatus( Cmd[2], true) EMT.SD = ' P7=14' .. CalcCharStatus( Cmd[2], true) EMT.SE = EgtIf( Cmd[2] ~= '0', ' P8=2', ' P8=1') elseif Cmd[1] == '21' then local nYDelta = tonumber( Cmd[2]) local nVDelta = tonumber( Cmd[3]) if nYDelta > 0 and nVDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nVDelta elseif nYDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nil elseif nVDelta > 0 then EMT.YDELTA = nil EMT.VDELTA = nVDelta end end end --------------------------------------------------------------------- function PreparePostRotation( sCmd) -- è sostanzialmente un carico local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- se inizio if EMT.AUXIND == 1 then -- imposto stato pinze EMT.SB = ' P5=112' end -- se dichiarazione inizio riposizionamento carrelli if Cmd[2] == 'CARR_MOVE' then EMT.POSTROT = false for i = 1, #EMT.AUXSTR do EMT.AUXSTR[i] = string.gsub( EMT.AUXSTR[i], 'P1=11', 'P1=10') end end elseif Cmd[1] == '1' then local sMsg = Cmd[2] .. Cmd[3] table.insert( EMT.AUXCMD, sMsg) elseif Cmd[1] == '2' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] table.insert( EMT.AUXCMD, sMsg) if Cmd[2] == 'Y' then -- tolgo eventuale sovramateriale presente sul pezzo in posizione iniziale (la misura laser è ora col finito) -- su NUM si pone E80058=0, con TPA non sembra necessaria una equivalente impostazione local sYTaking = ' P2='..EmtLenToString( Cmd[3] - EMT.HOVM) local sOut = 'M111 P1=11'..sYTaking..' P4=75 P5=110 P8=0 P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) end elseif Cmd[1] == '3' then local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] table.insert( EMT.AUXCMD, sMsg) elseif Cmd[1] == '11' then local sMsg = 'PY' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) EMT.SB = ' P5=11' .. CalcCharStatus( Cmd[2]) elseif Cmd[1] == '12' then local sMsg = 'PV' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) elseif Cmd[1] == '21' then local nYDelta = tonumber( Cmd[2]) local nVDelta = tonumber( Cmd[3]) if nYDelta > 0 and nVDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nVDelta elseif nYDelta > 0 then EMT.YDELTA = nYDelta EMT.VDELTA = nil elseif nVDelta > 0 then EMT.YDELTA = nil EMT.VDELTA = nVDelta end local sYLoad = ' P2='..EmtLenToString( LoadT) local sOut = 'M111 P1=11'..sYLoad..' P4=76'..EMT.SB..' P8=0 P9='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) end end --------------------------------------------------------------------- function MyBackupAxes() EMT.L1b = EMT.L1 EMT.L2b = EMT.L2 EMT.L3b = EMT.L3 EMT.R1b = EMT.R1 EMT.R2b = EMT.R2 EMT.R3b = EMT.R3 EMT.R4b = EMT.R4 EMT.RRb = EMT.RR EMT.C1b = EMT.C1 EMT.C2b = EMT.C2 EMT.C3b = EMT.C3 end --------------------------------------------------------------------- function MyRestoreAxes() EMT.L1 = EMT.L1b EMT.L2 = EMT.L2b EMT.L3 = EMT.L3b EMT.R1 = EMT.R1b EMT.R2 = EMT.R2b EMT.R3 = EMT.R3b EMT.R4 = EMT.R4b EMT.RR = EMT.RRb EMT.C1 = EMT.C1b EMT.C2 = EMT.C2b EMT.C3 = EMT.C3b end --------------------------------------------------------------------- function MyAdjustLinearAxes() local MyL1o = EMT.L1 local MyL2o = EMT.L2 local MyL3o = EMT.L3 if EMT.REFLOC then local vtE if EMT.HEAD == 'H1' or EMT.HEAD == 'H2' then local Len = EMT.TLEN + EgtIf( EMT.HEAD == 'H1', MillOffs, abs( SawOffs)) local LenRef = MillOffs vtE = Vector3d( EMT.EXTR) * Len - Z_AX() * LenRef elseif EMT.HEAD == 'H3' then local LenAux = ( EMT.TDIST or ChSawLen) + MillOffs local LenRef = MillOffs local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3) vtE = vtAux * LenAux - Z_AX() * LenRef elseif EMT.HEAD == 'H5' then local Len = EMT.TLEN + AngTr1Len local LenAux = MillOffs + AngTr1Offs local LenRef = MillOffs local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2) vtE = Vector3d( EMT.EXTR) * Len + vtAux * LenAux - Z_AX() * LenRef else EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD) end EMT.L1 = EMT.L1 - vtE:getX() EMT.L2 = EMT.L2 - DeltaTabY - vtE:getY() EMT.L3 = EMT.L3 - DeltaTabZ - vtE:getZ() end if EMT.X_OFF then EMT.L1 = EMT.L1 + EMT.X_OFF end EmtAdjustLinearAxes() EMT.L1o = MyL1o EMT.L2o = MyL2o EMT.L3o = MyL3o if not EMT.REFLOC then EMT.L2 = -EMT.L2 EMT.L1t = 'Y' EMT.L2t = 'X' else EMT.L1t = 'X' EMT.L2t = 'Y' end end --------------------------------------------------------------------- function AdjustToolKinematic() if EMT.HEAD == 'H1' or EMT.HEAD == 'H3' then return '01' elseif EMT.HEAD == 'H2' then return '02' elseif EMT.HEAD == 'H5' then return EgtIf( EMT.EXIT == 1, '11', '12') elseif EMT.HEAD == 'H6' then return EgtIf( EMT.EXIT == 1, '21', '22') else EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD) end end --------------------------------------------------------------------- function AdjustTcPos( bLen3) local sPos = EMT.TCPOS:gsub( 'T', '') if sPos == '91' then if EMT.EXIT == 2 then sPos = '92' end elseif sPos == '93' then if EMT.EXIT == 2 then sPos = '94' end elseif sPos == '101' and EMT.HEAD == 'H3' then if abs( EMT.R3 - 0) < 0.1 then sPos = '101' elseif abs( EMT.R3 - 270) < 0.1 then sPos = '102' elseif abs( EMT.R3 - 180) < 0.1 then sPos = '103' elseif abs( EMT.R3 - 90) < 0.1 then sPos = '104' else EmtSetLastError( 1210, 'Chain saw orientation not allowed') end elseif sPos == '111' and EMT.HEAD == 'H3' then if abs( EMT.R3 - 0) < 0.1 then sPos = '111' elseif abs( EMT.R3 - 270) < 0.1 then sPos = '112' elseif abs( EMT.R3 - 180) < 0.1 then sPos = '113' elseif abs( EMT.R3 - 90) < 0.1 then sPos = '114' else EmtSetLastError( 1210, 'Mortiser orientation not allowed') end end if bLen3 then if #sPos == 1 then sPos = '00' .. sPos elseif #sPos == 2 then sPos = '0' .. sPos end end -- salvo posizione EMT.PREVTCPOS = sPos return sPos end --------------------------------------------------------------------- function CalcInterpPlane() -- origine del piano local xS = EMT.START[1] + LoadT if EMT.X_OFF then xS = xS + EMT.X_OFF end local ptS = Point3d( xS, 0, 0) -- calcolo per piano generico local vtE if EMT.HEAD ~= 'H3' then vtE = Vector3d( EMT.EXTR) else vtE = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3) end EMT.IPLGLFR = Frame3d( ptS, vtE) --EmtOutput( 'IPLGLFR='..tostring(EMT.IPLGLFR)) local vtX = EMT.IPLGLFR:getVersX() local vtY = EMT.IPLGLFR:getVersY() local vtZ = EMT.IPLGLFR:getVersZ() EMT.IPLGLSTR = ' X0 Y' .. EmtLenToString( xS, EMT.DECNUM) .. ' Z0' .. ' A' .. EgtNumToString( - vtX:getY(), 6) .. ' B' .. EgtNumToString( vtX:getX(), 6) .. ' C' .. EgtNumToString( vtX:getZ(), 6) .. ' I' .. EgtNumToString( - vtY:getY(), 6) .. ' J' .. EgtNumToString( vtY:getX(), 6) .. ' K' .. EgtNumToString( vtY:getZ(), 6) .. ' P' .. EgtNumToString( - vtZ:getY(), 6) .. ' Q' .. EgtNumToString( vtZ:getX(), 6) .. ' R' .. EgtNumToString( vtZ:getZ(), 6) EMT.IPLGL = true end --------------------------------------------------------------------- function VerifyEmitRotation() -- recupero le rotazioni delle fasi corrente e precedente local nRot = GetPhaseRot( EMT.PHASE) local nPrevRot = GetPhaseRot( EMT.PHASE - 1) -- se sono uguali non devo fare alcunchè if nRot == nPrevRot then return false end -- rotazione automatica o manuale (sempre con il medesimo comando) local nDeltaRot = nRot - nPrevRot local sOut = 'M180 P1=' .. tostring( nDeltaRot) EmtOutput( sOut) return true end --------------------------------------------------------------------- function GetFaceCode() if EMT.YDELTA and EMT.VDELTA then return '3' elseif EMT.YDELTA then return '6' else return '5' end end --------------------------------------------------------------------- function EmitZmax( bReset) if bReset then EmtOutput( 'G27') EmtOutput( 'M6 T000000') EmtOutput( 'M99') end EmtOutput( 'M116') end --------------------------------------------------------------------- function GetFmaxClamp() return EmtLenToString( EMT.FMAXPINZE / 1000, 0) end --------------------------------------------------------------------- function FindM111P4EQ76( vStr) for i = 1, #vStr do if vStr[i]:find( 'M111', 1, true) and vStr[i]:find( 'P4=76', 1, true) then return true end end return false end --------------------------------------------------------------------- local ParkedLines = {} --------------------------------------------------------------------- function ParkLine( sLine) table.insert( ParkedLines, sLine) end --------------------------------------------------------------------- function EmitParkedLines() for i = 1, #ParkedLines do EmtOutput( ParkedLines[i]) end ParkedLines = {} end --------------------------------------------------------------------- local StartValues = {} --------------------------------------------------------------------- function SetStartValue( nI, dVal) StartValues[nI] = dVal end --------------------------------------------------------------------- function EmitStartValues() local sLine = '' for i = 1, 10 do sLine = sLine .. string.format( ';V%02d=', i) .. EgtNumToString( StartValues[i] or 0, 3) end EmtOutput( sLine) end --------------------------------------------------------------------- -- *** END GENERATION *** ---------------------------------------------------------------------