Files
Essetre-PF/Common_ONE-PF.NUM.mlpe

2911 lines
112 KiB
Plaintext

-- Processore standard macchine ONE e PF by EgalWare s.r.l. 2023/11/24
-- Con controllo numerico NUM
-- Carico libreria
local BD = require( 'BeamData')
-- 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.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 = MaxFeedPinze -- feed massima pinze
EMT.MAXACC = MaxAcc or ( EMT.FMAXPINZE / ( 60 * 0.3)) -- accelerazione massima pinze
EMT.MINACC = MinAcc or ( EMT.FMAXPINZE / ( 60 * 4)) -- accelerazione minima pinze
-- utensili default
EMT.PREVTCPOS_H1 = DefTcPos1
EMT.PREVTCPOS_H2 = DefTcPos2
end
---------------------------------------------------------------------
function OnEnd()
-- Ripristino fase iniziale come corrente
EgtSetCurrPhase( 1)
end
---------------------------------------------------------------------
function OnProgramStart()
-- Intestazioni
local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL
local nPattId = EgtGetInfo( BtlInfoId, 'PATTID', 'i') or 40
EmtOutput( '%' .. EgtNumToString( nPattId,-1))
-- 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
if EMT.INFO then
EmtOutput( sPrefixCommentLine..'('..EMT.INFO..')')
else
EmtOutput( '(Program Start)')
end
EmtOutput( sPrefixCommentLine..'('.. CSP_INFO..')')
EmtOutput( sPrefixCommentLine..'('.. MACHINE_INFO..')\n')
EmtOutput( '(HEADER)')
-- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente)
if TEST_USE then
EmitTestProgramStart()
end
-- Dichiaro inizio
EMT.FIRST = true
-- Dichiaro cabine con rulli in posizione di parcheggio
EMT.V1POS = ParkV1
EMT.V2POS = ParkV2
end
---------------------------------------------------------------------
function OnProgramEnd()
-- Arresto mandrino
--EmtOutput( 'M05')
-- Emissione scarico
for i = 1, #EMT.MDCHAR do
EmitMoveDataChars( EMT.MDCHAR[i])
end
if #EMT.MDCHAR > 0 then
if EMT.AUXTYPE == 'S' then
EmitMoveStartChars( 1)
EmitMoveWaitChars( 1)
elseif EMT.AUXTYPE == 'R' then
--EmitMoveDataChars( { Y1=ParkY1, Y2=ParkY2, V1=ParkV1, V2=ParkV2, BeamVise=0, MoveType=3, F=GetFmaxClamp()})
EmitMoveStartChars( 3)
EmitMoveWaitChars( 3)
elseif EMT.AUXTYPE == 'U' then
EmitMoveStartChars( EgtIf( EMT.CHY_ON, 3, 2))
EmitMoveWaitChars( EgtIf( EMT.CHY_ON, 3, 2), EMT.CHY_ON or TEST_USE)
-- emissione conclusione pezzo precedente
if not TEST_USE and EMT.PRODID then
local sOut = 'G156 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2'
EmtOutput( sOut)
end
end
end
EMT.MDCHAR = {}
EMT.AUXTYPE = nil
EMT.UNL = nil
EMT.PREROT = nil
EMT.SPLITROT = nil
EMT.CHY_ON = nil
EMT.FALL = nil
EMT.SPECSPLIT = nil
EMT.RELOAD = nil
EMT.RELOAD2 = nil
EmtOutput( '(FOOTER)')
-- Se modalità test, termino il programma
if TEST_USE then
EmtOutput( 'M02')
end
end
---------------------------------------------------------------------
function OnToolData()
-- emissione dati sega a catena
if EMT.HEAD == 'H13' then
if EMT.TDIST and abs( EMT.TDIST) < 0.1 then EMT.TDIST = nil end
local sOut = 'L1='..EgtNumToString( EMT.SMAX, 0)..' L2='..EmtLenToString( EMT.TDIST or ChSawLen, 1)
sOut = sOut .. EgtIf( EMT.TCPOS == 'T101', ' G76H9998.2N401N404', ' G76H9998.2N501N504')
EmtOutput( '('..sOut..')')
-- emissione dati sega a catena o mortasatrice
elseif EMT.HEAD == 'H15' or EMT.HEAD == 'H23' then
if EMT.TDIST and abs( EMT.TDIST) < 0.1 then EMT.TDIST = nil end
local sOut = 'L1='..EgtNumToString( EMT.SMAX, 0)..' L2='..EmtLenToString( EMT.TDIST or ChSawLen, 1)
sOut = sOut .. EgtIf( EMT.TCPOS == 'T111', ' G76H9998.2N411N414', ' G76H9998.2N511N514')
EmtOutput( '('..sOut..')')
-- emissione dati aggregato BlockHaus
elseif EMT.HEAD == 'H17' then
sPos = EgtIf( #EMT.TCPOS == 2, EMT.TCPOS:gsub( 'T', 'N30'), EMT.TCPOS:gsub( 'T', 'N3'))
local sOut = 'L1='..EgtNumToString( EMT.SMAX, 0)..' L2='..EmtLenToString( ( AngTrBHOffs), 1)..' G76H9998.2'..sPos..sPos
EmtOutput( '('..sOut..')')
-- emissione dati utensile (esclusa sega a catena)
else
-- output info
local dAddLen = 0
if EMT.HEAD == 'H12' then
dAddLen = -SawOffsZ
elseif EMT.HEAD == 'H22' then
dAddLen = -Saw2OffsZ
end
local sPos
if EMT.TCPOS == 'T201' then
sPos = 'N411'
else
sPos = EgtIf( #EMT.TCPOS == 2, EMT.TCPOS:gsub( 'T', 'N30'), EMT.TCPOS:gsub( 'T', 'N3'))
end
local sOut = 'L1='..EgtNumToString( EMT.SMAX, 0)..' L2='..EmtLenToString( dAddLen + EMT.TTOTLEN, 1)..' G76H9998.2'..sPos..sPos
EmtOutput( '('..sOut..')')
end
end
---------------------------------------------------------------------
function OnDispositionStart()
--EmtOutput( '(Disposition '..EMT.DISPIND..' = '..EMT.DISPID..')')
EMT.OPEISDISP = true
-- Assegnazione parametri disposizione
EMT.TPOS = EgtGetInfo( EMT.DISPID, 'TPOS', 'd') or EMT.TPOS
EMT.Y1POS = EgtGetInfo( EMT.DISPID, 'Y1POS', 'd')
-- Se prima disposizione
if EMT.PHASE == 1 then
-- variabile appoggio perchè se non definita non posso trasformarla negativa
local nAppoDelta2TabY
if EgtGetHeadId( 'H21') and Delta2TabY then
nAppoDelta2TabY = -Delta2TabY
else
nAppoDelta2TabY = 0
end
-- emissione dati di macchina
local sOut = 'G154'..' EA'..EmtLenToString( LoadT, 2)..' EB'..EmtLenToString( MinMchY1, 2)..' EC'..EmtLenToString( MaxY1, 2)..
' ED'..EmtLenToString( MinY2, 2)..' EE'..EmtLenToString( MaxMchY2, 2)..' EF'..EmtLenToString( MillOffs, 2)..
' EG'..EmtLenToString( EgtIf( EgtGetHeadId( 'H21'), Mill2Offs, 0), 2)..' EH'..EmtLenToString( ParkMchY1, 2)..' EI'..EmtLenToString( ParkMchY2, 2)..
' EJ'..EmtLenToString( TurnerOffs, 2)..' EK'..EmtLenToString( MinV1, 2)..' EL'..EmtLenToString( MaxV1, 2)..
' EM'..EmtLenToString( MinV2, 2)..' EN'..EmtLenToString( MaxV2, 2)..
' EO'..EmtLenToString( -DeltaTabY, 2)..' EP'..EmtLenToString( DeltaTabZ, 2)..
' EQ'..EmtLenToString( nAppoDelta2TabY, 2)..' ER'..EmtLenToString( EgtIf( EgtGetHeadId( 'H21'), Delta2TabZ, 0), 2)
EmtOutput( '\n' .. sOut .. '\n')
-- carico barra
EMT.LOAD = true
else
EMT.LOAD = false
if IsEnd2Phase( EMT.PHASE - 1) then
EMT.RELOAD = true
EMT.RELOAD2 = false
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
local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL
-- dati del grezzo
local LBarra = EMT.LB
local HBarra = EMT.HB
local SBarra = EMT.SB
-- 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 AccPinze, AccMaxPinze, RidFeed = CalcDinamicaPinze( HTrave, STrave, LBarra)
if IdTrave >= 0 then
local sOut = '( SN='..IdTrave..' LBarra='..EmtLenToString( LBarra, 3)..' L='..EmtLenToString( LTrave, 3)..
' H='..EmtLenToString( HTrave, 3)..' S='..EmtLenToString( STrave, 3)..' Acc='..EgtNumToString( AccPinze, 0)..' AccMax='..EgtNumToString( AccMaxPinze, 0)..
' RidFeed='..EgtNumToString( RidFeed, 0)..' FeedMax='..EgtNumToString( EMT.FMAXPINZE / 100 * RidFeed, 3)..' )'
MyOutputNoNum( sOut)
-- parametri dinamici carrelli
sOut = 'G155 EA' .. EgtNumToString( AccPinze, 0) .. ' EB' .. EgtNumToString( AccMaxPinze, 0) ..
' EC' .. EgtNumToString( AccPinze, 0) .. ' ED' .. EgtNumToString( AccMaxPinze, 0) ..
' EE' .. EgtNumToString( AccPinze, 0) ..
' EF' .. EgtNumToString( RidFeed, 0) .. ' EG' .. EgtNumToString( RidFeed, 0) .. ' EH1 EI1' ..
' EL' .. EmtLenToString( LBarra, 3) .. ' EM' .. EmtLenToString( HTrave, 3) ..
' EN' .. EmtLenToString( STrave, 3) .. ' EO' .. EmtLenToString( LTrave, 3) ..
' EP' .. EmtLenToString( HOverM, 3)
EmtOutput( sOut)
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
-- se modalità produzione
if not TEST_USE then
-- emissione inizio lavorazione pezzo
local sOut = 'G156 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED1'
EmtOutput( sOut)
-- salto per ottimizzazione carico
if EMT.LOAD and OptimizedLoadBeam then
if NumericalControl == 'NUM' then
EmtOutput( 'G79 E80050<>0 N4 E10015=0')
else -- NUM_FLEX
EmtOutput( 'G79 E80060<>0 N4 E10015=0')
end
end
end
else
MyOutputNoNum( '(REMAIN UNLOAD)')
-- parametri dinamici carrelli
sOut = 'G155 EA' .. EgtNumToString( AccPinze, 0) .. ' EB' .. EgtNumToString( AccMaxPinze, 0) ..
' EC' .. EgtNumToString( AccPinze, 0) .. ' ED' .. EgtNumToString( AccMaxPinze, 0) ..
' EE' .. EgtNumToString( AccPinze, 0) ..
' EF' .. EgtNumToString( RidFeed, 0) .. ' EG' .. EgtNumToString( RidFeed, 0) .. ' EH1 EI1' ..
' EL' .. EmtLenToString( LBarra, 3) .. ' EM' .. EmtLenToString( HTrave, 3) ..
' EN' .. EmtLenToString( STrave, 3) .. ' EO' .. EmtLenToString( LBarra, 3) ..
' EP' .. EmtLenToString( 0, 3)
EmtOutput( sOut)
EMT.PRODID = nil
EMT.PATTID = nil
EMT.CUTID = nil
end
-- se carico barra
if EMT.LOAD then
-- ora abilito numerazione linee
EMT.NUM = true
EMT.LINENBR = 0
-- se altrimenti ricarico barra dopo rotazione speciale
elseif EMT.RELOAD then
;
-- altrimenti recupero rimanenza
else
-- determino la quota di parcheggio della trave
local ParkT = GetParkT()
-- aggiorno dati aggancio carrelli alla trave
EMT.Y1DELTA = EMT.Y1POS - ParkT
EMT.Y2DELTA = nil
if not EMT.Y1DELTA then EMT.V1NEXTPOS = ParkV1 end
-- emetto comando posizione trave
EmitBeamHeadData( { T=ParkT, Y1=EMT.Y1POS, SetHead=1, IniStatV1=3, IniStatV2=3})
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.MDCHAR > 0 then
EmtOutput( '(ROTATION)')
end
for i = 1, #EMT.MDCHAR do
EmitMoveDataChars( EMT.MDCHAR[i])
end
if #EMT.MDCHAR > 0 then
EmitMoveStartChars( 1)
EmitMoveStartChars( 2)
end
EMT.MDCHAR = {}
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
if #EMT.MDCHAR > 0 then
MyOutputNoNum( '(PART UNLOAD)')
-- movimento intermedio di apertura pinza-rulli per evitare di trovare delle collisioni
EmitParkRoller( EMT.TPOS, false)
for i = 1, #EMT.MDCHAR do
EmitMoveDataChars( EMT.MDCHAR[i])
if EMT.MDCHAR[i].V1 then EMT.V1POS = EMT.MDCHAR[i].V1 end
if EMT.MDCHAR[i].V2 then EMT.V2POS = EMT.MDCHAR[i].V2 end
end
EmitMoveStartChars( 2)
-- se dopo c'è scarico spezzone devo mettere attesa termine esecuzione
if IsRestPhase( EMT.PHASE + 1) then
EmitMoveWaitChars( 2)
else
-- posticipo attesa fine scarico alla lavorazione successiva
EMT.LASTOPEISUNLOAD = true
end
-- emissione conclusione pezzo precedente
if not TEST_USE and EMT.PRODID then
local sOut = 'G156 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2'
EmtOutput( sOut)
end
elseif EMT.SPECUNLOADING then
EmtOutput( '(PART SPEC UNLOADING)')
local dAbsHeadPos = EMT.L1pp or EMT.L1
EmitBeamHeadData( { T=dAbsHeadPos, Pz5=2})
EMT.SPECUNLOADING = nil
EMT.W2DELTA = nil
-- emissione conclusione pezzo precedente
if not TEST_USE and EMT.PRODID then
local sOut = 'G156 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2'
EmtOutput( sOut)
end
end
EMT.MDCHAR = {}
EMT.AUXTYPE = 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
EMT.HB = 0
EMT.SB = 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
local HBarra = b3Raw:getDimY()
EMT.HB = max( EMT.HB, HBarra)
local SBarra = b3Raw:getDimZ()
EMT.SB = max( EMT.SB, SBarra)
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
EMT.XMINT = b3Part:getMin():getX()
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
EMT.TUSERNOTES = EgtTdbGetCurrToolParam( MCH_TP.USERNOTES)
-- gruppo della testa
local nHSet = GetHeadSet( EMT.HEAD)
if nHSet == 1 and EMT.PRESEL_H1 then
EMT.PRESEL_H1 = nil
elseif nHSet == 2 and EMT.PRESEL_H2 then
EMT.PRESEL_H2 = nil
end
end
end
---------------------------------------------------------------------
function OnToolDeselect()
EMT.REFLOC = nil
EMT.IPLGL = false
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)
EMT.MCHSPLIT = ( EMT.MCHUSERNOTES:find( 'Split;', 1, true) ~= nil)
EMT.MCHPRECUT = ( EMT.MCHUSERNOTES:find( 'Precut;', 1, true) ~= nil)
EMT.MCHCUT = ( EMT.MCHUSERNOTES:find( 'Cut;', 1, true) ~= nil)
-- se sega a catena, aggiusto subito angolo scelto per asse virtuale A
if EMT.HEAD == 'H13' or EMT.HEAD == 'H15' then
-- valore dell'asse virtuale
dPosA = GetCurrChainSawingVirtualAxis()
-- imposto home dell'asse C1 (A=0 -> T101, A=-90 -> T104)
local MyParkCSawC1 = GetChainSawCHomeFromVirtualAxis( dPosA)
EmtModifyAxisHome( 'C1', MyParkCSawC1)
elseif EMT.HEAD == 'H23' then
-- valore dell'asse virtuale
dPosA = GetCurrChainSawingVirtualAxis()
-- imposto home dell'asse C2 (A=0 -> T111, A=-90 -> T112)
local MyParkCSawC2 = GetChainSawCHomeFromVirtualAxis( dPosA)
EmtModifyAxisHome( 'C2', MyParkCSawC2)
end
-- gestione eventuale lavorazione in doppio
local nDouType = EgtGetValInNotes( EMT.MCHUSERNOTES, 'DOUBLE', 'i')
if nDouType == 2 then
local sDouTool = EgtGetValInNotes( EMT.MCHUSERNOTES, 'TOOLDOUBLE', 's') or EgtGetValInNotes( EMT.TUSERNOTES, 'DOUBLE', 's') or ''
local sOldTool = EgtTdbGetCurrToolParam( MCH_TP.NAME)
if EgtTdbSetCurrTool( sDouTool) and EgtTdbGetCurrToolParam( MCH_TP.ACTIVE) then
-- salvo dati
EMT.DOU_TLEN = EgtTdbGetCurrToolParam( MCH_TP.LEN)
EMT.DOU_TYPE = nDouType
EMT.DOU_TOOL = sDouTool
EMT.DOU_HEAD = 'H21'
EMT.DOU_EXIT = 1
EMT.DOU_TPOS = AdjustTcPos( false, EgtTdbGetCurrToolParam( MCH_TP.TCPOS))
EMT.DOU_SPEED = EgtTdbGetCurrToolParam( MCH_TP.SPEED)
-- imposto correttamente i dati della testa 2
local OrigEMC = EMC
EMC = { HEAD = EMT.DOU_HEAD, TOTDIAM = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM)}
OnSetHead()
EMC = OrigEMC
else
EmtSetLastError( 1211, 'Missing or not active double tool of '..sOldTool)
end
EgtTdbSetCurrTool( sOldTool)
end
end
---------------------------------------------------------------------
function OnMachiningEnd()
--EmtOutput( ';Mach End')
local bMoveBothClampsOnSplit = false
if #EMT.MDCHAR > 0 then
-- Emissione split
if EMT.AUXTYPE == 'S' then
-- se c'è uno split, resetto piano
EmitResetMachining( false)
EmtOutput( '(PART SPLIT)')
local AccPinz1, AccMaxPinz1, RidFeed1 = CalcDinamicaPinze( EMT.HT, EMT.ST, EMT.LB - EMT.LT)
local AccPinz2, AccMaxPinz2, RidFeed2 = CalcDinamicaPinze( EMT.HT, EMT.ST, EMT.LT)
-- parametri dinamici carrelli
local sOut = 'G155 EA' .. EgtNumToString( AccPinz1, 0) .. ' EB' .. EgtNumToString( AccMaxPinz1, 0) ..
' EC' .. EgtNumToString( AccPinz2, 0) .. ' ED' .. EgtNumToString( AccMaxPinz2, 0) ..
' EE' .. EgtNumToString( AccPinz2, 0) ..
' EF' .. EgtNumToString( RidFeed1, 0) .. ' EG' .. EgtNumToString( RidFeed2, 0) .. ' EH1 EI1' ..
' EL' .. EmtLenToString( EMT.LB - EMT.LT, 3) .. ' EM' .. EmtLenToString( EMT.HT, 3) ..
' EN' .. EmtLenToString( EMT.ST, 3) .. ' EO' .. EmtLenToString( EMT.LT, 3) ..
' EP' .. EmtLenToString( 0, 3)
EmtOutput( sOut)
EMT.LB = EMT.LT
-- Se la prossima fase non ha lavorazioni, posso andare già allo scarico aprendo li rulli
-- se c'è un solo movimento, aggiunto il posizionamento della pinza 2 già allo scarico
if #EMT.MDCHAR == 1 and ( IsEnd2Phase( EMT.PHASE+1) or IsEndPhase( EMT.PHASE+1)) then
-- se la prima operazione attiva dopo la fase END è una disposizione, significa che la fase non ha lavorazioni e posso andare allo scarico direttamente
if EgtGetOperationType( EgtGetNextActiveOperation( EgtGetPhaseDisposition( EMT.PHASE+1))) == MCH_OY.DISP then
EMT.MDCHAR[1].IniStatV2 = 3
EMT.MDCHAR[1].IniStatY2 = -1
EMT.MDCHAR[1].FinStatY2 = -1
EMT.MDCHAR[1].MovType = nil
EMT.MDCHAR[1].Y2 = ParkV2 - EMT.LT + EMT.Y2DELTA
EMT.MDCHAR[1].V2 = ParkV2
bMoveBothClampsOnSplit = true
end
end
elseif EMT.AUXTYPE == 'U' then
EmtOutput( '(PART UNLOAD)')
-- movimento intermedio di apertura pinza-rulli per evitare di trovare delle collisioni
EmitParkRoller( EMT.TPOS, false)
EMT.V1POS = EMT.V1NEXTPOS
EMT.V2POS = EMT.V2NEXTPOS
elseif EMT.AUXTYPE == 'P' then
if EMT.PREROT then
EmtOutput( '(PART ROTATION)')
elseif EMT.FALL then
EmtOutput( '(PART FALL)')
elseif EMT.SPECSPLIT then
EmtOutput( '(PART SPEC SPLIT)')
else
EmtOutput( '(PART SPLIT 2)')
local AccPinz1, AccMaxPinz1, RidFeed1 = CalcDinamicaPinze( EMT.HT, EMT.ST, EMT.LB - EMT.LT)
local AccPinz2, AccMaxPinz2, RidFeed2 = CalcDinamicaPinze( EMT.HT, EMT.ST, EMT.LT)
-- parametri dinamici carrelli
local sOut = 'G155 EA' .. EgtNumToString( AccPinz1, 0) .. ' EB' .. EgtNumToString( AccMaxPinz1, 0) ..
' EC' .. EgtNumToString( AccPinz2, 0) .. ' ED' .. EgtNumToString( AccMaxPinz2, 0) ..
' EE' .. EgtNumToString( AccPinz2, 0) ..
' EF' .. EgtNumToString( RidFeed1, 0) .. ' EG' .. EgtNumToString( RidFeed2, 0) .. ' EH1 EI1' ..
' EL' .. EmtLenToString( EMT.LB, 3) .. ' EM' .. EmtLenToString( EMT.HT, 3) ..
' EN' .. EmtLenToString( EMT.ST, 3) .. ' EO' .. EmtLenToString( EMT.LT, 3) ..
' EP' .. EmtLenToString( 0, 3)
EmtOutput( sOut)
EMT.LB = EMT.LT
end
end
-- forzo reset piano locale
EMT.REFLOC = nil
EMT.IPLGL = false
end
for i = 1, #EMT.MDCHAR do
EmitMoveDataChars( EMT.MDCHAR[i])
if EMT.MDCHAR[i].V1 then EMT.V1POS = EMT.MDCHAR[i].V1 end
if EMT.MDCHAR[i].V2 then EMT.V2POS = EMT.MDCHAR[i].V2 end
end
if #EMT.MDCHAR > 0 then
if EMT.AUXTYPE == 'S' then
if bMoveBothClampsOnSplit then
EmitMoveStartChars( 3)
EmitMoveWaitChars( 3)
else
EmitMoveStartChars( 1)
EmitMoveWaitChars( 1)
end
elseif EMT.AUXTYPE == 'U' then
local nMoveType = EgtIf( EMT.CHY_ON, 3, 2)
EmitMoveStartChars( nMoveType)
-- se dopo cè scarico spezzone devo mettere attesa termine esecuzione
if IsRestPhase( EMT.PHASE + 1) then
EmitMoveWaitChars( nMoveType)
else
EmitMoveWaitChars( nMoveType, EMT.CHY_ON or TEST_USE)
EMT.LASTOPEISUNLOAD = true
end
-- emissione conclusione pezzo precedente (se non in modalità test)
if not TEST_USE and EMT.PRODID then
local sOut = 'G156 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2'
EmtOutput( sOut)
end
elseif EMT.AUXTYPE == 'P' then
EmitMoveStartChars( 3)
EmitMoveWaitChars( 3)
if EMT.FALL then
EmtOutput( 'G157 EB1')
-- emissione conclusione pezzo (se non in modalità test)
if not TEST_USE and EMT.PRODID then
local sOut = 'G156 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2'
EmtOutput( sOut)
end
elseif not EMT.PREROT and not EMT.SPECSPLIT then
EmtOutput( 'M77')
end
end
end
if EMT.SPECUNLOADING then
EmtOutput( '(PART SPEC UNLOADING)')
EmitBeamHeadData( { T=EMT.L1, Pz5=2})
EMT.SPECUNLOADING = nil
EMT.W2DELTA = nil
-- emissione conclusione pezzo (se non in modalità test)
if not TEST_USE and EMT.PRODID then
local sOut = 'G156 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2'
EmtOutput( sOut)
end
end
EMT.MDCHAR = {}
EMT.AUXTYPE = nil
EMT.PREVTOOL = EMT.TOOL
EMT.PREVHEAD = EMT.HEAD
EMT.PREVTCPOS = EMT.TCPOS
-- se taglio finale, aggiorno lunghezza barra
if EMT.MCHCUT then
EMT.LB = EMT.LT + ( EMT.X_OFF or 0)
end
-- salvo anche utlimo utensile su testa
local nHSet = GetHeadSet( EMT.HEAD)
if nHSet == 1 then
EMT.PREVTOOL_H1 = EMT.TOOL
EMT.PREVHEAD_H1 = EMT.HEAD
EMT.PREVTCPOS_H1 = EMT.TCPOS
EMT.PREVHOMEX_H1 = EgtGetAxisHomePos( 'X1')
EMT.PREVHOMEB_H1 = EgtGetAxisHomePos( 'B1')
EMT.PREVHOMEC_H1 = EgtGetAxisHomePos( 'C1')
elseif nHSet == 2 then
EMT.PREVTOOL_H2 = EMT.TOOL
EMT.PREVHEAD_H2 = EMT.HEAD
EMT.PREVTCPOS_H2 = EMT.TCPOS
EMT.PREVHOMEX_H2 = EgtGetAxisHomePos( 'X2')
EMT.PREVHOMEB_H2 = EgtGetAxisHomePos( 'B2')
EMT.PREVHOMEC_H2 = EgtGetAxisHomePos( 'C2')
end
EMT.DOU_TYPE = nil
end
---------------------------------------------------------------------
function OnPathStart()
-- non ancora iniziata la lavorazione
EMT.MCHFIRST = true
EMT.MCHFIRSTFEED = true
-- se piano locale compatibile
if not HeadIsChainSaw( EMT.HEAD) then
vtExtr = Vector3d( EMT.EXTR)
else
vtExtr = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
end
if EMT.REFLOC and AreSameVectorApprox( vtExtr, EMT.IPLGLFR:getVersZ()) then
;
-- altrimenti primo posizionamento sempre in globale
else
EMT.REFLOC = nil
EMT.IPLGL = false
end
-- leggo se ancora presa iniziale carrello
--EMT.CNT = EgtGetInfo( EMT.PATHID, 'CNT', 'i')
--EmtOutput( 'CNT='.. tostring( EMT.CNT or 0))
-- se taglio di separazione, verifico se ci sarà caduta
if EMT.MCHSPLIT then
local sCmd = EgtGetInfo( EMT.PATHID, 'AE1') or ''
if sCmd:find( 'Fall', 1, true) then
EMT.TO_FALL = true
elseif sCmd:find( 'SpecSplit', 1, true) then
EMT.TO_SPECSPLIT = true
end
end
-- se taglio di precut verifico quanto è più lungo il grezzo rispetto al pezzo (non tiene conto dell'ultimo cubetto)
EMT.DELTA_LT = 0
if EMT.MCHPRECUT then
local dCosA = sqrt( max( 1 - EMT.EXTR[1] * EMT.EXTR[1], 0))
EMT.DELTA_LT = max( EMT.XMINT - Point3d( EMT.MMAX):getX() - dCosA * EMT.TDIAM / 2, 0)
end
-- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento)
EmtResetPrev()
EMT.AUXCMD = {}
EMT.MDCHAR = {}
-- si salvano gli approcci e retrazioni della lavorazione
EMT.APPROACH = {}
EMT.APPROACH.CLIMBS = EmtGetClimbs( EMT.PATHID)
EMT.APPROACH.RISES = EmtGetRises( EMT.PATHID)
if EMT.DBLPATHID then
EMT.APPROACH.DBLCLIMBS = EmtGetClimbs( EMT.DBLPATHID)
EMT.APPROACH.DBLRISES = EmtGetRises( EMT.DBLPATHID)
if not EMT.APPROACH.DBLCLIMBS or not EMT.APPROACH.DBLRISES then
EmtSetLastError( 1212, "UNEXPECTED ERROR on movements other head")
end
end
end
---------------------------------------------------------------------
function OnPathEnd()
-- salvo dati precedenti
EMT.L2pp = EMT.L2o
EMT.AUXTYPE = nil
EMT.UNL = nil
EMT.PREROT = nil
EMT.SPLITROT = nil
EMT.CHY_ON = nil
EMT.FALL = nil
EMT.TO_FALL = nil
EMT.SPECSPLIT = nil
EMT.TO_SPECSPLIT = nil
EMT.MDCHAR = {}
EMT.PREVTOOL = EMT.TOOL
end
---------------------------------------------------------------------
function OnPathStartAux()
--EgtOutLog( 'OnPathStartAux - ' .. EgtNumToString( EMT.AUXIND, 0) .. ' - ' .. EMT.AUX)
-- salvo il comando per processarlo successivamente
table.insert( EMT.AUXCMD, EMT.AUX)
end
---------------------------------------------------------------------
function ProcessPathStartAux( sCmd, nInd)
-- se richiesto, preparo il carico barra
if EMT.LOAD or EMT.RELOAD then
PrepareLoad( sCmd, nInd, true)
-- se altrimenti carico dopo rotazione
elseif EMT.POSTROT then
PreparePostRotation( sCmd, nInd)
-- altrimenti, preparo lo spostamento carrelli
else
PrepareMoveChar( sCmd, nInd)
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 Cmd[1] == '0' and Cmd[2] == 'Unloading SpecSplit' then
EMT.AUXTYPE = 'P'
EMT.SPECUNLOADING = true
else
EMT.AUXTYPE = 'R'
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
elseif Cmd[1] == '0' and Cmd[2] == 'SpecSplit' then
EMT.SPECSPLIT = true
elseif Cmd[1] == '0' and Cmd[2] == 'Unloading SpecSplit' then
EMT.SPECUNLOADING = 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, EMT.AUXIND, false)
-- per lo scarico della rimanenza
else
PrepareResidue( EMT.AUX, EMT.AUXIND)
end
elseif EMT.AUXTYPE == 'S' then
-- per lo split
PrepareSplit( EMT.AUX, EMT.AUXIND)
elseif EMT.AUXTYPE == 'U' then
-- per lo scarico
PrepareUnload( EMT.AUX, EMT.AUXIND)
elseif EMT.AUXTYPE == 'P' then
-- per la pre-rotazione
PreparePreRotation( EMT.AUX, EMT.AUXIND)
end
end
---------------------------------------------------------------------
function OnRapid()
if EMT.OPEISDISP then
return
end
local bFirstClimb = EgtGetInfo( EMT.MOVEID, 'FirstClimb', 'b')
local bLastClimb = EgtGetInfo( EMT.MOVEID, 'LastClimb', 'b')
local bFirstRise = EgtGetInfo( EMT.MOVEID, 'FirstRise', 'b')
local bLastRise = EgtGetInfo( EMT.MOVEID, 'LastRise', 'b')
local bUniqueClimb = EgtGetInfo( EMT.MOVEID, 'UniqueClimb', 'b')
local bUniqueRise = EgtGetInfo( EMT.MOVEID, 'UniqueRise', 'b')
-- se il link non arriva dalla OnSpecial, non ha nessuna nota
local bStdClimb = ( EMT.FLAG2 ~= 2 and EMT.FLAG == 2)
local bStdRise = ( EMT.FLAG2 ~= 2 and EMT.FLAG == 3)
local bStdMachRapid = ( EMT.FLAG2 == 0 and ( EMT.FLAG == 0 or EMT.FLAG == 1))
-- se Split e non Caduta lascio agganciata solo la pinza Y2 alla fine dei movimenti
local bSplitMach = ( EMT.MCHUSERNOTES:find( 'Split', 1, true) ~= nil)
local sPostMove = ''
local sHeadToMoveFirst = EgtGetInfo( EMT.MOVEID, 'HeadToMoveFirst', 's') or false
local bFirstMoveOnlyH1 = sHeadToMoveFirst and sHeadToMoveFirst == 'H1'
local bFirstMoveOnlyH2 = sHeadToMoveFirst and sHeadToMoveFirst == 'H2'
-- tutte le teste devono passare dalla gestione nuovi link, altrimenti errore
if not IsNewLinkHead( EMT.HEAD) then
EmtSetLastError( 1211, "UNEXPECTED ERROR on links")
end
-- gruppo della testa
local nHSet = GetHeadSet( EMT.HEAD)
-- se primo movimento della lavorazione, gestione speciale
if EMT.MCHFIRST then
-- se carico trave
if EMT.LOAD then
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
EmtResetPrev()
EMT.V2POS = ParkV2
-- primo posizionamento
local bOnlyCharY = true
for i = 1, #EMT.AUXCMD do
ProcessPathStartAux( EMT.AUXCMD[i], i)
end
EMT.AUXCMD = {}
-- se Split lascio agganciata solo la pinza Y2 alla fine dei movimenti
if EMT.MCHSPLIT and #EMT.MDCHAR > 0 and not EMT.TO_FALL and not EMT.TO_SPECSPLIT then
EMT.MDCHAR[#EMT.MDCHAR].FinStatY1 = 1
end
for i = 1, #EMT.MDCHAR do
EmitMoveDataChars( EMT.MDCHAR[i])
if EMT.MDCHAR[i].MovType ~= 1 then bOnlyCharY = false end
end
EMT.MDCHAR = {}
local bParkV = false
-- verifica se serve aprire i carrelli
local bCondBase = EMT.MCHFIRST or EMT.MOVE == 0
local bCondPosition = EMT.V1POS < EMT.V1NEXTPOS - 1 or
EMT.V2POS > EMT.V2NEXTPOS + 1 or
RollerParkingNeeded( EMT.HEAD, EMT.R1, EMT.R2, EMT.R1, EMT.R2)
if bCondBase and bCondPosition then
bParkV = true
end
local bNlhParkV = ( EMT.MOVE == 0 and ( EMT.FLAG2 == 1 or EMT.FLAG2 == 2))
if bNlhParkV then
bParkV = ( EMT.FLAG == 2 and bParkV) or ( not EMT.MCHSPLIT or bSplit)
end
if bParkV or bNlhParkV then
local bMchSplit = ( bNlhParkV and EMT.MCHSPLIT and bSplit)
local bAgg = EgtExistsInfo( EMT.PATHID, 'CNT')
if EMT.SPLIT_Y1DELTA and not EMT.MCHSPLIT then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end
local dPosT = EMT.TPOS or EMT.L1op
EmitParkRoller( dPosT, bMchSplit, bAgg)
end
if EMT.SPLIT_Y1DELTA then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end
EmitMoveStartChars( EgtIf( bOnlyCharY, 1, 3))
EmtOutput( '( *** '..EMT.MCHNAME..'/'..EMT.TOOL..' *** )')
local dTRad, dTLen = GetToolRadLen()
-- emissione primo movimento, in home
EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, C=EMT.R1, B=EMT.R2, TRad=dTRad, TLen=dTLen, S=CalcRealSpeed( EMT.S)})
EmitMoveStartHead( nHSet)
EmitMoveWaitHead( nHSet)
EmitMoveWaitChars( EgtIf( bOnlyCharY, 1, 3))
else
-- controllo se ci sono spostamenti dei carrelli programmati
local bChangeCarriageClamping = GetMovesInAuxCmd( EMT.AUXCMD)
local bRotAxChanged = ( abs( EMT.R1prec - EMT.R1) > GEO.EPS_SMALL or abs( EMT.R2prec - EMT.R2) > GEO.EPS_SMALL)
-- se non ci sono riposizionamenti dei carrelli, se stesso utensile, e c'è ancora piano attivo dalla lavorazione precedente, allora questo è un climb
if EMT.PLANEACTIVE and EMT.TOOL == EMT.PREVTOOL and not bChangeCarriageClamping and not bRotAxChanged then
-- dichiaro finita lavorazione precedente
local sOut = 'G157 EA1'
EmtOutput( sOut)
sOut = string.gsub( string.gsub( EMT.MCHNAME..'/'..EMT.TOOL, '%(', '['), '%)', ']')
if EMT.DOU_TYPE then sOut = sOut .. ' Double' end
EmtOutput( '( *** '..sOut..' *** )')
-- gestione comandi rulli
local sPreMove = ''
if GetV1ToCloseNum( true) then
sPostMove = ' EC-3'
else
sPreMove = ' EC3'
end
if GetV2ToCloseNum( true) then
sPostMove = sPostMove .. ' ED-3'
else
sPreMove = sPreMove .. ' ED3'
end
-- comandi rulli prima di movimento (aperture)
if #sPreMove > 0 then
EmtOutput( 'G157 EA2' .. sPreMove)
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', 1, true) then
EmtOutput( 'M175')
end
EMT.MCHFIRST = false
EMT.PLANEACTIVE = true
-- dichiaro che è un movimento standard
bStdMachRapid = true
else
if bStdMachRapid then
bStdMachRapid = false
bStdClimb = true
end
-- si disattiva piano a meno che non sia lavorazione con stesso utensile e stesso orientamento assi
if EMT.PLANEACTIVE then
EmitResetMachining( false)
end
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
EmtResetPrev()
EmtOutput( '( *** '..EMT.MCHNAME..'/'..EMT.TOOL..' *** )')
-- eventuale movimento carrelli
for i = 1, #EMT.AUXCMD do
ProcessPathStartAux( EMT.AUXCMD[i], i)
-- se ultimo comando e lavorazione di split, sgancio il carro Y1
if i == #EMT.AUXCMD and EMT.MCHSPLIT and not EMT.TO_SPECSPLIT and not EMT.TO_FALL then
EMT.SPLIT_Y1DELTA = EMT.Y1DELTA
EMT.Y1DELTA = nil
end
end
EMT.AUXCMD = {}
-- se Split lascio agganciata solo la pinza Y2 alla fine dei movimenti
if EMT.MCHSPLIT and #EMT.MDCHAR > 0 and not EMT.TO_FALL and not EMT.TO_SPECSPLIT then
EMT.MDCHAR[#EMT.MDCHAR].FinStatY1 = 1
end
for i = 1, #EMT.MDCHAR do
-- se è appena stato lanciato lo scarico, si aspetta la fine
if EMT.LASTOPEISUNLOAD then
EMT.LASTOPEISUNLOAD = nil
EmitMoveWaitChars( 2)
end
EmitMoveDataChars( EMT.MDCHAR[i])
end
if #EMT.MDCHAR > 0 then
local nMoveType = EgtIf( EMT.POSTROT or EMT.RELOAD, 1, 3)
EmitMoveStartChars( nMoveType)
EmitMoveWaitChars( nMoveType)
end
EMT.MDCHAR = {}
local bParkV = false
-- verifica se serve aprire i carrelli
local bCondBase = EMT.MCHFIRST or EMT.MOVE == 0
local bCondPosition = EMT.V1POS < EMT.V1NEXTPOS - 1 or
EMT.V2POS > EMT.V2NEXTPOS + 1 or
RollerParkingNeeded( EMT.HEAD, EMT.R1prec, EMT.R2prec, EMT.R1, EMT.R2)
if bCondBase and bCondPosition then
bParkV = true
end
local bNlhParkV = ( EMT.MOVE == 0 and ( EMT.FLAG2 == 1 or EMT.FLAG2 == 2))
if bNlhParkV then
bParkV = ( EMT.FLAG == 2 and bParkV) or ( not EMT.MCHSPLIT or bSplit)
end
if bParkV or bNlhParkV then
local bMchSplit = ( bNlhParkV and EMT.MCHSPLIT and bSplit)
local bAgg = EgtExistsInfo( EMT.PATHID, 'CNT')
if EMT.SPLIT_Y1DELTA and not EMT.MCHSPLIT then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end
local dPosT = EMT.TPOS or EMT.L1op
EmitParkRoller( dPosT, bMchSplit, bAgg)
end
if EMT.SPLIT_Y1DELTA then EMT.Y1DELTA = EMT.SPLIT_Y1DELTA end
-- se era stato lanciata la preselezione di un utensile, prima di muovere la testa asopetto che sia finito
if EMT.START_PRESEL then
EmitMoveWaitHead( EMT.START_PRESEL)
EMT.START_PRESEL = nil
end
-- se la testa 1 deve andare per prima in posizione, start e attesa movimento
if bFirstMoveOnlyH2 then
if EMT.APPROACH.DBLCLIMBS and #EMT.APPROACH.DBLCLIMBS > 0 then
EmitMoveDataHead( 2, { X=-EMT.APPROACH.DBLCLIMBS[1].L2, Z=EMT.APPROACH.DBLCLIMBS[1].L3, C=EMT.APPROACH.DBLCLIMBS[1].R1, B=EMT.APPROACH.DBLCLIMBS[1].R2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED})
EmitMoveStartHead( 2)
EmitMoveWaitHead( 2)
-- si rimuove il primo movimento
table.remove( EMT.APPROACH.DBLCLIMBS, 1)
end
end
local dTRad, dTLen = GetToolRadLen()
EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, TRad=dTRad, TLen=dTLen, S=CalcRealSpeed( EMT.S)})
-- se la testa 1 deve andare per prima in posizione, start e attesa movimento
if bFirstMoveOnlyH1 then
EmitMoveStartHead( 1)
EmitMoveWaitHead( 1)
end
end
end
EMT.MCHFIRST = false
-- movimento standard CLIMB
elseif EMT.FLAG == 2 then
-- se non ho ancora impostato il piano, movimenti in assoluto
if not EMT.PLANEACTIVE then
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
local dTRad, dTLen = GetToolRadLen()
EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, C=EMT.R1, B=EMT.R2, TRad=dTRad, TLen=dTLen, S=CalcRealSpeed( EMT.S)})
-- altrimenti è un rapido standard
else
bStdMachRapid = true
end
-- movimento standard RISE
elseif EMT.FLAG == 3 then
EMT.REFLOC = nil
EMT.IPLGL = false
-- al primo movimento di risalita, si disattiva piano generico
if bFirstRise or bUniqueRise or bStdRise then
EmitResetMachining( true)
local dPosT = EMT.TPOS or EMT.L1op
EmitParkRoller( dPosT, bSplitMach)
end
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, C=EMT.R1, B=EMT.R2})
-- su ultimo rapido in uscita, comandi di attesa movimenti
if bLastRise or bUniqueRise or bStdRise then
EmitMoveStartHead( nHSet)
-- se lavorazione in doppio
if nHSet == 1 and EMT.DOU_TYPE == 2 then
if EMT.APPROACH.DBLRISES and #EMT.APPROACH.DBLRISES > 0 then
for i = 1, #EMT.APPROACH.DBLRISES do
EmitMoveDataHead( 2, { X=-EMT.APPROACH.DBLRISES[i].L2, Z=EMT.APPROACH.DBLRISES[i].L3, C=EMT.APPROACH.DBLRISES[i].R1, B=EMT.APPROACH.DBLRISES[i].R2, TPos=EMT.DOU_TPOS})
end
EmitMoveStartHead( 2)
EmitMoveWaitHead( 2)
end
end
EmitMoveWaitHead( nHSet)
EMT.ZMAX = true
ToolPreSelectionSingleHead( EMT.MCHID)
end
-- se altrimenti movimento in Home
elseif EMT.FLAG == 4 then
-- non previsto
-- altrimenti errore
else
end
-- se ultimo, oppure unico, movimento in discesa sul pezzo, attivo piano generico. Se già attivo siginifica che è seconda lavorazione compatibile
if not EMT.PLANEACTIVE and ( bLastClimb or bUniqueClimb or bStdClimb) then
EMT.ZMAX = false
-- movimenti testa
-- scrittura comando start movimenti testa
EmitMoveStartHead( nHSet)
-- se lavorazione in doppio
if nHSet == 1 and EMT.DOU_TYPE == 2 then
if EMT.APPROACH.DBLCLIMBS and #EMT.APPROACH.DBLCLIMBS > 0 then
for i = 1, #EMT.APPROACH.DBLCLIMBS do
EmitMoveDataHead( 2, { X=-EMT.APPROACH.DBLCLIMBS[i].L2, Z=EMT.APPROACH.DBLCLIMBS[i].L3, C=EMT.APPROACH.DBLCLIMBS[i].R1, B=EMT.APPROACH.DBLCLIMBS[i].R2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED})
end
EmitMoveStartHead( 2)
EmitMoveWaitHead( 2)
end
-- altrimenti preselezione su altra testa
else
PreselectNextDiffHead( EMT.MCHID, EMT.HEAD)
end
-- aspetto esecuzione movimento testa 2
EmitMoveWaitHead( nHSet)
-- movimenti carrelli
if EMT.LOAD then
-- se pezzo a destra, dichiaro cabina sinistra da parcheggiare
if not EMT.Y1DELTA then
EMT.V1NEXTPOS = ParkV1
end
local BhData = { T=EMT.L1}
if EMT.Y1DELTA then
BhData.Y1 = EMT.L1 + EMT.Y1DELTA
BhData.ViseY1 = 1
else
BhData.Y1 = ParkY1
BhData.ViseY1 = 2
end
if EMT.MCHSPLIT and EMT.Y2DELTA then
BhData.ViseY1 = 3
end
if EMT.Y2DELTA then
BhData.Y2 = EMT.L1 + EMT.Y2DELTA
BhData.ViseY2 = 1
else
BhData.Y2 = EmtLenToString( ParkY2)
BhData.ViseY2 = 2
end
if GetV1ToCloseNum() then
BhData.FinStatV1 = -3
EMT.V1POS = EMT.V1NEXTPOS
BhData.V1 = EMT.V1POS
else
BhData.IniStatV1 = 3
EMT.V1POS = ParkV1
BhData.V1 = EMT.V1POS
end
if GetV2ToCloseNum() then
BhData.FinStatV2 = -3
EMT.V2POS = EMT.V2NEXTPOS
BhData.V2 = EMT.V2POS
else
BhData.IniStatV2 = 3
EMT.V2POS = ParkV2
BhData.V2 = EMT.V2POS
end
if EMT.W2DELTA then
BhData.W = EMT.L1 + EMT.W2DELTA
end
EmitBeamHeadData( BhData)
EMT.LOAD = false
else
local BhData = { T=EMT.L1}
if EMT.Y1DELTA then
BhData.Y1 = EMT.L1 + EMT.Y1DELTA - ( EMT.X_OFF or 0)
BhData.ViseY1 = 1
else
BhData.Y1 = EgtIf( EMT.Y1POS, EMT.Y1POS, ParkY1)
BhData.ViseY1 = 2
end
if EMT.MCHSPLIT and EMT.Y2DELTA then
BhData.ViseY1 = 3
end
if EMT.Y2DELTA then
BhData.Y2 = EMT.L1 + EMT.Y2DELTA - ( EMT.X_OFF or 0)
BhData.ViseY2 = 1
else
if not EMT.LASTOPEISUNLOAD or GetV2ToCloseNum() then
BhData.Y2 = ParkY2
BhData.ViseY2 = 2
end
end
if GetV1ToCloseNum() then
BhData.FinStatV1 = -3
EMT.V1POS = EMT.V1NEXTPOS
BhData.V1 = EMT.V1POS
elseif abs( EMT.V1POS - ParkV1) > 0.1 then
BhData.IniStatV1 = 3
EMT.V1POS = ParkV1
BhData.V1 = EMT.V1POS
end
if GetV2ToCloseNum() then
BhData.FinStatV2 = -3
EMT.V2POS = EMT.V2NEXTPOS
BhData.V2 = EMT.V2POS
elseif abs( EMT.V2POS - ParkV2) > 0.1 or EMT.W2DELTA then
if not EMT.LASTOPEISUNLOAD then
BhData.IniStatV2 = 3
EMT.V2POS = ParkV2
BhData.V2 = EMT.V2POS
end
end
if EMT.W2DELTA then
if EMT.TO_SPECSPLIT then
BhData.W = EMT.L1 + EMT.W2DELTA
else
BhData.Pz5 = 1
end
end
-- se si è lanciato la scarico mascherato, ma devo muovere pinza o paratia lato scarico, aspetto i movimenti
if EMT.LASTOPEISUNLOAD and ( BhData.Y2 or BhData.IniStatV2) then
EMT.LASTOPEISUNLOAD = nil
EmitMoveWaitChars( 2)
end
EmitBeamHeadData( BhData)
EMT.POSTROT = false
EMT.RELOAD = false
EMT.RELOAD2 = nil
EMT.SPLIT_Y1DELTA = nil
end
-- se taglio di coda senza residuo da scaricare, emetto M175 per accelerare il carico della barra successiva
if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Cut', 1, true) then
EmtOutput( 'M175')
end
-- aggiusto assi
EMT.L2 = -EMT.L2
-- calcolo per piano generico
CalcInterpPlane()
EMT.REFLOC = true
-- trasformo i punti nel piano
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
-- annullo precedenti per forzare scrittura
EMT.L1p = nil
EMT.L2p = nil
EMT.L3p = nil
local sDouFlag = EgtIf( EMT.DOU_TYPE, ' EE1', '')
EmtOutput( 'G142'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..EMT.IPLGLSTR..EgtIf( nHSet~=2, ' EU1', ' EU2')..sDouFlag..' EF'..GetFmaxClamp())
EMT.PLANEACTIVE = true
-- annullo precedenti per forzare scrittura
EMT.R1p = nil
EMT.R2p = nil
-- emissione movimento
local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R2')..EmtGetAxis('R1')
if #sAxes > 0 then
if EmitRapidInG1 then
local sFeed = ' F30000'
EmtOutput( 'G1' .. sAxes .. sFeed)
else
EmtOutput( 'G0' .. sAxes)
end
end
end
if bStdMachRapid then
-- trasformo i punti nel piano
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
-- emissione movimento
local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R2')..EmtGetAxis('R1')
if #sAxes > 0 then
if EmitRapidInG1 then
local sFeed = ' F30000'
EmtOutput( 'G1' .. sAxes .. sFeed)
else
EmtOutput( 'G0' .. sAxes)
end
end
-- info da scrivere solo se lavorazione con piano di lavoro mantenuto da precedente
if #sPostMove > 0 then
EmtOutput( 'G157 EA2' .. sPostMove)
end
end
-- aggiorno valori come precedenti
EMT.TPOS = EMT.L1o
EmtUpdatePrev()
-- si salva posizione assi rotanti
EMT.R1prec = EMT.R1
EMT.R2prec = EMT.R2
end
---------------------------------------------------------------------
function OnLinear()
-- se necessario, impostazione riferimento locale
if not EMT.REFLOC then
-- gruppo della testa
local nHSet = GetHeadSet( EMT.HEAD)
-- calcolo per piano generico
CalcInterpPlane()
EMT.REFLOC = true
-- 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
local sDouFlag = EgtIf( EMT.DOU_TYPE, ' EE1', '')
EmtOutput( 'G142'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..EMT.IPLGLSTR..EgtIf( nHSet~=2, ' EU1', ' EU2')..sDouFlag..' EF'..GetFmaxClamp())
EMT.PLANEACTIVE = true
-- emissione movimento
local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R2')..EmtGetAxis('R1')
EmtOutput( sOut)
-- aggiorno precedenti
EMT.MOVE = 0
EmtUpdatePrev()
EMT.MOVE = 1
-- ripristino posizione attuale
EMT.L1 = OldL1
EMT.L2 = OldL2
EMT.L3 = OldL3
end
-- aggiustamento valori
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
-- se lavorazione in doppio, da questo movimento bisogna passare ad accoppiamento in parallelo
if not EMT.DBLHEADPARA and EMT.DOU_TYPE == 2 and
( ( EMT.MCHTYPE == MCH_MY.DRILLING and EMT.FLAG == 105) or ( EMT.MCHTYPE == MCH_MY.POCKETING and EMT.FLAG == 405))then
EmtOutput( "G157 EE-1")
EMT.DBLHEADPARA = true
end
-- se testa accoppiata in parallelo, in uscita si disaccoppia per tornare ad accoppiamento speculare
if EMT.DBLHEADPARA and
( ( EMT.MCHTYPE == MCH_MY.DRILLING and EMT.FLAG == 104) or ( EMT.MCHTYPE == MCH_MY.POCKETING and EMT.FLAG == 404)) then
EmtOutput( "G157 EE1")
EMT.DBLHEADPARA = nil
end
-- 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
-- arresto preciso in angoli di fresature per utensili (non penne) di piccolo diametro
local sSlowDown = ''
if EMT.MCHTYPE == MCH_MY.MILLING and EMT.TTOTDIAM < 15 and abs( EMT.S) > 1000 and ( bL1 or bL2) and not bL3 then
sSlowDown = ' G9'
end
-- aggiungo feed
local sFeed = EmtGetFeed()
-- emetto linea
EmtOutput( "G1"..sSlowDown..sAxes..sFeed)
-- aggiorno valori come precedenti
EMT.TPOS = EMT.L1o
EmtUpdatePrev()
end
---------------------------------------------------------------------
function OnArc()
-- se necessario, impostazione riferimento locale
if not EMT.REFLOC then
-- gruppo della testa
local nHSet = GetHeadSet( EMT.HEAD)
-- calcolo per piano generico
CalcInterpPlane()
EMT.REFLOC = true
-- 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
local sDouFlag = EgtIf( EMT.DOU_TYPE, ' EE1', '')
EmtOutput( 'G142'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..EMT.IPLGLSTR..EgtIf( nHSet~=2, ' EU1', ' EU2')..sDouFlag..' EF'..GetFmaxClamp())
EMT.PLANEACTIVE = true
-- emissione movimento
local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R2')..EmtGetAxis('R1')
EmtOutput( sOut)
-- aggiorno precedenti
local nOriginalMove = EMT.MOVE
EMT.MOVE = 0
EmtUpdatePrev()
EMT.MOVE = nOriginalMove
-- ripristino posizione attuale
EMT.L1 = OldL1
EMT.L2 = OldL2
EMT.L3 = OldL3
end
-- non modale su archi
EmtResetPrevLinear()
-- aggiustamento valori
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
-- se lavorazione in doppio, da questo movimento bisogna passare ad accoppiamento in parallelo
if not EMT.DBLHEADPARA and EMT.DOU_TYPE == 2 and
( ( EMT.MCHTYPE == MCH_MY.DRILLING and EMT.FLAG == 105) or ( EMT.MCHTYPE == MCH_MY.POCKETING and EMT.FLAG == 405))then
EmtOutput( "G157 EE-1")
EMT.DBLHEADPARA = true
end
-- valori degli assi
local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..
EmtGetAxis('R1')..EmtGetAxis('R2')
-- 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)
-- emetto arco
EmtOutput( sArc..sAxes..sRad..sFeed)
-- aggiorno valori come precedenti
EMT.TPOS = EMT.L1o
EmtUpdatePrev()
end
---------------------------------------------------------------------
function CalcCharStatusN( sCmd)
-- aperto
if sCmd == '0' then
return 1
-- chiuso
elseif sCmd == '1' then
return -1
end
end
---------------------------------------------------------------------
function PrepareLoad( sCmd, nInd, bStart)
local Cmd = EgtSplitString( sCmd)
if Cmd[1] == '0' then
-- se inizio
if nInd == 1 then
-- imposto stato pinze
EMT.ISY1 = 1
EMT.FSY1 = EMT.ISY1
EMT.ISY2 = 1
EMT.FSY2 = EMT.ISY2
EMT.BV = 0
end
-- se dichiarazione inizio riposizionamento carrelli
if Cmd[2] == 'CARR_MOVE' then
if bStart then
EMT.RELOAD = false
else
EMT.RELOAD2 = true
end
table.insert( EMT.MDCHAR, { Start=1})
table.insert( EMT.MDCHAR, { Wait=1})
end
elseif Cmd[1] == '1' then
if Cmd[2] ~= 'Z' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
local MoveY1 = GetCmdAxMove( Cmd, 'Y1')
local MoveY2 = GetCmdAxMove( Cmd, 'Y2')
if MoveY1 then MDChar.Y1 = MoveY1 end
if MoveY2 then MDChar.Y2 = MoveY2 end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar)
EMT.Y1POS = MoveY1 or EMT.Y1POS
EMT.TPOS = GetCmdAxMove( Cmd, 'T') or EMT.TPOS
end
elseif Cmd[1] == '2' then
-- se in riposizionamento carrelli
if #EMT.MDCHAR > 0 and EMT.MDCHAR[1].MovType == 3 then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
local MoveY1 = GetCmdAxMove( Cmd, 'Y1')
local MoveY2 = GetCmdAxMove( Cmd, 'Y2')
if MoveY1 then MDChar.Y1 = MoveY1 end
if MoveY2 then MDChar.Y2 = MoveY2 end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar)
elseif Cmd[2] == 'Y1' then
local sBeamRot = '0'
local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL
local nLoad90 = EgtGetInfo( BtlInfoId, 'LOAD90', 'i') or 0
sBeamRot = tostring( nLoad90) or '0'
local sAux = ' EL'..sBeamRot
-- local sAux = ' (E80057='..sBeamRot..' E80058=0)' vecchio comando utilizzato su ONE
local MoveY1 = tonumber( Cmd[3]) + TurnerOffs
local MDChar = { Y1=MoveY1, V1=ParkV1, IniStatY1=75, FinStatY1=-1, BeamVise=0, MovType=1, Aux=sAux}
table.insert( EMT.MDCHAR, MDChar)
EMT.V1POS = ParkV1
elseif Cmd[2] == 'T' then
local MDChar = { Y1=tonumber(Cmd[3]), IniStatY1=76, FinStatY1=EMT.FSY1, BeamVise=0, MovType=1}
table.insert( EMT.MDCHAR, MDChar)
end
EMT.TPOS = GetCmdAxMove( Cmd, 'T') or EMT.TPOS
elseif Cmd[1] == '3' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
local MoveY1 = GetCmdAxMove( Cmd, 'Y1')
local MoveY2 = GetCmdAxMove( Cmd, 'Y2')
if MoveY1 then MDChar.Y1 = MoveY1 end
if MoveY2 then MDChar.Y2 = MoveY2 end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar)
EMT.TPOS = GetCmdAxMove( Cmd, 'T') or EMT.TPOS
elseif Cmd[1] == '4' then
-- richiesta movimento a ZMAX già gestita
if Cmd[2] == '1' then
EMT.ROLL_IN = true
end
elseif Cmd[1] == '11' then
EMT.ISY1 = CalcCharStatusN( Cmd[2])
EMT.FSY1 = EMT.ISY1
EMT.BV = EgtIf( Cmd[2] ~= '0', 1, 2)
if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY1 = EMT.FSY1 end
elseif Cmd[1] == '12' then
EMT.ISY2 = CalcCharStatusN( Cmd[2])
EMT.FSY2 = EMT.ISY2
EMT.BV = EgtIf( Cmd[2] ~= '0', 2, 1)
if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY2 = EMT.FSY2 end
elseif Cmd[1] == '21' then
EMT.Y1PREVDELTA = EMT.Y1DELTA
EMT.Y2PREVDELTA = EMT.Y2DELTA
local nY1Delta = tonumber( Cmd[2])
local nY2Delta = tonumber( Cmd[3])
if nY1Delta > 0 and nY2Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nY2Delta
elseif nY1Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nil
elseif nY2Delta > 0 then
EMT.Y1DELTA = nil
EMT.Y2DELTA = nY2Delta
end
if not FindReadHeadWithLaser( EMT.MDCHAR) then
local MDChar = { Y1=LoadT, IniStatY1=76, FinStatY1=EMT.FSY1, FinStatV1=-1, BeamVise=0, MovType=1}
table.insert( EMT.MDCHAR, MDChar)
end
elseif Cmd[1] == '22' then
EMT.V1NEXTPOS = tonumber( Cmd[2])
EMT.V2NEXTPOS = tonumber( Cmd[3])
end
end
---------------------------------------------------------------------
function PrepareMoveChar( sCmd, nInd)
local Cmd = EgtSplitString( sCmd)
if Cmd[1] == '0' then
-- se inizio
if nInd == 1 then
-- imposto stato pinze
EMT.ISY1 = EgtIf( EMT.Y1DELTA, -1, 1)
EMT.FSY1 = EMT.ISY1
EMT.ISY2 = EgtIf( EMT.Y2DELTA, -1, 1)
EMT.FSY2 = EMT.ISY2
EMT.BV = EgtIf( EMT.Y1DELTA, 1, 2)
EMT.ROLL_IN = nil
EMT.ROLL_OPEN = true
end
elseif Cmd[1] == '1' then
if Cmd[2] ~= 'Z' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
local MoveY1 = GetCmdAxMove( Cmd, 'Y1')
local MoveY2 = GetCmdAxMove( Cmd, 'Y2')
if MoveY1 then MDChar.Y1 = MoveY1 end
if MoveY2 then MDChar.Y2 = MoveY2 end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
else
local MinDeltaY1V1 = MinDeltaYV + EgtIf( ( Cmd and #Cmd > 0 and Cmd[#Cmd] == '*'), AggLoad, 0)
if MoveY1 and EMT.V1POS > MoveY1 - MinDeltaY1V1 - 0.1 then
MDChar.V1 = min( MoveY1 - MinDeltaY1V1, ParkV1) ; EMT.V1POS = MDChar.V1
end
if MoveY2 and EMT.V2POS < MoveY2 + MinDeltaYV + 0.1 then
MDChar.V2 = max( MoveY2 + MinDeltaYV, ParkV2) ; EMT.V2POS = MDChar.V2
end
end
if EMT.ROLL_OPEN then
MDChar.IniStatV1 = 3 ; MDChar.FinStatV1 = 3
MDChar.IniStatV2 = 3 ; MDChar.FinStatV2 = 3
EMT.ROLL_OPEN = nil
end
table.insert( EMT.MDCHAR, MDChar)
EMT.Y1POS = MoveY1 or EMT.Y1POS
EMT.TPOS = GetCmdAxMove( Cmd, 'T') or EMT.TPOS
end
elseif Cmd[1] == '2' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
local MoveY1 = GetCmdAxMove( Cmd, 'Y1')
local MoveY2 = GetCmdAxMove( Cmd, 'Y2')
if MoveY1 then MDChar.Y1 = MoveY1 end
if MoveY2 then MDChar.Y2 = MoveY2 end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
else
local MinDeltaY1V1 = MinDeltaYV + EgtIf( ( Cmd and #Cmd > 0 and Cmd[#Cmd] == '*'), AggLoad, 0)
if MoveY1 and EMT.V1POS > MoveY1 - MinDeltaY1V1 - 0.1 then
MDChar.V1 = min( MoveY1 - MinDeltaY1V1, ParkV1) ; EMT.V1POS = MDChar.V1
end
if MoveY2 and EMT.V2POS < MoveY2 + MinDeltaYV + 0.1 then
MDChar.V2 = max( MoveY2 + MinDeltaYV, ParkV2) ; EMT.V2POS = MDChar.V2
end
end
if EMT.ROLL_OPEN then
MDChar.IniStatV1 = 3 ; MDChar.FinStatV1 = 3
MDChar.IniStatV2 = 3 ; MDChar.FinStatV2 = 3
EMT.ROLL_OPEN = nil
end
table.insert( EMT.MDCHAR, MDChar)
EMT.TPOS = GetCmdAxMove( Cmd, 'T') or EMT.TPOS
elseif Cmd[1] == '3' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
local MoveY1 = GetCmdAxMove( Cmd, 'Y1')
local MoveY2 = GetCmdAxMove( Cmd, 'Y2')
if MoveY1 then MDChar.Y1 = MoveY1 end
if MoveY2 then MDChar.Y2 = MoveY2 end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
else
local MinDeltaY1V1 = MinDeltaYV + EgtIf( ( Cmd and #Cmd > 0 and Cmd[#Cmd] == '*'), AggLoad, 0)
if MoveY1 and EMT.V1POS > MoveY1 - MinDeltaY1V1 - 0.1 then
MDChar.V1 = min( MoveY1 - MinDeltaY1V1, ParkV1) ; EMT.V1POS = MDChar.V1
end
if MoveY2 and EMT.V2POS < MoveY2 + MinDeltaYV + 0.1 then
MDChar.V2 = max( MoveY2 + MinDeltaYV, ParkV2) ; EMT.V2POS = MDChar.V2
end
end
if EMT.ROLL_OPEN then
MDChar.IniStatV1 = 3 ; MDChar.FinStatV1 = 3
MDChar.IniStatV2 = 3 ; MDChar.FinStatV2 = 3
EMT.ROLL_OPEN = nil
end
table.insert( EMT.MDCHAR, MDChar)
EMT.TPOS = GetCmdAxMove( Cmd, 'T') or EMT.TPOS
elseif Cmd[1] == '4' then
-- richiesta movimento a ZMAX già gestita
if Cmd[2] == '1' then
EMT.ROLL_IN = true
end
elseif Cmd[1] == '11' then
EMT.ISY1 = CalcCharStatusN( Cmd[2])
EMT.FSY1 = EMT.ISY1
-- se pinza due in presa, non attivo la 1
if EMT.BV ~= 2 then
EMT.BV = EgtIf( Cmd[2] ~= '0', 1, 2)
end
if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY1 = EMT.FSY1 end
elseif Cmd[1] == '12' then
EMT.ISY2 = CalcCharStatusN( Cmd[2])
EMT.FSY2 = EMT.ISY2
EMT.BV = EgtIf( Cmd[2] ~= '0', 2, 1)
if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY2 = EMT.FSY2 end
elseif Cmd[1] == '21' then
EMT.Y1PREVDELTA = EMT.Y1DELTA
EMT.Y2PREVDELTA = EMT.Y2DELTA
local nY1Delta = tonumber( Cmd[2])
local nY2Delta = tonumber( Cmd[3])
if nY1Delta > 0 and nY2Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nY2Delta
elseif nY1Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nil
elseif nY2Delta > 0 then
EMT.Y1DELTA = nil
EMT.Y2DELTA = nY2Delta
end
elseif Cmd[1] == '22' then
EMT.V1NEXTPOS = tonumber( Cmd[2])
EMT.V2NEXTPOS = tonumber( Cmd[3])
elseif Cmd[1] == '23' then
EMT.W2DELTA = tonumber( Cmd[2])
elseif Cmd[1] == '24' then
EMT.TPOS = GetCmdAxMove( Cmd, 'T') or EMT.TPOS
end
end
---------------------------------------------------------------------
function PrepareResidue( sCmd, nInd)
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 nInd <= 2 then
EMT.ISY1 = EgtIf( EMT.Y1DELTA, -1, 1)
EMT.FSY1 = EMT.ISY1
EMT.ISY2 = EgtIf( EMT.Y2DELTA, -1, 1)
EMT.FSY2 = EMT.ISY2
EMT.BV = EgtIf( EMT.Y1DELTA, 1, 2)
EMT.ROLL_IN = nil
end
else
EMT.UNL = true
end
elseif Cmd[1] == '1' then
if Cmd[2] ~= 'Z' then
local MDChar
if not EMT.UNL then
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
else
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY2=2, FinStatY2=85, BeamVise=0}
end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
elseif EMT.UNL then
MDChar.V1 = ParkV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = ParkV2 ; EMT.V2POS = MDChar.V2
end
table.insert( EMT.MDCHAR, MDChar)
end
elseif Cmd[1] == '2' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV2=3, BeamVise=EMT.BV}
if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end
if Cmd[4] ~= 'T' then MDChar[Cmd[4]] = tonumber( Cmd[5]) end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar)
elseif Cmd[1] == '3' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV1=3, IniStatV2=3, BeamVise=EMT.BV}
if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end
if Cmd[4] ~= 'T' then MDChar[Cmd[4]] = tonumber( Cmd[5]) end
if Cmd[6] ~= 'T' then MDChar[Cmd[6]] = tonumber( Cmd[7]) end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar)
elseif Cmd[1] == '4' then
if Cmd[2] == '1' then
EMT.ROLL_IN = true
end
elseif Cmd[1] == '11' then
EMT.ISY1 = CalcCharStatusN( Cmd[2])
EMT.FSY1 = EMT.ISY1
EMT.BV = EgtIf( Cmd[2] ~= '0', 1, 2)
if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY1 = EMT.FSY1 end
elseif Cmd[1] == '12' then
EMT.ISY2 = CalcCharStatusN( Cmd[2])
EMT.FSY2 = EMT.ISY2
EMT.BV = EgtIf( Cmd[2] ~= '0', 2, 1)
if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY2 = EMT.FSY2 end
elseif Cmd[1] == '21' then
EMT.Y1PREVDELTA = EMT.Y1DELTA
EMT.Y2PREVDELTA = EMT.Y2DELTA
local nY1Delta = tonumber( Cmd[2])
local nY2Delta = tonumber( Cmd[3])
if nY1Delta > 0 and nY2Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nY2Delta
elseif nY1Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nil
elseif nY2Delta > 0 then
EMT.Y1DELTA = nil
EMT.Y2DELTA = nY2Delta
end
elseif Cmd[1] == '22' then
EMT.V1NEXTPOS = tonumber( Cmd[2])
EMT.V2NEXTPOS = tonumber( Cmd[3])
end
end
---------------------------------------------------------------------
function PrepareSplit( sCmd, nInd)
local Cmd = EgtSplitString( sCmd)
if Cmd[1] == '0' then
-- non interessa
elseif Cmd[1] == '1' then
if Cmd[2] == 'Y1' then
local MDChar = { Y1=tonumber(Cmd[3]), V1=ParkV1, IniStatY1=-1, IniStatY2=-1, IniStatV1=3, BeamVise=2, MovType=1}
table.insert( EMT.MDCHAR, MDChar)
EMT.Y1POS = tonumber( Cmd[3])
EMT.V1POS = ParkV1
end
elseif Cmd[1] == '21' then
EMT.Y1PREVDELTA = EMT.Y1DELTA
EMT.Y2PREVDELTA = EMT.Y2DELTA
local nY1Delta = tonumber( Cmd[2])
local nY2Delta = tonumber( Cmd[3])
if nY1Delta > 0 and nY2Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nY2Delta
elseif nY1Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nil
elseif nY2Delta > 0 then
EMT.Y1DELTA = nil
EMT.Y2DELTA = nY2Delta
end
elseif Cmd[1] == '22' then
EMT.V1NEXTPOS = tonumber( Cmd[2])
EMT.V2NEXTPOS = tonumber( Cmd[3])
end
end
---------------------------------------------------------------------
function PrepareUnload( sCmd, nInd)
local Cmd = EgtSplitString( sCmd)
if Cmd[1] == '0' then
-- non interessa
elseif Cmd[1] == '1' then
if Cmd[2] == 'Y2' then
-- se non è ultima fase c'è una barra sulla pinza Y (1)
local bBarOnY = ( EMT.PHASE < EgtGetPhaseCount() and not IsEnd2Phase( EMT.PHASE))
local MDChar = { Y2=tonumber(Cmd[3]), IniStatY2=2, FinStatY2=85, BeamVise=EgtIf( bBarOnY, 1, 0), MovType=EgtIf( EMT.CHY_ON, 3, 2)}
table.insert( EMT.MDCHAR, MDChar)
end
elseif Cmd[1] == '2' then
if Cmd[4] == 'Y2' then
-- se non è ultima fase c'è una barra sulla pinza Y (1)
local bBarOnY = ( EMT.PHASE < EgtGetPhaseCount() and not IsEnd2Phase( EMT.PHASE))
local nISY1 = EgtIf( bBarOnY, -1, 1)
local MDChar = { Y2=tonumber(Cmd[5]), V2=ParkV2, IniStatY1=nISY1, FinStatY1=nISY1, IniStatY2=-1, FinStatY2=1, IniStatV2=3, BeamVise=2, MovType=EgtIf( EMT.CHY_ON, 3, 2)}
EMT.V2NEXTPOS = ParkV2
-- se ultimo pezzo e mossa anche Y1, devo garantire parcheggio di V1 (per barra successiva)
if EMT.PHASE == EgtGetPhaseCount() and EMT.CHY_ON then
MDChar.V1 = ParkV1
EMT.V1NEXTPOS = ParkV1
else
EMT.V1NEXTPOS = EMT.V1POS
end
table.insert( EMT.MDCHAR, MDChar)
end
elseif Cmd[1] == '3' then
-- non interessa
elseif Cmd[1] == '4' then
-- non interessa
elseif Cmd[1] == '11' then
-- non interessa
elseif Cmd[1] == '12' then
-- non interessa
elseif Cmd[1] == '21' then
-- non interessa
elseif Cmd[1] == '22' then
-- non interessa ??
end
end
---------------------------------------------------------------------
function PreparePreRotation( sCmd, nInd)
local Cmd = EgtSplitString( sCmd)
if Cmd[1] == '0' then
-- se inizio o subito dopo, imposto stato iniziale pinze
if nInd <= 2 then
EMT.ISY1 = EgtIf( EMT.Y1DELTA, -1, 1)
EMT.FSY1 = EMT.ISY1
EMT.ISY2 = EgtIf( EMT.Y2DELTA, -1, 1)
EMT.FSY2 = EMT.ISY2
EMT.BV = EgtIf( EMT.Y1DELTA and not EMT.SPECSPLIT, 1, 2)
EMT.ROLL_IN = nil
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
if Cmd[2] ~= 'Z' then
local MDChar
if EMT.PREROT then
-- parcheggio per sicurezza morsa e paratia lato scarico
MDChar = { Y2=ParkY2, V2=ParkV2, IniStatY2=1, FinStatY2=1, BeamVise=0}
table.insert( EMT.MDCHAR, MDChar)
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=86, FinStatY1=87, BeamVise=0}
elseif EMT.SPECSPLIT or EMT.SPLITROT then
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), V1=ParkV1, IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV1=3, BeamVise=EMT.BV}
EMT.V1NEXTPOS = MDChar.V1
else
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1NEXTPOS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2NEXTPOS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar)
end
elseif Cmd[1] == '2' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end
if Cmd[4] ~= 'T' then MDChar[Cmd[4]] = tonumber( Cmd[5]) end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1NEXTPOS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2NEXTPOS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar)
elseif Cmd[1] == '3' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end
if Cmd[4] ~= 'T' then MDChar[Cmd[4]] = tonumber( Cmd[5]) end
if Cmd[6] ~= 'T' then MDChar[Cmd[6]] = tonumber( Cmd[7]) end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1NEXTPOS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2NEXTPOS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar)
elseif Cmd[1] == '4' then
if Cmd[2] == '1' then
EMT.ROLL_IN = true
end
elseif Cmd[1] == '11' then
if EMT.SPLITROT then
EMT.ISY1 = EgtIf( Cmd[2] ~= '0', CalcCharStatusN( Cmd[2]), 86)
EMT.FSY1 = EMT.ISY1
EMT.BV = EgtIf( Cmd[2] ~= '0', 1, 2)
else
EMT.ISY1 = CalcCharStatusN( Cmd[2])
EMT.FSY1 = EMT.ISY1
EMT.BV = EgtIf( Cmd[2] ~= '0', 1, 2)
end
if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY1 = CalcCharStatusN( Cmd[2]) end
elseif Cmd[1] == '12' then
EMT.ISY2 = CalcCharStatusN( Cmd[2])
EMT.FSY2 = EMT.ISY2
EMT.BV = EgtIf( Cmd[2] ~= '0', 2, 1)
if #EMT.MDCHAR > 0 then EMT.MDCHAR[#EMT.MDCHAR].FinStatY2 = EMT.FSY2 end
elseif Cmd[1] == '21' then
local nY1Delta = tonumber( Cmd[2])
local nY2Delta = tonumber( Cmd[3])
EMT.Y1PREVDELTA = EMT.Y1DELTA
EMT.Y2PREVDELTA = EMT.Y2DELTA
if nY1Delta > 0 and nY2Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nY2Delta
elseif nY1Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nil
elseif nY2Delta > 0 then
EMT.Y1DELTA = nil
EMT.Y2DELTA = nY2Delta
end
elseif Cmd[1] == '22' then
EMT.V1NEXTPOS = tonumber( Cmd[2])
EMT.V2NEXTPOS = tonumber( Cmd[3])
end
end
---------------------------------------------------------------------
function PreparePostRotation( sCmd, nInd)
-- è sostanzialmente un carico
local Cmd = EgtSplitString( sCmd)
if Cmd[1] == '0' then
-- se inizio
if nInd == 1 then
-- imposto stato pinze
EMT.FSY1 = -1
end
-- se dichiarazione inizio riposizionamento carrelli
if Cmd[2] == 'CARR_MOVE' then
EMT.POSTROT = false
table.insert( EMT.MDCHAR, { Start=1})
table.insert( EMT.MDCHAR, { Wait=1})
end
elseif Cmd[1] == '1' then
-- non interessa
elseif Cmd[1] == '2' then
if Cmd[2] == 'Y1' then
-- tolgo eventuale sovramateriale presente sul pezzo in posizione iniziale (la misura laser è ora col finito)
local MDChar = { Y1=tonumber(Cmd[3])-EMT.HOVM, IniStatY1=75, V1=ParkV1, FinStatY1=-1, BeamVise=0, Aux=' (E80058=0)', MovType=1}
table.insert( EMT.MDCHAR, MDChar)
EMT.V1POS = ParkV1
elseif Cmd[2] == 'T' then
local MDChar = { Y1=tonumber(Cmd[3]), IniStatY1=76, FinStatY1=EMT.FSY1, BeamVise=0, MovType=1}
table.insert( EMT.MDCHAR, MDChar)
EMT.TPOS = tonumber(Cmd[3])
end
elseif Cmd[1] == '3' then
-- non interessa
elseif Cmd[1] == '11' then
EMT.FSY1 = CalcCharStatusN( Cmd[2])
elseif Cmd[1] == '12' then
-- non interessa
elseif Cmd[1] == '21' then
EMT.Y1PREVDELTA = EMT.Y1DELTA
EMT.Y2PREVDELTA = EMT.Y2DELTA
local nY1Delta = tonumber( Cmd[2])
local nY2Delta = tonumber( Cmd[3])
if nY1Delta > 0 and nY2Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nY2Delta
elseif nY1Delta > 0 then
EMT.Y1DELTA = nY1Delta
EMT.Y2DELTA = nil
elseif nY2Delta > 0 then
EMT.Y1DELTA = nil
EMT.Y2DELTA = nY2Delta
end
if not FindReadHeadWithLaser( EMT.MDCHAR) then
local MDChar = { Y1=LoadT, IniStatY1=76, FinStatY1=EMT.FSY1, BeamVise=0, MovType=1}
table.insert( EMT.MDCHAR, MDChar)
EMT.TPOS = LoadT
end
elseif Cmd[1] == '22' then
EMT.V1NEXTPOS = tonumber( Cmd[2])
EMT.V2NEXTPOS = tonumber( Cmd[3])
end
end
---------------------------------------------------------------------
function GetV1ToCloseNum( UseCurrV1)
if EMT.MCHPRECUT or EMT.MCHCUT then
return false
end
--EmtOutput( string.format( 'L1m=%.3f L1M=%.3f', EMT.MAXMIN[1], EMT.MAXMAX[1]))
--EmtOutput( string.format( 'LB=%.3f LT=%.3f', EMT.LB, EMT.LT))
local dV1Pos
if not UseCurrV1 or UseCurrV1 == false then
dV1Pos = EMT.V1NEXTPOS
elseif UseCurrV1 == true then
dV1Pos = EMT.V1POS
else
dV1Pos = UseCurrV1
end
return ( ( not EMT.W2DELTA or EMT.TO_SPECSPLIT) and EMT.MAXMAX[1] <= dV1Pos + RollCageMin and EMT.MAXMIN[1] + EMT.LB >= dV1Pos + RollCageMax)
end
---------------------------------------------------------------------
function GetV2ToCloseNum( UseCurrV2)
--EmtOutput( string.format( 'L1m=%.3f L1M=%.3f', EMT.MAXMIN[1], EMT.MAXMAX[1]))
--EmtOutput( string.format( 'LB=%.3f LT=%.3f', EMT.LB, EMT.LT))
local dV2Pos
if not UseCurrV2 or UseCurrV2 == false then
dV2Pos = EMT.V2NEXTPOS
elseif UseCurrV2 == true then
dV2Pos = EMT.V2POS
else
dV2Pos = UseCurrV2
end
return ( not EMT.W2DELTA and EMT.MAXMAX[1] <= dV2Pos - RollCageMax and EMT.MAXMIN[1] + EMT.LB + ( EMT.HOVM or 0) - ( EMT.X_OFF or 0) >= dV2Pos - RollCageMin)
end
---------------------------------------------------------------------
function GetMovesInAuxCmd( vAuxCmd)
for i = 1, #( vAuxCmd or {}) do
local Cmd = EgtSplitString( vAuxCmd[i])
if Cmd[1] == '1' or Cmd[1] == '2' or Cmd[1] == '3' then
return true
elseif Cmd[1] == '22' then
local dV1NextPos = tonumber( Cmd[2]) -- EgtIf( EMT.Y1DELTA, tonumber( Cmd[2]), ParkV1)
if not GetV1ToCloseNum( dV1NextPos) then
dV1NextPos = ParkV1
end
local dV2NextPos = tonumber( Cmd[3])
if not GetV2ToCloseNum( dV2NextPos) then
dV2NextPos = ParkV2
end
if ( abs( dV1NextPos - EMT.V1POS) > 1 or abs( dV2NextPos - EMT.V2POS) > 1) then
return true
end
end
end
return false
end
---------------------------------------------------------------------
function MyAdjustLinearAxes()
local MyL1o = EMT.L1
local MyL2o = EMT.L2
local MyL3o = EMT.L3
if EMT.REFLOC then
local vtE
if EMT.HEAD == 'H11' or EMT.HEAD == 'H12' or EMT.HEAD == 'H19' then
local dAddLen = EgtIf( EMT.HEAD == 'H12', -SawOffsZ, 0)
local Len = EMT.TLEN + dAddLen + MillOffs
local LenRef = MillOffs
vtE = Vector3d( EMT.TDIR) * Len - Z_AX() * LenRef
elseif EMT.HEAD == 'H21' or EMT.HEAD == 'H22' or EMT.HEAD == 'H29' then
local dAddLen = EgtIf( EMT.HEAD == 'H22', -Saw2OffsZ, 0)
local Len = EMT.TLEN + dAddLen + Mill2Offs
local LenRef = Mill2Offs
vtE = Vector3d( EMT.TDIR) * Len - Z_AX() * LenRef
elseif EMT.HEAD == 'H13' or EMT.HEAD == 'H15' then
local Len = ( EMT.TDIST or ChSawLen) + MillOffs
local LenRef = MillOffs
vtE = Vector3d( EMT.ADIR) * Len - Z_AX() * LenRef
elseif EMT.HEAD == 'H23' then
local Len = ( EMT.TDIST or ChSawLen) + Mill2Offs
local LenRef = Mill2Offs
vtE = Vector3d( EMT.ADIR) * Len - Z_AX() * LenRef
elseif EMT.HEAD == 'H17' then
local LenAux = AngTrBHOffs + MillOffs
local LenRef = MillOffs
local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
vtE = vtAux * LenAux - Z_AX() * LenRef
else
EmtSetLastError( 1211, 'Head not defined ' .. ( EMT.HEAD or ''))
end
if EMT.HEAD == 'H11' or EMT.HEAD == 'H12' or EMT.HEAD == 'H13' or EMT.HEAD == 'H15' or sHead == 'H17' or EMT.HEAD == 'H19' then
EMT.L1 = EMT.L1 - vtE:getX()
EMT.L2 = EMT.L2 - DeltaTabY - vtE:getY()
EMT.L3 = EMT.L3 - DeltaTabZ - vtE:getZ()
else
EMT.L1 = EMT.L1 - vtE:getX()
EMT.L2 = EMT.L2 - Delta2TabY - vtE:getY()
EMT.L3 = EMT.L3 - Delta2TabZ - vtE:getZ()
end
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 MyOutputNoNum( sOut)
local bNum = EMT.NUM
EMT.NUM = false
EmtOutput( sOut)
EMT.NUM = bNum
end
---------------------------------------------------------------------
function AdjustTcPos( bLen3, sTcPos, dAxR3)
if not sTcPos then sTcPos = EMT.TCPOS end
local sPos = sTcPos:gsub( 'T', '')
if bLen3 then
if #sPos == 1 then
sPos = '00' .. sPos
elseif #sPos == 2 then
sPos = '0' .. sPos
end
end
if sPos == '101' then
if not dAxR3 then dAxR3 = EMT.R3 end
if abs( dAxR3 - 0) < 0.1 then
sPos = '101'
elseif abs( dAxR3 - 90) < 0.1 then
sPos = '104'
elseif abs( dAxR3 + 90) < 0.1 then
sPos = '102'
else
EmtSetLastError( 1210, 'Chain saw orientation not allowed')
end
elseif sPos == '111' then
if not dAxR3 then dAxR3 = EMT.R3 end
if abs( dAxR3 - 0) < 0.1 then
sPos = '111'
elseif abs( dAxR3 - 90) < 0.1 then
sPos = '114'
elseif abs( dAxR3 + 90) < 0.1 then
sPos = '112'
else
EmtSetLastError( 1210, 'Chain saw orientation not allowed')
end
elseif sPos == '201' then
if not dAxR3 then dAxR3 = EMT.R3 end
-- se non ancora settato, è la posizione per punta lunga su ONE (quindi non ha asse R3). Altrimenti è mortasatrice su PF.
if dAxR3 then
if abs( dAxR3 - 0) < 0.1 then
sPos = '201'
elseif abs( dAxR3 - 90) < 0.1 then
sPos = '204'
elseif abs( dAxR3 + 90) < 0.1 then
sPos = '202'
else
EmtSetLastError( 1210, 'Mortiser orientation not allowed')
end
end
elseif sPos == '211' then
if not dAxR3 then dAxR3 = EMT.R3 end
if abs( dAxR3 - 0) < 0.1 then
sPos = '211'
elseif abs( dAxR3 - 90) < 0.1 then
sPos = '214'
elseif abs( dAxR3 + 90) < 0.1 then
sPos = '212'
else
EmtSetLastError( 1210, 'Mortiser orientation not allowed')
end
end
return sPos
end
---------------------------------------------------------------------
function GetToolRadLen()
-- se utensile standard
if EMT.HEAD == 'H11' or EMT.HEAD == 'H21' then
return EMT.TDIAM / 2, EMT.TLEN
-- se lama su testa 1
elseif EMT.HEAD == 'H12' then
return EMT.TDIAM / 2, -SawOffsZ + EMT.TLEN
-- se lama su testa 2
elseif EMT.HEAD == 'H22' then
return EMT.TDIAM / 2, -Saw2OffsZ + EMT.TLEN
-- se sega a catena
elseif HeadIsChainSaw( EMT.HEAD) then
return EMT.TLEN, ( EMT.TDIST or ChSawLen)
-- se aggregato BlockHaus
elseif EMT.HEAD == 'H17' then
return EMT.TDIAM / 2, AngTrBHOffs
end
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 not HeadIsChainSaw( EMT.HEAD) 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)
dAngO = dAngO + 90
while dAngO + 100 * GEO.EPS_SMALL > 360 do
dAngO = dAngO - 360
end
EMT.IPLGLSTR = ' EX0 EY'..EmtLenToString( xS)..' EZ0'..
' EA0'..' EB'..EgtNumToString(dAngV)..' EC'..EgtNumToString(dAngO)..' ED'..EgtNumToString(dAngO2)
EMT.IPLGL = true
end
---------------------------------------------------------------------
function GetFmaxClamp()
return EmtLenToString( EMT.FMAXPINZE, 0)
end
---------------------------------------------------------------------
function GetFall( nPathId)
local sVal = EgtGetInfo( nPathId, 'AE1')
return ( sVal == '0,Fall')
end
---------------------------------------------------------------------
function GetSpecUnloading( nPathId)
local sVal = EgtGetInfo( nPathId, 'AE1')
return ( sVal == '0,Unloading SpecSplit')
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
-- se ho la testa 2, quindi tipo PF
if EgtGetHeadId( 'H21') then
local nDeltaRot = nRot - nPrevRot
-- rotazione automatica o manuale (sempre con il medesimo comando)
local sOut = 'M180 L0=' .. tostring( nDeltaRot)
EmtOutput( sOut)
-- altrimenti se ONE
else
if nRot > nPrevRot then nRot = nRot - 4 end
local nDeltaRot = nRot - nPrevRot
-- se rotazione automatica richiesta e possibile
local dRefLen = EgtIf( IsMid2Phase( EMT.PHASE) or IsEnd2Phase( EMT.PHASE), EMT.LT, EMT.LB)
-- se rotazione automatica richiesta e possibile
if AutomaticRotation and dRefLen >= 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
end
return true
end
---------------------------------------------------------------------
function EmitUnmountChainSaw()
-- gruppo della testa
local nHSet = GetHeadSet( EMT.HEAD)
-- se testa 1
if nHSet == 1 then
EmitMoveDataHead( 1, { X=-ParkX1, Z=MaxZ1, B=ParkB1, C=ParkC1, TPos=50})
EmitMoveStartHead( 1)
EmitMoveWaitHead( 1)
-- altrimenti testa 2
else
EmitMoveDataHead( 2, { X=-ParkX2, Z=MaxZ1, B=ParkB2, C=ParkC2, TPos=50})
EmitMoveStartHead( 2)
EmitMoveWaitHead( 2)
end
end
---------------------------------------------------------------------
function CalcRealSpeed( dSpeed)
-- in caso di aggregato lama, si aumenta speed perchè c'è un riduttore di giri
if EMT.HEAD == 'H12' or EMT.HEAD == 'H22' then
dSpeed = dSpeed * 1.65
end
return dSpeed
end
---------------------------------------------------------------------
function EmitResetMachining( bNextTool)
if EMT.PLANEACTIVE then
local bChangeTool = ( bNextTool and EMT.TOOL ~= GetNextTool( EMT.MCHID)) or ( not bNextTool and EMT.TOOL ~= EMT.PREVTOOL)
-- se non sono a Z massima e operatore deve entrare in cabina spengo sempre
if not EMT.ZMAX and ( GetSpecUnloading( EMT.PATHID) or GetFall( EMT.PATHID)) then
EmtOutput( 'M05')
-- altrimenti spegnimento dipende da parametro
elseif ( bChangeTool and IsLastPath( EMT.PATHID)) or GetSpecUnloading( EMT.PATHID) or GetFall( EMT.PATHID) then
EmtOutput( 'M05')
end
EmtOutput( 'G157 EA1')
-- piano non più attivo
EMT.PLANEACTIVE = false
EMT.REFLOC = nil
EMT.IPLGL = false
end
end
---------------------------------------------------------------------
function EmitParkRoller( dPosT, bSplitCut, bAgg)
-- se entrambe già parcheggiate, non devo fare alcunché
if ( EMT.V1POS - ParkV1) > -0.1 and ( EMT.V2POS - ParkV2) < 0.1 then return end
-- Assegno quote pinze correnti
local dY1Delta = EMT.Y1DELTA
local dY2Delta = EMT.Y2DELTA
-- Parcheggi pinze
local MyParkY1 = ParkY1 + EgtIf( bAgg, AggLoad, 0)
local MyParkY2 = ParkY2
-- le parcheggio
local MDChar = {}
if dY1Delta and dY2Delta then
local dPosY1 = dPosT + dY1Delta
local dPosY2 = dPosT + dY2Delta
local DiffY1 = MyParkY1 - dPosY1
local DiffY2 = MyParkY2 - dPosY2
--EmtOutput( string.format( 'PosT=%.3f DiffY1=%.3f DiffY2=%.3f', dPosT, DiffY1, DiffY2))
if bSplitCut then
local dAddMoveY1 = ParkV1 + ( -dPosT - EMT.LT)
local dAddMoveY2 = ParkV2 + ( -dPosT - EMT.LT)
local MoveY1 = max( DiffY1, dAddMoveY1, 30.0)
local MoveY2 = min( DiffY2, dAddMoveY2, -30.0)
MDChar.Y1 = dPosY1 + MoveY1
MDChar.Y2 = dPosY2 + MoveY2
dPosT = dPosT + MoveY2
elseif DiffY1 > 0.1 and DiffY2 < -0.1 then
EmtSetLastError( 1201, 'Error Collision in ParkRoller')
elseif DiffY1 > 0.1 then
if dPosY2 + DiffY1 > MyParkY2 + 0.1 then
EmtSetLastError( 1201, 'Error Collision Y2 in ParkRoller')
else
MDChar.Y1 = dPosY1 + DiffY1
MDChar.Y2 = dPosY2 + DiffY1
dPosT = dPosT + DiffY1
end
elseif DiffY2 < -0.1 then
if dPosY1 + DiffY2 < MyParkY1 - 0.1 then
EmtSetLastError( 1201, 'Error Collision Y1 in ParkRoller')
else
MDChar.Y1 = dPosY1 + DiffY2
MDChar.Y2 = dPosY2 + DiffY2
dPosT = dPosT + DiffY2
end
end
MDChar.MovType = 3
MDChar.BeamVise = ( EMT.BV or 1)
elseif dY1Delta then
local dMoveV1 = ParkV1 - EMT.V1POS
local dPosY1 = dPosT + dY1Delta
local DiffY1 = MyParkY1 - dPosY1
local dMoveY1 = EgtIf( DiffY1 > 0.1, dMoveV1, 0)
local dTryMoveY1 = min( ParkV1 - dPosT - EgtIf( bSplitCut or EMT.FALL, EMT.LT, 0), MaxY1 - dPosY1 - 10)
if ( dPosT > ParkV2 - ExtraParkV and dPosT < ParkV1 and dPosY1 + dTryMoveY1 < MaxY1) then dMoveY1 = max( dMoveY1, dTryMoveY1) end
MDChar.Y1 = dPosY1 + dMoveY1
MDChar.MovType = 1
MDChar.BeamVise = 1
dPosT = dPosT + dMoveY1
elseif dY2Delta then
local dMoveV2 = ParkV2 - EMT.V2POS
local dPosY2 = dPosT + dY2Delta
local DiffY2 = MyParkY2 - dPosY2
local dMoveY2 = EgtIf( DiffY2 < -0.1, dMoveV2, 0)
local dTryMoveY2 = max( ParkV2 - dPosT - EMT.LT - EMT.DELTA_LT - EMT.HOVM, MinY2 - dPosY2 + 10)
if ( dPosT + EMT.LT + EMT.DELTA_LT + EMT.HOVM < ParkV1 + ExtraParkV and dPosT + EMT.LT + EMT.DELTA_LT + EMT.HOVM > ParkV2 and dPosY2 + dTryMoveY2 > MinY2) then dMoveY2 = min( dMoveY2, dTryMoveY2) end
MDChar.Y2 = dPosY2 + dMoveY2
MDChar.MovType = 2
MDChar.BeamVise = 2
dPosT = dPosT + dMoveY2
end
if abs( ParkV1 - EMT.V1POS) > 0.1 then
MDChar.V1 = ParkV1
MDChar.IniStatV1 = 3
MDChar.MovType = MDChar.MovType | 1
end
if abs( ParkV2 - EMT.V2POS) > 0.1 then
MDChar.V2 = ParkV2
MDChar.IniStatV2 = 3
MDChar.MovType = MDChar.MovType | 2
end
if EMT.SPLIT_Y1DELTA and EMT.SPLIT_Y1DELTA + dPosT < MyParkY1 then
MDChar.Y1 = MyParkY1
end
EmitMoveDataChars( MDChar)
EmitMoveStartChars( MDChar.MovType)
EmitMoveWaitChars( MDChar.MovType)
EMT.V1POS = ParkV1
EMT.V2POS = ParkV2
EMT.TPOS = dPosT
end
---------------------------------------------------------------------
-- preselezione utensile su stessa testa (per C.U. mascherato in caso di cambio morse)
function ToolPreSelectionSingleHead( nMchId)
-- se macchina con due teste, devo preselezionare stessa testa quando ho motosega, altrimenti già fatta
if EgtGetHeadId( 'H21') and not HeadIsChainSaw( EMT.HEAD) then
return
end
-- gruppo della testa
local nHSet = GetHeadSet( EMT.HEAD)
-- nome utensile
local sToolChange = nil
local sToolChangePos = nil
local sToolChangeHead = nil
local bCarrMove = false
-- recupero lavorazione successiva e se contiene un utensile diverso salva utensile e posizione utensile
local nNextMchId = EgtGetNextActiveOperation( nMchId)
while nNextMchId do
if EgtGetOperationType( nNextMchId) ~= MCH_OY.DISP then
if EgtSetCurrMachining( nNextMchId) then
local sNextTool = EgtGetMachiningParam( MCH_MP.TOOL)
if EgtTdbSetCurrTool( sNextTool) then
local sNextHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
local nNextHSet = GetHeadSet( sNextHead)
-- se stessa testa
if nNextHSet == nHSet then
if EMT.TOOL ~= sNextTool then
local nClId = EgtGetFirstNameInGroup( nNextMchId, 'CL') -- recupero Id del gruppo CL della lavorazione corrente
local nPathId = EgtGetFirstInGroup( nClId or GDB_ID.NULL) -- Id del primo gruppo nella lavorazione (P1)
local dAuxMoveCount = EgtGetInfo( nPathId, 'AS#', 'd') or 0 -- numero di movimenti ausiliari
if dAuxMoveCount > 3 then
bCarrMove = true
end
local sNextHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
-- motosega non può essere preselezionata
if not HeadIsChainSaw( sNextHead) then
sToolChange = sNextTool
sToolChangePos = EgtTdbGetCurrToolParam( MCH_TP.TCPOS)
sToolChangeHead = sNextHead
end
end
break
end
end
end
end
nNextMchId = EgtGetNextActiveOperation( nNextMchId)
end
-- ripristino stato corrente
EgtSetCurrMachining( EMT.MCHID)
EgtTdbSetCurrTool( EMT.TOOL)
if bCarrMove or EgtGetHeadId( 'H21') then
-- se è stato trovato utensile, emetto preselezione
if sToolChangePos and sToolChange and sToolChangeHead then
local MyParkX, MyParkB, MyParkC
if GetHeadTCSet( sToolChangeHead, sToolChangePos) == 'Head2_TC2' then
MyParkX = ParkX2
MyParkZ = MaxZ2
MyParkB = ParkB2
MyParkC = ParkC2
elseif GetHeadTCSet( sToolChangeHead, sToolChangePos) == 'Head1_TC2' then
MyParkX = ParkFrnX1
MyParkZ = MaxZ1
MyParkB = ParkFrnB1
MyParkC = ParkFrnC1
else
MyParkX = ParkX1
MyParkZ = MaxZ1
MyParkB = ParkB1
MyParkC = ParkC1
end
EmtOutput( '( *** TOOL PRE-SEL *** )')
EmitMoveDataHead( nHSet, { X=-MyParkX, Z=MyParkZ, B=MyParkB, C=MyParkC, TPos=AdjustTcPos( false, sToolChangePos)})
-- comincio i movimenti di preselezione
EmitMoveStartHead( nHSet)
-- se preselezione e c'era montata motosega, si aspetta fine della preselezione prima di andare avanti
if HeadIsChainSaw( EMT.HEAD) then
EmitMoveWaitHead( nHSet)
else
EMT.START_PRESEL = nHSet
end
-- se non ho trovato utensile da preselezionare, e c'è motosetga montata, si scarica
elseif HeadIsChainSaw( EMT.HEAD) then
EmtOutput( '( *** UNMOUNT CHAIN-SAW *** )')
EmitUnmountChainSaw()
end
else
-- se ho motosega, scarico
if HeadIsChainSaw( EMT.HEAD) then
EmtOutput( '( *** UNMOUNT CHAIN-SAW *** )')
EmitUnmountChainSaw()
end
end
end
---------------------------------------------------------------------
function PreselectNextDiffHead( nMchId, sHead)
-- se non ho due teste, esco subito
if not EgtGetHeadId( 'H21') then
return
end
-- gruppo della testa
local nHSet = GetHeadSet( sHead)
local bVerifyPresel = true
if not EMT.LOAD then
-- se lavorazione con testa 1 e sotto al limite massimo di preselezione della testa 2, allora non si fa preselezione
if nHSet == 1 and Limit_T1_Presel_T2 and EMT.MAXMIN[2] < Limit_T1_Presel_T2 then
bVerifyPresel = false
-- se lavorazione con testa 1 e sopra al limite minimo di preselezione della testa 1, allora non si fa preselezione
elseif nHSet == 2 and Limit_T2_Presel_T1 and EMT.MAXMIN[2] > Limit_T2_Presel_T1 then
bVerifyPresel = false
end
end
-- flag preselezione eseguita
local bPresel = false
local bDoubleTool = false
local sDoubleTool = ''
if bVerifyPresel then
-- recupero lavorazione successiva
local nNextMchId = EgtGetNextActiveOperation( nMchId)
while nNextMchId do
if EgtGetOperationType( nNextMchId) ~= MCH_OY.DISP then
if EgtSetCurrMachining( nNextMchId) then
local sNextTool = EgtGetMachiningParam( MCH_MP.TOOL)
if EgtTdbSetCurrTool( sNextTool) then
local sNextHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
local nNextHSet = GetHeadSet( sNextHead)
if nNextHSet ~= nHSet then
break
else
local sMachUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES)
local nDouType = EgtGetValInNotes( sMachUserNotes, 'DOUBLE', 'i')
if nDouType == 2 then
local sToolUserNotes = EgtTdbGetCurrToolParam( MCH_TP.USERNOTES)
local sOtherTool = EgtGetValInNotes( sMachUserNotes, 'TOOLDOUBLE', 's') or EgtGetValInNotes( sToolUserNotes, 'DOUBLE', 's') or ''
local sOldTool = EgtTdbGetCurrToolParam( MCH_TP.NAME)
if EgtTdbSetCurrTool( sOtherTool) and EgtTdbGetCurrToolParam( MCH_TP.ACTIVE) then
sDoubleTool = sOtherTool
bDoubleTool = true
end
EgtTdbSetCurrTool( sOldTool)
break
end
end
end
end
end
nNextMchId = EgtGetNextActiveOperation( nNextMchId)
end
-- se esiste ed appartiene a gruppo diverso
if nNextMchId and EgtSetCurrMachining( nNextMchId) then
local sNextTool = EgtGetMachiningParam( MCH_MP.TOOL)
-- se è una lavorazione in doppio, selezione altro utensile
if bDoubleTool then
sNextTool = sDoubleTool
end
if EgtTdbSetCurrTool( sNextTool) then
local sNextHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
local nNextHSet = GetHeadSet( sNextHead)
if nNextHSet ~= nHSet then
local sNextTcPos = EgtTdbGetCurrToolParam( MCH_TP.TCPOS)
-- se testa attuale da caricare è sega a catena, mando l'altra prima in HomeX (per evitare possibili collisioni) e poi lancio preselezione
if sHead == 'H13' and nHSet ~= GetHeadSet( EMT.PREVHEAD_H1) then
EmitMoveDataHead( 2, { X=-ParkX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos=AdjustTcPos( false, EMT.PREVTCPOS_H2)})
EmitMoveStartHead( 2)
EmitMoveWaitHead( 2)
elseif sHead == 'H23' and nHSet ~= GetHeadSet( EMT.PREVHEAD_H2) then
EmitMoveDataHead( 1, { X=-ParkX1, Z=MaxZ1, B=ParkB1, C=ParkC1, TPos=AdjustTcPos( false, EMT.PREVTCPOS_H1)})
EmitMoveStartHead( 1)
EmitMoveWaitHead( 1)
end
-- Emetto preselezione (non ammessa per sega a catena H13 e H23 e aggregato BlockHaus H17)
if sNextHead == 'H11' then
EmitMoveDataHead( 1, { X=-ParkX1, Z=MaxZ1, B=ParkB1, C=ParkC1, TPos=AdjustTcPos( false, sNextTcPos)})
EmitMoveStartHead( 1)
bPresel = true
elseif sNextHead == 'H12' then
EmitMoveDataHead( 1, { X=-ParkX1, Z=MaxZ1, B=ParkB1, C=ParkC1, TPos=AdjustTcPos( false, sNextTcPos)})
EmitMoveStartHead( 1)
bPresel = true
elseif sNextHead == 'H21' then
EmitMoveDataHead( 2, { X=-ParkX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos=AdjustTcPos( false, sNextTcPos)})
EmitMoveStartHead( 2)
bPresel = true
elseif sNextHead == 'H22' then
EmitMoveDataHead( 2, { X=-ParkX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos=AdjustTcPos( false, sNextTcPos)})
EmitMoveStartHead( 2)
bPresel = true
end
end
end
end
-- ripristino stato corrente
EgtSetCurrMachining( EMT.MCHID)
EgtTdbSetCurrTool( EMT.TOOL)
end
-- se non eseguita preselezione
if not bPresel then
-- se era stato preselezionato un utensile e adesso non posso preselezionare, attendo la testa
if EMT.PRESEL_H2 then
EmitMoveWaitHead( 2)
EMT.PRESEL_H2 = nil
elseif EMT.PRESEL_H1 then
EmitMoveWaitHead( 1)
EMT.PRESEL_H1 = nil
-- se non era stato preselezionato nulla
else
-- mi assicuro che l'altra testa sia in parcheggio
if nHSet == 1 then
-- non può essere la sega a catena
if EMT.PREVHEAD_H2 ~= 'H23' then
EmitMoveDataHead( 2, { X=-ParkX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos=AdjustTcPos( false, EMT.PREVTCPOS_H2)})
EmitMoveStartHead( 2)
end
else
-- non può essere la sega a catena
if EMT.PREVHEAD_H1 ~= 'H13' and EMT.PREVHEAD_H1 ~= 'H15' then
EmitMoveDataHead( 1, { X=-ParkX1, Z=MaxZ1, B=ParkB1, C=ParkC1, TPos=AdjustTcPos( false, EMT.PREVTCPOS_H1)})
EmitMoveStartHead( 1)
end
end
end
else
if nHSet == 1 then
EMT.PRESEL_H2 = true
elseif nHSet == 1 then
EMT.PRESEL_H2 = true
end
end
end
---------------------------------------------------------------------
function FindReadHeadWithLaser( vMDChar)
for i = 1, #vMDChar do
if vMDChar[i].IniStatY1 == 76 then
return true
end
end
return false
end
---------------------------------------------------------------------
function EmitTestProgramStart()
EmtOutput( '(APERTURA INIZIALE PINZE)')
EmtOutput( 'M111')
EmtOutput( 'M131 E30012=1')
EmtOutput( 'M125')
EmtOutput( 'M151 E30013=1')
EmtOutput( 'M145')
EmtOutput( 'M171')
if Clamp5 then
EmtOutput( 'M153')
EmtOutput( 'M155')
end
EmtOutput( 'M12 $RIMUOVERE LA TRAVE')
EmitMoveDataChars( { Y1=1400, Y2=-1400, V1=MaxV1, V2=MinV2, IniStatY1=2, IniStatY2=2, IniStatV1=3, IniStatV2=3})
EmitMoveStartChars( 3)
EmitMoveWaitChars( 3)
if Clamp5 then
EmtOutput( 'E75005=-1')
EmtOutput( 'E75005=12')
EmtOutput( 'G1G52WE75002 F5000')
EmtOutput( 'E75005=-1')
end
EmtOutput( 'M12 $START PER SVINCOLO TESTE')
EmtOutput( '(SVINCOLO TESTA 1)')
EmitMoveDataHead( 1, {Z=ParkZ1-100, TPos=0})
if Progress or SecondToolChanger then
EmtOutput( 'IF E80001<=10 THEN')
EmitMoveDataHead( 1, {C=ParkC1, TPos=0})
EmitMoveDataHead( 1, {Z=-150, B=ParkB1, TPos=0})
EmitMoveDataHead( 1, {Z=0, X=-ParkX1})
EmtOutput( 'ELSE')
EmitMoveDataHead( 1, {C=ParkFrnC1, TPos=0})
EmitMoveDataHead( 1, {Z=-150, B=ParkFrnB1, TPos=0})
EmitMoveDataHead( 1, {Z=0, X=-ParkFrnX1})
EmtOutput( 'ENDI')
else
EmitMoveDataHead( 1, {C=ParkC1, TPos=0})
EmitMoveDataHead( 1, {Z=-150, B=ParkB1, TPos=0})
EmitMoveDataHead( 1, {Z=0, X=-ParkX1})
end
EmitMoveStartHead( 1)
EmitMoveWaitHead( 1)
-- se esiste la testa 2
if EgtGetHeadId( 'H21') then
EmtOutput( '(SVINCOLO TESTA 2)')
EmitMoveDataHead( 2, {C=ParkC2, TPos=0})
EmitMoveDataHead( 2, {Z=-150, B=ParkB2, TPos=0})
EmitMoveDataHead( 2, {Z=0, X=-ParkX2})
EmitMoveStartHead( 2)
EmitMoveWaitHead( 2)
end
EmtOutput( 'M28')
EmtOutput( '')
end
---------------------------------------------------------------------
function EmitMoveDataHead( nHead, MoData)
local sOut = 'G141'
if MoData.X then sOut = sOut .. ' X' .. EmtLenToString( MoData.X, 3) end
if MoData.Z then sOut = sOut .. ' Z' .. EmtLenToString( MoData.Z, 3) end
if MoData.B then sOut = sOut .. ' B' .. EmtLenToString( MoData.B, 3) end
if MoData.C then sOut = sOut .. ' C' .. EmtLenToString( MoData.C, 3) end
if MoData.TRad then sOut = sOut .. ' ER' .. EmtLenToString( MoData.TRad, 3) end
if MoData.TLen then sOut = sOut .. ' EL' .. EmtLenToString( MoData.TLen, 3) end
if MoData.TPos then sOut = sOut .. ' ET' .. MoData.TPos elseif EMT.TCPOS then sOut = sOut .. ' ET' .. AdjustTcPos( false) end
if MoData.S then sOut = sOut .. ' ES' .. EgtNumToString( MoData.S, 0) end
if MoData.F then sOut = sOut .. ' EF' .. EmtLenToString( MoData.F, 0) end
if MoData.Aux then sOut = sOut .. MoData.Aux end
sOut = sOut .. EgtIf( nHead == 1, ' EU1', ' EU2')
EmtOutput( sOut)
end
---------------------------------------------------------------------
function EmitMoveStartHead( nHead, sAux)
EmtOutput( 'G141 ET1001' .. EgtIf( nHead == 1, ' EU1', ' EU2') .. EgtIf( sAux, ' '..(sAux or ''), ''))
end
---------------------------------------------------------------------
function EmitMoveWaitHead( nHead)
EmtOutput( 'G141 ET2001' .. EgtIf( nHead == 1, ' EU1', ' EU2'))
end
---------------------------------------------------------------------
function EmitMoveDataChars( MoData)
if MoData.Start then
EmitMoveStartChars( MoData.Start)
return
elseif MoData.Wait then
EmitMoveWaitChars( MoData.Wait)
return
end
local sOut = 'G151'
if MoData.Y1 then sOut = sOut .. ' Y' .. EmtLenToString( MoData.Y1, 3) end
if MoData.Y2 then sOut = sOut .. ' V' .. EmtLenToString( MoData.Y2, 3) end
if MoData.V1 then sOut = sOut .. ' B' .. EmtLenToString( MoData.V1, 3) end
if MoData.V2 then sOut = sOut .. ' C' .. EmtLenToString( MoData.V2, 3) end
if MoData.IniStatY1 then sOut = sOut .. ' EA' .. EgtNumToString( MoData.IniStatY1, 0) end
if MoData.FinStatY1 then sOut = sOut .. ' EB' .. EgtNumToString( MoData.FinStatY1, 0) end
if MoData.IniStatY2 then sOut = sOut .. ' EC' .. EgtNumToString( MoData.IniStatY2, 0) end
if MoData.FinStatY2 then sOut = sOut .. ' ED' .. EgtNumToString( MoData.FinStatY2, 0) end
if MoData.IniStatV1 then sOut = sOut .. ' EH' .. EgtNumToString( MoData.IniStatV1, 0) end
if MoData.FinStatV1 then sOut = sOut .. ' EI' .. EgtNumToString( MoData.FinStatV1, 0) end
if MoData.IniStatV2 then sOut = sOut .. ' EJ' .. EgtNumToString( MoData.IniStatV2, 0) end
if MoData.FinStatV2 then sOut = sOut .. ' EK' .. EgtNumToString( MoData.FinStatV2, 0) end
if MoData.BeamVise then sOut = sOut .. ' EE' .. EgtNumToString( MoData.BeamVise, 0) end
if MoData.F then sOut = sOut .. ' EF' .. EmtLenToString( MoData.F, 0) else sOut = sOut .. ' EF' .. GetFmaxClamp() end
if MoData.MovType == 1 then sOut = sOut .. ' ET1' elseif MoData.MovType == 2 then sOut = sOut .. ' ET2' else sOut = sOut .. ' ET0' end
if MoData.Aux then sOut = sOut .. MoData.Aux end
EmtOutput( sOut)
end
---------------------------------------------------------------------
function EmitMoveStartChars( MovType)
local sMovType = 'ET1004'
if MovType == 1 then
sMovType = 'ET1001'
elseif MovType == 2 then
sMovType = 'ET1002'
end
EmtOutput( 'G151 ' .. sMovType)
end
---------------------------------------------------------------------
function EmitMoveWaitChars( MovType, bRun)
local sMovType = 'ET2004'
if MovType == 1 then
sMovType = 'ET2001'
elseif MovType == 2 then
sMovType = 'ET2002'
end
if bRun == nil or bRun then
EmtOutput( 'G151 ' .. sMovType)
else
EmtOutput( '(G151 ' .. sMovType .. ')')
end
end
---------------------------------------------------------------------
function EmitBeamHeadData( BhData)
if not BhData.Pz5 then
local sOut = 'G152'
if BhData.T then sOut = sOut .. ' Y' .. EmtLenToString( BhData.T, 3) end
if BhData.Y1 then sOut = sOut .. ' EY' .. EmtLenToString( BhData.Y1, 3) end
if BhData.Y2 then sOut = sOut .. ' EV' .. EmtLenToString( BhData.Y2, 3) end
if BhData.V1 then sOut = sOut .. ' B' .. EmtLenToString( BhData.V1, 3) end
if BhData.V2 then sOut = sOut .. ' C' .. EmtLenToString( BhData.V2, 3) end
if BhData.W then sOut = sOut .. ' EW' .. EmtLenToString( BhData.W, 3) end
if BhData.ViseY1 then sOut = sOut .. ' EA' .. EgtNumToString( BhData.ViseY1, 0) end
if BhData.ViseY2 then sOut = sOut .. ' EB' .. EgtNumToString( BhData.ViseY2, 0) end
if BhData.SetHead then sOut = sOut .. ' EC' .. EgtNumToString( BhData.SetHead, 0) end
if BhData.IniStatV1 then sOut = sOut .. ' EH' .. EgtNumToString( BhData.IniStatV1, 0) end
if BhData.FinStatV1 then sOut = sOut .. ' EI' .. EgtNumToString( BhData.FinStatV1, 0) end
if BhData.IniStatV2 then sOut = sOut .. ' EJ' .. EgtNumToString( BhData.IniStatV2, 0) end
if BhData.FinStatV2 then sOut = sOut .. ' EK' .. EgtNumToString( BhData.FinStatV2, 0) end
if BhData.F then sOut = sOut .. ' EF' .. EmtLenToString( BhData.F, 0) else sOut = sOut .. ' EF' .. GetFmaxClamp() end
if BhData.ViseY1 == 3 then sOut = sOut .. ' EL1' end
if BhData.ViseY2 == 3 then sOut = sOut .. ' EM1' end
EmtOutput( sOut)
else
local sOut = 'G153'
if BhData.T then sOut = sOut .. ' Y' .. EmtLenToString( BhData.T, 3) end
if BhData.Pz5 == 1 then
sOut = sOut .. ' EA1'
else
sOut = sOut .. ' EA2'
end
EmtOutput( sOut)
end
end
---------------------------------------------------------------------
-- *** END GENERATION ***
---------------------------------------------------------------------