1789 lines
64 KiB
Plaintext
1789 lines
64 KiB
Plaintext
-- 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 ***
|
|
---------------------------------------------------------------------
|