Files
Essetre-90480023_MW/Essetre-WALL.NUM.mlpe

744 lines
27 KiB
Plaintext

-- Processore macchina Essetre-WALL by EgalTech s.r.l. 2023/03/14
-- Con controllo numerico NUM
-- 2023/03/13 DS Prima versione.
-- Variabili di modulo
local MLE_INFO = 'Essetre-WALL.NUM.mlpe ver.'..PP_VER..' by EgalTech 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.FMAXPINZE = 154000 -- feed massima pinze
end
---------------------------------------------------------------------
function OnEnd()
-- Ripristino fase iniziale come corrente
EgtSetCurrPhase( 1)
end
---------------------------------------------------------------------
function OnProgramStart()
-- Info da gruppo BtlInfo (se mancano prova dal gruppo di lavoro corrente)
local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL
EMT.ORIG = EgtGetInfo( BtlInfoId, 'REFPOS', 'i') or 1
EMT.LOAD90 = EgtGetInfo( BtlInfoId, 'LOAD90', 'i') or 0
-- Intestazioni
if not TEST_USE then
EMT.PRODID = EgtGetInfo( BtlInfoId, 'PRODID', 'i') or 0
EMT.PATTID = EgtGetInfo( BtlInfoId, 'PATTID', 'i') or 0
end
if EMT.PATTID and EMT.PATTID > 0 then
EmtOutput( '%' .. tostring( EMT.PATTID) .. '.0')
else
EmtOutput( '%40.0')
end
if EMT.INFO then
EmtOutput( '('..EMT.INFO..')')
else
EmtOutput( '(Program Start)')
end
EmtOutput( '('.. MLE_INFO..')')
-- Se modalità test vado in posizione sicura
if TEST_USE then
EmtOutput( 'G77 H9000 N1000 N2000')
end
-- Parametri macchina
local sOut = 'G114'..' EA'..EgtNumToString( DeltaTabY - SawDeltaY + DimTabY, -2)..' EB'..EgtNumToString( -DeltaTabX + SawDeltaX, -2)..
' EC'..EgtNumToString( DeltaTabZ - SawDeltaZ, -2)..' ED'..EgtNumToString( SawOffs, -2)..' EE'..EgtNumToString( 0, -2)..
' EF'..EgtNumToString( DeltaTabY + DimTabY, -2)..' EG'..EgtNumToString( -DeltaTabX, -2)..
' EH'..EgtNumToString( DeltaTabZ, -2)..' EI'..EgtNumToString( MillOffs, -2)..
' EL'..EgtNumToString( DeltaTabY - NailDeltaY + DimTabY, -2)..' EM'..EgtNumToString( -DeltaTabX + NailDeltaX, -2)..
' EN'..EgtNumToString( DeltaTabZ - NailDeltaZ, -2)..' EO'..EgtNumToString( DeltaTabY - DrillDeltaY + DimTabY, -2)..
' EP'..EgtNumToString( -DeltaTabX + DrillDeltaX, -2)..' EQ'..EgtNumToString( DeltaTabZ - DrillDeltaZ, -2)
EmtOutput( sOut)
-- Indice lavorazione
EMT.CNT = 0
-- Non effettuate lavorazioni con sega a catena sul fianco
EMT.CSAWFIRST = true
-- Non effettuata pausa per rimozione sfridi
EMT.SCRAPFIRST = true
-- Cerco primo utensile su testa 1
EMT.TOOL_1, EMT.TLEN_1 = FindFirstToolOnHead( 'H1')
end
---------------------------------------------------------------------
function OnProgramEnd()
EmtOutput( '( *** Program End *** )')
EmitCount()
-- Dichiarazione conclusione pezzi
if EMT.PRODID then
local PartId = EgtGetFirstPartInRawPart( EMT.RAWID)
while PartId do
local CutId = EgtGetInfo( PartId, 'CUTID', 'i') or 0
local sOut = 'G126 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( CutId)..' ED2'
EmtOutput( sOut)
PartId = EgtGetNextPartInRawPart( PartId)
end
end
-- Arresto mandrino
EmtOutput( 'M05 E80000=1')
-- Tipo di scarico
if not TEST_USE then
EmtOutput( '(M12 $PRESS START FOR CLEANING)')
EmtOutput( 'M27 E30057=0')
end
-- Se modalità test, termino il programma
if TEST_USE then
EmtOutput( 'M02')
end
end
---------------------------------------------------------------------
function OnToolData()
-- emissione dati utensile (esclusa lama e sega a catena)
if EMT.HEAD == 'H1' then
-- cerco posizione di attrezzaggio del primo utensile di lavorazione
if EMT.TOOL == EMT.TOOL_1 and EMT.TLEN_1 < 215.5 then
EMT.TCPOS_1 = EMT.TCPOS
end
-- emissione dati sega a catena
elseif EMT.HEAD == 'H3' then
;
end
end
---------------------------------------------------------------------
function OnDispositionStart()
--EmtOutput( '(Disposition '..EMT.DISPIND..' = '..EMT.DISPID..')')
EMT.OPEISDISP = true
end
---------------------------------------------------------------------
function OnDispositionEnd()
-- Se prima disposizione
if EMT.PHASE == 1 then
-- Dimensioni grezzo
local b3Raw = EgtGetRawPartBBox( EMT.RAWID)
EMT.LP = b3Raw:getDimX()
EMT.HP = b3Raw:getDimY()
EMT.SP = b3Raw:getDimZ()
EmtOutput( 'E30050='..EgtNumToString( 1000 * EMT.HP, 0)..
' E30051='..EgtNumToString( 1000 * EMT.LP, 0)..
' E30052='..EgtNumToString( 1000 * EMT.SP, 0))
-- Posizione cuffia
local dHeightSubPiece = EMT.RAWPOS[3] or 0
local dHCuff = dHeightSubPiece + b3Raw:getDimZ() + 32
EmtOutput( 'E30039=' .. EgtNumToString( dHCuff * 1000, 0))
-- Eventuale salto a lavorazione in corso
EmtOutput( 'G79 NE80000')
-- Lancio del carico
EmitCount()
if not TEST_USE then
EmtOutput( 'M26 E30054=' .. EgtIf( EMT.LOAD90 == 1, '5', '1'))
end
-- Dichiarazione inizio lavorazione pezzi
if EMT.PRODID then
EmitCount()
local PartId = EgtGetFirstPartInRawPart( EMT.RAWID)
while PartId do
local CutId = EgtGetInfo( PartId, 'CUTID', 'i') or 0
local sOut = 'G126 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( CutId)..' ED1'
EmtOutput( sOut)
PartId = EgtGetNextPartInRawPart( PartId)
end
end
end
EMT.OPEISDISP = false
end
---------------------------------------------------------------------
function OnTableData()
end
---------------------------------------------------------------------
function OnFixtureData()
end
---------------------------------------------------------------------
function OnRawMoveData()
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 EmtSetLastError( 1213, '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)
end
end
---------------------------------------------------------------------
function OnToolDeselect()
end
---------------------------------------------------------------------
function OnMachiningStart()
--EMT.MCHLIBNAME = EgtGetMachiningParam( MCH_MP.NAME)
EMT.MCHNAME = EgtGetOperationName( EMT.MCHID)
EMT.MCHTYPE = EgtGetMachiningParam(MCH_MP.TYPE)
-- non ancora iniziata la lavorazione
EMT.MCHFIRST = true
-- primo posizionamento sempre in globale
EMT.REFLOC = nil
EMT.IPLGL = false
end
---------------------------------------------------------------------
function OnMachiningEnd()
if not EMT.ZMAX and not IsNailingHead( EMT.HEAD) then
EmtOutput( 'G103'..GetET()..' E80000='..tostring( EMT.CNT + 1))
end
EMT.PREVTOOL = EMT.TOOL
end
---------------------------------------------------------------------
function OnPathStart()
-- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento)
EmtResetPrev()
end
---------------------------------------------------------------------
function OnPathEnd()
if IsNailingHead( EMT.HEAD) then
local dStep = GetValNotes( EgtGetMachiningParam( MCH_MP.USERNOTES), 'Par', 'd') or 100
local dSafeZ = max( EgtGetMachiningParam( MCH_MP.STARTPOS), 10) or 20
--local dSafeZ = EgtMdbGetGeneralParam( MCH_GP.SAFEZ)
local sEB = ' EB0'
if EMT.TO_ZMAX then
sEB = ' EB1'
EMT.TO_ZMAX = nil
end
EmtOutput( 'G124 X'..EmtLenToString( EMT.NAIL_START_L1, 3)..' Y'..EmtLenToString( EMT.NAIL_START_L2, 3)..' Z'..EmtLenToString( EMT.NAIL_START_L3, 3)..
' B'..EmtLenToString( EMT.NAIL_END_L1, 3)..' C'..EmtLenToString( EMT.NAIL_END_L2, 3)..' EA'..EmtLenToString( dStep, 3)..' EB1'..
' W'..EmtLenToString( dSafeZ, 3)..EMT.NAIL_END)
end
end
---------------------------------------------------------------------
function OnRapid()
-- se primo movimento della lavorazione, gestione speciale
if EMT.MCHFIRST and not EMT.OPEISDISP then
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
EmtOutput( '( *** '..EMT.MCHNAME..'/'..EMT.TOOL..' *** )')
EmitCount()
-- se lavorazione con sega a catena
if EMT.HEAD == 'H3' then
-- se prima lavorazione sui fianchi con sega a catena
if EMT.CSAWFIRST and string.sub( EMT.MCHNAME, 1, 5) == 'Csaw_' then
EMT.CSAWFIRST = false
-- eventuale pausa per rimozione sfridi
if EMT.SCRAPFIRST then
EMT.SCRAPFIRST = false
local b3Raw = EgtGetRawPartBBox( EMT.RAWID)
local ParkY = ParkYScrapRemove or min( -( b3Raw:getMin():getX() - 2000), -MinY)
EmtOutput( 'G104 Y' .. EmtLenToString( ParkY, 3) .. ' ET1' .. GetEF())
end
-- pre-posizionamento
EmitCount()
EmtResetPrev()
local sOut = 'G101' .. EmtGetAxis( 'R1')
local sET = GetET()
local sEU = GetEU()
local sEF = GetEF()
local sEM = ' EM'..EgtIf( EMT.S > 0, '3', '4')
local sES = ' ES'..EgtNumToString( abs( EMT.S), 0)
local sEL = ' EL' .. EmtLenToString( ChSawLen, 3)
local sER = ' ER' .. EmtLenToString( EMT.TLEN, 3)
sOut = sOut .. sET .. sEU .. sEF .. sEM .. sES .. sEL .. sER
EmtOutput( sOut)
end
-- altrimenti verifico se necessaria pausa
else
if EMT.SCRAPFIRST and EgtExistsInfo( EMT.MCHID, 'MOVE_AFTER') then
EMT.SCRAPFIRST = false
-- pausa per rimozione sfridi
local b3Raw = EgtGetRawPartBBox( EMT.RAWID)
local ParkY = ParkYScrapRemove or min( -( b3Raw:getMin():getX() - 2000), -MinY)
EmtOutput( 'G104 Y' .. EmtLenToString( ParkY, 3) .. ' ET1' .. GetEF())
end
end
-- primo posizionamento
EmtResetPrev()
if EMT.HEAD ~= 'H5' then
local sOut = 'G101' .. EmtGetAxis( 'L1') .. EmtGetAxis( 'L2') .. EmtGetAxis( 'L3') ..
EmtGetAxis( 'R2') .. EmtGetAxis( 'R1')
if EMT.HEAD == 'H1' or EMT.HEAD == 'H3' or EMT.HEAD == 'H14' then
sOut = sOut .. ' U' .. EmtLenToString( MinX2, 3) .. ' W0 V90 A0'
elseif EMT.HEAD == 'H2' then
sOut = sOut .. ' U' .. EmtLenToString( MaxX1, 3) .. ' W0 V0 A0'
else
EmtSetLastError( 1211, "Unknown Head : " .. EMT.HEAD)
end
local sET = GetET()
local sEU = GetEU()
local sEF = GetEF()
local sEM = ' EM'..EgtIf( EMT.S > 0, '3', '4')
local sES = ' ES'..EgtNumToString( abs( EMT.S), 0)
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ChSawLen), 3)
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
sOut = sOut .. sET .. sEU .. sEF .. sEM .. sES .. sEL .. sER
if not IsNailingHead( EMT.HEAD) then
EmtOutput( sOut)
end
EMT.REFLOC = 0
EMT.MCHFIRST = false
EMT.ZMAX = false
else -- H5 (foratore orizzontale)
-- rinvio l'emissione al prossimo movimento con Z del foro
EMT.FIRST_HDRILL = true
EMT.REFLOC = nil
EMT.MCHFIRST = false
end
-- se standard
elseif EMT.FLAG == 0 or EMT.FLAG == 1 or EMT.FLAG == 2 then
-- se prima emissione di foratura orizzontale
if EMT.FIRST_HDRILL then
EMT.FIRST_HDRILL = false
local sET = GetET()
local sEU = GetEU()
EMT.L1 = -EMT.L1
local sOut = 'G101 X0' .. EmtGetAxis( 'L1') .. EmtGetAxis( 'L3')..' U0 V0 W0'..sET..sEU..' EF60000'
EmtOutput( sOut)
EMT.L1 = -EMT.L1
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
EmtResetPrev()
local sEF = ' EF20000'
local sEM = ' EM'..EgtIf( EMT.S > 0, '3', '4')
local sX = ' X40'
local sEX = ' EX0'
sOut = 'G102' .. sX ..' Y0 Z0'..sEX..' EY'..EmtLenToString( EMT.L1)..' EZ'..EmtLenToString( EMT.L3) .. ' EA0 EB0 EC0 ED0' .. sET .. sEU .. sEM .. sEF
EmtOutput( sOut)
EMT.ZMAX = false
-- se necessario, impostazione riferimento locale
elseif 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
EMT.R1p = nil
EMT.R2p = nil
local sET = GetET()
local sEU = GetEU()
local sEF = ' EF20000'
local sEM = ' EM'..EgtIf( EMT.S > 0, '3', '4')
local sES = ' ES'..EgtNumToString( abs( EMT.S), 0)
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ChSawLen), 3)
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
if not IsNailingHead( EMT.HEAD) then
EmtOutput( 'G102'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..EmtGetAxis('R2')..EmtGetAxis('R1')..EMT.IPLGLSTR..sET..sEU..sEF..sEM..sES..sEL..sER)
-- emissione movimento
local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R2')..EmtGetAxis('R1')
EmtOutput( sOut)
else
EMT.NAIL_START_L1 = EMT.L1
EMT.NAIL_START_L2 = EMT.L2
EMT.NAIL_START_L3 = EMT.L3
EMT.NAIL_END_L1 = EMT.L1
EMT.NAIL_END_L2 = EMT.L2
EMT.NAIL_END = EMT.IPLGLSTR..sET..sEU..sEF..sEM..sES..sEL..sER
end
else
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
-- emissione movimento
if not IsNailingHead( EMT.HEAD) then
local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R2')..EmtGetAxis('R1')
EmtOutput( sOut)
else
if EMT.L1 then EMT.NAIL_END_L1 = EMT.L1 end
if EMT.L2 then EMT.NAIL_END_L2 = EMT.L2 end
if EMT.L3 and EMT.L3 < EMT.NAIL_START_L3 then
EMT.NAIL_START_L3 = EMT.L3
end
end
end
-- se altrimenti risalita a Z max a fine lavorazione
elseif EMT.FLAG == 3 then
if not IsNailingHead( EMT.HEAD) then
if EMT.REFLOC then
EMT.REFLOC = nil
EMT.IPLGL = false
EmtResetPrev()
-- dichiarazione fine lavorazione
EmtOutput( 'G103'..GetET()..' E80000='..tostring( EMT.CNT + 1))
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
local sOut = 'G101' .. EmtGetAxis( 'L3') .. EmtGetAxis( 'R2') .. EmtGetAxis( 'R1') .. GetET() .. GetEF()
EmtOutput( sOut)
EMT.ZMAX = true
elseif EMT.HEAD == 'H5' then
EmtResetPrev()
EmtOutput( 'G103'..GetET()..' E80000='..tostring( EMT.CNT + 1))
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
EMT.ZMAX = true
end
else
EMT.TO_ZMAX = true
end
-- se altrimenti movimento in Home
elseif EMT.FLAG == 4 then
-- non previsto
-- altrimenti errore
else
EmtSetLastError( 1214, 'Unknown Rapid flag')
end
-- aggiorno valori come precedenti
EmtUpdatePrev()
end
---------------------------------------------------------------------
function OnLinear()
-- se prima emissione di foratura orizzontale
if EMT.FIRST_HDRILL then
EMT.FIRST_HDRILL = false
local sET = GetET()
local sEU = GetEU()
EMT.L1 = -EMT.L1
local sOut = 'G101 X0' .. EmtGetAxis( 'L1') .. EmtGetAxis( 'L3')..' U0 V0 W0'..sET..sEU..' EF60000'
EmtOutput( sOut)
EMT.L1 = -EMT.L1
-- salvo posizione attuale
local OldL1 = EMT.L1
local OldL2 = EMT.L2
local OldL3 = EMT.L3
local OldR1p = EMT.R1p
local OldR2p = EMT.R2p
-- trasformo i punti
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
EmtResetPrev()
local sEF = ' EF20000'
local sEM = ' EM'..EgtIf( EMT.S > 0, '3', '4')
local sX = ' X40'
local sEX = ' EX0'
sOut = 'G102' .. sX ..' Y0 Z0'..sEX..' EY'..EmtLenToString( EMT.L1)..' EZ'..EmtLenToString( EMT.L3) .. ' EA0 EB0 EC0 ED0' .. sET .. sEU .. sEM .. sEF
EmtOutput( sOut)
-- ripristino posizione attuale
EMT.L1 = OldL1
EMT.L2 = OldL2
EMT.L3 = OldL3
EMT.R1p = OldR1p
EMT.R2p = OldR2p
EMT.ZMAX = false
-- se necessario, impostazione riferimento locale
elseif 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
local OldR1p = EMT.R1p
local OldR2p = EMT.R2p
-- imposto posizione precedente
EMT.L1 = EMT.L1o
EMT.L2 = EMT.L2o
EMT.L3 = EMT.L3o
EMT.R1p = nil
EMT.R2p = nil
-- trasformo i punti nel piano
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
local sET = GetET()
local sEU = GetEU()
local sEF = ' EF20000'
local sEM = ' EM'..EgtIf( EMT.S > 0, '3', '4')
local sES = ' ES'..EgtNumToString( abs( EMT.S), 0)
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ChSawLen), 3)
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
if not IsNailingHead( EMT.HEAD) then
EmtOutput( 'G102'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..EmtGetAxis('R2')..EmtGetAxis('R1')..EMT.IPLGLSTR..sET..sEU..sEF..sEM..sES..sEL..sER)
-- emissione movimento
local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R2')..EmtGetAxis('R1')
EmtOutput( sOut)
else
EMT.NAIL_START_L1 = EMT.L1
EMT.NAIL_START_L2 = EMT.L2
EMT.NAIL_START_L3 = EMT.L3
EMT.NAIL_END_L1 = EMT.L1
EMT.NAIL_END_L2 = EMT.L2
EMT.NAIL_END = EMT.IPLGLSTR..sET..sEU..sEF..sEM..sES..sEL..sER
end
-- ripristino posizione attuale
EMT.L1 = OldL1
EMT.L2 = OldL2
EMT.L3 = OldL3
EMT.R1p = OldR1p
EMT.R2p = OldR2p
end
-- aggiustamento valori
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
if not IsNailingHead( EMT.HEAD) then
-- valori degli assi
local sAxes
if EMT.HEAD ~= 'H5' then
sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R2')..EmtGetAxis('R1')
else
sAxes = EmtGetAxis('L2')
end
-- se nulla da emettere, esco
if #sAxes == 0 then
return
end
-- aggiungo feed
local sFeed = EmtGetFeed()
-- emetto linea
EmtOutput( "G1"..sAxes..sFeed)
-- eventuale gestione fondo foro
if EMT.FLAG == 101 and EMT.HEAD == 'H5' then
EmtOutput( 'M155')
end
else
if EMT.L1 then EMT.NAIL_END_L1 = EMT.L1 end
if EMT.L2 then EMT.NAIL_END_L2 = EMT.L2 end
if EMT.L3 and EMT.L3 < EMT.NAIL_START_L3 then
EMT.NAIL_START_L3 = EMT.L3
end
end
-- aggiorno valori come precedenti
EmtUpdatePrev()
end
---------------------------------------------------------------------
function OnArc()
-- non modale su archi
local dPrevZ = EMT.L3p
EmtResetPrevLinear()
-- aggiustamento valori
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
if not IsNailingHead( EMT.HEAD) then
-- 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,3)
-- aggiungo feed
local sFeed = EmtGetFeed()
-- tipo arco
local sArc = 'G' .. EgtNumToString(EMT.MOVE,0)
-- se elica, aggiungo il pitch
local sPitch = ''
local dDeltaZ = EMT.L3 - dPrevZ
if abs( dDeltaZ) > GEO.EPS_SMALL then
local dPitch = dDeltaZ * 360.0 / abs( EMT.AC)
sPitch = ' K' .. EmtLenToString( dPitch, 3)
end
-- emetto arco
EmtOutput( sArc..sAxes..sRad..sPitch..sFeed)
else
-- Archi non previsti con chiodature
EmtSetLastError( 1212, 'Arcs non allowed with nailing')
end
-- aggiorno valori come precedenti
EmtUpdatePrev()
end
---------------------------------------------------------------------
function MyAdjustLinearAxes()
if EMT.REFLOC then
local vtDelta = V_NULL()
local vtE = V_NULL()
if EMT.HEAD == 'H1' then
local Len = EMT.TLEN + MillOffs
local LenRef = MillOffs
local vtTool = EgtGetCalcToolDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
vtE = vtTool * Len - Z_AX() * LenRef
elseif EMT.HEAD == 'H2' then
vtDelta = -Vector3d( SawDeltaX, SawDeltaY, SawDeltaZ)
local Len = EMT.TLEN + SawOffs
local LenRef = SawOffs
local vtTool = EgtGetCalcToolDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
vtE = vtTool * Len - Z_AX() * LenRef
elseif EMT.HEAD == 'H3' then
local Len = ChSawLen + MillOffs
local LenRef = MillOffs
local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
vtE = vtAux * Len - Z_AX() * LenRef
elseif EMT.HEAD == 'H14' then
vtDelta = -Vector3d( NailDeltaX, NailDeltaY, NailDeltaZ)
vtE = Z_AX() * EMT.TLEN
end
EMT.L1 = EMT.L1 - vtDelta:getX() - vtE:getX()
EMT.L2 = EMT.L2 - vtDelta:getY() - vtE:getY()
EMT.L3 = EMT.L3 - vtDelta:getZ() - DeltaTabZ - vtE:getZ()
elseif EMT.HEAD == 'H5' then
EMT.L1 = EMT.L1 - DeltaTabX + DrillDeltaX
EMT.L2 = EMT.L2 - DeltaTabY + DrillDeltaY - DimTabY - EMT.TLEN
EMT.L3 = EMT.L3 - DeltaTabZ + DrillDeltaZ
end
EmtAdjustLinearAxes()
if not EMT.REFLOC then
EMT.L1 = - EMT.L1
EMT.L1t = 'Y'
EMT.L2t = 'X'
else
EMT.L1t = 'X'
EMT.L2t = 'Y'
end
end
---------------------------------------------------------------------
function CalcInterpPlane()
-- origine del piano
local xS = EMT.START[1]
local yS = EMT.START[2]
local zS = EgtIf( IsNailingHead( EMT.HEAD), EMT.SP, 0)
local ptS = Point3d( xS, yS, zS)
-- calcolo per piano generico
local vtE
if EMT.HEAD == 'H1' then
vtE = EgtGetCalcToolDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
elseif EMT.HEAD == 'H3' then
vtE = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
else
vtE = Z_AX()
end
if EMT.HEAD == 'H1' or EMT.HEAD == 'H3' then
EMT.IPLGLFR = Frame3d( ptS, vtE)
else
EMT.IPLGLFR = Frame3d( ptS, Y_AX(), -X_AX(), Z_AX())
end
--EmtOutput( 'IPLGLFR='..tostring(EMT.IPLGLFR))
local _, dAngV, dAngO = SphericalFromVector( vtE)
local dAngO2 = EmtGetAngO2( EMT.IPLGLFR:getVersZ(), EMT.IPLGLFR:getVersX(), dAngV, dAngO)
dAngO = dAngO - 90
while dAngO < 0 do
dAngO = dAngO + 360
end
-- se rotazione solo attorno alla C allora si mette come rotazione finale
if abs( dAngV) < GEO.EPS_ANG_SMALL then
dAngO2 = dAngO2 + dAngO
while dAngO2 >= 360 do
dAngO2 = dAngO2 - 360
end
dAngO = 0
end
-- A seconda del corner di riferimento scelto togliere o meno da EX DimTabY e da EY DimTabX (BL non li usa, TR li richiede entrambi)
local xOut = yS - DeltaTabY - DimTabY
local yOut = - ( xS - DeltaTabX)
local zOut = zS
EMT.IPLGLSTR = ' EX'..EmtLenToString( xOut)..' EY'..EmtLenToString( yOut)..' EZ'..EmtLenToString( zOut)..
' EA0'..' EB'..EgtNumToString( dAngV)..' EC'..EgtNumToString( dAngO)..' ED'..EgtNumToString( dAngO2)
EMT.IPLGL = true
end
---------------------------------------------------------------------
function GetET()
if EMT.HEAD == 'H1' or EMT.HEAD == 'H3' then
return ' ET2'
elseif EMT.HEAD == 'H2' then
return ' ET1'
elseif EMT.HEAD == 'H5' then
return ' ET3'
elseif EMT.HEAD == 'H14' then
return ' ET1'
end
end
---------------------------------------------------------------------
function GetEU()
local sEU
if EMT.HEAD == 'H1' then
sEU = ' EU'..string.sub( EMT.TCPOS, 2)
elseif EMT.HEAD == 'H2' then
sEU = ' EU0'
elseif EMT.HEAD == 'H3' then
if abs( EMT.R3 - 0) < 0.1 then
sEU = ' EU104'
elseif abs( EMT.R3 - 270) < 0.1 then
sEU = ' EU101'
elseif abs( EMT.R3 - 180) < 0.1 then
sEU = ' EU102'
elseif abs( EMT.R3 - 90) < 0.1 then
sEU = ' EU103'
else
EmtSetLastError( 1210, 'Chain saw orientation not allowed')
end
else
sEU = ' EU0'
end
return sEU
end
---------------------------------------------------------------------
function GetEF()
return ' EF60000'
end
---------------------------------------------------------------------
function EmitCount()
EMT.CNT = EMT.CNT + 1
EmtOutput( 'N'..tostring( EMT.CNT)..' E80000='..tostring( EMT.CNT))
end
---------------------------------------------------------------------
function IsNailingHead( sHead)
return ( sHead == 'H14')
end
---------------------------------------------------------------------
function GetValNotes( sNotes, sKey, sType)
local vsChunk = EgtSplitString( sNotes or '', ';')
local dVal
for i = 1, #vsChunk do
local dTmp = EgtGetVal( vsChunk[i], sKey, sType)
if dTmp then dVal = dTmp end
end
return dVal
end
---------------------------------------------------------------------
-- *** END GENERATION ***
---------------------------------------------------------------------