commit fd8493c4bb97d7f23eac168f751c936a1a6d2d77 Author: DarioS Date: Fri Mar 3 10:04:06 2023 +0100 Essetre-PFrl 2.5c1 : - primo rilascio con correzioni per lavorazioni in doppio come PF. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..196fc23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +/Tools +/Machinings +/SetUp +/Beam/Ts3Data.bak +/Beam/CutData.lua +/Beam/DrillData.lua +/Beam/MillingData.lua +/Beam/PocketingData.lua +/Beam/SawingData.lua +/Beam/Ts3Data.lua +/Wall/Ts3Data.bak +/Wall/CutData.lua +/Wall/DrillData.lua +/Wall/MillingData.lua +/Wall/PocketingData.lua +/Wall/SawingData.lua +/Wall/Ts3Data.lua diff --git a/Beam/BeamData.lua b/Beam/BeamData.lua new file mode 100644 index 0000000..b8787b2 --- /dev/null +++ b/Beam/BeamData.lua @@ -0,0 +1,184 @@ +-- BeamData.lua by Egaltech s.r.l. 2023/01/28 +-- Raccolta dati generali per Travi + +EgtOutLog( ' PFrl-BeamData started') + +-- Tabella per definizione modulo +local BeamData = { + RIGHT_LOAD = true, -- flag carico da destra + SIMUL_VIEW_DIR = 1, -- direzione di vista predefinita per la simulazione (1=NW, 2=SW, 3=NE, 4=SE) + ROT90 = false, -- flag abilitazione rotazione 90 gradi + MIN_WIDTH = 50, -- larghezza minima del grezzo + MIN_HEIGHT = 50, -- altezza minima del grezzo + MAX_WIDTH = 400, -- larghezza massima del grezzo + MAX_HEIGHT = 800, -- altezza massima del grezzo + LEN_SHORT_PART = 1200, -- lunghezza massima pezzo piccolo + MAX_RAW = 20000, -- massima lunghezza grezzo (deve essere minore di LenTable - RAW_OFFSET) + STD_RAW = 14000, -- lunghezza standard della barra di grezzo + OVM_HEAD = 10, -- sovramateriale testa + OVM_MID = 5.0, -- sovramateriale intermedio (spessore lama) + MIN_JOIN_S = 100, -- minima presa pinza per pezzo piccolo + MIN_JOIN_L = 450, -- minima presa pinza per pezzo grande + MINRAW_S = 980, -- minimo grezzo in coda scaricabile per sezioni piccole + MINRAW_L = 1570, -- minimo grezzo in coda scaricabile per sezioni grandi + CHAR_EXTRA_DIST = 400, -- distanza aggiuntiva per minimizzare scambi di carrelli + MAX_LEN_SCRAP = 150, -- massima lunghezza scarto di coda + MAX_LEN_SCRAP_START = 150, -- massima lunghezza scarto di testa + MAX_DIM_HTCUT = 175, -- larghezza massima taglio di testa o coda + MAX_DIM_HTCUT_HBEAM = -145, -- larghezza massima taglio di testa o coda con trave alta (se negativo con accorciamento) + MIN_DIM_HBEAM = 680, -- altezza minima di trave alta + OVM_CHAIN_HBEAM = 8, -- sovramateriale per split con sega a catena + MAX_DIM_DICE = 140, -- dimensione trasversale massima cubetto + MAX_LEN_DICE = 400, -- lunghezza massima cubetto + DECR_VERT_CUT = 20, -- riduzione profondità per affondamento verticale in taglio orizzontale + COLL_SIC = 5, -- distanza di sicurezza per collisioni + CUT_SIC = 25, -- distanza di sicurezza per tagli + CUT_EXTRA = 10, -- affondamento extra standard per tagli di lama e fresature + CUT_EXTRA_MIN = 2, -- affondamento extra ridotto per tagli di lama e fresature + NZ_MINA = -0.6, -- componente limite in Z normale di una faccia (-30deg) + NZ_MINB = -0.4, -- componente limite in Z normale di un insieme di facce (-23deg) + DRILL_TOL = 0.2, -- tolleranza tra diametro foro e diametro punta + DRILL_VZ_MIN = - 0.51, -- componente limite in Z del versore di un foro + DRILL_VX_MAX = 0.867, -- componente limite in X del versore di un foro sulle facce laterali + DRILL_OVERLAP = 5, -- sovrapposizione tra due mezze forature + MILL_OVERLAP = 5, -- sovrapposizione tra due mezze fresature + MAX_DIST_HTFEA = 50.0, -- massima distanza di feature da testa o coda per essere considerata tale + MAX_LEN_HTFEA = 2550.0, -- massima lunghezza di feature di testa o coda + LONGCUT_ENDLEN = 1500, -- lunghezza lavoro estremi iniziale e finale + LONGCUT_MAXLEN = 4000, -- lunghezza massima sezione di taglio longitudinale + MAX_LEN_RIDGELAP_FROM_BOTTOM = 0, -- massima lunghezza ridgelap lavorabile da sotto + MAX_LEN_RIDGELAP_FROM_BOTTOM_HBEAM = 0, -- massima lunghezza ridgelap lavorabile da sotto con trave alta + DIM_TO_CENTER_STRIP = 0, -- larghezza minima trave per inserimento codolo nel centro della trave; 0 = automatico + DIM_STRIP = -1, -- dimensione codolo sostegno parti lasciate su contorno libero o archi + DIM_STRIP_SMALL = 2.5, -- dimensione codolo piccolo (quando le parti sostenute sono sicuramente sulla parte sopra del pezzo) + RAWCOL = { 255, 160, 32, 30}, -- colore del grezzo + RAW_OFFSET = 2000, -- spostamento grezzo rimanente dopo split + VICE_MINH = 110, -- altezza minima della morsa + 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 = 500, -- massima lunghezza ingombro per poter fare forature (fresature) oltre i 10 gradi dalla verticale + DRILL_VZ_MIN_LONG_TOOL = 0.984, -- componente limite per lavorazioni con punta lunga + MAX_TOOL_LEN_BACK_HOR_MACH = 500, -- massima lunghezza utensile per poter eseguire lavorazioni (forature/svuotature) da dietro (faccia 4) + PRESS_ROLLER = true, -- dichiarazione presenza rulli pressori + C_SIMM = true, -- dichiarazione simmetria mensola asse C + C_SIMM_ENC = 180, -- ingombro semi-forcella in X da naso mandrino (compresa sicurezza) + TWO_EQUAL_HEADS = true, -- macchina con due teste equivalenti + KIOTP = 5, -- coefficiente moltiplicativo per attacco/uscita lama tangente anzichè perpendicolare + MAXDIAM_POCK_CORNER = 31, -- diametro massimo utensile ammesso per tasche con angoli interni + USE_LONGCUT = true, -- per i tagli longitudinali usare solo la lavorazione di lama LongCut + ADVANCE_TAIL_CUT = true, -- per spostare prima del taglio di separazione il taglio di coda su pezzi corti con robabile caduta + ADVANCE_TAIL_OFFS = 10, -- accorciamento taglio di coda avanzato (minimo 1) + DOUBLE_HEAD_DOVETAIL = false, -- flag abilitazione lavorazione mortase a coda di rondine in doppio + DOUBLE_HEAD_MORTISE = false, -- flag abilitazione lavorazione mortase in doppio + DOUBLE_HEAD_DRILLING = false, -- flag abilitazione forature in doppio + CLAMP5 = false -- presenza pinza speciale per pezzi piccoli +} + +--------------------------------------------------------------------- +-- Aggiornamento con dati da TechnoEssetre7 +local sTs3Data = EgtGetStringFromIni( 'Beam', 'DATA_DIR', "C:\\TechnoEssetre7\\EgtData", EgtGetIniFile()).."\\Essetre-PFrl.data" +local sData = EgtGetSourceDir().."\\Ts3Data.lua" +if EgtExistsFile( sTs3Data) then + EgtCopyFile( sTs3Data, sData) + local sTs3DataOld = sTs3Data..'.old' + EgtEraseFile( sTs3DataOld) + EgtRenameFile( sTs3Data, sTs3DataOld) +end +if EgtExistsFile( sData) then + local Machine = dofile( sData) + if Machine then + if Machine.Offsets then + if Machine.Offsets.CLAMP5 and Machine.Offsets.CLAMP5 >= 1 then + BeamData.ADVANCE_TAIL_CUT = false + BeamData.CLAMP5 = true + end + if Machine.Offsets.DOUBLE_HEAD_DOVETAIL then BeamData.DOUBLE_HEAD_DOVETAIL = ( Machine.Offsets.DOUBLE_HEAD_DOVETAIL == 1) end + if Machine.Offsets.DOUBLE_HEAD_POCKET then BeamData.DOUBLE_HEAD_MORTISE = ( Machine.Offsets.DOUBLE_HEAD_POCKET == 1) end + if Machine.Offsets.DOUBLE_HEAD_DRILLING then BeamData.DOUBLE_HEAD_DRILLING = ( Machine.Offsets.DOUBLE_HEAD_DRILLING == 1) end + end + if Machine.Trave then + BeamData.MIN_WIDTH = Machine.Trave.XMIN or BeamData.MIN_WIDTH + BeamData.MIN_HEIGHT = Machine.Trave.ZMIN or BeamData.MIN_HEIGHT + BeamData.MAX_WIDTH = Machine.Trave.XMAX or BeamData.MAX_WIDTH + BeamData.MAX_HEIGHT = Machine.Trave.ZMAX or BeamData.MAX_HEIGHT + end + if Machine.User then + BeamData.OFFSET_DRILL_TENON = Machine.User.L040_OFFSET_P1 or BeamData.OFFSET_DRILL_TENON + if Machine.User.OPTIMIZATIONS_ENABLE_SLICES_F5 == 1 then + BeamData.MAX_LEN_SCRAP = Machine.User.OPTIMIZATIONS_LENGTH_SLICES or BeamData.MAX_LEN_SCRAP + else + BeamData.MAX_LEN_SCRAP = 100000 + end + if Machine.User.OPTIMIZATIONS_ENABLE_SLICES_F6 == 1 then + BeamData.MAX_LEN_SCRAP_START = Machine.User.OPTIMIZATIONS_LENGTH_SLICES or BeamData.MAX_LEN_SCRAP_START + else + BeamData.MAX_LEN_SCRAP_START = 100000 + end + BeamData.USER_HOLE_DIAM = Machine.User.L020_DIAM_HOLE or BeamData.USER_HOLE_DIAM + end + end +end + +--------------------------------------------------------------------- +local function GetMaxLenRidgeLapFromBottom( dHRaw) + if dHRaw < BeamData.MIN_DIM_HBEAM then + return BeamData.MAX_LEN_RIDGELAP_FROM_BOTTOM + 0.01 + else + return BeamData.MAX_LEN_RIDGELAP_FROM_BOTTOM_HBEAM + 0.01 + end +end +BeamData.GetMaxLenRidgeLapFromBottom = GetMaxLenRidgeLapFromBottom + +--------------------------------------------------------------------- +local function GetSectionCoeff( dW, dH, dL) + local SEZ_L = 80000 + local SEZ_S = 20000 + local LEN_SMALL = 2000 + local dSez = dW * dH + if dSez <= SEZ_S then + return 0.0 + elseif dSez < SEZ_L then + if dL and dL < LEN_SMALL then dSez = max( 0.6 * dSez, SEZ_S) end + local dCoeff = ( dSez - SEZ_S) / ( SEZ_L - SEZ_S) + return dCoeff + else + return 1.0 + end +end + +--------------------------------------------------------------------- +local function GetMinJoin( dW, dH, dL) + local dCoeff = GetSectionCoeff( dW, dH, dL) + return ( 1 - dCoeff) * BeamData.MIN_JOIN_S + dCoeff * BeamData.MIN_JOIN_L +end +BeamData.GetMinJoin = GetMinJoin + +--------------------------------------------------------------------- +local function GetMinUnloadableRaw( dW, dH) + local dCoeff = GetSectionCoeff( dW, dH) + return ( 1 - dCoeff) * BeamData.MINRAW_S + dCoeff * BeamData.MINRAW_L +end +BeamData.GetMinUnloadableRaw = GetMinUnloadableRaw + +--------------------------------------------------------------------- +local function GetChainSawBlockedAxis( nInd) + if nInd == 1 then + return 'A=-90' + else + return 'A=0' + end +end +BeamData.GetChainSawBlockedAxis = GetChainSawBlockedAxis + +--------------------------------------------------------------------- +local function GetChainSawInitAngs( vtN, vtO, nInd) + if abs( vtN:getY()) < 0.5 then + return EgtIf( vtO:getY() > 0, 'C=180', 'C=0') + else + return EgtIf( vtN:getY() > 0, 'C=180', 'C=0') + end +end +BeamData.GetChainSawInitAngs = GetChainSawInitAngs + +--------------------------------------------------------------------- +return BeamData diff --git a/Beam/BeamTableTemplate.ini b/Beam/BeamTableTemplate.ini new file mode 100644 index 0000000..ccb02c1 --- /dev/null +++ b/Beam/BeamTableTemplate.ini @@ -0,0 +1,9 @@ +-- %TABLE_NAME%.lua by Egaltech s.r.l. %DATE_TIME% +-- Gestione dati lavorazioni per Travi + +-- Tabella per definizione modulo +local %TABLE_NAME% = { +} + +--------------------------------------------------------------------- +return %TABLE_NAME% diff --git a/Beam/GetTs3Data.lua b/Beam/GetTs3Data.lua new file mode 100644 index 0000000..b43225d --- /dev/null +++ b/Beam/GetTs3Data.lua @@ -0,0 +1,30 @@ +-- GetTs3Data.lua by Egaltech s.r.l. 2022/04/07 +-- Recupero dati da file Ts3Data.lua di macchina + +-- Intestazioni +require( 'EgtBase') +_ENV = EgtProtectGlobal() +EgtEnableDebug( false) + +-- Per test +--GTSD = {} +--GTSD.TS3PATH = 'Essetre-FAST\\Ts3Data.lua' + +local sLog = 'GetTs3Data : ' .. GTSD.TS3PATH +EgtOutLog( sLog) + +if EgtExistsFile( GTSD.TS3PATH) then + local Machine = dofile( GTSD.TS3PATH) + -- Assegno valori di interesse + Offsets = Machine.Offsets + _G.Offsets = Offsets + Trave = Machine.Trave + _G.Trave = Trave + User = Machine.User + _G.User = User +end + +-- Tutto ok +GTSD.ERR = 0 + +EgtOutLog( ' +++ GetTs3Data completed') diff --git a/Beam/MachData.ini b/Beam/MachData.ini new file mode 100644 index 0000000..b2100bc --- /dev/null +++ b/Beam/MachData.ini @@ -0,0 +1,82 @@ +; PIndex = Type, PName, Default, Description +; Type : d=double, l=length, s=string + +[1] +Name=Offsets +1=d,TIPO_CN,2,0=AXIUM 2=FLEXIUM +2=l,X1_NEG,-2723,MIN_X1 +3=l,X1_POS,-650,MAX_X1 +4=l,PARK_X1,-2723.0,PARK_X1 +5=l,Z1_NEG,-1550.0,MIN_Z1 +6=l,Z1_POS,0,MAX_Z1 +7=l,PARK_Z1,-535,PARK_Z1 +8=l,PARK_SAWZ1,-150,--- +9=d,C1_NEG,-275.0,MIN_C1 +10=d,C1_POS,275.0,MAX_C1 +11=d,B1_NEG,-127.0,MIN_B1 +12=d,B1_POS,127.0,MAX_B1 +13=d,B1_NEG1,-119.0,MIN_B1_SAW +14=d,B1_POS1,119.0,MAX_B1_SAW +15=l,PIVOT_T1,170.05,PIVOT_HEAD1 +16=l,X2_NEG,-2080,MIN_X2 +17=l,X2_POS,0,MAX_X2 +18=l,PARK_X2,-0.9,PARK_X2 +19=l,Z2_NEG,-1550.0,MIN_Z2 +20=l,Z2_POS,0,MAX_Z2 +21=l,PARK_Z2,-535,PARK_Z2 +22=l,PARK_SAWZ2,-150,--- +23=d,C2_NEG,-275.0,MIN_C2 +24=d,C2_POS,275,MAX_C2 +25=d,B2_NEG,-127.0,MIN_B2 +26=d,B2_POS,127.0,MAX_B2 +27=d,B2_NEG1,-119.0,MIN_B2_SAW +28=d,B2_POS1,119.0,MAX_B2_SAW +29=l,PIVOT_T2,170,PIVOT_HEAD2 +30=l,MIN_Y1,277,MIN_Y1 +31=l,MAX_Y1,5712,MAX_Y1 +32=l,PARK_Y1,985,PARK_Y1 +33=l,MIN_V1,3,MIN_V1 +34=l,MAX_V1,685,MAX_V1 +35=l,MIN_Y2,-5707,MIN_Y2 +36=l,MAX_Y2,-297,MAX_Y2 +37=l,PARK_Y2,-960,PARK_Y2 +38=l,MIN_V2,-670,MIN_V2 +39=l,MAX_V2,-9,MAX_V2 +40=l,MIN_DELTAVY,300,MIN_DELTA_VY +41=d,CLAMP5,0,SMALL_CLAMP +42=l,MINWOPEN,38,MIN_OPEN_SMALL_CLAMP +43=l,MAXWOPEN,160,MAX_OPEN_SMALL_CLAMP +44=l,MAXWHEIGHT,305,MAX_BEAM_HEIGHT_ON_SMALL_CLAMP +45=l,DIST_FTZERO,2132.1001,DIST_LASER +46=l,DELTA_CARICZERO,65.2,DELTA_LASER_LOAD +47=l,DIST_UNLOAD,-2100,DIST_UNLOAD +48=l,OFFSETXT1,-1172.4,OFFSETX_HEAD1 +49=l,OFFSETZT1,-1046.6,OFFSETZ_HEAD1 +50=l,OFFSETXT2,-1172.5,OFFSETX_HEAD2 +51=l,OFFSETZT2,-1047.5,OFFSETZ_HEAD2 +52=l,OFFSETZSOTTOTRAVE,981,DELTAZ_RULLI_SOTTOTRAVE +53=l,OFFSETZTAPPETO,485,DELTAZ_RULLI_TAPPETO +54=d,OFFSETCLAMAT1,0,OFFSETCLAMA_HEAD1 +55=d,OFFSETBLAMAT1,0,OFFSETBLAMA_HEAD1 +56=d,OFFSETCLAMAT2,0,OFFSETCLAMA_HEAD2 +57=d,OFFSETBLAMAT2,0,OFFSETBLAMA_HEAD2 +58=d,SECONDSAW,0,SECOND_SAW +59=d,MORTISER,1,MORTISER +60=d,DOUBLE_HEAD_DOVETAIL,1,DT_MORTISE_IN_DOUBLE +61=d,DOUBLE_HEAD_POCKET,0,POCKET_IN_DOUBLE +62=d,DOUBLE_HEAD_DRILLING,0,DRILLING_IN_DOUBLE + +[2] +Name=Trave +1=l,XMIN,50,XMIN +2=l,XMAX,401,XMAX +3=l,ZMIN,50,ZMIN +4=l,ZMAX,801,ZMAX + +[3] +Name=User +1=d,OPTIMIZATIONS_ENABLE_SLICES_F5,1,ENABLE_SLICES_ON_END +2=d,OPTIMIZATIONS_ENABLE_SLICES_F6,1,ENABLE_SLICES_ON_START +3=d,OPTIMIZATIONS_LENGTH_SLICES,100,SLICES_LENGTH +4=l,L020_DIAM_HOLE,20,L020_HOLE_DIAM +5=l,L040_OFFSET_P1,0,L040_ON_TENON_OFFSET diff --git a/Beam/MachiningTypes.ini b/Beam/MachiningTypes.ini new file mode 100644 index 0000000..984fcd7 --- /dev/null +++ b/Beam/MachiningTypes.ini @@ -0,0 +1,47 @@ +[Cut] +1=HeadSide +2=TailSide +3=LongCut + +[Drill] +1=Drill +2=Drill_H2 +3=Pocket +4=Pocket_H2 + +[Milling] +1=Prof +2=FreeContour +3=Tenon +4=Tenon_H2 +5=DtTenon +6=DtTenon_H2 +7=DtMortise +8=DtMortise_H2 +9=BirdsMouth +10=BirdsMouth_H2 +11=Chamfer +12=Mark +13=Text +14=Decor01 +15=Long2Cut +16=Long2CutDown +17=LongSmallCut +18=LongSmallCut_H2 +19=BHSideMill +20=CleanCorner +21=ProfTCone +22=Long2CutSide +23=SmallToolContour +24=AntiSplintMillCut + +[Pocketing] +1=Pocket +2=Pocket_H2 +3=OpenPocket +4=OpenPocket_H2 +5=Mortise +6=Mortise_H2 + +[Sawing] +1=Sawing diff --git a/Essetre-PF.NUM.mlpe b/Essetre-PF.NUM.mlpe new file mode 100644 index 0000000..12e17fb --- /dev/null +++ b/Essetre-PF.NUM.mlpe @@ -0,0 +1,2659 @@ +-- Processore macchina Essetre-PFrl by EgalTech s.r.l. 2023/03/03 +-- Con controllo numerico NUM + +-- Variabili di modulo +local MLE_INFO = 'Essetre-PFrl.NUM.mlpe ver.'..PP_VER..' by EgalTech s.r.l.' +local TEST_USE = false + +--------------------------------------------------------------------- +-- *** GENERATION *** +--------------------------------------------------------------------- +function OnStart() + -- controllo versione programma + if not EMT.VER or EMT.VER < '2.5a2' then + EmtSetLastError( 1200, 'A newer version of the program is required (minimum EgtMachKernel 2.5a2)') + 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 = 102000 -- 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 nPattId = EgtGetInfo( BtlInfoId, 'PATTID', 'i') or 40 + EmtOutput( '%' .. EgtNumToString( nPattId,-1)) + if EMT.INFO then + EmtOutput( '('..EMT.INFO..')') + else + EmtOutput( '(Program Start)') + end + EmtOutput( '('.. MLE_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 + 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 + -- Se modalità test, termino il programma + if TEST_USE then + EmtOutput( 'M02') + end +end + +--------------------------------------------------------------------- +function OnToolData() + -- emissione dati utensile (esclusa sega a catena) + if EMT.HEAD ~= 'H13' then + -- output info + local dAddLen = 0 + if EMT.HEAD == 'H12' then + dAddLen = -SawOffsZ + elseif EMT.HEAD == 'H22' then + dAddLen = -Saw2OffsZ + end + local sPos = EgtIf( #EMT.TCPOS == 2, EMT.TCPOS:gsub( 'T', 'N30'), EMT.TCPOS:gsub( 'T', 'N3')) + local sOut = 'L1='..EgtNumToString( EMT.SMAX, 0)..' L2='..EmtLenToString( dAddLen + EMT.TTOTLEN, 1)..' G76H9998.2'..sPos..sPos + EmtOutput( '('..sOut..')') + -- emissione dati sega a catena o mortasatrice + elseif 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..')') + 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 + -- 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( Mill2Offs, 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( -Delta2TabY, 2)..' ER'..EmtLenToString( Delta2TabZ, 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 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 or EMT.RELOAD then + -- ora abilito numerazione linee + EMT.NUM = true + EMT.LINENBR = 0 + -- 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 + -- recupero le rotazioni delle fasi corrente e precedente + local nRot = GetPhaseRot( EMT.PHASE) + local nPrevRot = GetPhaseRot( EMT.PHASE - 1) + -- verifico se sono diverse + if nRot ~= nPrevRot then + local nDeltaRot = nRot - nPrevRot + -- rotazione automatica o manuale (sempre con il medesimo comando) + local sOut = 'M180 L0=' .. tostring( nDeltaRot) + EmtOutput( sOut) + -- 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)') + for i = 1, #EMT.MDCHAR do + EmitMoveDataChars( EMT.MDCHAR[i]) + 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) + 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)') + EmitBeamHeadData( { T=EMT.L1, 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 + 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) + -- se sega a catena, aggiusto subito angolo scelto per asse virtuale A + if EMT.HEAD == 'H13' 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) + end + -- gestione eventuale lavorazione in doppio + local nDouType = EgtGetValInNotes( EMT.MCHUSERNOTES, 'DOUBLE', 'i') + if nDouType == 2 or nDouType == 3 then + local sDouTool = 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 + -- non va in sicurezza testa in doppio + EMT.DOU_TO_ZMAX = nil + else + EmtSetLastError( 1211, 'Missing or not active double tool of '..sOldTool) + end + EgtTdbSetCurrTool( sOldTool) + end + -- se testa in doppio ancora da rimettere in sicurezza + if EMT.DOU_TO_ZMAX then + local dPosT = EMT.TPOS or EMT.L1op + EmitParkRoller( dPosT, false) + EmitDouZMax() + EMT.REFLOC = nil + end +end + +--------------------------------------------------------------------- +function OnMachiningEnd() + --EmtOutput( ';Mach End') + -- Emissione split + if #EMT.MDCHAR > 0 then + if EMT.AUXTYPE == 'S' then + 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 + elseif EMT.AUXTYPE == 'U' then + EmtOutput( '(PART UNLOAD)') + elseif EMT.AUXTYPE == 'P' then + if EMT.PREROT then + if not EMT.ZMAX then + EmitZmax( false, true, true, EMT.R1, EMT.R2, false, ( #EMT.MDCHAR > 0)) + EMT.ZMAX = true + EMT.TO_ZMAX = nil + else + EmitXhome() + end + EMT.TO_XHOME = nil + EmtOutput( '(PART ROTATION)') + elseif EMT.FALL then + if EMT.TO_ZMAX and not EMT.ZMAX then + EmitZmax( false, true, true, EMT.R1, EMT.R2, false, ( #EMT.MDCHAR > 0)) + EMT.ZMAX = true + EMT.TO_ZMAX = nil + EMT.TO_XHOME = nil + end + EmtOutput( '(PART FALL)') + elseif EMT.SPECSPLIT then + if EMT.TO_ZMAX and not EMT.ZMAX then + EmitZmax( false, true, true, EMT.R1, EMT.R2, false, ( #EMT.MDCHAR > 0)) + EMT.ZMAX = true + EMT.TO_ZMAX = nil + EMT.TO_XHOME = nil + end + EmtOutput( '(PART SPEC SPLIT)') + else + EmitZmax( false, true, false, EMT.R1, EMT.R2, false, ( #EMT.MDCHAR > 0)) + EMT.ZMAX = true + 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 + EmitMoveStartChars( 1) + EmitMoveWaitChars( 1) + 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, TEST_USE) + 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.TO_ZMAX = nil + EMT.TO_XHOME = nil + EMT.PREVTOOL = EMT.TOOL + EMT.PREVHEAD = EMT.HEAD + EMT.PREVTCPOS = EMT.TCPOS + if EMT.DOU_TYPE and not EMT.ZMAX then EMT.DOU_TO_ZMAX = true end + EMT.DOU_TYPE = nil +end + +--------------------------------------------------------------------- +function OnPathStart() + -- non ancora iniziata la lavorazione + EMT.MCHFIRST = true + EMT.MCHFIRSTFEED = true + -- se piano locale compatibile + local vtExtr = Vector3d( EMT.EXTR) + if EMT.REFLOC == 1 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.MCHUSERNOTES:find( 'Split', 1, true) ~= nil) 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 utensile non cambiato, salvo eventuali precedenti lineari e rotanti + if EMT.TOOL == EMT.PREVTOOL and not EMT.ZMAX then + EMT.L1pp = EMT.L1op + EMT.L2pp = EMT.L2op + EMT.L3pp = EMT.L3op + EMT.R1pp = EMT.R1p + EMT.R2pp = EMT.R2p + else + EMT.L1pp = nil + EMT.L2pp = nil + EMT.L3pp = nil + EMT.R1pp = nil + EMT.R2pp = nil + end + -- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento) + EmtResetPrev() + EMT.AUXCMD = {} + EMT.MDCHAR = {} +end + +--------------------------------------------------------------------- +function OnPathEnd() + if not EMT.ZMAX then + EmitResetMachining() + end + 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) + -- gestione speciale per richiesta di movimento a ZMAX + local Cmd = EgtSplitString( EMT.AUX) + if Cmd[1] == '4' then + EMT.TO_ZMAX = true + if Cmd[2] == '1' then + EMT.TO_XHOME = true + end + end +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() + -- gruppo della testa + local nHSet = GetHeadSet( EMT.HEAD) + -- se primo movimento della lavorazione, gestione speciale + if EMT.MCHFIRST and not EMT.OPEISDISP and ( EMT.REFLOC ~= 1 or GetDiffRotAxAtStart( EMT.R1, EMT.R2) or GetMovesInAuxCmd( EMT.AUXCMD)) then + EMT.REFLOC = nil + EMT.IPLGL = false + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + local HomeR1 = EgtGetAxisHomePos( EgtIf( nHSet == 1, 'C1', 'C2')) + local HomeR2 = EgtGetAxisHomePos( EgtIf( nHSet == 1, 'B1', 'B2')) + local PrevR1 = EMT.R1p or EMT.R1pp or HomeR1 + local PrevR2 = EMT.R2p or EMT.R2pp or HomeR2 + EmtResetPrev() + -- se prima lavorazione + if EMT.LOAD then + EMT.V2POS = ParkV2 + -- primo posizionamento + local Speed = EMT.S * EgtIf( EMT.HEAD ~= 'H12' and EMT.HEAD ~= 'H22', 1, 1.65) + local bOnlyCharY = true + -- se Split lascio agganciata solo la pinza Y2 alla fine dei movimenti + local bSplitCut = ( EMT.MCHUSERNOTES:find( 'Split', 1, true) ~= nil) + -- eventuale Movimento Pinze + for i = 1, #EMT.AUXCMD do + ProcessPathStartAux( EMT.AUXCMD[i], i) + end + EMT.AUXCMD = {} + if bSplitCut 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)) + sOut = string.gsub( string.gsub( EMT.MCHNAME..'/'..EMT.TOOL, '%(', '['), '%)', ']') + if EMT.DOU_TYPE then sOut = sOut .. ' Double' end + EmtOutput( '( *** '..sOut..' *** )') + -- se necessario allargo le cabine + if RollerParkingNeeded( EMT.HEAD, PrevR1, PrevR2, EMT.R1, EMT.R2) or + EMT.V1POS < EMT.V1NEXTPOS - 1 or EMT.V2POS > EMT.V2NEXTPOS + 1 then + local dPosT = EMT.TPOS or EMT.L1op + EmitParkRoller( dPosT, bSplitCut) + end + -- se testa 1 + if nHSet == 1 then + -- allontanamento o eventuale preselezione successiva testa 2 + if not EMT.DOU_TYPE then + PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) + end + -- movimento testa + local dSafeZ1 = EgtGetAxisHomePos( 'Z1') + local MyMaxZ1 = EgtGetAxisMax( 'Z1') + local HomeB1 = EgtGetAxisHomePos( 'B1') + local HomeC1 = EgtGetAxisHomePos( 'C1') + local dTRad, dTLen = GetToolRadLen() + -- se fresa o lama + if EMT.HEAD ~= 'H13' then + EmitMoveDataHead( 1, { X=EMT.L2, Z=MyMaxZ1, B=ParkB1, C=ParkC1, TRad=dTRad, TLen=dTLen, S=Speed}) + EmitMoveStartHead( 1) + EmitMoveWaitHead( 1) + EmitMoveWaitChars( EgtIf( bOnlyCharY, 1, 3)) + local dZref = EMT.L3 + if EMT.HEAD == 'H12' and ( EMT.L2 < -LimX1RotSaw or EMT.R2 < -91) then + dZref = min( dSafeZ1 + GetZExtra( EMT.HEAD, EMT.R2) - EgtIf( not Mortiser, 100, 370), MyMaxZ1) + end + -- caso speciale per trave alta con rotazione lama pericolosa + if EMT.HEAD == 'H12' and EMT.SB > 400 and abs( PrevR1 - EMT.R1) > 1 and ( abs( HomeC1 - EMT.R1) > 30.1 or abs( HomeB1 - EMT.R2) > 30.1) then + EmitMoveDataHead( 1, { X=EMT.L2, Z=MyMaxZ1, B=0, C=ParkC1, S=Speed}) + EmitMoveDataHead( 1, { C=EMT.R1, S=Speed}) + EmitMoveDataHead( 1, { Z=dZref, B=EMT.R2, S=Speed}) + -- caso standard + else + EmitMoveDataHead( 1, { X=EMT.L2, Z=dZref, B=ParkB1, C=ParkC1, S=Speed}) + EmitMoveDataHead( 1, { B=EMT.R2, S=Speed}) + EmitMoveDataHead( 1, { C=EMT.R1, S=Speed}) + end + -- altrimenti sega a catena + else + EmitMoveDataHead( 1, { X=EMT.L2, Z=ParkCSawZ1, B=HomeB1, C=EMT.R1, TRad=dTRad, TLen=dTLen, S=Speed}) + EmitMoveStartHead( 1) + EmitMoveWaitHead( 1) + EmitMoveWaitChars( EgtIf( bOnlyCharY, 1, 3)) + EmitMoveDataHead( 1, { Z=dSafeZ1, B=EMT.R2, C=EMT.R1, S=Speed}) + end + EmitMoveDataHead( 1, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, TRad=dTRad, TLen=dTLen, S=Speed}) + EmitMoveStartHead( 1) + -- se lavorazione in doppio + if EMT.DOU_TYPE == 2 then + local dX2 = - ( Delta2TabY - EMT.DOU_TLEN - ( -DeltaTabY - EMT.L2 - EMT.TLEN - EMT.HB)) + local dZ2 = -Head2Z + MillOffs - Mill2Offs + EMT.L3 + dZ2 = max( dZ2, MaxZ2) + local dC2 = -EMT.R1 + local dB2 = -EMT.R2 + EmitMoveDataHead( 2, { X=dX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED}) + EmitMoveDataHead( 2, { Z=dZ2, B=dB2, C=dC2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED}) + EmitMoveStartHead( 2) + -- aspetto esecuzione movimento testa 2 + EmitMoveWaitHead( 2) + end + -- aspetto termine esecuzione movimenti testa 1 + EmitMoveWaitHead( 1) + -- altrimenti testa 2 + else + -- allontanamento o eventuale preselezione successiva testa 1 + PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) + -- movimento testa + local dSafeZ2 = EgtGetAxisHomePos( 'Z2') + local MyMaxZ2 = EgtGetAxisMax( 'Z2') + local HomeC2 = EgtGetAxisHomePos( 'C2') + local HomeB2 = EgtGetAxisHomePos( 'B2') + local dTRad, dTLen = GetToolRadLen() + EmitMoveDataHead( 2, { X=EMT.L2, Z=MyMaxZ2, B=HomeB2, C=HomeC2, TRad=dTRad, TLen=dTLen, S=Speed}) + EmitMoveStartHead( 2) + EmitMoveWaitHead( 2) + EmitMoveWaitChars( EgtIf( bOnlyCharY, 1, 3)) + local dZref = EMT.L3 + if EMT.HEAD == 'H22' and ( EMT.L2 < -LimX2RotSaw or EMT.R2 > 91) then + dZref = min( dSafeZ2 + GetZExtra( EMT.HEAD, EMT.R2) - 100, MyMaxZ2) + end + -- caso speciale per trave alta con rotazione lama pericolosa + if EMT.HEAD == 'H22' and EMT.SB > 400 and abs( PrevR1 - EMT.R1) > 1 and ( abs( HomeC2 - EMT.R1) > 30.1 or abs( HomeB2 - EMT.R2) > 30.1) then + EmitMoveDataHead( 2, { X=EMT.L2, Z=MyMaxZ2, B=0, C=HomeC2, S=Speed}) + EmitMoveDataHead( 2, { C=EMT.R1, S=Speed}) + EmitMoveDataHead( 2, { Z=dZref, B=EMT.R2, S=Speed}) + -- altrimenti caso standard + else + EmitMoveDataHead( 2, { X=EMT.L2, Z=dZref, B=HomeB2, C=HomeC2, S=Speed}) + EmitMoveDataHead( 2, { B=EMT.R2, S=Speed}) + EmitMoveDataHead( 2, { C=EMT.R1, S=Speed}) + end + if abs( dZref - EMT.L3) > 0.1 then EmitMoveDataHead( 2, { Z=EMT.L3, S=Speed}) end + EmitMoveStartHead( 2) + -- aspetto termine esecuzione movimenti testa 2 + EmitMoveWaitHead( 2) + end + -- 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 bSplitCut 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 + -- altrimenti lavorazione successiva + else + --EmtOutput( string.format( 'V1Pos=%.3f V2Pos=%.3f', EMT.V1POS, EMT.V2POS)) + local bToPresel = true + if not EMT.RELOAD and not EMT.ZMAX and #EMT.AUXCMD > 0 and EMT.TO_ZMAX then + -- allontanamento o eventuale preselezione successiva testa differente + if not EMT.DOU_TYPE then + PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) + end + bToPresel = false + -- risalita a Zmax + EmitZmax( false, false, EMT.TO_XHOME, PrevR1, PrevR2) + EMT.ZMAX = true + EMT.TO_ZMAX = nil + EMT.TO_XHOME = nil + EMT.L3pp = nil + PrevR1 = EgtGetAxisHomePos( EgtIf( nHSet == 1, 'C1', 'C2')) + PrevR2 = EgtGetAxisHomePos( EgtIf( nHSet == 1, 'B1', 'B2')) + end + -- se necessario posizionamento in home (sono sicuramente già a Zmax) + if EMT.TO_XHOME then + -- se precedente non era sega a catena, vado in home con quella + if not HeadIsChainSaw( EMT.PREVHEAD) then + local nPrevHSet = GetHeadSet( EMT.PREVHEAD) + if nPrevHSet == 1 then + local HomeX1 = EgtGetAxisHomePos( 'X1') + EmitMoveDataHead( 1, { X=-HomeX1, Z=MaxZ1, B=ParkB1, C=ParkC1, TPos='0'}) + EmitMoveStartHead( 1, 'EA1') + else + local HomeX2 = EgtGetAxisHomePos( 'X2') + EmitMoveDataHead( 2, { X=-HomeX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos='0'}) + EmitMoveStartHead( 2, 'EA1') + end + -- altrimenti la deposito e vado in home speciale + else + -- se successivo non è sega a catena, ne lancio il carico + if not HeadIsChainSaw( EMT.HEAD) then + if nHSet == 1 then + local HomeX1 = EgtGetAxisHomePos( 'X1') + EmitMoveDataHead( 1, { X=-HomeX1, Z=MaxZ1, B=HomeR2, C=HomeR1}) + EmitMoveStartHead( 1, 'EA1') + else + local HomeX2 = EgtGetAxisHomePos( 'X2') + EmitMoveDataHead( 2, { X=-HomeX2, Z=MaxZ2, B=HomeR2, C=HomeR1}) + EmitMoveStartHead( 2, 'EA1') + end + -- altrimenti deposito e mi metto in posizione sicura + else + EmitMoveDataHead( 1, { X=-ParkCSawX1S, Z=MaxZ1, B=HomeR2, C=HomeR1, TPos='0'}) + EmitMoveStartHead( 1, 'EA1') + end + end + EMT.TO_XHOME = nil + EMT.L3pp = nil + PrevR1 = HomeR1 + PrevR2 = HomeR2 + elseif bToPresel then + -- allontanamento o eventuale preselezione successiva testa differente + if not EMT.DOU_TYPE then + PreselectNextDiffHead( EMT.MCHID, EMT.HEAD) + end + bToPresel = false + end + sOut = string.gsub( string.gsub( EMT.MCHNAME..'/'..EMT.TOOL, '%(', '['), '%)', ']') + if EMT.DOU_TYPE then sOut = sOut .. ' Double' end + EmtOutput( '( *** '..sOut..' *** )') + -- se Split lascio agganciata solo la pinza Y2 alla fine dei movimenti + local bSplitCut = ( EMT.MCHUSERNOTES:find( 'Split', 1, true) ~= nil) + -- eventuale Movimento Pinze + for i = 1, #EMT.AUXCMD do + ProcessPathStartAux( EMT.AUXCMD[i], i) + end + EMT.AUXCMD = {} + if bSplitCut 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]) + end + if #EMT.MDCHAR > 0 then + local nMoveType = EgtIf( EMT.POSTROT or EMT.RELOAD, 1, 3) + EmitMoveStartChars( nMoveType) + EmitMoveWaitChars( nMoveType) + end + EMT.MDCHAR = {} + -- se pezzo a destra, dichiaro cabina sinistra da parcheggiare + if not EMT.Y1DELTA then + EMT.V1NEXTPOS = ParkV1 + end + -- se necessario allargo le cabine + if RollerParkingNeeded( EMT.HEAD, PrevR1, PrevR2, EMT.R1, EMT.R2) or + EMT.V1POS < EMT.V1NEXTPOS - 1 or EMT.V2POS > EMT.V2NEXTPOS + 1 then + local dPosT = EMT.TPOS or EMT.L1op + EmitParkRoller( dPosT, bSplitCut) + end + -- se testa 1 + if nHSet == 1 then + -- movimento testa + local dSafeZ1 = EgtGetAxisHomePos( 'Z1') + local MyMaxZ1 = EgtGetAxisMax( 'Z1') + local HomeC1 = EgtGetAxisHomePos( 'C1') + local HomeB1 = EgtGetAxisHomePos( 'B1') + local dTRad, dTLen = GetToolRadLen() + local Speed = EMT.S * EgtIf( EMT.HEAD ~= 'H12' and EMT.HEAD ~= 'H22', 1, 1.65) + if EMT.ZMAX or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then + -- se fresa o lama + if EMT.HEAD ~= 'H13' then + local CurrZ1 = EMT.L3pp or MyMaxZ1 + local CurrB1 = PrevR2 + local CurrC1 = PrevR1 + EmitMoveDataHead( 1, { X=EMT.L2, Z=CurrZ1, B=CurrB1, C=CurrC1, TRad=dTRad, TLen=dTLen, S=Speed}) + local dZref = EMT.L3 + if EMT.HEAD == 'H12' and ( EMT.L2 < -LimX1RotSaw or EMT.R2 < -91) then + dZref = min( dSafeZ1 + GetZExtra( EMT.HEAD, EMT.R2) - EgtIf( not Mortiser, 100, 370), MyMaxZ1) + end + -- caso speciale per trave alta con rotazione lama pericolosa + if EMT.HEAD == 'H12' and EMT.SB > 400 and abs( PrevR1 - EMT.R1) > 1 and ( abs( HomeC1 - EMT.R1) > 30.1 or abs( HomeB1 - EMT.R2) > 30.1) then + EmitMoveDataHead( 1, { X=EMT.L2, Z=CurrZ1, B=0, C=CurrC1, S=Speed}) + EmitMoveDataHead( 1, { C=EMT.R1, S=Speed}) + EmitMoveDataHead( 1, { Z=dZref, B=EMT.R2, S=Speed}) + -- altrimenti caso standard + else + EmitMoveDataHead( 1, { Z=dZref, S=Speed}) + EmitMoveDataHead( 1, { B=EMT.R2, S=Speed}) + EmitMoveDataHead( 1, { C=EMT.R1, S=Speed}) + end + -- altrimenti sega a catena + else + EmitMoveDataHead( 1, { X=EMT.L2, Z=ParkCSawZ1, B=HomeB1, C=EMT.R1, TRad=dTRad, TLen=dTLen, S=Speed}) + EmitMoveDataHead( 1, { Z=dSafeZ1, B=EMT.R2, C=EMT.R1, S=Speed}) + end + end + EmitMoveDataHead( 1, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, TRad=dTRad, TLen=dTLen, S=Speed}) + EmitMoveStartHead( 1) + -- se lavorazione in doppio + if EMT.DOU_TYPE == 2 then + local dX2 = - ( Delta2TabY - EMT.DOU_TLEN - ( -DeltaTabY - EMT.L2 - EMT.TLEN - EMT.HB)) + local dZ2 = -Head2Z + MillOffs - Mill2Offs + EMT.L3 + if EMT.ZMAX or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then + dZ2 = MaxZ2 + end + dZ2 = min( dZ2, MaxZ2) + local dC2 = -EMT.R1 + local dB2 = -EMT.R2 + if EMT.ZMAX then + local dSafeZ2 = EgtGetAxisHomePos( 'Z2') + EmitMoveDataHead( 2, { X=-ParkX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED}) + EmitMoveDataHead( 2, { X=dX2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED}) + end + EmitMoveDataHead( 2, { X=dX2, Z=dZ2, B=dB2, C=dC2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED}) + EmitMoveStartHead( 2) + -- aspetto esecuzione movimento testa 2 + EmitMoveWaitHead( 2) + end + -- aspetto esecuzione movimento testa 1 + EmitMoveWaitHead( 1) + -- altrimenti testa 2 + else + -- movimento testa + local dSafeZ2 = EgtGetAxisHomePos( 'Z2') + local MyMaxZ2 = EgtGetAxisMax( 'Z2') + local HomeC2 = EgtGetAxisHomePos( 'C2') + local HomeB2 = EgtGetAxisHomePos( 'B2') + local dTRad, dTLen = GetToolRadLen() + local Speed = EMT.S * EgtIf( EMT.HEAD ~= 'H12' and EMT.HEAD ~= 'H22', 1, 1.65) + if EMT.ZMAX or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then + -- se fresa o lama + if EMT.HEAD ~= 'H23' then + local CurrZ2 = EMT.L3pp or MyMaxZ2 + local CurrB2 = PrevR2 + local CurrC2 = PrevR1 + EmitMoveDataHead( 2, { X=EMT.L2, Z=CurrZ2, B=CurrB2, C=CurrC2, TRad=dTRad, TLen=dTLen, S=Speed}) + local dZref = EMT.L3 + if EMT.HEAD == 'H22' and ( EMT.L2 < -LimX2RotSaw or EMT.R2 > 91) then + dZref = min( dSafeZ2 + GetZExtra( EMT.HEAD, EMT.R2) - 100, MyMaxZ2) + end + -- caso speciale per trave alta con rotazione lama pericolosa + if EMT.HEAD == 'H22' and EMT.SB > 400 and abs( PrevR1 - EMT.R1) > 1 and ( abs( HomeC2 - EMT.R1) > 30.1 or abs( HomeB2 - EMT.R2) > 30.1) then + EmitMoveDataHead( 2, { X=EMT.L2, Z=CurrZ2, B=0, C=CurrC2, S=Speed}) + EmitMoveDataHead( 2, { C=EMT.R1, S=Speed}) + EmitMoveDataHead( 2, { Z=dZref, B=EMT.R2, S=Speed}) + -- altrimenti caso standard + else + EmitMoveDataHead( 2, { Z=dZref, S=Speed}) + EmitMoveDataHead( 2, { B=EMT.R2, S=Speed}) + EmitMoveDataHead( 2, { C=EMT.R1, S=Speed}) + end + -- altrimenti errore + else + EmtSetLastError( 1211, 'Head not defined ' .. ( EMT.HEAD or '')) + end + end + EmitMoveDataHead( 2, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, TRad=dTRad, TLen=dTLen, S=Speed}) + EmitMoveStartHead( 2) + -- aspetto esecuzione movimento testa 2 + EmitMoveWaitHead( 2) + end + 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 bSplitCut 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 + BhData.Y2 = ParkY2 + BhData.ViseY2 = 2 + 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 + BhData.IniStatV2 = 3 + EMT.V2POS = ParkV2 + BhData.V2 = EMT.V2POS + end + if EMT.W2DELTA then + if EMT.TO_SPECSPLIT then + BhData.W = EMT.L1 + EMT.W2DELTA + else + BhData.Pz5 = 1 + end + 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 + EMT.REFLOC = 0 + EMT.MCHFIRST = false + EMT.ZMAX = false + -- se standard + elseif EMT.FLAG == 0 or EMT.FLAG == 1 or EMT.FLAG == 2 then + local sPostMove = '' + if EMT.MCHFIRST then + local 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) + EmtOutput( 'G157 EA2' .. sPreMove) + -- 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 + end + -- se necessario, impostazione riferimento locale + if EMT.REFLOC == 0 then + -- se lavorazione in doppio + if EMT.DOU_TYPE == 2 then + -- aggiusto assi + EMT.L2 = -EMT.L2 + -- emetto movimenti in Zero macchina + local Speed = EMT.S * EgtIf( EMT.HEAD ~= 'H12', 1, 1.65) + EmitMoveDataHead( 1, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, S=Speed}) + EmitMoveStartHead( 1) + local dX2 = - ( Delta2TabY - EMT.DOU_TLEN - ( -DeltaTabY - EMT.L2 - EMT.TLEN - EMT.HB)) + local dZ2 = -Head2Z + MillOffs - Mill2Offs + EMT.L3 + local dC2 = -EMT.R1 + local dB2 = -EMT.R2 + EmitMoveDataHead( 2, { X=dX2, Z=dZ2, B=dB2, C=dC2, TPos=EMT.DOU_TPOS, S=EMT.DOU_SPEED}) + EmitMoveStartHead( 2) + -- aspetto esecuzione movimento testa 2 e 1 + EmitMoveWaitHead( 2) + EmitMoveWaitHead( 1) + -- ripristino assi + EMT.L2 = -EMT.L2 + end + -- calcolo per piano generico + CalcInterpPlane() + EMT.REFLOC = 1 + -- 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()) + -- forzo successiva emissione assi rotanti + EMT.R1p = nil + EMT.R2p = nil + else + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + end + -- emissione movimento + local sOut = 'G0'..EmtGetAxis('L1')..EmtGetAxis('L2')..EmtGetAxis('L3').. + EmtGetAxis('R2')..EmtGetAxis('R1') + -- comandi rulli dopo movimento (chiusure) + EmtOutput( sOut) + if #sPostMove > 0 then + EmtOutput( 'G157 EA2' .. sPostMove) + end + -- se altrimenti risalita a Z max a fine lavorazione + elseif EMT.FLAG == 3 then + EMT.REFLOC = nil + EMT.IPLGL = false + MyAdjustLinearAxes() + EmtAdjustRotaryAxes() + -- se Split o Presplit lascio agganciata solo la pinza Y2 alla fine dei movimenti + local bSplitCut = ( EMT.MCHUSERNOTES:find( 'Split', 1, true) ~= nil) + local sNextTool = GetNextTool( EMT.MCHID) + local bToXhome = ( IsLastPath( EMT.PATHID) and not sNextTool) or ( EMT.HEAD == 'H13' and EMT.TOOL ~= sNextTool) + EmitZmax( true, true, bToXhome, EMT.R1p, EMT.R2p, bSplitCut) + -- aggiorno quota finale trave dopo Zmax + EMT.L1o = EMT.TPOS + EMT.ZMAX = true + -- se altrimenti movimento in Home + elseif EMT.FLAG == 4 then + -- non previsto + -- altrimenti errore + else + error( "Unknown Rapid flag") + end + -- aggiorno valori come precedenti + EMT.TPOS = EMT.L1o + EmtUpdatePrev() +end + +--------------------------------------------------------------------- +function OnLinear() + -- se necessario, impostazione riferimento locale + if EMT.REFLOC == 0 then + -- gruppo della testa + local nHSet = GetHeadSet( EMT.HEAD) + -- 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 + 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()) + -- 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 + local bDouHoleBott = ( EMT.MCHTYPE == MCH_MY.DRILLING and EMT.DOU_TYPE == 2 and EMT.FLAG == 101) + if bDouHoleBott then + EmtOutput( "G157 EE-1") + 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) + + -- se lavorazione in doppio e fondo foro, muovo punta 2 e poi ripristino movimento standard punta doppia + if bDouHoleBott then + if EMT.DOU_TYPE == 2 or EMT.DOU_TYPE == 3 then + local dZ = 2 * EMT.L3p - EMT.L3 + EmtOutput( "G1 Z" .. EgtNumToString( dZ, 3)) + EmtOutput( "G1 Z" .. EgtNumToString( EMT.L3p, 3)) + end + EmtOutput( "G157 EE1") + end + + -- aggiorno valori come precedenti + EMT.TPOS = EMT.L1o + EmtUpdatePrev() +end + +--------------------------------------------------------------------- +function OnArc() + -- 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 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 +end + +--------------------------------------------------------------------- +function CalcCharStatusN( sCmd) + -- aperto + if sCmd == '0' then + return 1 + -- chiuso + elseif sCmd == '1' then + return -1 + end +end + +--------------------------------------------------------------------- +function PrepareLoad( sCmd, nInd, bStart) + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + -- se inizio + if nInd == 1 then + -- imposto stato pinze + EMT.ISY1 = 1 + EMT.FSY1 = EMT.ISY1 + EMT.ISY2 = 1 + EMT.FSY2 = EMT.ISY2 + EMT.BV = 0 + end + -- se dichiarazione inizio riposizionamento carrelli + if Cmd[2] == 'CARR_MOVE' then + if bStart then + EMT.RELOAD = false + else + EMT.RELOAD2 = true + end + table.insert( EMT.MDCHAR, { Start=1}) + table.insert( EMT.MDCHAR, { Wait=1}) + --for i = 1, #EMT.MDCHAR do + -- EMT.MDCHAR[i].MovType = 3 + --end + 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 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 + if MoveY1 and EMT.V1POS > MoveY1 - MinDeltaYV - 0.1 then + MDChar.V1 = min( MoveY1 - MinDeltaYV, 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 + if MoveY1 and EMT.V1POS > MoveY1 - MinDeltaYV - 0.1 then + MDChar.V1 = min( MoveY1 - MinDeltaYV, 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 + if MoveY1 and EMT.V1POS > MoveY1 - MinDeltaYV - 0.1 then + MDChar.V1 = min( MoveY1 - MinDeltaYV, 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 + 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]) + elseif Cmd[1] == '23' then + EMT.W2DELTA = tonumber( Cmd[2]) + 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 + EMT.TO_ZMAX = true + if Cmd[2] == '1' then + EMT.TO_XHOME = true + 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=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=2} + EMT.V2POS = ParkV2 + 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 + MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=86, FinStatY1=87, IniStatY2=1, BeamVise=0} + elseif EMT.SPECSPLIT 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.V1POS = 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.V1POS = MDChar.V1 + MDChar.V2 = MaxV2 ; EMT.V2POS = 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.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, 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 + EMT.TO_ZMAX = true + if Cmd[2] == '1' then + EMT.TO_XHOME = true + 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 + 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 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 + for i = 1, #EMT.MDCHAR do + EMT.MDCHAR[i].MovType = 3 + end + 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( bUseCurrV1) + --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 = EgtIf( bUseCurrV1, EMT.V1POS, EMT.V1NEXTPOS) + 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( bUseCurrV2) + --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 = EgtIf( bUseCurrV2, EMT.V2POS, EMT.V2NEXTPOS) + 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 + end + end + return false +end + +--------------------------------------------------------------------- +function GetDiffRotAxAtStart( R1, R2) + local HomeR1 = EgtGetAxisHomePos( EgtIf( nHSet == 1, 'C1', 'C2')) + local PrevR1 = EMT.R1p or EMT.R1pp or HomeR1 + if not R1 or not PrevR1 or abs( R1 - PrevR1) > 0.1 then + return true + end + local HomeR2 = EgtGetAxisHomePos( EgtIf( nHSet == 1, 'B1', 'B2')) + local PrevR2 = EMT.R2p or EMT.R2pp or HomeR2 + if not R2 or not PrevR2 or abs( R2 - PrevR2) > 0.1 then + return true + 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' 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' 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 + else + EmtSetLastError( 1211, 'Head not defined ' .. ( EMT.HEAD or '')) + end + if EMT.HEAD == 'H11' or EMT.HEAD == 'H12' or EMT.HEAD == 'H13' 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 == '201' then + if not dAxR3 then dAxR3 = EMT.R3 end + 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 + 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 EMT.HEAD == 'H13' then + return EMT.TLEN, ( EMT.TDIST or ChSawLen) + 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 EMT.HEAD ~= 'H13' 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 GetFmaxClamp() + return EmtLenToString( EMT.FMAXPINZE, 0) +end + +--------------------------------------------------------------------- +function GetFall( nPathId) + local sVal = EgtGetInfo( nPathId, 'AE1') + return ( sVal == '0,Fall') +end + +--------------------------------------------------------------------- +function EmitZmax( bReset, bEnd, bXhome, PrevR1, PrevR2, bSplitCut, bUsePrevDelta) + if bReset then + EmitResetMachining() + end + -- gruppo della testa + local nHSet = GetHeadSet( EMT.HEAD) + -- se testa 1 + if nHSet == 1 then + -- posizioni sicure + local dMaxZ1 = EgtGetAxisMax( 'Z1') + local dSafeX1 = EgtGetAxisHomePos( 'X1') + local dSafeZ1 = EgtGetAxisHomePos( 'Z1') + local dSafeB1 = EgtGetAxisHomePos( 'B1') + local dSafeC1 = EgtGetAxisHomePos( 'C1') + -- se necessario allargo le cabine + if RollerParkingNeeded( EMT.HEAD, PrevR1, PrevR2, dSafeC1, dSafeB1) then + local dPosT = EgtIf( bEnd, EMT.L1o, EMT.TPOS or EMT.L1op) + EmitParkRoller( dPosT, bSplitCut, bUsePrevDelta) + end + -- se fresa o lama + if EMT.HEAD ~= 'H13' then + -- eseguo la salita a Z1max (oriento solo se assi rotanti non già a posto) + if abs( dSafeC1 - PrevR1) > 0.1 or abs( dSafeB1 - PrevR2) > 0.1 then + local dZref = dSafeZ1 + GetZExtra( EMT.HEAD, PrevR2) + if -EMT.L2o < -LimX1RotSaw then + dZref = dZref - EgtIf( not Mortiser, 100, 370) + end + dZref = min( dZref, dMaxZ1) + local MovH = { Z = EgtIf( dZref > EMT.L3o, dZref, EMT.L3o)} + MovH.X = -EMT.L2o ; MovH.B = EgtClamp( PrevR2, -90, 90) ; MovH.C = PrevR1 ; + EmitMoveDataHead( 1, MovH) + if EMT.HEAD == 'H12' and ( abs( dSafeC1 - PrevR1) > 30.1 or abs( dSafeB1 - PrevR2) > 30.1) then + EmitMoveDataHead( 1, { Z=dMaxZ1, B=0}) + end + EmitMoveDataHead( 1, { C=dSafeC1}) + EmitMoveDataHead( 1, { B=dSafeB1}) + EmitMoveDataHead( 1, { Z=dMaxZ1}) + else + local MovH = { Z = dMaxZ1} + MovH.X = -EMT.L2o ; MovH.B = PrevR2 ; MovH.C = PrevR1 ; + EmitMoveDataHead( 1, MovH) + end + if bXhome then EmitMoveDataHead( 1, { X=-dSafeX1}) end + EmitMoveStartHead( 1) + -- se lavorazione in doppio + if EMT.DOU_TYPE == 2 then + EmitDouZMax() + end + EmitMoveWaitHead( 1) + -- altrimenti sega a catena + else + EmitMoveDataHead( 1, { X=-EMT.L2o, Z=dSafeZ1, B=dSafeB1, C=PrevR1}) + EmitMoveDataHead( 1, { X=-dSafeX1, C=dSafeC1}) + if bXhome then + EmitMoveDataHead( 1, { X=-ParkX1, Z=ParkCSawZ1, B=ParkB1, C=ParkC1, TPos=50}) + end + EmitMoveStartHead( 1) + EmitMoveWaitHead( 1) + end + -- altrimenti testa 2 + else + -- posizioni sicure + local dMaxZ2 = EgtGetAxisMax( 'Z2') + local dSafeX2 = EgtGetAxisHomePos( 'X2') + local dSafeZ2 = EgtGetAxisHomePos( 'Z2') + local dSafeB2 = EgtGetAxisHomePos( 'B2') + local dSafeC2 = EgtGetAxisHomePos( 'C2') + -- se necessario allargo le cabine + if RollerParkingNeeded( EMT.HEAD, PrevR1, PrevR2, dSafeC2, dSafeB2) then + local dPosT = EgtIf( bEnd, EMT.L1o, EMT.TPOS or EMT.L1op) + EmitParkRoller( dPosT, bSplitCut, bUsePrevDelta) + end + -- se fresa o lama + if EMT.HEAD == 'H21' or EMT.HEAD == 'H22' then + -- eseguo la salita a Z2max (oriento solo se assi rotanti non già a posto) + if abs( dSafeC2 - PrevR1) > 0.1 or abs( dSafeB2 - PrevR2) > 0.1 then + local dZref = dSafeZ2 + GetZExtra( EMT.HEAD, PrevR2) + dZref = min( dZref, dMaxZ2) + local MovH = { Z = EgtIf( dZref > EMT.L3o, dZref, EMT.L3o)} + MovH.X = -EMT.L2o ; MovH.B = EgtClamp( PrevR2, -90, 90) ; MovH.C = PrevR1 ; + EmitMoveDataHead( 2, MovH) + if EMT.HEAD == 'H22' and ( abs( dSafeC2 - PrevR1) > 30.1 or abs( dSafeB2 - PrevR2) > 30.1) then + EmitMoveDataHead( 2, { Z=dMaxZ2, B=0}) + end + EmitMoveDataHead( 2, { C=dSafeC2}) + EmitMoveDataHead( 2, { B=dSafeB2}) + EmitMoveDataHead( 2, { Z=dMaxZ2}) + else + local MovH = { Z = dMaxZ2} + MovH.X = -EMT.L2o ; MovH.B = PrevR2 ; MovH.C = PrevR1 ; + EmitMoveDataHead( 2, MovH) + end + if bXhome then EmitMoveDataHead( 2, { X=-dSafeX2}) end + EmitMoveStartHead( 2) + EmitMoveWaitHead( 2) + -- altrimenti errore + else + EmtSetLastError( 1211, 'Head not defined ' .. ( EMT.HEAD or '')) + end + end +end + +--------------------------------------------------------------------- +function EmitDouZMax() + -- posizioni sicure + local dMaxZ2 = EgtGetAxisMax( 'Z2') + local dSafeX2 = EgtGetAxisHomePos( 'X2') + local dSafeZ2 = EgtGetAxisHomePos( 'Z2') + local dSafeB2 = EgtGetAxisHomePos( 'B2') + local dSafeC2 = EgtGetAxisHomePos( 'C2') + -- eseguo la salita a Z2max + local MovH = { Z = dSafeZ2, TPos=EMT.DOU_TPOS} + MovH.X = - ( Delta2TabY - EMT.DOU_TLEN - ( -DeltaTabY + EMT.L2o - EMT.TLEN - EMT.HB)) ; + MovH.B = -90 ; MovH.C = -180 ; + EmitMoveDataHead( 2, MovH) + EmitMoveDataHead( 2, { B=dSafeB2, C=dSafeC2, TPos=EMT.DOU_TPOS}) + EmitMoveDataHead( 2, { Z=dMaxZ2, TPos=EMT.DOU_TPOS}) + EmitMoveDataHead( 2, { X=-dSafeX2, TPos=EMT.DOU_TPOS}) + EmitMoveStartHead( 2) + EmitMoveWaitHead( 2) + -- dichiaro eseguito + EMT.DOU_TO_ZMAX = nil +end + +--------------------------------------------------------------------- +function EmitXhome() + -- gruppo della testa + local nHSet = GetHeadSet( EMT.HEAD) + -- se testa 1 + if nHSet == 1 then + local dMaxZ1 = EgtGetAxisMax( 'Z1') + local dSafeX1 = EgtGetAxisHomePos( 'X1') + local dSafeZ1 = EgtGetAxisHomePos( 'Z1') + local dSafeB1 = EgtGetAxisHomePos( 'B1') + local dSafeC1 = EgtGetAxisHomePos( 'C1') + if EMT.HEAD ~= 'H13' then + EmitMoveDataHead( 1, { X=-dSafeX1, Z=dMaxZ1, B=dSafeB1, C=dSafeC1}) + else + EmitMoveDataHead( 1, { X=-ParkX1, Z=ParkCSawZ1, B=ParkB1, C=ParkC1, TPos=50}) + end + EmitMoveStartHead( 1) + EmitMoveWaitHead( 1) + -- altrimenti testa 2 + else + local dMaxZ2 = EgtGetAxisMax( 'Z2') + local dSafeX2 = EgtGetAxisHomePos( 'X2') + local dSafeZ2 = EgtGetAxisHomePos( 'Z2') + local dSafeB2 = EgtGetAxisHomePos( 'B2') + local dSafeC2 = EgtGetAxisHomePos( 'C2') + EmitMoveDataHead( 2, { X=-dSafeX2, Z=dMaxZ2, B=dSafeB2, C=dSafeC2}) + EmitMoveStartHead( 2) + EmitMoveWaitHead( 2) + end +end + +--------------------------------------------------------------------- +function EmitResetMachining() + if EMT.TOOL ~= GetNextTool( EMT.MCHID) and IsLastPath( EMT.PATHID) then + EmtOutput( 'M05') + end + local sOut = 'G157 EA1' + EmtOutput( sOut) +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 + if DiffY1 > 0.1 then + MDChar.Y1 = dPosY1 + DiffY1 + end + if DiffY2 < -0.1 then + MDChar.Y2 = dPosY2 + DiffY2 + dPosT = dPosT + DiffY2 + end + 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 = ParkV1 - dPosT - EgtIf( bSplitCut or EMT.FALL, EMT.LT, 0) + if ( dPosT > ParkV2 - ExtraParkV and dPosT < ParkV1 and dPosY1 + dTryMoveY1 < MaxY1) then dMoveY1 = max( dMoveY1, dTryMoveY1) end + --EmtOutput( string.format( 'PosT=%.3f PosY1=%.3f V1POS=%.3f', dPosT, dPosY1, EMT.V1POS)) + 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 = ParkV2 - dPosT - EMT.LT + if ( dPosT + EMT.LT < ParkV1 + ExtraParkV and dPosT + EMT.LT > ParkV2 and dPosY2 + dTryMoveY2 > MinY2) then dMoveY2 = min( dMoveY2, dTryMoveY2) end + --EmtOutput( string.format( 'PosT=%.3f PosY2=%.3f V2POS=%.3f', dPosT, dPosY2, EMT.V2POS)) + 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 + +--------------------------------------------------------------------- +function PreselectNextDiffHead( nMchId, sHead) + -- 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 EMT.PREVHEAD ~= 'H13' then + EmitMoveDataHead( 2, { X=-ParkX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos='0'}) + EmitMoveStartHead( 2) + EmitMoveWaitHead( 2) + end + -- Emetto preselezione (non ammessa per sega a catena H13) + 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 + EmitMoveDataHead( 2, { X=-ParkX2, Z=MaxZ2, B=ParkB2, C=ParkC2, TPos='0'}) + EmitMoveStartHead( 2) + if EMT.PREVHEAD == 'H23' and EMT.PREVHEAD ~= EMT.HEAD then + EmitMoveWaitHead( 2) + end + else + -- va bene per frese e lama + EmitMoveDataHead( 1, { X=-ParkX1, Z=MaxZ1, B=ParkB1, C=ParkC1, TPos='0'}) + EmitMoveStartHead( 1) + 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 SmallVise 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 SmallVise 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, {C=ParkC1, TPos=0}) + EmitMoveDataHead( 1, {Z=-150, B=ParkB1, TPos=0}) + EmitMoveDataHead( 1, {Z=0, X=-ParkX1}) + EmitMoveStartHead( 1) + EmitMoveWaitHead( 1) + 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) + 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 *** +--------------------------------------------------------------------- diff --git a/Essetre-PF.mlpe b/Essetre-PF.mlpe new file mode 100644 index 0000000..ef13e93 --- /dev/null +++ b/Essetre-PF.mlpe @@ -0,0 +1,2341 @@ +-- Processore macchina Essetre-PFrl by EgalTech s.r.l. 2023/02/02 +-- Funzioni generiche indipendenti dal controllo + +-- Intestazioni +require( 'EmtGenerator') +EgtEnableDebug( false) + +--------------------------------------------------------------------- +-- *** GENERATION *** +--------------------------------------------------------------------- +local sBaseDir = EgtGetSourceDir() +if NumericalControl == 'NUM' or NumericalControl == 'NUM_FLEX' then + dofile( sBaseDir .. 'Essetre-PF.NUM.mlpe') +elseif NumericalControl == 'TPA' then + error( 'Numerical Control error : TPA not yet managed') +else + error( 'Numerical Control error : unkwnown type') +end + +--------------------------------------------------------------------- +-- *** SIMULATION *** +--------------------------------------------------------------------- +local COLL_SAFE_DIST = 4 + +--------------------------------------------------------------------- +function OnSimulStart() + -- controllo versione programma + if not EMT.VER or EMT.VER < '2.5a2' then + EmtSetLastError( 1200, 'A newer version of the program is required (minimum 2.5a2)') + end + -- Carico gli utensili sulle barre portautensili + local vTcPos = EgtGetAllTcPosNames() + if vTcPos then + for i = 1, #vTcPos do + local vTools = EgtGetToolsInCurrSetupPos( vTcPos[i]) + if vTools and vTools[1] and #(vTools[1]) > 0 then + EgtLoadTool( vTcPos[i], 1, vTools[1]) + ShowToolInTcPos( vTcPos[i], true) + end + end + end + -- Carico gli utensili iniziali o di default sulle due teste + LoadFirstTool( 1, DefTcPos1) + LoadFirstTool( 2, DefTcPos2) + ExecStartHome() + -- Se reset o home, esco + if EMT.SIM1ST then return end + -- Creo o svuoto gruppo per copia finale degli oggetti virtual milling + local nVmGrpId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill') + if nVmGrpId then + EgtSetStatus( nVmGrpId, GDB_ST.ON) + EgtEmptyGroup( nVmGrpId) + else + nVmGrpId = EgtGroup( GDB_ID.ROOT) + EgtSetName( nVmGrpId, 'VMill') + EgtSetLevel( nVmGrpId, GDB_LV.TEMP) + end + -- Preparo lista oggetti da verificare per collisioni + EMT.COLLOBJ = {} + AddToCollisionCheck( 'Z1', 'COLLISION', EMT.COLLOBJ) + AddToCollisionCheck( 'C1', 'COLLISION', EMT.COLLOBJ) + AddToCollisionCheck( 'B1', 'COLLISION', EMT.COLLOBJ) + AddToCollisionCheck( 'Z2', 'COLLISION', EMT.COLLOBJ) + AddToCollisionCheck( 'C2', 'COLLISION', EMT.COLLOBJ) + AddToCollisionCheck( 'B2', 'COLLISION', EMT.COLLOBJ) + DumpCollisionCheck( EMT.COLLOBJ, 'Collision Objects :', 4) + -- Preparo lista solidi macchina con cui possono collidere gli oggetti sopra riportati (in aggiunta a VMill) + EMT.MCODET = {} + local McdData = { { Grp = 'V1', Sub = 'COLLISION', Name = 'STM'}, + { Grp = 'V2', Sub = 'COLLISION', Name = 'STM'}, + { Grp = 'Base', Sub = 'COLLISION', Name = 'TRAV'}, + { Grp = 'Base', Sub = 'COLLISION', Name = 'COL1'}, + { Grp = 'Base', Sub = 'COLLISION', Name = 'COL2'}, + { Grp = 'Base', Sub = 'COLLISION', Name = 'CHSAW'}, + { Grp = 'Base', Sub = 'BELT', Name = 'COLLISION'}} + if Mortiser then + table.insert( McdData, { Grp = 'Base', Sub = 'COLLISION', Name = 'MORTISER'}) + end + if Clamp5 then + table.insert( McdData, { Grp = 'W', Sub = 'COLLISION', Name = 'STM1'}) + table.insert( McdData, { Grp = 'W', Sub = 'COLLISION', Name = 'STM2'}) + table.insert( McdData, { Grp = 'W', Sub = 'COLLISION', Name = 'STM3'}) + table.insert( McdData, { Grp = 'QW', Sub = 'COLLISION', Name = 'STM1'}) + table.insert( McdData, { Grp = 'QW', Sub = 'COLLISION', Name = 'STM2'}) + end + EgtOutLog( 'MCODET Objects :', 4) + local nMcdNullCnt = 0 + for i = 1, #McdData do + local nGrpId + if McdData[i].Grp == 'Base' then + nGrpId = EgtGetBaseId( 'Base') + else + nGrpId = EgtGetAxisId( McdData[i].Grp) + end + local nId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( nGrpId, McdData[i].Sub), McdData[i].Name) + if nId then + table.insert( EMT.MCODET, nId) + EgtOutLog( 'Element ' .. McdData[i].Grp .. '/' .. McdData[i].Sub .. '/' .. McdData[i].Name .. ' is ok', 4) + else + nMcdNullCnt = nMcdNullCnt + 1 + EgtOutLog( 'Element ' .. McdData[i].Grp .. '/' .. McdData[i].Sub .. '/' .. McdData[i].Name .. ' is null', 4) + end + end + if nMcdNullCnt > 0 then + EgtOutLog( 'Warning : MCODET with one or more null Element(s) ') + end + -- Preparo lista collisioni vuota + EMT.COLLIDE = {} +end + +--------------------------------------------------------------------- +function OnSimulEnd() + EMT.Y1DELTA = nil + EMT.Y2DELTA = nil + ExecParkRoller() + ExecStartHome() +end + +--------------------------------------------------------------------- +function OnSimulDispositionStarting() + EmtUnlinkAllRawPartsFromGroups() + if EMT.PHASE > 1 then + if IsStartOrRestPhase( EMT.PHASE) then + local ParkT = GetParkT() + EgtSetAxisPos( 'T', ParkT) + end + end +end + +--------------------------------------------------------------------- +function OnSimulDispositionStart() + EMT.OPEISDISP = true + + -- Se prima disposizione + if EMT.PHASE == 1 then + -- Determino sezione del grezzo + local nSolId = EgtGetFirstNameInGroup( EgtGetFirstRawPart() or GDB_ID.NULL, 'RawSolid') or GDB_ID.NULL + local b3Sol = EgtGetBBoxGlob( nSolId, GDB_BB.STANDARD) + EMT.HB = 0 + EMT.SB = 0 + if b3Sol then + EMT.HB = b3Sol:getDimY() + EMT.SB = b3Sol:getDimZ() + end + -- Se vero inizio e abilitato creo gli Zmap + EMT.VMILL = {} + if not EMT.SIM1ST and EgtGetInfo( EgtGetCurrMachGroup(), 'Vm', 'b') then + local nLastOrd = GetPhaseOrd( EgtGetPhaseCount()) + local nPartRawId = EgtGetFirstRawPart() + while nPartRawId do + -- se è lo scarto finale tagliato a pezzi, esco + local nRawOrd = EgtGetInfo( nPartRawId, 'ORD', 'i') + if nRawOrd == nLastOrd + 1 then break end + -- elimino eventuale vecchio Zmap + EgtErase( EgtGetFirstNameInGroup( nPartRawId, 'VMill') or GDB_ID.NULL) + -- recupero il solido + local nSolId = EgtGetFirstNameInGroup( nPartRawId, 'RawSolid') + local b3Raw = EgtGetBBoxGlob( nSolId, GDB_BB.STANDARD) + -- aggiungo eventuale scrap successivo + if nRawOrd == nLastOrd then + local nScrapId = EgtGetNextRawPart( nPartRawId) + if nScrapId then + local nScrapSolId = EgtGetFirstNameInGroup( nScrapId, 'RawSolid') + local b3ScrapRaw = EgtGetBBoxGlob( nScrapSolId, GDB_BB.STANDARD) + if b3ScrapRaw then + b3Raw:Add( b3ScrapRaw) + end + end + end + -- determino la risoluzione dello Zmap + local dArea = b3Raw:getDimX() * b3Raw:getDimY() + b3Raw:getDimX() * b3Raw:getDimZ() + b3Raw:getDimY() * b3Raw:getDimZ() + local dTol = 4.51 + if dArea < CoeffVM * 0.5e6 then + dTol = 1.01 + elseif dArea < CoeffVM * 1.2e6 then + dTol = 1.51 + elseif dArea < CoeffVM * 2.5e6 then + dTol = 1.97 + elseif dArea < CoeffVM * 5.0e6 then + dTol = 2.81 + elseif dArea < CoeffVM * 10.0e6 then + dTol = 3.77 + end + -- creo lo Zmap + local VMillId = EgtVolZmapBox( nPartRawId, b3Raw:getMin(), b3Raw:getDimX(), b3Raw:getDimY(), b3Raw:getDimZ(), dTol, true, GDB_RT.GLOB) + if VMillId then + EgtSetName( VMillId, 'VMill') + EgtSetLevel( VMillId, GDB_LV.TEMP) + EgtSetColor( VMillId, EgtGetColor( nSolId), false) + -- nascondo le altre geometrie + local nId = EgtGetFirstInGroup( nPartRawId) + while nId do + if nId ~= VMillId then + EgtSetStatus( nId, GDB_ST.OFF) + end + nId = EgtGetNext( nId) + end + table.insert( EMT.VMILL, VMillId) + end + nPartRawId = EgtGetNextRawPart( nPartRawId) + end + -- imposto eventuale utensile corrente + SetToolForVmill( EMT.TOOL, EMT.HEAD, EMT.EXIT, EMT.VMILL) + end + end + + -- Nascondo tutte le lavorazioni + local nMchId = EgtGetFirstOperation() + while nMchId do + if EgtGetOperationType( nMchId) ~= MCH_OY.DISP then + EgtSetOperationStatus( nMchId, false) + end + nMchId = EgtGetNextOperation( nMchId) + end + + -- Se fase inizio o rimanenza, aggancio grezzi della fase alla tavola + if IsStartOrRestPhase( EMT.PHASE) then + -- se fase inizio, segnalo giacitura del grezzo + if IsStartPhase( EMT.PHASE) then + local nRot = GetPhaseRot( EMT.PHASE) + if nRot ~= 0 then + EgtOutText( 'Barra ruotata di ' .. tostring( -90 * nRot) .. '°') + else + EgtOutText( 'Barra non ruotata') + end + end + -- indice primo grezzo della fase + local nOrd = GetPhaseOrd( EMT.PHASE) + local nScrapOrd = GetPhaseOrd( EgtGetPhaseCount()) + 1 + local b3Part = BBox3d() + local b3Raw = BBox3d() + local b3Bar = BBox3d() + local nPartRawId, nScrapRawId + local nRawId = EgtGetFirstRawPart() + while nRawId do + local nNextRawId = EgtGetNextRawPart( nRawId) + if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then + EmtLinkRawPartToGroup( nRawId, 'Tab') + local b3Tmp = EgtGetRawPartBBox( nRawId) + b3Bar:Add( b3Tmp) + local nRawOrd = EgtGetInfo( nRawId, 'ORD', 'i') + if nRawOrd == nOrd then + b3Part:Add( b3Tmp) + b3Raw:Add( b3Tmp) + nPartRawId = nRawId + elseif nRawOrd == nOrd + 1 and nRawOrd == nScrapOrd then + b3Raw:Add( b3Tmp) + nScrapRawId = nRawId + end + end + nRawId = nNextRawId + end + -- gestione eventuale scarto affettato successivo + if EMT.VMILL and #EMT.VMILL > 0 then + EMT.SCRAP = nScrapRawId + EgtSetStatus( EMT.SCRAP or GDB_ID.NULL, GDB_ST.OFF) + else + EMT.SCRAP = nil + end + EMT.LB = b3Bar:getDimX() + EMT.LT = b3Raw:getDimX() + EMT.LP = b3Part:getDimX() + EMT.CUTID = EgtGetInfo( EgtGetFirstPartInRawPart( nPartRawId or GDB_ID.NULL) or GDB_ID.NULL, 'CUTID', 'i') or 0 + EMT.Y1SPEC = nil + -- se vero inizio, assegno solidi per verifica collisione + if not EMT.SIM1ST then + EMT.CODET = {} + for i = 1, #EMT.MCODET do + EMT.CODET[i] = EMT.MCODET[i] + end + for i = 1, #( EMT.VMILL or {}) do + table.insert( EMT.CODET, EMT.VMILL[i]) + end + end + -- se altrimenti fase intermedia, aggancio grezzi della fase alla tavola + elseif IsMidPhase( EMT.PHASE) then + -- se cambiata giacitura, lo segnalo + local nPrevRot = GetPhaseRot( EMT.PHASE - 1) + local nRot = GetPhaseRot( EMT.PHASE) + if nRot ~= nPrevRot then + if nRot ~= 0 then + EgtOutText( 'Barra ruotata di ' .. tostring( -90 * nRot) .. '°') + else + EgtOutText( 'Barra non ruotata') + end + end + -- eseguo aggancio + local nRawId = EgtGetFirstRawPart() + while nRawId do + local nNextRawId = EgtGetNextRawPart( nRawId) + if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then + EmtLinkRawPartToGroup( nRawId, 'Tab') + end + nRawId = nNextRawId + end + -- se Vmill, nascondo eventuale scrap + if EMT.VMILL and #EMT.VMILL > 0 then + EgtSetStatus( EMT.SCRAP or GDB_ID.NULL, GDB_ST.OFF) + end + + -- se altrimenti fasi intermedia o finale speciali, aggancio primo grezzo alla tavola e gli altri in posizione pre-carico + elseif IsMid2Phase( EMT.PHASE) or IsEnd2Phase( EMT.PHASE) then + -- se cambiata giacitura, lo segnalo + local nPrevRot = GetPhaseRot( EMT.PHASE - 1) + local nRot = GetPhaseRot( EMT.PHASE) + if nRot ~= nPrevRot then + if nRot ~= 0 then + EgtOutText( 'Barra ruotata di ' .. tostring( -90 * nRot) .. '°') + else + EgtOutText( 'Barra non ruotata') + end + end + -- verifico posizione di carico + local ParkT = GetParkT() + -- indice primo grezzo della fase + local nOrd = GetPhaseOrd( EMT.PHASE) + -- ricerco vettore movimento per i successivi + local vtMove = Vector3d() + local nRawId = EgtGetFirstRawPart() + while nRawId do + if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd + 1 then + vtMove = Vector3d( - ParkT - EgtGetRawPartBBox( nRawId):getMax():getX(), 0, 0) + break + end + nRawId = EgtGetNextRawPart( nRawId) + end + -- eseguo + local b3Bar = BBox3d() + nRawId = EgtGetFirstRawPart() + while nRawId do + local nNextRawId = EgtGetNextRawPart( nRawId) + if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then + if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then + EmtLinkRawPartToGroup( nRawId, 'Tab') + b3Bar = EgtGetRawPartBBox( nRawId) + else + EgtMove( nRawId, vtMove, GDB_RT.GLOB) + EgtSetStatus( nRawId, GDB_ST.OFF) + end + end + nRawId = nNextRawId + end + EMT.LB = b3Bar:getDimX() + + -- altrimenti fase finale, aggancio primo grezzo alla tavola e gli altri in posizione carico al carro Y + else + -- verifico posizione di carico + local ParkT = GetParkT() + -- indice primo grezzo della fase + local nOrd = GetPhaseOrd( EMT.PHASE) + -- ricerco vettore movimento per i successivi + local vtMove = Vector3d() + local nRawId = EgtGetFirstRawPart() + while nRawId do + if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd + 1 then + vtMove = Vector3d( - ParkT - EgtGetRawPartBBox( nRawId):getMax():getX(), 0, 0) + break + end + nRawId = EgtGetNextRawPart( nRawId) + end + -- eseguo + local b3Bar = BBox3d() + nRawId = EgtGetFirstRawPart() + while nRawId do + local nNextRawId = EgtGetNextRawPart( nRawId) + if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then + if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then + EmtLinkRawPartToGroup( nRawId, 'Tab') + b3Bar = EgtGetRawPartBBox( nRawId) + else + EgtMove( nRawId, vtMove, GDB_RT.GLOB) + EmtLinkRawPartToGroup( nRawId, 'Y1') + end + end + nRawId = nNextRawId + end + EMT.LB = b3Bar:getDimX() + end + -- Indicazione angolo rotazione pezzo + EMT.ROT = EgtGetInfo( EMT.DISPID, 'ROT', 'i') or 0 + local SignId = EgtGetFirstNameInGroup( EgtGetBaseId( 'Base'), 'SIGN') + EgtSetStatus( EgtGetFirstNameInGroup( SignId, '0'), EgtIf( EMT.ROT == 0, GDB_ST.ON, GDB_ST.OFF)) + EgtSetStatus( EgtGetFirstNameInGroup( SignId, '90'), EgtIf( EMT.ROT == -1, GDB_ST.ON, GDB_ST.OFF)) + EgtSetStatus( EgtGetFirstNameInGroup( SignId, '180'), EgtIf( EMT.ROT == -2, GDB_ST.ON, GDB_ST.OFF)) +end + +--------------------------------------------------------------------- +function OnSimulDispositionEnd() + if EMT.UNLOADING or EMT.FALL then + ExecUnloading() + EMT.UNLOADING = false + EMT.FALL = false + EMT.TO_FALL = false + end + EMT.SPLIT = false + EMT.SPECSPLIT = false + EMT.TO_SPECSPLIT = false + EMT.OPEISDISP = false +end + +--------------------------------------------------------------------- +function OnSimulToolSelect( dPosA) + -- se utensile non definito, è disposizione ed esco + if EMT.TOOL == '' then return end + -- recupero dati utensile + EMT.TOOLTYPE = EgtTdbGetCurrToolParam( MCH_TP.TYPE) + EMT.TLEN = EgtTdbGetCurrToolParam( MCH_TP.LEN) + EMT.TTOTLEN = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) + EMT.TUSERNOTES = EgtTdbGetCurrToolParam( MCH_TP.USERNOTES) + local nSetHead = GetHeadSet( EMT.HEAD) + -- verifico che l'altra sia dalla parte opposta + if nSetHead == 1 then + EgtSetAxisPos( 'X2', MinX2) + else + EgtSetAxisPos( 'X1', MaxX1) + end + -- se sega a catena, imposto subito angolo scelto per asse virtuale A + if EMT.HEAD == 'H13' then + -- valore dell'asse virtuale + dPosA = dPosA or GetNextChainSawingVirtualAxis( EMT.MCHID) + -- imposto il valore di A + EgtSetAxisPos( 'A', dPosA) + -- imposto home dell'asse C1 (A=0 -> T101, A=-90 -> T102) + local MyParkCSawC1 = GetChainSawCHomeFromVirtualAxis( dPosA) + EmtModifyAxisHome( 'C1', MyParkCSawC1) + EgtSetAxisPos( 'C1', MyParkCSawC1) + EgtSetAxisPos( 'B1', ParkCSawB1) + EgtSetAxisPos( 'X1', ParkCSawX1) + -- Imposto visualizzazione + EgtSetMode( EgtGetHeadId( EMT.HEAD) or GDB_ID.NULL, GDB_MD.STD) + end + -- carico utensile, con breve pausa + EgtPause( 100) + EgtOutText( '') + -- lo nascondo sul portautensili + ShowToolInTcPos( EMT.TCPOS, false) + -- dichiaro assi ausiliari da visualizzare + EMT.AuxAxes = 4 + EMT.A1n = 'Y1' + EMT.A2n = 'Y2' + EMT.A3n = 'V1' + EMT.A4n = 'V2' + -- se attivo Vmill + SetToolForVmill( EMT.TOOL, EMT.HEAD, EMT.EXIT, EMT.VMILL) + -- se attivo Collision Check + EMT.SAFEDIST = COLL_SAFE_DIST + if EMT.COLLOBJ then + local nInd = EgtIf( EMT.HEAD ~= 'H21', 1001, 1011) + AddToolToCollisionObj( EMT.TOOL, EMT.HEAD, EMT.EXIT, nInd) + AddToolHolderToCollisionObj( EMT.TOOL, EMT.HEAD, EMT.EXIT, nInd + 1) + for i, Coll in ipairs( EMT.COLLOBJ or {}) do + EmtAddCollisionObjEx( i, Coll.Fr, Coll.Ty, Coll.Mv, Coll.P1, Coll.P2, Coll.P3) + end + end + -- salvataggio dati utensile rimandato a OnMachiningStart +end + +--------------------------------------------------------------------- +function OnSimulToolDeselect( dPrevA) + -- se prossimo utensile dummy, non faccio alcunché + if EMT.NEXTHEAD == 'H14' then return end + -- se utensile corrente è sega a catena, devo depositarla + if EMT.HEAD == 'H13' then + -- simulo movimento + SimulMoveAxis( 'X1', ParkCSawX1, MCH_SIM_STEP.RAPID) + local dMyParkC = EgtGetAxisHomePos( 'C1') + if dPrevA then dMyParkC = GetChainSawCHomeFromVirtualAxis( dPrevA) end + SimulMoveAxes( 'B1', ParkCSawB1, MCH_SIM_STEP.RAPROT, 'C1', dMyParkC, MCH_SIM_STEP.RAPROT) + -- visualizzo utensile su TcPos + ShowToolInTcPos( EMT.PREVTCPOS_H1, true) + -- nascondo l'utensile sulla testa + EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H1 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) + -- se non è chiamata per cambio angolo di presa della sega a catena + if not dPrevA then + -- cambio utensile + EgtSetAxisPos( 'C1', ParkC1) + EgtSetAxisPos( 'B1', ParkB1) + EgtSetAxisPos( 'Z1', MaxZ1) + SimulMoveAxis( 'X1', ParkX1, MCH_SIM_STEP.RAPID) + LoadNextTool( 1, DefTcPos1) + end + end + -- se utensile non cambia e non è sega a catena, esco + if ( EMT.NEXTTOOL == EMT.PREVTOOL_H1 or EMT.NEXTTOOL == EMT.PREVTOOL_H2) and EMT.NEXTHEAD ~= 'H13' then return end + -- deposito utensile + EgtOutText( 'Tool change in progress...') + -- se prossimo utensile sega a catena, devo mettere in home testa 2 e depositare l'utensile sulla testa 1 + if EMT.NEXTHEAD == 'H13' then + -- porto in home testa 2 + SimulMoveAxis( 'X2', MinX2, MCH_SIM_STEP.RAPID) + -- deposito utensile fresa + if EMT.PREVHEAD_H1 == 'H11' then + -- simulo movimento + SimulMoveAxes( 'B1', ParkB1, MCH_SIM_STEP.RAPROT, 'C1', ParkC1, MCH_SIM_STEP.RAPROT) + SimulMoveAxis( 'X1', ParkX1, MCH_SIM_STEP.RAPID) + -- deposito utensile lama + elseif EMT.PREVHEAD_H1 == 'H12' then + -- simulo movimento + SimulMoveAxes( 'B1', ParkB1, MCH_SIM_STEP.RAPROT, 'C1', ParkC1, MCH_SIM_STEP.RAPROT) + SimulMoveAxis( 'X1', ParkX1, MCH_SIM_STEP.RAPID) + -- deposito utensile sega a catena + elseif EMT.PREVHEAD_H1 == 'H13' then + -- già depositata + end + -- visualizzo utensile su TcPos + ShowToolInTcPos( EMT.PREVTCPOS_H1, true) + -- nascondo l'utensile sulla testa + EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H1 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) + -- breve pausa + EgtPause( 100) + end + -- recupero il prossimo gruppo + local nNextSetHead = GetHeadSet( EMT.NEXTHEAD) + -- per prossima testa gruppo 2 + if nNextSetHead == 2 then + -- visualizzo utensile su TcPos + ShowToolInTcPos( EMT.PREVTCPOS_H2, true) + -- nascondo l'utensile sulla testa + EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H2 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) + -- prendo utensile fresa + if EMT.NEXTHEAD == 'H21' then + -- simulo movimento + SimulMoveAxes( 'B2', ParkB2, MCH_SIM_STEP.RAPROT, 'C2', ParkC2, MCH_SIM_STEP.RAPROT) + SimulMoveAxis( 'X2', ParkX2, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'Z2', MaxZ2, MCH_SIM_STEP.RAPID) + -- prendo utensile lama + elseif EMT.NEXTHEAD == 'H22' then + -- simulo movimento + SimulMoveAxes( 'B2', ParkB2, MCH_SIM_STEP.RAPROT, 'C2', ParkC2, MCH_SIM_STEP.RAPROT) + SimulMoveAxis( 'X2', ParkX2, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'Z2', MaxZ2, MCH_SIM_STEP.RAPID) + end + -- per prossima testa gruppo 1 + else + -- visualizzo utensile su TcPos + ShowToolInTcPos( EMT.PREVTCPOS_H1, true) + -- nascondo l'utensile sulla testa + EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H1 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) + -- prendo utensile fresa + if EMT.NEXTHEAD == 'H11' then + -- simulo movimento + SimulMoveAxes( 'B1', ParkB1, MCH_SIM_STEP.RAPROT, 'C1', ParkC1, MCH_SIM_STEP.RAPROT) + SimulMoveAxis( 'X1', ParkX1, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'Z1', MaxZ1, MCH_SIM_STEP.RAPID) + -- prendo utensile lama + elseif EMT.NEXTHEAD == 'H12' then + -- simulo movimento + SimulMoveAxes( 'B1', ParkB1, MCH_SIM_STEP.RAPROT, 'C1', ParkC1, MCH_SIM_STEP.RAPROT) + SimulMoveAxis( 'X1', ParkX1, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'Z1', MaxZ1, MCH_SIM_STEP.RAPID) + -- prendo utensile sega a catena + elseif EMT.NEXTHEAD == 'H13' then + -- simulo movimento + SimulMoveAxes( 'B1', ParkCSawB1, MCH_SIM_STEP.RAPROT, 'C1', ParkCSawC1, MCH_SIM_STEP.RAPROT) + SimulMoveAxis( 'X1', ParkCSawX1, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'Z1', ParkCSawZ1, MCH_SIM_STEP.RAPID) + end + end +end + +--------------------------------------------------------------------- +function OnSimulMachiningStart() + -- se lavorazione attuale e precedente con sega a catena con angolo A diverso, devo scaricare e ricaricare + if EMT.HEAD == 'H13' and EMT.HEAD == EMT.PREVHEAD_H1 and EMT.TCPOS == EMT.PREVTCPOS_H1 then + local dPrevA = EgtGetAxisPos( 'A') + local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS) + local dPosA = tonumber( sVal:sub( 3)) + if abs( dPosA - dPrevA) > 1 then + OnSimulToolDeselect( dPrevA) + EgtSetStatus( EgtGetHeadId( EMT.HEAD), GDB_ST.ON) + OnSimulToolSelect( dPosA) + end + end + -- salvo dati utensile + local nSetHead = GetHeadSet( EMT.HEAD) + -- per gruppo testa 1 + if nSetHead == 1 then + EMT.PREVTOOL_H1 = EMT.TOOL + EMT.PREVHEAD_H1 = EMT.HEAD + EMT.PREVTCPOS_H1 = EMT.TCPOS + -- per gruppo testa 2 + elseif nSetHead == 2 then + EMT.PREVTOOL_H2 = EMT.TOOL + EMT.PREVHEAD_H2 = EMT.HEAD + EMT.PREVTCPOS_H2 = EMT.TCPOS + end + -- recupero alcuni dati della lavorazione + EMT.MCHNAME = EgtGetOperationName( EMT.MCHID) + EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE) + EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' + EMT.VMRS = ( EMT.MCHTYPE ~= MCH_MY.DRILLING and not EMT.MCHUSERNOTES:find( 'VMRS=0;', 1, true)) + EMT.MCHSPLIT = ( EMT.MCHUSERNOTES:find( 'Split;', 1, true) ~= nil) + -- recupero TASKID della feature lavorata + local vId = EgtGetMachiningGeometry() + if vId and #vId > 0 and #vId[1] > 0 then + EMT.TASKID = EgtGetInfo( vId[1][1], 'TASKID', 'i') or 0 ; + else + EMT.TASKID = 0 + end + -- gestione eventuale lavorazione in doppio + local nDouType = EgtGetValInNotes( EMT.MCHUSERNOTES, 'DOUBLE', 'i') + if nDouType == 2 then + local sDouTool = EgtGetValInNotes( EMT.TUSERNOTES, 'DOUBLE', 's') or '' + local sOldTool = EgtTdbGetCurrToolParam( MCH_TP.NAME) + if EgtTdbSetCurrTool( sDouTool) and EgtTdbGetCurrToolParam( MCH_TP.ACTIVE) then + local sDouHead = 'H21' + local nDouExit = 1 + -- carico l'utensile sulla testa + local sTcPos = EgtTdbGetCurrToolParam( MCH_TP.TCPOS) + EgtLoadTool( sDouHead, nDouExit, sDouTool) + ShowToolInTcPos( sTcPos, false) + -- dichiaro utensile per Vmill + EmtAddToolForVmill( sDouTool, sDouHead, nDouExit, EMT.VMILL) + -- dichiaro utensile per verifica collisioni + local nInd = 1011 + AddToolToCollisionObj( sDouTool, sDouHead, nDouExit, nInd, true) + AddToolHolderToCollisionObj( sDouTool, sDouHead, nDouExit, nInd + 1) + -- salvo dati + EMT.DOU_TLEN = EgtTdbGetCurrToolParam( MCH_TP.LEN) + EMT.DOU_TTOTLEN = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN) + EMT.DOU_TYPE = nDouType + EMT.DOU_TOOL = sDouTool + -- reset necessità movimento in sicurezza sola testa in doppio + EMT.DOU_TO_ZMAX = nil + else + EmtSetLastError( 1211, 'Missing or not active double tool of '..sOldTool) + end + EgtTdbSetCurrTool( sOldTool) + end + -- se precedente in doppio ma ora solo testa 1 e non in sicurezza + if EMT.DOU_TO_ZMAX then + -- parcheggio i rulli + ExecParkRoller( nil, nil, nil, nil, false, true) + SimulMoveAxes( 'Z2', ParkZ2, MCH_SIM_STEP.RAPID) + SimulMoveAxes( 'B2', ParkB2, MCH_SIM_STEP.COLLROT, 'C2', ParkC2, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'Z2', MaxZ2, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'X2', ParkX2, MCH_SIM_STEP.RAPID) + EMT.DOU_TO_ZMAX = nil + end + -- non ancora iniziata la lavorazione + EMT.MCHFIRST = true +end + +--------------------------------------------------------------------- +function OnSimulMachiningEnd() + if EMT.UNLOADING or EMT.FALL then + ExecUnloading() + EMT.UNLOADING = false + EMT.FALL = false + EMT.TO_FALL = false + end + EMT.MCHSPLIT = nil + EMT.SPLIT = nil + EMT.SPECSPLIT = nil + EMT.TO_SPECSPLIT = nil + if EMT.DOU_TYPE and not EMT.ZMAX then EMT.DOU_TO_ZMAX = true end + EMT.DOU_TYPE = nil + EMT.DOU_TOOL = nil +end + +--------------------------------------------------------------------- +function OnSimulPathStart() + -- 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 +end + +--------------------------------------------------------------------- +function OnSimulPathEnd() + -- rimozione sfridi + RemoveScraps() + -- se non ci sono comandi ausiliari associati e richiesta risalita a Zmax + if EMT.AUXTOT == 0 and EMT.TO_ZMAX then + if EMT.MCHSPLIT and not EMT.TO_FALL and not EMT.TO_SPECSPLIT then + EMT.SPLIT_Y1DELTA = EMT.Y1DELTA + EMT.Y1DELTA = nil + SetPY1Light( false) + end + ExecMoveZmax( EMT.MCHSPLIT) + EMT.TO_ZMAX = nil + end +end + +--------------------------------------------------------------------- +function OnSimulPathStartAux() + -- eseguo il comando + ExecAuxCmd( EMT.AUX) + -- se ultimo comando e lavorazione di split, sgancio il carro Y1 + if EMT.AUXIND == EMT.AUXTOT and EMT.MCHSPLIT and not EMT.TO_SPECSPLIT and not EMT.TO_FALL then + EMT.SPLIT_Y1DELTA = EMT.Y1DELTA + EMT.Y1DELTA = nil + SetPY1Light( false) + end +end + +--------------------------------------------------------------------- +function OnSimulPathEndAux() + -- eseguo il comando + ExecAuxCmd( EMT.AUX) + -- se ultimo comando e richiesta risalita a Zmax + if EMT.AUXIND == EMT.AUXTOT and EMT.TO_ZMAX then + ExecMoveZmax( EMT.MCHSPLIT) + EMT.TO_ZMAX = nil + end +end + +--------------------------------------------------------------------- +function OnSimulMoveStart() + if EMT.MCHFIRST then EgtOutText( '') end + -- set della testa + local nSetHead = GetHeadSet( EMT.HEAD) + -- Posizioni correnti + local Y1Pos = EgtGetAxisPos( 'Y1') + local Y2Pos = EgtGetAxisPos( 'Y2') + local V1Pos = EgtGetAxisPos( 'V1') + local V2Pos = EgtGetAxisPos( 'V2') + -- Imposto movimento pinze e rulli insieme con la tavola : + EMT.AuxAxes = EgtIf( EMT.W2DELTA, 5, 4) + -- pinze + EMT.A1n = 'Y1' + if EMT.Y1DELTA then + EMT.A1m = 'T' + EMT.A1 = EMT.L1 + EMT.Y1DELTA + else + EMT.A1m = nil + EMT.A1 = EgtIf( EMT.Y1SPEC, Y1Pos, ParkY1) + end + EMT.A2n = 'Y2' + if EMT.Y2DELTA then + EMT.A2m = 'T' + EMT.A2 = EMT.L1 + EMT.Y2DELTA + else + EMT.A2m = nil + EMT.A2 = ParkY2 + end + -- rulli + EMT.A3n = 'V1' + EMT.A3 = EgtIf( GetV1ToClose(), EMT.V1NEXTPOS, ParkV1) + EMT.A4n = 'V2' + EMT.A4 = EgtIf( GetV2ToClose(), EMT.V2NEXTPOS, ParkV2) + local bParkV = false + if EMT.MCHFIRST then + -- se rulli più chiusi del richiesto o cambio direzione utensile (tranne solo asse B con C0 o equivalenti) devo mettere i rulli in parcheggio + if V1Pos < EMT.V1NEXTPOS - 1 or V2Pos > EMT.V2NEXTPOS + 1 or RollerParkingNeeded( EMT.HEAD, EMT.R1p, EMT.R2p, EMT.R1, EMT.R2) then + bParkV = true + EMT.A3 = ParkV1 + EMT.A4 = ParkV2 + end + end + -- pinza 5 + if EMT.W2DELTA then + EMT.A5n = 'W' + EMT.A5m = 'T' + EMT.A5 = EMT.L1 + EMT.W2DELTA - EMT.A4 + VerifyWStroke( EMT.A5) + end + -- Controllo corse assi ausiliari + VerifyY1Stroke( EMT.A1) + VerifyY2Stroke( EMT.A2) + VerifyV1Stroke( EMT.A3) + VerifyV2Stroke( EMT.A4) + -- se devo subito parcheggiare i rulli + local nRes = 0 + if bParkV then + nRes = ExecParkRoller( Y1Pos, Y2Pos, V1Pos, V2Pos, false, true) + end + -- se movimento in rapido ad inizio lavorazione + if EMT.MOVE == 0 and EMT.MOVEIND <= 3 then + -- se testa 1 + if nSetHead == 1 then + -- Dati + local B1Pos = EgtGetAxisPos( 'B1') + local B1Home = EgtGetAxisHomePos( 'B1') + local C1Pos = EgtGetAxisPos( 'C1') + local C1Home = EgtGetAxisHomePos( 'C1') + local Z1Pos = EgtGetAxisPos( 'Z1') + local Z1Home = EgtGetAxisHomePos( 'Z1') + -- se fresa o lama ('H11' o 'H12') + if EMT.HEAD ~= 'H13' then + -- se movimento iniziale da Zmax con lama o fresa + if EMT.ZMAX or EMT.FLAG == 1 or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then + --EgtOutBox( 'Flag 2,1', 'Info Rapid') + SimulMoveAxis( 'X1', EMT.L2, MCH_SIM_STEP.RAPID) + local dZref = EMT.L3 + if EMT.HEAD == 'H12' and ( -EMT.L2 < -LimX1RotSaw or EMT.R2 < -91) then + dZref = Z1Home + GetZExtra( EMT.HEAD, EMT.R2) - EgtIf( not Mortiser, 100, 370) + end + -- caso speciale per trave alta con rotazione lama pericolosa + if EMT.HEAD == 'H12' and EMT.SB > 400 and abs( C1Pos - EMT.R1) > 1 and ( abs( C1Home - EMT.R1) > 30.1 or abs(B1Home - EMT.R2) > 30.1) then + SimulMoveAxis( 'B1', 0, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'C1', EMT.R1, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'X1', EMT.L2, MCH_SIM_STEP.RAPID) + SimulMoveAxes( 'Z1', dZref, MCH_SIM_STEP.RAPID, 'B1', EMT.R2, MCH_SIM_STEP.COLLROT) + -- caso standard + else + SimulMoveAxis( 'Z1', dZref, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'B1', EMT.R2, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'C1', EMT.R1, MCH_SIM_STEP.COLLROT) + end + end + -- altrimenti sega a catena + else + -- Porto la Z alla giusta quota + if Z1Pos > Z1Home + 1 and abs( B1Pos) > 89.9 then + SimulMoveAxis( 'X1', EMT.L2, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'Z1', Z1Home, MCH_SIM_STEP.RAPID) + end + -- se movimento iniziale da Zmax + if EMT.ZMAX or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then + SimulMoveAxes( 'X1', EMT.L2, MCH_SIM_STEP.RAPID, 'Z1', Z1Home, MCH_SIM_STEP.RAPID, 'B1', B1Home, MCH_SIM_STEP.COLLROT, 'C1', EMT.R1, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'B1', EMT.R2, MCH_SIM_STEP.COLLROT) + end + end + -- altrimenti testa 2 + else + -- Dati + local B2Pos = EgtGetAxisPos( 'B2') + local B2Home = EgtGetAxisHomePos( 'B2') + local C2Pos = EgtGetAxisPos( 'C2') + local C2Home = EgtGetAxisHomePos( 'C2') + local Z2Pos = EgtGetAxisPos( 'Z2') + local Z2Home = EgtGetAxisHomePos( 'Z2') + -- se fresa o lama ('H21' o 'H22') + if EMT.HEAD == 'H21' or EMT.HEAD == 'H22' then + -- se movimento iniziale da Zmax con lama o fresa + if EMT.ZMAX or EMT.FLAG == 1 or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then + --EgtOutBox( 'Flag 2,1', 'Info Rapid') + SimulMoveAxis( 'X2', EMT.L2, MCH_SIM_STEP.RAPID) + local dZref = EMT.L3 + if EMT.HEAD == 'H22' and ( -EMT.L2 < -LimX2RotSaw or EMT.R2 > 91) then + dZref = Z2Home + GetZExtra( EMT.HEAD, EMT.R2) - 100 + end + -- caso speciale per trave alta con rotazione lama pericolosa + if EMT.HEAD == 'H22' and EMT.SB > 400 and abs( C2Pos - EMT.R1) > 1 and ( abs( C2Home - EMT.R1) > 30.1 or abs(B2Home - EMT.R2) > 30.1) then + SimulMoveAxis( 'B2', 0, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'C2', EMT.R1, MCH_SIM_STEP.COLLROT) + SimulMoveAxes( 'Z2', dZref, MCH_SIM_STEP.RAPID, 'B2', EMT.R2, MCH_SIM_STEP.COLLROT) + -- caso standard + else + SimulMoveAxis( 'Z2', dZref, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'B2', EMT.R2, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'C2', EMT.R1, MCH_SIM_STEP.COLLROT) + end + end + -- altrimenti errore + else + EmtSetLastError( 1211, 'Head not defined ' .. ( EMT.HEAD or '')) + end + end + end + -- se lavorazione split, muovo per riaggancio del carro Y1 + if EMT.SPLIT_Y1DELTA then + EMT.Y1DELTA = EMT.SPLIT_Y1DELTA + EMT.A1 = EMT.L1 + EMT.Y1DELTA + end + -- se Zmax dopo fine lavorazione + if EMT.MOVE == 0 and EMT.FLAG == 3 then + -- demando movimento completo a MoveEnd + EMT.EnabAxes = false + EMT.ShowAxes = true + end + -- se lavorazione in doppio + if EMT.DOU_TYPE == 2 and not ( EMT.MOVE == 0 and EMT.FLAG == 3) then + EMT.AuxAxes = 4 + 4 + EMT.A5n = 'X2' + local X2 = Delta2TabY - EMT.DOU_TLEN - ( -DeltaTabY + EMT.L2 - EMT.TLEN - EMT.HB) + if EMT.MCHTYPE == MCH_MY.DRILLING and EMT.FLAG == 101 then + EMT.DOU_DRILL_END = EMT.L2p - EMT.L2 + X2 = X2 - 2 * EMT.DOU_DRILL_END + end + EMT.A5 = X2 + EMT.A5m = nil + EMT.A6n = 'Z2' + local Z2 = -Head2Z + MillOffs - Mill2Offs + EMT.L3 + if EMT.ZMAX or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then + Z2 = MaxZ2 + end + EMT.A6 = min( Z2, MaxZ2) + EMT.A6m = EgtIf( ( EMT.MOVE == 2 or EMT.MOVE == 3), 'Z1', nil) + EMT.A7n = 'C2' + EMT.A7 = -EMT.R1 + EMT.A8n = 'B2' + EMT.A8 = -EMT.R2 + -- controllo minimo interasse tra X1 e X2 + local dDeltaX1X2 = EMT.L2 - EMT.A5 - Head2Y + if dDeltaX1X2 < MinDeltaX1X2 then + local sErr = 'X1 X2 charriots in collision (distance=' .. EgtNumToString( dDeltaX1X2, 1) .. ')' + EmtSetLastError( 1208, sErr) + end + -- controllo minima distanza tra utensili di X1 e X2 + local dDistToolX1X2 = dDeltaX1X2 - MillOffs - EMT.TTOTLEN - Mill2Offs - EMT.DOU_TTOTLEN + if dDistToolX1X2 < MinDistToolX1X2 then + local sErr = 'X1 X2 tools in collision (distance=' .. EgtNumToString( dDistToolX1X2, 1) .. ')' + EmtSetLastError( 1208, sErr) + end + end + -- se necessario ... + if EMT.MCHFIRST and bParkV then + if nSetHead == 1 then + SimulMoveAxes( 'X1', EMT.L2, MCH_SIM_STEP.RAPID, + 'Z1', EMT.L3, MCH_SIM_STEP.RAPID, + 'C1', EMT.R1, MCH_SIM_STEP.COLLROT, + 'B1', EMT.R2, MCH_SIM_STEP.COLLROT) + else + SimulMoveAxes( 'X2', EMT.L2, MCH_SIM_STEP.RAPID, + 'Z2', EMT.L3, MCH_SIM_STEP.RAPID, + 'C2', EMT.R1, MCH_SIM_STEP.COLLROT, + 'B2', EMT.R2, MCH_SIM_STEP.COLLROT) + end + end + if nRes ~= 0 then + EMT.A3 = EgtIf( GetV1ToClose(), EMT.V1NEXTPOS, ParkV1) + EMT.A4 = EgtIf( GetV2ToClose(), EMT.V2NEXTPOS, ParkV2) + end + EMT.ZMAX = nil +end + +--------------------------------------------------------------------- +function OnSimulMoveEnd() + -- se primo rapido della lavorazione + if EMT.MCHFIRST and EMT.MOVE == 0 then + -- se lavorazione split, dichiaro carro Y1 riagganciato + if EMT.SPLIT_Y1DELTA then + EMT.SPLIT_Y1DELTA = nil + SetPY1Light( true) + end + -- chiusura pinza speciale (e posizionamento iniziale) + if EMT.W2DELTA then + local dPosQW = EgtGetAxisPos( 'QW') or 0 + if dPosQW < 1 then + EgtSetAxisPos( 'W', EMT.A5) + EgtSetAxisPos( 'QW', 30) + EgtSetAxisPos( 'PW', EMT.HB) + end + end + -- chiusura o apertura rulli V1 + if GetV1ToClose() then + ExecCloseRoller( 1) + else + ExecOpenRoller( 1) + end + -- chiusura o apertura rulli V2 + if GetV2ToClose() then + ExecCloseRoller( 2) + else + ExecOpenRoller( 2) + end + EMT.MCHFIRST = false + EgtOutText( '') + end + -- se movimento finale di foratura in doppio in Z + if EMT.DOU_TYPE == 2 and EMT.MCHTYPE == MCH_MY.DRILLING and EMT.FLAG == 101 then + SimulMoveAxes( 1, 'X1', EMT.L2 + 2 * EMT.DOU_DRILL_END, MCH_SIM_STEP.FEED, + 'X2', EMT.A5 + 2 * EMT.DOU_DRILL_END, MCH_SIM_STEP.FEED) + SimulMoveAxes( 1, 'X1', EMT.L2 + EMT.DOU_DRILL_END, MCH_SIM_STEP.FEED, + 'X2', EMT.A5 + EMT.DOU_DRILL_END, MCH_SIM_STEP.FEED) + end + -- se Zmax dopo fine lavorazione + if EMT.MOVE == 0 and EMT.FLAG == 3 then + -- eventuale rimozione sfridi + RemoveScraps() + -- eseguo + ExecMoveZmax( EMT.MCHSPLIT) + EMT.TO_ZMAX = nil + end +end + +--------------------------------------------------------------------- +function OnSimulCollision() + -- se prima collisione della lavorazione, la segnalo + if EMT.MCHNAME ~= EMT.LAST_MCHNAME_COLLIDE then + local Class = '' + if EMT.SIMCOBIND == 1001 or EMT.SIMCOBIND == 1011 then + Class = 'T_'..EMT.HEAD + elseif EMT.SIMCOBIND == 1002 or EMT.SIMCOBIND == 1012 then + Class = 'TH_'..EMT.HEAD + else + Class = EMT.COLLOBJ[EMT.SIMCOBIND].Cl + end + table.insert( EMT.COLLIDE, { Mc = EMT.MCHNAME, Cl = Class, Vm = EMT.SIMVMID}) + EMT.LAST_MCHNAME_COLLIDE = EMT.MCHNAME + EMT.ERR = 11 + local sErr = 'CUTID='..tostring( EMT.CUTID)..'; TASKID='..tostring( EMT.TASKID)..'; Mach='..EMT.MCHNAME..'; Class='..Class..'; VMill='..EMT.SIMVMID + EmtSetLastError( 1221, sErr, true) + EgtOutLog( 'Collision : ' .. sErr, 1) + end +end + +--------------------------------------------------------------------- +function ExecAuxCmd( sCmd) + -- analizzo il comando + local Cmd = EgtSplitString( sCmd) + if Cmd[1] == '0' then + if Cmd[2] == 'Unloading' then + EMT.UNLOADING = true + elseif Cmd[2] == 'Unloading SpecSplit' then + EMT.UNLOADING = true + EMT.SPECUNL = true + elseif Cmd[2] == 'Split' then + EMT.SPLIT = true + elseif Cmd[2] == 'SpecSplit' then + EMT.SPECSPLIT = true + elseif Cmd[2] == 'Fall' then + EMT.FALL = true + end + EgtOutText( Cmd[2]) + elseif Cmd[1] == '1' then + if EMT.SPLIT or EMT.SPECSPLIT then ExecOpenRoller( 1) end + if EMT.UNLOADING or EMT.TO_FALL or EMT.TO_SPECSPLIT then ExecOpenRoller( 2) end + local sV1, MoveV1, sV2, MoveV2 = CalcMoveV1V2ForAuxCmd( Cmd) + local bOk, bOk1, bOk2, bOk3 = SimulMoveAxes( Cmd[2], tonumber( Cmd[3]), MCH_SIM_STEP.RAPID, + sV1, MoveV1, MCH_SIM_STEP.RAPID, + sV2, MoveV2, MCH_SIM_STEP.RAPID) + if not bOk then + if not bOk1 then + if VerifyY1Y2Stroke( Cmd[2], tonumber( Cmd[3])) == nil then + EgtOutLog( 'Error on ExecAuxCmd : ' .. sCmd) + end + elseif not bOk2 then + VerifyV1V2Stroke( sV1, MoveV1) + elseif not bOk3 then + VerifyV1V2Stroke( sV2, MoveV2) + end + end + elseif Cmd[1] == '2' then + -- Verifico movimento carrello con trave agganciata + VerifyOneChariotSlide( Cmd[2], Cmd[3], Cmd[4], Cmd[5]) + -- Eseguo i movimenti necessari + if EMT.SPLIT then ExecOpenRoller( 1) end + if EMT.UNLOADING or EMT.TO_FALL or EMT.TO_SPECSPLIT then ExecOpenRoller( 2) end + local sV1, MoveV1, sV2, MoveV2 = CalcMoveV1V2ForAuxCmd( Cmd) + local bOk, bOk1, bOk2, bOk3, bOk4 = SimulMoveAxes( Cmd[2], tonumber( Cmd[3]), MCH_SIM_STEP.RAPID, + Cmd[4], tonumber( Cmd[5]), MCH_SIM_STEP.RAPID, + sV1, MoveV1, MCH_SIM_STEP.RAPID, + sV2, MoveV2, MCH_SIM_STEP.RAPID) + if not bOk then + if not bOk1 or not bOk2 then + local nI = EgtIf( not bOk1, 2, 4) + if VerifyY1Y2Stroke( Cmd[nI], tonumber( Cmd[nI+1])) == nil then + EgtOutLog( 'Error on ExecAuxCmd : ' .. sCmd) + end + elseif not bOk3 then + VerifyV1V2Stroke( sV1, MoveV1) + elseif not bOk4 then + VerifyV1V2Stroke( sV2, MoveV2) + end + end + elseif Cmd[1] == '3' then + -- Verifico movimento carrelli con trave agganciata + VerifyTwoChariotsSlide( Cmd[2], Cmd[3], Cmd[4], Cmd[5], Cmd[6], Cmd[7]) + -- Eseguo i movimenti necessari + if EMT.SPLIT then ExecOpenRoller( 1) end + if EMT.UNLOADING or EMT.TO_FALL or EMT.TO_SPECSPLIT then ExecOpenRoller( 2) end + local sV1, MoveV1, sV2, MoveV2 = CalcMoveV1V2ForAuxCmd( Cmd) + local bOk, bOk1, bOk2, bOk3, bOk4, bOk5 = SimulMoveAxes( Cmd[2], tonumber( Cmd[3]), MCH_SIM_STEP.RAPID, + Cmd[4], tonumber( Cmd[5]), MCH_SIM_STEP.RAPID, + Cmd[6], tonumber( Cmd[7]), MCH_SIM_STEP.RAPID, + sV1, MoveV1, MCH_SIM_STEP.RAPID, + sV2, MoveV2, MCH_SIM_STEP.RAPID) + if not bOk then + if not bOk1 or not bOk2 or not bOk3 then + local nI = EgtIf( not bOk1, 2, EgtIf( not bOk2, 4, 6)) + if VerifyY1Y2Stroke( Cmd[nI], tonumber( Cmd[nI+1])) == nil then + EgtOutLog( 'Error on ExecAuxCmd : ' .. sCmd) + end + elseif not bOk4 then + VerifyV1V2Stroke( sV1, MoveV1) + elseif not bOk5 then + VerifyV1V2Stroke( sV2, MoveV2) + end + end + elseif Cmd[1] == '4' then + ExecMoveHome( Cmd[2] == '1') + elseif Cmd[1] == '11' then + local dPY = EgtIf( Cmd[2] == '0', MaxHoOpen, EgtIf( EMT.ROT == -1, EMT.SB, EMT.HB)) + SimulMoveAxis( 'PY1', dPY, MCH_SIM_STEP.RAPID) + SetPY1Light( Cmd[2] ~= '0') + elseif Cmd[1] == '12' then + local dPY = EgtIf( Cmd[2] == '0', MaxHoOpen, EgtIf( EMT.ROT == -1, EMT.SB, EMT.HB)) + SimulMoveAxes( 'PY2', dPY, MCH_SIM_STEP.RAPID) + SetPY2Light( Cmd[2] ~= '0') + elseif Cmd[1] == '21' then + local nY1Delta = tonumber( Cmd[2]) + local nY2Delta = tonumber( Cmd[3]) + EMT.Y1DELTA = EgtIf( nY1Delta > 0.01, nY1Delta, nil) + EMT.Y2DELTA = EgtIf( nY2Delta > 0.01, nY2Delta, nil) + elseif Cmd[1] == '22' then + EMT.V1NEXTPOS = tonumber( Cmd[2]) + EMT.V2NEXTPOS = tonumber( Cmd[3]) + elseif Cmd[1] == '23' then + local nW2Delta = tonumber( Cmd[2]) + EMT.W2DELTA = EgtIf( nW2Delta > 0.01, nW2Delta, nil) + elseif Cmd[1] == '31' then + local nRawId = tonumber( Cmd[2]) + EmtUnlinkRawPartFromGroup( nRawId) + EmtLinkRawPartToGroup( nRawId, Cmd[3]) + EMT.Y1SPEC = true + elseif Cmd[1] == '99' then + EMT.ERR = Cmd[2] + EmtSetLastError( 1200 + EMT.ERR, Cmd[3]) + end +end + +--------------------------------------------------------------------- +function CalcMoveV1V2ForAuxCmd( Cmd) + -- verifico se necessario muovere V1 + local MoveV1 + local MoveY1 = GetCmdAxMove( Cmd, 'Y1') + local V1Pos = EgtGetAxisPos( 'V1') + if MoveY1 and V1Pos > MoveY1 - MinDeltaYV + 0.1 then + MoveV1 = MoveY1 - MinDeltaYV + elseif MoveY1 and EMT.SPECSPLIT and MoveY1 - MinDeltaYV + 0.1 > ParkV1 then + MoveV1 = ParkV1 + end + local sV1 = EgtIf( MoveV1, 'V1', nil) + -- verifico se necessario muovere V2 + local MoveV2 + local MoveY2 = GetCmdAxMove( Cmd, 'Y2') + local V2Pos = EgtGetAxisPos( 'V2') + if MoveY2 and V2Pos < MoveY2 + MinDeltaYV - 0.1 then + MoveV2 = MoveY2 + MinDeltaYV + end + local sV2 = EgtIf( MoveV2, 'V2', nil) + -- restituisco i risultati + if MoveV1 and MoveV2 then + return sV1, MoveV1, sV2, MoveV2 + elseif MoveV1 then + return sV1, MoveV1 + elseif MoveV2 then + return sV2, MoveV2 + end +end + +--------------------------------------------------------------------- +function ExecStartHome() + -- Testa 1 + local HomeX1 = EgtGetAxisHomePos( 'X1') + local HomeC1 = EgtGetAxisHomePos( 'C1') + local HomeB1 = EgtGetAxisHomePos( 'B1') + EgtSetAxisPos( 'X1', HomeX1) + EgtSetAxisPos( 'C1', HomeC1) + EgtSetAxisPos( 'B1', HomeB1) + EgtSetAxisPos( 'Z1', MaxZ1) + -- Testa 2 + local HomeX2 = EgtGetAxisHomePos( 'X2') + local HomeC2 = EgtGetAxisHomePos( 'C2') + local HomeB2 = EgtGetAxisHomePos( 'B2') + EgtSetAxisPos( 'X2', HomeX2) + EgtSetAxisPos( 'C2', HomeC2) + EgtSetAxisPos( 'B2', HomeB2) + EgtSetAxisPos( 'Z2', MaxZ2) +end + +--------------------------------------------------------------------- +function ExecMoveHome( bNearV) + -- risalita a Zmax + ExecMoveZmax( false) + if not bNearV then return end + -- se sega a catena su testa 1 devo prima depositarla + if EMT.PREVHEAD_H1 == 'H13' then + -- visualizzo utensile su TcPos + ShowToolInTcPos( EMT.PREVTCPOS_H1, true) + -- nascondo l'utensile sulla testa + EgtSetMode( EgtGetHeadId( EMT.PREVHEAD_H1 or '') or GDB_ID.NULL, GDB_MD.HIDDEN) + -- cambio utensile + EgtSetAxisPos( 'C1', ParkC1) + EgtSetAxisPos( 'B1', ParkB1) + EgtSetAxisPos( 'Z1', MaxZ1) + SimulMoveAxis( 'X1', ParkX1, MCH_SIM_STEP.RAPID) + LoadNextTool( 1, DefTcPos1) + end + -- porto le teste in home + SimulMoveAxes( 'X1', ParkX1, MCH_SIM_STEP.RAPID, 'X2', ParkX2, MCH_SIM_STEP.RAPID) + -- se richiesto, avvicino i rulli + if bNearV then + -- sistemo i rulli + ExecOpenRoller( 1) + ExecOpenRoller( 2) + if not SimulMoveAxes( 'V1', MinV1, MCH_SIM_STEP.RAPID, + 'V2', MaxV2, MCH_SIM_STEP.RAPID) then + EgtOutLog( 'Error on MoveHome : NearV1V2') + end + end +end + +--------------------------------------------------------------------- +function ExecMoveZmax( bMchSplit) + -- set della testa + local nSetHead = GetHeadSet( EMT.HEAD) + if nSetHead == 0 then return end + -- posizioni correnti degli assi testa + local CurrX = EgtGetAxisPos( EgtIf( nSetHead == 1, 'X1', 'X2')) + local CurrZ = EgtGetAxisPos( EgtIf( nSetHead == 1, 'Z1', 'Z2')) + local CurrC = EgtGetAxisPos( EgtIf( nSetHead == 1, 'C1', 'C2')) + local CurrB = EgtGetAxisPos( EgtIf( nSetHead == 1, 'B1', 'B2')) + -- posizioni home degli assi testa + local HomeX = EgtGetAxisHomePos( EgtIf( nSetHead == 1, 'X1', 'X2')) + local HomeZ = EgtGetAxisHomePos( EgtIf( nSetHead == 1, 'Z1', 'Z2')) + local HomeC = EgtGetAxisHomePos( EgtIf( nSetHead == 1, 'C1', 'C2')) + local HomeB = EgtGetAxisHomePos( EgtIf( nSetHead == 1, 'B1', 'B2')) + -- verifico se necessario ruotare la testa + local bRot = ( abs( HomeC - CurrC) > 1 or abs( HomeB - CurrB) > 1) + -- se necessario ruotare la testa, allargo i carrelli + if RollerParkingNeeded( EMT.HEAD, CurrC, CurrB, HomeC, HomeB) then + ExecOpenRoller( 1) + ExecOpenRoller( 2) + ExecParkRoller( nil, nil, nil, nil, bMchSplit) + end + -- se testa 1 + if nSetHead == 1 then + -- se fresa o lama + if EMT.HEAD ~= 'H13' then + if abs( HomeC - CurrC) > 0.1 or abs( HomeB - CurrB) > 0.1 then + local dZref = HomeZ + GetZExtra( EMT.HEAD, CurrB) + if -CurrX < -LimX1RotSaw then + dZref = dZref - EgtIf( not Mortiser, 100, 370) + end + if CurrB > 90 or CurrB < -90 then + SimulMoveAxes( 'Z1', dZref, MCH_SIM_STEP.RAPID, 'B1', EgtIf( CurrB > 0, 90, -90), MCH_SIM_STEP.COLLROT) + elseif dZref > CurrZ then + SimulMoveAxis( 'Z1', dZref, MCH_SIM_STEP.RAPID) + end + if EMT.HEAD == 'H12' and ( abs( HomeC - CurrC) > 30.1 or abs( HomeB - CurrB) > 30.1) then + SimulMoveAxes( 'Z1', MaxZ1, MCH_SIM_STEP.RAPID, 'B1', 0, MCH_SIM_STEP.COLLROT) + end + SimulMoveAxis( 'C1', HomeC, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'B1', HomeB, MCH_SIM_STEP.COLLROT) + end + SimulMoveAxis( 'Z1', MaxZ1, MCH_SIM_STEP.RAPID) + -- se lavorazione in doppio + if EMT.DOU_TYPE == 2 then + local CurrZ2 = EgtGetAxisPos( 'Z2') + if CurrZ2 < ParkZ2 then + SimulMoveAxes( 'Z2', ParkZ2, MCH_SIM_STEP.RAPID) + end + SimulMoveAxes( 'B2', ParkB2, MCH_SIM_STEP.COLLROT, 'C2', ParkC2, MCH_SIM_STEP.COLLROT) + SimulMoveAxes( 'Z2', MaxZ2, MCH_SIM_STEP.RAPID) + SimulMoveAxis( 'X2', ParkX2, MCH_SIM_STEP.RAPID) + EMT.DOU_TO_ZMAX = nil + end + -- altrimenti sega a catena + else + SimulMoveAxes( 'Z1', HomeZ, MCH_SIM_STEP.RAPID, 'B1', HomeB, MCH_SIM_STEP.COLLROT) + SimulMoveAxes( 'X1', HomeX, MCH_SIM_STEP.RAPID, 'C1', HomeC, MCH_SIM_STEP.COLLROT) + end + -- altrimenti testa 2 + else + -- se fresa o lama + if EMT.HEAD == 'H21' or EMT.HEAD == 'H22' then + if abs( HomeC - CurrC) > 0.1 or abs( HomeB - CurrB) > 0.1 then + local dZref = HomeZ + GetZExtra( EMT.HEAD, CurrB) + if -CurrX < -LimX2RotSaw then + dZref = dZref - 100 + end + if CurrB > 90 or CurrB < -90 then + SimulMoveAxes( 'Z2', dZref, MCH_SIM_STEP.RAPID, 'B2', EgtIf( CurrB > 0, 90, -90), MCH_SIM_STEP.COLLROT) + elseif dZref > CurrZ then + SimulMoveAxis( 'Z2', dZref, MCH_SIM_STEP.RAPID) + end + if EMT.HEAD == 'H22' and ( abs( HomeC - CurrC) > 30.1 or abs( HomeB - CurrB) > 30.1) then + SimulMoveAxes( 'Z2', MaxZ2, MCH_SIM_STEP.RAPID, 'B2', 0, MCH_SIM_STEP.COLLROT) + end + SimulMoveAxis( 'C2', HomeC, MCH_SIM_STEP.COLLROT) + SimulMoveAxis( 'B2', HomeB, MCH_SIM_STEP.COLLROT) + end + SimulMoveAxis( 'Z2', MaxZ2, MCH_SIM_STEP.RAPID) + -- altrimenti errore + else + EmtSetLastError( 1211, 'Head not defined ' .. ( EMT.HEAD or '')) + end + end + EMT.ZMAX = true +end + +--------------------------------------------------------------------- +function ExecUnloading() + if EMT.VMILL and #EMT.VMILL > 0 then + local vMillId = EMT.VMILL[1] + -- gruppo dei Vmill + local nVmGrpId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill') + -- li sposto per lasciare spazio al nuovo pezzo + local nId = EgtGetFirstInGroup( nVmGrpId) + while nId do + EgtMove( nId, Vector3d( 0, ( EMT.HB + 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, 1600, 0) + if EMT.FALL then + vtMove = Vector3d( 0, 2000, -475) + elseif EMT.SPECUNL then + EMT.SPECUNL = nil + EMT.W2DELTA = nil + vtMove = Vector3d( 0, 2000, -475) + EgtSetAxisPos( 'W', ParkW) + EgtSetAxisPos( 'QW', 0) + EgtSetAxisPos( 'PW', MaxWOpen) + end + EgtMove( nLayId, vtMove, GDB_RT.GLOB) + EgtSetLevel( vMillId, GDB_LV.USER) + -- aggiungo gli spigoli + local nFirstId, nCount = EgtVolZmapGetEdges( vMillId, nLayId) + if nFirstId then + for nId = nFirstId, nFirstId + nCount - 1 do + EgtSetColor( nId, Color3d( 96, 96, 96)) + end + end + -- rilascio Vmill + table.remove( EMT.VMILL, 1) + -- aggiorno la visualizzazione + EgtDraw() + -- se finito + if EMT.PHASE == EgtGetPhaseCount() then + -- se impostato di salvare i Vmill, lo faccio + local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini' + if EgtGetStringFromIni( 'VMill', 'Save', '', sMachIni) == '1' then + local sFile = EgtGetCurrFilePath() + if sFile then + local sDir, sName, sExt = EgtSplitPath( sFile) + sName = sName .. '_VM_' .. EgtGetMachGroupName( EgtGetCurrMachGroup()) + EgtSetLevel( nVmGrpId, GDB_LV.USER) + EgtSaveObjToFile( nVmGrpId, sDir .. sName .. '.Nge') + EgtSetLevel( nVmGrpId, GDB_LV.TEMP) + end + end + end + else + if EMT.SPECUNL then + EMT.SPECUNL = nil + EMT.W2DELTA = nil + EgtSetAxisPos( 'W', ParkW) + EgtSetAxisPos( 'QW', 0) + EgtSetAxisPos( 'PW', MaxWOpen) + end + end +end + +--------------------------------------------------------------------- +local function LinkRemainingPartsToY1() + local nCurrOrd = GetPhaseOrd( EMT.PHASE) + local TabId = EgtGetTableId( 'Tab') + local RawId = EgtGetFirstInGroup( TabId) + while RawId do + local NextRawId = EgtGetNext( RawId) + if EgtGetName( RawId) == 'RawPart' then + local nRawOrd = EgtGetInfo( RawId, 'ORD', 'i') + if nRawOrd and nRawOrd ~= nCurrOrd then + local bUlOk = EmtUnlinkRawPartFromGroup( RawId) + local bLkOk = EmtLinkRawPartToGroup( RawId, 'Y1') + end + end + RawId = NextRawId + end +end + +--------------------------------------------------------------------- +function ExecParkRoller( PosY1, PosY2, PosV1, PosV2, bSpliCut, bAgg) + -- Posizioni + local PosT = EgtGetAxisPos( 'T') + PosY1 = PosY1 or EgtGetAxisPos( 'Y1') + PosY2 = PosY2 or EgtGetAxisPos( 'Y2') + PosV1 = PosV1 or EgtGetAxisPos( 'V1') + PosV2 = PosV2 or EgtGetAxisPos( 'V2') + -- Parcheggi pinze + local MyParkY1 = ParkY1 + EgtIf( bAgg, AggLoad, 0) + local MyParkY2 = ParkY2 + -- Eseguo spostamenti + if EMT.Y1DELTA and EMT.Y2DELTA then + local DiffY1 = MyParkY1 - PosY1 + local DiffY2 = MyParkY2 - PosY2 + -- se appena eseguito taglio di separazione + if bSpliCut then + -- aggancio i pezzi rimanenti all'asse Y1 + LinkRemainingPartsToY1() + -- eseguo i movimenti + if not SimulMoveAxes( 'T', PosT + min( DiffY2, 0.0), MCH_SIM_STEP.RAPID, + 'V1', ParkV1, MCH_SIM_STEP.RAPID, + 'V2', ParkV2, MCH_SIM_STEP.RAPID, + 'Y1', PosY1 + max( DiffY1, 0.0), MCH_SIM_STEP.RAPID, + 'Y2', PosY2 + min( DiffY2, 0.0), MCH_SIM_STEP.RAPID) then + EMT.ERR = 2 + EmtSetLastError( 1202, 'Error on MoveAxes in ParkRoller (12A)') + end + return 32 + elseif DiffY1 > 0.1 and DiffY2 < -0.1 then + EMT.ERR = 2 + EmtSetLastError( 1201, 'Error Collision in ParkRoller') + elseif DiffY1 > 0.1 then + if not SimulMoveAxes( 'T', PosT + DiffY1, MCH_SIM_STEP.RAPID, + 'V1', ParkV1, MCH_SIM_STEP.RAPID, + 'V2', ParkV2, MCH_SIM_STEP.RAPID, + 'Y1', PosY1 + DiffY1, MCH_SIM_STEP.RAPID, + 'Y2', PosY2 + DiffY1, MCH_SIM_STEP.RAPID) then + EMT.ERR = 2 + EmtSetLastError( 1202, 'Error on MoveAxes in ParkRoller (12B)') + end + return 12 + elseif DiffY2 < -0.1 then + if not SimulMoveAxes( 'T', PosT + DiffY2, MCH_SIM_STEP.RAPID, + 'V1', ParkV1, MCH_SIM_STEP.RAPID, + 'V2', ParkV2, MCH_SIM_STEP.RAPID, + 'Y1', PosY1 + DiffY2, MCH_SIM_STEP.RAPID, + 'Y2', PosY2 + DiffY2, MCH_SIM_STEP.RAPID) then + EMT.ERR = 2 + EmtSetLastError( 1203, 'Error on MoveAxes in ParkRoller (12C)') + end + return 21 + else + if not SimulMoveAxes( 'V1', ParkV1, MCH_SIM_STEP.RAPID, + 'V2', ParkV2, MCH_SIM_STEP.RAPID) then + EMT.ERR = 2 + EmtSetLastError( 1204, 'Error on MoveAxes in MoveStart') + end + return 30 + end + elseif EMT.Y1DELTA then + local MoveV1 = ParkV1 - PosV1 + local DiffY1 = MyParkY1 - PosY1 + local MoveY1 = EgtIf( DiffY1 > 0.1, MoveV1, 0) + local TryMoveY1 = ParkV1 - PosT - EgtIf( bSpliCut or EMT.FALL, EMT.LT, 0) + if ( PosT > ParkV2 - ExtraParkV and PosT < ParkV1 and PosY1 + TryMoveY1 < MaxY1 and not EMT.W2DELTA) then MoveY1 = max( MoveY1, TryMoveY1) end + -- se appena eseguito taglio di separazione + if bSpliCut then + -- aggancio i pezzi rimanenti all'asse Y1 + LinkRemainingPartsToY1() + -- eseguo i movimenti + if not SimulMoveAxes( 'T', PosT, MCH_SIM_STEP.RAPID, + 'V1', ParkV1, MCH_SIM_STEP.RAPID, + 'V2', ParkV2, MCH_SIM_STEP.RAPID, + 'Y1', PosY1 + MoveY1, MCH_SIM_STEP.RAPID, + 'Y2', MyParkY2, MCH_SIM_STEP.RAPID) then + EMT.ERR = 2 + EmtSetLastError( 1205, 'Error on MoveAxes in ParkRoller (1)') + end + else + if not SimulMoveAxes( 'T', PosT + MoveY1, MCH_SIM_STEP.RAPID, + 'V1', ParkV1, MCH_SIM_STEP.RAPID, + 'V2', ParkV2, MCH_SIM_STEP.RAPID, + 'Y1', PosY1 + MoveY1, MCH_SIM_STEP.RAPID, + 'Y2', MyParkY2, MCH_SIM_STEP.RAPID) then + EMT.ERR = 2 + EmtSetLastError( 1205, 'Error on MoveAxes in ParkRoller (1)') + end + end + return 11 + elseif EMT.Y2DELTA then + local MoveV2 = ParkV2 - PosV2 + local DiffY2 = MyParkY2 - PosY2 + local MoveY2 = EgtIf( DiffY2 < -0.1, MoveV2, 0) + local TryMoveY2 = ParkV2 - PosT - EMT.LT + if ( PosT + EMT.LT < ParkV1 + ExtraParkV and PosT + EMT.LT > ParkV2 and PosY2 + TryMoveY2 > MinY2) then MoveY2 = min( MoveY2, TryMoveY2) end + if not SimulMoveAxes( 'T', PosT + MoveY2, MCH_SIM_STEP.RAPID, + 'V1', ParkV1, MCH_SIM_STEP.RAPID, + 'V2', ParkV2, MCH_SIM_STEP.RAPID, + 'Y1', EgtIf( PosY1 > MyParkY1, PosY1, MyParkY1), MCH_SIM_STEP.RAPID, + 'Y2', PosY2 + MoveY2, MCH_SIM_STEP.RAPID) then + EMT.ERR = 2 + EmtSetLastError( 1206, 'Error on MoveAxes in ParkRoller (2)') + end + return 22 + else + if not SimulMoveAxes( 'V1', ParkV1, MCH_SIM_STEP.RAPID, + 'V2', ParkV2, MCH_SIM_STEP.RAPID, + 'Y1', EgtIf( PosY1 > MyParkY1, PosY1, MyParkY1), MCH_SIM_STEP.RAPID, + 'Y2', MyParkY2, MCH_SIM_STEP.RAPID) then + EMT.ERR = 2 + EmtSetLastError( 1207, 'Error on MoveAxes in ParkRoller (0)') + end + return 0 + end +end + +--------------------------------------------------------------------- +function ExecCloseRoller( nInd) + local dPV = EgtIf( EMT.ROT == -1, EMT.SB, EMT.HB) + local dQV = EgtIf( EMT.ROT == -1, EMT.HB, EMT.SB) + EgtSetAxisPos( EgtIf( nInd == 1, 'PV1', 'PV2'), dPV) + EgtSetAxisPos( EgtIf( nInd == 1, 'QV1', 'QV2'), dQV) +end + +--------------------------------------------------------------------- +function ExecOpenRoller( nInd) + EgtSetAxisPos( EgtIf( nInd == 1, 'PV1', 'PV2'), MaxHoOpen) + EgtSetAxisPos( EgtIf( nInd == 1, 'QV1', 'QV2'), MaxVeOpen) +end + +--------------------------------------------------------------------- +function RemoveScraps() + -- se attivo VMILL, lavorazione ed è richiesto di eliminare gli sfridi + if EMT.VMILL and #EMT.VMILL > 0 and not EMT.OPEISDISP and EMT.VMRS then + local vMillId = EMT.VMILL[1] + local nPart = EgtVolZmapPartCount( vMillId) + if nPart > 1 then + -- ricerca del pezzo con massimo volume + local dTCenX = -EgtGetAxisPos( 'T') - EMT.LP / 2 + local nPartMax = 0 + local dVolMax = 0 + for i = 1, nPart do + local dVol = EgtVolZmapPartVolume( vMillId, i - 1) + if dVol > dVolMax then + local b3VmPart = EgtVolZmapGetPartBBoxGlob( vMillId, i - 1, GDB_BB.STANDARD) + if b3VmPart and b3VmPart:getMax():getX() > dTCenX and b3VmPart:getMin():getX() < dTCenX then + dVolMax = dVol + nPartMax = i + end + end + end + -- eliminazione di tutti i pezzi piccoli + for i = nPart, 1, -1 do + if i ~= nPartMax then + EgtRemoveVolZmapPart( vMillId, i - 1) + end + end + -- aggiorno visualizzazione + EgtDraw() + end + EMT.VMRS = false + end + +end + +--------------------------------------------------------------------- +function VerifyY1Slide( sName1, dVal1, sName2, dVal2) + -- Se movimento trave agganciata con carrello Y1 + if sName1 == 'T' and sName2 == 'Y1' and GetPY1Light() then + local dY1DeltaP = EgtGetAxisPos( 'Y1') - EgtGetAxisPos( 'T') + local dY1DeltaA = tonumber( dVal2) - tonumber( dVal1) + EgtOutLog( string.format( 'Y1DeltaP=%.3f YDeltaA=%.3f', dY1DeltaP, dY1DeltaA), 5) + if abs( dY1DeltaA - dY1DeltaP) > 0.5 then + EMT.ERR = 2 + local sErr = 'Y1 slide : ' .. EmtLenToString( dY1DeltaP, 3) .. ' -> ' .. EmtLenToString( dY1DeltaA, 3) + EmtSetLastError( 1202, sErr) + end + end + -- Tutto bene + return true +end + +--------------------------------------------------------------------- +function VerifyY2Slide( sName1, dVal1, sName2, dVal2) + -- Se movimento trave agganciata con carrello Y2 + if sName1 == 'T' and sName2 == 'Y2' and GetPY2Light() then + local dY2DeltaP = EgtGetAxisPos( 'Y2') - EgtGetAxisPos( 'T') + local dY2DeltaA = tonumber( dVal2) - tonumber( dVal1) + EgtOutLog( string.format( 'Y2VDeltaP=%.3f Y2DeltaA=%.3f', dY2DeltaP, dY2DeltaA), 5) + if abs( dY2DeltaA - dY2DeltaP) > 0.5 then + EMT.ERR = 2 + local sErr = 'Y2 slide : ' .. EmtLenToString( dY2DeltaP, 3) .. ' -> ' .. EmtLenToString( dY2DeltaA, 3) + EmtSetLastError( 1202, sErr) + end + end + -- Tutto bene + return true +end + +--------------------------------------------------------------------- +function VerifyOneChariotSlide( sName1, dVal1, sName2, dVal2) + -- Metto in prima posizione la trave + if sName2 == 'T' then + sName1, sName2 = sName2, sName1 + dVal1, dVal2 = dVal2, dVal1 + end + -- Eseguo verifica + if sName2 == 'Y1' then + return VerifyY1Slide( sName1, dVal1, sName2, dVal2) + elseif sName2 == 'Y2' then + return VerifyY2Slide( sName1, dVal1, sName2, dVal2) + end + return true +end + +--------------------------------------------------------------------- +function VerifyTwoChariotsSlide( sName1, dVal1, sName2, dVal2, sName3, dVal3) + -- Metto in prima posizione la trave + if sName2 == 'T' then + sName1, sName2 = sName2, sName1 + dVal1, dVal2 = dVal2, dVal1 + elseif sName3 == 'T' then + sName1, sName3 = sName3, sName1 + dVal1, dVal3 = dVal3, dVal1 + end + -- Eseguo verifica + if sName2 == 'Y1' then + return VerifyY1Slide( sName1, dVal1, sName2, dVal2) and VerifyY2Slide( sName1, dVal1, sName3, dVal3) + elseif sName2 == 'Y2' then + return VerifyY2Slide( sName1, dVal1, sName2, dVal2) and VerifyY1Slide( sName1, dVal1, sName3, dVal3) + end + return true +end + +--------------------------------------------------------------------- +function VerifyY1Stroke( dY1) + if dY1 < MinY1 then + EmtSetOutstrokeInfo( 'Y1', 'Y1', true, dY1 - MinY1, ' (L1-)') + EMT.ERR = 1 + local sErr = 'Y1 axis outstroke ' .. EgtNumToString( dY1 - MinY1, 3) + EgtOutLog( sErr) + return false + elseif dY1 > MaxY1 then + EmtSetOutstrokeInfo( 'Y1', 'Y1', true, dY1 - MaxY1, ' (L1+)') + EMT.ERR = 1 + local sErr = 'Y1 axis outstroke ' .. EgtNumToString( dY1 - MaxY1, 3) + EgtOutLog( sErr) + return false + end + return true +end + +--------------------------------------------------------------------- +function VerifyY2Stroke( dY2) + if dY2 < MinY2 then + EmtSetOutstrokeInfo( 'Y2', 'Y2', true, dY2 - MinY2, ' (L1-)') + EMT.ERR = 1 + local sErr = 'Y2 axis outstroke ' .. EgtNumToString( dY2 - MinY2, 3) + EgtOutLog( sErr) + return false + elseif dY2 > MaxY2 then + EmtSetOutstrokeInfo( 'Y2', 'Y2', true, dY2 - MaxY2, ' (L1+)') + EMT.ERR = 1 + local sErr = 'Y1 axis outstroke ' .. EgtNumToString( dY2 - MaxY2, 3) + EgtOutLog( sErr) + return false + end + return true +end + +--------------------------------------------------------------------- +function VerifyY1Y2Stroke( sName, dVal) + if sName == 'Y1' then + return VerifyY1Stroke( dVal) + elseif sName == 'Y2' then + return VerifyY2Stroke( dVal) + else + return nil + end +end + +--------------------------------------------------------------------- +function VerifyV1Stroke( dV1) + if dV1 < MinV1 then + EmtSetOutstrokeInfo( 'V1', 'V1', true, dV1 - MinV1, ' (L1-)') + EMT.ERR = 1 + local sErr = 'V1 axis outstroke ' .. EgtNumToString( dV1 - MinV1, 3) + EgtOutLog( sErr) + return false + elseif dV1 > MaxV1 then + EmtSetOutstrokeInfo( 'V1', 'V1', true, dV1 - MaxV1, ' (L1+)') + EMT.ERR = 1 + local sErr = 'V1 axis outstroke ' .. EgtNumToString( dV1 - MaxV1, 3) + EgtOutLog( sErr) + return false + end + return true +end + +--------------------------------------------------------------------- +function VerifyV2Stroke( dV2) + if dV2 < MinV2 then + EmtSetOutstrokeInfo( 'V2', 'V2', true, dV2 - MinV2, ' (L1-)') + EMT.ERR = 1 + local sErr = 'V2 axis outstroke ' .. EgtNumToString( dV2 - MinV2, 3) + EgtOutLog( sErr) + return false + elseif dV2 > MaxV2 then + EmtSetOutstrokeInfo( 'V2', 'V2', true, dV2 - MaxV2, ' (L1+)') + EMT.ERR = 1 + local sErr = 'V2 axis outstroke ' .. EgtNumToString( dV2 - MaxV2, 3) + EgtOutLog( sErr) + return false + end + return true +end + +--------------------------------------------------------------------- +function VerifyV1V2Stroke( sName, dVal) + if sName == 'V1' then + return VerifyV1Stroke( dVal) + elseif sName == 'V2' then + return VerifyV2Stroke( dVal) + else + return nil + end +end + +--------------------------------------------------------------------- +function VerifyWStroke( dW) + if dW < MinW then + EmtSetOutstrokeInfo( 'W', 'W', true, dW - MinW, ' (L1-)') + EMT.ERR = 1 + local sErr = 'W axis outstroke ' .. EgtNumToString( dW - MinW, 3) + EgtOutLog( sErr) + return false + elseif dW > MaxW then + EmtSetOutstrokeInfo( 'W', 'W', true, dW - MaxW, ' (L1+)') + EMT.ERR = 1 + local sErr = 'W axis outstroke ' .. EgtNumToString( dW - MaxW, 3) + EgtOutLog( sErr) + return false + end + return true +end + +--------------------------------------------------------------------- +function GetV1ToClose() + --EgtOutLog( string.format( 'L1m=%.3f L1M=%.3f V2NP=%.3f LB=%.3f', EMT.MAXMIN[1], EMT.MAXMAX[1], EMT.V2NEXTPOS, EMT.LB)) + --EgtOutLog( string.format( 'LB=%.3f LT=%.3f', EMT.LB, EMT.LT or 0)) + return ( EMT.MAXMAX[1] <= EMT.V1NEXTPOS + RollCageMin and EMT.MAXMIN[1] + EMT.LB >= EMT.V1NEXTPOS + RollCageMax) +end + +--------------------------------------------------------------------- +function GetV2ToClose() + --EgtOutLog( string.format( 'L1m=%.3f L1M=%.3f V2NP=%.3f LB=%.3f', EMT.MAXMIN[1], EMT.MAXMAX[1], EMT.V2NEXTPOS, EMT.LB)) + --EgtOutLog( string.format( 'LB=%.3f LT=%.3f', EMT.LB, EMT.LT or 0)) + return ( not EMT.W2DELTA and EMT.MAXMAX[1] <= EMT.V2NEXTPOS - RollCageMax and EMT.MAXMIN[1] + EMT.LB >= EMT.V2NEXTPOS - RollCageMin) +end + +--------------------------------------------------------------------- +function ShowToolInTcPos( sTcPos, bShow) + -- recupero il gruppo dell'utensile + local TcExitId = EgtGetFirstNameInGroup( EgtGetTcPosId( sTcPos or '') or GDB_ID.NULL, 'T1') + if not TcExitId then return end + -- imposto lo stato di visualizzazione + EgtSetStatus( TcExitId, EgtIf( bShow, GDB_ST.ON, GDB_ST.OFF)) +end + +--------------------------------------------------------------------- +function LoadFirstTool( nHSet, sTcPosDef) + return LoadNextTool( nHSet, sTcPosDef, true) +end + +--------------------------------------------------------------------- +function LoadNextTool( nHSet, sTcPosDef, bFirst) + -- recupero gruppo della testa (1 o 2) + if nHSet ~= 1 and nHSet ~= 2 then return end + -- recupero il prossimo utensile attrezzabile senza problemi + local sTool, sHead, sTcPos = FindNextToolOnHeadSet( nHSet, bFirst) + if sHead == 'H13' then sTool = nil end + -- se non trovato, cerco l'utensile di default + if not sTool and GetHeadSetFromTcPos( sTcPosDef) == nHSet then + local vTools = EgtGetToolsInCurrSetupPos( sTcPosDef) + if vTools and vTools[1] and #(vTools[1]) > 0 then + sTool = vTools[1] + sTcPos = sTcPosDef + if nHSet == 1 then + sHead = EgtIf( sTcPos == 'T1', 'H12', 'H11') + else + sHead = EgtIf( sTcPos == 'T11', 'H22', 'H21') + end + end + end + -- se non trovato, lascio la testa vuota + if not sTool then + sTool = '' + sHead = EgtIf( nHSet == 1, 'H11', 'H21') + sTcPos = '' + EgtUnloadTool( sHead, 1) + end + -- imposto correttamente i dati di testa + local OrigEMC = EMC + EMC = { HEAD = sHead, TOTDIAM = 0} + OnSetHead() + EMC = OrigEMC + -- carico l'utensile + EgtLoadTool( sHead, 1, sTool) + ShowToolInTcPos( sTcPos, false) + -- aggiorno dati utensile corrente sulla testa + if nHSet == 1 then + EMT.PREVTOOL_H1 = sTool + EMT.PREVHEAD_H1 = sHead + EMT.PREVTCPOS_H1 = sTcPos + else + EMT.PREVTOOL_H2 = sTool + EMT.PREVHEAD_H2 = sHead + EMT.PREVTCPOS_H2 = sTcPos + end + return sTool +end + +--------------------------------------------------------------------- +-- *** ESTIMATION T&L *** +--------------------------------------------------------------------- +local RAPID_X_FEED = 70000 -- mm/min +local RAPID_Y_FEED = 100000 -- mm/min +local RAPID_Z_FEED = 32000 -- mm/min +local RAPID_C_FEED = 15000 -- deg/min +local RAPID_B_FEED = 15000 -- deg/min +local RAPID_MIN_T = 0.1 -- s +local LOAD_T = 2 -- s +local CHAR_ONE_MOVE_T = 1 -- s +local ROTATION_T = 40 -- s +local SPLIT_T = 6 -- s +local UNLOAD_T = 4 -- s +local FALL_T = 2 -- s + +--------------------------------------------------------------------- +function OnEstimStart() + EMT.INCHES = not EgtUiUnitsAreMM() -- unità di misura mm/inches +end + +--------------------------------------------------------------------- +function OnEstimEnd() +end + +--------------------------------------------------------------------- +function OnEstimProgramStart() + -- imposto inizio movimenti da Home + EMT.L1 = EgtGetAxisHomePos( 'T') + EMT.L2 = EgtGetAxisHomePos( 'X1') + EMT.L3 = EgtGetAxisHomePos( 'Z1') + EMT.R1 = EgtGetAxisHomePos( 'C1') + EMT.R2 = EgtGetAxisHomePos( 'B1') + -- aggiorno valori come precedenti + EmtUpdatePrev() + -- totalizzatori tempi e lunghezze + EMT.TOTCUTLEN = 0 + EMT.TOTCUTTIME = 0 + EMT.TOTEXTLEN = 0 + EMT.TOTEXTTIME = 0 + -- variabile per lunghezza taglio utensili + EMT.TOOLCUTLEN = {} + -- intestazioni + EmtTleStart( EMT.INFO) +end + +--------------------------------------------------------------------- +function OnEstimProgramEnd() + -- stampa dei totali delle lavorazioni + EmtTleAddTotal( EmtSecToHMS( EMT.TOTCUTTIME + EMT.TOTEXTTIME), EmtLenToMF( EMT.TOTCUTLEN)) + -- stampa dei totali degli utensili + for i = 1, #EMT.TOOLCUTLEN do + local TCL = EMT.TOOLCUTLEN[i] + EmtTleAddTool( TCL.Name, EmtLenToMF( TCL.Len)) + end + -- completo il file + local _, _, sExt = EgtSplitPath( EMT.FILE) + EmtTleEnd( sExt:sub( 2)) + -- salvo i dati principali nel progetto + EgtSetInfo( EgtGetCurrMachGroup(), 'Ttot', EgtNumToString( EMT.TOTCUTTIME + EMT.TOTEXTTIME, 0)) + EgtSetInfo( EgtGetCurrMachGroup(), 'Ltot', EgtNumToString( EMT.TOTCUTLEN, 0)) +end + +--------------------------------------------------------------------- +function OnEstimDispositionStart() + -- inizio disposizione + EMT.OPEISDISP = true + -- sulla prima fase dichiaro carico barra + if EMT.PHASE == 1 then + EMT.LOAD = true + else + EMT.LOAD = false + end +end + +--------------------------------------------------------------------- +function OnEstimDispositionEnd() + -- Se disposizione inizio o rimanenza + if IsStartOrRestPhase( EMT.PHASE) then + ; + -- se altrimenti disposizione intermedia, eventuale rotazione + elseif IsMidPhase( EMT.PHASE) then + -- recupero le rotazioni delle fasi corrente e precedente + local nRot = GetPhaseRot( EMT.PHASE) + local nPrevRot = GetPhaseRot( EMT.PHASE - 1) + -- verifico se sono diverse + if nRot ~= nPrevRot then + -- imposto stato post-rotazione + EMT.POSTROT = true + end + -- altrimenti disposizione finale, eventuale scarico pezzo lavorato se non ci sono lavorazioni + else + ; + end + -- emetto dati in sospeso + if EMT.TLE_NAME then + EmtTleAddMachining( EMT.TLE_NAME, EmtSecToHMS( EMT.TLE_TIME), ' - ', ' - ') + EMT.TLE_NAME = nil + EMT.TLE_TIME = nil + end + -- termine disposizione + EMT.OPEISDISP = false +end + +--------------------------------------------------------------------- +function OnEstimToolSelect() + -- reset indice utensile in tabella lunghezze + EMT.TCLIND = 0 + -- verifico che l'utensile sia definito + if #EMT.TOOL == 0 then return end + -- cerco l'utensile nella tabella + for i = 1, #EMT.TOOLCUTLEN do + if EMT.TOOLCUTLEN[i].Name == EMT.TOOL then + EMT.TCLIND = i + break + end + end + -- se non trovato, lo aggiungo + if EMT.TCLIND == 0 then + table.insert( EMT.TOOLCUTLEN, { Name = EMT.TOOL, Len = 0}) + EMT.TCLIND = #EMT.TOOLCUTLEN + end +end + +--------------------------------------------------------------------- +function OnEstimToolDeselect() +end + +--------------------------------------------------------------------- +function OnEstimMachiningStart() + EMT.MCHNAME = EgtGetOperationName( EMT.MCHID) + EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE) + EgtOutLog( 'Mach : ' .. EMT.MCHNAME, 5) + -- reset contatori di lavorazione + EMT.MCHCUTLEN = 0 + EMT.MCHCUTTIME = 0 + EMT.MCHEXTLEN = 0 + EMT.MCHEXTTIME = 0 +end + +--------------------------------------------------------------------- +function OnEstimMachiningEnd() + -- nel caso di foratura devo dimezzare la lunghezza di taglio perchè comprende anche l'uscita + if EMT.MCHTYPE == MCH_MY.DRILLING then + EMT.MCHCUTLEN = EMT.MCHCUTLEN / 2 + end + local sName = EgtGetName( EMT.MCHID) + EmtTleAddMachining( sName, EmtSecToHMS( EMT.MCHCUTTIME + EMT.MCHEXTTIME), EmtLenToMF( EMT.MCHCUTLEN), EMT.TOOL) + -- aggiorno totali e utensili + EMT.TOTCUTLEN = EMT.TOTCUTLEN + EMT.MCHCUTLEN + EMT.TOTCUTTIME = EMT.TOTCUTTIME + EMT.MCHCUTTIME + EMT.TOTEXTLEN = EMT.TOTEXTLEN + EMT.MCHEXTLEN + EMT.TOTEXTTIME = EMT.TOTEXTTIME + EMT.MCHEXTTIME + EMT.TOOLCUTLEN[EMT.TCLIND].Len = EMT.TOOLCUTLEN[EMT.TCLIND].Len + EMT.MCHCUTLEN + -- emetto dati in sospeso + if EMT.TLE_NAME then + EmtTleAddMachining( EMT.TLE_NAME, EmtSecToHMS( EMT.TLE_TIME), ' - ', ' - ') + EMT.TLE_NAME = nil + EMT.TLE_TIME = nil + end +end + +--------------------------------------------------------------------- +function OnEstimPathStart() + EMT.AUXTYPE = nil + EMT.MCHMOVEFIRST = true +end + +--------------------------------------------------------------------- +function OnEstimPathEnd() + EMT.AUXTYPE = nil +end + +--------------------------------------------------------------------- +function OnEstimPathStartAux() + -- se richiesto, preparo il carico barra + if EMT.LOAD then + if EMT.AUXIND == EMT.AUXTOT then + local dTime = LOAD_T + EMT.TOTEXTTIME = EMT.TOTEXTTIME + dTime + EmtTleAddMachining( 'Loading', EmtSecToHMS( dTime), ' - ', ' - ') + EMT.LOAD = false + end + -- se altrimenti carico dopo rotazione + elseif EMT.POSTROT then + if EMT.AUXIND == EMT.AUXTOT then + local dTime = ROTATION_T + EMT.TOTEXTTIME = EMT.TOTEXTTIME + dTime + EmtTleAddMachining( 'Rotation', EmtSecToHMS( dTime), ' - ', ' - ') + EMT.POSTROT = false + end + -- altrimenti, spostamento carrelli + else + if EMT.AUXTOT > 3 and EMT.AUXIND == EMT.AUXTOT then + local dTime = ( EMT.AUXTOT - 3) * CHAR_ONE_MOVE_T + EMT.TOTEXTTIME = EMT.TOTEXTTIME + dTime + EmtTleAddMachining( 'Charriots move', EmtSecToHMS( dTime), ' - ', ' - ') + end + end +end + +--------------------------------------------------------------------- +function OnEstimPathEndAux() + -- 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' + 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' + elseif Cmd[1] == '0' and Cmd[2] == 'Fall' then + EMT.AUXTYPE = 'F' + else + EMT.AUXTYPE = 'P' + end + end + end + -- per lo scarico della rimanenza + if EMT.AUXTYPE == 'R' then + if EMT.AUXIND == EMT.AUXTOT then + local dTime = LOAD_T + UNLOAD_T + EMT.TOTEXTTIME = EMT.TOTEXTTIME + dTime + EMT.TLE_NAME = 'Remnant unloading' + EMT.TLE_TIME = dTime + end + -- per lo split + elseif EMT.AUXTYPE == 'S' then + if EMT.AUXIND == EMT.AUXTOT then + local dTime = SPLIT_T + EMT.TOTEXTTIME = EMT.TOTEXTTIME + dTime + EMT.TLE_NAME = 'Splitting' + EMT.TLE_TIME = dTime + end + -- per lo scarico + elseif EMT.AUXTYPE == 'U' then + if EMT.AUXIND == EMT.AUXTOT then + local dTime = UNLOAD_T + EMT.TOTEXTTIME = EMT.TOTEXTTIME + dTime + EMT.TLE_NAME = 'Unloading' + EMT.TLE_TIME = dTime + end + -- per lo scarico a caduta + elseif EMT.AUXTYPE == 'F' then + if EMT.AUXIND == EMT.AUXTOT then + local dTime = FALL_T + EMT.TOTEXTTIME = EMT.TOTEXTTIME + dTime + EMT.TLE_NAME = 'Fall' + EMT.TLE_TIME = dTime + end + -- per la pre-rotazione + elseif EMT.AUXTYPE == 'P' then + ; -- calcolato come parte della rotazione + end +end + +--------------------------------------------------------------------- +function OnEstimRapid() + -- dati movimento + local dL1 = EMT.L1 - EMT.L1p + local dL2 = EMT.L2 - EMT.L2p + local dL3 = EMT.L3 - EMT.L3p + local dR1 = 0 + if EMT.R1 and EMT.R1p then dR1 = EMT.R1 - EMT.R1p end + local dR2 = 0 + if EMT.R2 and EMT.R2p then dR2 = EMT.R2 - EMT.R2p end + -- se primo posizionamento della lavorazione il movimento di L1 è già conteggiato in quello dei carrelli + if EMT.MCHMOVEFIRST then + EMT.MCHMOVEFIRST = false + dL1 = 0 + end + -- calcolo lunghezza + local dLen = sqrt( dL1 * dL1 + dL2 * dL2 + dL3 * dL3) + EMT.MCHEXTLEN = EMT.MCHEXTLEN + dLen + -- calcolo tempo + local dTime = RAPID_MIN_T + local dT1 = abs( dL1) / RAPID_X_FEED * 60 + if dT1 > dTime then dTime = dT1 end + local dT2 = abs( dL2) / RAPID_Y_FEED * 60 + if dT2 > dTime then dTime = dT2 end + local dT3 = abs( dL3) / RAPID_Z_FEED * 60 + if dT3 > dTime then dTime = dT3 end + local dT4 = abs( dR1) / RAPID_C_FEED * 60 + if dT4 > dTime then dTime = dT4 end + local dT5 = abs( dR2) / RAPID_B_FEED * 60 + if dT5 > dTime then dTime = dT5 end + EMT.MCHEXTTIME = EMT.MCHEXTTIME + dTime + EgtOutLog( string.format( ' G0 Len=%.0f Rot=%.0f° Time=%.2f', dLen, abs( dR1) + abs( dR2), dTime), 5) + -- aggiorno valori come precedenti + EmtUpdatePrev() +end + +--------------------------------------------------------------------- +function OnEstimLinear() + -- dati movimento + local dL1 = EMT.L1 - EMT.L1p + local dL2 = EMT.L2 - EMT.L2p + local dL3 = EMT.L3 - EMT.L3p + -- calcolo lunghezza + local dLen = sqrt( dL1 * dL1 + dL2 * dL2 + dL3 * dL3) + EMT.MCHCUTLEN = EMT.MCHCUTLEN + dLen + -- calcolo tempo + local dTime = dLen / EMT.F * 60 + EMT.MCHCUTTIME = EMT.MCHCUTTIME + dTime + EgtOutLog( string.format( ' G1 Len=%.0f Time=%.2f', dLen, dTime), 5) + -- aggiorno valori come precedenti + EmtUpdatePrev() +end + +--------------------------------------------------------------------- +function OnEstimArc() + -- dati movimento + local dLxy = EMT.RR * abs( EMT.AC) * pi / 180 + local dLz = abs( ( Point3d( EMT.L1, EMT.L2, EMT.L3) - Point3d( EMT.L1p, EMT.L2p, EMT.L3p)) * Vector3d( EMT.EXTR)) + -- calcolo lunghezza + local dLen = sqrt( dLxy * dLxy + dLz * dLz) + EMT.MCHCUTLEN = EMT.MCHCUTLEN + dLen + -- calcolo tempo + local dTime = dLen / EMT.F * 60 + EMT.MCHCUTTIME = EMT.MCHCUTTIME + dTime + EgtOutLog( string.format( ' G2 Len=%.0f Time=%.2f', dLen, dTime), 5) + -- aggiorno valori come precedenti + EmtUpdatePrev() +end + +--------------------------------------------------------------------- +-- *** GENERAL *** +--------------------------------------------------------------------- +function IsStartPhase( nPhase) + local sVal = GetPhaseType( nPhase) + return ( sVal == 'START') +end + +--------------------------------------------------------------------- +function IsRestPhase( nPhase) + local sVal = GetPhaseType( nPhase) + return ( sVal == 'REST') +end + +--------------------------------------------------------------------- +function IsStartOrRestPhase( nPhase) + local sVal = GetPhaseType( nPhase) + return ( sVal == 'START' or sVal == 'REST') +end + +--------------------------------------------------------------------- +function IsMidPhase( nPhase) + local sVal = GetPhaseType( nPhase) + return ( sVal == 'MID') +end + +--------------------------------------------------------------------- +function IsMid2Phase( nPhase) + local sVal = GetPhaseType( nPhase) + return ( sVal == 'MID2') +end + +--------------------------------------------------------------------- +function IsEnd2Phase( nPhase) + local sVal = GetPhaseType( nPhase) + return ( sVal == 'END2') +end + +--------------------------------------------------------------------- +function GetPhaseType( nPhase) + return ( EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'TYPE') or '') +end + +--------------------------------------------------------------------- +function GetPhaseOrd( nPhase) + return ( EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'ORD', 'i') or 0) +end + +--------------------------------------------------------------------- +function GetPhaseRot( nPhase) + return ( EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'ROT', 'i') or 0) +end + +--------------------------------------------------------------------- +function GetParkT() + local dTmp = EgtGetInfo( EMT.DISPID, 'TPOS', 'd') or EgtGetInfo( EMT.DISPID, 'TPARK', 'd') + if dTmp then + return dTmp + else + return LoadT + end +end + +--------------------------------------------------------------------- +function GetHeadSetFromTcPos( sTcPos) + local TCPOS_1A = { 'T1', 'T3', 'T4', 'T5', 'T6', 'T7', 'T8', 'T9', 'T10'} + local TCPOS_1B = { 'T101'} + local TCPOS_2A = { 'T11', 'T12', 'T13', 'T14', 'T15', 'T16', 'T17', 'T18', 'T19', 'T20'} + for _, sVal in ipairs( TCPOS_1A) do + if sVal == sTcPos then return 1, 1 end + end + for _, sVal in ipairs( TCPOS_1B) do + if sVal == sTcPos then return 1, 2 end + end + for _, sVal in ipairs( TCPOS_2A) do + if sVal == sTcPos then return 2, 1 end + end + return 0, 0 +end + +--------------------------------------------------------------------- +function FindFirstToolOnHeadSet( nHSet) + return FindNextToolOnHeadSet( nHSet, true) +end + +--------------------------------------------------------------------- +function FindNextToolOnHeadSet( nHSet, bFirst) + -- salvo stato iniziale + local CurrMachId = EgtGetCurrMachining() + local CurrTool = EgtTdbGetCurrToolParam( MCH_TP.NAME) + -- cerco lavorazione con utensile su gruppo testa indicato + local sTool, sHead, sTcPos + local OpId + if bFirst then + OpId = EgtGetFirstActiveOperation() + else + OpId = EgtGetNextActiveOperation( CurrMachId or EMT.MCHID) + end + while OpId do + local nType = EgtGetOperationType( OpId) + if nType ~= MCH_OY.NONE and nType ~= MCH_OY.DISP then + if EgtSetCurrMachining( OpId) then + local sTest = EgtGetMachiningParam( MCH_MP.TOOL) + if EgtTdbSetCurrTool( sTest) then + sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD) + if GetHeadSet( sHead) == nHSet then + sTool = sTest + sTcPos = EgtTdbGetCurrToolParam( MCH_TP.TCPOS) + break + end + end + end + end + OpId = EgtGetNextActiveOperation( OpId) + end + -- ripristino stato iniziale + EgtSetCurrMachining( CurrMachId or GDB_ID.NULL) + EgtTdbSetCurrTool( CurrTool or '') + -- restituisco risultato + return sTool, sHead, sTcPos +end + +--------------------------------------------------------------------- +function GetToolTcPos( sTool) + -- salvo stato iniziale + local CurrTool = EgtTdbGetCurrToolParam( MCH_TP.NAME) + -- recupero la posizione di cambio utensile dell'utensile indicato + local sTcPos + if EgtTdbSetCurrTool( sTool) then + sTcPos = EgtTdbGetCurrToolParam( MCH_TP.TCPOS) + end + -- ripristino stato iniziale + EgtTdbSetCurrTool( CurrTool or '') + -- restituisco risultato + return sTcPos +end + +--------------------------------------------------------------------- +function GetCurrChainSawingVirtualAxis() + -- recupero il valore dell'asse virtuale bloccato A + local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS) or 'A=0' + local dPosA = tonumber( sVal:sub( 3)) or 0 + return dPosA +end + +--------------------------------------------------------------------- +function GetNextChainSawingVirtualAxis( MchId) + -- recupero la lavorazione successiva + local NextMchId + if MchId then + NextMchId = EgtGetNextActiveOperation( MchId) + else + NextMchId = EgtGetFirstActiveOperation() + end + while NextMchId and EgtGetOperationType( NextMchId) == MCH_OY.DISP do + NextMchId = EgtGetNextActiveOperation( NextMchId) + end + -- verifico sia un taglio con sega a catena + if not NextMchId or EgtGetOperationType( NextMchId) ~= MCH_OY.MORTISING then + return nil + end + -- la imposto come lavorazione corrente + EgtSetCurrMachining( NextMchId) + -- recupero il valore dell'asse virtuale bloccato A + local dPosA = GetCurrChainSawingVirtualAxis() + -- ripristino la lavorazione corrente + if MchId then + EgtSetCurrMachining( MchId) + end + return dPosA +end + +--------------------------------------------------------------------- +function GetNextTool( nMchId) + -- inizializzo prossimo utensile + local sNextTool + -- recupero lavorazione successiva + local nNextMchId = EgtGetNextActiveOperation( nMchId) + while nNextMchId do + if EgtGetOperationType( nNextMchId) ~= MCH_OY.DISP then + break + end + nNextMchId = EgtGetNextActiveOperation( nNextMchId) + end + -- se trovata + if nNextMchId and EgtSetCurrMachining( nNextMchId) then + sNextTool = EgtGetMachiningParam( MCH_MP.TOOL) + end + -- ripristino stato corrente + EgtSetCurrMachining( EMT.MCHID) + EgtTdbSetCurrTool( EMT.TOOL) + return sNextTool +end + +--------------------------------------------------------------------- +function IsLastPath( nPathId) + return not EgtGetNext( nPathId) +end + +--------------------------------------------------------------------- +function RollerParkingNeeded( sHead, dAng1p, dAng2p, dAng1, dAng2) + if sHead == 'H11' or sHead == 'H12' or sHead == 'H13' then + return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1 % 180.0) > 1)) + elseif sHead == 'H21' or sHead == 'H22' then + return ( abs( dAng1 - dAng1p) > 1 or ( abs( dAng2 - dAng2p) > 1 and abs( dAng1 % 180.0) > 1)) + end +end + +--------------------------------------------------------------------- +function GetCmdAxMove( Cmd, sAx) + if #Cmd >= 3 and Cmd[2] == sAx then + return tonumber( Cmd[3]) + elseif #Cmd >= 5 and Cmd[4] == sAx then + return tonumber( Cmd[5]) + elseif #Cmd >= 7 and Cmd[6] == sAx then + return tonumber( Cmd[7]) + end +end + +--------------------------------------------------------------------- +-- *** END GENERAL *** diff --git a/Essetre-PF.mlse b/Essetre-PF.mlse new file mode 100644 index 0000000..fa87628 --- /dev/null +++ b/Essetre-PF.mlse @@ -0,0 +1,2724 @@ +-- Special Operations macchina Essetre-PF by EgalTech s.r.l. 2023/01/19 + +-- Intestazioni +require( 'EmtGenerator') +EgtEnableDebug( false) + +-- Carico i dati globali +local sBaseDir = EgtGetSourceDir() +local BD = dofile( sBaseDir .. 'Beam\\BeamData.lua') + +EgtOutLog ( '** Essetre-PFrl '..PP_VER..' **', 1) + + +---------------------- OnSpecialGetMaxZ ----------------------------- +--------------------------------------------------------------------- +local function CalcExtraZ( vtTp, vtT, vMZ) + -- la tabella deve esistere ed essere non vuota + if not vMZ or #vMZ == 0 then return 0 end + -- componente Z di riferimento è la minima + local vtTz = min( vtTp:getZ(), vtT:getZ()) + -- se oltre il massimo + if vtTz > vMZ[1].Tz then return vMZ[1].Ez end + -- interpolo + for i = 2, #vMZ do + if vtTz > vMZ[i].Tz then + local dCoeff = ( vtTz - vMZ[i-1].Tz) / ( vMZ[i].Tz - vMZ[i-1].Tz) + return (( 1 - dCoeff) * vMZ[i-1].Ez + dCoeff * vMZ[i].Ez) + end + end + -- sotto il minimo + return 0 +end + +--------------------------------------------------------------------- +function OnSpecialGetMaxZ() + -- Inizializzazioni + EMC.ERR = 0 + + -- Gestione speciale per sega a catena + if EMC.HEAD == 'H13' then + EMC.MAXZ = EgtGetAxisHomePos( 'Z1') + return + end + + -- Sistemazione dati di input + local vtTp = Vector3d( EMC.TDIRp) + local bFromZmax = false + if vtTp:isSmall() then + vtTp = X_AX() + bFromZmax = true + if EMC.HEAD == 'H11' or EMC.HEAD == 'H12' then + EMC.R1p = ParkC1 + EMC.R2p = ParkB1 + elseif EMC.HEAD == 'H21' or EMC.HEAD == 'H22' then + EMC.R1p = ParkC2 + EMC.R2p = ParkB2 + end + end + local vtT = Vector3d( EMC.TDIR) + local vtTpZm = EgtIf( bFromZmax, vtT, vtTp) + local bBSameSign = (( EMC.R2p < 10 and EMC.R2 < 10) or ( EMC.R2p > -10 and EMC.R2 > -10)) + + -- Calcolo in funzione della testa e dei parametri + if EMC.HEAD == 'H11' then + if bBSameSign and vtTp:getX() > -0.1 and vtT:getX() > -0.1 then + EMC.MAXZ = MaxZ1 + else + local vMZ = {{ Tz=0.85, Ez=400}, { Tz=0.5, Ez=290}, { Tz=-0.01, Ez=160}} + EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTp, vtT, vMZ) + end + elseif EMC.HEAD == 'H12' then + if vtTp:getX() > 0.3 and vtT:getX() > 0.3 then + if bBSameSign and abs( EMC.R1 - EMC.R1p) < 165 then + EMC.MAXZ = MaxZ1 - EgtIf( abs( EMC.R2) < 90.1 and abs( EMC.R2p) < 90.1, 0, 130) + elseif vtTp:getZ() > 0.707 or vtT:getZ() > 0.707 then + EMC.MAXZ = ParkZ1 + 200 + else + EMC.MAXZ = ParkZ1 + 1 + end + elseif bBSameSign and EMC.R1p > 29.9 and EMC.R1p < 180.1 and EMC.R1 > 29.9 and EMC.R1 < 180.1 and EMC.R2p > -10 and EMC.R2 > -10 then + EMC.MAXZ = MaxZ1 - EgtIf( abs( EMC.R2) < 90.1 and abs( EMC.R2p) < 90.1, 0, 130) + elseif bBSameSign and EMC.R1p > -0.1 and EMC.R1p < 180.1 and EMC.R1 > -0.1 and EMC.R1 < 180.1 and EMC.R2p > -10 and EMC.R2 > -10 then + local vMZ = {{ Tz=0.85, Ez=440}, { Tz=0.5, Ez=200}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}} + EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ) + else + local vMZ = {{ Tz=0.85, Ez=400}, { Tz=0.7, Ez=300}, { Tz=0.5, Ez=200}, { Tz=0.15, Ez=80}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}} + EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ) + end + elseif EMC.HEAD == 'H21' then + if bBSameSign and vtTp:getX() > -0.1 and vtT:getX() > -0.1 then + EMC.MAXZ = MaxZ2 + else + local vMZ = {{ Tz=0.85, Ez=400}, { Tz=0.5, Ez=290}, { Tz=-0.01, Ez=160}} + EMC.MAXZ = ParkZ2 + CalcExtraZ( vtTp, vtT, vMZ) + end + elseif EMC.HEAD == 'H22' then + if vtTp:getX() > 0.3 and vtT:getX() > 0.3 then + if bBSameSign and abs( EMC.R1 - EMC.R1p) < 165 then + EMC.MAXZ = MaxZ2 - EgtIf( abs( EMC.R2) < 90.1 and abs( EMC.R2p) < 90.1, 0, 130) + elseif vtTp:getZ() > 0.707 or vtT:getZ() > 0.707 then + EMC.MAXZ = ParkZ2 + 200 + else + EMC.MAXZ = ParkZ2 + 1 + end + elseif bBSameSign and EMC.R1p > -180.1 and EMC.R1p < -29.9 and EMC.R1 > -180.1 and EMC.R1 < -29.9 and EMC.R2p < 10 and EMC.R2 < 10 then + EMC.MAXZ = MaxZ2 - EgtIf( abs( EMC.R2) < 90.1 and abs( EMC.R2p) < 90.1, 0, 130) + elseif bBSameSign and EMC.R1p > -180.1 and EMC.R1p < 0.1 and EMC.R1 > -180.1 and EMC.R1 < 0.1 and EMC.R2p < 10 and EMC.R2 < 10 then + local vMZ = {{ Tz=0.85, Ez=440}, { Tz=0.5, Ez=200}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}} + EMC.MAXZ = ParkZ2 + CalcExtraZ( vtTpZm, vtT, vMZ) + else + local vMZ = {{ Tz=0.85, Ez=400}, { Tz=0.7, Ez=300}, { Tz=0.5, Ez=200}, { Tz=0.15, Ez=80}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}} + EMC.MAXZ = ParkZ2 + CalcExtraZ( vtTpZm, vtT, vMZ) + end + end +end + +---------------------- OnSpecialMoveZup ----------------------------- +--------------------------------------------------------------------- +function OnSpecialMoveZup() + + --EgtOutLog( 'OnSpecialMoveZup : ' .. EMC.HEAD .. '.' .. tostring( EMC.EXIT)) + + -- Inizializzazioni + EMC.ERR = 0 + EMC.MODIF = false + + -- Direzione utensile + local vtT = Vector3d( EMC.TDIR) + + -- recupero Z1 home + local nHeadSet = GetHeadSet( EMC.HEAD) + local dZmax = EgtGetAxisHomePos( EgtIf( nHeadSet ~= 2, 'Z1', 'Z2')) + + + -- se fresa su testa1 o su testa 2 + if EMC.HEAD == 'H11' or EMC.HEAD == 'H21' then + ; + -- se lama su testa1 + elseif EMC.HEAD == 'H12' then + -- se inclinata oltre 90 gradi e interferisce con la trave + if ( EMC.R2 > 87.9 and ( EMC.R1 < 15.0 or EMC.R1 > 180.0)) or ( EMC.R2 < -87.9 and ( EMC.R1 > -15.0 and EMC.R1 < 180.0)) then + local dZref = dZmax + min( 330 * vtT:getZ(), 0) + 260 * ( 1 - sqrt( 1- vtT:getZ() * vtT:getZ())) + -- se troppo in alto + if EMC.L3 > dZref + 1 then + ---- sistemo asse rotante + --EMC.R2 = EgtIf( ( EMC.R2 > 0), 90, -90) + ---- ricalcolo versore utensile + --EMC.TDIR = EgtGetCalcToolDirFromAngles( EMC.R1, EMC.R2) + ---- porto alla giusta quota + --EMC.L3 = dZmax + EMC.L3 = dZref + -- dichiaro modificato + EMC.MODIF = true + end + end + -- se lama su testa2 + elseif EMC.HEAD == 'H22' then + -- se inclinata oltre 90 gradi e interferisce con la trave + if ( EMC.R2 < -87.9 and ( EMC.R1 < -180.0 or EMC.R1 > -15.0)) or ( EMC.R2 > 87.9 and ( EMC.R1 < 15.0 and EMC.R1 > 180.0)) then + local dZref = dZmax + min( 330 * vtT:getZ(), 0) + 260 * ( 1 - sqrt( 1- vtT:getZ() * vtT:getZ())) + -- se troppo in alto + if EMC.L3 > dZref + 1 then + ---- sistemo asse rotante + --EMC.R2 = EgtIf( ( EMC.R2 > 0), 90, -90) + ---- ricalcolo versore utensile + --EMC.TDIR = EgtGetCalcToolDirFromAngles( EMC.R1, EMC.R2) + ---- porto alla giusta quota + --EMC.L3 = dZmax + EMC.L3 = dZref + -- dichiaro modificato + EMC.MODIF = true + end + end + end +end + + +---------- OnSpecialApplyDisposition & OnPostApplyMachining --------- +----------------------- Costanti ------------------------------------ +local DELTA_SIC = 1 +local MinJoin = BD.MIN_JOIN_S +local MinOther = abs( MinY1) + abs( MaxY2) + MinJoin +local SIC_V = 50 -- sicurezza da testa +local MIN_FRONT_ENG_V = 152 -- ingombro asse Z con cremagliera a destra +local MIN_BACK_ENG_V = 115 -- ingombro asse Z a sinistra +local AGG_V = MinDeltaYV -- ingombro rulli pressori + sicurezza +local MIN_CLAMP_5 = 150 -- minima presa con la pinza speciale (pinza 5) +local SIC_CLAMP_5 = 50 -- sicurezza testa da pinza speciale +local MAX_BACK_CLAMP_5 = 320 -- massima sporgenza posteriore del pezzo da pinza speciale + +----------------------- Variabili ----------------------------------- +local Test = false +local SPLIT + +--------------------------------------------------------------------- +local function PrepareClGroup( nParentId) + + local nClId = EgtGetFirstNameInGroup( nParentId, 'CL') + -- se non c'è, lo aggiungo + if not nClId then + nClId = EgtGroup( EMC.DISPID) + if not nClId then + return nil + end + EgtSetName( nClId, 'CL') + -- altrimenti lo svuoto + else + EgtEmptyGroup( nClId) + end + + return nClId +end + +--------------------------------------------------------------------- +local function IsStartOrRestPhase( nPhase) + local sVal = EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'TYPE') + return ( sVal == 'START' or sVal == 'REST') +end + +--------------------------------------------------------------------- +local function IsMidPhase( nPhase) + local sVal = EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'TYPE') + return ( sVal == 'MID') +end + +--------------------------------------------------------------------- +local function IsEndPhase( nPhase) + local sVal = EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'TYPE') + return ( sVal == 'END') +end + +--------------------------------------------------------------------- +local function IsMid2Phase( nPhase) + local sVal = EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'TYPE') + return ( sVal == 'MID2') +end + +--------------------------------------------------------------------- +local function IsEnd2Phase( nPhase) + local sVal = EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'TYPE') + return ( sVal == 'END2') +end + +--------------------------------------------------------------------- +local function GetNextStartOrRestPhase( nPhase) + local nNextPhase = nPhase + 1 + while nNextPhase <= EgtGetPhaseCount() do + if IsStartOrRestPhase( nNextPhase) then + break ; + end + nNextPhase = nNextPhase + 1 + end + return nNextPhase +end + +--------------------------------------------------------------------- +local function GetPhaseRot( nPhase) + return ( EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'ROT', 'i') or 0) +end + +--------------------------------------------------------------------- +local function IsLastOperationBeforeRotation( nMchId) + -- se ultima fase o ultima fase del pezzo, ritorno risultato negativo + if EMC.PHASE == EgtGetPhaseCount() or IsEndPhase( EMC.PHASE) or IsEnd2Phase( EMC.PHASE) then + return false + end + -- recupero la successiva operazione attiva + local nNextOperId = EgtGetNextActiveOperation( nMchId) + -- se non esiste o non è una disposizione, ritorno risultato negativo + if not nNextOperId or EgtGetOperationType( nNextOperId) ~= MCH_OY.DISP then + return false + end + -- recupero le rotazioni della fase corrente e della prossima fase + local nRot = GetPhaseRot( EMC.PHASE) + local nNextRot = GetPhaseRot( EMC.PHASE + 1) + -- ritorno se sono diverse + return ( nRot ~= nNextRot) +end + +--------------------------------------------------------------------- +local function IsFirstMachiningAfterRotation( nMchId) + -- se prima fase o prima fase del pezzo, ritorno risultato negativo + if EMC.PHASE == 1 or IsStartOrRestPhase( EMC.PHASE) then + return false + end + -- recupero la precedente operazione attiva + local nPrevOperId = EgtGetPrevActiveOperation( nMchId) + -- se non esiste o non è una disposizione, ritorno risultato negativo + if not nPrevOperId or EgtGetOperationType( nPrevOperId) ~= MCH_OY.DISP then + return false + end + -- recupero le rotazioni della fase corrente e della fase precedente + local nRot = GetPhaseRot( EMC.PHASE) + local nPrevRot = GetPhaseRot( EMC.PHASE - 1) + -- ritorno se sono diverse + return ( nRot ~= nPrevRot) +end + +--------------------------------------------------------------------- +local function UpdateMinJoin() + MinJoin = BD.GetMinJoin( EMC.SB, EMC.HB, EMC.LB) + MinOther = abs( MinY1) + abs( MaxY2) + MinJoin +end + +--------------------------------------------------------------------- +local function GetCUTID() + -- recupero CUTID del pezzo in lavoro + local nOrd = GetPhaseOrd( EMC.PHASE) + local nPartRawId + local nRawId = EgtGetFirstRawPart() + while nRawId do + local nRawOrd = EgtGetInfo( nRawId, 'ORD', 'i') + if nRawOrd == nOrd then + nPartRawId = nRawId + break + end + nRawId = EgtGetNextRawPart( nRawId) + end + local CutID = EgtGetInfo( EgtGetFirstPartInRawPart( nPartRawId or GDB_ID.NULL) or GDB_ID.NULL, 'CUTID', 'i') or 0 + return CutID +end + +--------------------------------------------------------------------- +local function GetNextRawInOrd( nCurrRawId) + local nCurrOrd = EgtGetInfo( nCurrRawId, 'ORD', 'i') + if not nCurrOrd then return end + local nRawId = EgtGetFirstRawPart() + while nRawId do + local nRawOrd = EgtGetInfo( nRawId, 'ORD', 'i') + if nRawOrd == nCurrOrd + 1 then + return nRawId + end + nRawId = EgtGetNextRawPart( nRawId) + end +end + +----------------------------------------------------------------------- +local function EnsureZmax( bCloseV, vCmd, nInd) + -- posizionamento sicuro teste e rulli + if not nInd then + table.insert( vCmd, { 4, EgtIf( bCloseV, 1, 0)}) + else + table.insert( vCmd, nInd, { 4, EgtIf( bCloseV, 1, 0)}) + end + return true +end + +----------------------------------------------------------------------- +local function EmitComment( vCmd, sOut) + EgtOutLog( ' ' .. sOut, 1) + if Test then + table.insert( vCmd, { 0, sOut}) + end +end + +--------------------------------------------------------------------- +function OnSpecialApplyDisposition() + + EgtOutLog( ' *** Fase : ' .. EgtNumToString( EMC.PHASE, 0) .. ' ***', 1) + + -- Inizializzo codice di errore + EMC.ERR = 0 + + -- Campi obbligatori ma non usati + EMC.HEAD = "H14" + EMC.EXIT = 1 + EMC.TCPOS = "" + EMC.SHIFTS = 0 + EMC.SBH = false + + -- Se disposizione da saltare non devo fare alcunché + if EgtExistsInfo( EMC.DISPID, 'SKIP') then return end + + -- Assegno flag di pezzo separato dal resto del grezzo + SPLIT = IsEndPhase( EMC.PHASE) or IsMid2Phase( EMC.PHASE) or IsEnd2Phase( EMC.PHASE) + + -- Recupero il tipo dell'operazione successiva + local nNextOpeType = EgtGetOperationType( EgtGetNextActiveOperation( EMC.DISPID) or GDB_ID.NULL) + + -- Se ci sono lavorazioni successive non devo fare alcunché + if nNextOpeType ~= MCH_OY.NONE and nNextOpeType ~= MCH_OY.DISP then return end + + -- Imposto gruppo e path di movimento + local nClId = PrepareClGroup( EMC.DISPID) + if not nClId then + EMC.ERR = 3 + EMC.MSG = ' Error : creation CL group failed' + return + end + local nPathId = EgtGroup( nClId) + if not nPathId then + EMC.ERR = 6 + EMC.MSG = ' Error : creation path in CL group failed' + return + end + EgtSetName( nPathId, 'Empty') + EMC.PATHID = nPathId + EMC.SHIFTS = -1 + + -- Se l'operazione successiva è una disposizione con rotazione, devo preparare il pezzo alla rotazione + if IsLastOperationBeforeRotation( EMC.DISPID) then + -- aggiornamento posizioni + if IsStartPhase( EMC.PHASE) then + -- carico le posizioni + local dPosT = EgtGetInfo( EMC.DISPID, 'TPOS', 'd') + local dPosY = EgtGetInfo( EMC.DISPID, 'Y1POS', 'd') + EMC.TPOS = dPosT + EMC.Y1DELTA = dPosY - dPosT + EMC.Y2DELTA = nil + EMC.W2DELTA = nil + EMC.V1POS = EgtGetInfo( EMC.DISPID, 'V1POS', 'd') or ParkV1 + EMC.V2POS = EgtGetInfo( EMC.DISPID, 'V2POS', 'd') or ParkV2 + EMC.CNT = 1 + else + local nPrevOpeId = EgtGetPrevActiveOperation( EMC.DISPID) + local nLastPathId = EgtGetLastInGroup( EgtGetFirstNameInGroup( nPrevOpeId, 'CL') or GDB_ID.NULL) + local nLastEntId = EgtGetLastInGroup( nLastPathId) + local vAxes = EmtGetAxesPos( nLastEntId) + if #vAxes > 0 then EMC.TPOS = vAxes[1] end + EMC.Y1DELTA = EgtGetInfo( nLastPathId, 'Y1DELTA', 'd') + EMC.Y2DELTA = EgtGetInfo( nLastPathId, 'Y2DELTA', 'd') + EMC.W2DELTA = EgtGetInfo( nLastPathId, 'W2DELTA', 'd') + EMC.V1POS = EgtGetInfo( nLastPathId, 'V1POS', 'd') or ParkV1 + EMC.V2POS = EgtGetInfo( nLastPathId, 'V2POS', 'd') or ParkV2 + EMC.CNT = SpecGetCNT( EMC.DISPID) + end + -- Determinazione delle dimensioni del grezzo in lavoro + local b3Raw = BBox3d() + local nRawId = EgtGetFirstRawPart() + while nRawId do + if EgtVerifyRawPartPhase( nRawId, EMC.PHASE) then + b3Raw = EgtGetRawPartBBox( nRawId) + break + end + nRawId = EgtGetNextRawPart( nRawId) + end + EMC.LB = b3Raw:getDimX() + 10 * GEO.EPS_SMALL + -- Assegno sovramateriale di testa e ingombro tagli di testa e di coda + EMC.HOVM = EgtGetInfo( nRawId, 'HOVM', 'd') or 0 + EMC.HCING = 0 + EMC.TCING = EgtGetInfo( nRawId, 'TCING', 'd') or 0 + -- Eseguo preparazione alla rotazione + local vCmd = SpecCalcPreRot() + SpecOutputCmds( vCmd, true) + return + end + + -- Se la lavorazione successiva è ancora una disposizione, devo scaricare il pezzo + if nNextOpeType == MCH_OY.DISP and SPLIT and not IsEnd2Phase( EMC.PHASE) then + -- aggiornamento posizioni + local nPrevOpeId = EgtGetPrevActiveOperation( EMC.DISPID) + local nLastPathId = EgtGetLastInGroup( EgtGetFirstNameInGroup( nPrevOpeId, 'CL') or GDB_ID.NULL) + local nLastEntId = EgtGetLastInGroup( nLastPathId) + local vAxes = EmtGetAxesPos( nLastEntId) + if #vAxes > 0 then EMC.TPOS = vAxes[1] end + EMC.Y1DELTA = EgtGetInfo( nLastPathId, 'Y1DELTA', 'd') + EMC.Y2DELTA = EgtGetInfo( nLastPathId, 'Y2DELTA', 'd') + EMC.W2DELTA = EgtGetInfo( nLastPathId, 'W2DELTA', 'd') + EMC.V1POS = EgtGetInfo( nLastPathId, 'V1POS', 'd') or ParkV1 + EMC.V2POS = EgtGetInfo( nLastPathId, 'V2POS', 'd') or ParkV2 + EMC.CNT = SpecGetCNT( EMC.DISPID) + -- Determinazione delle dimensioni del grezzo in lavoro + local b3Raw = BBox3d() + local nRawId = EgtGetFirstRawPart() + while nRawId do + if EgtVerifyRawPartPhase( nRawId, EMC.PHASE) and not EgtVerifyRawPartPhase( nRawId, EMC.PHASE + 1) then + b3Raw = EgtGetRawPartBBox( nRawId) + break + end + nRawId = EgtGetNextRawPart( nRawId) + end + EMC.LB = b3Raw:getDimX() + EMC.HOVM = EgtGetInfo( nRawId or GDB_ID.NULL, 'HOVM', 'd') or 0 + -- Eseguo scarico + local vCmd = SpecCalcUnload() + SpecOutputCmds( vCmd, true) + return + end + + -- Verifico ci sia un solo grezzo nella fase corrente + local nRawCount = 0 + local nCurrRawId = GDB_ID.NULL + local nRawId = EgtGetFirstRawPart() + while nRawId do + if EgtVerifyRawPartPhase( nRawId, EMC.PHASE) then + nRawCount = nRawCount + 1 + nCurrRawId = nRawId + end + nRawId = EgtGetNextRawPart( nRawId) + end + if nRawCount > 1 then + EMC.ERR = 10 + EMC.MSG = ' Error : too many Raw Parts in current Phase' + return + end + + -- Determinazione delle sue dimensioni + local b3Raw = EgtGetRawPartBBox( nCurrRawId) + if b3Raw:isEmpty() then + EMC.ERR = 11 + EMC.MSG = ' Error : null Raw Part' + return + end + EMC.LB = b3Raw:getDimX() + EMC.SB = b3Raw:getDimY() + EMC.HB = b3Raw:getDimZ() + + -- Aggiorno limiti di presa + UpdateMinJoin() + + -- Assegno sovramateriale di testa e ingombro tagli di testa e di coda + EMC.HOVM = 0 + EMC.HCING = 0 + EMC.TCING = 0 + + -- Devo scaricare il grezzo rimasto (deve essere unico) + -- Posizione trave + local dPosT + + -- Se fase 1 o dopo rotazione eseguo carico con carrello Y + local vCmd = {} + if EMC.PHASE == 1 or IsEnd2Phase( EMC.PHASE) then + dPosT = LoadT + if IsEnd2Phase( EMC.PHASE) then dPosT = dPosT + TurnerOffs end + vCmd = SpecCalcLoad( dPosT, 0, max( MinJoin + EgtIf( SPLIT, EMC.TCING, 0), EMC.LB - ( MaxY1 - MinY1) + 6)) + -- se altrimenti fase successiva alla prima di tipo inizio o rimanenza + elseif IsStartOrRestPhase( EMC.PHASE) then + -- recupero posizione trave e quota di aggancio carrello + dPosT = EgtGetInfo( EMC.DISPID, 'TPOS', 'd') + local dPosY1 = EgtGetInfo( EMC.DISPID, 'Y1POS', 'd') + -- se carrello agganciato + if dPosY1 then + -- confermo i nuovi parametri di aggancio + table.insert( vCmd, { 21, dPosY1 - dPosT, 0}) + -- recupero posizione rulli + EMC.V1POS = ParkV1 + EMC.V2POS = ParkV2 + -- recupero contatore pinza 1 + EMC.CNT = SpecGetCNT( EMC.DISPID) + -- altrimenti è grezzo scaricato al carico e devo ricaricarlo + else + vCmd = SpecCalcLoad( dPosT, 0, max( MinJoin, EMC.LB - ( MaxY1 - MinY1) + 6)) + end + -- altrimenti fase successiva pari + else + EMC.Y2DELTA = EgtGetInfo( EMC.DISPID, 'Y2POS', 'd') + EMC.W2DELTA = nil + EMC.V1POS = EgtGetInfo( EMC.DISPID, 'V1POS', 'd') + EMC.V2POS = EgtGetInfo( EMC.DISPID, 'V2POS', 'd') + -- recupero contatore pinza 1 + EMC.CNT = SpecGetCNT( EMC.DISPID) + end + -- Se fase inizio o rimanenza, eseguo scambio per avere solo pinza V + local vCmd2 = {} + if IsStartOrRestPhase( EMC.PHASE) or IsEnd2Phase( EMC.PHASE) then + EMC.TPOS = dPosT + SpecSetCarrPosFromCmds( vCmd) + local dDistFront = EMC.LB - MinJoin + 10 * GEO.EPS_SMALL + local dDistBack = 0 + local dY2DeltaMinUL = EMC.LB + MinY2 - UnloadT + vCmd2 = SpecCalcCarriages( dDistFront, dDistBack, -EMC.V2POS, EMC.V1POS, nil, dY2DeltaMinUL) + if vCmd and #vCmd > 1 and vCmd2 and #vCmd2 > 1 and SpecTestSomeMoveInCmds( vCmd2) then + table.insert( vCmd, { 0, 'CARR_MOVE'}) + end + end + -- eseguo scarico + SpecSetCarrPosFromCmds( vCmd2) + local vCmd3 = SpecCalcUnload() + -- unisco ed emetto i comandi + vCmd = EgtJoinTables( vCmd, vCmd2) + vCmd = EgtJoinTables( vCmd, vCmd3) + SpecOutputCmds( vCmd, true) +end + +--------------------------------------------------------------------- +function OnPostApplyMachining() + + EgtOutLog( ' Lavorazione : ' .. EgtGetName( EMC.MCHID), 1) + + -- Inizializzo codice di errore + EMC.ERR = 0 + + -- Recupero la posizione della trave e dei carrelli al termine della precedente operazione + local nPrevOpeId = EgtGetPrevActiveOperation( EMC.MCHID) + -- se precedente operazione non esiste, errore + if not nPrevOpeId then + EMC.ERR = 1 + EMC.MSG = ' Error : previous Disposition not found' + return + -- se precedente operazione è disposizione + elseif EgtGetOperationType( nPrevOpeId) == MCH_OY.DISP then + if EMC.PHASE == 1 or IsFirstMachiningAfterRotation( EMC.MCHID) then + -- posizioni home + EMC.TPOS = nil + EMC.Y1DELTA = nil + EMC.Y2DELTA = nil + EMC.W2DELTA = nil + EMC.V1POS = ParkV1 + EMC.V2POS = ParkV2 + EMC.CNT = nil + elseif IsStartOrRestPhase( EMC.PHASE) then + -- carico le posizioni + local dPosT = EgtGetInfo( nPrevOpeId, 'TPOS', 'd') + local dPosY = EgtGetInfo( nPrevOpeId, 'Y1POS', 'd') + -- se carrello agganciato + if dPosY then + EMC.TPOS = dPosT + EMC.Y1DELTA = dPosY - dPosT + EMC.Y2DELTA = nil + EMC.W2DELTA = nil + EMC.V1POS = ParkV1 + EMC.V2POS = ParkV2 + EMC.CNT = SpecGetCNT( EMC.MCHID) + -- altrimenti è grezzo scaricato al carico e devo ricaricarlo + else + EMC.TPOS = nil + EMC.Y1DELTA = nil + EMC.Y2DELTA = nil + EMC.W2DELTA = nil + EMC.V1POS = ParkV1 + EMC.V2POS = ParkV2 + EMC.CNT = 1 + end + else + -- aggiornamento posizioni (da lavorazione precedente a disposizione) + local nPrev2OpeId = EgtGetPrevActiveOperation( nPrevOpeId) + if not nPrev2OpeId then + EMC.ERR = 1 + EMC.MSG = ' Error : previous Disposition not found' + return + end + local nLastPathId = EgtGetLastInGroup( EgtGetFirstNameInGroup( nPrev2OpeId, 'CL') or GDB_ID.NULL) + local nLastEntId = EgtGetLastInGroup( nLastPathId) + local vAxes = EmtGetAxesPos( nLastEntId) + if #vAxes > 0 then EMC.TPOS = vAxes[1] end + EMC.Y1DELTA = EgtGetInfo( nLastPathId, 'Y1DELTA', 'd') + EMC.Y2DELTA = EgtGetInfo( nLastPathId, 'Y2DELTA', 'd') + EMC.W2DELTA = EgtGetInfo( nLastPathId, 'W2DELTA', 'd') + EMC.V1POS = EgtGetInfo( nLastPathId, 'V1POS', 'd') or ParkV1 + EMC.V2POS = EgtGetInfo( nLastPathId, 'V2POS', 'd') or ParkV2 + EMC.CNT = SpecGetCNT( EMC.MCHID) + end + -- altrimenti precedente operazione è lavorazione + else + -- aggiornamento posizioni + local nLastPathId = EgtGetLastInGroup( EgtGetFirstNameInGroup( nPrevOpeId, 'CL') or GDB_ID.NULL) + local nLastEntId = EgtGetLastInGroup( nLastPathId) + local bAtZMax = ( EgtGetClEntMove( nLastEntId) == 0 and EgtGetClEntFlag( nLastEntId) == 3) + local vAxes = EmtGetAxesPos( nLastEntId) + if #vAxes > 0 then EMC.TPOS = vAxes[1] end + EMC.Y1DELTA = EgtGetInfo( nLastPathId, 'Y1DELTA', 'd') + EMC.Y2DELTA = EgtGetInfo( nLastPathId, 'Y2DELTA', 'd') + EMC.W2DELTA = EgtGetInfo( nLastPathId, 'W2DELTA', 'd') + EMC.V1POS = EgtIf( bAtZMax, ParkV1, EgtGetInfo( nLastPathId, 'V1POS', 'd') or ParkV1) + EMC.V2POS = EgtIf( bAtZMax, ParkV2, EgtGetInfo( nLastPathId, 'V2POS', 'd') or ParkV2) + EMC.CNT = SpecGetCNT( EMC.MCHID) + end + + -- Verifico se ultima lavorazione della fase + local nNextOpeId = EgtGetNextActiveOperation( EMC.MCHID) + local bMchLast = ( not nNextOpeId or EgtGetOperationPhase( nNextOpeId) ~= EMC.PHASE) + + -- Verifico se ultima lavorazione prima di una rotazione + local bPreRotMch = IsLastOperationBeforeRotation( EMC.MCHID) + + -- Verifico flag di separazione e fase di scarico + local sNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) + local bPreSplit = ( false and sNotes:find( 'Presplit', 1, true) ~= nil) + local bSplitting = ( sNotes:find( 'Split', 1, true) ~= nil) + local bPreCut = ( sNotes:find( 'Precut', 1, true) ~= nil) + local bCutting = ( sNotes:find( 'Cut', 1, true) ~= nil) + local bUnload = IsEndPhase( EMC.PHASE) or IsEnd2Phase( EMC.PHASE) + + -- Agisco sui diversi percorsi della lavorazione + local nPathId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( EMC.MCHID, 'CL') or GDB_ID.NULL) + while nPathId do + -- assegno id percorso da elaborare + EMC.PATHID = nPathId + -- recupero id del successivo + nPathId = EgtGetNext( nPathId) + -- verifico se ultimo percorso di ultima lavorazione della fase + local bLast = ( bMchLast and ( not nPathId)) + -- se ultimo, elimino ritorno in home + if bLast then EgtRemoveOperationHome( EMC.MCHID) end + -- salvo lo stato dei carrelli + local OriTPos = EMC.TPOS + local OriY1Delta = EMC.Y1DELTA + local OriY2Delta = EMC.Y2DELTA + local OriW2Delta = EMC.W2DELTA + local OriV1Pos = EMC.V1POS + local OriV2Pos = EMC.V2POS + local OriCnt = EMC.CNT + -- eseguo le elaborazioni + SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bLast and bUnload, bLast and bPreRotMch) + -- se separazione, verifico il risultato + if bSplitting then + -- recupero CUTID del pezzo in lavoro + local CutID = GetCUTID() + -- in caso di errore mancato pinzaggio uscita riprovo dopo aver disabilitato le lavorazioni finali + if EMC.ERR == 18 then + -- segnalazione warning + EMC.ERR = -101 + EMC.MSG = 'Warning : skipped final processes (WRN=101,CUTID='..tostring( CutID)..')' + -- ripristino lo stato originale dei carrelli + EMC.TPOS = OriTPos + EMC.Y1DELTA = OriY1Delta + EMC.Y2DELTA = OriY2Delta + EMC.W2DELTA = OriW2Delta + EMC.V1POS = OriV1Pos + EMC.V2POS = OriV2Pos + EMC.CNT = OriCnt + -- eseguo le elaborazioni + SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bLast and bUnload, bLast and bPreRotMch) + -- pinzaggio ancora impossibile, pezzo a caduta + if EMC.ERR == 18 then + -- segnalazione warning + EMC.ERR = -102 + EMC.MSG = 'Warning : skipped final processes and unload by fall (WRN=102,CUTID='..tostring( CutID)..')' + end + -- scarico standard + elseif EMC.ERR == 0 then + -- segnalazione warning + EMC.ERR = -100 + EMC.MSG = 'Warning : standard unload (WRN=100,CUTID='..tostring( CutID)..')' + end + -- se taglio del residuo finale, scarico standard + elseif bCutting then + -- recupero CUTID del pezzo in lavoro + local CutID = GetCUTID() + -- se non ci sono errori, segnalazione warning + if EMC.ERR == 0 then + EMC.ERR = -100 + EMC.MSG = 'Warning : standard unload (WRN=100,CUTID='..tostring( CutID)..')' + end + end + if EMC.ERR > 0 then return end + -- determino la posizione finale della trave + local nLastEntId = EgtGetLastInGroup( EMC.PATHID) + local vAxes = EmtGetAxesPos( nLastEntId) + if #vAxes > 0 then EMC.TPOS = vAxes[1] end + end + +end + +--------------------------------------------------------------------- +function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload, bPreRotMch) + + -- Assegno flag di pezzo separato dal resto del grezzo + SPLIT = IsEndPhase( EMC.PHASE) or IsMid2Phase( EMC.PHASE) or IsEnd2Phase( EMC.PHASE) + + -- Determinazione delle dimensioni totali dei grezzi e del grezzo in lavoro + local b3Tot = BBox3d() + local b3Raw = BBox3d() + local nNextOddPhase = GetNextStartOrRestPhase( EMC.PHASE) + local nRawId = EgtGetFirstRawPart() + local nCurrRawId = GDB_ID.NULL + while nRawId do + if EgtVerifyRawPartPhase( nRawId, EMC.PHASE) then + local b3Tmp = EgtGetRawPartBBox( nRawId) + b3Tot:Add( b3Tmp) + if EgtGetPartInRawPartCount( nRawId) > 0 and not EgtVerifyRawPartPhase( nRawId, nNextOddPhase) then + b3Raw = b3Tmp + nCurrRawId = nRawId + end + end + nRawId = EgtGetNextRawPart( nRawId) + end + if b3Tot:isEmpty() then + EMC.ERR = 11 + EMC.MSG = ' Error : null Raw Parts' + return + end + EMC.LB = EgtIf( SPLIT, b3Raw:getDimX(), b3Tot:getDimX()) + EMC.SB = b3Tot:getDimY() + EMC.HB = b3Tot:getDimZ() + EMC.LT = b3Raw:getDimX() + + -- Aggiorno limiti di presa + UpdateMinJoin() + + -- Recupero sovramateriale di testa e ingombro tagli di testa e di coda + EMC.HOVM = EgtGetInfo( nCurrRawId, 'HOVM', 'd') or 0 + EMC.HCING = EgtGetInfo( nCurrRawId, 'HCING', 'd') or 0 + EMC.TCING = EgtGetInfo( nCurrRawId, 'TCING', 'd') or 0 + -- Recupero ingombro dei tagli di testa del prossimo pezzo (se esiste) + EMC.NEXT_HCING = 0 + local nNextRawId = GetNextRawInOrd( nCurrRawId) + if nNextRawId then + EMC.NEXT_HCING = EgtGetInfo( nNextRawId, 'HCING', 'd') or 0 + end + + -- Calcolo dell'ingombro della lavorazione + local dDistFront, dDistBack, dRollFront, dRollBack = SpecialCalcMachiningEncumbrance( EMC.MCHID, bPreCut) + if not dDistFront then return end + local dMaxLenLeft = 0 + if bPreSplit or bSplitting then + local dDistF, dDistB, dRollF, dRollB, dMaxLF = SpecialCalcPhaseEncumbrance( EMC.PHASE + 1) + dDistFront = min( dDistFront, dDistF) + dDistBack = dDistBack + if bSplitting then dMaxLenLeft = dMaxLF end + elseif bPreCut or bCutting then + local dDistF, dDistB, dRollF, dRollB = SpecialCalcPhaseEncumbrance( EMC.PHASE + 1) + dDistFront = min( dDistFront, dDistF) + dDistBack = min( dDistBack, dDistB) + end + + -- Verifico lunghezza pezzo + if not SPLIT and not VerifyPartLength() then + return + end + + -- Calcolo quali carrelli sono necessari + local nChar + if bPreSplit or bSplitting then + nChar = 2 + elseif bPreCut or bCutting then + nChar = 3 + end + local dY1DeltaMaxSP + if nChar == 2 then + dY1DeltaMaxSP = MaxY1 - LoadT + EMC.LT + end + local dY2DeltaMinUL + if nChar == 2 or nChar == 3 or IsEnd2Phase( EMC.PHASE) then + dY2DeltaMinUL = EMC.LT + MinY2 - UnloadT + end + + local vSaveCmd + -- Se inizio o appena dopo rotazione, eseguo il carico + if not EMC.TPOS then + local dPosT = LoadT + if IsFirstMachiningAfterRotation( EMC.MCHID) then dPosT = dPosT + TurnerOffs end + local vCmd = SpecCalcLoad( dPosT, dDistFront, max( dDistBack, MinJoin + EgtIf( SPLIT, EMC.TCING, 0), EMC.LB - ( MaxY1 - MinY1) + 6)) + local vCmd2 = SpecCalcCarriages( dDistFront, dDistBack, dRollFront, dRollBack, dY1DeltaMaxSP, dY2DeltaMinUL, nChar) + if bSplitting and EMC.ERR == 18 then + table.insert( vCmd, { 22, dRollBack, -dRollFront}) + end + if vCmd2 and #vCmd2 > 1 and SpecTestSomeMoveInCmds( vCmd2) then + table.insert( vCmd, { 0, 'CARR_MOVE'}) + end + EgtJoinTables( vCmd, vCmd2) + SpecOutputCmds( vCmd) + vSaveCmd = vCmd + + -- Se altrimenti carri entrambi diponibili, eseguo calcoli per carrelli + elseif not IsEndPhase( EMC.PHASE) then + local vCmd = SpecCalcCarriages( dDistFront, dDistBack, dRollFront, dRollBack, dY1DeltaMaxSP, dY2DeltaMinUL, nChar) + -- Se non ci sono spostamenti, confermo i parametri di aggancio e di posizione roller + if SpecTestOnlyRemarkInCmds( vCmd) then + table.insert( vCmd, { 21, EgtIf( EMC.Y1DELTA, EMC.Y1DELTA, 0), EgtIf( EMC.Y2DELTA, EMC.Y2DELTA, 0)}) + table.insert( vCmd, { 22, dRollBack, -dRollFront}) + end + SpecOutputCmds( vCmd) + vSaveCmd = vCmd + + -- Altrimenti, non muovo i carrelli rispetto alla trave ma impongo la posizione dei rulli + else + SpecOutputCNT() + local vCmd = {} + table.insert( vCmd, { 21, EgtIf( EMC.Y1DELTA, EMC.Y1DELTA, 0), EgtIf( EMC.Y2DELTA, EMC.Y2DELTA, 0)}) + table.insert( vCmd, { 22, dRollBack, -dRollFront}) + SpecOutputCmds( vCmd) + vSaveCmd = vCmd + end + + -- Se taglio di separazione + local vCmd = {} + if bSplitting then + -- rimuovo eventuale vecchia info di Skip + local NextDispId = EgtGetPhaseDisposition( EMC.PHASE + 1) or GDB_ID.NULL + EgtRemoveInfo( NextDispId, 'SKIP') + -- verifico che la barra sia agganciata al secondo carrello + if not EMC.Y2DELTA then + local dTLen = EMC.LT - EMC.HOVM - BD.OVM_MID + local dRefIng = EgtIf( dTLen < 350, 120, EgtIf( dTLen < 550, 150, 200)) + local dClampLen = dTLen - min( EMC.HCING + EMC.TCING, dRefIng) + -- se pinza 5, presa ammissibile e pezzo con dimensioni nei limiti + if Clamp5 and dClampLen > MIN_CLAMP_5 + SIC_CLAMP_5 - 10 * GEO.EPS_SMALL and + EMC.SB > MinWOpen - 10 * GEO.EPS_SMALL and EMC.SB < MaxWOpen + 10 * GEO.EPS_SMALL and EMC.HB < MaxWHeight + 10 * GEO.EPS_SMALL then + EgtOutLog( ' Warning SPLITTING -> separazione con uso pinza speciale') + SpecOutputCNT() + EMC.ERR = 0 + local dDeltaP5 = EMC.LT - BD.OVM_MID - min( EMC.TCING, 0.5 * dRefIng) - SIC_CLAMP_5 - 0.4 * max( dClampLen - MIN_CLAMP_5 - SIC_CLAMP_5, 0) + dDeltaP5 = max( dDeltaP5, EMC.LT- BD.OVM_MID - MAX_BACK_CLAMP_5) + local vCmd = vSaveCmd + table.insert( vCmd, { 23, dDeltaP5}) + SpecOutputCmds( vCmd) + -- altrimenti separazione con caduta + else + EgtOutLog( ' Warning SPLITTING -> separazione con caduta pezzo') + SpecOutputCNT() + if IsEndPhase( EMC.PHASE + 1) then + EgtSetInfo( NextDispId, 'SKIP', '1') + local NextOpeId = EgtGetNextOperation( NextDispId) + while NextOpeId and EgtGetOperationPhase( NextOpeId) == EMC.PHASE + 1 do + EgtSetOperationMode( NextOpeId, false) + NextOpeId = EgtGetNextOperation( NextOpeId) + end + end + end + -- rimane impostato l'errore 18 + -- verifico che la barra sia agganciata anche al primo carrello + elseif not EMC.Y1DELTA then + EMC.ERR = 19 + EMC.MSG = ' Error SPLIT : Y1 or Y2 not clamped' + return false + end + -- eseguo la separazione + EgtOutLog( 'MaxLenLeft=' .. EgtNumToString( dMaxLenLeft, 1), 1) + if not IsMid2Phase( EMC.PHASE + 1) then + vCmd = SpecCalcSplit( b3Raw:getDimX(), dMaxLenLeft) + else + vCmd = SpecCalcSplitRot( b3Raw:getDimX(), dMaxLenLeft) + end + end + -- Se taglio finale di grezzo a perdere + if bCutting then + -- salvo distanza carrello Y2 da inizio grezzo rimasto nella disposizione della prossima fase + local NextDispId = EgtGetPhaseDisposition( EMC.PHASE + 1) + if NextDispId then + EgtSetInfo( NextDispId, 'Y2POS', EMC.Y2DELTA) + EgtSetInfo( NextDispId, 'V1POS', EMC.V1POS) + EgtSetInfo( NextDispId, 'V2POS', EMC.V2POS) + end + end + + -- Se previsto scarico, lo eseguo + if bUnload then + EMC.LB = b3Raw:getDimX() + local vCmdTmp = SpecCalcUnload() + vCmd = EgtJoinTables( vCmd, vCmdTmp) + end + + -- Se ritorno al carico per rotazione + if bPreRotMch then + -- determino posizione testa trave + local nLastEntId = EgtGetLastInGroup( EMC.PATHID) + local vAxes = EmtGetAxesPos( nLastEntId) + if #vAxes > 0 then EMC.TPOS = vAxes[1] end + -- eseguo movimento prima di rotazione + local vCmdTmp = SpecCalcPreRot() + vCmd = EgtJoinTables( vCmd, vCmdTmp) + end + + -- Emetto eventuali comandi di separazione e/o scarico + if #vCmd > 0 then + SpecOutputCmds( vCmd, true) + end + +end --SpecApplyPath( bLast) + +--------------------------------------------------------------------- +function SpecialCalcMachiningEncumbrance( nMchId, bPreCut) + -- gruppi della lavorazione + local nClId = EgtGetFirstNameInGroup( nMchId, 'CL') + local nPathId = EgtGetFirstInGroup( nClId or GDB_ID.NULL) + if not nPathId then + EMC.ERR = 12 + EMC.MSG = ' Error : CL group path not found' + return + end + -- recupero ptMin ptMax della lavorazione + local ptMin = EgtGetInfo( nClId, 'MMIN', 'p') + local ptMax = EgtGetInfo( nClId, 'MMAX', 'p') + if not ptMin or not ptMax then + EMC.ERR = 13 + EMC.MSG = ' Error : machining Min or Max not found' + return + end + -- se pre-taglio, aggiorno ptMax con quello del taglio finale + if bPreCut then + local ptFinMax = GetFinalCutPmax( nMchId) + if ptFinMax then + ptMax = ptFinMax + end + end + -- Recupero testa + local sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD) + -- Recupero valore assi macchina + local nSecId = EgtGetNext( EgtGetFirstInGroup( nPathId)) + local vAxes = EmtGetAxesPos( nSecId) + if not vAxes or #vAxes < 5 or (( sHead == 'H13') and #vAxes < 6) then + EMC.ERR = 15 + EMC.MSG = ' Error : machine axes values not found' + return + end + -- Calcolo dell'ingombro della testa rispetto allo Zero Macchina + local b3Enc + if sHead ~= 'H21' and sHead ~= 'H22' and sHead ~= 'H23' then + EgtSetAxisPos( 'C1', vAxes[4]) + EgtSetAxisPos( 'B1', vAxes[5]) + if sHead == 'H13' then + EgtSetAxisPos( 'A', vAxes[6]) + end + b3Enc = EgtGetBBoxGlob( EgtGetAxisId( 'C1'), GDB_BB.ONLY_VISIBLE) + else + EgtSetAxisPos( 'C2', vAxes[4]) + EgtSetAxisPos( 'B2', vAxes[5]) + b3Enc = EgtGetBBoxGlob( EgtGetAxisId( 'C2'), GDB_BB.ONLY_VISIBLE) + end + local dRollFront = max( b3Enc:getMax():getX(), MIN_FRONT_ENG_V) + SIC_V + local dRollBack = max( -b3Enc:getMin():getX(), MIN_BACK_ENG_V) + SIC_V + EgtOutLog( ' RollFront = ' .. EgtNumToString( dRollFront, 1) .. ' RollBack = ' .. EgtNumToString( dRollBack, 1), 3) + -- Calcolo della posizione della Punta Utensile rispetto allo Zero Macchina + local ptTip + ptTip = EgtGetCalcTipFromPositions( 0, 0, 0, vAxes[4], vAxes[5], vAxes[6] or 0, false) + EgtOutLog( ' ToolTip = ' .. tostring( ptTip), 5) + -- Calcolo dell'ingombro della testa rispetto alla Punta Utensile + local dHeadFront = dRollFront + AGG_V - ptTip:getX() + local dHeadBack = dRollBack + AGG_V + ptTip:getX() + EgtOutLog( ' HeadFront = ' .. EgtNumToString( dHeadFront, 1) .. ' HeadBack = ' .. EgtNumToString( dHeadBack, 1), 5) + -- Distanze limiti della pinza di destra da testa trave e della pinza di sinistra da coda trave + local dDistFront = - ptMax:getX() - LoadT - dHeadFront + local dDistBack = ptMin:getX() + LoadT + EMC.LB - dHeadBack + EgtOutLog( ' DistFront = ' .. EgtNumToString( dDistFront, 1) .. ' DistBack = ' .. EgtNumToString( dDistBack, 1), 3) + return dDistFront, dDistBack, dRollFront, dRollBack +end + +--------------------------------------------------------------------- +function SpecialCalcPhaseEncumbrance( nPhase) + -- Deve essere la fase finale di lavorazione di un pezzo (già staccato dal resto della trave) + local dDistFront = EMC.LB + local dDistBack = EMC.LB + local dRollFront = 0 + local dRollBack = 0 + local dMaxLenLeft = 0 + -- Salvo lavorazione e utensile correnti, per ripristinarli alla fine + local nOrigMchId = EgtGetCurrMachining() + local sOrigTool = EgtTdbGetCurrToolParam( MCH_TP.NAME) + local sOrigHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD) + -- Ciclo sulle lavorazioni + local nMchId = EgtGetNextActiveOperation( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL) + while nMchId and EgtGetOperationPhase( nMchId) == nPhase do + -- imposto lavorazione e utensile correnti + EgtSetCurrMachining( nMchId) + local sTool = EgtGetMachiningParam( MCH_MP.TOOL) + EgtTdbSetCurrTool( sTool) + local sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD) + EgtSetCalcTool( sTool, sHead, 1) + -- calcolo ingombri + local dDistF, dDistB, dRollF, dRollB = SpecialCalcMachiningEncumbrance( nMchId) + if dDistF and dDistB then + dDistFront = min( dDistFront, dDistF) + dDistBack = min( dDistBack, dDistB) + dRollFront = max( dRollFront, dRollF) + dRollBack = max( dRollBack, dRollB) + local dMaxLenL = EMC.LT - dDistF - AGG_V - dRollF + EgtOutLog( ' MaxLenLeft = ' .. EgtNumToString( dMaxLenL, 1), 3) + dMaxLenLeft = max( dMaxLenLeft, dMaxLenL) + end + nMchId = EgtGetNextActiveOperation( nMchId) + end + -- Ripristino lavorazione e utensile correnti + if nOrigMchId then EgtSetCurrMachining( nOrigMchId) end + if sOrigTool then EgtTdbSetCurrTool( sOrigTool) end + if sOrigTool and sOrigHead then EgtSetCalcTool( sOrigTool, sOrigHead, 1) end + -- Restituisco gli ingombri trovati + return dDistFront, dDistBack, dRollFront, dRollBack, dMaxLenLeft +end + +--------------------------------------------------------------------- +function GetFinalCutPmax( nMchId) + local nFinalCutId + local nId = EgtGetNextActiveOperation( nMchId) + while nId and EgtGetOperationPhase( nId) == EMC.PHASE do + nFinalCutId = nId + nId = EgtGetNextActiveOperation( nId) + end + if not nFinalCutId then return end + local nCLId = EgtGetFirstNameInGroup( nFinalCutId, 'CL') + if not nCLId then return end + return EgtGetInfo( nCLId, 'MMAX', 'p') +end + +--------------------------------------------------------------------- +function VerifyPartLength() + + -- Verifico lunghezza pezzo + if EMC.LB < MinJoin + MinOther + AggLoad + EMC.HCING + EMC.HOVM then + EMC.ERR = 17 + EMC.MSG = ' Error CLAMP : part too short' + return false + end + + return true +end + +--------------------------------------------------------------------- +function SpecCalcLoad( dPosT, dDistFront, dDistBack) + --[L] + local dNewY1min = max( EMC.LB - dDistBack, MinOther + AggLoad + EMC.HCING + EMC.HOVM) + local dNewY1max = min( ( MaxY1 - MinY1) - 5, EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0)) + if dNewY1min > dNewY1max then return nil end + local dNewY1Delta = dNewY1max + local dNewY2Delta = nil + local dNewY1 = dPosT + dNewY1Delta + local vCmd = {} + EgtOutLog( ' *[L]', 1) + -- [L-1] + if dNewY1 + TurnerOffs - MaxY1 > 0 then + dNewY1Delta = min( EMC.LB - MinJoin, MaxY1 - dPosT - TurnerOffs) + EgtOutLog( ' *[L1]', 1) + end --[L-2] + if EMC.LB - dNewY1Delta < MinJoin then + dNewY1Delta = min( EMC.LB - MinJoin, MaxY1 - dPosT - TurnerOffs) + EgtOutLog( ' *[L2]', 1) + end + -- Commento + table.insert( vCmd, { 0, 'Loading'}) + -- posizionamento sicuro teste e rulli + EnsureZmax( false, vCmd) + -- Apro entrambe le morse + table.insert( vCmd, { 11, 0}) + EMC.CNT = nil + table.insert( vCmd, { 12, 0}) + -- Sposto il carrello Y per il carico + table.insert( vCmd, { 2, 'Y1', dPosT + dNewY1Delta, 'Y2', ParkY2}) + -- Chiudo morsa Y + table.insert( vCmd, { 11, 1}) + -- Sposto il carrello Y con la testa trave al parcheggio V1 + table.insert( vCmd, { 2, 'T', ParkV1, 'Y1', ParkV1 + dNewY1Delta}) + -- confermo i nuovi parametri di aggancio + table.insert( vCmd, { 21, dNewY1Delta, 0}) + -- Inizializzo contatore globale + EMC.CNT = 1 + SpecOutputCNT() + -- Assegno stato corrente + EMC.TPOS = ParkV1 + EMC.Y1DELTA = dNewY1Delta + EMC.Y2DELTA = nil + EMC.W2DELTA = nil + EMC.V1POS = ParkV1 + EMC.V2POS = ParkV2 + -- Restituisco i comandi + return vCmd +end -- SpecAdjustLoad [L] + +--------------------------------------------------------------------- +function SpecCalcCarriages( dDistFront, dDistBack, dRollFront, dRollBack, dY1DeltaMaxSP, dY2DeltaMinUL, nChar) + + local MinFrontJoin = MinJoin + EMC.HCING + EMC.HOVM + local MyMinOther = MinOther + EgtIf( EMC.CNT == 1, AggLoad, 0) + + local sMaxSplit = '' + if dY1DeltaMaxSP then sMaxSplit = '/'..EgtNumToString( dY1DeltaMaxSP, 1)..'(MaxSplit)' end + local sMinUnload = '' + if dY2DeltaMinUL then sMinUnload = '/'..EgtNumToString( dY2DeltaMinUL, 1)..'(MinUnload)' end + EgtOutLog( ' Dist/Min : Back=' .. EgtNumToString( dDistBack, 1) .. '/' .. EgtNumToString( MinJoin, 1) .. sMaxSplit .. + ' Front=' .. EgtNumToString( dDistFront, 1) .. '/' .. EgtNumToString( MinFrontJoin, 1) .. sMinUnload, 3) + + -- [A] se non richiesto solo carrello Y2 e posso mettere solo carrello Y1 + --if nChar ~= 3 and dDistBack > MinJoin - GEO.EPS_SMALL and dDistFront < MinFrontJoin then + if nChar ~= 2 and nChar ~= 3 and dDistBack > MinJoin + EgtIf( SPLIT, EMC.TCING, 0) - GEO.EPS_SMALL then + + local WorkTab = {} + WorkTab.dTPosI = EMC.TPOS + WorkTab.dY1DeltaI = EMC.Y1DELTA + WorkTab.dY2DeltaI = EMC.Y2DELTA + WorkTab.dV1PosI = EMC.V1POS + WorkTab.bV1CloseI = false + WorkTab.dV2PosI = EMC.V2POS + WorkTab.bV2CloseI = false + + WorkTab.dTPosF = nil + WorkTab.dY1DeltaMinF = max( EMC.LB - dDistBack, MyMinOther + EMC.HCING + EMC.HOVM) + WorkTab.dY1DeltaMaxF = min( EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0), MaxY1 + dDistFront + dRollFront + AGG_V) + WorkTab.dY2DeltaMinF = nil + WorkTab.dY2DeltaMaxF = nil + if dY1DeltaMaxSP then WorkTab.dY1DeltaMaxF = min( WorkTab.dY1DeltaMaxF, dY1DeltaMaxSP) end + WorkTab.dV1PosF = dRollBack + WorkTab.bV1CloseF = false + WorkTab.dV2PosF = -dRollFront + WorkTab.bV2CloseF = false + + -- aggiuntivo per non avere problemi con pezzi a caduta + if WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF > 5 * BD.CHAR_EXTRA_DIST then + WorkTab.dY1DeltaMinF = WorkTab.dY1DeltaMinF + 4 * BD.CHAR_EXTRA_DIST + elseif WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF > 2.5 * BD.CHAR_EXTRA_DIST then + WorkTab.dY1DeltaMinF = WorkTab.dY1DeltaMinF + 2 * BD.CHAR_EXTRA_DIST + elseif WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF > 1.5 * BD.CHAR_EXTRA_DIST then + WorkTab.dY1DeltaMinF = WorkTab.dY1DeltaMinF + BD.CHAR_EXTRA_DIST + end + + -- verifico validità intervallo ammesso per Y1 + if WorkTab.dY1DeltaMinF > WorkTab.dY1DeltaMaxF + 10 * GEO.EPS_SMALL then + EMC.ERR = 18 + EMC.MSG = ' Error : CLAMP Y1 impossible' + return {} + end + + return SpecAdjustCarriages( WorkTab) + + -- [B] se richiesti entrambi e posso metterli + elseif nChar == 2 and + dDistBack > MinJoin + EgtIf( SPLIT, EMC.TCING, 0) - GEO.EPS_SMALL and + dDistFront > MinFrontJoin - GEO.EPS_SMALL then + + local WorkTab = {} + WorkTab.dTPosI = EMC.TPOS + WorkTab.dY1DeltaI = EMC.Y1DELTA + WorkTab.dY2DeltaI = EMC.Y2DELTA + WorkTab.dV1PosI = EMC.V1POS + WorkTab.bV1CloseI = false + WorkTab.dV2PosI = EMC.V2POS + WorkTab.bV2CloseI = false + + WorkTab.dTPosF = nil + WorkTab.dY1DeltaMinF = max( EMC.LB - dDistBack, MyMinOther + EMC.HCING + EMC.HOVM, EMC.LT + MyMinOther + EMC.NEXT_HCING) + WorkTab.dY1DeltaMaxF = min( EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0), MaxY1 + dDistFront + dRollFront + AGG_V) + WorkTab.dY2DeltaMinF = max( MinJoin + EMC.HCING + EMC.HOVM, EMC.LB + MinY2 - dDistBack - AGG_V - dRollBack) + WorkTab.dY2DeltaMaxF = min( dDistFront, EMC.LB - MyMinOther - EMC.TCING) + if dY1DeltaMaxSP then WorkTab.dY1DeltaMaxF = min( WorkTab.dY1DeltaMaxF, dY1DeltaMaxSP) end + if dY2DeltaMinUL then WorkTab.dY2DeltaMinF = max( WorkTab.dY2DeltaMinF, dY2DeltaMinUL) end + WorkTab.dV1PosF = dRollBack + WorkTab.bV1CloseF = false + WorkTab.dV2PosF = -dRollFront + WorkTab.bV2CloseF = false + + -- aggiuntivo per minimizzare scambi carrelli + if WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF > 5 * BD.CHAR_EXTRA_DIST then + WorkTab.dY1DeltaMinF = WorkTab.dY1DeltaMinF + 4 * BD.CHAR_EXTRA_DIST + elseif WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF > 2.5 * BD.CHAR_EXTRA_DIST then + WorkTab.dY1DeltaMinF = WorkTab.dY1DeltaMinF + 2 * BD.CHAR_EXTRA_DIST + elseif WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF > 1.5 * BD.CHAR_EXTRA_DIST then + WorkTab.dY1DeltaMinF = WorkTab.dY1DeltaMinF + BD.CHAR_EXTRA_DIST + end + + -- verifico validità intervallo ammesso per Y1 + if WorkTab.dY1DeltaMinF > WorkTab.dY1DeltaMaxF + 10 * GEO.EPS_SMALL then + EMC.ERR = 18 + EMC.MSG = ' Error : CLAMP Y1 impossible' + return {} + end + + -- verifico validità intervallo ammesso per Y2 + if WorkTab.dY2DeltaMinF > WorkTab.dY2DeltaMaxF + 10 * GEO.EPS_SMALL then + EMC.ERR = 18 + EMC.MSG = ' Error : CLAMP Y2 impossible' + return {} + end + + return SpecAdjustCarriages( WorkTab) + + -- [C] se non richiesti entrambi e posso mettere carrello Y2 + elseif dDistFront > MinFrontJoin - GEO.EPS_SMALL then + + local WorkTab = {} + WorkTab.dTPosI = EMC.TPOS + WorkTab.dY1DeltaI = EMC.Y1DELTA + WorkTab.dY2DeltaI = EMC.Y2DELTA + WorkTab.dV1PosI = EMC.V1POS + WorkTab.bV1CloseI = false + WorkTab.dV2PosI = EMC.V2POS + WorkTab.bV2CloseI = false + + WorkTab.dTPosF = nil + WorkTab.dY1DeltaMinF = nil + WorkTab.dY1DeltaMaxF = nil + WorkTab.dY2DeltaMinF = max( MinJoin + EMC.HCING + EMC.HOVM, EMC.LB + MinY2 - dDistBack - AGG_V - dRollBack) + WorkTab.dY2DeltaMaxF = min( dDistFront, EMC.LB - MyMinOther - EMC.TCING) + if dY2DeltaMinUL then WorkTab.dY2DeltaMinF = max( WorkTab.dY2DeltaMinF, dY2DeltaMinUL) end + WorkTab.dV1PosF = dRollBack + WorkTab.bV1CloseF = false + WorkTab.dV2PosF = -dRollFront + WorkTab.bV2CloseF = false + + -- verifico validità intervallo ammesso per Y2 + if WorkTab.dY2DeltaMinF > WorkTab.dY2DeltaMaxF + 10 * GEO.EPS_SMALL then + EMC.ERR = 18 + EMC.MSG = ' Error : CLAMP Y2 impossible' + return {} + end + + return SpecAdjustCarriages( WorkTab) + + -- altrimenti errore + else + if EgtGetDebugLevel() < 3 then + EgtOutLog( ' DistFront=' .. EgtNumToString( dDistFront) .. ' DistBack=' .. EgtNumToString( dDistBack) .. + ' MinJoin=' .. EgtNumToString( MinJoin) .. ' MinFrontJoin=' .. EgtNumToString( MinFrontJoin)) + end + EMC.ERR = 18 + EMC.MSG = ' Error : CLAMP impossible' + return {} + end +end + +--------------------------------------------------------------------- +function SpecCalcSplit( dLenRaw, dMaxLenLeft) + local vCmd = {} + EgtOutLog( ' *[S]', 1) + local bSplit = ( EMC.Y2DELTA ~= nil or EMC.W2DELTA ~= nil) + local ParkT = EgtIf( bSplit and dMaxLenLeft > ParkV1 - 50, LoadT, ParkV1) + local sType = EgtIf( EMC.Y2DELTA, 'Split', EgtIf( EMC.W2DELTA, 'SpecSplit', 'Fall')) + table.insert( vCmd, { 0, sType}) + if not bSplit then EnsureZmax( false, vCmd) end + -- determino i grezzi da agganciare al carrello Y (sono quelli presenti nella fase successiva dispari) + local nNextOddPhase = GetNextStartOrRestPhase( EMC.PHASE) + local nRawId = EgtGetFirstRawPart() + while nRawId do + if EgtVerifyRawPartPhase( nRawId, nNextOddPhase) then + table.insert( vCmd, { 31, nRawId, 'Y1'}) + end + nRawId = EgtGetNextRawPart( nRawId) + end + -- riporto il carrello Y al carico con il resto della trave + local dLDelta = EMC.Y1DELTA - dLenRaw + table.insert( vCmd, { 1, 'Y1', ParkT + dLDelta}) + table.insert( vCmd, { 21, 0, EMC.Y2DELTA or 0}) + -- imposto subito Y non più attaccato alla trave in lavoro + EMC.Y1DELTA = nil + -- salvo posizione carrello Y in disposizione del pezzo dopo split + local PostDispId = EgtGetPhaseDisposition( EMC.PHASE + 1) + if PostDispId then + if not bSplit or EMC.W2DELTA then + EgtSetInfo( PostDispId, 'TPOS', ParkT) + else + EgtRemoveInfo( PostDispId, 'TPOS') + EgtSetInfo( PostDispId, 'TPARK', ParkT) + end + EgtSetInfo( PostDispId, 'Y1POS', ParkT + dLDelta) + end + -- salvo posizione grezzo rimasto e posizione carrello Y nella disposizione iniziale del pezzo succ (prossima fase dispari) + local NextDispId = EgtGetPhaseDisposition( nNextOddPhase) + if NextDispId then + EgtSetInfo( NextDispId, 'TPOS', ParkT) + EgtSetInfo( NextDispId, 'Y1POS', ParkT + dLDelta) + end + + return vCmd +end + +--------------------------------------------------------------------- +function SpecCalcSplitRot( dLenRaw, dMaxLenLeft) + local vCmd = {} + EgtOutLog( ' *[SR]', 1) + local bSplit = ( EMC.Y2DELTA ~= nil) + local ParkT = EgtIf( bSplit and dMaxLenLeft > ParkV1 - 50, LoadT, ParkV1) + table.insert( vCmd, { 0, 'SplitRot'}) + -- determino i grezzi da agganciare al carrello Y (sono quelli presenti nella fase successiva dispari) + local vRaw = {} + local nNextOddPhase = GetNextStartOrRestPhase( EMC.PHASE) + local nRawId = EgtGetFirstRawPart() + while nRawId do + if EgtVerifyRawPartPhase( nRawId, nNextOddPhase) then + table.insert( vRaw, nRawId) + end + nRawId = EgtGetNextRawPart( nRawId) + end + for _, nId in ipairs( vRaw) do + table.insert( vCmd, { 31, nId, 'Y1'}) + end + -- riporto il carrello Y1 al carico con il resto della trave + local dLDelta = EMC.Y1DELTA - dLenRaw + table.insert( vCmd, { 1, 'Y1', ParkT + TurnerOffs + dLDelta}) + table.insert( vCmd, { 21, 0, EMC.Y2DELTA or 0}) + -- imposto subito Y non più attaccato alla trave in lavoro + EMC.Y1DELTA = nil + -- apro il carrello Y + table.insert( vCmd, { 11, 0}) + -- sgancio i grezzi dal carrello Y + for _, nId in ipairs( vRaw) do + table.insert( vCmd, { 31, nId, ''}) + end + -- lo porto in parcheggio + table.insert( vCmd, { 1, 'Y1', ParkY1}) + -- salvo posizione grezzo rimasto nella disposizione iniziale del pezzo succ (prossima fase dispari) + local NextDispId = EgtGetPhaseDisposition( nNextOddPhase) + if NextDispId then + EgtSetInfo( NextDispId, 'TPOS', LoadT) + end + + return vCmd +end + +--------------------------------------------------------------------- +function SpecCalcUnload() + local vCmdPre = {} + EgtOutLog( ' *[U]', 1) + if EMC.W2DELTA then + local vCmd = {} + -- Commento + table.insert( vCmd, { 0, 'Unloading SpecSplit'}) + EgtOutLog( ' *[U2]', 1) + return vCmd + elseif not EMC.Y1DELTA and not EMC.Y2DELTA then + EMC.ERR = 21 + EMC.MSG = ' Error : Y1 and Y2 not clamped for unloading' + return {} + end + local dY2DeltaMinUL = EMC.LB + MinY2 - UnloadT + -- Se pinza Y1 chiusa o Y2 troppo a destra, devo effettuare uno scambio + if EMC.Y1DELTA or EMC.Y2DELTA < dY2DeltaMinUL then + -- determino posizione testa trave + local nLastEntId = EgtGetLastInGroup( EMC.PATHID) + if not nLastEntId then + local nPrevOpeId = EgtGetPrevActiveOperation( EMC.DISPID) + local nPathId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nPrevOpeId, 'CL')) + nLastEntId = EgtGetLastInGroup( nPathId) + end + local vAxes = EmtGetAxesPos( nLastEntId) + if #vAxes > 0 then EMC.TPOS = vAxes[1] end + -- imposto quote aggancio per avere solo pinza V + local dDistFront = EMC.LB - MinJoin - EMC.HOVM + 10 * GEO.EPS_SMALL + local dDistBack = 0 + -- imposto rulli aperti (in ogni caso pezzo sicuramente grande) + EMC.V1POS = ParkV1 + EMC.V2POS = ParkV2 + -- effettuo scambio + vCmdPre = SpecCalcCarriages( dDistFront, dDistBack, 0, 0, nil, dY2DeltaMinUL) + -- recupero nuova posizione carrelli + SpecSetCarrPosFromCmds( vCmdPre) + EgtOutLog( ' *[U1]', 1) + end + local vCmd = {} + -- Commento + table.insert( vCmd, { 0, 'Unloading'}) + -- posizionamento sicuro teste e rulli (non serve ?) + --table.insert( vCmd, { 4, 0}) + -- Se pinza Y chiusa, la apro + if EMC.Y1DELTA then + table.insert( vCmd, { 11, 0}) + EMC.CNT = nil + end + -- Sposto il pezzo in posizione di scarico + local dFinT = UnloadT - EMC.LB + local dFinY2 = dFinT + EMC.Y2DELTA + table.insert( vCmd, { 2, 'T', dFinT, 'Y2', dFinY2}) + EgtOutLog( ' Y2PosF=' .. EgtNumToString( dFinY2), 1) + -- apro la morsa + table.insert( vCmd, { 12, 0}) + -- riporto il carrello in home + table.insert( vCmd, { 1, 'Y2', ParkY2}) + + -- eventuale unione tabelle + if #vCmdPre > 0 then + vCmd = EgtJoinTables( vCmdPre, vCmd) + end + + return vCmd +end + +--------------------------------------------------------------------- +function SpecCalcPreRot() + local vCmdPre = {} + EgtOutLog( ' *[PR]', 1) + -- Se pinza Y2 chiusa, devo effettuare uno scambio + local dY1DeltaMaxSP = MaxY1 - LoadT - TurnerOffs - 10 * GEO.EPS_SMALL + if EMC.Y2DELTA or EMC.Y1DELTA > dY1DeltaMaxSP then + -- imposto quote aggancio per avere solo pinza Y + local dDistFront = 0 + local dDistBack = EMC.LB - MinOther - EMC.HOVM + 10 * GEO.EPS_SMALL + -- effettuo scambio + vCmdPre = SpecCalcCarriages( dDistFront, dDistBack, 0, 0, dY1DeltaMaxSP) + -- recupero nuova posizione carrelli + SpecSetCarrPosFromCmds( vCmdPre) + EgtOutLog( ' [PR1]', 1) + end + -- porto il pezzo alla zona di rotazione con il carro Y1 + local vCmd = {} + -- Commento + table.insert( vCmd, { 0, 'Pre-Rotation'}) + -- posizionamento sicuro teste e rulli + if #vCmdPre > 0 then + EnsureZmax( true, vCmdPre, 2) + else + EnsureZmax( true, vCmd) + end + -- Se pinza V chiusa, la apro + if EMC.Y2DELTA then + table.insert( vCmd, { 12, 0}) + end + -- riporto la trave al carico + local RotT = LoadT + TurnerOffs + table.insert( vCmd, { 2, 'Y1', RotT + EMC.Y1DELTA, 'T', RotT}) + -- apro la morsa + table.insert( vCmd, { 11, 0}) + EMC.CNT = nil + -- riporto il carrello in home + table.insert( vCmd, { 1, 'Y1', ParkY1}) + + -- eventuale unione tabelle + if #vCmdPre > 0 then + vCmd = EgtJoinTables( vCmdPre, vCmd) + end + + return vCmd +end + +--------------------------------------------------------------------- +local function ChangedTool( nMchId) + local bChanged = false + -- Salvo lavorazione e utensile correnti, per ripristinarli alla fine + local nOrigMchId = EgtGetCurrMachining() + local sOrigTool = EgtTdbGetCurrToolParam( MCH_TP.NAME) + -- Recupero l'utensile della lavorazione precedente + local nPrevMchId = EgtGetPrevActiveOperation( nMchId or GDB_ID.NULL) + if nPrevMchId and EgtGetOperationType( nPrevMchId) ~= MCH_OY.DISP then + EgtSetCurrMachining( nPrevMchId) + local sTool = EgtGetMachiningParam( MCH_MP.TOOL) + bChanged = ( sTool ~= sOrigTool) + end + -- Ripristino lavorazione e utensile correnti + if nOrigMchId then EgtSetCurrMachining( nOrigMchId) end + if sOrigTool then EgtTdbSetCurrTool( sOrigTool) end + return bChanged +end + +-------------------------------------------------------------------------------------------------------- +-- **CHIAMATA DELLE FUNZIONI Spec** +-------------------------------------------------------------------------------------------------------- +function SpecAdjustCarriages( WorkTab) + + --EgtOutLog( ' --->>> CNT=' .. EgtIf( EMC.CNT, '1', '_')) + + -- Aggiorno la posizione dei rulli per eventuale cambio utensile + if ChangedTool( EMC.MCHID) then + WorkTab.dV1PosI = ParkV1 + WorkTab.dV2PosI = ParkV2 + end + -- Verifico se compattare i rulli + local bCloseV = false + if WorkTab.dY1DeltaI then + if WorkTab.dY1DeltaI <= MinJoin + WorkTab.dV1PosI - WorkTab.dV2PosI + 2 * AGG_V + EMC.HCING + EMC.HOVM + EgtIf( EMC.CNT == 1, AggLoad, 0) then + bCloseV = true + end + end + if WorkTab.dY2DeltaI then + if EMC.LB - WorkTab.dY2DeltaI <= MinJoin + WorkTab.dV1PosI - WorkTab.dV2PosI + 2 * AGG_V + EgtIf( SPLIT, EMC.TCING, 0) + EgtIf( EMC.CNT == 1, AggLoad, 0) then + bCloseV = true + end + end + WorkTab.bCloseV = bCloseV + + -- |POSIZIONO Y1| **[A]** + if WorkTab.dY1DeltaMinF and ( not WorkTab.dY2DeltaMinF) then + -- [A1]/[A2] continuazione da morsa Y1 ( Y1 -> Y1 ) scambio Y2 (Y2 -> Y1) + if ( WorkTab.dY1DeltaI and ( not WorkTab.dY2DeltaI)) or ( WorkTab.dY2DeltaI and (not WorkTab.dY1DeltaI)) then + WorkTab.bY1Parked = not WorkTab.dY1DeltaI + WorkTab.dY1DeltaI = WorkTab.dY1DeltaI or ( ParkY1 - WorkTab.dTPosI) + WorkTab.bY2Parked = not WorkTab.dY2DeltaI + WorkTab.dY2DeltaI = WorkTab.dY2DeltaI or ( ParkY2 - WorkTab.dTPosI) + return SpecAdjustCarrA( WorkTab) + else + EgtOutLog( ' Error CLAMP NULL-> Y1 impossibile') + error( 'Error CLAMP NULL-> Y1 impossibile') + end + + -- |POSIZIONO Y1Y2| **[B]** + elseif WorkTab.dY1DeltaMinF and WorkTab.dY2DeltaMinF then + -- [B1] passo da carrello Y1 a entrambi + if WorkTab.dY1DeltaI and ( not WorkTab.dY2DeltaI) then + WorkTab.dY2DeltaI = WorkTab.dY2DeltaI or ( ParkY2 - WorkTab.dTPosI) + return SpecAdjustCarrB1( WorkTab) + -- [B2] passo da carrello Y2 a entrambi + elseif WorkTab.dY2DeltaI and (not WorkTab.dY1DeltaI) then + WorkTab.dY1DeltaI = WorkTab.dY1DeltaI or ( ParkY1 - WorkTab.dTPosI) + return SpecAdjustCarrB2(WorkTab) + -- [B3] rimango con due carrelli ( per ora accetto solo il caso in cui le posizioni sono già valide) + elseif WorkTab.dY1DeltaI > WorkTab.dY1DeltaMinF - 10 * GEO.EPS_SMALL and WorkTab.dY1DeltaI < WorkTab.dY1DeltaMaxF + 10 * GEO.EPS_SMALL and + WorkTab.dY2DeltaI > WorkTab.dY2DeltaMinF - 10 * GEO.EPS_SMALL and WorkTab.dY2DeltaI < WorkTab.dY2DeltaMaxF + 10 * GEO.EPS_SMALL then + EgtOutLog( '*[B3]', 1) + return {} + else + EgtOutLog( ' Error CLAMP NULL-> Y1+Y2 impossibile') + error( 'Error CLAMP NULL-> Y1+Y2 impossibile') + end + + -- |POSIZIONO Y2| **[C]** + elseif not WorkTab.dY1DeltaMinF and WorkTab.dY2DeltaMinF then + -- [C1]/[C2] continuazione da morsa Y2 ( Y2 -> Y2 ) sacmbio Y1 (Y1 -> Y2) + if ( WorkTab.dY1DeltaI and ( not WorkTab.dY2DeltaI)) or ( WorkTab.dY2DeltaI and (not WorkTab.dY1DeltaI)) then + WorkTab.bY1Parked = not WorkTab.dY1DeltaI + WorkTab.dY1DeltaI = WorkTab.dY1DeltaI or ( ParkY1 - WorkTab.dTPosI) + WorkTab.bY2Parked = not WorkTab.dY2DeltaI + WorkTab.dY2DeltaI = WorkTab.dY2DeltaI or ( ParkY2 - WorkTab.dTPosI) + return SpecAdjustCarrC( WorkTab) + else + EgtOutLog( ' Error CLAMP NULL-> Y2 impossibile') + error( 'Error CLAMP NULL-> Y2 impossibile') + end + end + +end + +----------------------------------------------------------------------- +-- calcolo lo spostamento di Y1 (aperta) e Y2 (chiusa) in **accentramento** +local function PosForCent1FY1( dY1a, dY2a, dTa, dExtraY1, dCorsaY1c, dCorsaY2Tc) + local dY2Delta = dY2a - dTa + local dDispl = dCorsaY1c - dExtraY1 + if dDispl / 2 <= dCorsaY2Tc then + if dDispl / 2 <= dCorsaY1c then + dY1a = dY1a - dDispl / 2 + dY2a = dY2a + dDispl / 2 + else + dY1a = dY1a - dCorsaY1c + dY2a = dY2a + dDispl - dCorsaY1c + end + else + dY2a = dY2a + dCorsaY2Tc + dY1a = dY1a - (dDispl - dCorsaY2Tc) + end + dTa = dY2a - dY2Delta + return dY1a, dY2a, dTa +end + +----------------------------------------------------------------------- +-- calcolo lo spostamento di Y2 (aperta) e Y1 (chiusa) in **accentramento** +local function PosForCent1FY2( dY1a, dY2a, dTa, dExtraY2, dCorsaY1Tc, dCorsaY2c) + local dY1Delta = dY1a - dTa + local dDispl = dCorsaY2c + dExtraY2 + if dDispl / 2 <= dCorsaY1Tc then + if dDispl / 2 <= dCorsaY2c then + dY1a = dY1a - dDispl / 2 + dY2a = dY2a + dDispl / 2 + else + dY2a = dY2a + dCorsaY2c + dY1a = dY1a - min( dDispl - dCorsaY2c, dCorsaY1Tc) + end + else + dY1a = dY1a - dCorsaY1Tc + dY2a = dY2a + min( dDispl - dCorsaY1Tc, dCorsaY2c) + end + dTa = dY1a - dY1Delta + return dY1a, dY2a, dTa +end + +----------------------------------------------------------------------- +-- calcolo lo spostamento di Y1 (aperta) e Y2 (chiusa) in **allontanamento** +local function PosForEnl1FY1( dY1a, dY2a, dTa, dExtra, dCorsaY1e, dCorsaY2Te) + local dDispl = MaxY1 - dY1a + dExtra + -- eseguo il posizionamento di Y1 allontanando Y1 e (Y2+T) + if dDispl/2 <= dCorsaY2Te then + if dDispl/2 <= dCorsaY1e then + dY1a = dY1a + dDispl / 2 + dY2a = dY2a - dDispl / 2 + dTa = dTa - dDispl / 2 + else + dY1a = dY1a + dCorsaY1e + dY2a = dY2a - (dDispl - dCorsaY1e) + dTa = dTa - (dDispl - dCorsaY1e) + end + else + dY2a = dY2a - dCorsaY2Te + dTa = dTa - dCorsaY2Te + dY1a = dY1a + (dDispl - dCorsaY2Te) + end + return dY1a, dY2a, dTa +end + +----------------------------------------------------------------------- +-- calcolo lo spostamento di Y2 (aperta) e Y1 (chiusa) in **allontanamento** +local function PosForEnl1FY2( dY1a, dY2a, dTa, dExtra, dCorsaY1Te, dCorsaY2e) + local dDispl = dY2a - MinY2 - dExtra + -- eseguo il posizionamento di Y2 allontanando (Y1+T) e Y2 + if dDispl/2 <= dCorsaY1Te then + if dDispl/2 <= dCorsaY2e then + dY1a = dY1a + dDispl / 2 + dTa = dTa + dDispl / 2 + dY2a = dY2a - dDispl / 2 + else + dY2a = dY2a - dCorsaY2e + dY1a = dY1a + (dDispl - dCorsaY2e) + dTa = dTa + (dDispl - dCorsaY2e) + end + else + dY1a = dY1a + dCorsaY1Te + dTa = dTa + dCorsaY1Te + dY2a = dY2a - (dDispl - dCorsaY1Te) + end + return dY1a, dY2a, dTa +end + +----------------------------------------------------------------------- +local function MaxDispl( TabI, vCmd, sType) + local dY1a, dY2a + local dTa = TabI.dTPosI + -- **[M1]** = allontanamento dei trascinatori con Y1 in presa + if sType == 'M1' then + EmitComment( vCmd, '[M1]') + -- ev' chiudo Y1, apro Y2 + table.insert( vCmd, { 11, 1}) + table.insert( vCmd, { 12, 0}) + -- allontano (Y1+T) e (Y2) + dY1a = MaxY1 + dY2a = MinY2 + dTa = ( MaxY1 - TabI.dY1PosI) + dTa + -- **[M2]** = allontanamento dei trascinatori con Y2 in presa + elseif sType == 'M2' then + EmitComment( vCmd, '[M2]') + -- ev' chiudo Y2, apro Y1 + table.insert( vCmd, { 12, 1}) + table.insert( vCmd, { 11, 0}) + EMC.CNT = nil + -- allontano (Y2+T) e (Y1) + dY1a = MaxY1 + dY2a = MinY2 + dTa = ( MinY2 - TabI.dY2PosI) + dTa + -- **[M3]** = accentramento dei trascinatori con Y1 in presa + elseif sType == 'M3' then + EmitComment( vCmd, '[M3]') + -- ev' chiudo Y1, apro Y2 + table.insert( vCmd, { 11, 1}) + table.insert( vCmd, { 12, 0}) + -- accentro (Y1+T) e (Y2) + dY1a = TabI.MyMinY1V1 + dY2a = TabI.MaxY2V2 + dTa = ( TabI.MyMinY1V1 - TabI.dY1PosI) + dTa + -- **[M4]** = accentramento dei trascinatori con Y2 in presa + elseif sType == 'M4' then + EmitComment( vCmd, '[M4]') + -- ev' chiudo Y2, apro Y1 + table.insert( vCmd, { 12, 1}) + table.insert( vCmd, { 11, 0}) + EMC.CNT = nil + -- accentro (Y2+T) e (Y1) + dY1a = TabI.MyMinY1V1 + dY2a = TabI.MaxY2V2 + dTa = ( TabI.MaxY2V2 - TabI.dY2PosI) + dTa + end + -- + table.insert( vCmd, { 3, 'Y1', dY1a, 'Y2', dY2a, 'T', dTa}) + TabI.dY1PosI = dY1a + TabI.dY2PosI = dY2a + TabI.dTPosI = dTa +end -- MaxDisplForRiXw + +----------------------------------------------------------------------------------------------------------- +-- **ALLONTANAMENTO di Y1** +------------------------------------------------------------------------------------------------------------------ +local function PosY1FromY2A( TabI, vCmd) + EmitComment( vCmd, '[PosY1FromY2A]') + local t = {} + -- **calcolo i delta dai dati iniziali** + t.dY1NewDelta = ( TabI.dY1DeltaMaxF + TabI.dY1DeltaMinF)/2 + -- valuto gli estremi degli intervalli, con riferimento alle posizioni attuali + t.dExtraY1New = (TabI.dTPosI + t.dY1NewDelta) - MaxY1 --se > 0, la posizione non è raggiunginile + -- corse disponibili in allontanamento (enlargement) dalle posizioni attuali per Y1 e (Y2+T) + t.dCorsaY1eI = MaxY1 - TabI.dY1PosI + t.dCorsaY2TeI= TabI.dY2PosI - MinY2 + -- |RICONOSCO I CASI| + -- **[(0)]** morsa Y1 già entro l'intervallo : non si deve muovere + t.dY1DeltaI = TabI.dY1PosI-TabI.dTPosI + if t.dY1DeltaI < TabI.dY1DeltaMaxF + 10 * GEO.EPS_SMALL and t.dY1DeltaI > TabI.dY1DeltaMinF - 10 * GEO.EPS_SMALL then + EmitComment( vCmd, '[Y1(0)] ') + --return t.dY1DeltaI + -- **[ri]** = posY1New non raggiungibile direttamente -> muovo fino a fine corsa + elseif t.dExtraY1New > t.dCorsaY2TeI then + EmitComment( vCmd, '[Y1A-ri]') + if not SpecTestSomeMoveInCmds( vCmd) and not EMC.Y2DELTA then + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + -- questo movimento serve solo a gestire (in modo complesso) il caso [ri] + MaxDispl( TabI, vCmd, 'M2') + --t.bXW = true + else + -- **[rp]** = raggiungo il punto medio Y1New dell'intervallo + EmitComment( vCmd, '[Y1A-rp] ') + if not SpecTestSomeMoveInCmds( vCmd) and not EMC.Y2DELTA then + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + -- **1:** calcolo pos. di allontanamento per (Y1) e (Y2+T) (da posizioni iniziali) + TabI.dY1PosI, TabI.dY2PosI, TabI.dTPosI = PosForEnl1FY1( TabI.dY1PosI, TabI.dY2PosI, TabI.dTPosI, t.dExtraY1New, t.dCorsaY1eI, t.dCorsaY2TeI) + -- aggiornamento posizioni e dY1Delta dopo + -- chiusura di Y1, apertura e parcheggio di Y2 a fine funzione + -- ev' chiudo Y2 e apro Y1 ed eseguo allontanamento + table.insert( vCmd, { 12, 1}) + table.insert( vCmd, { 11, 0}) + EMC.CNT = nil + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + t.dY1DeltaA = TabI.dY1PosI - TabI.dTPosI + -- chiusura di Y1, ev' apertura e parcheggio di Y2 : in funzioni chiamanti + return t.dY1DeltaA +end -- PosY1FromY2A + +-------------------------------------------------------------------------------------------------------- +-- **ALLONTANAMENTO di Y2** +-------------------------------------------------------------------------------------------------------- +local function PosY2FromY1A( TabI, vCmd) + EmitComment( vCmd, '[PosY2FromY1A]') + local t = {} + -- **calcolo i delta dai dati iniziali** + t.dY2NewDelta = ( TabI.dY2DeltaMaxF + TabI.dY2DeltaMinF)/2 + -- valuto gli estremi degli intervalli, con riferimento alle posizioni attuali + t.dExtraY2New = ( TabI.dTPosI + t.dY2NewDelta) - MinY2 --se < 0, la posizione non è raggiunginile + -- corse disponibili in allontanamento (enlargement) dalle posizioni attuali per (Y1+T) e Y2 + t.dCorsaY1Te = MaxY1 - TabI.dY1PosI + t.dCorsaY2e = TabI.dY2PosI - MinY2 + -- + -- |RICONOSCO I CASI| + -- **[(0)]** morsa Y2 già entro l'intervallo : non si deve muovere + t.dY2DeltaI = TabI.dY2PosI- TabI.dTPosI + if t.dY2DeltaI < TabI.dY2DeltaMaxF + 10 * GEO.EPS_SMALL and t.dY2DeltaI > TabI.dY2DeltaMinF - 10 * GEO.EPS_SMALL then + EmitComment( vCmd, '[Y2(0)] ') + -- **[ri]** = posY2New non raggiungibile direttamente -> muovo fino a fine corsa + elseif -t.dExtraY2New > t.dCorsaY1Te then + EmitComment( vCmd, '[Y2A-ri]' ) + if not SpecTestSomeMoveInCmds( vCmd) and not EMC.Y1DELTA then + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + -- questo movimento serve solo a gestire (in modo complesso) il caso [ri] + MaxDispl( TabI, vCmd, 'M1') + else + -- **[rp]** = raggiungo il punto medio Y2New dell'intervallo + EmitComment( vCmd, '[Y2A-rp] ') + if not SpecTestSomeMoveInCmds( vCmd) and not EMC.Y1DELTA then + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + -- **1:** calcolo pos. di allontanamento per (Y1+T) e (Y2) (da posizioni iniziali) + TabI.dY1PosI, TabI.dY2PosI, TabI.dTPosI = PosForEnl1FY2( TabI.dY1PosI, TabI.dY2PosI, TabI.dTPosI, t.dExtraY2New, t.dCorsaY1Te, t.dCorsaY2e) + -- chiudo Y1 e apro Y2 ed eseguo allontanamento (finale) + table.insert( vCmd, { 11, 1}) + table.insert( vCmd, { 12, 0}) + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + t.dY2DeltaA = TabI.dY2PosI - TabI.dTPosI + -- chiusura di Y2, ev' apertura e parcheggio di Y1 : in funzioni chiamanti + return t.dY2DeltaA +end -- PosY2FromY1A + +------------------------------------------------------------------------------------------------------------ +-- **ACCENTRAMENTO di Y1** +------------------------------------------------------------------------------------------------------------ +local function PosY1FromY2B( TabI, vCmd) + EmitComment( vCmd, '[PosY1FromY2B]') + local t = {} + -- **calcolo i delta dai dati iniziali** + t.dY1NewDelta = ( TabI.dY1DeltaMaxF + TabI.dY1DeltaMinF)/2 + -- valuto gli estremi degli intervalli, con riferimento alle posizioni attuali + t.dExtraY1New = (TabI.dTPosI + t.dY1NewDelta) - TabI.MyMinY1V1 -- se < 0, la posizione non è raggiunginile + -- corse in accentramento disponibili per Y1 e (Y2+T) dalle posizioni iniziali + t.dCorsaY1cI = TabI.dY1PosI - TabI.MyMinY1V1 + t.dCorsaY2TcI = TabI.MaxY2V2 - TabI.dY2PosI + -- + -- |RICONOSCO I CASI| + -- **[(0)]** morsa Y1 già entro l'intervallo : non si deve muovere + t.dY1DeltaI = TabI.dY1PosI-TabI.dTPosI + if t.dY1DeltaI < TabI.dY1DeltaMaxF + 10 * GEO.EPS_SMALL and t.dY1DeltaI > TabI.dY1DeltaMinF - 10 * GEO.EPS_SMALL then + EmitComment( vCmd, '[Y1(0)] ') + -- **[ri]** = posY1New non raggiungibile direttamente -> muovo fino a fine corsa + elseif -t.dExtraY1New > t.dCorsaY2TcI then + EmitComment( vCmd, '[Y1B-ri]') + if not SpecTestSomeMoveInCmds( vCmd) and not EMC.Y2DELTA then + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + -- questo movimento serve solo a gestire (in modo complesso) il caso [ri] + MaxDispl( TabI, vCmd, 'M4') + else + -- **[rp]** = raggiungo il punto medio Y1New dell'intervallo + EmitComment( vCmd, '[Y1B-rp] ') + if not SpecTestSomeMoveInCmds( vCmd) and not EMC.Y2DELTA then + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + -- **1: calcolo accentramento di (Y1) e (Y2+T)** + TabI.dY1PosI, TabI.dY2PosI, TabI.dTPosI = PosForCent1FY1( TabI.dY1PosI, TabI.dY2PosI, TabI.dTPosI, t.dExtraY1New, t.dCorsaY1cI, t.dCorsaY2TcI) + -- posizionamento efettivo e aggiornamento di vCmd e dY1Delta dopo + -- ch. di Y1 e ap. e parcheggio di Y2 a fine funzione chiamante + -- chiudo Y2 e apro Y1 ed eseguo accentramento (finale) + table.insert( vCmd, { 12, 1}) + table.insert( vCmd, { 11, 0}) + EMC.CNT = nil + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + t.dY1DeltaA = TabI.dY1PosI - TabI.dTPosI + -- chiusura di Y1, ev' apertura e parcheggio di Y2 : in funzioni chiamanti + return t.dY1DeltaA +end -- PosY1FromY2B + +-------------------------------------------------------------------------------------------------------- +-- **ACCENTRAMENTO di Y2** +-------------------------------------------------------------------------------------------------------- +local function PosY2FromY1B( TabI, vCmd) + EmitComment( vCmd, '[PosY2FromY1B]') + local t = {} + -- **calcolo i delta dai dati iniziali** + t.dY2NewDelta = ( TabI.dY2DeltaMaxF + TabI.dY2DeltaMinF)/2 + -- valuto gli estremi degli intervalli, con riferimento alle posizioni attuali + t.dExtraY2New = (TabI.dTPosI + t.dY2NewDelta) - TabI.MaxY2V2 -- se > 0 la posizione non è raggiunginile + -- corse in accentramento disponibili per (Y1+T) e (Y2) dalle posizioni iniziali + t.dCorsaY1TcI = TabI.dY1PosI - TabI.MyMinY1V1 + t.dCorsaY2cI = TabI.MaxY2V2 - TabI.dY2PosI + -- |RICONOSCO I CASI| + -- **[(0)]** morsa Y2 già entro l'intervallo : non si deve muovere + t.dY2DeltaI = TabI.dY2PosI-TabI.dTPosI + if t.dY2DeltaI < TabI.dY2DeltaMaxF + 10 * GEO.EPS_SMALL and t.dY2DeltaI > TabI.dY2DeltaMinF - 10 * GEO.EPS_SMALL then + EmitComment( vCmd, '[Y2(0)] ') + -- **[ri]** = posY2New non raggiungibile direttamente -> muovo fino a fine corsa + elseif t.dExtraY2New > t.dCorsaY1TcI then + EmitComment( vCmd, '[Y2B-ri]' ) + if not SpecTestSomeMoveInCmds( vCmd) and not EMC.Y1DELTA then + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + -- questo movimento serve solo a gestire (in modo complesso) il caso [ri] + MaxDispl( TabI, vCmd, 'M3') + else + -- **[rp]** = raggiungo il punto medio Y2New dell'intervallo + EmitComment( vCmd, '[Y2B-rp] ') + if not SpecTestSomeMoveInCmds( vCmd) and not EMC.Y1DELTA then + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + -- Y1 chiuso, Y2 aperto + -- **1: calcolo accentramento di (Y1+T) e (Y2)** + TabI.dY1PosI, TabI.dY2PosI, TabI.dTPosI = PosForCent1FY2( TabI.dY1PosI, TabI.dY2PosI, TabI.dTPosI, t.dExtraY2New, t.dCorsaY1TcI, t.dCorsaY2cI) + -- ev' chiudo Y1 e apro Y2 ed eseguo movimento accentramento + table.insert( vCmd, { 11, 1}) + table.insert( vCmd, { 12, 0}) + table.insert( vCmd, { 3, 'Y1', TabI.dY1PosI, 'Y2', TabI.dY2PosI, 'T', TabI.dTPosI}) + end + t.dY2DeltaA = TabI.dY2PosI - TabI.dTPosI + -- chiusura di Y2, apertura e parcheggio di Y1 : in funzioni chiamanti + return t.dY2DeltaA +end -- PosY2FromY1B + +-------------------------------------------------------------------------------------------------------- +-- **ALLONTANAMENTO di Y1 per pos. di Y2 o Y2+Y1** - chiamata da [B2] e [C] +-------------------------------------------------------------------------------------------------------- +local function PosY1Y2A( TabI, vCmd) + EmitComment( vCmd, '[PosY1Y2A]') + -- |RICONOSCO I CASI| + repeat + local dY2NewDelta = ( TabI.dY2DeltaMaxF + TabI.dY2DeltaMinF)/2 + local bXW = true + -- se intervallo per Y1 raggiungibile in una sola fase + -- ossia se posso posizionare 'direttamente' Y1 all'interno dell'intervallo I1 <=> ( -ExtraI1MaxF < Corsa Y2Tc) + -- e Y2 è in posizione per aggancio su T + if ( TabI.dTPosI + TabI.dY1DeltaMinF) - MaxY1 < TabI.dY2PosI - MinY2 and + TabI.dY2PosI > TabI.dTPosI + MinJoin + EMC.HCING + EMC.HOVM - 10 * GEO.EPS_SMALL then + -- |POSIZIONO MORSA 1| in **allontanamento** + PosY1FromY2A( TabI, vCmd) + -- |POSIZIONO MORSA 2| + if (TabI.dTPosI + dY2NewDelta) < TabI.dY2PosI then + -- in **allontanamento** + PosY2FromY1A( TabI, vCmd) + else + -- in **accentramento** + PosY2FromY1B( TabI, vCmd) + end + bXW = false + else + -- |POSIZIONO MORSA 2| e poi MORSA 1 + -- in **allontanamento** + if (TabI.dTPosI + dY2NewDelta) < TabI.dY2PosI then + -- se intervallo per Y2 raggiungibile in una sola fase + if - (( TabI.dTPosI + TabI.dY2DeltaMaxF) - MinY2) < MaxY1 - TabI.dY1PosI then + PosY2FromY1A( TabI, vCmd) + PosY1FromY2A( TabI, vCmd) + bXW = false + end + else + -- in **accentramento** + -- sempre se intervallo per Y2 raggiungibile in una sola fase + if ( TabI.dTPosI + TabI.dY2DeltaMinF) - TabI.MaxY2V2 < TabI.dY1PosI - TabI.MyMinY1V1 then + PosY2FromY1B( TabI, vCmd) + PosY1FromY2A( TabI, vCmd) + bXW = false + end + end + end + if bXW then + -- Massimo trascinamento della trave in direzione negativa ( casi **[xw]**) + EmitComment( vCmd, '[Y1A-xw]') + if TabI.dY1PosI ~= TabI.MyMinY1V1 then + -- accentramento morse, trascinamento trave con Y1 + MaxDispl( TabI, vCmd, 'M3') + else + -- allontanamento morse, trascinamento trave con Y2 + MaxDispl( TabI, vCmd, 'M2') + end + end + until ( not bXW) + -- chiusura/parcheggio dei trascinatori in funzioni chiamanti + local dY1Delta = TabI.dY1PosI - TabI.dTPosI + local dY2Delta = TabI.dY2PosI - TabI.dTPosI + return dY1Delta, dY2Delta +end -- PosY1Y2A + +-------------------------------------------------------------------------------------------------------- +-- **ACCENTRAMENTO di Y1 per pos. di Y2 o Y2+Y1** - chiamata da [B2] e [C] +-------------------------------------------------------------------------------------------------------- +local function PosY1Y2B( TabI, vCmd) + EmitComment( vCmd, '[PosY1Y2B]') + -- |RICONOSCO I CASI| + local nCnt = 0 + repeat + local dY2NewDelta = ( TabI.dY2DeltaMaxF + TabI.dY2DeltaMinF) / 2 + local bXW = true + -- se intervallo per Y1 raggiungibile in una sola fase + -- ossia se posso posizionare 'direttamente' Y1 all'interno dell'intervallo I1 <=> ( -ExtraI1MaxF < Corsa Y2Tc) + -- e Y2 è in posizione per aggancio su T + if -(( TabI.dTPosI + TabI.dY1DeltaMaxF) - TabI.MyMinY1V1) < TabI.MaxY2V2 - TabI.dY2PosI and + TabI.dY2PosI > TabI.dTPosI + MinJoin + EMC.HCING + EMC.HOVM - 10 * GEO.EPS_SMALL then + -- |POSIZIONO MORSA 1| in **accentramento** + PosY1FromY2B( TabI, vCmd) + -- |POSIZIONO MORSA 2| + local dY2DeltaI = TabI.dY2PosI - TabI.dTPosI + -- Se il trascinatore 2 non è già nell'intervallo richiesto + if dY2DeltaI > TabI.dY2DeltaMaxF + 10 * GEO.EPS_SMALL or dY2DeltaI < TabI.dY2DeltaMinF - 10 * GEO.EPS_SMALL then + if ( TabI.dTPosI + dY2NewDelta) < TabI.dY2PosI then + -- in **allontanamento** + PosY2FromY1A( TabI, vCmd) + else + -- in **accentramento** + PosY2FromY1B( TabI, vCmd) + end + end + bXW = false + -- se posso posizionare 'direttamente' Y2 all'interno dell'intervallo I2 (casi [rp] o [ri]) + else + -- |POSIZIONO MORSA 2| e poi MORSA 1 + -- in **allontanamento** + if ( TabI.dTPosI + dY2NewDelta) < TabI.dY2PosI then + -- se intervallo per Y2 è raggiungibile in una sola fase e Y1 è in posizione per aggancio su T + if -(( TabI.dTPosI + TabI.dY2DeltaMaxF) - MinY2) < MaxY1 - TabI.dY1PosI and + TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then + PosY2FromY1A( TabI, vCmd) + PosY1FromY2B( TabI, vCmd) + bXW = false + end + -- in **accentramento** + else + -- sempre se intervallo per Y2 è raggiungibile in una sola fase e Y1 è in posizione per aggancio su T + if ( TabI.dTPosI + TabI.dY2DeltaMinF) - TabI.MaxY2V2 < TabI.dY1PosI - TabI.MyMinY1V1 and + TabI.dY1PosI <= TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then + PosY2FromY1B( TabI, vCmd) + PosY1FromY2B( TabI, vCmd) + bXW = false + end + end + end + if bXW then + -- Massimo trascinamento della trave in direzione positiva (casi **[xw]** ) + -- se Y1 non è a f.c. e se Y1 può afferrare la trave + EmitComment( vCmd, '[Y1B-xw]') + if TabI.dY1PosI ~= MaxY1 and + TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then + -- allontanamento morse, trascinamento trave con Y1 + MaxDispl( TabI, vCmd, 'M1') + else + -- accentramento morse, trascinamento trave con Y2 + MaxDispl( TabI, vCmd, 'M4') + end + end + nCnt = nCnt + 1 + if nCnt > 5 then return end + until ( not bXW) + -- chiusura/parcheggio dei trascinatori in funzioni chiamanti + local dY1Delta = TabI.dY1PosI - TabI.dTPosI + local dY2Delta = TabI.dY2PosI - TabI.dTPosI + return dY1Delta, dY2Delta +end -- PosY1Y2B + +-------------------------------------------------------------------------------------------------------- +-- **ALLONTANAMENTO di Y2 per pos. di Y1 o Y1+Y2** - chiamata da [A] e [B1] +-------------------------------------------------------------------------------------------------------- +local function PosY2Y1A( TabI, vCmd) + EmitComment( vCmd, '[PosY2Y1A]') + -- |RICONOSCO I CASI| + repeat + local dY1NewDelta = ( TabI.dY1DeltaMaxF + TabI.dY1DeltaMinF)/2 + local bXW = true + -- se intervallo per Y2 raggiungibile in una sola fase + -- ossia se posso posizionare 'direttamente' Y2 all'interno dell'intervallo <=> ( -ExtraI2MaxF < Corsa Y1Te and) + -- e Y1 è in posizione per aggancio su T + if MinY2 - ( TabI.dTPosI + TabI.dY2DeltaMaxF) < MaxY1 - TabI.dY1PosI and + TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then + -- |POSIZIONO MORSA 2| in **allontanamento** + PosY2FromY1A( TabI, vCmd) + -- |POSIZIONO MORSA 1| + if ( TabI.dTPosI + dY1NewDelta) > TabI.dY1PosI then + -- in **allontanamento** + PosY1FromY2A( TabI, vCmd) + else + -- in **accentramento** + PosY1FromY2B( TabI, vCmd) + end + bXW = false + else + -- |POSIZIONO MORSA 1| e poi MORSA 2 + -- caso di allontanamento + if ( TabI.dTPosI + dY1NewDelta) > TabI.dY1PosI then + -- se l'intervallo per Y1 è raggiungibile in una sola fase + if ( TabI.dTPosI + TabI.dY1DeltaMinF) - MaxY1 < TabI.dY2PosI - MinY2 then + PosY1FromY2A( TabI, vCmd) + PosY2FromY1A( TabI, vCmd) + bXW = false + end + -- in **accentramento** + else + -- sempre se l'intervallo per Y1 è raggiungibile in una sola fase + if TabI.MyMinY1V1 - ( TabI.dTPosI + TabI.dY1DeltaMaxF) < TabI.MaxY2V2 - TabI.dY2PosI then + PosY1FromY2B( TabI, vCmd) + PosY2FromY1A( TabI, vCmd) + bXW = false + end + end + end + if bXW then + -- Massimo trascinamento della trave in direzione positiva (casi **[xw]**) + EmitComment( vCmd, '[Y2A-xw]') + -- accentramento morse, trascinamento trave con Y2 + if TabI.dY2PosI ~= TabI.MaxY2V2 then + MaxDispl( TabI, vCmd, 'M4') + -- allontanamento morse, trascinamento trave con Y1 + else + MaxDispl( TabI, vCmd, 'M1') + end + end + + until ( not bXW) + -- chiusura/parcheggio dei trascinatori in funzioni chiamanti + local dY1Delta = TabI.dY1PosI - TabI.dTPosI + local dY2Delta = TabI.dY2PosI - TabI.dTPosI + return dY1Delta, dY2Delta +end -- PosY2Y1A + +-------------------------------------------------------------------------------------------------------- +-- **ACCENTRAMENTO di Y2 per pos. di Y1 o Y1+Y2** - chiamata da [A] e [B1] +-------------------------------------------------------------------------------------------------------- +local function PosY2Y1B( TabI, vCmd) + EmitComment( vCmd, '[PosY2Y1B]') + -- |RICONOSCO I CASI| + local nCnt = 0 + repeat + local dY1NewDelta = ( TabI.dY1DeltaMaxF + TabI.dY1DeltaMinF) / 2 + local bXW = true + -- se intervallo per Y2 raggiungibile in una sola fase + -- ossia se posso posizionare 'direttamente' Y2 all'interno dell'intervallo I2 <=> (-ExtraI2MinF < Corsa Y1Tc) + -- e Y1 è in posizione per aggancio su T + if ( TabI.dTPosI + TabI.dY2DeltaMinF) - TabI.MaxY2V2 < TabI.dY1PosI - TabI.MyMinY1V1 and + TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then + -- |POSIZIONO MORSA 2| in **accentramento** + PosY2FromY1B( TabI, vCmd) + -- |POSIZIONO MORSA 1| + local dY1DeltaI = TabI.dY1PosI - TabI.dTPosI + -- Se il trascinatore 1 non è già nell'intervallo richiesto + if dY1DeltaI > TabI.dY1DeltaMaxF + 10 * GEO.EPS_SMALL or dY1DeltaI < TabI.dY1DeltaMinF - 10 * GEO.EPS_SMALL then + if ( TabI.dTPosI + dY1NewDelta) > TabI.dY1PosI then + -- in **allontanamento** + PosY1FromY2A( TabI, vCmd) + else + -- in **accentramento** + PosY1FromY2B( TabI, vCmd) + end + end + bXW = false + -- se posso posizionare 'direttamente' Y1 all'interno dell'intervallo I1 (casi [rp] o [ri]) + else + -- |POSIZIONO MORSA 1| e poi MORSA 2 + -- in **allontanamento** + if ( TabI.dTPosI + dY1NewDelta) > TabI.dY1PosI then + -- se intervallo per Y1 è raggiungibile in una sola fase e Y2 è in posizione per aggancio su T + if ( TabI.dTPosI + TabI.dY1DeltaMinF) - MaxY1 < TabI.dY2PosI - MinY2 and + TabI.dY2PosI > TabI.dTPosI + MinJoin + EMC.HCING + EMC.HOVM - 10 * GEO.EPS_SMALL then + PosY1FromY2A( TabI, vCmd) + PosY2FromY1B( TabI, vCmd) + bXW = false + end + -- in **accentramento** + else + -- se (-ExtraI1MaxF < Corsa Y2Tc) e (Y2 è in posizione per aggancio su T) + if TabI.MyMinY1V1 - ( TabI.dTPosI + TabI.dY1DeltaMaxF) < TabI.MaxY2V2 - TabI.dY2PosI and + TabI.dY2PosI >= TabI.dTPosI + MinJoin + EMC.HCING + EMC.HOVM - 10 * GEO.EPS_SMALL then + PosY1FromY2B( TabI, vCmd) + PosY2FromY1B( TabI, vCmd) + bXW = false + end + end + end + if bXW then + -- Massimo trascinamento della trave in direzione negativa (casi x[w]) + EmitComment( vCmd, '[Y2B-xw]') + -- se Y2 non è a f.c. e se Y2 può afferrare la trave + if TabI.dY2PosI > MinY2 and + TabI.dY2PosI > TabI.dTPosI + MinJoin + EMC.HOVM + EMC.HCING - 10 * GEO.EPS_SMALL then + -- allontanamento morse, trascinamento trave con Y2 + MaxDispl( TabI, vCmd, 'M2') + else + -- accentramento morse, trascinamento trave con Y1 + MaxDispl( TabI, vCmd, 'M3') + end + end + nCnt = nCnt + 1 + if nCnt > 5 then return end + until ( not bXW) + -- la chiusura delle morse è fatta sopra + local dY1Delta = TabI.dY1PosI - TabI.dTPosI + local dY2Delta = TabI.dY2PosI - TabI.dTPosI + return dY1Delta, dY2Delta +end -- PosY2Y1FromY1B + +--------------------------------------------------------------------- +-- **[A] Posizionamento trascinatore Y1 da (Y1 o Y2) <=> Y1/Y2 -> Y1** +--------------------------------------------------------------------- +function SpecAdjustCarrA( WorkTab) + -- Elenco comandi + local vCmd = {} + table.insert( vCmd, { 0, 'Y1/Y2 -> Y1'}) + EmitComment( vCmd, '*[A]') + + local MinY1V1 = max( WorkTab.dV1PosI + AGG_V, MinY1) + local MaxY2V2 = min( WorkTab.dV2PosI - AGG_V, MaxY2) + -- se primo scambio + local MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1V1 + AggLoad, MinY1V1) + -- recupero le posizioni correnti + local dY1PosI = WorkTab.dTPosI + WorkTab.dY1DeltaI + local dY2PosI = WorkTab.dTPosI + WorkTab.dY2DeltaI + local dY1DeltaF + -- posizioni obiettivo dei carrelli al centro dei rispettivi intervalli di validità + EgtOutLog( ' Y1DeltaI=' .. EgtNumToString( WorkTab.dY1DeltaI) .. ' Y2DeltaI=' .. EgtNumToString( WorkTab.dY2DeltaI), 1) + EgtOutLog( ' Y1DeltaMinF=' .. EgtNumToString( WorkTab.dY1DeltaMinF)..' Y1DeltaMaxF=' .. EgtNumToString( WorkTab.dY1DeltaMaxF), 1) + + -- [A(1)] - Se il trascinatore Y1 non è nell'intervallo valido, devo posizionarlo + if WorkTab.dY1DeltaI < WorkTab.dY1DeltaMinF - GEO.EPS_SMALL or WorkTab.dY1DeltaI > WorkTab.dY1DeltaMaxF + GEO.EPS_SMALL then + EmitComment( vCmd, '*[A(1)]') + -- ----------------------------------------- + -- |VERIFICO POSIZIONE RULLI| + -- ------------------------------------------ + -- eseguo eventuale posizionamento sicuro di teste e rulli + if WorkTab.bCloseV then + EnsureZmax( true, vCmd) + MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1 + AggLoad, MinY1) + MaxY2V2 = MaxY2 + end + -- ------------------------------------------ + -- |DEFINISCO INTERVALLO 2| + -- ------------------------------------------ + WorkTab.dY2DeltaMaxF = WorkTab.dY1DeltaMinF - ( MyMinY1V1 - MaxY2V2) + ( WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF) + WorkTab.dY2DeltaMinF = WorkTab.dY1DeltaMaxF - ( MaxY1 - MinY2) - ( WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF) + -- se Y2 deve allontanarsi assegno il primo punto valido (altrimenti mantengo tutto l'intervallo valido) + if WorkTab.dY2DeltaI > WorkTab.dY2DeltaMaxF then + WorkTab.dY2DeltaMinF = max( WorkTab.dY2DeltaMaxF - ( WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF), MinJoin + EMC.HCING + EMC.HOVM) + end + -- se la trave è più 'corta' dell'intervallo per Y2 aggiorno l'intervallo (potrei essere comunque in un punto valido) + if WorkTab.dY2DeltaMinF < MinJoin + EMC.HCING + EMC.HOVM then + WorkTab.dY2DeltaMinF = MinJoin + EMC.HCING + EMC.HOVM + -- se Y2 deve accentrarsi + if WorkTab.dY2DeltaI < WorkTab.dY2DeltaMinF then + WorkTab.dY2DeltaMaxF = 2 * ( MinJoin + EMC.HCING + EMC.HOVM) + end + end + -- posizioni obiettivo dei carrelli al centro dei rispettivi intervalli di validità + local dY1NewDelta = ( WorkTab.dY1DeltaMinF + WorkTab.dY1DeltaMaxF) / 2 + local dY2NewDelta = ( WorkTab.dY2DeltaMinF + WorkTab.dY2DeltaMaxF) / 2 + -------------------------------------------- + -- |RICONOSCO I CASI| + -------------------------------------------- + TabValI = {dY1PosI=dY1PosI, dY2PosI=dY2PosI, dTPosI=WorkTab.dTPosI, MyMinY1V1=MyMinY1V1, MaxY2V2=MaxY2V2, dY1DeltaMaxF=WorkTab.dY1DeltaMaxF, + dY1DeltaMinF=WorkTab.dY1DeltaMinF, dY2DeltaMaxF=WorkTab.dY2DeltaMaxF, dY2DeltaMinF=WorkTab.dY2DeltaMinF } + if WorkTab.dY1DeltaI > dY1NewDelta then + --[A(1)B] **ACCENTRAMENTO** (dall'origine) del trascinatore Y1 + EmitComment( vCmd, '[A-Y1B]') + dY1DeltaF = PosY1Y2B( TabValI, vCmd) + else + --[A(1)A] **ALLONTANAMENTO** (dall'origine) del trascinatore Y1 + EmitComment( vCmd, '[AY1A]') + dY1DeltaF = PosY1Y2A( TabValI, vCmd) + end + -- chiudo Y1 + table.insert( vCmd, { 11, 1}) + -- dichiaro Y2 da parcheggiare + WorkTab.bY2Parked = false + + -- [A(0)] - Se Y1 è già nell'intervallo valido, si lascia dove è + else + EmitComment( vCmd, '*[A(0)]') + if not WorkTab.bY2Parked then + -- dichiaro posizione di Y2 e T + table.insert( vCmd, { 2, 'T', WorkTab.dTPosI, 'Y2', dY2PosI}) + end + if WorkTab.bY1Parked then + -- chiudo Y1 + table.insert( vCmd, { 11, 1}) + end + dY1DeltaF = WorkTab.dY1DeltaI + end + + if not WorkTab.bY2Parked then + -- apro e parcheggio Y2 + table.insert( vCmd, { 12, 0}) + table.insert( vCmd, { 1, 'Y2', ParkY2}) + end + + -- aggiorno e segnalo la posizione finale Y1Delta + table.insert( vCmd, { 21, dY1DeltaF, 0}) + EgtOutLog( ' Y1DeltaF=' .. EgtNumToString( dY1DeltaF), 1) + -- segnalo la posizione dei rulli + table.insert( vCmd, { 22, WorkTab.dV1PosF, WorkTab.dV2PosF}) + + SpecOutputCNT() + return vCmd +end +-- SpecAdjustCarrAA + +-------------------------------------------------------------------- +-- **[B1] da trascinatore Y1 a entrambi <=> Y1 -> Y1+Y2** +-------------------------------------------------------------------- +function SpecAdjustCarrB1( WorkTab) + -- Elenco comandi + local vCmd = {} + table.insert( vCmd, { 0, 'Y1 -> Y1+Y2'}) + EmitComment( vCmd, '*[B1]') + + local MinY1V1 = max( WorkTab.dV1PosI + AGG_V, MinY1) + local MaxY2V2 = min( WorkTab.dV2PosI - AGG_V, MaxY2) + -- se primo scambio + local MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1V1 + AggLoad, MinY1V1) + + -- recupero le posizioni correnti + local dY1PosI = WorkTab.dTPosI + WorkTab.dY1DeltaI + local dY2PosI = WorkTab.dTPosI + WorkTab.dY2DeltaI + local dY1DeltaF, dY2DeltaF + -- posizioni obiettivo dei carrelli al centro dei rispettivi intervalli di validità + local dY1NewDelta = ( WorkTab.dY1DeltaMinF + WorkTab.dY1DeltaMaxF) / 2 + local dY2NewDelta = ( WorkTab.dY2DeltaMinF + WorkTab.dY2DeltaMaxF) / 2 + -- + EgtOutLog( ' Y1DeltaI='..EgtNumToString( WorkTab.dY1DeltaI) .. ' Y2DeltaI='..EgtNumToString( WorkTab.dY2DeltaI), 1) + EgtOutLog( ' Y1DeltaMinF=' .. EgtNumToString( WorkTab.dY1DeltaMinF)..' Y1DeltaMaxF=' .. EgtNumToString( WorkTab.dY1DeltaMaxF), 1) + EgtOutLog( ' Y2DeltaMinF=' .. EgtNumToString( WorkTab.dY2DeltaMinF)..' Y2DeltaMaxF=' .. EgtNumToString( WorkTab.dY2DeltaMaxF), 1) + + -- Il controllo che i trascinatori non siano già nell'intervallo valido è svolto nelle funzioni a valle + -- ----------------------------------------- + -- |VERIFICO POSIZIONE RULLI| + -- ------------------------------------------ + if WorkTab.bCloseV then + EnsureZmax( true, vCmd) + MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1 + AggLoad, MinY1) + MaxY2V2 = MaxY2 + end + + -- ----------------------------------------- + -- |RICONOSCO I CASI| + -- ------------------------------------------ + -- definisco la tabella delle posizioni iniziali + TabValI = {dY1PosI=dY1PosI, dY2PosI=dY2PosI, dTPosI=WorkTab.dTPosI, MyMinY1V1=MyMinY1V1, MaxY2V2=MaxY2V2, dY1DeltaMaxF=WorkTab.dY1DeltaMaxF, + dY1DeltaMinF=WorkTab.dY1DeltaMinF, dY2DeltaMaxF=WorkTab.dY2DeltaMaxF, dY2DeltaMinF=WorkTab.dY2DeltaMinF } + -- [B1-Y2A] **ALLONTANAMENTO** del trascinatore **Y2** e (eventuale) posizionamento di Y1 + if WorkTab.dY2DeltaI > dY2NewDelta then + EmitComment( vCmd, '[B1-Y2A]') + dY1DeltaF, dY2DeltaF = PosY2Y1A( TabValI, vCmd) + else + -- [B1-Y2B] **ACCENTRAMENTO** del trascinatore **Y2** e (eventuale) posizionamento di Y1 + EmitComment( vCmd, '[B1-Y2B] ') + dY1DeltaF, dY2DeltaF = PosY2Y1B( TabValI, vCmd) + end + -- ----------------------------------------- + -- |CHIUSURA MORSE| + -- ------------------------------------------ + if not SpecTestSomeMoveInCmds( vCmd) then + table.insert( vCmd, { 3, 'Y1', dY1PosI, 'Y2', dY2PosI, 'T', WorkTab.dTPosI}) + end + table.insert( vCmd, { 11, 1}) -- chiudo Y1 + table.insert( vCmd, { 12, 1}) -- Chiudo Y2 + -- imposto i nuovi parametri di aggancio + table.insert( vCmd, { 21, dY1DeltaF, dY2DeltaF}) + EgtOutLog( ' Y1DeltaF=' .. EgtNumToString( dY1DeltaF) .. ' Y2DeltaF=' .. EgtNumToString( dY2DeltaF), 1) + -- segnalo la posizione dei rulli + table.insert( vCmd, { 22, WorkTab.dV1PosF, WorkTab.dV2PosF}) + + SpecOutputCNT() + return vCmd +end +-- SpecAdjustCarrB1 + +--------------------------------------------------------------------- +-- **[B2] da trascinatore Y2 a entrambi <=> Y2 -> Y1+Y2** +-------------------------------------------------------------------- +function SpecAdjustCarrB2( WorkTab) + -- Elenco comandi + local vCmd = {} + table.insert( vCmd, { 0, 'Y2 -> Y1+Y2'}) + EmitComment( vCmd, '*[B2]') + + local MinY1V1 = max( WorkTab.dV1PosI + AGG_V, MinY1) + local MaxY2V2 = min( WorkTab.dV2PosI - AGG_V, MaxY2) + -- se primo scambio + local MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1V1 + AggLoad, MinY1V1) + + -- definisco le posizioni **Iniziali** (= recupero le posizioni correnti) + local dY1PosI = WorkTab.dTPosI + WorkTab.dY1DeltaI + local dY2PosI = WorkTab.dTPosI + WorkTab.dY2DeltaI + local dY2DeltaF, dY1DeltaF + -- posizioni obiettivo dei carrelli al centro dei rispettivi intervalli di validità + local dY1NewDelta = ( WorkTab.dY1DeltaMinF + WorkTab.dY1DeltaMaxF) / 2 + local dY2NewDelta = ( WorkTab.dY2DeltaMinF + WorkTab.dY2DeltaMaxF) / 2 + -- + EgtOutLog( ' Y1DeltaI='..EgtNumToString( WorkTab.dY1DeltaI)..' Y2DeltaI='..EgtNumToString( WorkTab.dY2DeltaI), 1) + EgtOutLog( ' Y1DeltaMinF=' .. EgtNumToString( WorkTab.dY1DeltaMinF)..' Y1DeltaMaxF=' .. EgtNumToString( WorkTab.dY1DeltaMaxF), 1) + EgtOutLog( ' Y2DeltaMinF=' .. EgtNumToString( WorkTab.dY2DeltaMinF)..' Y2DeltaMaxF=' .. EgtNumToString( WorkTab.dY2DeltaMaxF), 1) + + -- Il controllo che i trascinatori non siano già nell'intervallo valido è svolto nelle funzioni a valle + -- ----------------------------------------- + -- |VERIFICO POSIZIONE RULLI| + -- ------------------------------------------ + -- eseguo eventuale posizionamento sicuro di teste e rulli + if WorkTab.bCloseV then + EnsureZmax( true, vCmd) + MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1 + AggLoad, MinY1) + MaxY2V2 = MaxY2 + end + + -- ----------------------------------------- + -- |RICONOSCO I CASI| + -- ------------------------------------------ + -- definisco la tabella delle posizioni iniziali + TabValI = {dY1PosI=dY1PosI, dY2PosI=dY2PosI, dTPosI=WorkTab.dTPosI, MyMinY1V1=MyMinY1V1, MaxY2V2=MaxY2V2, dY1DeltaMaxF=WorkTab.dY1DeltaMaxF, + dY1DeltaMinF=WorkTab.dY1DeltaMinF, dY2DeltaMaxF=WorkTab.dY2DeltaMaxF, dY2DeltaMinF=WorkTab.dY2DeltaMinF } + -- [B2-Y1A] **ALLONTANAMENTO** del trascinatore **Y1** e (eventuale) posizionamento di Y2 + if WorkTab.dY1DeltaI < dY1NewDelta then + EmitComment( vCmd, '[B2-Y1A]') + dY1DeltaF, dY2DeltaF = PosY1Y2A( TabValI, vCmd) + else + -- [B2-Y1B] **ACCENTRAMENTO** del trascinatore **Y1** e (eventuale) posizionamento di Y2 + EmitComment( vCmd, '[B2-Y1B]') + dY1DeltaF, dY2DeltaF = PosY1Y2B( TabValI, vCmd) + end + + -- ----------------------------------------- + -- |CHIUSURA MORSE| + -- ------------------------------------------ + if not SpecTestSomeMoveInCmds( vCmd) then + table.insert( vCmd, { 3, 'Y1', dY1PosI, 'Y2', dY2PosI, 'T', WorkTab.dTPosI}) + end + table.insert( vCmd, { 11, 1}) -- chiudo Y1 + table.insert( vCmd, { 12, 1}) -- Chiudo Y2 + -- imposto i nuovi parametri di aggancio + table.insert( vCmd, { 21, dY1DeltaF, dY2DeltaF}) + EgtOutLog( ' Y1DeltaF=' .. EgtNumToString( dY1DeltaF) .. ' Y2DeltaF=' .. EgtNumToString( dY2DeltaF), 1) + -- segnalo la posizione dei rulli + table.insert( vCmd, { 22, WorkTab.dV1PosF, WorkTab.dV2PosF}) + + SpecOutputCNT() + return vCmd +end +-- SpecAdjustCarrB2 + +--------------------------------------------------------------------- +-- **[C] ex[C1]/[C2] Posizionamento trascinatore Y2 da (Y1 o Y2) <=> Y1/Y2 -> Y2** +--------------------------------------------------------------------- +function SpecAdjustCarrC( WorkTab) + -- Elenco comandi + local vCmd = {} + table.insert( vCmd, { 0, 'Y1/Y2 -> Y2'}) + EmitComment( vCmd, '*[C]') + + local MinY1V1 = max( WorkTab.dV1PosI + AGG_V, MinY1) + local MaxY2V2 = min( WorkTab.dV2PosI - AGG_V, MaxY2) + local MyTCING = EgtIf( SPLIT, EMC.TCING, 0) + -- se primo scambio + local MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1V1 + AggLoad, MinY1V1) + -- recupero le posizioni correnti + local dY1PosI = WorkTab.dTPosI + WorkTab.dY1DeltaI + local dY2PosI = WorkTab.dTPosI + WorkTab.dY2DeltaI + local dY2DeltaF + -- + EgtOutLog( ' Y1DeltaI=' .. EgtNumToString( WorkTab.dY1DeltaI) .. ' Y2DeltaI=' .. EgtNumToString( WorkTab.dY2DeltaI), 1) + EgtOutLog( ' Y2DeltaMinF=' .. EgtNumToString( WorkTab.dY2DeltaMinF)..' Y2DeltaMaxF=' .. EgtNumToString( WorkTab.dY2DeltaMaxF), 1) + + -- [C(1)] - Se il trascinatore Y2 non è nell'intervallo valido, devo posizionarlo + if WorkTab.dY2DeltaI < WorkTab.dY2DeltaMinF - GEO.EPS_SMALL or WorkTab.dY2DeltaI > WorkTab.dY2DeltaMaxF + GEO.EPS_SMALL then + EmitComment( vCmd, '*[C(1)]') + -- ----------------------------------------- + -- |VERIFICO POSIZIONE RULLI| + -- ------------------------------------------ + -- eseguo eventuale posizionamento sicuro di teste e rulli + if WorkTab.bCloseV then + EnsureZmax( true, vCmd) + MyMinY1V1 = EgtIf( EMC.CNT == 1, MinY1 + AggLoad, MinY1) + MaxY2V2 = MaxY2 + end + -- ------------------------------------------ + -- |DEFINISCO INTERVALLO 1| + -- ------------------------------------------ + WorkTab.dY1DeltaMaxF = WorkTab.dY2DeltaMinF + (MaxY1 - MinY2) + (WorkTab.dY2DeltaMaxF - WorkTab.dY2DeltaMinF) + WorkTab.dY1DeltaMinF = WorkTab.dY2DeltaMaxF + (MyMinY1V1 - MaxY2V2) - (WorkTab.dY2DeltaMaxF - WorkTab.dY2DeltaMinF) + -- se Y1 deve allontanarsi assegno il primo punto valido (altrimenti lascio l'intervallo) + if WorkTab.dY1DeltaI < WorkTab.dY1DeltaMinF then + WorkTab.dY1DeltaMaxF = min( WorkTab.dY1DeltaMinF + (WorkTab.dY2DeltaMaxF - WorkTab.dY2DeltaMinF), EMC.LB - MinJoin - MyTCING) + end + -- se la trave è più 'corta' dell'intervallo per Y1 aggiorno l'intervallo (potrei essere comunque in un punto valido) + if WorkTab.dY1DeltaMaxF > EMC.LB - ( MinJoin + MyTCING) then + WorkTab.dY1DeltaMaxF = EMC.LB - ( MinJoin + MyTCING) + -- se Y1 deve accentrarsi + if WorkTab.dY1DeltaI > WorkTab.dY1DeltaMaxF then + WorkTab.dY1DeltaMinF = EMC.LB - 2 *( MinJoin + MyTCING) + end + end + -- posizioni obiettivo dei carrelli al centro dei rispettivi intervalli di validità + local dY1NewDelta = (WorkTab.dY1DeltaMinF + WorkTab.dY1DeltaMaxF)/2 + local dY2NewDelta = (WorkTab.dY2DeltaMinF + WorkTab.dY2DeltaMaxF)/2 + + -- ------------------------------------------ + -- |RICONOSCO I CASI| + -- ------------------------------------------ + TabValI = {dY1PosI=dY1PosI, dY2PosI=dY2PosI, dTPosI=WorkTab.dTPosI, MyMinY1V1=MyMinY1V1, MaxY2V2=MaxY2V2, dY1DeltaMaxF=WorkTab.dY1DeltaMaxF, + dY1DeltaMinF=WorkTab.dY1DeltaMinF, dY2DeltaMaxF=WorkTab.dY2DeltaMaxF, dY2DeltaMinF=WorkTab.dY2DeltaMinF} + if WorkTab.dY2DeltaI < dY2NewDelta then + -- [C-Y2B] **ACCENTRAMENTO** (dall'origine) del trascinatore Y2 + EmitComment( vCmd, '[C-Y2B]') + _, dY2DeltaF = PosY2Y1B( TabValI, vCmd) + else + -- [C-Y2A] **ALLONTANAMENTO** (dall'origine) del trascinatore Y2 + EmitComment( vCmd, '[C-Y2A]') + _, dY2DeltaF = PosY2Y1A( TabValI, vCmd) + end + -- chiudo Y2 + table.insert( vCmd, { 12, 1}) + -- dichiaro Y1 da parcheggiare + WorkTab.bY1Parked = false + + -- [C(0)] - Se Y2 è già nell'intervallo valido, si lascia dove è + else + EmitComment( vCmd, '*[C(0)]') + if not WorkTab.bY1Parked then + -- dichiaro posizione di Y1 e T + table.insert( vCmd, { 2, 'T', WorkTab.dTPosI, 'Y1', dY1PosI}) + end + if WorkTab.bY2Parked then + -- chiudo Y2 + table.insert( vCmd, { 12, 1}) + end + dY2DeltaF = WorkTab.dY2DeltaI + end + + if not WorkTab.bY1Parked then + -- apro e parcheggio Y1 + table.insert( vCmd, { 11, 0}) + EMC.CNT = nil + table.insert( vCmd, { 1, 'Y1', ParkY1}) + end + + -- aggiorno e segnalo la posizione finale Y2Delta + table.insert( vCmd, { 21, 0, dY2DeltaF}) + EgtOutLog( ' Y2DeltaF=' .. EgtNumToString( dY2DeltaF), 1) + -- segnalo la posizione dei rulli + table.insert( vCmd, { 22, WorkTab.dV1PosF, WorkTab.dV2PosF}) + + SpecOutputCNT() + return vCmd +end -- SpecAdjustCarrC2 + +--------------------------------------------------------------------- +function SpecOutputCNT() + if EMC.CNT == 1 then + EgtSetInfo( EMC.PATHID, 'CNT', 1) + else + EgtRemoveInfo( EMC.PATHID, 'CNT') + end +end + +--------------------------------------------------------------------- +function SpecGetCNT( CurrOpeId) + while CurrOpeId do + local nPrevOpeId = EgtGetPrevActiveOperation( CurrOpeId) + if not nPrevOpeId then + return nil + end + local nLastPathId = EgtGetLastInGroup( EgtGetFirstNameInGroup( nPrevOpeId, 'CL') or GDB_ID.NULL) + if nLastPathId then + return EgtGetInfo( nLastPathId, 'CNT', 'i') + end + CurrOpeId = nPrevOpeId + end + return nil +end + +--------------------------------------------------------------------- +function SpecOutputCmds( vCmd, bEnd) + local sRoot = EgtIf( not bEnd, 'AS', 'AE') + -- Registro il numero di comandi + if vCmd and #vCmd > 0 then + EgtSetInfo( EMC.PATHID, sRoot..'#', #vCmd) + else + EgtRemoveInfo( EMC.PATHID, sRoot..'#') + end + -- Registro i comandi + for i = 1, #(vCmd or {}) do + local Cmd = vCmd[i] + local sKey = sRoot .. tostring( i) + -- commento + if Cmd[1] == 0 then + local sInfo = '0,'..Cmd[2] + EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- movimento di 1 asse + elseif Cmd[1] == 1 then + local sInfo = '1,'..Cmd[2]..','..EgtNumToString( Cmd[3],3) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- movimento di 2 assi + elseif Cmd[1] == 2 then + local sInfo = '2,'..Cmd[2]..','..EgtNumToString( Cmd[3],3)..','..Cmd[4]..','..EgtNumToString( Cmd[5],3) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- movimento di 3 assi + elseif Cmd[1] == 3 then + local sInfo = '3,'..Cmd[2]..','..EgtNumToString( Cmd[3],3)..','..Cmd[4]..','..EgtNumToString( Cmd[5],3)..','.. + Cmd[6]..','..EgtNumToString( Cmd[7],3) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- posizione sicura per movimento carrelli + elseif Cmd[1] == 4 then + local sInfo = '4,'..EgtNumToString( Cmd[2],0) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- apertura/chiusura morsa Y + elseif Cmd[1] == 11 then + local sInfo = '11,'..EgtNumToString( Cmd[2],0) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- apertura/chiusura morsa V + elseif Cmd[1] == 12 then + local sInfo = '12,'..EgtNumToString( Cmd[2],0) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- impostazione nuovo stato dei carrelli + elseif Cmd[1] == 21 then + local sInfo = '21,'..EgtNumToString( Cmd[2],3)..','..EgtNumToString( Cmd[3],3) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + if Cmd[2] > 0 and Cmd[3] > 0 then + EMC.Y1DELTA = Cmd[2] + EMC.Y2DELTA = Cmd[3] + elseif Cmd[2] > 0 then + EMC.Y1DELTA = Cmd[2] + EMC.Y2DELTA = nil + elseif Cmd[3] > 0 then + EMC.Y1DELTA = nil + EMC.Y2DELTA = Cmd[3] + end + -- impostazione nuova posizione dei rulli + elseif Cmd[1] == 22 then + local sInfo = '22,'..EgtNumToString( Cmd[2],3)..','..EgtNumToString( Cmd[3],3) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + EMC.V1POS = Cmd[2] + EMC.V2POS = Cmd[3] + -- impostazione pinza speciale di uscita per pezzi corti (pinza 5) + elseif Cmd[1] == 23 then + local sInfo = '23,'..EgtNumToString( Cmd[2],3) + EgtSetInfo( EMC.PATHID, sKey, sInfo) + EMC.W2DELTA = Cmd[2] + -- aggancio grezzo a carrello + elseif Cmd[1] == 31 then + local sInfo = '31,'..EgtNumToString( Cmd[2],0)..','..Cmd[3] + EgtSetInfo( EMC.PATHID, sKey, sInfo) + -- segnalazione errore + elseif Cmd[1] == 99 then + local sInfo = '99,' .. Cmd[2] .. ',' .. Cmd[3] + EgtSetInfo( EMC.PATHID, sKey, sInfo) + end + end + + -- Salvo i nuovi delta dei carrelli + if EMC.Y1DELTA then + EgtSetInfo( EMC.PATHID, 'Y1DELTA', EMC.Y1DELTA) + else + EgtRemoveInfo( EMC.PATHID, 'Y1DELTA') + end + if EMC.Y2DELTA then + EgtSetInfo( EMC.PATHID, 'Y2DELTA', EMC.Y2DELTA) + else + EgtRemoveInfo( EMC.PATHID, 'Y2DELTA') + end + if EMC.W2DELTA then + EgtSetInfo( EMC.PATHID, 'W2DELTA', EMC.W2DELTA) + else + EgtRemoveInfo( EMC.PATHID, 'W2DELTA') + end + + --Salvo le nuove posizioni dei rulli + EgtSetInfo( EMC.PATHID, 'V1POS', EMC.V1POS) + EgtSetInfo( EMC.PATHID, 'V2POS', EMC.V2POS) + -- Se comandi finali + if bEnd then + -- Se operazione successiva è disposizione, salvo anche lì le posizioni dei rulli + local NextDispId = EgtGetPhaseDisposition( EMC.PHASE + 1) + if NextDispId and NextDispId == EgtGetNextActiveOperation( EMC.DISPID or EMC.MCHID) then + EgtSetInfo( NextDispId, 'V1POS', EMC.V1POS) + EgtSetInfo( NextDispId, 'V2POS', EMC.V2POS) + end + end + +end + +--------------------------------------------------------------------- +function SpecSetCarrPosFromCmds( vCmd) + -- recupero nuova posizione carrelli + for i = 1, #( vCmd or {}) do + local Cmd = vCmd[i] + if Cmd[1] == 21 then + if Cmd[2] > 0 and Cmd[3] > 0 then + EMC.Y1DELTA = Cmd[2] + EMC.Y2DELTA = Cmd[3] + elseif Cmd[2] > 0 then + EMC.Y1DELTA = Cmd[2] + EMC.Y2DELTA = nil + elseif Cmd[3] > 0 then + EMC.Y1DELTA = nil + EMC.Y2DELTA = Cmd[3] + end + elseif Cmd[1] == 22 then + EMC.V1POS = Cmd[2] + EMC.V2POS = Cmd[3] + elseif Cmd[1] == 23 then + EMC.W2DELTA = Cmd[2] + end + end +end + +--------------------------------------------------------------------- +function SpecTestOnlyRemarkInCmds( vCmd) + if not vCmd then return true end + -- verifico se nella lista dei comandi ci sono solo commenti + for i = 1, #vCmd do + if vCmd[i][1] ~= 0 then + return false + end + end + return true +end + +--------------------------------------------------------------------- +function SpecTestSomeMoveInCmds( vCmd) + if not vCmd then return false end + -- verifico se nella lista dei comandi c'è almeno un movimento + for i = 1, #vCmd do + if vCmd[i][1] == 1 or vCmd[i][1] == 2 or vCmd[i][1] == 3 then + return true + end + end + return false +end diff --git a/Essetre-PF.nge b/Essetre-PF.nge new file mode 100644 index 0000000..e8abfaa Binary files /dev/null and b/Essetre-PF.nge differ diff --git a/Essetre-PFrl.ini b/Essetre-PFrl.ini new file mode 100644 index 0000000..eb89be0 --- /dev/null +++ b/Essetre-PFrl.ini @@ -0,0 +1,154 @@ +; Commento per evitare BOM con UTF-8 +[General] +Material=Beam +NCType=4 ; 1=Tpa, 2=Num Flexium, 3=Num Axium APServer, 4=Num Axium PCToolkit +Flow=2 +;ConnectionString=XIP01,0,63,0,0,0 +ConnectionString=COM + +[Axes] +; 1 = Type, Id, Name +; Type => l=linear;r=rotational +1=l,0,X +2=l,1,Y +3=l,2,Z +4=l,3,U +5=l,4,V +6=l,5,W +7=r,6,A +8=r,7,B +9=r,8,C + +[Channels] +1=0,Channel 1 + +[MainVariables] +; 1 = Name, Variable Path, ReadType, Type +; ReadType => o=one time;c=continuous +; Type => plc;cn +1=P_Prod,E81295,c,cn +2=P_Machgroup,E81296,c,cn +3=P_Part,E81297,c,cn +4=P_State,E81298,c,cn +5=Reset_State,E80048,c,cn +6=ISO_Num,E80045,c,cn +7=ISO_Sent,E80046,c,cn +8=Running,E80047,c,cn +9=Start_State,%R3.2,c,plc +10=Stop_State,%R3.1,c,plc +11=MachIndex,E80000,c,cn +12=PLC_Messages1,%V800.L,c,plc +13=PLC_Messages2,%V804.L,c,plc +14=PLC_Messages3,%V808.L,c,plc +15=PLC_Messages4,%V80C.L,c,plc +16=PLC_Messages5,%V810.L,c,plc +17=PLC_Messages6,%V814.L,c,plc +18=SendPermission,E30099,c,plc + +[MDI] +; 1 = Command, Description +1=M6T1,1 +2=M6T2,2 +3=M6T3,3 +4=M6T4,4 +5=M6T5,5 +6=M6T6,6 +7=M6T7,7 +8=M6T8,8 +9=M6T9,9 +10=M6T10,10 +11=M6T11,11 +12=M6T12,12 +13=M6T13,13 +14=M6T14,14 +15=M6T15,15 +16=M6T16,16 +17=M6T17,17 +18=M6T18,18 +19=M6T50,19 +20=M6T101,20 +21=M90,21 +22=M198T1,22 +23=M199T1,23 +24=M198T2,24 +25=M199T2,25 +26=M196,26 +27=M197,27 +28=M111,28 +29=M112,29 +30=M113,30 +31=M114,31 +32=M151,32 +33=M152,33 +34=M153,34 +35=M154,35 +36=M155,36 +37=E80001=0,37 + +[Languages] +Enable=1 +Language1=Italiano,Ita.txt +Language2=English,Eng.txt + +[Tools] +Drillbit=1 +Sawblade=1 +Mill=1 +Mortise=1 +Chisel=0 +DrillMaker=MakeWoodDrill.lua +SawbladeMaker=MakeSawblade.lua +MillMaker=MakeWoodCylMill.lua +MortiseMaker=MakeMortise.lua +ChiselMaker=MakeChisel.lua +Active=1 + +[ToolHolder] +H11.1=Standard.nge +H11.1:MILL_NOTIP=MillNoTip.nge +H12.1=Saw.nge +H13.1=ChainSaw.nge +H21.1=Standard.nge +H21.1:MILL_NOTIP=MillNoTip.nge +H22.1=Saw.nge + +[Machinings] +Drilling=1 +Sawing=1 +Milling=1 +Pocketing=1 +Mortising=1 +Chiseling=0 +SawRoughing=0 +SawFinishing=0 + +[Machining] +InitScript=InitMach.lua +ExitScript=ExitMach.lua + +[Disposition] +;InitScript=InitDisp.lua + +[Heads] +; 5 axis head +H11=6608 +; 5 axis saw +H12=6615 +; Chainsaw +H13=6616 +; Second 5 axis head +H21=6620 +; Second 5 axis saw +H22=6623 + +[SetUp] +Default=Standard + +[Estimations] +Enable=1 +WinPlace=0,514,138,628,810 + +[VMill] +Enable=1 +Save=0 + diff --git a/Essetre-PFrl.mlde b/Essetre-PFrl.mlde new file mode 100644 index 0000000..9991abc --- /dev/null +++ b/Essetre-PFrl.mlde @@ -0,0 +1,1009 @@ +-- Descrizione macchina Essetre-PF by EgalTech s.r.l. 2023/03/03 +-- 2021/10/01 ver 2.3j1 Prima versione. +-- 2021/10/26 ver 2.3j2 Versione provvisoria per pezzo alto. +-- 2021/10/26 ver 2.3j3 Aggiunto arresto preciso negli angoli (G9) in fresature con utensili di piccolo diametro. +-- 2021/10/28 ver 2.3j4 Aggiornato come ONE. +-- 2021/10/29 ver 2.3j5 Aggiunta testa H22. Corretto spostamento per apertura rulli come PF1250. +-- 2021/11/02 ver 2.3k1 Corretta gestione offset testa H22 (seconda lama) in generazione. +-- 2021/11/23 ver 2.3k2 Rifacimento completo gestione discese/risalite in Z. +-- 2021/12/16 ver 2.3l1 In generazione NUM correzione movimento in home. +-- 2021/12/22 ver 2.3l5 Varie correzioni da Paterno. +-- 2021/12/30 ver 2.3l9 Ottimizzazioni da Paterno. +-- 2022/01/14 ver 2.4a1 Correzioni per lama in sottosquadra contro traversa. +-- 2022/01/14 ver 2.4a2 Reset piano interpolazione anche se cambiano assi rotanti. +-- 2022/02/08 ver 2.4b1 Corretto movimento a Xhome (vanno emessi tutti gli assi testa). +-- 2022/02/10 ver 2.4b2 Nelle risalite si controlla di non superare Zmax. +-- 2022/02/11 ver 2.4b3 Aggiunta a G157 gestione EC ed ED (stato pinze V1 e V2). +-- 2022/02/23 ver 2.4b4 Con G157 gestione aperture prima di primo rapido e chiusure dopo. +-- 2022/03/04 ver 2.4c2 Aggiornata chiusura rulli con G157 che non li fa muovere. Aggiunta gestione movimento pinze rulli alla pre-rotazione. +-- 2022/03/10 ver 2.4c3 Riportate ultime modifiche ONE per rotazione pezzi. +-- 2022/03/16 ver 2.4c4 In simulazione i rapidi in mezzo alla lavorazione non vanno gestiti come quelli iniziali. +-- 2022/04/26 ver 2.4d1 Corretto calcolo necessità compattazione rulli (non teneva mai conto di EMC.TCING). +-- 2022/09/06 ver 2.4i1 Allineamento con PF. Aggiunto flag per abilitazione lama su testa 2 (T21). +-- 2022/09/06 ver 2.4i2 Correzione ripetizione assi testa in primo movimento. +-- 2022/09/09 ver 2.4i3 Ritardata a dopo movimenti testa e carrelli della segnalazione pezzo caduto. +-- 2022/09/13 ver 2.4i5 Gestita distanza sega a catena da dati utensile anche in OnSetHead. +-- 2022/10/06 ver 2.4j1 Disabilitata anticipazione carico barra successiva (funzionava da almeno 6 mesi). +-- 2022/10/10 ver 2.4j2 Rimossa modifica precedente. In mlse corretto calcolo dMaxLenLeft allo Splitting (da PF1250-3T). +-- 2022/11/11 ver 2.4k1 Allineamento con PF. +-- 2022/12/13 ver 2.4l1 Aggiunta gestione rotazione speciale su split e correzioni varie su rotazioni. +-- 2023/01/18 ver 2.5a1 Correzione risalita sega a catena per non collidere con suo portautensile. +-- 2023/01/19 ver 2.5a2 Aggiunta gestione pinza 5. +-- 2023/01/20 ver 2.5a3 Se devo prendere sega a catena e altra da preselezionare allora la mando in HomeX. Migliorie gestione pinza 5. +-- 2023/01/28 ver 2.5a4 Aggiunte lavorazioni in doppio. +-- 2023/01/31 ver 2.5a5 Migliorie varie per lavorazioni in doppio. +-- 2023/02/01 ver 2.5b1 Aggiunta gestione eventuale mortasatrice. +-- 2023/02/03 ver 2.5b2 Gestione controllo NUM (TIPO_CN = 0->Axium vecchio, 2->Flexium). Migliorata gestione Pinza5 (MAX_BACK_CLAMP_5). +-- 2023/03/03 ver 2.5c1 Correzione per lav.ne in doppio dopo taglio con sega a catena. In PartProgram al nome lavorazione aggiunto Double. + +-- Intestazioni +require( 'EmtGenerator') +EgtEnableDebug( false) + +PP_VER = '2.5c1' + +-- Parametri macchina +NumericalControl = 'NUM_FLEX' -- NUM o (TPA) o NUM_FLEX +MinMchY1 = 335 +MaxMchY1 = 5700.0 +ParkMchY1 = 970.0 +MinMchY2 = -5700.0 +MaxMchY2 = -335 +ParkMchY2 = -955.0 +MinV1 = 20.0 +MaxV1 = 697.0 +ParkV1 = 697.0 +MinV2 = -697.0 +MaxV2 = -20.0 +ParkV2 = -697.0 +MinDeltaYV = 300 +ExtraParkV = 0 +MinY1 = MinV1 + MinDeltaYV +MaxY1 = MaxMchY1 +MaxY2 = MaxV2 - MinDeltaYV +MinY2 = MinMchY2 +ParkY1 = ParkV1 + MinDeltaYV +ParkY2 = ParkV2 - MinDeltaYV +MaxHoOpen = 420 +MaxVeOpen = 820 +RollCageMin = 120 +RollCageMax = 250 +Clamp5 = false +MinW = 0 +MaxW = 670 +ParkW = 0 +MinWOpen = 79 +MaxWOpen = 200 +MaxWHeight = 300 +LoadT = 2135.1 +UnloadT = -2400 +MillOffs = 170.0 +SawOffsX = 110.0 +SawOffsY = 0 +SawOffsZ = -150.05 +SawC1Offs = 0 +SawB1Offs = 0 +ChSawLen = 94.0 +Mill2Offs = 170.0 +Saw2OffsX = 110.0 +Saw2OffsY = 0 +Saw2OffsZ = -149.25 +SawC2Offs = 0 +SawB2Offs = 0 +MinX1 = 700 +MaxX1 = 2735 +MinZ1 = -1550 +MaxZ1 = 0 +MinC1 = -275 +MaxC1 = 275 +MinB1 = -127 +MaxB1 = 127 +MinB1b = -119 +MaxB1b = 119 +ParkX1 = MaxX1 +ParkZ1 = -535 +ParkC1 = 90 +ParkB1 = 90 +LimX1RotSaw = 1900 +ParkCSawX1 = 1350 +ParkCSawX1S = ParkX1 +ParkCSawZ1 = -100 +ParkCSaw0Z1 = -400 +ParkCSawC1 = 90 +ParkCSaw0C1 = 0 +ParkCSawB1 = 0 +MinX2 = 0 +MaxX2 = 2035 +MinZ2 = -1550 +MaxZ2 = 0 +MinC2 = -275 +MaxC2 = 275 +MinB2 = -127 +MaxB2 = 127 +MinB2b = -119 +MaxB2b = 119 +ParkX2 = MinX2 +ParkZ2 = -535 +ParkC2 = -90 +ParkB2 = -90 +MinDeltaX1X2 = 650 +MinDistToolX1X2 = 40 +LimX2RotSaw = 1900 +TurnerOffs = 120.0 +AggLoad = 50 +DeltaTabY = 1170.0 +DeltaTabZ = -1010.0 -- per TPA la quota è dal centro di rotazione (va aggiunto MillOffs) +DeltaRulliTraveZ = 980 +DeltaRulliTappetoZ = -485 +DimTabY = 500 +DimTabX = 24000 +Delta2TabY = 1170.0 +Delta2TabZ = -1010.0 -- per TPA la quota è dal centro di rotazione (va aggiunto MillOffs) +Head2X = 0 +Head2Y = DeltaTabY - Delta2TabY +Head2Z = DeltaTabZ - Delta2TabZ +DefTcPos1 = 'T3' +DefTcPos2 = 'T13' +SecondSaw = false +Mortiser = false +CoeffVM = 0.5 + +-- Aggiornamento con dati da TechnoEssetre7 +local sTs3Data = EgtGetStringFromIni( 'Beam', 'DATA_DIR', "C:\\TechnoEssetre7\\EgtData", EgtGetIniFile()).."\\Essetre-PFrl.data" +local sData = EgtGetSourceDir().."\\Beam\\Ts3Data.lua" +if EgtExistsFile( sTs3Data) then + EgtCopyFile( sTs3Data, sData) + local sTs3DataOld = sTs3Data..'.old' + EgtEraseFile( sTs3DataOld) + EgtRenameFile( sTs3Data, sTs3DataOld) +end +if EgtExistsFile( sData) then + local Machine = dofile( sData) + if Machine then + if Machine.Offsets then + if Machine.Offsets.TIPO_CN == 0 then + NumericalControl = 'NUM' + elseif Machine.Offsets.TIPO_CN == 1 then + NumericalControl = 'TPA' + else + NumericalControl = 'NUM_FLEX' + end + if Machine.Offsets.X1_POS then MinX1 = -Machine.Offsets.X1_POS end + if Machine.Offsets.X1_NEG then MaxX1 = -Machine.Offsets.X1_NEG end + if Machine.Offsets.PARK_X1 then ParkX1 = -Machine.Offsets.PARK_X1 end + if Machine.Offsets.Z1_NEG then MinZ1 = Machine.Offsets.Z1_NEG end + if Machine.Offsets.Z1_POS then MaxZ1 = min( MaxZ1, Machine.Offsets.Z1_POS) end + if Machine.Offsets.PARK_Z1 then ParkZ1 = Machine.Offsets.PARK_Z1 end + if Machine.Offsets.C1_NEG then MinC1 = Machine.Offsets.C1_NEG end + if Machine.Offsets.C1_POS then MaxC1 = Machine.Offsets.C1_POS end + if Machine.Offsets.B1_NEG then MinB1 = Machine.Offsets.B1_NEG end + if Machine.Offsets.B1_POS then MaxB1 = Machine.Offsets.B1_POS end + if Machine.Offsets.B1_NEG1 then MinB1b = Machine.Offsets.B1_NEG1 end + if Machine.Offsets.B1_POS1 then MaxB1b = Machine.Offsets.B1_POS1 end + if Machine.Offsets.X2_POS then MinX2 = -Machine.Offsets.X2_POS end + if Machine.Offsets.X2_NEG then MaxX2 = -Machine.Offsets.X2_NEG end + if Machine.Offsets.PARK_X2 then ParkX2 = -Machine.Offsets.PARK_X2 end + if Machine.Offsets.Z2_NEG then MinZ2 = Machine.Offsets.Z2_NEG end + if Machine.Offsets.Z2_POS then MaxZ2 = Machine.Offsets.Z2_POS end + if Machine.Offsets.PARK_Z2 then ParkZ2 = Machine.Offsets.PARK_Z2 end + if Machine.Offsets.C2_NEG then MinC2 = Machine.Offsets.C2_NEG end + if Machine.Offsets.C2_POS then MaxC2 = Machine.Offsets.C2_POS end + if Machine.Offsets.B2_NEG then MinB2 = Machine.Offsets.B2_NEG end + if Machine.Offsets.B2_POS then MaxB2 = Machine.Offsets.B2_POS end + if Machine.Offsets.B2_NEG1 then MinB2b = Machine.Offsets.B2_NEG1 end + if Machine.Offsets.B2_POS1 then MaxB2b = Machine.Offsets.B2_POS1 end + if Machine.Offsets.MIN_Y1 then MinMchY1 = Machine.Offsets.MIN_Y1 end + if Machine.Offsets.MAX_Y1 then MaxMchY1 = Machine.Offsets.MAX_Y1 end + if Machine.Offsets.PARK_Y1 then ParkMchY1 = Machine.Offsets.PARK_Y1 end + if Machine.Offsets.MIN_V1 then MinV1 = Machine.Offsets.MIN_V1 end + if Machine.Offsets.MAX_V1 then MaxV1 = Machine.Offsets.MAX_V1 end + if Machine.Offsets.MIN_Y2 then MinMchY2 = Machine.Offsets.MIN_Y2 end + if Machine.Offsets.MAX_Y2 then MaxMchY2 = Machine.Offsets.MAX_Y2 end + if Machine.Offsets.PARK_Y2 then ParkMchY2 = Machine.Offsets.PARK_Y2 end + if Machine.Offsets.MIN_V2 then MinV2 = Machine.Offsets.MIN_V2 end + if Machine.Offsets.MAX_V2 then MaxV2 = Machine.Offsets.MAX_V2 end + if Machine.Offsets.CLAMP5 then Clamp5 = ( Machine.Offsets.CLAMP5 == 1) end + if Machine.Offsets.MINWOPEN then MinWOpen = Machine.Offsets.MINWOPEN end + if Machine.Offsets.MAXWOPEN then MaxWOpen = Machine.Offsets.MAXWOPEN end + if Machine.Offsets.MAXWHEIGHT then MaxWHeight = Machine.Offsets.MAXWHEIGHT end + if Machine.Offsets.DIST_FTZERO then LoadT = Machine.Offsets.DIST_FTZERO end + if Machine.Offsets.DELTA_CARICZERO then TurnerOffs = Machine.Offsets.DELTA_CARICZERO end + if Machine.Offsets.MIN_DELTAVY then MinDeltaYV = Machine.Offsets.MIN_DELTAVY + 0.1 end + if Machine.Offsets.DIST_UNLOAD then UnloadT = Machine.Offsets.DIST_UNLOAD end + if Machine.Offsets.PIVOT_T1 then MillOffs = Machine.Offsets.PIVOT_T1 end + if Machine.Offsets.PIVOT_T2 then Mill2Offs = Machine.Offsets.PIVOT_T2 end + if Machine.Offsets.OFFSETCLAMAT1 then SawC1Offs= Machine.Offsets.OFFSETCLAMAT1 end + if Machine.Offsets.OFFSETBLAMAT1 then SawB1Offs= Machine.Offsets.OFFSETBLAMAT1 end + if Machine.Offsets.OFFSETCLAMAT2 then SawC2Offs= Machine.Offsets.OFFSETCLAMAT2 end + if Machine.Offsets.OFFSETBLAMAT2 then SawB2Offs= Machine.Offsets.OFFSETBLAMAT2 end + if Machine.Offsets.OFFSETXT1 then DeltaTabY = -Machine.Offsets.OFFSETXT1 end + if Machine.Offsets.OFFSETZT1 then DeltaTabZ = Machine.Offsets.OFFSETZT1 + EgtIf( NumericalControl == 'TPA', MillOffs, 0) end + if Machine.Offsets.OFFSETXT2 then Delta2TabY = -Machine.Offsets.OFFSETXT2 end + if Machine.Offsets.OFFSETZT2 then Delta2TabZ = Machine.Offsets.OFFSETZT2 + EgtIf( NumericalControl == 'TPA', Mill2Offs, 0) end + if Machine.Offsets.OFFSETZSOTTOTRAVE then DeltaRulliTraveZ = abs( Machine.Offsets.OFFSETZSOTTOTRAVE) end + if Machine.Offsets.OFFSETZTAPPETO then DeltaRulliTappetoZ = -abs( Machine.Offsets.OFFSETZTAPPETO) end + if Machine.Offsets.SECONDSAW then SecondSaw = ( Machine.Offsets.SECONDSAW == 1) end + if Machine.Offsets.MORTISER then Mortiser = ( Machine.Offsets.MORTISER == 1) end + -- aggiustamenti + MinY1 = MinV1 + MinDeltaYV + MaxY1 = MaxMchY1 + ParkV1 = MaxV1 + ParkY1 = ParkV1 + MinDeltaYV + MinY2 = MinMchY2 + MaxY2 = MaxV2 - MinDeltaYV + ParkV2 = MinV2 + ParkY2 = ParkV2 - MinDeltaYV + ParkX1 = min( ParkX1, MaxX1) + ParkX2 = max( ParkX2, MinX2) + Head2Y = DeltaTabY - Delta2TabY + Head2Z = DeltaTabZ - Delta2TabZ + ParkCSawX1S = ParkX1 + ParkCSawZ1 = min( ParkCSawZ1, MaxZ1) + ParkCSaw0Z1 = min( ParkCSaw0Z1, MaxZ1) + end + end +end + +EmtGeneral { + File='Essetre-PF.nge', + Offset = Vector3d(0.0,1360.0,-1680.0), + AxisMaxAdjust = 300, + AxisMaxRotAdj = 0.5, + ExitMaxAdjust = 300, + ExitMaxRotAdj = 0.5, + AngDeltaMinForHome = 80, + Special = 'Essetre-PF.mlse', + Processor = 'Essetre-PF.mlpe'} +local sBaseAux = {'BASE/SOLID', 'BASE/SIGN', 'BASE/CONVOYER', 'BASE/BELT', 'BASE/COLLISION', 'BASE/TC1', 'BASE/TC2', 'BASE/TC3'} +if Mortiser then table.insert( sBaseAux, 'BASE/TC4') end +local BaseId = EmtBase { + Name = 'Base', + Geo = 'BASE/GEO', + Aux = sBaseAux} +local X1Id = EmtAxis { + Name = 'X1', + Parent = 'Base', + Token = 'X', + Type = MCH_AT.LINEAR, + Dir = Y_AX(), + Pos = Point3d(207.0,-300.0,104.0), + Stroke = {MinX1, MaxX1}, + Home = ParkX1, + Invert = true, + Geo = 'X1_AXIS/GEO', + Aux = 'X1_AXIS/SOLID'} +-- *** Testa 1 *** +EmtAxis { + Name = 'Z1', + Parent = 'X1', + Token = 'Z', + Type = MCH_AT.LINEAR, + Dir = Z_AX(), + Pos = Point3d(0.0,-140.1,113.0), + Stroke = {MinZ1, MaxZ1}, + Home = ParkZ1, + Geo = 'Z1_AXIS/GEO', + Aux = {'Z1_AXIS/SOLID', 'Z1_AXIS/COLLISION'}} +EmtAxis { + Name = 'C1', + Parent = 'Z1', + Token = 'C', + Type = MCH_AT.ROTARY, + Dir = Z_AX(), + Pos = Point3d(0.0,0.0,503.0), + Stroke = {MinC1, MaxC1}, + Home = ParkC1, + Geo = 'C1_AXIS/GEO', + Aux = {'C1_AXIS/SOLID', 'C1_AXIS/COLLISION'}} +EmtAxis { + Name = 'B1', + Parent = 'C1', + Token = 'B', + Type = MCH_AT.ROTARY, + Dir = X_AX(), + Pos = Point3d(-108.4,0.0,MillOffs), + Stroke = {MinB1, MaxB1}, + Home = ParkB1, + Geo = 'B1_AXIS/GEO', + Aux = {'B1_AXIS/SOLID', 'B1_AXIS/COLLISION'}} +-- Frese +local H11Id = EmtHead { + Name = 'H11', + Parent = 'B1', + HSet = 'H11', + Type = MCH_HT.STD, + Pos = Point3d(0,0,0), + TDir = Z_AX(), + ADir = -Y_AX(), + Rot1W = 0.2, + Rot2Stroke = { MinB1, MaxB1}, + OthColl = {'B1/SOLID', 'C1/SOLID'}, + Geo = 'H11_HEAD/GEO'} +EgtSetInfo( H11Id, 'ZEXTRA', '400,30,290,60,180,90') +-- Lama +local H12Id = EmtHead { + Name = 'H12', + Parent = 'B1', + HSet = 'H11', + Type = MCH_HT.STD, + Pos = Point3d(SawOffsX,SawOffsY,SawOffsZ), + TDir = Vector3d( 0, sin( SawB1Offs), cos( SawB1Offs)), + ADir = -X_AX(), + Rot1W = 0.5, + Rot2Stroke = { MinB1b, MaxB1b}, + OthColl = {'B1/SOLID', 'C1/SOLID'}, + Geo = 'H12_HEAD/GEO'} +EgtSetInfo( H12Id, 'ZEXTRA', '400,30,300,45,200,60,10,90') +EgtSetInfo( H12Id, 'ZMAXONROT', '1,190') +-- Sega a catena +EmtAxis { + Name = 'A', + Parent = 'B1', + Token = '**', + Type = MCH_AT.ROTARY, + Dir = Z_AX(), + Pos = Point3d( 0, 0, 0), + Stroke = { -90.1, 90.1}, + Home = 0, + Geo = 'A1_AXIS/GEO'} +local H13Id = EmtHead { + Name = 'H13', + Parent = 'A', + HSet = 'H11', + Type = MCH_HT.STD, + Pos = Point3d( 0, 0, -ChSawLen), + TDir = -X_AX(), + ADir = Z_AX(), + Rot1W = 0.2, + Rot2Stroke = { -90.1, 90.1}, + SolCh = MCH_SCC.ADIR_NEAR, + OthColl = {'B1/SOLID', 'C1/SOLID'}, + Geo = 'H13_HEAD/GEO'} +EgtSetInfo( H13Id, 'ZEXTRA', '200') +EgtSetInfo( H13Id, 'ZSAFEDELTA', '60') +EgtSetInfo( H13Id, 'ZMAXONROT', '1,80') +-- Dummy +EmtHead { + Name = 'H14', + Parent = 'B1', + HSet = 'H14', + Type = MCH_HT.STD, + Pos = Point3d(0,0,0), + TDir = Z_AX(), + ADir = X_AX(), + Rot1W = 0.2, + Geo = 'H14_HEAD/GEO'} +-- *** Testa 2 *** +local X2Id = EmtAxis { + Name = 'X2', + Parent = 'Base', + Token = 'X', + Type = MCH_AT.LINEAR, + Dir = Y_AX(), + Pos = Point3d(115.8,3065.9,-1738.0), + Stroke = {MinX2, MaxX2}, + Home = ParkX2, + Invert = true, + Geo = 'X2_AXIS/GEO', + Aux = 'X2_AXIS/SOLID'} +local Z2Id = EmtAxis { + Name = 'Z2', + Parent = 'X2', + Token = 'Z', + Type = MCH_AT.LINEAR, + Dir = Z_AX(), + Pos = Point3d(291.0,-140.1,-2056.3), + Stroke = {MinZ2, MaxZ2}, + Home = ParkZ2, + Geo = 'Z2_AXIS/GEO', + Aux = {'Z2_AXIS/SOLID', 'Z2_AXIS/COLLISION'}} +local C2Id = EmtAxis { + Name = 'C2', + Parent = 'Z2', + Token = 'C', + Type = MCH_AT.ROTARY, + Dir = Z_AX(), + Pos = Point3d( Head2X, Head2Y, Head2Z+503.0), + Stroke = {MinC2, MaxC2}, + Home = ParkC2, + Geo = 'C2_AXIS/GEO', + Aux = {'C2_AXIS/SOLID', 'C2_AXIS/COLLISION'}} +local B2Id = EmtAxis { + Name = 'B2', + Parent = 'C2', + Token = 'B', + Type = MCH_AT.ROTARY, + Dir = X_AX(), + Pos = Point3d( Head2X-108.4, Head2Y, Head2Z+Mill2Offs), + Stroke = {MinB2, MaxB2}, + Home = ParkB2, + Geo = 'B2_AXIS/GEO', + Aux = {'B2_AXIS/SOLID', 'B2_AXIS/COLLISION'}} +local vtMove2 = Vector3d( 0, Head2Y, Head2Z) +EgtMove( EgtGetFirstNameInGroup( X2Id, 'SOLID'), vtMove2, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( Z2Id, 'SOLID'), vtMove2, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( Z2Id, 'COLLISION'), vtMove2, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( C2Id, 'SOLID'), vtMove2, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( C2Id, 'COLLISION'), vtMove2, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( B2Id, 'SOLID'), vtMove2, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( B2Id, 'COLLISION'), vtMove2, GDB_RT.GLOB) +-- Frese +local H21Id = EmtHead { + Name = 'H21', + Parent = 'B2', + HSet = 'H21', + Type = MCH_HT.STD, + Pos = Point3d( Head2X, Head2Y, Head2Z), + TDir = Z_AX(), + Rot1W = 0.2, + Rot2Stroke = { MinB2, MaxB2}, + OthColl = {'B2/SOLID', 'C2/SOLID'}, + Geo = 'H21_HEAD/GEO'} +EgtSetInfo( H21Id, 'ZEXTRA', '400,30,290,60,180,90') +-- Lama +if SecondSaw then + local H22Id = EmtHead { + Name = 'H22', + Parent = 'B2', + HSet = 'H21', + Type = MCH_HT.STD, + Pos = Point3d( Head2X + Saw2OffsX, Head2Y + Saw2OffsY, Head2Z + Saw2OffsZ), + TDir = Vector3d( 0, sin( SawB2Offs), cos( SawB2Offs)), + ADir = -X_AX(), + Rot1W = 0.5, + Rot2Stroke = { MinB2b, MaxB2b}, + OthColl = {'B2/SOLID', 'C2/SOLID'}, + Geo = 'H22_HEAD/GEO'} + EgtSetInfo( H22Id, 'ZEXTRA', '400,30,300,45,200,60,10,90') + EgtSetInfo( H22Id, 'ZMAXONROT', '1,190') +end +-- *** Carrelli *** +-- Morse +local Y1Id = EmtAxis { + Name = 'Y1', + Parent = 'Base', + Type = MCH_AT.LINEAR, + Dir = -X_AX(), + Pos = Point3d(-865.7,2626.8,-866.0), + Stroke = { MinY1, MaxY1}, + Home = ParkY1, + Geo = 'Y1_AXIS/GEO', + Aux = 'Y1_AXIS/SOLID'} +local PY1Id = EmtAxis { + Name = 'PY1', + Parent = 'Y1', + Type = MCH_AT.LINEAR, + Dir = Y_AX(), + Pos = Point3d(-469.6,2367.5,-751.6), + Stroke = {0, MaxHoOpen}, + Home = MaxHoOpen, + Geo = 'PY1_AXIS/GEO', + Aux = 'PY1_AXIS/SOLID'} +local Y2Id = EmtAxis { + Name = 'Y2', + Parent = 'Base', + Type = MCH_AT.LINEAR, + Dir = -X_AX(), + Pos = Point3d(865.7,2626.8,-866.0), + Stroke = { MinY2, MaxY2}, + Home = ParkY2, + Geo = 'Y2_AXIS/GEO', + Aux = 'Y2_AXIS/SOLID'} +local PY2Id = EmtAxis { + Name = 'PY2', + Parent = 'Y2', + Type = MCH_AT.LINEAR, + Dir = Y_AX(), + Pos = Point3d(469.6,2367.5,-751.6), + Stroke = {0, MaxHoOpen}, + Home = MaxHoOpen, + Geo = 'PY2_AXIS/GEO', + Aux = 'PY2_AXIS/SOLID'} +-- Rulli +local V1Id = EmtAxis { + Name = 'V1', + Parent = 'Base', + Type = MCH_AT.LINEAR, + Dir = -X_AX(), + Pos = Point3d(-875.5,1072.0,-1509.1), + Stroke = { MinV1, MaxV1}, + Home = ParkV1, + Geo = 'V1_AXIS/GEO', + Aux = {'V1_AXIS/SOLID', 'V1_AXIS/COLLISION'}} +local PV1Id = EmtAxis { + Name = 'PV1', + Parent = 'V1', + Type = MCH_AT.LINEAR, + Dir = Y_AX(), + Pos = Point3d(-194.0,2364.7,-879.1), + Stroke = {0, MaxHoOpen}, + Home = MaxHoOpen, + Geo = 'PV1_AXIS/GEO', + Aux = 'PV1_AXIS/SOLID'} +local QV1Id = EmtAxis { + Name = 'QV1', + Parent = 'V1', + Type = MCH_AT.LINEAR, + Dir = Z_AX(), + Pos = Point3d(-287.0,2481.0,-943.0), + Stroke = {0, MaxVeOpen}, + Home = MaxVeOpen, + Geo = 'QV1_AXIS/GEO', + Aux = 'QV1_AXIS/SOLID'} +local V2Id = EmtAxis { + Name = 'V2', + Parent = 'Base', + Type = MCH_AT.LINEAR, + Dir = -X_AX(), + Pos = Point3d(875.5,1072.0,-1509.1), + Stroke = { MinV2, MaxV2}, + Home = ParkV2, + Geo = 'V2_AXIS/GEO', + Aux = {'V2_AXIS/SOLID', EgtIf( Clamp5, 'V2_AXIS/AUX5', 'V2_AXIS/AUX'), 'V2_AXIS/COLLISION'}} +local PV2Id = EmtAxis { + Name = 'PV2', + Parent = 'V2', + Type = MCH_AT.LINEAR, + Dir = Y_AX(), + Pos = Point3d(194.0,2364.7,-879.1), + Stroke = {0, MaxHoOpen}, + Home = MaxHoOpen, + Geo = 'PV2_AXIS/GEO', + Aux = 'PV2_AXIS/SOLID'} +local QV2Id = EmtAxis { + Name = 'QV2', + Parent = 'V2', + Type = MCH_AT.LINEAR, + Dir = Z_AX(), + Pos = Point3d(287.0,2481.0,-943.0), + Stroke = {0, MaxVeOpen}, + Home = MaxVeOpen, + Geo = 'QV2_AXIS/GEO', + Aux = 'QV2_AXIS/SOLID'} +local WId, PWId, QWId +if Clamp5 then + WId = EmtAxis { + Name = 'W', + Parent = 'V2', + Type = MCH_AT.LINEAR, + Dir = -X_AX(), + Pos = Point3d(875.5,1072.0,-1509.1), + Stroke = { MinW, MaxW}, + Home = ParkW, + Geo = 'W_AXIS/GEO', + Aux = { 'W_AXIS/SOLID', 'W_AXIS/COLLISION'}} + PWId = EmtAxis { + Name = 'PW', + Parent = 'W', + Type = MCH_AT.LINEAR, + Dir = Y_AX(), + Pos = Point3d(194.0,2364.7,-879.1), + Stroke = {MinWOpen, MaxWOpen}, + Home = MaxWOpen, + Geo = 'PW_AXIS/GEO', + Aux = 'PW_AXIS/SOLID'} + QWId = EmtAxis { + Name = 'QW', + Parent = 'PW', + Type = MCH_AT.LINEAR, + Dir = Z_AX(), + Pos = Point3d(194.0,2364.7,-879.1), + Stroke = {0, 30}, + Home = 0, + Geo = 'QW_AXIS/GEO', + Aux = { 'QW_AXIS/SOLID', 'QW_AXIS/COLLISION'}} +end +-- *** Tavola *** +EmtAxis { + Name = 'T', + Parent = 'Base', + --Token = '**', + Type = MCH_AT.LINEAR, + Dir = - X_AX(), + Pos = Point3d(0.0,2450.0,-958.0), + Stroke = {-20000, 20000}, + Home = LoadT, + Geo = 'T_AXIS/GEO'} +EmtTable { + Name = 'Tab', + Parent = 'T', + Type = MCH_TT.FLAT, + Ref1 = Point3d( -DimTabX, DeltaTabY, DeltaTabZ), + Geo = 'TABLE/GEO', + Aux = 'TABLE/SOLID'} +-- *** ToolChanger *** +local ptTc1 = Point3d( 150, 2894, -217 + ( DeltaTabZ + DeltaRulliTraveZ + 30)) +local vtDt1 = Vector3d( 0, 0, - 102.5) +EmtTcPos { + Name = 'T1', + Parent = 'Base', + Pos = ptTc1 + Vector3d( SawOffsX, -SawOffsZ, 0), + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T1'} +EmtTcPos { + Name = 'T3', + Parent = 'Base', + Pos = ptTc1 + 2 * vtDt1, + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T3'} +EmtTcPos { + Name = 'T4', + Parent = 'Base', + Pos = ptTc1 + 3 * vtDt1, + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T4'} +EmtTcPos { + Name = 'T5', + Parent = 'Base', + Pos = ptTc1 + 4 * vtDt1, + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T5'} +EmtTcPos { + Name = 'T6', + Parent = 'Base', + Pos = ptTc1 + 5 * vtDt1, + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T6'} +EmtTcPos { + Name = 'T7', + Parent = 'Base', + Pos = ptTc1 + 6 * vtDt1, + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T7'} +EmtTcPos { + Name = 'T8', + Parent = 'Base', + Pos = ptTc1 + 7 * vtDt1, + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T8'} +EmtTcPos { + Name = 'T9', + Parent = 'Base', + Pos = ptTc1 + 8 * vtDt1, + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T9'} +EmtTcPos { + Name = 'T10', + Parent = 'Base', + Pos = ptTc1 + 9 * vtDt1, + TDir = -Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T10'} +local ptTc2 = Point3d( 150.5, -174.3, -216.5 + ( DeltaTabZ + DeltaRulliTraveZ + 30)) +local vtDt2 = Vector3d( 0, 0, - 102.5) +EmtTcPos { + Name = 'T11', + Parent = 'Base', + Pos = ptTc2 + EgtIf( SecondSaw, Vector3d( Saw2OffsX, Saw2OffsZ, 0), V_NULL()), + TDir = Y_AX(), + ADir = -X_AX(), + Geo = 'BASE/T11'} +EmtTcPos { + Name = 'T12', + Parent = 'Base', + Pos = ptTc2 + 1 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T12'} +EmtTcPos { + Name = 'T13', + Parent = 'Base', + Pos = ptTc2 + 2 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T13'} +EmtTcPos { + Name = 'T14', + Parent = 'Base', + Pos = ptTc2 + 3 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T14'} +EmtTcPos { + Name = 'T15', + Parent = 'Base', + Pos = ptTc2 + 4 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T15'} +EmtTcPos { + Name = 'T16', + Parent = 'Base', + Pos = ptTc2 + 5 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T16'} +EmtTcPos { + Name = 'T17', + Parent = 'Base', + Pos = ptTc2 + 6 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T17'} +EmtTcPos { + Name = 'T18', + Parent = 'Base', + Pos = ptTc2 + 7 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T18'} +EmtTcPos { + Name = 'T19', + Parent = 'Base', + Pos = ptTc2 + 8 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T19'} +EmtTcPos { + Name = 'T20', + Parent = 'Base', + Pos = ptTc2 + 9 * vtDt2, + TDir = Y_AX(), + ADir = X_AX(), + Geo = 'BASE/T20'} +local ptTc3 = Point3d( 480, 2214.0, -200.8 + ( DeltaTabZ + DeltaRulliTraveZ + 30)) +EmtTcPos { + Name = 'T101', + Parent = 'Base', + Pos = ptTc3, + TDir = -X_AX(), + ADir = Z_AX(), + Geo = 'BASE/T101'} +if Mortiser then + local ptTc4 = ptTc3 + Vector3d( 0, 0, -270) + EmtTcPos { + Name = 'T201', + Parent = 'Base', + Pos = ptTc4, + TDir = -X_AX(), + ADir = Z_AX(), + Geo = 'BASE/T201'} +end + +-- Aggiusto posizioni geometriche +local vtMovB = Vector3d( 0, 0, ( DeltaTabZ + DeltaRulliTraveZ + 30)) -- -( -1010 + 980)) +EgtMove( EgtGetFirstNameInGroup( BaseId, 'SOLID'), vtMovB, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( BaseId, 'COLLISION'), vtMovB, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( BaseId, 'SIGN') or GDB_ID.NULL, vtMovB, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( BaseId, 'TC1') or GDB_ID.NULL, vtMovB, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( BaseId, 'TC2') or GDB_ID.NULL, vtMovB, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( BaseId, 'TC3') or GDB_ID.NULL, vtMovB, GDB_RT.GLOB) +if Mortiser then + EgtMove( EgtGetFirstNameInGroup( BaseId, 'TC4') or GDB_ID.NULL, vtMovB, GDB_RT.GLOB) +end +EgtMove( EgtGetFirstNameInGroup( X1Id, 'SOLID'), vtMovB, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( X2Id, 'SOLID'), vtMovB, GDB_RT.GLOB) +local vtMovC = Vector3d( 0, 0, ( DeltaTabZ + DeltaRulliTappetoZ + 1495)) -- -( -1010 - 485) +EgtMove( EgtGetFirstNameInGroup( BaseId, 'BELT'), vtMovC, GDB_RT.GLOB) +local vtMove = Vector3d( 0, ( DeltaTabY - 1170.0), ( DeltaTabZ + 1010.0)) +EgtMove( EgtGetFirstNameInGroup( BaseId, 'CONVOYER'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( Y1Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( PY1Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( Y2Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( PY2Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( V1Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( PV1Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( QV1Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( V2Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( V2Id, EgtIf( Clamp5, 'AUX5', 'AUX')), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( PV2Id, 'SOLID'), vtMove, GDB_RT.GLOB) +EgtMove( EgtGetFirstNameInGroup( QV2Id, 'SOLID'), vtMove, GDB_RT.GLOB) +if Clamp5 then + EgtMove( EgtGetFirstNameInGroup( WId, 'SOLID'), vtMove, GDB_RT.GLOB) + EgtMove( EgtGetFirstNameInGroup( WId, 'COLLISION'), vtMove, GDB_RT.GLOB) + EgtMove( EgtGetFirstNameInGroup( PWId, 'SOLID'), vtMove, GDB_RT.GLOB) + EgtMove( EgtGetFirstNameInGroup( QWId, 'SOLID'), vtMove, GDB_RT.GLOB) + EgtMove( EgtGetFirstNameInGroup( QWId, 'COLLISION'), vtMove, GDB_RT.GLOB) +end + +-- Assegno identificativi alle spie delle morse +PY1LightId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( PY1Id, 'SOLID') or GDB_ID.NULL, 'Light') +PY2LightId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( PY2Id, 'SOLID') or GDB_ID.NULL, 'Light') + +--------------------------------------------------------------------- +-- Funzioni richiamate per modificare i dati macchina in casi particolari +--function OnSetTable() +--end + +--------------------------------------------------------------------- +function OnSetHead() + -- se testa H11 (fresa) + if EMC.HEAD == 'H11' then + local dRawH = GetRawHeight() + EmtModifyAxisHome( 'X1', ParkX1) + EmtModifyAxisHome( 'Z1', ParkZ1 + EgtIf( dRawH > 650, EgtIf( EMC.TOTDIAM < 61, 235, 165), 0)) + EmtModifyAxisHome( 'C1', ParkC1) + EmtModifyAxisHome( 'B1', ParkB1) + EmtModifyAxisDirection( 'B1', X_AX()) + -- se testa H12 (lama) + elseif EMC.HEAD == 'H12' then + EmtModifyAxisHome( 'X1', ParkX1) + EmtModifyAxisHome( 'Z1', ParkZ1) + EmtModifyAxisHome( 'C1', ParkC1) + EmtModifyAxisHome( 'B1', ParkB1) + EmtModifyAxisDirection( 'B1', Vector3d( cos( SawC1Offs), -sin( SawC1Offs), 0)) + -- se testa H13 (sega a catena) + elseif EMC.HEAD == 'H13' then + -- aggiustamenti per distanza + local dDist = EgtIf( EMC.DIST and abs( EMC.DIST) > 1, EMC.DIST, ChSawLen) + EmtModifyExitPosition( EMC.HEAD, EMC.EXIT, Point3d( 0, 0, Head2Z - dDist)) + local vtMove = Point3d( 0, 0, Head2Z - dDist) - Point3d( EMC.EXITPOS) + local ExitId = EgtGetFirstNameInGroup( EgtGetHeadId( EMC.HEAD), 'T'..tostring( EMC.EXIT)) + EgtMove( ExitId, vtMove) + -- recupero valore asse A bloccato + local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS) + local CSawPosA = tonumber( sVal:sub( 3) or '') + EmtModifyAxisHome( 'X1', ParkCSawX1) + EmtModifyAxisHome( 'Z1', GetChainSawZHomeFromVirtualAxis( CSawPosA)) + EmtModifyAxisHome( 'C1', GetChainSawCHomeFromVirtualAxis( CSawPosA)) + EmtModifyAxisHome( 'B1', ParkCSawB1) + EmtModifyAxisDirection( 'B1', X_AX()) + -- se testa H21 (fresa2) + elseif EMC.HEAD == 'H21' then + local dRawH = GetRawHeight() + EmtModifyAxisHome( 'X2', ParkX2) + EmtModifyAxisHome( 'Z2', ParkZ2 + EgtIf( dRawH > 650, EgtIf( EMC.TOTDIAM < 61, 235, 165), 0)) + EmtModifyAxisHome( 'C2', ParkC2) + EmtModifyAxisHome( 'B2', ParkB2) + EmtModifyAxisDirection( 'B2', X_AX()) + -- se testa H22 (lama) + elseif EMC.HEAD == 'H22' then + EmtModifyAxisHome( 'X2', ParkX2) + EmtModifyAxisHome( 'Z2', ParkZ2) + EmtModifyAxisHome( 'C2', ParkC2) + EmtModifyAxisHome( 'B2', ParkB2) + EmtModifyAxisDirection( 'B2', Vector3d( cos( SawC2Offs), -sin( SawC2Offs), 0)) + end +end + +--------------------------------------------------------------------- +function GetHeadSet( sHead) + if sHead == 'H11' or sHead == 'H12' or sHead == 'H13' then + return 1 + elseif sHead == 'H21' or sHead == 'H22' then + return 2 + else + return 0 + end +end + +--------------------------------------------------------------------- +-- Funzione che restituisce l'altezza del pezzo in lavorazione + function GetRawHeight() + local nRawId = EgtGetFirstRawPart() + if not nRawId then + local vLnkRawId = EmtGetAllLinkedRawParts() + if vLnkRawId and #vLnkRawId >0 then nRawId = vLnkRawId[1] end + end + local b3Raw = EgtGetRawPartBBox( nRawId or GDB_ID.NULL) + if not b3Raw or b3Raw:isEmpty() then return 0 end + return b3Raw:getDimZ() + end + +--------------------------------------------------------------------- +-- Funzione che riconosce testa per sega a catena +function HeadIsChainSaw( sHead) + return ( sHead == 'H13') +end + +--------------------------------------------------------------------- +-- Funzione che calcola la posizione Home di Z per la sega a catena dal valore dell'asse virtuale +function GetChainSawZHomeFromVirtualAxis( dPosA) + -- se A=0 -> T101 -> HomeZ = -400 + if abs( dPosA) < 0.1 then + return ParkCSaw0Z1 + -- altrimenti A=-90 -> T102 o A=90 -> T104 -> HomeZ = -100 + else + return ParkCSawZ1 + end +end + +--------------------------------------------------------------------- +-- Funzione che calcola l'angolo Home di C per la sega a catena dal valore dell'asse virtuale +function GetChainSawCHomeFromVirtualAxis( dPosA) + -- se A=0 -> T101 -> HomeC = 0 + if abs( dPosA) < 0.1 then + return ParkCSaw0C1 + -- altrimenti A=90 -> T104 -> HomeC = -90 + else + return ParkCSawC1 + end +end + +--------------------------------------------------------------------- +-- Funzione che ritorna ZExtra partendo dalla testa e dall'angolo verticale +function GetZExtra( sHead, dAngV) + if sHead == 'H11' or sHead == 'H21' then + if abs( dAngV) < 30.1 then + return 400 + elseif abs( dAngV) < 45.1 then + return 300 + elseif abs( dAngV) < 60.1 then + return 200 + elseif abs( dAngV) < 90.1 then + return 10 + else + return 0 + end + elseif sHead == 'H12' or sHead == 'H22' then + if abs( dAngV) < 30.1 then + return 400 + elseif abs( dAngV) < 45.1 then + return 300 + elseif abs( dAngV) < 60.1 then + return 200 + elseif abs( dAngV) < 90.1 then + return 10 + else + return 0 + end + end +end + +--------------------------------------------------------------------- +-- Funzione per impostare spia stato morsa carrello Y1 +function SetPY1Light( bClosed) + if not PY1LightId then return end + EgtSetColor( PY1LightId, EgtIf( bClosed, 'RED', 'LIME')) + if bClosed then + EgtSetInfo( PY1LightId, 'On', '1') + else + EgtRemoveInfo( PY1LightId, 'On') + end +end + +--------------------------------------------------------------------- +-- Funzione per leggere lo stato della morsa carrello Y1 +function GetPY1Light() + if not PY1LightId then return false end + return ( EgtGetInfo( PY1LightId, 'On') == '1') +end + +--------------------------------------------------------------------- +-- Funzione per impostare spia stato morsa carrello Y2 +function SetPY2Light( bClosed) + if not PY2LightId then return end + EgtSetColor( PY2LightId, EgtIf( bClosed, 'RED', 'LIME')) + if bClosed then + EgtSetInfo( PY2LightId, 'On', '1') + else + EgtRemoveInfo( PY2LightId, 'On') + end +end + +--------------------------------------------------------------------- +-- Funzione per leggere lo stato della morsa carrello Y2 +function GetPY2Light() + if not PY2LightId then return false end + return ( EgtGetInfo( PY2LightId, 'On') == '1') +end + + +--------------------------------------------------------------------- +-- Funzione per resettare tutte le attivazioni della macchina +function OnResetMachine() + EmtUnlinkAllRawPartsFromGroups() + EmtUnlinkAllFixturesFromGroups() + SetPY1Light( false) + SetPY2Light( false) + -- nascondo Vmill + local nRawId = EgtGetFirstRawPart() + while nRawId do + local nVmId = EgtGetFirstNameInGroup( nRawId, 'VMill') + local nId = EgtGetFirstInGroup( nRawId) + while nId do + EgtSetStatus( nId, EgtIf( nId ~= nVmId, GDB_ST.ON, GDB_ST.OFF)) + nId = EgtGetNext( nId) + end + nRawId = EgtGetNextRawPart( nRawId) + end + EgtSetStatus( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill') or GDB_ID.NULL, GDB_ST.OFF) +end diff --git a/Messages/Eng.txt b/Messages/Eng.txt new file mode 100644 index 0000000..758cf28 --- /dev/null +++ b/Messages/Eng.txt @@ -0,0 +1,255 @@ +// English machine message file 2022/01/17 + +[MDI] +1=Take tool n° 1 +2=Take tool n° 2 +3=Take tool n° 3 +4=Take tool n° 4 +5=Take tool n° 5 +6=Take tool n° 6 +7=Take tool n° 7 +8=Take tool n° 8 +9=Take tool n° 9 +10=Take tool n° 10 +11=Take tool n° 11 +12=Take tool n° 12 +13=Take tool n° 13 +14=Take tool n° 14 +15=Take tool n° 15 +16=Take tool n° 16 +17=Take tool n° 17 +18=Take tool n° 18 +19=Head whitout tool +20=Take the Chainsaw +21=Activate tool magazine +22=Tool tool loader n°1 Forwards +23=Tool tool loader n°1 Backwards +24=Tool tool loader n°2 Forwards +25=Tool tool loader n°2 Backwards +26=Tool tool loader Chainsaw Forwards +27=Tool tool loader Chainsaw Backwards +28=Front zero reference ascent +29=Front zero reference descent +30=Lateral zero roller ascent +31=Lateral zero roller descent +32=Ability clockwise rotation right driller motor +33=Ability counterclockwise rotation right driller motor +34=Ability clockwise rotation left driller motor +35=Ability counterclockwise rotation left driller motor +36=Stop rotation of drilling spindles +37=Manual tool number assignment in the 5-axis head (E80001=1; E80001=2; E80001=3;ETC...) + +[PLC] +1=Macchina spenta +2=Assi in extracorsa +3=Attesa carico trave +4=Attesa chiusura Pinza 1 +5=Attesa apertura Pinza 1 +6=Attesa chiusura Pinza 4 +7=Attesa apertura Pinza 4 +8=Verificare olio lubrificazione aggregati catena +9=Termici motori +10=Trasferimento programma in corso +11=Modulo Adam 1 non Ok verificare V7624.L +12=Minimo livello grasso +13=Difetto impianto lubrificazione assi verificare livello grasso +14=Manca aria compressa +15=Sovratemperatura armadio elettrico Cn +16=Modulo Adam 2 non Ok verificare V7634.L +17=Refrigratore mandrini +18=Sovratemperatura armadio elettrico Drive +19=Verificare collegamento Marcatore +20=Attesa marcatore libero +21=Barriere intervenute !!! +22=Attesa conferma per chiusura Pinza 1 o 4 +23=Malfunzionamento azion. asse X Slave +24=Malfunzionamento asse X Testa 1 +25=Malfunzionamento asse Y +26=Malfunzionamento asse Z Testa 1 +27=Malfunzionamento asse A Testa 1 +28=Malfunzionamento asse B +29=Malfunzionamento asse V +30=Malfunzionamento asse Cu Testa 1 +31=Malfunzionamento asse Cu Testa 2 +32=Asse A bloccato +33=Bypass segnali assi digitali attivo +34=Attesa chiusura Pinza 2 +35=Attesa apertura Pinza 2 +36=Attesa chiusura Pinza 3 +37=Attesa apertura Pinza 3 +38= +39=Sensore controllo giri Lama guasto +40=Fuori giri Lama +41=Attesa ribaltamento 90 gradi trave (Girare chiave in modo manuale) +42=Attesa ribaltamento 180 gradi trave (Girare chiave in modo manuale) +43=Attesa ribaltamento 270 gradi trave (Girare chiave in modo manuale) +44=Attesa scarico spezzone in entrata (Girare chiave in modo manuale) +45=Attesa conferma scarico trave +46=Rotazione T1 proibita senza utensili: verificare +47=Rotazione T2 proibita senza utensili: verificare +48= +49= +50=Malfunzionamento asse X Testa 2 +51=Malfunzionamento asse Z Testa 2 +52=Malfunzionamento asse A Testa 2 +53=Malfunzionamento asse B2 Movimento Cu +54=Riferimento di zero entrata non basso +55=Riferimento di scarico non a riposo +56= +57= +58= +59=*** MANUTENZIONE CE *** +60=Attesa scarico utensile manuale +61=Attesa carico utensile manuale +62= +63=Attesa apertura totale pinza 3 +64=Attesa conferma carico trave +65=Attesa conferma scarico spezzone corto non tenuto da pinza 1 +66=Attesa conferma scarico spezzone su rulliera entrata +67=Attesa stampa etichetta pezzo precedente +68=Attesa carico trave M75 in corso +69=Traslatore scarico pieno +70=Testa nuovo trave non trovata +71=Corsa arretramento spezzone troppo grande +72=Ft lettura testa trave occupata +73=Attesa Start dopo carico trave con muletto +74=Pezzo scaricato su nastro !!!!! +75=Scaricare trave con muletto e resettare allarme +76=Pinza 1 chiusa senza trave aprirla con M111 +77=Pinza 4 chiusa senza trave aprirla con M171 +78=Micro controllo chiusura pinza 1 non Ok +79=Attesa conferma lavoro con pinza 4 dentro macchina VERIFICARE !!! +80=Pezzo incompleto alcune lavorazioni non eseguite !!! +81=Micro controllo chiusura pinza 4 non Ok +82=Attesa Ft pinza 1 lettura coda trave a zero +83=Cambi utensile non indietro !!! +84=Testa avanti programmare M90 e poi M199 +85=Cambio T201-T202 non possibile con pinza 1 impegnata +86=Attesa protezione cambio utensile aperta +87=Asse A fuori posizione +88=Avanti magazzino utensili non Ok +89=Indietro magazzino utensili non Ok +90= +91= +92= +93= +94= +95=Messa a punto inserita permessi solo movimenti manuali +96= +97= +98=Avanti testa per cambio utensile non Ok +99=Indietro testa per cambio utensile non Ok +100= +101=Motore T1 non in rotazione (Fcinv0=1) +102=Motore T2 non in rotazione (Fcinv0=1) +103= +104= +105=Larghezza trave EX non Ok !!! +106=Altezza trave EZ non Ok !!! +107= +108=Attendere inserzioni di potenza +109=Premere reset su CNC +110= +111=Malfunzionamento inverter 1 +112=Malfunzionamento inverter 2 +113= +114= +115= +116= +117= +118=Flussostato Testa 1 non Ok +119=Flussostato Testa 2 non Ok +120= +121=Sovratemperatura resistenze di frenatura inverter 1 +122=Sovratemperatura resistenze di frenatura inverter 2 +123= +124= +125= +126= +127= +128= +129= +130= +131=Sovratemperatura motore testa 1 +132=Sovratemperatura motore testa 2 +133= +134= +135= +136= +137= +138= +139= +140= +141=Sovracorrente inverter 1 +142=Sovracorrente inverter 2 +143= +144= +145= +146= +147= +148=Cambi utensili non avanti +149=Posizione cambio utensile 1 impegnata per scarico +150=Posizione cambio utensile 2 impegnata per scarico +151=Difetto bloccaggio utensile testa 1 +152=Difetto bloccaggio utensile testa 2 +153=Utensile presente su testa 1 con E80001=0 +154=Utensile presente su testa 2 con E80002=0 +155=Difetto sbloccaggio utensile testa 1 +156=Difetto sbloccaggio utensile testa 2 +157=Cono utensile testa 1 sporco +158=Cono utensile testa 2 sporco +159=Pistone sbloccaggio cono testa 1 non a riposo +160=Pistone sbloccaggio cono testa 2 non a riposo +161=Asse X1 non a zero per cambio utensile +162=Asse X2 non a zero per cambio utensile +163= +164= +165= +166= +167= +168= +169= + + +[CNC] +900=INVALID TOOL NUMBER M6T +901=TOOL NUMBER LOADED NOT OK +902=INVALID MOTOR TOOL NUMBER E80001 +903=SENSOR SETPOINT B MILLING NOT OK +904=SENSOR SETPOINT C MILLING NOT OK +905=SENSOR SETPOINT B SAW BLADE NOT OK +906=SENSOR SETPOINT C SAW BLADE NOT OK +907=UNLOAD CHAINSAW MANUALLY +908=WORK WITH 2 BLADES NOT POSSIBLE B<>90 OR C<>0 OR 180 +909=DEFINE TOOL NUMBER ENGINE SAW BLADE EU +910=G124 X REQUIRED +911=G124 Y REQUIRED +912=G124 B REQUIRED +913=G124 C REQUIRED +914=libero +915=libero +916=DEFINE SPINDLE NUMBER ET.. (1=BLADE 2=MILL 3=RIGHT DRILLER 4=LEFT DRILLER) +917=UNLOADING MOTOR TOOL +918=G104X.. REQUIRED +919=G104Y.. REQUIRED +920=G104Z.. REQUIRED +921=G104ET.. NOT OK (MANDATORY SCREWDRIVER NUMBER ET0-ET1-ET2-ET3) +922=G104EF.. NOT OK (REQUIRED LAYER NUMBER) +923=SETPOINT V SENSOR NOT OK +924=OFFSET X SAW BLADE NOT ALIGNED WITH CADCAM +925=OFFSET Y SAW BLADE NOT ALIGNED WITH CADCAM +926=OFFSET Z SAW BLADE NOT ALIGNED WITH CADCAM +927=PIVOT Z SAW BLADE NOT ALIGNED WITH CADCAM +928=PIVOT C SAW BLADE NOT ALIGNED WITH CADCAM +929=OFFSET X MILL NOT ALIGNED WITH CADCAM +930=OFFSET Y MILL NOT ALIGNED WITH CADCAM +931=OFFSET Z MILL NOT ALIGNED WITH CADCAM +932=PIVOT Z MILL NOT ALIGNED WITH CADCAM +933=MANDATORY X-U-W-Z PROGRAMMING WITH G102EH.. NON-ZERO +934=OFFSET X RIGHT DRILLER NOT ALIGNED WITH CADCAM +935=OFFSET Y RIGHT DRILLER NOT ALIGNED WITH CADCAM +936=OFFSET Z RIGHT DRILLER NOT ALIGNED WITH CADCAM +937=OFFSET X LEFT DRILLER NOT ALIGNED WITH CADCAM +938=OFFSET Y LEFT DRILLER NOT ALIGNED WITH CADCAM +939=OFFSET Z LEFT DRILLER NOT ALIGNED WITH CADCAM + diff --git a/Messages/FromMachine_Ita.old.txt b/Messages/FromMachine_Ita.old.txt new file mode 100644 index 0000000..827bc71 --- /dev/null +++ b/Messages/FromMachine_Ita.old.txt @@ -0,0 +1,170 @@ +% 9999.9 +N1 $01:Macchina spenta +N2 $02:Assi in extracorsa +N3 $03:Attesa carico trave +N4 $04:Attesa chiusura Pinza 1 +N5 $05:Attesa apertura Pinza 1 +N6 $06:Attesa chiusura Pinza 4 +N7 $07:Attesa apertura Pinza 4 +N8 $08:Verificare olio lubrificazione aggregati catena +N9 $09:Termici motori +N10 $10:Trasferimento programma in corso +N11 $11:Modulo Adam 1 non Ok verificare V7624.L +N12 $12:Minimo livello grasso +N13 $13:Difetto impianto lubrificazione assi verificare livello grasso +N14 $14:Manca aria compressa +N15 $15:Sovratemperatura armadio elettrico Cn +N16 $16:Modulo Adam 2 non Ok verificare V7634.L +N17 $17:Refrigratore mandrini +N18 $18:Sovratemperatura armadio elettrico Drive +N19 $19:Verificare collegamento Marcatore +N20 $20:Attesa marcatore libero +N21 $21:Barriere intervenute !!! +N22 $22:Attesa conferma per chiusura Pinza 1 o 4 +N23 $23:Malfunzionamento azion. asse X Slave +N24 $24:Malfunzionamento asse X Testa 1 +N25 $25:Malfunzionamento asse Y +N26 $26:Malfunzionamento asse Z Testa 1 +N27 $27:Malfunzionamento asse A Testa 1 +N28 $28:Malfunzionamento asse B +N29 $29:Malfunzionamento asse V +N30 $30:Malfunzionamento asse Cu Testa 1 +N31 $31:Malfunzionamento asse Cu Testa 2 +N32 $32:Asse A bloccato +N33 $33:Bypass segnali assi digitali attivo +N34 $34:Attesa chiusura Pinza 2 +N35 $35:Attesa apertura Pinza 2 +N36 $36:Attesa chiusura Pinza 3 +N37 $37:Attesa apertura Pinza 3 +N38 $38: +N39 $39:Sensore controllo giri Lama guasto +N40 $40:Fuori giri Lama +N41 $41:Attesa ribaltamento 90 gradi trave (Girare chiave in modo manuale) +N42 $42:Attesa ribaltamento 180 gradi trave (Girare chiave in modo manuale) +N43 $43:Attesa ribaltamento 270 gradi trave (Girare chiave in modo manuale) +N44 $44:Attesa scarico spezzone in entrata (Girare chiave in modo manuale) +N45 $45:Attesa conferma scarico trave +N46 $46:Rotazione T1 proibita senza utensili: verificare +N47 $47:Rotazione T2 proibita senza utensili: verificare +N48 $48: +N49 $49: +N50 $50:Malfunzionamento asse X Testa 2 +N51 $51:Malfunzionamento asse Z Testa 2 +N52 $52:Malfunzionamento asse A Testa 2 +N53 $53:Malfunzionamento asse B2 Movimento Cu +N54 $54:Riferimento di zero entrata non basso +N55 $55:Riferimento di scarico non a riposo +N56 $56: +N57 $57: +N58 $58: +N59 $59:*** MANUTENZIONE CE *** +N60 $60:Attesa scarico utensile manuale +N61 $61:Attesa carico utensile manuale +N62 $62: +N63 $63:Attesa apertura totale pinza 3 +N64 $64:Attesa conferma carico trave +N65 $65:Attesa conferma scarico spezzone corto non tenuto da pinza 1 +N66 $66:Attesa conferma scarico spezzone su rulliera entrata +N67 $67:Attesa stampa etichetta pezzo precedente +N68 $68:Attesa carico trave M75 in corso +N69 $69:Traslatore scarico pieno +N70 $70:Testa nuovo trave non trovata +N71 $71:Corsa arretramento spezzone troppo grande +N72 $72:Ft lettura testa trave occupata +N73 $73:Attesa Start dopo carico trave con muletto +N74 $74:Pezzo scaricato su nastro !!!!! +N75 $75:Scaricare trave con muletto e resettare allarme +N76 $76:Pinza 1 chiusa senza trave aprirla con M111 +N77 $77:Pinza 4 chiusa senza trave aprirla con M171 +N78 $78:Micro controllo chiusura pinza 1 non Ok +N79 $79:Attesa conferma lavoro con pinza 4 dentro macchina VERIFICARE !!! +N80 $80:Pezzo incompleto alcune lavorazioni non eseguite !!! +N81 $81:Micro controllo chiusura pinza 4 non Ok +N82 $82:Attesa Ft pinza 1 lettura coda trave a zero +N83 $83:Cambi utensile non indietro !!! +N84 $84:Testa avanti programmare M90 e poi M199 +N85 $85:Cambio T201-T202 non possibile con pinza 1 impegnata +N86 $86:Attesa protezione cambio utensile aperta +N87 $87:Asse A fuori posizione +N88 $88:Avanti magazzino utensili non Ok +N89 $89:Indietro magazzino utensili non Ok +N90 $90: +N91 $91: +N92 $92: +N93 $93: +N94 $94: +N95 $95:Messa a punto inserita permessi solo movimenti manuali +N96 $96: +N97 $97: +N98 $98:Avanti testa per cambio utensile non Ok +N99 $99:Indietro testa per cambio utensile non Ok +N100 $100: +N101 $101:Motore T1 non in rotazione (Fcinv0=1) +N102 $102:Motore T2 non in rotazione (Fcinv0=1) +N103 $103: +N104 $104: +N105 $105:Larghezza trave EX non Ok !!! +N106 $106:Altezza trave EZ non Ok !!! +N107 $107: +N108 $108:Attendere inserzioni di potenza +N109 $109:Premere reset su CNC +N110 $110: +N111 $111:Malfunzionamento inverter 1 +N112 $112:Malfunzionamento inverter 2 +N113 $113: +N114 $114: +N115 $115: +N116 $116: +N117 $117: +N118 $118:Flussostato Testa 1 non Ok +N119 $119:Flussostato Testa 2 non Ok +N120 $120: +N121 $121:Sovratemperatura resistenze di frenatura inverter 1 +N122 $122:Sovratemperatura resistenze di frenatura inverter 2 +N123 $123: +N124 $124: +N125 $125: +N126 $126: +N127 $127: +N128 $128: +N129 $129: +N130 $130: +N131 $131:Sovratemperatura motore testa 1 +N132 $132:Sovratemperatura motore testa 2 +N133 $133: +N134 $134: +N135 $135: +N136 $136: +N137 $137: +N138 $138: +N139 $139: +N140 $140: +N141 $141:Sovracorrente inverter 1 +N142 $142:Sovracorrente inverter 2 +N143 $143: +N144 $144: +N145 $145: +N146 $146: +N147 $147: +N148 $148:Cambi utensili non avanti +N149 $149:Posizione cambio utensile 1 impegnata per scarico +N150 $150:Posizione cambio utensile 2 impegnata per scarico +N151 $151:Difetto bloccaggio utensile testa 1 +N152 $152:Difetto bloccaggio utensile testa 2 +N153 $153:Utensile presente su testa 1 con E80001=0 +N154 $154:Utensile presente su testa 2 con E80002=0 +N155 $155:Difetto sbloccaggio utensile testa 1 +N156 $156:Difetto sbloccaggio utensile testa 2 +N157 $157:Cono utensile testa 1 sporco +N158 $158:Cono utensile testa 2 sporco +N159 $159:Pistone sbloccaggio cono testa 1 non a riposo +N160 $160:Pistone sbloccaggio cono testa 2 non a riposo +N161 $161:Asse X1 non a zero per cambio utensile +N162 $162:Asse X2 non a zero per cambio utensile +N163 $163: +N164 $164: +N165 $165: +N166 $166: +N167 $167: +N168 $168: +N169 $169: diff --git a/Messages/FromMachine_Ita.txt b/Messages/FromMachine_Ita.txt new file mode 100644 index 0000000..f03798b --- /dev/null +++ b/Messages/FromMachine_Ita.txt @@ -0,0 +1,169 @@ +N1 $01:Macchina spenta +N2 $02:Assi in extracorsa +N3 $03:Cinghia pinze in extracorsa + +N4 $04:Cinghia pinze in extracorsa - +N5 $05: +N6 $06: +N7 $07:Movimento pinze non possibile piano Rexilon montato +N8 $08:Verificare olio lubrificazione aggregati catena +N9 $09:Termici motori +N10 $10:Trasferimento programma in corso +N11 $11: +N12 $12:Minimo livello grasso +N13 $13:Difetto impianto lubrificazione assi verificare livello grasso +N14 $14:Manca aria compressa +N15 $15:Sovratemperatura armadio sinistro +N16 $16:Sovratemperatura armadio destro +N17 $17:Refrigratore mandrini +N18 $18:Malfunzionamento vuoto +N19 $19:Malfunzionamento pressoi +N20 $20:Movimento asse V1 non possibile fare Pom +N21 $21:Movimento asse V2 non possibile fare Pom +N22 $22:Attesa conferma per chiusura Pinza 1 o 4 +N23 $23:Barriere intervenute !!! +N24 $24:Malfunzionamento azion. asse X1-X2 +N25 $25:Malfunzionamento azion. asse Y1-Y2 +N26 $26:Malfunzionamento azion. asse Z1-Z2 +N27 $27:Malfunzionamento azion. asse B1-B2 +N28 $28:Malfunzionamento azion. asse C1-C2 +N29 $29:Malfunzionamento azion. asse V1-V2 +N30 $30:Malfunzionamento azion. asse Cu +N31 $31: +N32 $32: +N33 $33: +N34 $34: +N35 $35: +N36 $36:Attesa conferma rotazione ribaltatore 1200 a zero +N37 $37:Attesa Pinza 5 aperta +N38 $38: +N39 $39: +N40 $40: +N41 $41:Attesa ribaltamento 90 gradi trave (Girare chiave in modo manuale) +N42 $42:Attesa ribaltamento 180 gradi trave (Girare chiave in modo manuale) +N43 $43:Attesa ribaltamento 270 gradi trave (Girare chiave in modo manuale) +N44 $44:Attesa scarico spezzone in entrata (Girare chiave in modo manuale) +N45 $45:Pezzo scaricato non tagliato !!! +N46 $46:Rotazione T1 proibita senza utensili: verificare +N47 $47:Rotazione T2 proibita senza utensili: verificare +N48 $48:Ribaltamento trave non indietro !!! +N49 $49:Ribaltamento trave non basso !!! +N50 $50:Possibile collisione pinza 4 uscita con scarico sfridi +N51 $51:Ft Presset pinza 1 in discesa occupata +N52 $52:Ft Presset pinza 2 in discesa occupata +N53 $53:Ft Presset pinza 3 in discesa occupata +N54 $54:Ft Presset pinza 4 in discesa occupata +N55 $55:Attesa riferimento zero pinza 1 avanti +N56 $56:Attesa riferimento zero pinza 1 indietro +N57 $57:Attesa riferimento zero pinza 4 avanti +N58 $58:Attesa riferimento zero pinza 4 indietro +N59 $59:*** MANUTENZIONE CE *** +N60 $60:Pinza 1 bloccata su cinghia e su pattini !!! +N61 $61:Pinza 2 bloccata su cinghia e su pattini !!! +N62 $62:Pinza 3 bloccata su cinghia e su pattini !!! +N63 $63:Pinza 4 bloccata su cinghia e su pattini !!! +N64 $64:Pezzo scaricato non completo !!! +N65 $65:Attesa conferma scarico spezzone corto non tenuto da pinza 1 +N66 $66:Assi V1 o V2 non a zero per cambio aggregati +N67 $67:Attesa stampa etichetta pezzo precedente +N68 $68:Attesa carico trave M75 in corso +N69 $69:Traslatore scarico pieno +N70 $70:Testa nuovo trave non trovata +N71 $71:Corsa arretramento spezzone troppo grande +N72 $72:Ft lettura testa trave occupata +N73 $73:Attesa Start dopo carico trave con muletto +N74 $74:Pezzo scaricato su nastro !!!!! +N75 $75:Scaricare trave con muletto e resettare allarme +N76 $76:Pinza 1 chiusa senza trave aprirla con M111 +N77 $77:Pinza 4 chiusa senza trave aprirla con M171 +N78 $78:Micro controllo chiusura pinza 1 non Ok +N79 $79:Micro controllo chiusura pinza 2 non Ok +N80 $80:Micro controllo chiusura pinza 3 non Ok +N81 $81:Micro controllo chiusura pinza 4 non Ok +N82 $82:Attesa Ft pinza 1 lettura coda trave a zero +N83 $83:T2 in cambio programmare M92 e poi M197 +N84 $84:Cu Sx non indietro programmare M90 e poi M199 +N85 $85:Cu Catena non indietro programmare M92 e poi M187 +N86 $86:Avanti Cu laterale Dx non Ok +N87 $87:Indietro Cu laterale Dx non Ok +N88 $88:Avanti Cu laterale Sx T1 non Ok +N89 $89:Indietro Cu laterale Sx T1 non Ok +N90 $90:Ripari di protezione destri aperti +N91 $91:Ripari di protezione sinistri aperti +N92 $92:Avanti Cu Catena laterale non Ok +N93 $93:Indietro Cu Catena laterale non Ok +N94 $94:Cu Mortasa non indietro programmare M92 e poi M189 +N95 $95:Messa a punto inserita permessi solo movimenti manuali +N96 $96:Avanti Cu Mortasa laterale non Ok +N97 $97:Indietro Cu Mortasa laterale non Ok +N98 $98:Avanti Cu laterale Dx T2 non Ok +N99 $99:Indietro Cu laterale Dx T2 non Ok +N100 $100: +N101 $101:Motore T1 non in rotazione (Fcinv0=1) +N102 $102:Motore T2 non in rotazione (Fcinv0=2) +N103 $103:Attesa apertura pinza 1 +N104 $104:Attesa chiusura pinza 1 +N105 $105:Attesa apertura pinza 4 +N106 $106:Attesa chiusura pinza 4 +N107 $107:Memoria utensile su Testa 2 E80001 non OK !!! +N108 $108:Attendere inserzioni di potenza +N109 $109:Premere reset su CNC +N110 $110:Memoria utensile su Testa 2 E80002 non OK !!! +N111 $111:Malfunzionamento inverter1 +N112 $112:Malfunzionamento inverter2 +N113 $113:Attesa apertura pinza 2 +N114 $114:Attesa chiusura pinza 2 +N115 $115:Attesa apertura pinza 3 +N116 $116:Attesa chiusura pinza 3 +N117 $117: +N118 $118:Flussostato T1 non Ok +N119 $119:Flussostato T2 non Ok +N120 $120: +N121 $121:Sovratemperatura resistenze di frenatura inverter1 +N122 $122:Sovratemperatura resistenze di frenatura inverter2 +N123 $123: +N124 $124: +N125 $125: +N126 $126: +N127 $127: +N128 $128: +N129 $129: +N130 $130: +N131 $131:Sovratemperatura motore testa1 +N132 $132:Sovratemperatura motore testa2 +N133 $133: +N134 $134: +N135 $135:Larghezza trave EX non Ok !!! +N136 $136:Altezza trave EZ non Ok !!! +N137 $137: +N138 $138: +N139 $139: +N140 $140: +N141 $141:Sovracorrente inverter1 +N142 $142:Sovracorrente inverter2 +N143 $143: +N144 $144: +N145 $145: +N146 $146:Comunicazione seriale asse C1 non Ok +N147 $147:Comunicazione seriale asse C2 non Ok +N148 $148: +N149 $149: +N150 $150: +N151 $151:Difetto bloccaggio utensile 1 +N152 $152:Difetto bloccaggio utensile 2 +N153 $153:Utensile presente su T1 con E80001=0 +N154 $154:Utensile presente su T2 con E80002=0 +N155 $155:Difetto sbloccaggio utensile 1 +N156 $156:Difetto sbloccaggio utensile 2 +N157 $157:Cono utensile sporco utensile 1 +N158 $158:Cono utensile sporco utensile 2 +N159 $159:Pistone sbloccaggio cono non a riposo utensile 1 +N160 $160:Pistone sbloccaggio cono non a riposo utensile 2 +N161 $161:Verificare ingresso E24 +N162 $162:Verificare ingresso E25 +N163 $163:Verificare ingresso E57 +N164 $164:Verificare ingresso E58 +N165 $165:Verificare ingresso E34 +N166 $166:Verificare ingresso E35 +N167 $167:Verificare ingresso E59 +N168 $168:Verificare ingresso E60 +N169 $169: diff --git a/Messages/Ita.txt b/Messages/Ita.txt new file mode 100644 index 0000000..e6efaee --- /dev/null +++ b/Messages/Ita.txt @@ -0,0 +1,212 @@ +// File dei messaggi macchina Italiano 2022/01/17 +[MDI] +1=Prendi utensile n° 1 +2=Prendi utensile n° 2 +3=Prendi utensile n° 3 +4=Prendi utensile n° 4 +5=Prendi utensile n° 5 +6=Prendi utensile n° 6 +7=Prendi utensile n° 7 +8=Prendi utensile n° 8 +9=Prendi utensile n° 9 +10=Prendi utensile n° 10 +11=Prendi utensile n° 11 +12=Prendi utensile n° 12 +13=Prendi utensile n° 13 +14=Prendi utensile n° 14 +15=Prendi utensile n° 15 +16=Prendi utensile n° 16 +17=Prendi utensile n° 17 +18=Prendi utensile n° 18 +19=Scarica utensili +20=Prendi Elettrosega +21=Attiva magazzino utensili +22=Magazzino utensili n°1 avanti +23=Magazzino utensili n°1 indietro +24=Magazzino utensili n°2 avanti +25=Magazzino utensili n°2 indietro +26=Magazzino utensili Elettrosega avanti +27=Magazzino utensili Elettrosega indietro +28=Salita rulli zero frontale +29=Discesa rulli zero frontale +30=Salita rulli zero laterale +31=Discesa rulli zero laterale +32=Abilita rotazione oraria motore foratore destro +33=Abilita rotazione antioraria motore foratore destro +34=Abilita rotazione oraria motore foratore sinistro +35=Abilita rotazione antioraria motore foratore sinistro +36=Stop rotazione mandrini foratori +37=Assegnazione manuale numero utensile nella testa a 5 assi (E80001=1; E80001=2;E80001=3;ETC...) + +[PLC] +1=Macchina spenta +2=Assi in extracorsa +3=Attesa carico trave +4=Attesa chiusura Pinza 1 +5=Attesa apertura Pinza 1 +6=Attesa chiusura Pinza 4 +7=Attesa apertura Pinza 4 +8=Verificare olio lubrificazione aggregati catena +9=Termici motori +10=Trasferimento programma in corso +11=Modulo Adam 1 non Ok verificare V7624.L +12=Minimo livello grasso +13=Difetto impianto lubrificazione assi verificare livello grasso +14=Manca aria compressa +15=Sovratemperatura armadio elettrico Cn +16=Modulo Adam 2 non Ok verificare V7634.L +17=Refrigratore mandrini +18=Sovratemperatura armadio elettrico Drive +19=Verificare collegamento Marcatore +20=Attesa marcatore libero +21=Barriere intervenute !!! +22=Attesa conferma per chiusura Pinza 1 o 4 +23=Malfunzionamento azion. asse X Slave +24=Malfunzionamento asse X Testa 1 +25=Malfunzionamento asse Y +26=Malfunzionamento asse Z Testa 1 +27=Malfunzionamento asse A Testa 1 +28=Malfunzionamento asse B +29=Malfunzionamento asse V +30=Malfunzionamento asse Cu Testa 1 +31=Malfunzionamento asse Cu Testa 2 +32=Asse A bloccato +33=Bypass segnali assi digitali attivo +34=Attesa chiusura Pinza 2 +35=Attesa apertura Pinza 2 +36=Attesa chiusura Pinza 3 +37=Attesa apertura Pinza 3 +38= +39=Sensore controllo giri Lama guasto +40=Fuori giri Lama +41=Attesa ribaltamento 90 gradi trave (Girare chiave in modo manuale) +42=Attesa ribaltamento 180 gradi trave (Girare chiave in modo manuale) +43=Attesa ribaltamento 270 gradi trave (Girare chiave in modo manuale) +44=Attesa scarico spezzone in entrata (Girare chiave in modo manuale) +45=Attesa conferma scarico trave +46=Rotazione T1 proibita senza utensili: verificare +47=Rotazione T2 proibita senza utensili: verificare +48= +49= +50=Malfunzionamento asse X Testa 2 +51=Malfunzionamento asse Z Testa 2 +52=Malfunzionamento asse A Testa 2 +53=Malfunzionamento asse B2 Movimento Cu +54=Riferimento di zero entrata non basso +55=Riferimento di scarico non a riposo +56= +57= +58= +59=*** MANUTENZIONE CE *** +60=Attesa scarico utensile manuale +61=Attesa carico utensile manuale +62= +63=Attesa apertura totale pinza 3 +64=Attesa conferma carico trave +65=Attesa conferma scarico spezzone corto non tenuto da pinza 1 +66=Attesa conferma scarico spezzone su rulliera entrata +67=Attesa stampa etichetta pezzo precedente +68=Attesa carico trave M75 in corso +69=Traslatore scarico pieno +70=Testa nuovo trave non trovata +71=Corsa arretramento spezzone troppo grande +72=Ft lettura testa trave occupata +73=Attesa Start dopo carico trave con muletto +74=Pezzo scaricato su nastro !!!!! +75=Scaricare trave con muletto e resettare allarme +76=Pinza 1 chiusa senza trave aprirla con M111 +77=Pinza 4 chiusa senza trave aprirla con M171 +78=Micro controllo chiusura pinza 1 non Ok +79=Attesa conferma lavoro con pinza 4 dentro macchina VERIFICARE !!! +80=Pezzo incompleto alcune lavorazioni non eseguite !!! +81=Micro controllo chiusura pinza 4 non Ok +82=Attesa Ft pinza 1 lettura coda trave a zero +83=Cambi utensile non indietro !!! +84=Testa avanti programmare M90 e poi M199 +85=Cambio T201-T202 non possibile con pinza 1 impegnata +86=Attesa protezione cambio utensile aperta +87=Asse A fuori posizione +88=Avanti magazzino utensili non Ok +89=Indietro magazzino utensili non Ok +90= +91= +92= +93= +94= +95=Messa a punto inserita permessi solo movimenti manuali +96= +97= +98=Avanti testa per cambio utensile non Ok +99=Indietro testa per cambio utensile non Ok +100= +101=Motore T1 non in rotazione (Fcinv0=1) +102=Motore T2 non in rotazione (Fcinv0=1) +103= +104= +105=Larghezza trave EX non Ok !!! +106=Altezza trave EZ non Ok !!! +107= +108=Attendere inserzioni di potenza +109=Premere reset su CNC +110= +111=Malfunzionamento inverter 1 +112=Malfunzionamento inverter 2 +113= +114= +115= +116= +117= +118=Flussostato Testa 1 non Ok +119=Flussostato Testa 2 non Ok +120= +121=Sovratemperatura resistenze di frenatura inverter 1 +122=Sovratemperatura resistenze di frenatura inverter 2 +123= +124= +125= +126= +127= +128= +129= +130= +131=Sovratemperatura motore testa 1 +132=Sovratemperatura motore testa 2 +133= +134= +135= +136= +137= +138= +139= +140= +141=Sovracorrente inverter 1 +142=Sovracorrente inverter 2 +143= +144= +145= +146= +147= +148=Cambi utensili non avanti +149=Posizione cambio utensile 1 impegnata per scarico +150=Posizione cambio utensile 2 impegnata per scarico +151=Difetto bloccaggio utensile testa 1 +152=Difetto bloccaggio utensile testa 2 +153=Utensile presente su testa 1 con E80001=0 +154=Utensile presente su testa 2 con E80002=0 +155=Difetto sbloccaggio utensile testa 1 +156=Difetto sbloccaggio utensile testa 2 +157=Cono utensile testa 1 sporco +158=Cono utensile testa 2 sporco +159=Pistone sbloccaggio cono testa 1 non a riposo +160=Pistone sbloccaggio cono testa 2 non a riposo +161=Asse X1 non a zero per cambio utensile +162=Asse X2 non a zero per cambio utensile +163= +164= +165= +166= +167= +168= +169= + +[CNC] diff --git a/Scripts/ExitMach.lua b/Scripts/ExitMach.lua new file mode 100644 index 0000000..18f86ad --- /dev/null +++ b/Scripts/ExitMach.lua @@ -0,0 +1,36 @@ +-- 2018/11/21 17:30:00 +-- Machining Exit for Essetre-FAST machine + +-- Intestazioni +require( 'EgtBase') +_ENV = EgtProtectGlobal() +EgtEnableDebug( false) + +-------------------------------------------------------------------------------- +-- *** Uscita da Lavorazioni *** + +-- Nascondo il pezzo così marcato e le geometrie aggiunte, visualizzo il Box +local function ProcessPart( PartId) + -- visualizzo il Box + EgtSetStatus( EgtGetFirstNameInGroup( PartId, 'Box') or GDB_ID.NULL, GDB_ST.ON) +end + +-- Disabilito segnalazione modifica progetto +local bEnMod = EgtGetEnableModified() +EgtDisableModified() + +-- Processo i pezzi nella radice (già chiusi tutti i gruppi di lavoro) +local PartId = EgtGetFirstPart() +while PartId do + ProcessPart( PartId) + PartId = EgtGetNextPart( PartId) +end + +EgtZoom( SCE_ZM.ALL, false) + +-- Ripristino segnalazione modifica progetto +if bEnMod then + EgtEnableModified() +end + +MACH.ERR = 0 diff --git a/Scripts/InitMach.lua b/Scripts/InitMach.lua new file mode 100644 index 0000000..6ac761b --- /dev/null +++ b/Scripts/InitMach.lua @@ -0,0 +1,44 @@ +-- 2018/11/21 16:30:00 +-- Machining Init for Essetre-FAST machine + +-- Intestazioni +require( 'EgtBase') +_ENV = EgtProtectGlobal() +EgtEnableDebug( false) + +-------------------------------------------------------------------------------- +-- *** Ingresso in Lavorazioni *** + +-- Rendo visibile il pezzo e le geometrie aggiunte, nascondo il Box +local function ProcessPart( PartId) + -- nascondo il Box + EgtSetStatus( EgtGetFirstNameInGroup( PartId, 'Box') or GDB_ID.NULL, GDB_ST.OFF) +end + +-- Disabilito segnalazione modifica progetto +local bEnMod = EgtGetEnableModified() +EgtDisableModified() + +-- Processo i pezzi nella radice +local PartId = EgtGetFirstPart() +while PartId do + ProcessPart( PartId) + PartId = EgtGetNextPart( PartId) +end + +-- Processo i pezzi già nei gruppi di lavoro (quando appena lanciata Process) +local GhostId = EgtGetFirstGhostPart() +while GhostId do + local PartId = EgtGetInfo( GhostId, GDB_SI.SOURCE, 'i') + if PartId then + ProcessPart( PartId) + end + GhostId = EgtGetNextGhostPart( GhostId) +end + +-- Ripristino segnalazione modifica progetto +if bEnMod then + EgtEnableModified() +end + +MACH.ERR = 0 diff --git a/Scripts/SetUp.lua b/Scripts/SetUp.lua new file mode 100644 index 0000000..37005d6 --- /dev/null +++ b/Scripts/SetUp.lua @@ -0,0 +1,237 @@ +-- 2023/02/01 +-- Gestione attrezzaggio per Essetre-PF + +-- Intestazioni +require( 'EgtBase') +_ENV = EgtProtectGlobal() +EgtEnableDebug( false) + +-- Tavola di passaggio valori +local STU = {} +STU.TUUID = "" +STU.TCPOS = "" +STU.HEAD = "" +STU.GROUP = "" +STU.POS = "" +STU.EXIT = 0 +STU.INDEX = 0 +STU.HEAD1 = "" +STU.HEAD2 = "" +STU.ISVALID = false +STU.ERR = 0 +_G.STU = STU + +local INVALIDPOS = "" +local POS = "Pos" + +-- Geom Set +local GS = {} + +-- Configurazione posizioni (con o senza TC2) +local PositionTable = {} +local SecondSaw = ( EgtGetHeadId( 'H22') ~= nil) +if SecondSaw then + PositionTable = {{Pos = "Pos1", TcPos = "T1", Head = "H12", Group = "G1"}, + {Pos = "Pos2", TcPos = "T3", Head = "H11", Group = "G1"}, + {Pos = "Pos3", TcPos = "T4", Head = "H11", Group = "G1"}, + {Pos = "Pos4", TcPos = "T5", Head = "H11", Group = "G1"}, + {Pos = "Pos5", TcPos = "T6", Head = "H11", Group = "G1"}, + {Pos = "Pos6", TcPos = "T7", Head = "H11", Group = "G1"}, + {Pos = "Pos7", TcPos = "T8", Head = "H11", Group = "G1"}, + {Pos = "Pos8", TcPos = "T9", Head = "H11", Group = "G1"}, + {Pos = "Pos9", TcPos = "T10", Head = "H11", Group = "G1"}, + {Pos = "Pos10", TcPos = "T11", Head = "H22", Group = "G3"}, + {Pos = "Pos11", TcPos = "T13", Head = "H21", Group = "G3"}, + {Pos = "Pos12", TcPos = "T14", Head = "H21", Group = "G3"}, + {Pos = "Pos13", TcPos = "T15", Head = "H21", Group = "G3"}, + {Pos = "Pos14", TcPos = "T16", Head = "H21", Group = "G3"}, + {Pos = "Pos15", TcPos = "T17", Head = "H21", Group = "G3"}, + {Pos = "Pos16", TcPos = "T18", Head = "H21", Group = "G3"}, + {Pos = "Pos17", TcPos = "T19", Head = "H21", Group = "G3"}, + {Pos = "Pos18", TcPos = "T20", Head = "H21", Group = "G3"}, + {Pos = "Pos19", TcPos = "T101", Head = "H13", Group = "G2"}} + if EgtGetTcPosId( 'T201') then + table.insert( PositionTable, {Pos = "Pos20", TcPos = "T201", Head = "H13", Group = "G2"}) + end +else + PositionTable = {{Pos = "Pos1", TcPos = "T1", Head = "H12", Group = "G1"}, + {Pos = "Pos2", TcPos = "T3", Head = "H11", Group = "G1"}, + {Pos = "Pos3", TcPos = "T4", Head = "H11", Group = "G1"}, + {Pos = "Pos4", TcPos = "T5", Head = "H11", Group = "G1"}, + {Pos = "Pos5", TcPos = "T6", Head = "H11", Group = "G1"}, + {Pos = "Pos6", TcPos = "T7", Head = "H11", Group = "G1"}, + {Pos = "Pos7", TcPos = "T8", Head = "H11", Group = "G1"}, + {Pos = "Pos8", TcPos = "T9", Head = "H11", Group = "G1"}, + {Pos = "Pos9", TcPos = "T10", Head = "H11", Group = "G1"}, + {Pos = "Pos10", TcPos = "T11", Head = "H21", Group = "G3"}, + {Pos = "Pos11", TcPos = "T12", Head = "H21", Group = "G3"}, + {Pos = "Pos12", TcPos = "T13", Head = "H21", Group = "G3"}, + {Pos = "Pos13", TcPos = "T14", Head = "H21", Group = "G3"}, + {Pos = "Pos14", TcPos = "T15", Head = "H21", Group = "G3"}, + {Pos = "Pos15", TcPos = "T16", Head = "H21", Group = "G3"}, + {Pos = "Pos16", TcPos = "T17", Head = "H21", Group = "G3"}, + {Pos = "Pos17", TcPos = "T18", Head = "H21", Group = "G3"}, + {Pos = "Pos18", TcPos = "T19", Head = "H21", Group = "G3"}, + {Pos = "Pos19", TcPos = "T20", Head = "H21", Group = "G3"}, + {Pos = "Pos20", TcPos = "T101", Head = "H13", Group = "G2"}} + if EgtGetTcPosId( 'T201') then + table.insert( PositionTable, {Pos = "Pos21", TcPos = "T201", Head = "H13", Group = "G2"}) + end +end +local UsePositionHead = true + +local function IsInGeomSet( ToolHead, PosHead) + for GsIndex = 1, #GS do + local bToolHead = false + local bPosHead = false + for HIndex = 1, #GS[GsIndex] do + if GS[GsIndex][HIndex] == ToolHead then + bToolHead = true + elseif GS[GsIndex][HIndex] == PosHead then + bPosHead = true + end + if bToolHead and bPosHead then + return true + end + end + if bToolHead and bPosHead then + return true + end + end + return false +end + +function STU.IsCompatibleHeads() + STU.ISVALID = false + if IsInGeomSet(STU.HEAD1, STU.HEAD2) then + STU.ISVALID = true + else + STU.ISVALID = false + end +end + +function STU.GetValidHeadExitForPos() + -- se TUUID non valido restituisco errore + local ToolName = EgtTdbGetToolFromUUID( STU.TUUID) + if ToolName == nill then + STU.ERR = 1 + return + end + EgtTdbSetCurrTool( ToolName) + local CurrToolHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD) + STU.EXIT = EgtTdbGetCurrToolParam( MCH_TP.EXIT) + -- recupero testa predefinita per la posizione corrente + local CurrPosHead + for i = 1, #PositionTable do + if PositionTable[i].TcPos == STU.TCPOS then + CurrPosHead = PositionTable[i].Head + break + end + end + -- verifico se la testa è quella della posizione predefinita + if CurrPosHead == CurrToolHead then + STU.HEAD = CurrToolHead + STU.ERR = 0 + return + -- verifico se la testa è compatibile con quella della posizione predefinita + elseif IsInGeomSet( CurrToolHead, CurrPosHead) then + if UsePositionHead then + STU.HEAD = CurrPosHead + STU.ERR = 0 + return + else + STU.HEAD = CurrToolHead + STU.ERR = 0 + return + end + -- la testa non è compatibile con quella della posizione predefinita + else + STU.HEAD = INVALIDPOS + STU.ERR = 0 + return + end +end + +function STU.IsValidTcPosFromHead() + STU.ISVALID = false + for i = 1, #PositionTable do + if PositionTable[i].TcPos == STU.TCPOS then + if PositionTable[i].Head == STU.HEAD then + STU.ISVALID = true + STU.ERR = 0 + return + elseif IsInGeomSet(PositionTable[i].Head, STU.HEAD) then + STU.ISVALID = true + STU.ERR = 0 + return + end + STU.ISVALID = false + STU.ERR = 0 + return + end + end +end + +function STU.GetTcPosHeadGroupFromPos() + for i = 1, #PositionTable do + if PositionTable[i].Pos == (POS .. tostring(STU.INDEX)) then + STU.TCPOS = PositionTable[i].TcPos + STU.HEAD = PositionTable[i].Head + STU.GROUP = PositionTable[i].Group + STU.ERR = 0 + return + end + end + STU.TCPOS = INVALIDPOS + STU.HEAD = INVALIDPOS + STU.GROUP = INVALIDPOS + STU.ERR = 1 +end + +function STU.GetPosFromTcPos() + for i = 1, #PositionTable do + if PositionTable[i].TcPos == STU.TCPOS then + STU.POS = PositionTable[i].Pos + STU.ERR = 0 + return + end + end + STU.POS = INVALIDPOS + STU.ERR = 1 +end + +function STU.GetGroupFromTcPos() + for i = 1, #PositionTable do + if PositionTable[i].TcPos == STU.TCPOS then + STU.GROUP = PositionTable[i].Group + STU.ERR = 0 + return + end + end + STU.GROUP = INVALIDPOS + STU.ERR = 1 +end + +function STU.GetHeadFromPos() + for i = 1, #PositionTable do + if PositionTable[i].Pos == (POS .. tostring(STU.INDEX)) then + STU.HEAD = PositionTable[i].Head + STU.ERR = 0 + return + end + end + STU.HEAD = INVALIDPOS + STU.ERR = 1 +end + +function STU.GetTcPosFromPos() + for i = 1, #PositionTable do + if PositionTable[i].Pos == (POS .. tostring(STU.INDEX)) then + STU.TCPOS = PositionTable[i].TcPos + STU.ERR = 0 + return + end + end + STU.TCPOS = INVALIDPOS + STU.ERR = 1 +end diff --git a/THolders/ChainSaw.nge b/THolders/ChainSaw.nge new file mode 100644 index 0000000..d29af27 Binary files /dev/null and b/THolders/ChainSaw.nge differ diff --git a/THolders/MillNoTip.nge b/THolders/MillNoTip.nge new file mode 100644 index 0000000..5b2fe8a Binary files /dev/null and b/THolders/MillNoTip.nge differ diff --git a/THolders/Mortise.nge b/THolders/Mortise.nge new file mode 100644 index 0000000..184e003 Binary files /dev/null and b/THolders/Mortise.nge differ diff --git a/THolders/Saw.nge b/THolders/Saw.nge new file mode 100644 index 0000000..5d6b54b Binary files /dev/null and b/THolders/Saw.nge differ diff --git a/THolders/Standard.nge b/THolders/Standard.nge new file mode 100644 index 0000000..23ee6c6 Binary files /dev/null and b/THolders/Standard.nge differ