Files
saomad-kairos-mk1/Saomad-KAIROS-MK1.mlde
T
2026-03-18 15:38:41 +01:00

562 lines
17 KiB
Plaintext

-- 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