-- 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, 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 -- EmitMoveWaitChars( 2, TEST_USE) -- 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) 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, 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 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() if not EMT.ZMAX then -- EmitResetMachining( true) end -- 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 = '' -- 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 = {} 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 = CheckChangeCarriageClamping() -- se non ci sono riposizionamenti dei carrelli, se stesso utensile, e c'è ancora piano attivo dalla lavorazione precedente, allora questo è un climb if not bChangeCarriageClamping and EMT.TOOL == EMT.PREVTOOL and EMT.PLANEACTIVE and ( abs( EMT.R1prec - EMT.R1) < GEO.EPS_SMALL and abs( EMT.R2prec - EMT.R2) < GEO.EPS_SMALL) 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) 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 bSplitMach end if bParkV then local bMchSplit = bNlhParkV and bSplitMach local dPosT = EMT.TPOS or EMT.L1op EmitParkRoller( dPosT, bMchSplit) 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 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)}) end end EMT.MCHFIRST = false -- movimento standard CLIMB elseif EMT.FLAG == 2 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)}) -- 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 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}) end EmitMoveStartHead( 2) EmitMoveWaitHead( 2) 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 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}) end EmitMoveStartHead( 2) EmitMoveWaitHead( 2) -- 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 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 e fondo foro, inverto movimento punta doppia if EMT.MCHTYPE == MCH_MY.DRILLING and not EMT.DBLHEADPARA and EMT.DOU_TYPE == 2 and EMT.FLAG == 105 then EmtOutput( "G157 EE-1") EMT.DBLHEADPARA = true end -- se lavorazione in doppio e fondo foro, muovo punta 2 e poi ripristino movimento standard punta doppia if EMT.DBLHEADPARA and EMT.FLAG == 104 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() -- 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 --------------------------------------------------------------------- -- controlla se nella tabella AUX sono presenti dei movimenti dei carrelli function CheckChangeCarriageClamping() local ChangeCarriagesParam = { '1', -- movimento singolo carro '2', -- movimento carro e trave '3', -- movimento 2 carri e trave '4', -- risalita a Z max '11', -- comando pinza 1 '12' -- comando pinza 2 } for i=1, #EMT.AUXCMD do local Cmd = EgtSplitString( EMT.AUXCMD[i]) for j=1, #ChangeCarriagesParam do if Cmd[1] == ChangeCarriagesParam[j] then return true end end end return false 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' then local Len = ( EMT.TDIST or ChSawLen) + MillOffs local LenRef = MillOffs vtE = Vector3d( EMT.ADIR) * Len - Z_AX() * LenRef elseif EMT.HEAD == 'H15' or 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, bUsePrevDelta) -- 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 = EgtIf( bUsePrevDelta, EMT.Y1PREVDELTA, EMT.Y1DELTA) local dY2Delta = EgtIf( bUsePrevDelta, EMT.Y2PREVDELTA, EMT.Y2DELTA) -- Parcheggi pinze local MyParkY1 = ParkY1 + AggLoad 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 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, preselezione già fatta if EgtGetHeadId( 'H21') then return end -- 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 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 nNextMchId = EgtGetNextActiveOperation( nNextMchId) end -- ripristino stato corrente EgtSetCurrMachining( EMT.MCHID) EgtTdbSetCurrTool( EMT.TOOL) if bCarrMove then -- se è stato trovato utensile, emetto preselezione if sToolChangePos and sToolChange and sToolChangeHead then local MyParkX1, MyParkB1, MyParkC1 if GetHeadTCSet( sToolChangeHead, sToolChangePos) == 'Head1_TC2' then MyParkX1 = ParkFrnX1 MyParkB1 = ParkFrnB1 MyParkC1 = ParkFrnC1 else MyParkX1 = ParkX1 MyParkB1 = ParkB1 MyParkC1 = ParkC1 end EmtOutput( '( *** TOOL PRE-SEL *** )') EmitMoveDataHead( 1, { X=-MyParkX1, Z=MaxZ1, B=MyParkB1, C=MyParkC1, TPos=AdjustTcPos( false, sToolChangePos)}) -- comincio i movimenti di preselezione EmitMoveStartHead( 1) -- se preselezione e c'era montata motosega, si aspetta fine della preselezione prima di andare avanti if HeadIsChainSaw( EMT.HEAD) then EmitMoveWaitHead( 1) else EMT.START_PRESEL = 1 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 ultima lavorazione e ho motosega, scarico if not nNextMchId and 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) -- flag preselezione eseguita local bPresel = false -- 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 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) 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) -- se non eseguita preselezione if not bPresel then -- 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 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 *** ---------------------------------------------------------------------