-- Processore macchina Saomad-KAIROS by EgalTech s.r.l. 2023/12/06 -- Con controllo numerico Siemens -- Variabili di modulo local MLE_INFO = 'Saomad-KAIROS.SIEMENS.mlpe ver.'..PP_VER..' by EgalWare s.r.l.' local TEST_USE = false --------------------------------------------------------------------- -- *** GENERATION *** --------------------------------------------------------------------- function OnStart() EMT.USETO1 = false -- abilitazione uso origine tavola EMT.MODAL = true -- abilitazione emissione modale EMT.INCHES = false -- unità di misura mm/inches 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.C1t = 'I=AC(' -- X centro arco, dopo valore chiudere la tonda EMT.C2t = 'J=AC(' -- Y centro arco, dopo valore chiudere la tonda EMT.C3t = 'K=AC(' -- Z centro arco, dopo valore chiudere la tonda EMT.RRt = 'CR=' -- raggio per arco EMT.FMAXPINZE = 45000 -- feed massima pinze end --------------------------------------------------------------------- function OnEnd() -- Ripristino fase iniziale come corrente EgtSetCurrPhase( 1) end --------------------------------------------------------------------- function OnProgramStart() -- Intestazioni if EMT.INFO then EmtOutput( ';'..EMT.INFO) else EmtOutput( ';Program Start') end EmtOutput( ';'.. MLE_INFO..'\n') -- Cerco primo utensile su testa 1 EMT.TOOL_1, EMT.TLEN_1 = FindFirstToolOnHead( 'H1') -- Dichiaro inizio EMT.FIRST = true EMT.TLAST = nil EMT.NSTEP = 0 end --------------------------------------------------------------------- function OnProgramEnd() -- 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' or EMT.AUXTYPE == 'R' then ; elseif EMT.AUXTYPE == 'U' then -- emissione conclusione pezzo precedente if EMT.PRODID then local sOut = ';Part End' EmtOutput( sOut) sOut= 'PRODUCTION('..tostring( EMT.PRODID)..','..tostring( EMT.PATTID)..','..tostring( EMT.CUTID)..',2)' EmtOutput( sOut) end end end EmtOutput( 'STOPRE') EmtOutput( '_STEP=0') EmtOutput( 'M30') 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 end --------------------------------------------------------------------- function OnToolData() -- tabella codice -> nome tipo utensile local tToolType = { [256] = 'DRILL', [257] = 'DRILL_L', [512] = 'SAW', [513] = 'SAW_F', [1024] = 'MILL', [1025] = 'MILL_NT', [1026] = 'POLISHING', [2048] = 'CHAINSAW', [4096] = 'CHISEL'} -- emissione dati utensile --local sOut = ';'..EMT.TCPOS..' L='..EmtLenToString( EMT.TLEN, 3)..' D='..EmtLenToString( EMT.TDIAM, 3)..' A='..EgtIf( EMT.TUSED, '1', '0')..' '..( tToolType[EMT.TTYPE] or 'NONE') local sOut = ';'..EMT.TCPOS..' L='..EmtLenToString( EMT.TLEN, 3)..' D='..EmtLenToString( EMT.TDIAM, 3)..' A='..EgtIf( EMT.TUSED, '1', '0')..' '..EMT.TOOL EmtOutput( sOut) end --------------------------------------------------------------------- function OnDispositionStart() --EmtOutput( '(Disposition '..EMT.DISPIND..' = '..EMT.DISPID..')') EMT.OPEISDISP = true -- Assegnazione parametri disposizione EMT.TPOS = EgtGetInfo( EMT.DISPID, 'TPOS', 'd') EMT.X1POS = EgtGetInfo( EMT.DISPID, 'YPOS', 'd') -- Se prima disposizione if EMT.PHASE == 1 then -- inizio programma EmtOutput( '\nRESTART') EmtOutput( 'STOPRE') EmtOutput( '_STEP=0') -- 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.X1DELTA = EMT.X1POS - LoadT EMT.X2DELTA = 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 -- dati della barra 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 -- se carico barra if EMT.LOAD then -- assegnazione dati barra local sOut = ';Bar Dimensions' EmtOutput( sOut) sOut = 'C_WIDTH='..EmtLenToString( HTrave, 3) EmtOutput( sOut) sOut = 'C_HEIGHT='..EmtLenToString( STrave, 3) EmtOutput( sOut) sOut = 'C_LENGTH='..EmtLenToString( LBarra, 3) EmtOutput( sOut) -- se altrimenti ricarico barra dopo rotazione speciale elseif EMT.RELOAD then local sOut = ';Bar Dimensions' EmtOutput( sOut) sOut = 'C_WIDTH='..EmtLenToString( HTrave, 3) EmtOutput( sOut) sOut = 'C_HEIGHT='..EmtLenToString( STrave, 3) EmtOutput( sOut) sOut = 'C_LENGTH='..EmtLenToString( LBarra, 3) EmtOutput( sOut) -- altrimenti recupero rimanenza else -- aggiorno dati aggancio carrelli alla trave EMT.X1DELTA = EMT.X1POS - LoadT EMT.X2DELTA = nil end -- Inizio produzione trave if IdTrave >= 0 then local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL 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 sOut = ';Part Start' EmtOutput( sOut) sOut= 'PRODUCTION('..tostring( EMT.PRODID)..','..tostring( EMT.PATTID)..','..tostring( EMT.CUTID)..',1)' EmtOutput( sOut) else EmtOutput( '') EmtOutput( ';REMAIN UNLOAD') EMT.PRODID = nil EMT.PATTID = nil EMT.CUTID = 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 EMT.CHAN2 = true 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 EMT.CHAN2 = true 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 EmitSpeedOff() EmtOutput( '') EmtOutput( ';PART UNLOAD') end for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end if #EMT.AUXSTR > 0 then EMT.CHAN2 = true -- emissione conclusione pezzo precedente if EMT.PRODID then local sOut = ';Part End' EmtOutput( sOut) sOut= 'PRODUCTION('..tostring( EMT.PRODID)..','..tostring( EMT.PATTID)..','..tostring( EMT.CUTID)..',2)' EmtOutput( sOut) 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 = string.sub( EMT.TCPOS, 2) 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 -- dichiaro utensile appena selezionato EMT.TSELECT = true end end --------------------------------------------------------------------- function OnToolDeselect() EmitSpeedOff() end --------------------------------------------------------------------- function OnMachiningStart() EMT.MCHNAME = EgtGetOperationName( EMT.MCHID) EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE) EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES) -- non ancora iniziata la lavorazione EMT.MCHFIRST = true EMT.FEEDFIRST = true -- 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 EmitSpeedOff() EmtOutput( ';PART SPLIT') elseif EMT.AUXTYPE == 'U' then if not EMT.ZMAX then EmitZmax() EMT.ZMAX = true end if IsLastMachining( EMT.MCHID) then EmitSpeedOff() end EmtOutput( ';PART UNLOAD') elseif EMT.AUXTYPE == 'P' then if EMT.PREROT then if not EMT.ZMAX then EmitZmax() EMT.ZMAX = true end EmtOutput( ';PART ROTATION') elseif EMT.FALL then if not EMT.ZMAX then EmitZmax() EMT.ZMAX = true end EmtOutput( ';FALL') else if not EMT.ZMAX then EmitZmax() EMT.ZMAX = true end EmtOutput( ';SPLIT 2') end end end for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end if #EMT.AUXSTR > 0 then EMT.CHAN2 = true if EMT.AUXTYPE == 'S' then ; elseif EMT.AUXTYPE == 'U' then -- emissione conclusione pezzo precedente if EMT.PRODID then local sOut = ';Part End' EmtOutput( sOut) sOut= 'PRODUCTION('..tostring( EMT.PRODID)..','..tostring( EMT.PATTID)..','..tostring( EMT.CUTID)..',2)' EmtOutput( sOut) end elseif EMT.AUXTYPE == 'P' then if EMT.FALL then -- emissione conclusione pezzo precedente if EMT.PRODID then local sOut = ';Part End' EmtOutput( sOut) sOut= 'PRODUCTION('..tostring( EMT.PRODID)..','..tostring( EMT.PATTID)..','..tostring( EMT.CUTID)..',2)' EmtOutput( sOut) end elseif not EMT.PREROT then ; end end end EMT.AUXSTR = {} EMT.AUXTYPE = nil EMT.U_STD = nil EMT.PREVTOOL = EMT.TOOL EMT.PREVR3 = EMT.R3 end --------------------------------------------------------------------- function OnPathStart() -- non ancora iniziata la lavorazione EMT.MCHFIRST = true -- primo posizionamento sempre in globale EMT.REFLOC = nil EMT.IPLGL = false -- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento) EMT.L1opp = EMT.L1op or EMT.L1 EMT.L2opp = EgtIf( EMT.TSELECT or not EMT.L2op, ParkY, EMT.L2op) EMT.L3opp = EgtIf( EMT.TSELECT or not EMT.L3op, ParkZ, EMT.L3op) EMT.R1pp = EgtIf( EMT.TSELECT or not EMT.R1p, ParkC, EMT.R1p) EMT.R2pp = EgtIf( EMT.TSELECT or not EMT.R2p, ParkA, EMT.R2p) EmtResetPrev() EMT.AUXCMD = {} EMT.AUXSTR = {} end --------------------------------------------------------------------- function OnPathEnd() 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 local sLateG101 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.X2DELTA) or ( DeltaT > GEO.EPS_SMALL and EMT.X1DELTA) then bHeadFirst = false end end -- sistemo movimenti MyAdjustLinearAxes() EmtAdjustRotaryAxes() -- verifico presenza movimento carrelli local bMoveChar = ( #EMT.AUXSTR > 0) -- carico if EMT.LOAD then EmtOutput( 'STOPRE') EMT.NSTEP = EMT.NSTEP + 10 local sStep = EgtNumToString( EMT.NSTEP, 0) EmtOutput( '_STEP='..sStep) -- eseguo carico EMT.AUXCMD = {} for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end EMT.AUXSTR = {} -- supporti in posizione intermedia sOut = 'SUPPORT(1,1)' EmtOutput( sOut) -- prima lavorazione sOut = EMT.MCHNAME..'/'..EMT.TOOL EmtOutput( '; *** ' .. sOut .. ' ***') EMT.LOAD = false -- altri casi else if not EMT.RELOAD and not EMT.ZMAX and #EMT.AUXSTR > 0 then EmitZmax() EMT.ZMAX = true EMT.PREVTOOL = EMT.TOOL end if bMoveChar then local bStoPre if EMT.CHAN2 then EmtOutput( 'WAIT_CHAN(2)') EmtOutput( 'STOPRE') bStoPre = true EMT.CHAN2 = nil end if EMT.TRAILON then EmtOutput( 'TRAILOF(X2,X1)') EmtOutput( 'TRANS') EmtOutput( 'STOPRE') bStoPre = true EMT.TRAILON = nil end if not bStoPre then EmtOutput( 'STOPRE') end EmtOutput( '') EMT.NSTEP = EMT.NSTEP + 10 local sStep = EgtNumToString( EMT.NSTEP, 0) EmtOutput( '_STEP='..sStep) end local sOut = EMT.MCHNAME..'/'..EMT.TOOL EmtOutput( '; *** ' .. sOut .. ' ***') -- movimento carrelli EMT.AUXCMD = {} for i = 1, #EMT.AUXSTR do EmtOutput( EMT.AUXSTR[i]) end EMT.AUXSTR = {} EMT.POSTROT = false EMT.RELOAD = false EMT.RELOAD2 = nil EMT.CHAN2 = bMoveChar end -- se utensile appena selezionato, lo devo dichiarare if EMT.TSELECT then EMT.TSELECT = nil if bMoveChar then local sStep = EgtNumToString( EMT.NSTEP, 0) EmtOutput( '_N'..sStep..':STOPRE') end local sOut = 'PRE_WORK(1,1,' .. EMT.TOOLSEL .. ','..EgtNumToString( EMT.S, 0) ..',,,,)' EmtOutput( sOut) EMT.SPEED_ON = true -- eventuali emissioni per ripartenza successiva al carico elseif bMoveChar then local sStep1 = EgtNumToString( EMT.NSTEP + 1, 0) EmtOutput( 'GOTOF '..'_N'..sStep1) local sStep = EgtNumToString( EMT.NSTEP, 0) EmtOutput( '_N'..sStep..':STOPRE') local sOut = 'PRE_WORK(1,1,' .. EMT.TOOLSEL .. ','..EgtNumToString( EMT.S, 0) ..',,,,)' EmtOutput( sOut) EMT.SPEED_ON = true EmtOutput( '_N'..sStep1..':STOPRE') end -- eventuale avvio mandrino (se non già avviato) EmitSpeedOn( EMT.S) -- primo posizionamento testa rispetto a 0M EmtResetPrev() if EMT.ZMAX then sOut = 'SUPA G0 D0 Z'..EgtNumToString( ParkZ, 3) else sOut = 'SUPA G0 D0' .. EmtGetAxis( 'L3') end EmtOutput( sOut) -- sega a catena da gestire if EMT.HEAD == 'H3' then EmtOutput( '!!! Chainsaw start movements to be calculated !!!') EgtOutLog( 'ERROR : CHAINSAW START MOVEMENTS TO BE CALCULATED !!!') end -- movimento YAC con interpolazione approssimata tramite F opportune per ogni asse --EmtOutput( string.format( '; Y:%.3f->%.3f A:%.3f->%.3f C::%.3f->%.3f', EMT.L2opp, EMT.L2, EMT.R2pp, EMT.R2, EMT.R1pp, EMT.R1)) local dFeedY, dFeedA, dFeedC = CalcFeedYAC( EMT.L2opp - EMT.L2, EMT.R2pp - EMT.R2, EMT.R1pp - EMT.R1) sOut = '_POSIZ_YAC('..EgtNumToString( EMT.L2, 3)..','..EgtNumToString( EMT.R2, 3)..','..EgtNumToString( EMT.R1, 3)..','.. EgtNumToString( dFeedY, 0)..','..EgtNumToString( dFeedA, 0)..','..EgtNumToString( dFeedC, 0)..')' EmtOutput( sOut) -- se necessario, attesa fine movimenti carrelli e presa assi relativi if bMoveChar then sOut = 'WAIT_CHAN(2)' EmtOutput( sOut) EMT.CHAN2 = nil if EMT.X1DELTA and EMT.X2DELTA then EmtOutput( 'GET(X1,X2)') EmtOutput( 'STOPRE') EmtOutput( 'TRAILON(X2,X1)') EMT.TRAILON = true elseif EMT.X1DELTA then EmtOutput( 'GET(X1)') elseif EMT.X2DELTA then EmtOutput( 'GET(X2)') end end -- assegnazione assi geometrici (GEOMAX) EmtOutput( 'TRANS') if EMT.X1DELTA then sOut = 'GEOAX(1,X1,2,Y1,3,Z1)' else sOut = 'GEOAX(1,X2,2,Y1,3,Z1)' end EmtOutput( sOut) EmtOutput( 'G90 G17') -- primo posizionamento carrello rispetto a 0M if EMT.X1DELTA then local dPosX1 = EMT.L1 + EMT.X1DELTA sOut = 'G1 X' .. EmtLenToString( dPosX1, 3) .. ' F' .. GetClampFeed( EMT.LB) EmtOutput( sOut) elseif EMT.X2DELTA then local dPosX2 = EMT.L1 + EMT.X2DELTA sOut = 'G1 X' .. EmtLenToString( dPosX2, 3) .. ' F' .. GetClampFeed( EMT.LB) EmtOutput( sOut) else EmtSetLastError( 1213, "Part to machine without charriots") end if EMT.ZMAX and EMT.L3 < ParkZ - 10 then sOut = 'SUPA G0 D0' .. EmtGetAxis( 'L3') EmtOutput( sOut) 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 del piano generico CalcInterpPlane() EMT.REFLOC = 1 -- emissione del piano generico EmtOutput( EMT.IPLGLSTR) end MyAdjustLinearAxes() EmtAdjustRotaryAxes() -- emissione movimento local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3') 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() 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 EmtSetLastError( 1212, "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 del piano generico CalcInterpPlane() EMT.REFLOC = 1 -- emissione del piano generico EmtOutput( EMT.IPLGLSTR) -- 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 -- emissione movimento local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3') EmtOutput( sOut) -- ripristino posizione attuale EMT.L1 = OldL1 EMT.L2 = OldL2 EMT.L3 = OldL3 end if EMT.FEEDFIRST then local sOut = 'M_OK(1,'..EgtNumToString( EMT.S, 0)..')' EmtOutput( sOut) EMT.FEEDFIRST = false end -- aggiustamento valori MyAdjustLinearAxes() EmtAdjustRotaryAxes() -- valori degli assi local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3') -- se nulla da emettere, esco if #sAxes == 0 then return end -- aggiungo feed local sFeed = EmtGetFeed() -- emetto linea EmtOutput( "G1"..sAxes..sFeed) -- aggiorno valori come precedenti EmtUpdatePrev() end --------------------------------------------------------------------- function OnArc() MyBackupAxes() EMT.TLAST = EMT.L1 if EMT.FEEDFIRST then local sOut = 'M_OK(1,'..EgtNumToString( EMT.S, 0)..')' EmtOutput( sOut) EMT.FEEDFIRST = false 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 #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,3) -- 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= 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 AccPinze, AccMaxPinze, RidFeed, TempoAcc 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 CalcFeedYAC( dDeltaY, dDeltaA, dDeltaC) local dTY = abs( dDeltaY) / FmaxY local dTA = abs( dDeltaA) / FmaxA local dTC = abs( dDeltaC) / FmaxC local dT = max( dTY, dTA, dTC) local dFeedY = FmaxY if dTY > 0.001 then dFeedY = FmaxY * dTY / dT end local dFeedA = FmaxA if dTA > 0.001 then dFeedA = FmaxA * dTA / dT end local dFeedC = FmaxC if dTC > 0.001 then dFeedC = FmaxC * dTC / dT end return dFeedY, dFeedA, dFeedC end --------------------------------------------------------------------- function PrepareLoad( sCmd, bStart) local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- se inizio if EMT.AUXIND == 1 then -- reset stato pinze EMT.X1STAT = 0 EMT.X2STAT = 0 end elseif Cmd[1] == '1' then elseif Cmd[1] == '2' then elseif Cmd[1] == '3' then elseif Cmd[1] == '11' then EMT.X1STAT = tonumber( Cmd[2]) elseif Cmd[1] == '12' then EMT.X2STAT = tonumber( Cmd[2]) elseif Cmd[1] == '21' then local dX1Delta = tonumber( Cmd[2]) local dX2Delta = tonumber( Cmd[3]) if dX1Delta > 0 and dX2Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = dX2Delta elseif dX1Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = nil elseif dX2Delta > 0 then EMT.X1DELTA = nil EMT.X2DELTA = dX2Delta end if EMT.X1DELTA and not EMT.X2DELTA then local sInfo = string.format( ';LOAD D1=%.1f', EMT.X1DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 1 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 0 local sRef1 = EmtLenToString( EMT.X1DELTA, 3) local sRef2 = EmtLenToString( ParkX1 + EMT.X1DELTA, 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2) 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 -- reset stato EMT.MCIND = 0 EMT.X1DLTP = EMT.X1DELTA EMT.X2DLTP = EMT.X2DELTA EMT.X1STAP = EgtIf( EMT.X1DELTA, 1, 0) EMT.X2STAP = EgtIf( EMT.X2DELTA, 1, 0) EMT.X1STAI = EMT.X1STAP EMT.X2STAI = EMT.X2STAP EMT.X1STAT = 0 EMT.X2STAT = 0 EMT.MCX1 = {} EMT.MCX2 = {} end elseif Cmd[1] == '1' then if Cmd[2] ~= 'Z' then EMT.MCIND = EMT.MCIND + 1 if Cmd[2] == 'X1' then EMT.MCX1[EMT.MCIND] = tonumber( Cmd[3]) EMT.MCX2[EMT.MCIND] = 0 elseif Cmd[2] == 'X2' then EMT.MCX1[EMT.MCIND] = 0 EMT.MCX2[EMT.MCIND] = tonumber( Cmd[3]) end end elseif Cmd[1] == '2' then EMT.MCIND = EMT.MCIND + 1 for i = 2, 4, 2 do if Cmd[i] == 'X1' then EMT.MCX1[EMT.MCIND] = tonumber( Cmd[i+1]) elseif Cmd[i] == 'X2' then EMT.MCX2[EMT.MCIND] = tonumber( Cmd[i+1]) end end if not EMT.MCX1[EMT.MCIND] then EMT.MCX1[EMT.MCIND] = 0 end if not EMT.MCX2[EMT.MCIND] then EMT.MCX2[EMT.MCIND] = 0 end elseif Cmd[1] == '3' then EMT.MCIND = EMT.MCIND + 1 for i = 2, 6, 2 do if Cmd[i] == 'X1' then EMT.MCX1[EMT.MCIND] = tonumber( Cmd[i+1]) elseif Cmd[i] == 'X2' then EMT.MCX2[EMT.MCIND] = tonumber( Cmd[i+1]) end end elseif Cmd[1] == '11' then EMT.X1STAT = tonumber( Cmd[2]) if EMT.MCIND == 0 then EMT.X1STAI = EMT.X1STAT end elseif Cmd[1] == '12' then EMT.X2STAT = tonumber( Cmd[2]) if EMT.MCIND == 0 then EMT.X2STAI = EMT.X2STAT end elseif Cmd[1] == '21' then local dX1Delta = tonumber( Cmd[2]) local dX2Delta = tonumber( Cmd[3]) if dX1Delta > 0 and dX2Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = dX2Delta elseif dX1Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = nil elseif dX2Delta > 0 then EMT.X1DELTA = nil EMT.X2DELTA = dX2Delta end if EMT.X1STAP ~= 0 and EMT.X2STAP ~= 0 and EMT.X1STAI == 0 and EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND == 1 then local sInfo = string.format( ';X1+X2->X1+X2 D12=%.1f', EMT.X1DELTA - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 11 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) + EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 0 local sRef1 = EmtLenToString( EMT.MCX1[1], 3) local sRef2 = EmtLenToString( EMT.MCX1[1], 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,,,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X2STAP ~= 0 and EMT.X2STAI == 0 and EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND == 1 then local sInfo = string.format( ';X1+X2->X1+X2 D12=%.1f', EMT.X1DELTA - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 12 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) + EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 0 local sRef1 = EmtLenToString( EMT.MCX2[1], 3) local sRef2 = EmtLenToString( EMT.MCX2[1], 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,,,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X2STAP ~= 0 and EMT.X1DELTA and not EMT.X2DELTA and EMT.MCIND == 1 then local sInfo = string.format( ';X1+X2->X1 D1=%.1f', EMT.X1DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 12 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EMT.MCX2[1], 3) local sRef2 = EmtLenToString( EMT.MCX2[1], 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,,,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2) table.insert( EMT.AUXSTR, sOut) elseif EMT.X2STAP ~= 0 and EMT.X1DELTA and not EMT.X2DELTA and EMT.MCIND == 2 then local sInfo = string.format( ';%sX2->X1 D1=%.1f', EgtIf( EMT.X1STAP > 0, 'X1+', ''), EMT.X1DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 32 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EgtIf( EMT.MCX2[1] == 0, EMT.L1opp + EMT.X2DLTP, EMT.MCX2[1]), 3) local sRef2 = EmtLenToString( EMT.MCX1[1], 3) local sRef3 = EmtLenToString( EMT.MCX2[2], 3) local sRef4 = EmtLenToString( EgtIf( EMT.MCX1[2] == 0, EMT.MCX1[1], EMT.MCX1[2]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X2STAP ~= 0 and not EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND == 1 then local sInfo = string.format( ';X1+X2->X2 D2=%.1f', EMT.LB - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 21 local nVertClamp = EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 0 local sRef1 = EmtLenToString( EMT.L1opp + EMT.X1DLTP, 3) local sRef2 = EmtLenToString( EMT.MCX1[1], 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,,,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X2STAP ~= 0 and not EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND >= 3 then local sInfo = string.format( ';X1+X2->X2 D2=%.1f', EMT.LB - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 34 local nVertClamp = EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = EgtIf( EMT.MCIND >= 4, 2, 1) local sRef1 = EmtLenToString( EMT.MCX2[1], 3) local sRef2 = EmtLenToString( EMT.MCX1[1], 3) local sRef3 = EmtLenToString( EMT.MCX2[2], 3) local sRef4 = EmtLenToString( EMT.MCX1[2], 3) local sRef5 = EmtLenToString( EgtIf( EMT.MCX2[3] == 0, EMT.MCX2[2], EMT.MCX2[3]), 3) local sRef6 = EmtLenToString( EgtIf( EMT.MCX1[3] == 0, EMT.MCX1[2], EMT.MCX1[3]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,%s,%s)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4, sRef5, sRef6) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X2STAP == 0 and not EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND == 1 then local sInfo = string.format( ';X1->X2 D2=%.1f', EMT.LB - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 31 local nVertClamp = EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EMT.L1opp + EMT.X1DLTP, 3) local sRef2 = EmtLenToString( ParkX2, 3) local sRef3 = EmtLenToString( EMT.MCX1[1], 3) local sRef4 = EmtLenToString( ParkX2, 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and not EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND == 2 then local sInfo = string.format( ';X1%s->X2 D2=%.1f', EgtIf( EMT.X2STAP > 0, '+X2', ''), EMT.LB - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 31 local nVertClamp = EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EgtIf( EMT.MCX1[1] == 0, EMT.L1opp + EMT.X1DLTP, EMT.MCX1[1]), 3) local sRef2 = EmtLenToString( EMT.MCX2[1], 3) local sRef3 = EmtLenToString( EMT.MCX1[2], 3) local sRef4 = EmtLenToString( EgtIf( EMT.MCX2[2] == 0, EMT.MCX2[1], EMT.MCX2[2]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and not EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND >= 3 then local sInfo = string.format( ';X1%s->X2 D2=%.1f', EgtIf( EMT.X2STAP > 0, '+X2', ''), EMT.LB - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local sGet = 'GET(X1,X2)' table.insert( EMT.AUXSTR, sGet) local sReset = 'TRANS' table.insert( EMT.AUXSTR, sReset) local sFeed = 'FA[X1]='..GetFmaxClamp()..' FA[X2]='..GetFmaxClamp() table.insert( EMT.AUXSTR, sFeed) local sMove = 'POS[X1]='..EmtLenToString( EMT.MCX1[1], 3)..' POS[X2]='..EmtLenToString( EMT.MCX2[1], 3) table.insert( EMT.AUXSTR, sMove) local nFunz = 34 local nVertClamp = EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = EgtIf( EMT.MCIND >= 5, 2, 1) local sRef1 = EmtLenToString( EMT.MCX2[2], 3) local sRef2 = EmtLenToString( EMT.MCX1[2], 3) local sRef3 = EmtLenToString( EMT.MCX2[3], 3) local sRef4 = EmtLenToString( EMT.MCX1[3], 3) local sRef5 = EmtLenToString( EgtIf( EMT.MCX2[4] == 0, EMT.MCX2[3], EMT.MCX2[4]), 3) local sRef6 = EmtLenToString( EgtIf( EMT.MCX1[4] == 0, EMT.MCX1[3], EMT.MCX1[4]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,%s,%s)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4, sRef5, sRef6) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X1STAI ~= 0 and EMT.X1DELTA and EMT.X2DELTA and ( EMT.MCIND == 1 or EMT.MCIND == 2) then local sInfo = string.format( ';X1%s->X1+X2 D12=%.1f', EgtIf( EMT.X2STAP > 0, '+X2', ''), EMT.X1DELTA - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 41 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) + EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EgtIf( EMT.MCX1[1] == 0, EMT.L1opp + EMT.X1DLTP, EMT.MCX1[1]), 3) local sRef2 = EmtLenToString( EMT.MCX2[1], 3) local sRef3 = EmtLenToString( EgtIf( not EMT.MCX1[2] or EMT.MCX1[2] == 0, EMT.MCX1[1], EMT.MCX1[2]), 3) local sRef4 = EmtLenToString( EgtIf( not EMT.MCX2[2] or EMT.MCX2[2] == 0, EMT.MCX2[1], EMT.MCX2[2]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X1STAI == 0 and EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND == 2 then local sInfo = string.format( ';X1%s->X1+X2 D12=%.1f', EgtIf( EMT.X2STAP > 0, '+X2', ''), EMT.X1DELTA - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 42 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) + EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EMT.MCX2[1], 3) local sRef2 = EmtLenToString( EMT.MCX1[1], 3) local sRef3 = EmtLenToString( EgtIf( EMT.MCX2[2] == 0, EMT.MCX2[1], EMT.MCX2[2]), 3) local sRef4 = EmtLenToString( EgtIf( EMT.MCX1[2] == 0, EMT.MCX1[1], EMT.MCX1[2]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND >= 3 then local sInfo = string.format( ';X1%s->X1+X2 D12=%.1f', EgtIf( EMT.X2STAP > 0, '+X2', ''), EMT.X1DELTA - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 43 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) + EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = EgtIf( EMT.MCIND >= 4, 2, 1) local sRef1 = EmtLenToString( EMT.MCX1[1], 3) local sRef2 = EmtLenToString( EMT.MCX2[1], 3) local sRef3 = EmtLenToString( EMT.MCX1[2], 3) local sRef4 = EmtLenToString( EMT.MCX2[2], 3) local sRef5 = EmtLenToString( EgtIf( EMT.MCX1[3] == 0, EMT.MCX1[2], EMT.MCX1[3]), 3) local sRef6 = EmtLenToString( EgtIf( EMT.MCX2[3] == 0, EMT.MCX2[2], EMT.MCX2[3]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,%s,%s)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4, sRef5, sRef6) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP ~= 0 and EMT.X1DELTA and not EMT.X2DELTA and EMT.MCIND >= 3 then local sInfo = string.format( ';X1->X1 D1=%.1f', EMT.X1DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 33 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = EgtIf( EMT.MCIND >= 4, 2, 1) local sRef1 = EmtLenToString( EMT.MCX1[1], 3) local sRef2 = EmtLenToString( EMT.MCX2[1], 3) local sRef3 = EmtLenToString( EMT.MCX1[2], 3) local sRef4 = EmtLenToString( EgtIf( EMT.MCX2[2] == 0, EMT.MCX2[1], EMT.MCX2[2]), 3) local sRef5 = EmtLenToString( EgtIf( EMT.MCX1[3] == 0, EMT.MCX1[2], EMT.MCX1[3]), 3) local sRef6 = EmtLenToString( EgtIf( EMT.MCX2[3] == 0, EgtIf( EMT.MCX2[2] == 0, EMT.MCX2[1], EMT.MCX2[2]), EMT.MCX2[3]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,%s,%s)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4, sRef5, sRef6) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP == 0 and EMT.X1DELTA and EMT.X2DELTA and ( EMT.MCIND == 1 or EMT.MCIND == 2) then local sInfo = string.format( ';X2->X1+X2 D12=%.1f', EMT.X1DELTA - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 42 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) + EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EMT.MCX2[1], 3) local sRef2 = EmtLenToString( EMT.MCX1[1], 3) local sRef3 = EmtLenToString( EgtIf( not EMT.MCX2[2] or EMT.MCX2[2] == 0, EMT.MCX2[1], EMT.MCX2[2]), 3) local sRef4 = EmtLenToString( EgtIf( not EMT.MCX1[2] or EMT.MCX1[2] == 0, EMT.MCX1[1], EMT.MCX1[2]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP == 0 and EMT.X1STAI == 0 and EMT.X2STAP ~= 0 and EMT.X2STAI ~= 0 and EMT.X1DELTA and not EMT.X2DELTA and EMT.MCIND == 4 then local sInfo = string.format( ';X2->X1 D1=%.1f', EMT.X1DELTA) table.insert( EMT.AUXSTR, sInfo) local sGet = 'GET(X1,X2)' table.insert( EMT.AUXSTR, sGet) local sReset = 'TRANS' table.insert( EMT.AUXSTR, sReset) local sFeed = 'FA[X1]='..GetFmaxClamp()..' FA[X2]='..GetFmaxClamp() table.insert( EMT.AUXSTR, sFeed) local sMove = 'POS[X1]='..EmtLenToString( EMT.MCX1[1], 3)..' POS[X2]='..EmtLenToString( EMT.MCX2[1], 3) table.insert( EMT.AUXSTR, sMove) local nFunz = 33 local nVertClamp = EgtIf( EMT.X1STAT == 2, 1, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EMT.MCX1[2], 3) local sRef2 = EmtLenToString( EMT.MCX2[2], 3) local sRef3 = EmtLenToString( EMT.MCX1[3], 3) local sRef4 = EmtLenToString( EgtIf( EMT.MCX2[3] == 0, EMT.MCX2[2], EMT.MCX2[3]), 3) local sRef5 = EmtLenToString( EgtIf( EMT.MCX1[4] == 0, EMT.MCX1[3], EMT.MCX1[4]), 3) local sRef6 = EmtLenToString( EgtIf( EMT.MCX2[4] == 0, EMT.MCX2[3], EMT.MCX2[4]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,%s,%s)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4, sRef5, sRef6) table.insert( EMT.AUXSTR, sOut) elseif EMT.X1STAP == 0 and EMT.X1STAI == 0 and EMT.X2STAP ~= 0 and EMT.X2STAI ~= 0 and not EMT.X1DELTA and EMT.X2DELTA and EMT.MCIND == 3 then local sInfo = string.format( ';X2->X2 D2=%.1f', EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local nFunz = 34 local nVertClamp = EgtIf( EMT.X2STAT == 2, 2, 0) local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = 1 local sRef1 = EmtLenToString( EMT.MCX2[1], 3) local sRef2 = EmtLenToString( EMT.MCX1[1], 3) local sRef3 = EmtLenToString( EMT.MCX2[2], 3) local sRef4 = EmtLenToString( EgtIf( EMT.MCX1[2] == 0, EMT.MCX1[1], EMT.MCX1[2]), 3) local sRef5 = EmtLenToString( EgtIf( EMT.MCX2[3] == 0, EMT.MCX2[2], EMT.MCX2[3]), 3) local sRef6 = EmtLenToString( EgtIf( EMT.MCX1[3] == 0, EMT.MCX1[2], EMT.MCX1[3]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s,%s,%s)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4, sRef5, sRef6) table.insert( EMT.AUXSTR, sOut) elseif EMT.MCIND > 0 then EmtSetLastError( 1215, "Charriot move : unmanaged case ("..EMT.MCHNAME..')') 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 if EMT.AUXIND <= 2 then -- reset stato EMT.MCIND = 0 EMT.X1STAT = 0 EMT.X2STAT = 0 EMT.MCX1 = {} EMT.MCX2 = {} end else EMT.UNL = true end elseif Cmd[1] == '1' then if Cmd[2] ~= 'Z' then EMT.MCIND = EMT.MCIND + 1 if Cmd[2] == 'X1' then EMT.MCX1[EMT.MCIND] = tonumber( Cmd[3]) EMT.MCX2[EMT.MCIND] = 0 elseif Cmd[2] == 'X2' then EMT.MCX1[EMT.MCIND] = 0 EMT.MCX2[EMT.MCIND] = tonumber( Cmd[3]) end end elseif Cmd[1] == '2' then EMT.MCIND = EMT.MCIND + 1 for i = 2, 4, 2 do if Cmd[i] == 'X1' then EMT.MCX1[EMT.MCIND] = tonumber( Cmd[i+1]) elseif Cmd[i] == 'X2' then EMT.MCX2[EMT.MCIND] = tonumber( Cmd[i+1]) end end if not EMT.MCX1[EMT.MCIND] then EMT.MCX1[EMT.MCIND] = 0 end if not EMT.MCX2[EMT.MCIND] then EMT.MCX2[EMT.MCIND] = 0 end elseif Cmd[1] == '3' then EMT.MCIND = EMT.MCIND + 1 for i = 2, 6, 2 do if Cmd[i] == 'X1' then EMT.MCX1[EMT.MCIND] = tonumber( Cmd[i+1]) elseif Cmd[i] == 'X2' then EMT.MCX2[EMT.MCIND] = tonumber( Cmd[i+1]) end end elseif Cmd[1] == '11' then EMT.X1STAT = tonumber( Cmd[2]) elseif Cmd[1] == '12' then EMT.X2STAT = tonumber( Cmd[2]) if EMT.UNL and EMT.X2STAT == 0 then local sWait = 'WAIT_CHAN(2)' table.insert( EMT.AUXSTR, sWait) local sSync = 'STOPRE' table.insert( EMT.AUXSTR, sSync) local nFunz = 6 local nVertClamp = 0 local dPress = 2.5 local dFeed = GetClampFeed( EMT.LT) local dAcc = 4 local nOpt = 0 local sRef1 = EMT.MCX2[#EMT.MCX2] local sRef2 = EmtLenToString( ParkX2 - ( EMT.LB - EMT.X2DELTA), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2) table.insert( EMT.AUXSTR, sOut) end elseif Cmd[1] == '21' then local dX1Delta = tonumber( Cmd[2]) local dX2Delta = tonumber( Cmd[3]) if dX1Delta > 0 and dX2Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = dX2Delta elseif dX1Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = nil elseif dX2Delta > 0 then EMT.X1DELTA = nil EMT.X2DELTA = dX2Delta end if EMT.AUXIND > 1 then local sInfo = string.format( ';X1->X2 D2=%.1f', EMT.LB - EMT.X2DELTA) table.insert( EMT.AUXSTR, sInfo) local sWait = 'WAIT_CHAN(2)' table.insert( EMT.AUXSTR, sWait) local sSync = 'STOPRE' table.insert( EMT.AUXSTR, sSync) local nFunz = 31 local nVertClamp = 0 local dPress = 2.5 local dFeed = GetClampFeed( EMT.LB) local dAcc = 4 local nOpt = EgtIf( EMT.MCIND >= 3, 2, 1) local sRef1 = EmtLenToString( EMT.MCX1[1], 3) local sRef2 = EmtLenToString( EMT.MCX2[1], 3) local sRef3 = EmtLenToString( EMT.MCX1[2], 3) local sRef4 = EmtLenToString( EgtIf( EMT.MCX2[2] == 0, EMT.MCX2[1], EMT.MCX2[2]), 3) local sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,%s,%s)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2, sRef3, sRef4) table.insert( EMT.AUXSTR, sOut) 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] == 'X1' then local sOut = 'STOPRE' table.insert( EMT.AUXSTR, sOut) EMT.NSTEP = EMT.NSTEP + 10 local sStep = EgtNumToString( EMT.NSTEP, 0) sOut = '_STEP='..sStep table.insert( EMT.AUXSTR, sOut) sOut = 'TRAILOF(X2,X1)' table.insert( EMT.AUXSTR, sOut) sOut = '_N'..sStep..':STOPRE' table.insert( EMT.AUXSTR, sOut) sOut = 'TRANS' table.insert( EMT.AUXSTR, sOut) sOut = 'STOPRE' table.insert( EMT.AUXSTR, sOut) EMT.TRAILON = nil sOut = 'POS[X1]='..Cmd[3]..' FA[X1]='..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) EMT.X1POS = tonumber( Cmd[3]) end elseif Cmd[1] == '21' then local dX1Delta = tonumber( Cmd[2]) local dX2Delta = tonumber( Cmd[3]) if dX1Delta > 0 and dX2Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = dX2Delta elseif dX1Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = nil elseif dX2Delta > 0 then EMT.X1DELTA = nil EMT.X2DELTA = dX2Delta end end end --------------------------------------------------------------------- function PrepareUnload( sCmd) local Cmd = EgtSplitString( sCmd) if Cmd[1] == '0' then -- non interessa elseif Cmd[1] == '1' then ; elseif Cmd[1] == '2' then local sOut = 'STOPRE' table.insert( EMT.AUXSTR, sOut) EMT.NSTEP = EMT.NSTEP + 10 local sStep = EgtNumToString( EMT.NSTEP, 0) sOut = '_STEP='..sStep table.insert( EMT.AUXSTR, sOut) local nFunz = 6 local nVertClamp = 0 local dPress = 2.5 local dFeed = GetClampFeed( EMT.LT) local dAcc = 4 local nOpt = 0 local sRef1 = Cmd[5] local sRef2 = EmtLenToString( ParkX2 - ( EMT.LT - EMT.X2DELTA), 3) sOut = string.format( '_POSIZ_T(%d,%d,%.1f,%.1f,%.1f,%d,%s,%s,,)', nFunz, nVertClamp, dPress, dFeed, dAcc, nOpt, sRef1, sRef2) table.insert( EMT.AUXSTR, sOut) sOut = '_N'..sStep..':STOPRE' table.insert( EMT.AUXSTR, sOut) EMT.U_STD = true elseif Cmd[1] == '3' then ; elseif Cmd[1] == '11' then ; elseif Cmd[1] == '12' then ; 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.X1DELTA, ' EA112', ' EA111') EMT.SB = EgtIf( EMT.X1DELTA, ' EB112', ' EB111') EMT.SC = EgtIf( EMT.X2DELTA, ' EC142', ' EC141') EMT.SD = EgtIf( EMT.X2DELTA, ' ED142', ' ED141') EMT.SE = EgtIf( EMT.X1DELTA, ' EE1', ' EE2') end -- se è pre-rotazione if Cmd[2] == 'Pre-Rotation' then EMT.PREROT = true elseif Cmd[2] == 'SplitRot' then EMT.SPLITROT = 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 if not EMT.PREROT then sOut = 'G111 '..Cmd[2]..'='..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() else sOut = 'G111 '..Cmd[2]..'='..Cmd[3]..' EA86 EB87 EC141 EE0 EF'..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 sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..'='..Cmd[3], '')).. (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..'='..Cmd[5], '')).. EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..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 sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..'='..Cmd[3], '')).. (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..'='..Cmd[5], '')).. (EgtIf( Cmd[6] ~= 'T', ' '..Cmd[6]..'='..Cmd[7], '')).. EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() table.insert( EMT.AUXSTR, sOut) elseif Cmd[1] == '11' then local sMsg = 'PX1=' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' EB11' .. 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', ' EA11' .. CalcCharStatus( Cmd[2], true), ' EA86') EMT.SB = EgtIf( Cmd[2] ~= '0', ' EB11' .. CalcCharStatus( Cmd[2], true), ' EB87') EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE1', ' EE2') else EMT.SA = ' EA11' .. CalcCharStatus( Cmd[2], true) EMT.SB = ' EB11' .. CalcCharStatus( Cmd[2], true) EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE1', ' EE2') end elseif Cmd[1] == '12' then local sMsg = 'PX2=' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) if #EMT.AUXSTR > 0 then local sVal = ' ED14' .. CalcCharStatus( Cmd[2], true) local sOut = EMT.AUXSTR[#EMT.AUXSTR] EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) end EMT.SC = ' EC14' .. CalcCharStatus( Cmd[2], true) EMT.SD = ' ED14' .. CalcCharStatus( Cmd[2], true) EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE2', ' EE1') elseif Cmd[1] == '21' then local dX1Delta = tonumber( Cmd[2]) local dX2Delta = tonumber( Cmd[3]) if dX1Delta > 0 and dX2Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = dX2Delta elseif dX1Delta > 0 then EMT.X1DELTA = dX1Delta EMT.X2DELTA = nil elseif dX2Delta > 0 then EMT.X1DELTA = nil EMT.X2DELTA = dX2Delta 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 = ' EB112' 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], 'ET1', '') 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] == 'X1' then -- tolgo eventuale sovramateriale presente sul pezzo in posizione iniziale (la misura laser è ora col finito) local sX1Taking = ' X1='..EmtLenToString( Cmd[3] - EMT.HOVM) local sOut = 'G111'..sX1Taking..' EA75 EB110 EE0 EF'..EmtLenToString( EMT.FMAXPINZE,0)..' ET1 E80058=0' 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 = 'PX1=' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) EMT.SB = ' EB11' .. CalcCharStatus( Cmd[2]) elseif Cmd[1] == '12' then local sMsg = 'PX2=' .. ' ' .. Cmd[2] table.insert( EMT.AUXCMD, sMsg) elseif Cmd[1] == '21' then local dX1YDelta = tonumber( Cmd[2]) local dX2Delta = tonumber( Cmd[3]) if dX1YDelta > 0 and dX2Delta > 0 then EMT.X1DELTA = dX1YDelta EMT.X2DELTA = dX2Delta elseif dX1YDelta > 0 then EMT.X1DELTA = dX1YDelta EMT.X2DELTA = nil elseif dX2Delta > 0 then EMT.X1DELTA = nil EMT.X2DELTA = dX2Delta end local sX1Load = ' X1='..EmtLenToString( LoadT) local sOut = 'G111'..sX1Load..' EA76'..EMT.SB..' EE0 EF'..EmtLenToString( EMT.FMAXPINZE,0)..' ET1' 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.X_OFF then EMT.L1 = EMT.L1 + EMT.X_OFF end EmtAdjustLinearAxes() EMT.L1o = MyL1o EMT.L2o = MyL2o EMT.L3o = MyL3o -- Assi geometrici sempre XYZ (indipendentemente dal nome assi fisici) EMT.L1t = 'X' EMT.L2t = 'Y' EMT.L3t = 'Z' 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, DeltaTabY, DeltaTabZ) -- 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 _, dAngV, dAngO = SphericalFromVector( vtE) local dAngO2 = EmtGetAngO2( EMT.IPLGLFR:getVersZ(), EMT.IPLGLFR:getVersX(), dAngV, dAngO) local sXout, sYout, sZout if EMT.X1DELTA then sXout = ' X='..EmtLenToString( xS + EMT.X1DELTA)..'+OFS_T5_X1[0]' sYout = ' Y=OFS_T5_X1[1]' sZout = ' Z=OFS_T5_X1[2]' elseif EMT.X2DELTA then sXout = ' X='..EmtLenToString( xS + EMT.X2DELTA)..'+OFS_T5_X2[0]' sYout = ' Y=OFS_T5_X2[1]' sZout = ' Z=OFS_T5_X2[2]' else EmtSetLastError( 1214, "Part to machine without charriots") end EMT.IPLGLSTR = 'TRANS'..sXout..sYout..sZout.. '\nAROT Z'..EgtNumToString( dAngO)..'\nAROT Y'..EgtNumToString( dAngV)..'\nAROT Z'..EgtNumToString( dAngO2) 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 -- determino quanto ruotare local nDeltaRot = nRot - nPrevRot -- se rotazione automatica richiesta e possibile if AutomaticRotation and EMT.LB >= AutoRotMinLen then local sOut = 'M180 L0=' .. tostring( nDeltaRot) EmtOutput( sOut) else local sOut if nDeltaRot == 1 then sOut = 'M151' elseif nDeltaRot == 2 then sOut = 'M152' elseif nDeltaRot == 3 then sOut = 'M153' end EmtOutput( sOut) EmtOutput( 'M86') EmtOutput( 'G4F.5') end return true end --------------------------------------------------------------------- function EmitZmax() local sOut = 'SUPA G0 D0 Z'..EgtNumToString( ParkZ, 3) EmtOutput( sOut) end --------------------------------------------------------------------- function EmitSpeedOn( nSpeed) if not EMT.SPEED_ON then EmtOutput( 'M_ON(1,'..EgtNumToString( nSpeed, 0) ..')') EMT.SPEED_ON = true end end --------------------------------------------------------------------- function EmitSpeedOff() if EMT.SPEED_ON then EmtOutput( 'M_OFF(1)') EMT.SPEED_ON = nil end end --------------------------------------------------------------------- function GetFmaxClamp() return EmtLenToString( EMT.FMAXPINZE, 0) end --------------------------------------------------------------------- function GetClampFeed( dLen) local KgMtCubo= 550 -- densità legno [Kg / metro cubo] local Massa = ( EMT.HT * EMT.ST * dLen * KgMtCubo ) / 1e9 -- massa [Kg] local RefMassa = 100 -- massa di riferimento con massima feed local dCoeff = EgtClamp( RefMassa / Massa, 0.1, 1) return EmtLenToString( dCoeff * EMT.FMAXPINZE, 0) end --------------------------------------------------------------------- -- *** END GENERATION *** ---------------------------------------------------------------------