diff --git a/Beam/BeamData.lua b/Beam/BeamData.lua index 219d1b7..a67a446 100644 --- a/Beam/BeamData.lua +++ b/Beam/BeamData.lua @@ -54,6 +54,7 @@ local BeamData = { RAWCOL = { 255, 160, 32, 30}, -- colore del grezzo RAW_OFFSET = 2000, -- spostamento grezzo rimanente dopo split VICE_MINH = 110, -- altezza minima della morsa + VICE_MAXH = 370, -- altezza massima zona pinzaggio orizzontale OFFSET_DRILL_TENON = 0, -- offset fori su tenoni verso base degli stessi (0=non fare) USER_HOLE_DIAM = 0, -- diametro foro per L20 MAX_TOOL_LEN_FOR_HOR_MACH = 311, -- massima lunghezza utensile per poter fare forature (fresature) oltre i 10 gradi dalla verticale diff --git a/Essetre-FASTrl.NUM.mlpe b/Common-FAST.NUM.mlpe similarity index 97% rename from Essetre-FASTrl.NUM.mlpe rename to Common-FAST.NUM.mlpe index 9376ee4..fcc6bba 100644 --- a/Essetre-FASTrl.NUM.mlpe +++ b/Common-FAST.NUM.mlpe @@ -1,21 +1,12 @@ --- Processore macchina Essetre-FAST by EgalTech s.r.l. 2024/01/17 +-- Processore standard macchine FAST by EgalWare s.r.l. 2024/02/23 -- Con controllo numerico NUM --- 2021/04/23 DS ver 2.3d3 Se non c'è BtlInfo cerco il gruppo di lavoro corrente. --- 2021/07/21 DS ver 2.3g5 Modifiche varie da TPA. --- 2021/07/23 DS ver 2.3g6 Corretta gestione LOAD90. --- 2021/07/23 DS ver 2.3g7 Completamento allineamento con TPA. --- 2021/07/27 DS ver 2.3g8 Corretto carico senza taglio di testa per salto G79 N9. --- 2021/07/27 DS ver 2.3g9 Nome in testa a CN (%NNNN.0) da PATTID di BtlInfo. --- 2021/07/29 DS ver 2.3g10 Con testa H2 (lama) non si emettono assi rotanti nel corso della lavorazione. --- 2021/08/03 DS ver 2.3h2 Nei commenti le parentesi sono sostituite con il carattere -. --- 2021/08/05 DS ver 2.3h4 Nel rapido se non bHeadFirst ritardo anche l'emissione di G101 a dopo G112. --- 2021/11/17 DS ver 2.3k1 Correzioni di Nicola su rotazioni verificate da GCT. --- 2021/12/28 DS ver 2.3l2 Correzioni a G101 (ora sempre con EE ed ET). --- 2021/12/29 DS ver 2.3l3 Altre correzioni a G101 (se già in alto EE3 e sempre ES). --- 2023/04/19 DS ver 2.5d1 Al carico dopo rotazione su linea con EA75 messo EB110 invece di 112 (come FAST). + +-- carico librerie +local INFO_STD_PP = require( 'Version') -- Variabili di modulo -local MLE_INFO = 'Essetre-FASTrl.NUM.mlpe ver.'..PP_VER..' by EgalTech s.r.l.' +local CSP_INFO = INFO_STD_PP.NAME..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.' +local MACHINE_INFO = 'PP_VER ver.'..PP_VER local TEST_USE = false --------------------------------------------------------------------- @@ -55,7 +46,8 @@ function OnProgramStart() else EmtOutput( '(Program Start)') end - EmtOutput( '('.. MLE_INFO..')\n') + EmtOutput( '('.. CSP_INFO..')') + EmtOutput( '('.. MACHINE_INFO..')\n') -- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente) if TEST_USE then EmtOutput( 'M28') diff --git a/Common-FAST.NUM_PLUS.mlpe b/Common-FAST.NUM_PLUS.mlpe new file mode 100644 index 0000000..4e9ef18 --- /dev/null +++ b/Common-FAST.NUM_PLUS.mlpe @@ -0,0 +1,1637 @@ +-- Processore standard macchine FAST by EgalWare s.r.l. 2024/02/23 +-- Con controllo numerico NUM FlexiumPlus + +-- carico librerie +local INFO_STD_PP = require( 'Version') + +-- Variabili di modulo +local CSP_INFO = INFO_STD_PP.NAME..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.' +local MACHINE_INFO = 'PP_VER 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 = 154000 -- feed massima pinze +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 nPatt = EgtGetInfo( BtlInfoId, 'PATTID', 'i') or 40 + EmtOutput( '%'..EgtNumToString( nPatt, 0)..'.0') + if EMT.INFO then + EmtOutput( '('..EMT.INFO..')') + else + EmtOutput( '(Program Start)') + end + EmtOutput( '('.. CSP_INFO..')') + EmtOutput( '('.. MACHINE_INFO..')\n') + -- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente) + if TEST_USE then + EmtOutput( 'M28') + EmtOutput( 'N1 G101 Z-100 L0=0') + EmtOutput( 'N1 G101 ET1001') + EmtOutput( 'N1 G101 ET2001\n') + end + -- Cerco primo utensile su testa 1 + EMT.TOOL_1, EMT.TLEN_1 = FindFirstToolOnHead( 'H1') + -- Dichiaro inizio + EMT.FIRST = true + EMT.TLAST = nil +end + +--------------------------------------------------------------------- +function OnProgramEnd() + -- Arresto mandrino + if #EMT.AUXSTR > 0 then + EmtOutput( 'M05') + else + EmtOutput( '(M05)') + end + -- Emissione scarico + --for i = 1, #EMT.AUXCMD do + -- EmtOutput( '( ' .. EMT.AUXCMD[i] .. ' )') + --end + EMT.AUXCMD = {} + for i = 1, #EMT.AUXSTR do + EmtOutput( EMT.AUXSTR[i]) + end + if #EMT.AUXSTR > 0 then + if EMT.AUXTYPE == 'S' or EMT.AUXTYPE == 'R' then + EmtOutput( 'G111 ET1004') + EmtOutput( 'G111 ET2004') + elseif EMT.AUXTYPE == 'U' then + local sP1x = EgtIf( EMT.CHY_ON, '4', '2') + EmtOutput( 'G111 ET100'..sP1x) + EmtOutput( 'G111 ET200'..sP1x) + -- emissione conclusione pezzo precedente (se non si è in test) + if not TEST_USE and EMT.PRODID then + local sEnd= 'G113 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2' + EmtOutput( sEnd) + end + end + end + EMT.AUXSTR = {} + EMT.AUXTYPE = nil + EMT.U_STD = nil + EMT.UNL = nil + EMT.PREROT = nil + EMT.SPLITROT = nil + EMT.CHY_ON = nil + EMT.FALL = nil + EMT.RELOAD = nil + EMT.RELOAD2 = nil + -- Se modalità test, termino il programma + if TEST_USE then + EmtOutput( 'M02') + end +end + +--------------------------------------------------------------------- +function OnToolData() + -- emissione dati utensile (esclusa lama) + if EMT.HEAD == 'H1' then + -- output info + local sPos + if #EMT.TCPOS == 2 then + sPos = EMT.TCPOS:gsub( 'T', 'N20') + elseif #EMT.TCPOS == 3 then + sPos = EMT.TCPOS:gsub( 'T', 'N2') + else + sPos = EMT.TCPOS:gsub( 'T1', 'N3') + end + local sOut = 'L11='..EgtNumToString( EMT.SMAX, 0)..' L12='..EmtLenToString( EMT.TTOTLEN, 1)..' G76H9998.1'..sPos..sPos + EmtOutput( sOut) + -- cerco posizione di attrezzaggio del primo utensile di lavorazione + if EMT.TOOL == EMT.TOOL_1 and EMT.TLEN_1 < 215.5 then + EMT.TCPOS_1 = EMT.TCPOS + end + -- emissione dati sega a catena + elseif EMT.HEAD == 'H3' then + if EMT.TDIST and abs( EMT.TDIST) < 0.1 then EMT.TDIST = nil end + local sOut = 'L11='..EgtNumToString( EMT.SMAX, 0)..' L12='..EmtLenToString( ( EMT.TDIST or ChSawLen), 1)..' G76H9998.1N301N304' + 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') + EMT.YPOS = EgtGetInfo( EMT.DISPID, 'YPOS', 'd') + -- Se prima disposizione + if EMT.PHASE == 1 then + -- emissione dati di macchina + local sOut = 'G114 EA'..EmtLenToString( LoadT, 2)..' EB'..EmtLenToString( MinY, 2)..' EC'..EmtLenToString( MaxY, 2).. + ' ED'..EmtLenToString( MinV, 2)..' EE'..EmtLenToString( MaxV, 2)..' EF'..EmtLenToString( MillOffs, 2).. + ' EG'..EmtLenToString( SawOffs, 2)..' EI'..EmtLenToString( ParkY, 2)..' EL'..EmtLenToString( ParkV, 2).. + ' EM'..EmtLenToString( TurnerOffs, 2)..' EN'..EmtLenToString( -DeltaTabY, 2)..' EO'..EmtLenToString( DeltaTabZ, 2) + if SecondSupport >= 3 then + sOut = sOut ..' EP'..EmtLenToString( AngTr1Len, 2) ..' EQ'..EmtLenToString( AngTr1Offs + MillOffs,2) + end + 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 + elseif IsStartPhase( EMT.PHASE) then + EMT.YDELTA = EMT.YPOS - LoadT + EMT.VDELTA = nil + end + end +end + +--------------------------------------------------------------------- +function OnDispositionEnd() + -- Se disposizione inizio o rimanenza + if IsStartOrRestPhase( EMT.PHASE) then + -- reset recupero sovramateriale in X non più presente + EMT.X_OFF = nil + -- dati del grezzo + local LBarra = EMT.LB + -- dati del pezzo + local IdTrave = EMT.IT + local LTrave = EMT.LT + local HTrave = EMT.HT + local STrave = EMT.ST + local HOverM = EMT.HOVM + -- altri dati pezzo + local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL + local nLoad90 = EgtGetInfo( BtlInfoId, 'LOAD90', 'i') or 0 + -- calcolo dati pinze + local AccPinze, AccMaxPinze, RidFeed, TempoAcc = CalcDinamicaPinze( HTrave, STrave, LBarra) + local AccPinz1, AccMaxPinz1, RidFeed1, TempoAcc1 = CalcDinamicaPinze( HTrave, STrave, LBarra - LTrave) + local AccPinz2, AccMaxPinz2, RidFeed2, TempoAcc2 = CalcDinamicaPinze( HTrave, STrave, LTrave) + 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( TempoAcc, 1).. + ' RidFeed='..EmtLenToString( RidFeed, 3)..' FeedMax='..EmtLenToString( EMT.FMAXPINZE / 100 * RidFeed, 3)..' )' + MyOutputNoNum( sOut) + -- info pezzo/barra + sOut = 'G115 EA' .. EmtLenToString( LBarra, 2) .. ' EB' .. EmtLenToString( HTrave, 2) .. ' EC' .. EmtLenToString( STrave, 2) .. + ' ED' .. EmtLenToString( HOverM, 2) .. ' EE' .. tostring( nLoad90) .. ' EF' .. EmtLenToString( LTrave, 2) .. + ' EG' .. EgtNumToString( AccPinze, 2) .. ' EH' .. EgtNumToString( AccPinz2, 2) .. ' EI' .. EgtNumToString( AccPinz1, 2) + MyOutputNoNum( sOut) + sOut = 'E10012=1' + MyOutputNoNum( sOut) + local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL + EMT.PRODID = EgtGetInfo( BtlInfoId, 'PRODID', 'i') or 0 + EMT.PATTID = EgtGetInfo( BtlInfoId, 'PATTID', 'i') or 0 + EMT.CUTID = EgtGetInfo( EMT.IDT, 'CUTID', 'i') or 0 + local sStart = 'G113 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED1' + EmtOutput( sStart) + else + MyOutputNoNum( '(REMAIN UNLOAD)') + -- info pezzo/barra + local sOut = 'G115 EA' .. EmtLenToString( LBarra, 2) .. ' EB' .. EmtLenToString( HTrave, 2) .. ' EC' .. EmtLenToString( STrave, 2) .. + ' ED' .. EmtLenToString( HOverM, 2) .. ' EF' .. tostring( nLoad90) .. ' EG' .. EmtLenToString( LBarra, 2) + EmtOutput( sOut) + EMT.PRODID = nil + EMT.PATTID = nil + EMT.CUTID = nil + end + -- se carico barra + if EMT.LOAD then + -- verifico se sezione già caricata + local sOut = 'IF E30036<'..EmtLenToString(HTrave*1000,0)..' OR E30033<'..EmtLenToString(STrave*1000,0)..' THEN' + EmtOutput( sOut) + sOut = 'M119' + EmtOutput( sOut) + sOut = '(M149)' + EmtOutput( sOut) + sOut = 'ENDI' + EmtOutput( sOut) + -- assegnazione dati trave e barra + sOut = 'E30036='..EmtLenToString(HTrave*1000,0)..' E30033='..EmtLenToString(STrave*1000,0).. + ' E30069='..EmtLenToString(LBarra*1000,0) + EmtOutput( sOut) + -- preselezione prima fresa (della testa 1) + sOut = 'IF E30001=0 THEN' + EmtOutput( sOut) + sOut = 'M6' .. ( EMT.TCPOS_1 or 'T1') + -- va scritto 2 volte + EmtOutput( sOut) + EmtOutput( sOut) + sOut = 'ENDI' + EmtOutput( sOut) + -- ora abilito numerazione linee + EMT.NUM = true + EMT.LINENBR = 0 + -- se altrimenti ricarico barra dopo rotazione speciale + elseif EMT.RELOAD then + -- assegnazione dati trave e barra + sOut = 'E30036='..EmtLenToString(HTrave*1000,0)..' E30033='..EmtLenToString(STrave*1000,0).. + ' E30069='..EmtLenToString(LBarra*1000,0) + EmtOutput( sOut) + -- altrimenti recupero rimanenza + else + EmtOutput( 'G112 EC1'..' Y'..EmtLenToString( LoadT, 3).. ' EY'..EmtLenToString( EMT.YPOS, 3)..' EV'..EmtLenToString( ParkV, 3) ..' EF'..GetFmaxClamp()) + -- aggiorno dati aggancio carrelli alla trave + EMT.YDELTA = EMT.YPOS - LoadT + EMT.VDELTA = nil + end + -- eventuale preparazione per rotazione immediata + if IsStartPhase( EMT.PHASE) and EMT.AUXSTR then + -- emissione movimento carrelli per rotazione + EMT.AUXCMD = {} + if #EMT.AUXSTR > 0 then + EmtOutput( '(ROTATION)') + end + for i = 1, #EMT.AUXSTR do + EmtOutput( EMT.AUXSTR[i]) + end + if #EMT.AUXSTR > 0 then + EmtOutput( 'G111 ET1004') + EmtOutput( 'G111 ET2004') + end + EMT.AUXSTR = {} + EMT.AUXTYPE = nil + end + -- se altrimenti disposizione intermedia, eventuale rotazione + elseif IsMidPhase( EMT.PHASE) or IsEnd2Phase( EMT.PHASE) then + -- se rotazioni diverse, emetto il comando e aggiorno lo stato + if VerifyEmitRotation() then + -- imposto stato post-rotazione + EMT.POSTROT = true + -- imposto recupero sovramateriale in X non più presente + EMT.X_OFF = EMT.HOVM + end + -- se altrimenti disposizione intermedia speciale con eventuale rotazione + elseif IsMid2Phase( EMT.PHASE) then + -- emissione movimento carrelli + EMT.AUXCMD = {} + if #EMT.AUXSTR > 0 then + EmtOutput( '(ROTATION)') + end + for i = 1, #EMT.AUXSTR do + EmtOutput( EMT.AUXSTR[i]) + end + if #EMT.AUXSTR > 0 then + EmtOutput( 'G111 ET1004') + EmtOutput( 'G111 ET2004') + end + EMT.AUXSTR = {} + EMT.AUXTYPE = nil + -- se rotazioni diverse, emetto il comando e aggiorno lo stato + if VerifyEmitRotation() then + -- imposto stato post-rotazione + EMT.POSTROT = true + -- imposto recupero sovramateriale in X non più presente + EMT.X_OFF = EMT.HOVM + end + -- altrimenti disposizione finale, eventuale scarico pezzo lavorato se non ci sono lavorazioni + else + EMT.AUXCMD = {} + if #EMT.AUXSTR > 0 then + MyOutputNoNum( '(PART UNLOAD)') + end + for i = 1, #EMT.AUXSTR do + local sOut = EMT.AUXSTR[i] + if not sOut:find( 'ET') then + sOut = sOut .. ' ET2' + end + EmtOutput( sOut) + end + if #EMT.AUXSTR > 0 then + EmtOutput( 'G111 ET1002') + -- se dopo c'è scarico spezzone o sono in test devo mettere attesa termine esecuzione + if IsRestPhase( EMT.PHASE + 1) or TEST_USE then + EmtOutput( 'G111 ET2002') + else + EmtOutput( '(G111 ET2002)') + end + -- emissione conclusione pezzo precedente + if EMT.PRODID then + local sEnd= 'G113 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2' + EmtOutput( sEnd) + end + end + EMT.AUXSTR = {} + EMT.AUXTYPE = nil + EMT.U_STD = nil + end + + EMT.OPEISDISP = false +end + +--------------------------------------------------------------------- +function OnTableData() +end + +--------------------------------------------------------------------- +function OnFixtureData() +end + +--------------------------------------------------------------------- +function OnRawMoveData() + -- Se disposizione inizio o rimanenza + if IsStartOrRestPhase( EMT.PHASE) then + -- se primo grezzo, reset lunghezza barra + if EMT.RAWIND == 1 then EMT.LB = 0 end + -- aggiungo la lunghezza del grezzo (solo se movimento in corner) + if EMT.RAWTYPE == 1 then + local b3Raw = EgtGetBBoxGlob( EgtGetFirstNameInGroup( EMT.RAWID, 'RawSolid'), GDB_BB.STANDARD) + local LBarra = b3Raw:getDimX() + EMT.LB = EMT.LB + LBarra + end + -- se primo grezzo, calcolo dati del pezzo + if EMT.RAWIND == 1 then + local PartId = EgtGetFirstPartInRawPart( EMT.RAWID) + if PartId then + EMT.IDT = PartId + EMT.IT = EgtGetInfo( PartId, 'PDN', 'i') or 0 + local b3Part = EgtGetBBoxGlob( EgtGetFirstNameInGroup( PartId, 'Box'), GDB_BB.STANDARD) + EMT.LT = b3Part:getDimX() + EMT.HT = b3Part:getDimY() + EMT.ST = b3Part:getDimZ() + EMT.HOVM = EgtGetInfo( EMT.RAWID, 'HOVM', 'd') or 0 + else + EMT.IDT = GDB_ID.NULL + EMT.IT = -1 + EMT.LT = 0 + EMT.HT = EMT.HT or 0 + EMT.ST = EMT.ST or 0 + EMT.HOVM = 0 + end + end + end +end + +--------------------------------------------------------------------- +function OnToolSelect() + -- se utensile definito (non definito per disposizioni con movimento) + if EMT.TOOL ~= '' then + -- verifiche su utensile + local sTool = EgtTdbGetToolFromUUID( EgtGetMachiningParam( MCH_MP.TUUID) or "") + if sTool ~= EMT.TOOL then error( "Tool name mismatch") end + -- predefinite EMT.TCPOS EMT.HEAD EMT.EXIT + EMT.TOOLTYPE = EgtTdbGetCurrToolParam( MCH_TP.TYPE) + EMT.TOOLSEL = EMT.TCPOS..' M06' + EMT.TDIAM = EgtTdbGetCurrToolParam( MCH_TP.DIAM) + EMT.TTOTDIAM = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM) + EMT.TLEN = EgtTdbGetCurrToolParam( MCH_TP.LEN) + EMT.TTOTLEN = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) + if MCH_TP.DIST then EMT.TDIST = EgtTdbGetCurrToolParam( MCH_TP.DIST) end + if EMT.TDIST and abs( EMT.TDIST) < 0.1 then EMT.TDIST = nil end + end +end + +--------------------------------------------------------------------- +function OnToolDeselect() +end + +--------------------------------------------------------------------- +function OnMachiningStart() + --EMT.MCHNAME = EgtGetMachiningParam(MCH_MP.NAME) + EMT.MCHNAME = EgtGetOperationName( EMT.MCHID) + EMT.MCHTYPE = EgtGetMachiningParam(MCH_MP.TYPE) + EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES) + -- non ancora iniziata la lavorazione + EMT.MCHFIRST = true + -- sistemazione speed + if EMT.HEAD == 'H2' then + EMT.S = EMT.S * 6 + end + -- determino subito se taglio di separazione di pezzo a caduta + EMT.PREFALLCUT = nil + if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Split') then + local ClId = EgtGetFirstNameInGroup( EMT.MCHID, 'CL') + local P1Id = EgtGetFirstNameInGroup( ClId or GDB_ID.NULL, 'P1') + local sAE1 = EgtGetInfo( P1Id or GDB_ID.NULL, 'AE1') or '' + if sAE1 == '0,Fall' then + EMT.PREFALLCUT = true + end + end +end + +--------------------------------------------------------------------- +function OnMachiningEnd() + --EmtOutput( ';Mach End') + -- Emissione split + --for i = 1, #EMT.AUXCMD do + -- EmtOutput( '( ' .. EMT.AUXCMD[i] .. ' )') + --end + EMT.AUXCMD = {} + if #EMT.AUXSTR > 0 then + if EMT.AUXTYPE == 'S' then + MyOutputNoNum( '(PART SPLIT)') + elseif EMT.AUXTYPE == 'U' then + if not EMT.ZMAX then + EmitZmax( false) + EMT.ZMAX = true + end + MyOutputNoNum( '(PART UNLOAD)') + elseif EMT.AUXTYPE == 'P' then + if EMT.PREROT then + if not EMT.ZMAX then + EmitZmax( false) + EMT.ZMAX = true + end + MyOutputNoNum( '(PART ROTATION)') + elseif EMT.FALL then + if not EMT.ZMAX then + EmitZmax( false) + EMT.ZMAX = true + end + EmtOutput( '(FALL)') + else + if not EMT.ZMAX then + EmitZmax( false) + EMT.ZMAX = true + end + EmtOutput( '(SPLIT 2)') + end + end + end + for i = 1, #EMT.AUXSTR do + local sOut = EMT.AUXSTR[i] + if EMT.AUXTYPE == 'S' then + sOut = sOut .. ' EH1' + elseif EMT.AUXTYPE == 'U' and not EMT.CHY_ON and not sOut:find( 'ET') then + sOut = sOut .. ' ET2' + end + EmtOutput( sOut) + end + if #EMT.AUXSTR > 0 then + if EMT.AUXTYPE == 'S' then + EmtOutput( 'G111 ET1004') + EmtOutput( 'G111 ET2004') + elseif EMT.AUXTYPE == 'U' then + local sP1x = EgtIf( EMT.CHY_ON, '4', '2') + EmtOutput( 'G111 ET100'..sP1x) + -- se dopo cè un altro pezzo o scarico spezzone o sono in test devo mettere attesa termine esecuzione + if IsStartOrRestPhase( EMT.PHASE + 1) or EMT.CHY_ON or TEST_USE then + EmtOutput( 'G111 ET200'..sP1x) + else + EmtOutput( '(G111 ET200'..sP1x..')') + end + -- emissione conclusione pezzo precedente + if not TEST_USE and EMT.PRODID then + local sEnd= 'G113 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2' + EmtOutput( sEnd) + end + elseif EMT.AUXTYPE == 'P' then + EmtOutput( 'G111 ET1004') + EmtOutput( 'G111 ET2004') + if EMT.FALL then + EmtOutput( 'M155') + EmtOutput( 'M28') + -- emissione conclusione pezzo (se non in modalità test) + if not TEST_USE and EMT.PRODID then + local sEnd= 'G113 EA'..tostring( EMT.PRODID)..' EB'..tostring( EMT.PATTID)..' EC'..tostring( EMT.CUTID)..' ED2' + EmtOutput( sEnd) + end + elseif not EMT.PREROT then + EmtOutput( 'M77') + end + end + end + EMT.AUXSTR = {} + EMT.AUXTYPE = nil + EMT.U_STD = nil + EMT.PREVTOOL = EMT.TOOL + EMT.PREVR3 = EMT.R3 +end + +--------------------------------------------------------------------- +function OnPathStart() + -- non ancora iniziata la lavorazione + EMT.MCHFIRST = true + -- primo posizionamento sempre in globale + EMT.REFLOC = nil + EMT.IPLGL = false + -- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento) + EmtResetPrev() + EMT.AUXCMD = {} + EMT.AUXSTR = {} +end + +--------------------------------------------------------------------- +function OnPathEnd() + EMT.AUXTYPE = nil + EMT.UNL = nil + EMT.PREROT = nil + EMT.SPLITROT = nil + EMT.CHY_ON = nil + EMT.FALL = nil + EMT.AUXCMD = {} + EMT.AUXSTR = {} +end + +--------------------------------------------------------------------- +function OnPathStartAux() + --EgtOutLog( 'OnPathStartAux - ' .. EgtNumToString( EMT.AUXIND, 0) .. ' - ' .. EMT.AUX) + + -- se richiesto, preparo il carico barra + if EMT.LOAD or EMT.RELOAD then + PrepareLoad( EMT.AUX, true) + -- se altrimenti carico dopo rotazione + elseif EMT.POSTROT then + PreparePostRotation( EMT.AUX) + -- altrimenti, preparo lo spostamento carrelli + else + PrepareMoveChar( EMT.AUX) + end +end + +--------------------------------------------------------------------- +function OnPathEndAux() + --EgtOutLog( 'OnPathEndAux - ' .. EgtNumToString( EMT.AUXIND, 0) .. ' - ' .. EMT.AUX) + -- verifico tipo di emissione + if EMT.OPEISDISP then + if not EMT.AUXTYPE then + local Cmd = EgtSplitString( EMT.AUX) + if Cmd[1] == '0' and Cmd[2] == 'Unloading' then + EMT.AUXTYPE = 'U' + elseif EgtGetInfo( EMT.DISPID, 'TYPE') == 'REST' then + EMT.AUXTYPE = 'R' + else + EMT.AUXTYPE = 'P' + end + end + else + if not EMT.AUXTYPE then + local Cmd = EgtSplitString( EMT.AUX) + if Cmd[1] == '0' and Cmd[2] == 'Split' then + EMT.AUXTYPE = 'S' + elseif Cmd[1] == '0' and Cmd[2] == 'Unloading' then + EMT.AUXTYPE = 'U' + else + EMT.AUXTYPE = 'P' + if Cmd[1] == '0' and Cmd[2] == 'Fall' then + EMT.FALL = true + end + end + elseif EMT.AUXTYPE == 'P' then + local Cmd = EgtSplitString( EMT.AUX) + if Cmd[1] == '0' and Cmd[2] == 'Unloading' then + EMT.CHY_ON = true + EMT.AUXTYPE = 'U' + end + end + end + -- preparo a seconda del tipo + if EMT.AUXTYPE == 'R' then + -- per il carico della rimanenza dopo rotazione speciale + if EMT.RELOAD and not EMT.RELOAD2 then + PrepareLoad( EMT.AUX, false) + -- per lo scarico della rimanenza + else + PrepareResidue( EMT.AUX) + end + elseif EMT.AUXTYPE == 'S' then + -- per lo split + PrepareSplit( EMT.AUX) + elseif EMT.AUXTYPE == 'U' then + -- per lo scarico + PrepareUnload( EMT.AUX) + elseif EMT.AUXTYPE == 'P' then + -- per la pre-rotazione + PreparePreRotation( EMT.AUX) + end +end + +--------------------------------------------------------------------- +function OnRapid() + MyBackupAxes() + -- se primo movimento della lavorazione, gestione speciale + if EMT.MCHFIRST and not EMT.OPEISDISP then + -- decido se muovere prima testa o carrelli (standard prima testa) + local bHeadFirst = true + local sLateG101 + if not ( EMT.LOAD or EMT.RELOAD) and not EMT.ZMAX then + local DeltaT = EMT.L1 - EMT.TLAST + if ( DeltaT < -GEO.EPS_SMALL and EMT.VDELTA) or ( DeltaT > GEO.EPS_SMALL and EMT.YDELTA) then bHeadFirst = false end + end + -- sistemo movimenti + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + if not ( EMT.LOAD or EMT.RELOAD) then + if not EMT.ZMAX and #EMT.AUXSTR > 0 then + EmitZmax( EMT.TOOL ~= EMT.PREVTOOL) + EMT.ZMAX = true + EMT.PREVTOOL = EMT.TOOL + end + end + if not EMT.LOAD then + local sOut = string.gsub( string.gsub( EMT.MCHNAME..'/'..EMT.TOOL, '%(', '-'), '%)', '-') + EmtOutput( '( *** ' .. sOut .. ' *** )') + end + -- primo posizionamento + EmtResetPrev() + local bZmax = ( #EMT.AUXSTR > 0 or EMT.TOOL ~= EMT.PREVTOOL or EMT.L3 > -1) + local sEE = ' EE' .. EgtIf( bZmax, '3', '4') + local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ( EMT.TDIST or ChSawLen)), 3) + local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3) + local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3) + local sES = ' ES'..EgtNumToString( EMT.S, 0) + local sOut = 'G101' .. EmtGetAxis( 'L2') .. EmtGetAxis( 'L3') .. + EmtGetAxis( 'R2') .. EmtGetAxis( 'R1') .. sEE .. sEL .. sER .. sET .. sES + if EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then + sOut = sOut .. ' EH1' + end + if EMT.LOAD or bHeadFirst then + sOut = sOut .. ' L0=0' + if EMT.LOAD or #EMT.AUXSTR > 0 then + sOut = sOut .. ' EG1' + else + sOut = sOut .. EgtIf( EMT.TOOL ~= EMT.PREVTOOL or EMT.R3 ~= EMT.PREVR3, ' EG2', ' EG3') + end + EmtOutput( sOut) + sOut = 'G101 ET1001' + EmtOutput( sOut) + else + -- va ritardata anche l'emissione del comando + sLateG101 = sOut..' L0=0' + end + -- se prima lavorazione + if EMT.LOAD then + local nJump = 9 + sOut = 'G79 E80060<>0 N' .. EgtNumToString( nJump, 0) .. ' E10015=0' + EmtOutput( sOut) + --for i = 1, #EMT.AUXCMD do + -- EmtOutput( '( ' .. EMT.AUXCMD[i] .. ' )') + --end + EMT.AUXCMD = {} + if #EMT.AUXSTR > 2 then + EmtOutput( EMT.AUXSTR[1] .. ' ET1') + EmtOutput( EMT.AUXSTR[2] .. 'ET1') + EmtOutput( 'G111 ET1001') + EmtOutput( 'G79 N' .. EgtNumToString( nJump, 0)) + EmtOutput( 'E80060=1') + EmtOutput( 'G111 ET2001') + for i = 3, #EMT.AUXSTR do + EmtOutput( EMT.AUXSTR[i]) + end + EmtOutput( 'G111 ET1004') + EmtOutput( 'G111 ET2004') + else + for i = 1, #EMT.AUXSTR do + EmtOutput( EMT.AUXSTR[i]) + end + EmtOutput( 'G111 ET1001') + EmtOutput( 'G79 N' .. EgtNumToString( nJump, 0)) + EmtOutput( 'E80060=1') + EmtOutput( 'G111 ET2001') + end + EMT.AUXSTR = {} + sOut = string.gsub( string.gsub( EMT.MCHNAME..'/'..EMT.TOOL, '%(', '-'), '%)', '-') + EmtOutput( '( *** ' .. sOut .. ' *** )') + sOut = 'G101 ET2001' + EmtOutput( sOut) + local sY, sA + if EMT.YDELTA then + sY = EmtLenToString( EMT.L1 + EMT.YDELTA) + sA = '1' + else + sY = EmtLenToString( ParkY) + sA = '2' + end + local sV, sB + if EMT.VDELTA then + sV = EmtLenToString( EMT.L1 + EMT.VDELTA) + sB = '1' + else + sV = EmtLenToString( ParkV) + sB = '2' + end + sOut = 'G112 EA'..sA..' EB'..sB..''..EmtGetAxis('L1')..' EY'..sY..' EV'..sV..' EF'..GetFmaxClamp() + EmtOutput( sOut) + EMT.LOAD = false + -- altrimenti lavorazione successiva + else + -- eventuale G111 + --for i = 1, #EMT.AUXCMD do + -- EmtOutput( '( ' .. EMT.AUXCMD[i] .. ' )') + --end + EMT.AUXCMD = {} + for i = 1, #EMT.AUXSTR do + EmtOutput( EMT.AUXSTR[i]) + end + if #EMT.AUXSTR > 0 then + if not ( EMT.POSTROT or EMT.RELOAD) then + EmtOutput( 'G111 ET1004') + EmtOutput( 'G111 ET2004') + else + EmtOutput( 'G111 ET1001') + EmtOutput( 'G111 ET2001') + end + end + EMT.AUXSTR = {} + local sY, sA + if EMT.YDELTA then + sY = EmtLenToString( EMT.L1 + EMT.YDELTA - ( EMT.X_OFF or 0)) + sA = '1' + else + sY = EmtLenToString( EgtIf( EMT.YPOS, EMT.YPOS, ParkY)) + sA = '2' + end + local sV, sB + if EMT.VDELTA then + sV = EmtLenToString( EMT.L1 + EMT.VDELTA - ( EMT.X_OFF or 0)) + sB = '1' + else + sV = EmtLenToString( ParkV) + sB = '2' + end + if bHeadFirst then + sOut = 'G101 ET2001' + EmtOutput( sOut) + end + sOut = 'G112 EA'..sA..' EB'..sB..EmtGetAxis('L1')..' EY'..sY..' EV'..sV..' EF'..GetFmaxClamp() + EmtOutput( sOut) + -- 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') then + EmtOutput( '(M175)') + end + if not bHeadFirst then + sLateG101 = sLateG101 .. EgtIf( EMT.TOOL ~= EMT.PREVTOOL or EMT.R3 ~= EMT.PREVR3, ' EG2', ' EG3') + EmtOutput( sLateG101) + sOut = 'G101 ET1001' + EmtOutput( sOut) + sOut = 'G101 ET2001' + EmtOutput( sOut) + end + EMT.POSTROT = false + EMT.RELOAD = false + EMT.RELOAD2 = nil + end + -- se taglio di separazione prima di scarico a caduta, emissione stop tappeto scarico trucioli + if EMT.PREFALLCUT then + EmtOutput( 'M29') + EMT.PREFALLCUT = nil + end + EMT.REFLOC = 0 + EMT.MCHFIRST = false + EMT.ZMAX = false + -- se alto in Z (non serve l'avvicinamento finale) + if EMT.FLAG == 2 then + -- aggiorno valori come precedenti + EMT.TLAST = EMT.L1b + EmtUpdatePrev() + return + -- altrimenti ripristino i valori originali degli assi + else + MyRestoreAxes() + end + end + -- se standard + if EMT.FLAG == 0 or EMT.FLAG == 1 or EMT.FLAG == 2 then + -- se necessario, impostazione riferimento locale + if EMT.REFLOC == 0 then + -- calcolo per piano generico + CalcInterpPlane() + EMT.REFLOC = 1 + -- trasformo i punti nel piano + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + EMT.L1p = nil + EMT.L2p = nil + EMT.L3p = nil + EmtOutput( 'G102'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..EMT.IPLGLSTR) + else + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + end + -- emissione movimento + local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3') + if EMT.HEAD ~= 'H2' then sOut = sOut..EmtGetAxis('R2')..EmtGetAxis('R1') end + EmtOutput( sOut) + -- se altrimenti risalita a Z max a fine lavorazione + elseif EMT.FLAG == 3 then + EMT.REFLOC = nil + EMT.IPLGL = false + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + EmitZmax( false) + EMT.ZMAX = true + -- se altrimenti movimento in Home + elseif EMT.FLAG == 4 then + -- non previsto + -- se altrimenti rotazione a Z max + elseif EMT.FLAG == 5 then + -- viene gestito all'inizio della lavorazione successiva + -- altrimenti errore + else + EmtSetLastError( 1212, "Unknown Rapid flag") + end + -- aggiorno valori come precedenti + EMT.TLAST = EMT.L1b + EmtUpdatePrev() +end + +--------------------------------------------------------------------- +function OnLinear() + MyBackupAxes() + EMT.TLAST = EMT.L1 + -- se necessario, impostazione riferimento locale + if EMT.REFLOC == 0 then + -- calcolo per piano generico + CalcInterpPlane() + EMT.REFLOC = 1 + -- salvo posizione attuale + local OldL1 = EMT.L1 + local OldL2 = EMT.L2 + local OldL3 = EMT.L3 + -- imposto posizione precedente (non contiene l'offset in X per sovramateriale di testa EMT.X_OFF) + EMT.L1 = EMT.L1o + EMT.L2 = EMT.L2o + EMT.L3 = EMT.L3o + -- trasformo i punti nel piano + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + EMT.L1p = nil + EMT.L2p = nil + EMT.L3p = nil + EmtOutput( 'G102'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3')..EMT.IPLGLSTR) + -- emissione movimento + local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3') + if EMT.HEAD ~= 'H2' then sOut = sOut..EmtGetAxis('R2')..EmtGetAxis('R1') end + EmtOutput( sOut) + -- ripristino posizione attuale + EMT.L1 = OldL1 + EMT.L2 = OldL2 + EMT.L3 = OldL3 + end + + -- aggiustamento valori + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + + -- valori degli assi + local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3') + if EMT.HEAD ~= 'H2' then sAxes = sAxes..EmtGetAxis('R2')..EmtGetAxis('R1') end + -- se nulla da emettere, esco + if string.len( sAxes) == 0 then + return + end + -- aggiungo feed + local sFeed = EmtGetFeed() + -- emetto linea + EmtOutput( "G1"..sAxes..sFeed) + + -- aggiorno valori come precedenti + EmtUpdatePrev() +end + +--------------------------------------------------------------------- +function OnArc() + MyBackupAxes() + EMT.TLAST = EMT.L1 + -- non modale su archi + EmtResetPrevLinear() + -- aggiustamento valori + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + + -- valori degli assi + local sAxes = EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3') + if EMT.HEAD ~= 'H2' then sAxes = sAxes..EmtGetAxis('R2')..EmtGetAxis('R1') end + -- 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 + EmtUpdatePrev() +end + +--------------------------------------------------------------------- +function CalcDinamicaPinze( dH, dS, dL) + local MinTempoAcc = 0.3 -- [s] + local MaxTempoAcc = 4.0 -- [s] + local KgMtCubo= 550 -- densità legno [Kg / metro cubo] + local Massa = ( dH * dS * dL * KgMtCubo ) / 1e9 -- massa [Kg] + local FMaxPinze = EMT.FMAXPINZE -- Feed massima pinze [mm/min] + local ForzaAttrito = 350 * 9.8 * 0.2 -- Forza chiusura pinze [Kgf] * g * Coeff_Attrito -> [N] + local TempoAcc = ( ( Massa * FMaxPinze) / ( 60 * ForzaAttrito) / 1000) + if ( TempoAcc < MinTempoAcc) then TempoAcc = MinTempoAcc end + if ( TempoAcc > MaxTempoAcc) then TempoAcc = MaxTempoAcc end + local AccMaxPinze = FMaxPinze / ( 60 * MinTempoAcc) + local AccPinze = FMaxPinze / ( 60 * TempoAcc) + local RidFeed = 100 / Massa * 100 + if RidFeed > 100 then + RidFeed = 100 + elseif RidFeed < 10 then + RidFeed = 10 + end + return AccPinze, AccMaxPinze, RidFeed, TempoAcc +end + +--------------------------------------------------------------------- +function CalcCharStatus( sCmd, bSkipPress) + -- aperto + if sCmd == '0' then + return '1' + -- chiuso + elseif sCmd == '1' then + return '2' + -- chiuso con pressore attivato + elseif sCmd == '2' then + return EgtIf( bSkipPress, '2', '0') + end +end + +--------------------------------------------------------------------- +function PrepareLoad( sCmd, bStart) + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + -- se inizio + if EMT.AUXIND == 1 then + -- imposto stato pinze + EMT.SA = ' EA111' + EMT.SB = ' EB111' + EMT.SC = ' EC141' + EMT.SD = ' ED141' + EMT.SE = ' EE0' + end + -- se dichiarazione inizio riposizionamento carrelli + if Cmd[2] == 'CARR_MOVE' then + if bStart then + EMT.RELOAD = false + else + EMT.RELOAD2 = true + end + for i = 1, #EMT.AUXSTR do + EMT.AUXSTR[i] = string.gsub( EMT.AUXSTR[i], 'ET1', '') + end + end + elseif Cmd[1] == '1' then + local sMsg = Cmd[2] .. Cmd[3] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[2] ~= 'Z' then + local sOut = 'G111 '..Cmd[2]..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + if Cmd[2] == 'Y' then EMT.YPOS = tonumber( Cmd[3]) end + end + elseif Cmd[1] == '2' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[2] == 'Y' then + local sYTaking = ' Y'..EmtLenToString( Cmd[3] + TurnerOffs) + local sBeamRot = '0' + if StartRotation and EMT.LB >= AutoRotMinLen then + local nRot = GetPhaseRot( EMT.PHASE) + local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL + local nLoad90 = EgtGetInfo( BtlInfoId, 'LOAD90', 'i') or 0 + sBeamRot = tostring( nLoad90) + end + local sOut = 'G111'..sYTaking..' EA75'..EMT.SB..' EE0 EF'..EmtLenToString(EMT.FMAXPINZE,0)..' ET1 E80057='..sBeamRot..' E80058=0' + table.insert( EMT.AUXSTR, sOut) + end + elseif Cmd[1] == '3' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] + table.insert( EMT.AUXCMD, sMsg) + local sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..Cmd[3], '')).. + (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..Cmd[5], '')).. + (EgtIf( Cmd[6] ~= 'T', ' '..Cmd[6]..Cmd[7], '')).. + EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + elseif Cmd[1] == '11' then + local sMsg = 'PY' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + local bPrevEA76 = ( #EMT.AUXSTR > 0 and EMT.AUXSTR[#EMT.AUXSTR]:find( 'EA76', 1, true)) + if #EMT.AUXSTR > 0 and not bPrevEA76 then + local sVal = ' EB11' .. CalcCharStatus( Cmd[2]) + local sOut = EMT.AUXSTR[#EMT.AUXSTR] + EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SB, sVal) + end + if not bPrevEA76 then + EMT.SA = ' EA11' .. CalcCharStatus( Cmd[2]) + end + EMT.SB = ' EB11' .. CalcCharStatus( Cmd[2]) + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE1', ' EE2') + elseif Cmd[1] == '12' then + local sMsg = 'PV' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + if #EMT.AUXSTR > 0 then + local sVal = ' ED14' .. CalcCharStatus( Cmd[2]) + local sOut = EMT.AUXSTR[#EMT.AUXSTR] + EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) + end + EMT.SC = ' EC14' .. CalcCharStatus( Cmd[2]) + EMT.SD = ' ED14' .. CalcCharStatus( Cmd[2]) + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE2', ' EE1') + elseif Cmd[1] == '21' then + local nYDelta = tonumber( Cmd[2]) + local nVDelta = tonumber( Cmd[3]) + if nYDelta > 0 and nVDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nVDelta + elseif nYDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nil + elseif nVDelta > 0 then + EMT.YDELTA = nil + EMT.VDELTA = nVDelta + end + if not FindG111EA76( EMT.AUXSTR) then + local sYLoad = ' Y'..EmtLenToString( LoadT) + local sOut = 'G111'..sYLoad..' EA76'..EMT.SB..' EE0 EF'..EmtLenToString( EMT.FMAXPINZE, 0)..' ET1' + table.insert( EMT.AUXSTR, sOut) + end + end +end + +--------------------------------------------------------------------- +function PrepareMoveChar( sCmd) + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + -- se inizio + if EMT.AUXIND == 1 then + -- imposto stato pinze + EMT.SA = EgtIf( EMT.YDELTA, ' EA112', ' EA111') + EMT.SB = EgtIf( EMT.YDELTA, ' EB112', ' EB111') + EMT.SC = EgtIf( EMT.VDELTA, ' EC142', ' EC141') + EMT.SD = EgtIf( EMT.VDELTA, ' ED142', ' ED141') + EMT.SE = EgtIf( EMT.YDELTA, ' EE1', ' EE2') + end + elseif Cmd[1] == '1' then + local sMsg = Cmd[2] .. Cmd[3] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[2] ~= 'Z' then + local sOut = 'G111 '..Cmd[2]..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + if Cmd[2] == 'Y' then EMT.YPOS = tonumber( Cmd[3]) end + end + elseif Cmd[1] == '2' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] + table.insert( EMT.AUXCMD, sMsg) + local sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..Cmd[3], '')).. + (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..Cmd[5], '')).. + EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..'EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + elseif Cmd[1] == '3' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] + table.insert( EMT.AUXCMD, sMsg) + local sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..Cmd[3], '')).. + (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..Cmd[5], '')).. + (EgtIf( Cmd[6] ~= 'T', ' '..Cmd[6]..Cmd[7], '')).. + EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + elseif Cmd[1] == '11' then + local sMsg = 'PY' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + if #EMT.AUXSTR > 0 then + local sVal = ' EB11' .. CalcCharStatus( Cmd[2]) + local sOut = EMT.AUXSTR[#EMT.AUXSTR] + EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SB, sVal) + end + EMT.SA = ' EA11' .. CalcCharStatus( Cmd[2]) + EMT.SB = ' EB11' .. CalcCharStatus( Cmd[2]) + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE1', ' EE2') + elseif Cmd[1] == '12' then + local sMsg = 'PV' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + if #EMT.AUXSTR > 0 then + local sVal = ' ED14' .. CalcCharStatus( Cmd[2]) + local sOut = EMT.AUXSTR[#EMT.AUXSTR] + EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) + end + EMT.SC = ' EC14' .. CalcCharStatus( Cmd[2]) + EMT.SD = ' ED14' .. CalcCharStatus( Cmd[2]) + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE2', ' EE1') + elseif Cmd[1] == '21' then + local nYDelta = tonumber( Cmd[2]) + local nVDelta = tonumber( Cmd[3]) + if nYDelta > 0 and nVDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nVDelta + elseif nYDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nil + elseif nVDelta > 0 then + EMT.YDELTA = nil + EMT.VDELTA = nVDelta + end + end +end + +--------------------------------------------------------------------- +function PrepareResidue( sCmd) + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + -- se non è scarico + if Cmd[2] ~= 'Unloading' then + -- se inizio o subito dopo, imposto stato iniziale pinze + if EMT.AUXIND <= 2 then + EMT.SA = EgtIf( EMT.YDELTA, ' EA112', ' EA111') + EMT.SB = EgtIf( EMT.YDELTA, ' EB112', ' EB111') + EMT.SC = EgtIf( EMT.VDELTA, ' EC142', ' EC141') + EMT.SD = EgtIf( EMT.VDELTA, ' ED142', ' ED141') + EMT.SE = EgtIf( EMT.YDELTA, ' EE1', ' EE2') + end + else + EMT.UNL = true + end + elseif Cmd[1] == '1' then + local sMsg = Cmd[2] .. Cmd[3] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[2] ~= 'Z' then + local sOut + if not EMT.UNL then + sOut = 'G111 '..Cmd[2]..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + else + sOut = 'G111 '..Cmd[2]..Cmd[3]..' EC141 ED83 EE0 EF'..GetFmaxClamp() + end + table.insert( EMT.AUXSTR, sOut) + end + elseif Cmd[1] == '2' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] + table.insert( EMT.AUXCMD, sMsg) + local sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..Cmd[3], '')).. + (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..Cmd[5], '')).. + EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + elseif Cmd[1] == '3' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] + table.insert( EMT.AUXCMD, sMsg) + local sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..Cmd[3], '')).. + (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..Cmd[5], '')).. + (EgtIf( Cmd[6] ~= 'T', ' '..Cmd[6]..Cmd[7], '')).. + EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + elseif Cmd[1] == '11' then + local sMsg = 'PY' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + if #EMT.AUXSTR > 0 then + local sVal = ' EB11' .. CalcCharStatus( Cmd[2], true) + local sOut = EMT.AUXSTR[#EMT.AUXSTR] + EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SB, sVal) + end + EMT.SA = ' EA11' .. CalcCharStatus( Cmd[2], true) + EMT.SB = ' EB11' .. CalcCharStatus( Cmd[2], true) + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE1', ' EE2') + elseif Cmd[1] == '12' then + local sMsg = 'PV' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + if #EMT.AUXSTR > 0 then + local sVal = ' ED14' .. CalcCharStatus( Cmd[2], true) + local sOut = EMT.AUXSTR[#EMT.AUXSTR] + EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) + end + EMT.SC = ' EC14' .. CalcCharStatus( Cmd[2], true) + EMT.SD = ' ED14' .. CalcCharStatus( Cmd[2], true) + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE2', ' EE1') + elseif Cmd[1] == '21' then + local nYDelta = tonumber( Cmd[2]) + local nVDelta = tonumber( Cmd[3]) + if nYDelta > 0 and nVDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nVDelta + elseif nYDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nil + elseif nVDelta > 0 then + EMT.YDELTA = nil + EMT.VDELTA = nVDelta + end + end +end + +--------------------------------------------------------------------- +function PrepareSplit( sCmd) + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + -- non interessa + elseif Cmd[1] == '1' then + local sMsg = Cmd[2] .. Cmd[3] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[2] == 'Y' then + local sOut = 'G111 '..Cmd[2]..Cmd[3]..' EA110 EB110 EC142 ED142 EE2 EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + EMT.YPOS = tonumber( Cmd[3]) + end + elseif Cmd[1] == '21' then + local nYDelta = tonumber( Cmd[2]) + local nVDelta = tonumber( Cmd[3]) + if nYDelta > 0 and nVDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nVDelta + elseif nYDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nil + elseif nVDelta > 0 then + EMT.YDELTA = nil + EMT.VDELTA = nVDelta + end + end +end + +--------------------------------------------------------------------- +function PrepareUnload( sCmd) + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + -- non interessa + elseif Cmd[1] == '1' then + local sMsg = Cmd[2] .. Cmd[3] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[2] == 'V' then + -- se non è ultima fase c'è una barra sulla pinza Y (1) + local sEE = EgtIf( EMT.PHASE == EgtGetPhaseCount(), '0', '1') + local sOut = 'G111 '..Cmd[2]..Cmd[3]..' EC141 ED83 EE'..sEE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + end + elseif Cmd[1] == '2' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[4] == 'V' then + -- se non è ultima fase c'è una barra sulla pinza Y (1) + local sEAB = EgtIf( EMT.PHASE == EgtGetPhaseCount(), '111', '112') + local sOut = 'G111 '..Cmd[4]..Cmd[5]..' EA'..sEAB..' EB'..sEAB..' EC142 ED141 EE2 EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + EMT.U_STD = true + end + elseif Cmd[1] == '3' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] + table.insert( EMT.AUXCMD, sMsg) + elseif Cmd[1] == '11' then + local sMsg = 'PY' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + elseif Cmd[1] == '12' then + local sMsg = 'PV' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + elseif Cmd[1] == '21' then + -- non interessa + end +end + +--------------------------------------------------------------------- +function PreparePreRotation( sCmd) + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + -- se inizio o subito dopo, imposto stato iniziale pinze + if EMT.AUXIND <= 2 then + EMT.SA = EgtIf( EMT.YDELTA, ' EA112', ' EA111') + EMT.SB = EgtIf( EMT.YDELTA, ' EB112', ' EB111') + EMT.SC = EgtIf( EMT.VDELTA, ' EC142', ' EC141') + EMT.SD = EgtIf( EMT.VDELTA, ' ED142', ' ED141') + EMT.SE = EgtIf( EMT.YDELTA, ' EE1', ' EE2') + end + -- se è pre-rotazione + if Cmd[2] == 'Pre-Rotation' then + EMT.PREROT = true + elseif Cmd[2] == 'SplitRot' then + EMT.SPLITROT = true + EMT.SE = ' EE2' + end + elseif Cmd[1] == '1' then + local sMsg = Cmd[2] .. Cmd[3] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[2] ~= 'Z' then + local sOut + if not EMT.PREROT then + sOut = 'G111 '..Cmd[2]..Cmd[3]..EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + else + sOut = 'G111 '..Cmd[2]..Cmd[3]..' EA86 EB87 EC141 EE0 EF'..GetFmaxClamp() + end + table.insert( EMT.AUXSTR, sOut) + end + elseif Cmd[1] == '2' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] + table.insert( EMT.AUXCMD, sMsg) + local sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..Cmd[3], '')).. + (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..Cmd[5], '')).. + EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + elseif Cmd[1] == '3' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] + table.insert( EMT.AUXCMD, sMsg) + local sOut = 'G111'..(EgtIf( Cmd[2] ~= 'T', ' '..Cmd[2]..Cmd[3], '')).. + (EgtIf( Cmd[4] ~= 'T', ' '..Cmd[4]..Cmd[5], '')).. + (EgtIf( Cmd[6] ~= 'T', ' '..Cmd[6]..Cmd[7], '')).. + EMT.SA..EMT.SB..EMT.SC..EMT.SD..EMT.SE..' EF'..GetFmaxClamp() + table.insert( EMT.AUXSTR, sOut) + elseif Cmd[1] == '11' then + local sMsg = 'PY' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + if #EMT.AUXSTR > 0 then + local sVal = ' EB11' .. CalcCharStatus( Cmd[2], true) + local sOut = EMT.AUXSTR[#EMT.AUXSTR] + EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SB, sVal) + end + if EMT.SPLITROT then + EMT.SA = EgtIf( Cmd[2] ~= '0', ' EA11' .. CalcCharStatus( Cmd[2], true), ' EA86') + EMT.SB = EgtIf( Cmd[2] ~= '0', ' EB11' .. CalcCharStatus( Cmd[2], true), ' EB87') + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE1', ' EE2') + else + EMT.SA = ' EA11' .. CalcCharStatus( Cmd[2], true) + EMT.SB = ' EB11' .. CalcCharStatus( Cmd[2], true) + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE1', ' EE2') + end + elseif Cmd[1] == '12' then + local sMsg = 'PV' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + if #EMT.AUXSTR > 0 then + local sVal = ' ED14' .. CalcCharStatus( Cmd[2], true) + local sOut = EMT.AUXSTR[#EMT.AUXSTR] + EMT.AUXSTR[#EMT.AUXSTR] = sOut:gsub( EMT.SD, sVal) + end + EMT.SC = ' EC14' .. CalcCharStatus( Cmd[2], true) + EMT.SD = ' ED14' .. CalcCharStatus( Cmd[2], true) + EMT.SE = EgtIf( Cmd[2] ~= '0', ' EE2', ' EE1') + elseif Cmd[1] == '21' then + local nYDelta = tonumber( Cmd[2]) + local nVDelta = tonumber( Cmd[3]) + if nYDelta > 0 and nVDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nVDelta + elseif nYDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nil + elseif nVDelta > 0 then + EMT.YDELTA = nil + EMT.VDELTA = nVDelta + end + end +end + +--------------------------------------------------------------------- +function PreparePostRotation( sCmd) + -- è sostanzialmente un carico + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + -- se inizio + if EMT.AUXIND == 1 then + -- imposto stato pinze + EMT.SB = ' EB112' + end + -- se dichiarazione inizio riposizionamento carrelli + if Cmd[2] == 'CARR_MOVE' then + EMT.POSTROT = false + for i = 1, #EMT.AUXSTR do + EMT.AUXSTR[i] = string.gsub( EMT.AUXSTR[i], 'ET1', '') + end + end + elseif Cmd[1] == '1' then + local sMsg = Cmd[2] .. Cmd[3] + table.insert( EMT.AUXCMD, sMsg) + elseif Cmd[1] == '2' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] + table.insert( EMT.AUXCMD, sMsg) + if Cmd[2] == 'Y' then + -- tolgo eventuale sovramateriale presente sul pezzo in posizione iniziale (la misura laser è ora col finito) + local sYTaking = ' Y'..EmtLenToString( Cmd[3] - EMT.HOVM) + local sOut = 'G111'..sYTaking..' EA75 EB110 EE0 EF'..EmtLenToString(EMT.FMAXPINZE,0)..' ET1 E80058=0' + table.insert( EMT.AUXSTR, sOut) + end + elseif Cmd[1] == '3' then + local sMsg = Cmd[2] .. Cmd[3] ..' '.. Cmd[4] .. Cmd[5] ..' '.. Cmd[6] .. Cmd[7] + table.insert( EMT.AUXCMD, sMsg) + elseif Cmd[1] == '11' then + local sMsg = 'PY' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + EMT.SB = ' EB11' .. CalcCharStatus( Cmd[2]) + elseif Cmd[1] == '12' then + local sMsg = 'PV' .. ' ' .. Cmd[2] + table.insert( EMT.AUXCMD, sMsg) + elseif Cmd[1] == '21' then + local nYDelta = tonumber( Cmd[2]) + local nVDelta = tonumber( Cmd[3]) + if nYDelta > 0 and nVDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nVDelta + elseif nYDelta > 0 then + EMT.YDELTA = nYDelta + EMT.VDELTA = nil + elseif nVDelta > 0 then + EMT.YDELTA = nil + EMT.VDELTA = nVDelta + end + local sYLoad = ' Y'..EmtLenToString( LoadT) + local sOut = 'G111'..sYLoad..' EA76'..EMT.SB..' EE0 EF'..EmtLenToString( EMT.FMAXPINZE,0)..' ET1' + table.insert( EMT.AUXSTR, sOut) + end +end + +--------------------------------------------------------------------- +function MyBackupAxes() + EMT.L1b = EMT.L1 + EMT.L2b = EMT.L2 + EMT.L3b = EMT.L3 + EMT.R1b = EMT.R1 + EMT.R2b = EMT.R2 + EMT.R3b = EMT.R3 + EMT.R4b = EMT.R4 + EMT.RRb = EMT.RR + EMT.C1b = EMT.C1 + EMT.C2b = EMT.C2 + EMT.C3b = EMT.C3 +end + +--------------------------------------------------------------------- +function MyRestoreAxes() + EMT.L1 = EMT.L1b + EMT.L2 = EMT.L2b + EMT.L3 = EMT.L3b + EMT.R1 = EMT.R1b + EMT.R2 = EMT.R2b + EMT.R3 = EMT.R3b + EMT.R4 = EMT.R4b + EMT.RR = EMT.RRb + EMT.C1 = EMT.C1b + EMT.C2 = EMT.C2b + EMT.C3 = EMT.C3b +end + +--------------------------------------------------------------------- +function MyAdjustLinearAxes() + local MyL1o = EMT.L1 + local MyL2o = EMT.L2 + local MyL3o = EMT.L3 + + if EMT.REFLOC then + local vtE + if EMT.HEAD ~= 'H3' then + local Len = EMT.TLEN + EgtIf( EMT.HEAD == 'H1', MillOffs, abs( SawOffs)) + local LenRef = MillOffs + vtE = Vector3d( EMT.EXTR) * Len - Z_AX() * LenRef + else + local LenAux = ( EMT.TDIST or ChSawLen) + MillOffs + local LenRef = MillOffs + local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3) + vtE = vtAux * LenAux - Z_AX() * LenRef + end + EMT.L1 = EMT.L1 - vtE:getX() + EMT.L2 = EMT.L2 - DeltaTabY - vtE:getY() + EMT.L3 = EMT.L3 - DeltaTabZ - vtE:getZ() + end + + if EMT.X_OFF then EMT.L1 = EMT.L1 + EMT.X_OFF end + + EmtAdjustLinearAxes() + + EMT.L1o = MyL1o + EMT.L2o = MyL2o + EMT.L3o = MyL3o + + if not EMT.REFLOC then + EMT.L2 = - EMT.L2 + EMT.L1t = 'Y' + EMT.L2t = 'X' + else + EMT.L1t = 'X' + EMT.L2t = 'Y' + end +end + +--------------------------------------------------------------------- +function MyOutputNoNum( sOut) + local bNum = EMT.NUM + EMT.NUM = false + EmtOutput( sOut) + EMT.NUM = bNum +end + +--------------------------------------------------------------------- +function CalcInterpPlane() + -- origine del piano + local xS = EMT.START[1] + LoadT + if EMT.X_OFF then xS = xS + EMT.X_OFF end + local ptS = Point3d( xS, 0, 0) + -- calcolo per piano generico + local vtE + if EMT.HEAD ~= 'H3' then + vtE = Vector3d( EMT.EXTR) + else + vtE = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3) + end + EMT.IPLGLFR = Frame3d( ptS, vtE) + --EmtOutput( 'IPLGLFR='..tostring(EMT.IPLGLFR)) + local _, dAngV, dAngO = SphericalFromVector( vtE) + local dAngO2 = EmtGetAngO2( EMT.IPLGLFR:getVersZ(), EMT.IPLGLFR:getVersX(), dAngV, dAngO) + dAngO = dAngO + 90 + while dAngO >= 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 VerifyEmitRotation() + -- recupero le rotazioni delle fasi corrente e precedente + local nRot = GetPhaseRot( EMT.PHASE) + local nPrevRot = GetPhaseRot( EMT.PHASE - 1) + -- se sono uguali non devo fare alcunchè + if nRot == nPrevRot then + return false + end + -- rotazione automatica o manuale (sempre con il medesimo comando) + local nDeltaRot = nRot - nPrevRot + local sOut = 'M180 L0=' .. tostring( nDeltaRot) + EmtOutput( sOut) + return true +end + +--------------------------------------------------------------------- +function EmitZmax( bDiffTool) + local sEE = ' EE4' + local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3) + local sES = ' ES'..EgtNumToString( EMT.S, 0) + local sOut = 'G101 X'..EmtLenToString( -EMT.L2o, 3)..' Z'..EgtGetAxisHomePos( 'Z').. + ' B'..EmtLenToString( EMT.R2o, 3)..' C'..EmtLenToString( EMT.R1o, 3)..sEE..sET..sES..' L0=0' + sOut = sOut .. EgtIf( bDiffTool, ' EG2', ' EG3') + EmtOutput( sOut) + sOut = 'G101 ET1001' + EmtOutput( sOut) + sOut = 'G101 ET2001' + EmtOutput( sOut) +end + +--------------------------------------------------------------------- +function GetET( sHead, sTcPos, dAxR3) + if sHead == 'H1' then + return ' E'..sTcPos + elseif sHead == 'H2' then + return ' ET42' + elseif sHead == 'H3' then + if sTcPos ~= 'T111' then + if dAxR3 and abs( dAxR3 - 0) < 0.1 then + return ' ET101' + elseif dAxR3 and abs( dAxR3 - 270) < 0.1 then + return ' ET102' + elseif dAxR3 and abs( dAxR3 - 180) < 0.1 then + return ' ET103' + elseif dAxR3 and abs( dAxR3 - 90) < 0.1 then + return ' ET104' + else + EmtSetLastError( 1210, 'Chain saw orientation not allowed') + end + else + if dAxR3 and abs( dAxR3 - 0) < 0.1 then + return ' ET111' + elseif dAxR3 and abs( dAxR3 - 270) < 0.1 then + return ' ET112' + elseif dAxR3 and abs( dAxR3 - 180) < 0.1 then + return ' ET113' + elseif dAxR3 and abs( dAxR3 - 90) < 0.1 then + return ' ET114' + else + EmtSetLastError( 1210, 'Mortiser orientation not allowed') + end + end + else + EmtSetLastError( 1211, "Unknown Head") + end +end + +--------------------------------------------------------------------- +function GetFmaxClamp() + return EmtLenToString( EMT.FMAXPINZE, 0) +end + +--------------------------------------------------------------------- +function FindG111EA76( vStr) + for i = 1, #vStr do + if vStr[i]:find( 'G111', 1, true) and vStr[i]:find( 'EA76', 1, true) then + return true + end + end + return false +end + +--------------------------------------------------------------------- +-- *** END GENERATION *** +--------------------------------------------------------------------- diff --git a/Essetre-FASTrl.TPA.mlpe b/Common-FAST.TPA.mlpe similarity index 97% rename from Essetre-FASTrl.TPA.mlpe rename to Common-FAST.TPA.mlpe index f003af4..6713643 100644 --- a/Essetre-FASTrl.TPA.mlpe +++ b/Common-FAST.TPA.mlpe @@ -1,9 +1,12 @@ --- Processore macchina Essetre-FASTrl by EgalTech s.r.l. 2024/01/17 +-- Processore standard macchine FAST by EgalWare s.r.l. 2024/02/23 -- Con controllo numerico TPA --- 2023/04/19 DS ver 2.5d1 Al carico dopo rotazione su linea con P4=75 messo P5=110 invece di 112 (come FAST). + +-- carico librerie +local INFO_STD_PP = require( 'Version') -- Variabili di modulo -local MLE_INFO = 'Essetre-FASTrl.TPA.mlpe ver.'..PP_VER..' by EgalTech s.r.l.' +local CSP_INFO = INFO_STD_PP.NAME..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.' +local MACHINE_INFO = 'PP_VER ver.'..PP_VER local TEST_USE = false --------------------------------------------------------------------- @@ -41,7 +44,9 @@ function OnProgramStart() else ParkLine( '(Program Start)') end - ParkLine( '('.. MLE_INFO..')') + ParkLine( '('.. CSP_INFO..')') + ParkLine( '('.. MACHINE_INFO..')') + -- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente) if TEST_USE then ParkLine( 'M199') @@ -134,6 +139,13 @@ function OnToolData() ParkLine( 'M992 P1=113' .. sData) ParkLine( 'M992 P1=114' .. sData) end + -- emissione dati rinvio + elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' then + local nPos = EgtIf( EMT.HEAD == 'H5', 91, 93) + if EMT.EXIT == 2 then nPos = nPos + 1 end + local sOut = 'M992 P1=' .. EgtNumToString( nPos, 0) .. ' P2=' .. EmtLenToString( EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) .. + ' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, 3) + ParkLine( sOut) -- altro non previsto else EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD) @@ -160,6 +172,9 @@ function OnDispositionStart() ' P4='..EmtLenToString( MinV, 2)..' P5='..EmtLenToString( MaxV, 2)..' P6='..EmtLenToString( MillOffs, 2).. ' P7='..EmtLenToString( SawOffs, 2)..' P8='..EmtLenToString( ParkY, 2)..' P9='..EmtLenToString( ParkV, 2).. ' P10='..EmtLenToString( TurnerOffs, 2)..' P11='..EmtLenToString( -DeltaTabY, 2)..' P12='..EmtLenToString( DeltaTabZ - MillOffs, 2) + if SecondSupport >= 3 then + sOut = sOut ..' P13='..EmtLenToString( AngTr1Len, 2) ..' P14='..EmtLenToString( AngTr1Offs + MillOffs,2) + end ParkLine( sOut) -- carico barra EMT.LOAD = true @@ -405,9 +420,13 @@ function OnMachiningStart() EMT.MCHNAME = EgtGetOperationName( EMT.MCHID) EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE) EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES) - -- la speed della lama va moltiplicata per 6 + -- sistemazione speed (la speed della lama va moltiplicata per 6) if EMT.HEAD == 'H2' then EMT.S = EMT.S * 6 + elseif EMT.HEAD == 'H5' and EMT.EXIT == 1 then + EMT.S = -EMT.S + elseif EMT.HEAD == 'H6' and EMT.EXIT == 1 then + EMT.S = -EMT.S end -- determino subito se taglio di separazione di pezzo a caduta EMT.PREFALLCUT = nil @@ -1504,6 +1523,12 @@ function MyAdjustLinearAxes() local LenRef = MillOffs local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3) vtE = vtAux * LenAux - Z_AX() * LenRef + elseif EMT.HEAD == 'H5' then + local Len = EMT.TLEN + AngTr1Len + local LenAux = MillOffs + AngTr1Offs + local LenRef = MillOffs + local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2) + vtE = Vector3d( EMT.EXTR) * Len + vtAux * LenAux - Z_AX() * LenRef else EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD) end @@ -1536,6 +1561,10 @@ function AdjustToolKinematic() return '01' elseif EMT.HEAD == 'H2' then return '02' + elseif EMT.HEAD == 'H5' then + return EgtIf( EMT.EXIT == 1, '11', '12') + elseif EMT.HEAD == 'H6' then + return EgtIf( EMT.EXIT == 1, '21', '22') else EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD) end @@ -1544,7 +1573,15 @@ end --------------------------------------------------------------------- function AdjustTcPos( bLen3) local sPos = EMT.TCPOS:gsub( 'T', '') - if sPos == '101' and EMT.HEAD == 'H3' then + if sPos == '91' then + if EMT.EXIT == 2 then + sPos = '92' + end + elseif sPos == '93' then + if EMT.EXIT == 2 then + sPos = '94' + end + elseif sPos == '101' and EMT.HEAD == 'H3' then if abs( EMT.R3 - 0) < 0.1 then sPos = '101' elseif abs( EMT.R3 - 270) < 0.1 then diff --git a/Essetre-FASTrl.mlpe b/Common-FAST.mlpe similarity index 93% rename from Essetre-FASTrl.mlpe rename to Common-FAST.mlpe index 3901013..cafaef1 100644 --- a/Essetre-FASTrl.mlpe +++ b/Common-FAST.mlpe @@ -1,29 +1,25 @@ --- Processore macchina Essetre-FAST by EgalTech s.r.l. 2022/01/23 --- Funzioni generiche indipendenti dal controllo --- 2020/09/22 DS ver 2.2i4 Distanza di sicurezza per collisioni da 2 a 4mm (inoltre allontanata flangia lama e aggiunto cilindro asse Z) --- 2020/09/26 DS ver 2.2i5 Gestione cambio presa sega a catena tra due lavorazioni successive. --- 2020/10/06 DS ver 2.2j1 Punta lunga da togliere basata su sua lunhezza totale e non più su T111. --- 2021/01/08 DS ver 2.3a1 Gestione utensile di default da posizione e non da nome. --- 2021/01/24 DS ver 2.3a2 Correzione deposito sega a catena con ripresa della stessa per angola A diverso. --- 2021/01/31 DS ver 2.3a3 Altre correzioni per sega a catena. --- 2021/06/28 DS ver 2.3f5 Correzioni per scarico punte lunghe con pezzi alti. --- 2021/07/12 DS ver 2.3g2 Correzioni per verifica collisioni durante scarico utensili. +-- Processore macchina Essetre-FAST by EgalWare s.r.l. 2024/02/23 -- Intestazioni require( 'EmtGenerator') EgtEnableDebug( false) +-- carico librerie +local BD = require( 'BeamData') + LONG_TOOL_MINLEN = 221 BIG_TOOL_DIAM = 300 --------------------------------------------------------------------- -- *** GENERATION *** --------------------------------------------------------------------- -local sBaseDir = EgtGetSourceDir() +local sBaseDir = EgtGetCurrMachineDir() if NumericalControl == 'NUM' then - dofile( sBaseDir .. 'Essetre-FASTrl.NUM.mlpe') + dofile( sBaseDir .. '\\Common-FAST.NUM.mlpe') elseif NumericalControl == 'TPA' then - dofile( sBaseDir .. 'Essetre-FASTrl.TPA.mlpe') + dofile( sBaseDir .. '\\Common-FAST.TPA.mlpe') +elseif NumericalControl == 'NUM_PLUS' then + dofile( sBaseDir .. '\\Common-FAST.NUM_PLUS.mlpe') else EmtSetLastError( 1201, 'Numerical Control error : unkwnown type') end @@ -33,6 +29,45 @@ end --------------------------------------------------------------------- local COLL_SAFE_DIST = 3 +--------------------------------------------------------------------- +function OnSimulInit() + -- se macchina con carico destro, imposto offset direzioni di vista standard + if BD.RIGHT_LOAD then + local nOrigViewOffs = EgtGetViewOrizzOffsStep() + local dOrigViewAngV, dOrigViewAngH = EgtGetGenericView() + if nOrigViewOffs ~= 2 then + EgtSetViewOrizzOffsStep( 2) + if dOrigViewAngV < 0.1 then + EgtSetView( SCE_VD.TOP, false) + elseif dOrigViewAngV > 179.9 then + EgtSetView( SCE_VD.BOTTOM, false) + else + local dViewAngH = dOrigViewAngH + EgtIf( dOrigViewAngH > 180, 2 * 90, 0) + EgtSetGenericView( dOrigViewAngV, dViewAngH, false) + end + end + end +end + +--------------------------------------------------------------------- +function OnSimulExit() + -- se macchina con carico destro, annullo offset direzioni di vista standard + if BD.RIGHT_LOAD then + local nOrigViewOffs = EgtGetViewOrizzOffsStep() + local dOrigViewAngV, dOrigViewAngH = EgtGetGenericView() + if nOrigViewOffs == 2 then + EgtSetViewOrizzOffsStep( 0) + if dOrigViewAngV < 0.1 then + EgtSetView( SCE_VD.TOP, false) + elseif dOrigViewAngV > 179.9 then + EgtSetView( SCE_VD.BOTTOM, false) + else + EgtSetGenericView( dOrigViewAngV, dOrigViewAngH - 2 * 90, false) + end + end + end +end + --------------------------------------------------------------------- function OnSimulStart() -- controllo versione programma @@ -69,6 +104,7 @@ function OnSimulStart() AddToCollisionCheck( 'Z', 'COLLISION', EMT.COLLOBJ) AddToCollisionCheck( 'B', 'COLLISION', EMT.COLLOBJ) AddToCollisionCheck( 'C', 'COLLISION', EMT.COLLOBJ) + AddToCollisionCheck( 'H5', 'COLLISION', EMT.COLLOBJ) AddToolToCollisionCheck( 'H2', 1, EMT.COLLOBJ) AddToolHolderToCollisionCheck( 'H2', 1, EMT.COLLOBJ) DumpCollisionCheck( EMT.COLLOBJ, 'Collision Objects :', 4) @@ -467,7 +503,7 @@ function OnSimulToolSelect( dPosA) -- imposto il valore di A EgtSetAxisPos( 'A', dPosA) if abs( dPosA) < 0.1 then - EgtSetAxisPos( 'C', 180) + EgtSetAxisPos( 'C', EgtIf( BD.RIGHT_LOAD, 180, 0)) end EgtSetAxisPos( 'B', 0) end @@ -492,8 +528,10 @@ end function OnSimulToolDeselect() -- se prossimo utensile non definito, è disposizione ed esco if EMT.NEXTTOOL == '' then return end - -- se sega a catena o punta lunga, devo cambiare - if EMT.HEAD == 'H3' or ( EMT.HEAD == 'H1' and ( EMT.TOTLEN > LONG_TOOL_MINLEN or EMT.TOTDIAM > BIG_TOOL_DIAM)) then + -- se cambia uscita su rinvio non devo fare alcunché + if EMT.HEAD == 'H5' and EMT.NEXTHEAD == 'H5' then return end + -- se sega a catena o rinvio o punta lunga o utensile di grosso diametro, devo cambiare + if EMT.HEAD == 'H3' or EMT.HEAD == 'H5' or ( EMT.HEAD == 'H1' and ( EMT.TOTLEN > LONG_TOOL_MINLEN or EMT.TOTDIAM > BIG_TOOL_DIAM)) then EgtOutText( 'Tool change in progress...') local RapSimStep = 4 * EMT.SIMSTEP local RapSimRotStep = RapSimStep / 10 @@ -502,11 +540,15 @@ function OnSimulToolDeselect() if EMT.HEAD == 'H3' then local dPosA = EgtGetAxisPos( 'A') if abs( dPosA) < 0.1 then - SimulMoveAxes( 'B', 0, CollSimRotStep, 'C', 180, CollSimRotStep) + SimulMoveAxes( 'B', 0, CollSimRotStep, 'C', EgtIf( BD.RIGHT_LOAD, 180, 0), CollSimRotStep) else - SimulMoveAxes( 'B', 0, CollSimRotStep, 'C', 90, CollSimRotStep) + SimulMoveAxes( 'B', 0, CollSimRotStep, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), CollSimRotStep) end SimulMoveAxis( 'X', 0, RapSimStep) + -- movimento scarico rinvio + elseif EMT.HEAD == 'H5' then + SimulMoveAxes( 'B', 0, CollSimRotStep, 'C', -90, CollSimRotStep) + SimulMoveAxis( 'X', 0, RapSimStep) -- movimento scarico punta lunga su T111 elseif EMT.TOTLEN > LONG_TOOL_MINLEN then -- se su cambio utensile T111 @@ -522,7 +564,7 @@ function OnSimulToolDeselect() else local dPosB = EgtGetAxisPos( 'B') local dNewB = EgtIf( dPosB < 0, -90, 90) - SimulMoveAxes( 'B', dNewB, CollSimRotStep, 'C', 180, CollSimRotStep) + SimulMoveAxes( 'B', dNewB, CollSimRotStep, 'C', EgtIf( BD.RIGHT_LOAD, 180, 0), CollSimRotStep) SimulMoveAxis( 'X', 0, RapSimStep) end -- breve pausa @@ -531,10 +573,10 @@ function OnSimulToolDeselect() EgtSetMode( EgtGetHeadId( EMT.HEAD), GDB_MD.HIDDEN) ShowToolInTcPos( EMT.TCPOS_1, true) -- movimento per carico utensile - if EMT.NEXTHEAD ~= 'H3' then - SimulMoveAxes( 'B', 90, RapSimRotStep, 'C', 90, RapSimRotStep) + if EMT.NEXTHEAD ~= 'H3' and EMT.NEXTHEAD ~= 'H5' then + SimulMoveAxes( 'B', 90, RapSimRotStep, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), RapSimRotStep) else - SimulMoveAxes( 'B', 0, RapSimRotStep, 'C', 90, RapSimRotStep) + SimulMoveAxes( 'B', 0, RapSimRotStep, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), RapSimRotStep) end -- se segue lama, carico utensile di default if EMT.NEXTHEAD == 'H2' then @@ -554,19 +596,19 @@ function OnSimulToolDeselect() local RapSimRotStep = RapSimStep / 10 local CollSimRotStep = min( RapSimRotStep, 10) -- simulo movimento - SimulMoveAxes( 'B', 90, CollSimRotStep, 'C', 90, CollSimRotStep) + SimulMoveAxes( 'B', 90, CollSimRotStep, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), CollSimRotStep) SimulMoveAxis( 'X', 0, RapSimStep) -- breve pausa EgtPause( 100) ShowToolInTcPos( EMT.TCPOS_1, true) -- se segue sega a catena - if EMT.NEXTHEAD == 'H3' then + if EMT.NEXTHEAD == 'H3' or EMT.NEXTHEAD == 'H5' then -- se non lama, nascondo l'utensile corrente if EMT.HEAD ~= 'H2' then EgtSetStatus( EgtGetHeadId( EMT.HEAD), GDB_ST.OFF) end -- eseguo movimento opportuno - SimulMoveAxes( 'B', 0, RapSimRotStep, 'C', 90, RapSimRotStep) + SimulMoveAxes( 'B', 0, RapSimRotStep, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), RapSimRotStep) -- se altrimenti lama su cambio utensile elseif EMT.NEXTHEAD == 'H1' and SpecialBH and EMT.NEXTTCPOS == 'T111' then -- se non lama, nascondo l'utensile corrente @@ -861,14 +903,14 @@ function ExecUnloading() -- li sposto per lasciare spazio al nuovo pezzo local nId = EgtGetFirstInGroup( nVmGrpId) while nId do - EgtMove( nId, Vector3d( 0, ( EMT.SB + 50.0), 0), GDB_RT.GLOB) + EgtMove( nId, Vector3d( 0, EgtIf( BD.RIGHT_LOAD, ( EMT.SB + 50.0), -( EMT.SB + 50.0)), 0), GDB_RT.GLOB) nId = EgtGetNext( nId) end -- creo un nuovo layer e vi inserisco il nuovo pezzo local nLayId = EgtGroup( nVmGrpId, EgtGetGlobFrame( vMillId)) EgtRelocate( vMillId, nLayId) - local vtMove = Vector3d( 0, 450, 0) - if EMT.FALL then vtMove = Vector3d( -500, 0, 750) end + local vtMove = Vector3d( 0, EgtIf( BD.RIGHT_LOAD, 450, -450), 0) + if EMT.FALL then vtMove = Vector3d( -500, 0, EgtIf( BD.RIGHT_LOAD, 750, -750)) end EgtMove( nLayId, vtMove, GDB_RT.GLOB) EgtSetLevel( vMillId, GDB_LV.USER) -- aggiungo gli spigoli diff --git a/Essetre-FASTrl.mlse b/Common-FAST.mlse similarity index 98% rename from Essetre-FASTrl.mlse rename to Common-FAST.mlse index 6851b99..c3ffd73 100644 --- a/Essetre-FASTrl.mlse +++ b/Common-FAST.mlse @@ -1,36 +1,29 @@ --- Special Operations macchina Essetre-FAST by EgalTech s.r.l. 2023/01/10 --- 2020/05/15 DS ver.2.2e1 Correzione a SpecAdjustCarrC3 per bFixedDelta. --- 2020/05/16 DS ver 2.2e2 Aggiunta gestione rotazione 90deg. --- 2020/05/21 DS ver 2.2e3 Aggiunto a SpecAdjustCarrC3 parametro bFixedPos (per lavorazioni Split e Cut precedute da Pre). --- 2020/05/26 DS ver 2.2e4 Nuova gestione dei pezzi a caduta. --- 2020/05/27 DS ver 2.2e5 Corretto blocco pinza V su presplit e precut. --- 2020/05/28 DS ver 2.2e7 Correzione per mancanza EMC.HOVM allo scarico. --- 2020/06/18 DS ver 2.2f3 Aumento ingombro fresatura opposta a cerrello per evitare extracorsa. --- 2020/07/02 DS ver 2.2g1 Correzione quota di presa al carico per casi senza tagli in testa e lavorazioni solo in coda. --- 2020/09/03 DS ver 2.2i1 Correzione in Load dopo rotazione deve tener conto dell'ingombro delle lavorazioni in coda. --- 2020/09/09 DS ver 2.2i2 Nel calcolo pinzaggi ora si tiene conto anche della larghezza della sezione della barra. --- 2020/09/25 DS ver 2.2i5 Migliorato calcolo ingombro lama con testa opposta al carrello. --- 2020/09/29 DS ver 2.2i6 Migliorato calcolo ingombro fresa su tagli longitudinali di fianco. --- 2020/10/13 DS ver 2.2j2 Aggiunta gestione sezione molto piccola (Very Small) per presa minima. Corretta gestione ingombri con fori a 30 deg. --- 2020/12/09 DS ver 2.2l1 Migliorato calcolo ingombro con lama verticale inclinata di +/-45deg rispetto a X. --- 2021/01/24 DS ver 2.3a2 Migliorato controllo assi rotanti definiti con sega a catena per SpecialCalcMachiningEncumbrance. --- 2021/02/02 DS ver 2.3b1 Migliorato calcolo ingombro tagli di lama quasi verticale angolata. --- 2021/02/17 DS ver 2.3b2 Corretta B3Ys-xs1 per accentrare V e T bisogna sottrarre dExtraY che è negativo e non sommare. --- 2021/04/02 DS ver 2.3d1 Corretto calcolo ingombro con lama per non andare in extracorsa con le pinze quando lavorazione vicino a Y0. --- 2021/06/01 DS ver 2.3f1 Aggiunta segnalazione pezzo scaricato a caduta. --- 2021/06/25 DS ver 2.3f5 Corretta segnalazione tipo di scarico del pezzo. --- 2023/01/10 SM ver 2.5a1 Affinato calcolo ingombro lavorazione con fresa quasi verticale. +-- Special Operations macchina Essetre-FAST by EgalWare s.r.l. 2024/02/23 -- Intestazioni require( 'EmtGenerator') EgtEnableDebug( false) --- Carico i dati globali -local sBaseDir = EgtGetSourceDir() -local BD = dofile( sBaseDir .. 'Beam\\BeamData.lua') +-- carico librerie +local BD = require( 'BeamData') -EgtOutLog ( '** Essetre-FAST '..PP_VER..' **', 1) +---------------------- OnSpecialMoveZup ----------------------------- +--------------------------------------------------------------------- +function OnSpecialMoveZup() + --EgtOutLog( 'OnSpecialMoveZup : ' .. EMC.HEAD .. '.' .. tostring( EMC.EXIT)) + + -- Inizializzazioni + EMC.ERR = 0 + EMC.MODIF = false + + -- se sega a catena + if EMC.HEAD == 'H3' then + end + +end + +---------- OnSpecialApplyDisposition & OnPostApplyMachining --------- ----------------------- Costanti ------------------------------------ local DELTA_TOL_V = 110 local DELTA_TOL_S = 210 @@ -800,6 +793,7 @@ function SpecialCalcMachiningEncumbrance( nMchId, bPreCut) local nToolType = EgtTdbGetCurrToolParam( MCH_TP.TYPE) local bSaw = ( nToolType == MCH_TY.SAW_STD or nToolType == MCH_TY.SAW_FLAT) local bChain = ( nToolType == MCH_TY.MORTISE_STD) + local bAngTrasm = ( sHead == 'H5' or sHead == 'H6') local dTLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) local dTDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) -- Se sega a catena, devo correggere il versore Aux per farlo coincidere con la direzione del braccio C @@ -810,6 +804,12 @@ function SpecialCalcMachiningEncumbrance( nMchId, bPreCut) vtAux = vtTool ^ vtAux end end + -- Se rinvio da sotto, devo correggere il versore Aux per farlo coincidere con la direzione del braccio C + if bAngTrasm then + local nExit = EgtTdbGetCurrToolParam( MCH_TP.EXIT) + vtAux = vtTool ^ vtAux + if nExit == 2 then vtAux = -vtAux end + end -- Calcolo limiti derivanti dalla lavorazione local dDistFront, dDistBack = SpecCalcEncumbrance( vtTool, vtAux, ptMin, ptMax, bSaw, bChain, dTLen, dTDiam) return dDistFront, dDistBack @@ -963,7 +963,8 @@ function SpecCalcEncumbrance( vtTool, vtArm, ptMin, ptMax, bSaw, bChain, dTLen, dHeadBack = EgtIf( EMC.CNT == 1, 180, 130) end -- per interferenza con triangolo di rinforzo sulla pinza Y - if vtTool:getZ() < 0.25 and vtTool:getX() < 0.10 and vtTool:getY() < 0 and vtArm:getX() < -0.707 then + if ( vtTool:getZ() < 0.25 and vtTool:getX() < 0.10 and vtTool:getY() > 0 and vtArm:getX() < -0.707 and not BD.RIGHT_LOAD) or + ( vtTool:getZ() < 0.25 and vtTool:getX() < 0.10 and vtTool:getY() < 0 and vtArm:getX() < -0.707 and BD.RIGHT_LOAD)then dHeadBack = dHeadBack + 90 end end @@ -1055,7 +1056,8 @@ function SpecCalcEncumbrance( vtTool, vtArm, ptMin, ptMax, bSaw, bChain, dTLen, dHeadFront = 130 end -- per interferenza con triangolo di rinforzo sulla pinza V - if vtTool:getZ() < 0.25 and vtTool:getX() > -0.10 and vtTool:getY() < 0 and vtArm:getX() > 0.707 then + if ( vtTool:getZ() < 0.25 and vtTool:getX() > -0.10 and vtTool:getY() > 0 and vtArm:getX() > 0.707 and not BD.RIGHT_LOAD) or + ( vtTool:getZ() < 0.25 and vtTool:getX() > -0.10 and vtTool:getY() < 0 and vtArm:getX() > 0.707 and BD.RIGHT_LOAD) then dHeadFront = dHeadFront + 90 end end @@ -2549,7 +2551,7 @@ function SpecAdjustCarrB2( dTPosI, dYDeltaI, dVDeltaI, dTPosF, dYDeltaF, dVDelta dYDeltaA = dYPosA - dTPosA dVDeltaA = dVPosA - dTPosA -- aggiorno la verifica di spostamento significativo - bYDeltaS = ( dYDeltaF < dYDeltaA - dYDeltaTol or dYDeltaF > dYDeltaA + DELTA_SIC) + bYDeltaS = ( dYDeltaF < dYDeltaA - dYDeltaTol or dYDeltaF > dYDeltaA + DELTA_SIC) bVDeltaS = ( dVDeltaF > dVDeltaA + dVDeltaTol or dVDeltaF < dVDeltaA - DELTA_SIC) -- aggiorno ExtraV residuo dExtraV = dExtraV - dCorsaYTr - dCorsaVr diff --git a/Essetre-FASTrl.mlde b/Essetre-FASTrl.mlde index 6fb975b..8fb3c56 100644 --- a/Essetre-FASTrl.mlde +++ b/Essetre-FASTrl.mlde @@ -9,13 +9,32 @@ -- 2024/01/17 Ver.2.6a1 DS Aggiunta gestione BlockHouse come in FAST. -- 2024/02/09 Ver 2.6b1 LM In BeamData aggiunta funzione GetBlockedAxis che sostituisce la GetChainSawBlockedAxis. -- 2024/02/22 Ver 2.6b2 LM In mlse corretto calcolo pinzaggio quando testa vicina. +-- 2024/02/23 ver 2.6c1 Rimossa chiamata funzione EgtGetSourceDir +-- Prima versione post common +-- Allineamento con common ver. 2.6c3 require( 'EmtGenerator') EgtEnableDebug( false) -PP_VER = '2.6b2' +PP_VER = '2.6c1' MIN_MACH_VER = '2.5k1' +-- Carico i dati globali +local sMachDir = EgtGetCurrMachineDir() +-- Elimino direttori altre macchine e imposto direttorio macchina corrente per ricerca librerie +EgtRemoveBaseMachineDirFromPackagePath() +EgtAddToPackagePath( sMachDir .. '\\Beam\\?.lua') +EgtAddToPackagePath( sMachDir .. '\\?.lua') +local BD = require( 'BeamData') +local INFO_STD_PP = require( 'Version') + +-- prendo la versione kernel minima necessaria pi� nuova tra macchina e script comuni +if INFO_STD_PP.MIN_MACH_VER_PP_COMMON > MIN_MACH_VER then + MIN_MACH_VER = INFO_STD_PP.MIN_MACH_VER_PP_COMMON +end + +EgtOutLog ( '**PP_VER ver.'..PP_VER..'**'..INFO_STD_PP.NAME..' ver.'..INFO_STD_PP.VERSION, 1) + -- Parametri macchina NumericalControl = 'TPA' -- NUM o TPA MinX = -1350 @@ -40,6 +59,8 @@ SawOffs = -242.68 SawBOffs = 0 SawCOffs = 0 ChSawLen = 90.0 +AngTr1Offs = 170 +AngTr1Len = 150 TurnerOffs = 200.0 DeltaTabY = -898.0 DeltaTabZ = -1017.8 + MillOffs -- per TPA : -1013.3 + MillOffs -- per NUM : -838.4 @@ -56,18 +77,15 @@ MaxUnloadLen = 0 BeamHeightForFixRot = 9999 -- per abilitare assegnare 500 CoeffVM = 0.5 --- Aggiornamento con dati da BeamData.lua -local sBeamData = EgtGetSourceDir().."\\Beam\\BeamData.lua" -if EgtExistsFile( sBeamData) then - local BD = dofile( sBeamData) - if BD then - BeamHeightForFixRot = BD.MAX_HEIGHT_ROT_B_ABOVE or BeamHeightForFixRot - end + +-- leggo e aggiorno con parametri da BeamData +if BD then + BeamHeightForFixRot = BD.MAX_HEIGHT_ROT_B_ABOVE or BeamHeightForFixRot end -- Aggiornamento con dati da TechnoEssetre7 local sTs3Data = EgtGetStringFromIni( 'Beam', 'DATA_DIR', "C:\\TechnoEssetre7\\EgtData", EgtGetIniFile()).."\\Essetre-Fastrl.data" -local sData = EgtGetSourceDir().."\\Beam\\Ts3Data.lua" +local sData = sMachDir .. "\\Beam\\Ts3Data.lua" if EgtExistsFile( sTs3Data) then EgtCopyFile( sTs3Data, sData) local sTs3DataOld = sTs3Data..'.old' @@ -99,11 +117,16 @@ if EgtExistsFile( sData) then if Machine.Offsets.PIVOTLAMA then SawOffs = - Machine.Offsets.PIVOTLAMA end if Machine.Offsets.OFFSETBLAMA then SawBOffs= Machine.Offsets.OFFSETBLAMA end if Machine.Offsets.OFFSETCLAMA then SawCOffs= Machine.Offsets.OFFSETCLAMA end + if Machine.Offsets.OFFSETZ_RINV_1 then AngTr1Offs = Machine.Offsets.OFFSETZ_RINV_1 - EgtIf( NumericalControl == 'TPA', MillOffs, 0) end + AngTr1Len = Machine.Offsets.OFFSETX_RINV_1 or AngTr1Len + --if Machine.Offsets.OFFSETZ_RINV_2 then AngTr2Offs = Machine.Offsets.OFFSETZ_RINV_2 - EgtIf( NumericalControl == 'TPA', MillOffs, 0) end + --AngTr2Len = Machine.Offsets.OFFSETX_RINV_2 or AngTr2Len TurnerOffs = Machine.Offsets.OFFSETRIB or TurnerOffs if Machine.Offsets.OFFSETX then DeltaTabY = -Machine.Offsets.OFFSETX end if Machine.Offsets.OFFSETZ then DeltaTabZ = Machine.Offsets.OFFSETZ + EgtIf( NumericalControl == 'TPA', MillOffs, 0) end if Machine.Offsets.SECSUP then SecondSupport = ( Machine.Offsets.SECSUP == 1) end if Machine.Offsets.BLOCKHAUS then SpecialBH = ( Machine.Offsets.BLOCKHAUS == 1) end + if Machine.Offsets.RIB_AUTO then AutomaticRotation = ( Machine.Offsets.RIB_AUTO == 1) end if Machine.Offsets.NOULOAD then MaxUnloadLen = Machine.Offsets.NOULOAD end if Machine.Offsets.DEFTCPOS then DefTcPos = ( 'T' .. Machine.Offsets.DEFTCPOS) end end @@ -119,8 +142,8 @@ EmtGeneral { ExitMaxAdjust = 30, ExitMaxRotAdj = 0.5, AngDeltaMinForHome = 165, - Special = 'Essetre-FASTrl.mlse', - Processor = 'Essetre-FASTrl.mlpe'} + Special = 'Common-FAST.mlse', + Processor = 'Common-FAST.mlpe'} local BaseId = EmtBase { Name = 'Base', Geo='BASE/GEO', diff --git a/UpdateLog.txt b/UpdateLog.txt new file mode 100644 index 0000000..ddd7108 --- /dev/null +++ b/UpdateLog.txt @@ -0,0 +1,15 @@ + ==== Common_FAST Update Log ==== + +Versione 2.6c1 (23/02/2024) +- (ALL) Prima versione post-proc comune FAST e FASTrl +- (ALL) "BeamData" caricato come libreria con 'require' anziché come file con 'dofile' +- (SIM) Aggiunta funzioni "OnSimulInit" e "OnSimulExit" per orientare vista corretta in caso di macchina con carico destro. N.B.= serve CAM5 2.6b4 +- (ALL) In BeamData aggiunto flag per direzione carico RIGHT_LOAD +- (ALL) Aggiornamento 'Compile.bat' con nuovi nomi file + +Versione 2.6c2 (23/02/2024) +- (ALL) Rimossa chiamata funzione EgtGetSourceDir + +Versione 2.6c3 (23/02/2024) +- (SIM) Corretta lettura parametro RIGHT_LOAD +- (ALL) Rimossa chiamata funzione EgtGetSourceDir rimasta in MLPE \ No newline at end of file diff --git a/Version.lua b/Version.lua new file mode 100644 index 0000000..e4bca02 --- /dev/null +++ b/Version.lua @@ -0,0 +1,10 @@ +-- Version.lua by EgalWare s.r.l. 2024/02/23 +-- Gestione della versione dei file comuni post-processori macchine FAST e FASTrl di Essetre + +local InfoCommon_STD_PP = { + NAME = 'Common-FAST', -- nome script PP standard + VERSION = '2.6c3', -- versione script + MIN_MACH_VER_PP_COMMON = '2.5k1' -- versione minima kernel +} + +return InfoCommon_STD_PP