-- Descrizione macchina Saomad-KAIROS by EgalWare s.r.l. 2023/12/07 -- 2023/09/22 DS ver 2.5i1 Prima versione -- 2023/10/06 DS ver 2.5j1 Completato modello macchina e simulazione. -- 2023/10/14 DS ver 2.5j2 Generazione di semplici programmi di lavorazione. -- 2023/10/16 DS ver 2.5j3 Commenti prima di movimenti carrelli con sporgenza pinzaggi e relative ripetizioni ora sono esecuzioni. -- 2023/10/18 DS ver 2.5j4 Aggiunta gestione nuovi tipi di scambio. Migliorato controllo pinzaggio per limiti corse X1 e X2. -- 2023/10/24 DS ver 2.5j5 Ulteriori migliorie agli scambi. Gestione ripartenze. -- 2023/11/27 DS ver 2.5k3 Aggiunta gestione ripartenze. -- 2023/11/29 DS ver 2.5k6 Aggiunti diversi scambi carrelli. Corretto SpecAdjustCarrA3 in mlse. -- 2023/12/07 DS ver 2.5l7 Modifiche ed aggiustamenti vari durante le prove. -- 2023/12/13 AV ver.2.5l8 Piccola correzione per errore digitazione variabile in calcolo riposizionamento carrelli (SpecAdjustCarrB3) require( 'EmtGenerator') EgtEnableDebug( false) PP_VER = '2.5l8' MIN_MACH_VER = '2.5j1' EgtOutLog ( '** Saomad-KAIROS '..PP_VER..' (MinMach '.. MIN_MACH_VER ..') **', 1) -- Parametri macchina NumericalControl = 'SIEMENS' ChainSaw = false MinY = -1225 MaxY = 690 ParkY = 400 FmaxY = 45000 MinZ = -512 MaxZ = 630 ParkZ = 620 FmaxZ = 45000 MinA = -109.5 MaxA = 109.5 ParkA = 0 FmaxA = 10440 MinC = -240 MaxC = 240 ParkC = 90 FmaxC = 18000 MillOffs = 217.0 ChSawLen = 90.0 MinX1 = 290.0 MaxX1 = 3760.0 ParkX1 = 480.0 FmaxX1 = 45000 MinX2 = -3760.0 MaxX2 = -290.0 ParkX2 = -480.0 FmaxX2 = 45000 LoadT = 1800.0 UnloadT = -1800 TurnerOffs = 0 MaxHOpen = 460 MaxVOpen = 280 LenToPress = 500 MinRX = -10 MidRX = 130 MaxRX = 430 DeltaTabY = 0 DeltaTabZ = 0 DimTabY = 500 DimTabX = 34000 DistBack = 880 StartRotation = true AutomaticRotation = true AutoRotMinLen = 2600 MaxUnloadLen = 0 DefTcPos = 'T1' CoeffVM = 0.5 -- Aggiornamento con dati da B&W local sData = EgtGetSourceDir().."Beam\\EbwData.lua" if EgtExistsFile( sData) then local Machine = dofile( sData) if Machine then if Machine.Offsets then if Machine.Offsets.TIPO_CN == 0 then NumericalControl = 'SIEMENS' end if Machine.Offsets.MIN_Y then MinY = Machine.Offsets.MIN_Y end if Machine.Offsets.MAX_Y then MaxY = Machine.Offsets.MAX_Y end if Machine.Offsets.MIN_Z then MinZ = Machine.Offsets.MIN_Z end if Machine.Offsets.MAX_Z then MaxZ = Machine.Offsets.MAX_Z end if Machine.Offsets.MIN_A then MinA = Machine.Offsets.MIN_A end if Machine.Offsets.MAX_A then MaxA = Machine.Offsets.MAX_A end if Machine.Offsets.MIN_C then MinC = Machine.Offsets.MIN_C end if Machine.Offsets.MAX_C then MaxC = Machine.Offsets.MAX_C end if Machine.Offsets.MILL_PIVOT then MillOffs = - Machine.Offsets.MILL_PIVOT end if Machine.Offsets.MIN_X1 then MinX1 = Machine.Offsets.MIN_X1 end if Machine.Offsets.MAX_X1 then MaxX1 = Machine.Offsets.MAX_X1 end if Machine.Offsets.MIN_X2 then MinX2 = Machine.Offsets.MIN_X2 end if Machine.Offsets.MAX_X2 then MaxX2 = Machine.Offsets.MAX_X2 end ParkX1 = Machine.Offsets.PARK_X1 or ParkX1 ParkX2 = Machine.Offsets.PARK_X2 or ParkX2 if Machine.Offsets.BEAM_LOAD then LoadT = Machine.Offsets.BEAM_LOAD end if Machine.Offsets.BEAM_UNLOAD then UnloadT = Machine.Offsets.BEAM_UNLOAD end TurnerOffs = Machine.Offsets.TURN_OFFS or TurnerOffs if Machine.Offsets.TAB_OFFSET_Y then DeltaTabY = Machine.Offsets.TAB_OFFSET_Y end if Machine.Offsets.TAB_OFFSET_Z then DeltaTabZ = Machine.Offsets.TAB_OFFSET_Z end if Machine.Offsets.NOULOAD then MaxUnloadLen = Machine.Offsets.NOULOAD end end ParkY = EgtClamp( ParkY, MinY, MaxY) ParkZ = EgtClamp( ParkZ, MinZ, MaxZ) ParkA = EgtClamp( ParkA, MinA, MaxA) ParkC = EgtClamp( ParkC, MinC, MaxC) end end EmtGeneral { File='Saomad-KAIROS-MK1.nge', Offset = Vector3d( 0.0, -35.34, -804.0), AxisMaxAdjust = 30, AxisMaxRotAdj = 0.5, ExitMaxAdjust = 30, ExitMaxRotAdj = 0.5, AngDeltaMinForHome = 165, Special = 'Saomad-KAIROS-MK1.mlse', Processor = 'Saomad-KAIROS-MK1.mlpe'} local BaseId = EmtBase { Name = 'Base', Geo='BASE/GEO', Aux={'BASE/SOLID', 'BASE/LOAD', 'BASE/UNLOAD','BASE/TC', 'BASE/SIGN', 'BASE/COLLISION'}} EmtAxis { Name = 'RX1', Parent = 'Base', Type = MCH_AT.LINEAR, Dir = X_AX(), Pos = Point3d( -1194.4, -513.5, -52.4), Stroke = {MinRX, MaxRX}, Home = MinRX, Geo = 'RX1_AXIS/GEO', Aux = {'RX1_AXIS/SOLID', 'RX1_AXIS/COLLISION'}} EmtAxis { Name = 'RX2', Parent = 'Base', Type = MCH_AT.LINEAR, Dir = -X_AX(), Pos = Point3d( 1194.4, -513.5, -52.4), Stroke = {MinRX, MaxRX}, Home = MinRX, Geo = 'RX2_AXIS/GEO', Aux = {'RX2_AXIS/SOLID', 'RX2_AXIS/COLLISION'}} local YId = EmtAxis { Name = 'Y', Parent = 'Base', Token = 'Y1', Type = MCH_AT.LINEAR, Dir = Y_AX(), Pos = Point3d( -639.5, 372.66, 945.7), Stroke = {MinY, MaxY}, Home = ParkY, Geo = 'Y_AXIS/GEO', Aux = 'Y_AXIS/SOLID'} EmtAxis { Name = 'Z', Parent = 'Y', Token = 'Z1', Type = MCH_AT.LINEAR, Dir = Z_AX(), Pos = Point3d( -19.25, -113.54, 790.0), Stroke = {MinZ, MaxZ}, Home = ParkZ, Geo = 'Z_AXIS/GEO', Aux = {'Z_AXIS/SOLID', 'Z_AXIS/COLLISION'}} local CId = EmtAxis { Name = 'C', Parent = 'Z', Token = 'C1', Type = MCH_AT.ROTARY, Dir = -Z_AX(), Pos = Point3d( 0, 0, 0), Stroke = {MinC, MaxC}, Home = ParkC, Geo = 'C_AXIS/GEO', Aux = {'C_AXIS/SOLID', 'C_AXIS/COLLISION'}} EmtAxis { Name = 'A', Parent = 'C', Token = 'A1', Type = MCH_AT.ROTARY, Dir = X_AX(), Pos = Point3d( 0, 0, MillOffs), Stroke = {MinA, MaxA}, Home = ParkA, Geo = 'A_AXIS/GEO', Aux = {'A_AXIS/SOLID', 'A_AXIS/COLLISION'}} -- Frese local H1Id = EmtHead { Name = 'H1', Parent = 'A', HSet = 'H1', Type = MCH_HT.STD, Pos = Point3d( 0, 0, 0), TDir = Z_AX(), ADir = X_AX(), Rot1W = 2, OthColl = {'A/SOLID', 'C/SOLID'}, Geo = 'H1_HEAD/GEO'} EgtSetInfo( H1Id, 'ZMAXONROT', '1,60') -- Sega a catena if ChainSaw then EmtAxis { Name = 'CS', Parent = 'A', Token = '**', Type = MCH_AT.ROTARY, Dir = Z_AX(), Pos = Point3d( 0, 0, 0), Stroke = { -90, 90}, Home = 0, Geo = 'CS_AXIS/GEO'} local H3Id = EmtHead { Name = 'H3', Parent = 'CS', HSet = 'H1', Type = MCH_HT.STD, Pos = Point3d( 0, 0, -ChSawLen), TDir = X_AX(), ADir = Z_AX(), Rot1W = 0.2, SolCh = MCH_SCC.ADIR_NEAR, OthColl = {'A/SOLID', 'C/SOLID'}, Geo = 'H3_HEAD/GEO'} EgtSetInfo( H3Id, 'ZMAXONROT', '1,5') end -- Morse local X1Id = EmtAxis { Name = 'X1', Token = 'X1', Parent = 'Base', Type = MCH_AT.LINEAR, Dir = -X_AX(), Pos = Point3d( -953.0, 111.75, 1450.0), Stroke = { MinX1, MaxX1}, Home = ParkX1, Geo = 'X1_AXIS/GEO', Aux = {'X1_AXIS/SOLID', 'X1_AXIS/COLLISION'}} local PX1Id = EmtAxis { Name = 'PX1', Parent = 'X1', Type = MCH_AT.LINEAR, Dir = -Y_AX(), Pos = Point3d( -904.0, -276.5, 1449.0), Stroke = { 0, MaxHOpen}, Home = MaxHOpen, Geo = 'PX1_AXIS/GEO', Aux = {'PX1_AXIS/SOLID', 'PX1_AXIS/COLLISION'}} local QX1Id = EmtAxis { Name = 'QX1', Parent = 'X1', Type = MCH_AT.LINEAR, Dir = Z_AX(), Pos = Point3d( -904.0, -276.5, 1449.0), Stroke = { 0, MaxVOpen}, Home = MaxVOpen, Geo = 'QX1_AXIS/GEO', Aux = {'QX1_AXIS/SOLID', 'QX1_AXIS/COLLISION'}} local X2Id = EmtAxis { Name = 'X2', Token = 'X2', Parent = 'Base', Type = MCH_AT.LINEAR, Dir = -X_AX(), Pos = Point3d( 953.0, 111.75, 1450.0), Stroke = { MinX2, MaxX2}, Home = ParkX2, Geo = 'X2_AXIS/GEO', Aux = {'X2_AXIS/SOLID', 'X2_AXIS/COLLISION'}} local PX2Id = EmtAxis { Name = 'PX2', Parent = 'X2', Type = MCH_AT.LINEAR, Dir = -Y_AX(), Pos = Point3d( 904.0, -276.5, 1449.0), Stroke = { 0, MaxHOpen}, Home = MaxHOpen, Geo = 'PX2_AXIS/GEO', Aux = {'PX2_AXIS/SOLID', 'PX2_AXIS/COLLISION'}} local QX2Id = EmtAxis { Name = 'QX2', Parent = 'X2', Type = MCH_AT.LINEAR, Dir = Z_AX(), Pos = Point3d( 904.0, -276.5, 1449.0), Stroke = { 0, MaxVOpen}, Home = MaxVOpen, Geo = 'QX2_AXIS/GEO', Aux = {'QX2_AXIS/SOLID', 'QX2_AXIS/COLLISION'}} EmtAxis { Name = 'T', Parent = 'Base', --Token = '**', Type = MCH_AT.LINEAR, Dir = - X_AX(), Pos = Point3d( 0, 613.16, -830.037), Stroke = { -30000, 30000}, Home = LoadT, Geo = 'T_AXIS/GEO'} EmtTable { Name = 'Tab', Parent = 'T', Type = MCH_TT.FLAT, Ref1 = Point3d( -DimTabX, DeltaTabY - DimTabY, DeltaTabZ), Scale = { DimTabX / 20000, DimTabY / 500, 1}, Geo = 'TABLE/GEO', Aux = 'TABLE/SOLID'} -- ToolChanger local ptTcCen = Point3d( 0, 1633.0, 79.2) EmtTcPos { Name = 'T1', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, -3 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T1'} EmtTcPos { Name = 'T2', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, -2 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T2'} EmtTcPos { Name = 'T3', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, -1 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T3'} EmtTcPos { Name = 'T4', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 0 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T4'} EmtTcPos { Name = 'T5', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 1 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T5'} EmtTcPos { Name = 'T6', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 2 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T6'} EmtTcPos { Name = 'T7', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 3 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T7'} EmtTcPos { Name = 'T8', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 4 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T8'} EmtTcPos { Name = 'T9', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 5 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T9'} EmtTcPos { Name = 'T10', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 6 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T10'} EmtTcPos { Name = 'T11', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 7 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T11'} EmtTcPos { Name = 'T12', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 8 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T12'} EmtTcPos { Name = 'T13', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 9 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T13'} EmtTcPos { Name = 'T14', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 10 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T14'} EmtTcPos { Name = 'T15', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 11 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T15'} if ChainSaw then EmtTcPos { Name = 'T16', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 12 * 22.5) - ChSawLen * Z_AX(), TDir = -Y_AX(), ADir = Z_AX(), Geo = 'BASE/T16CS'} else EmtTcPos { Name = 'T16', Parent = 'Base', Pos = ptTcCen + VectorFromPolar( 400, 12 * 22.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T16'} end EmtTcPos { Name = 'T17', Parent = 'Base', Pos = Point3d( 0.0, 1693.5, 534.5), TDir = Z_AX(), ADir = X_AX(), Geo = 'BASE/T17'} -- Aggiusto posizioni geometriche local vtMove = Vector3d( 0, ( DeltaTabY - 0), ( DeltaTabZ - 0)) local vtMoveY = Vector3d( 0, 0, ( DeltaTabZ - 0)) EgtMove( EgtGetFirstNameInGroup( BaseId, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( BaseId, 'LOAD'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( BaseId, 'UNLOAD'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( BaseId, 'TC'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( BaseId, 'SIGN'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( BaseId, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( X1Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( X1Id, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( PX1Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( PX1Id, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( QX1Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( QX1Id, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( X2Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( X2Id, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( PX2Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( PX2Id, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( QX2Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( QX2Id, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( YId, 'SOLID'), vtMoveY, GDB_RT.GLOB) -- Assegno identificativi alle spie delle morse PX1LightId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( X1Id, 'SOLID') or GDB_ID.NULL, 'Light') PX2LightId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( X2Id, 'SOLID') or GDB_ID.NULL, 'Light') --------------------------------------------------------------------- -- Funzioni richiamate per modificare i dati macchina in casi particolari --function OnSetTable() --end --------------------------------------------------------------------- function OnSetHead() -- Se testa con sega a catena if EMC.HEAD == 'H3' 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, -dDist)) if not EMC.VER or EMC.VER < '2.5h2' then local vtMove = Point3d( 0, 0, -dDist) - Point3d( EMC.EXITPOS) local ExitId = EgtGetFirstNameInGroup( EgtGetHeadId( EMC.HEAD), 'T'..tostring( EMC.EXIT)) EgtMove( ExitId, vtMove) end -- recupero valore asse CS bloccato local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS) local dPosCS = tonumber( sVal:sub( 4) or '') EmtModifyAxisHome( 'C', GetChainSawCHomeFromVirtualAxis( dPosCS)) else EmtModifyAxisHome( 'C', ParkC) end end --------------------------------------------------------------------- -- Funzione che calcola l'angolo Home di C per la sega a catena dal valore dell'asse virtuale function GetChainSawCHomeFromVirtualAxis( dPosCS) -- se CS=0 -> HomeC = -90 if abs( dPosCS) < 0.1 then return 90 -- altrimenti CS=90 -> HomeC = -180 else return 0 end end --------------------------------------------------------------------- -- Funzione per impostare spia stato morsa carrello X1 function SetPX1Light( bClosed) if not PX1LightId then return end EgtSetColor( PX1LightId, EgtIf( bClosed, 'RED', 'LIME')) if bClosed then EgtSetInfo( PX1LightId, 'On', '1') else EgtRemoveInfo( PX1LightId, 'On') end end --------------------------------------------------------------------- -- Funzione per leggere lo stato della morsa carrello X1 function GetPX1Light() if not PX1LightId then return false end return ( EgtGetInfo( PX1LightId, 'On') == '1') end --------------------------------------------------------------------- -- Funzione per impostare spia stato morsa carrello X2 function SetPX2Light( bClosed) if not PX2LightId then return end EgtSetColor( PX2LightId, EgtIf( bClosed, 'RED', 'LIME')) if bClosed then EgtSetInfo( PX2LightId, 'On', '1') else EgtRemoveInfo( PX2LightId, 'On') end end --------------------------------------------------------------------- -- Funzione per leggere lo stato della morsa carrello X2 function GetPX2Light() if not PX2LightId then return false end return ( EgtGetInfo( PX2LightId, 'On') == '1') end --------------------------------------------------------------------- -- Funzione per resettare tutte le attivazioni della macchina function OnResetMachine() EmtUnlinkAllRawPartsFromGroups() EmtUnlinkAllFixturesFromGroups() SetPX1Light( false) SetPX2Light( 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