4 Commits

Author SHA1 Message Date
daniele.nicoli 08acb6f843 Aggiornata versione 2026-04-20 12:19:54 +02:00
daniele.nicoli 8eceb9b865 - Nuovi magazzini. (ToDo: aggregati a T)
- Definizione variabile local in mlpe.
2026-04-20 12:17:54 +02:00
daniele.nicoli 2526f6bb39 Sostituiti 3d MK2 con MK3 2026-03-18 16:36:52 +01:00
andrea.villa eb2500c726 MACCHINA EREDITATA DA KAIROS-MK2 2026-03-18 15:32:13 +01:00
33 changed files with 8119 additions and 93 deletions
+9
View File
@@ -0,0 +1,9 @@
/Tools
/Machinings
/SetUp
/Beam/CutData.lua
/Beam/DrillData.lua
/Beam/MillingData.lua
/Beam/PocketingData.lua
/Beam/SawingData.lua
/Beam/AISetup
+187
View File
@@ -0,0 +1,187 @@
{
"Lua.diagnostics.globals": [
"EmtTcPos",
"EgtGetAllTcPosNames",
"EgtGetFirstNameInGroup",
"EgtSetStatus",
"EgtEmptyGroup",
"EgtGetFirstRawPart",
"EmtLinkRawPartToGroup",
"EgtVerifyRawPartPhase",
"EgtGetNextRawPart",
"EMT",
"EgtOutText",
"EgtGetFirstPartInRawPart",
"EmtSetLastError",
"EgtGetToolsInCurrSetupPos",
"EgtLoadTool",
"EgtSetName",
"EgtGroup",
"EgtSetLevel",
"EgtOutLog",
"EmtUnlinkAllRawPartsFromGroups",
"EgtSetAxisPos",
"EgtGetPhaseCount",
"EgtGetCurrMachGroup",
"EgtErase",
"EgtVolZmapBox",
"EgtSetColor",
"EgtGetFirstInGroup",
"EgtGetNext",
"EgtGetFirstOperation",
"EgtGetOperationType",
"EgtSetOperationStatus",
"EgtGetNextOperation",
"EgtGetDebugLevel",
"EgtGetAxisId",
"EgtGetBaseId",
"EgtMove",
"EgtTdbGetCurrToolParam",
"EmtAddCollisionObjEx",
"EgtGetNextActiveOperation",
"EgtGetFirstActiveOperation",
"EgtSetCurrMachining",
"EgtGetMachiningParam",
"EgtSetMode",
"EgtGetHeadId",
"EgtPause",
"EgtGetAxisPos",
"EgtGetOperationName",
"EgtGetMachiningGeometry",
"EgtVolZmapPartCount",
"EgtVolZmapPartVolume",
"EgtRemoveVolZmapPart",
"EgtDraw",
"EgtNumToString",
"EgtSplitString",
"EmtUnlinkRawPartFromGroup",
"EgtRelocate",
"EgtVolZmapGetEdges",
"EgtGetCurrMachineName",
"EgtGetCurrMachineDir",
"EgtGetStringFromIni",
"EgtGetCurrFilePath",
"EgtGetMachGroupName",
"EgtSaveObjToFile",
"EmtSetOutstrokeInfo",
"EgtTdbSetCurrTool",
"EgtUiUnitsAreMM",
"EgtGetAxisHomePos",
"EgtSetInfo",
"EgtGetTcPosId",
"EgtGetName",
"EgtGetCurrMachining",
"EgtOutBox",
"EgtResetCurrMachining",
"EgtGetPhaseDisposition",
"EgtExistsFile",
"EmtGeneral",
"EmtBase",
"EmtAxis",
"EmtHead",
"EmtTable",
"EmtModifyExitPosition",
"EmtModifyAxisHome",
"EgtRemoveInfo",
"EmtUnlinkAllFixturesFromGroups",
"EMC",
"EgtSetCurrPhase",
"EgtTdbGetToolFromUUID",
"EgtGetPrevActiveOperation",
"EgtExistsInfo",
"EgtGetLastInGroup",
"EmtGetAxesPos",
"EgtRemoveOperationHome",
"EgtGetPartInRawPartCount",
"EgtGetOperationPhase",
"EgtSetOperationMode",
"EgtSetCalcTool",
"EmtModifyAxisStroke",
"EgtGetValInNotes",
"EgtGetInfo",
"EgtIf",
"EgtGetCalcAuxDirFromAngles",
"abs",
"sqrt",
"EgtJoinTables",
"min",
"BBox3d",
"max",
"EgtGetRawPartBBox",
"sin",
"AreSameVectorApprox",
"Point3d",
"Vector3d",
"AddToolToCollisionObj",
"AddToolHolderToCollisionObj",
"SetToolForVmill",
"EmtGetVMillStep",
"EgtGetBBoxGlob",
"Frame3d",
"AddToCollisionCheck",
"DumpCollisionCheck",
"EgtEnableDebug",
"EmtOutput",
"EmtLenToString",
"EmtResetPrev",
"EmtAdjustRotaryAxes",
"EmtUpdatePrev",
"EmtResetPrevLinear",
"EmtGetAxis",
"EmtAdjustCenterAxes",
"EmtGetFeed",
"EmtAdjustLinearAxes",
"SphericalFromVector",
"EmtGetAngO2",
"EgtClamp",
"AreSameOrOppositeVectorApprox",
"EgtGetAxisDir",
"EgtVolZmapGetPartBBoxGlob",
"SimulMoveAxis",
"EgtGetGlobFrame",
"EgtSplitPath",
"EgtPlaneVolZmapInters",
"EgtTableAdd",
"EgtTableFill",
"EgtSurfFlatRegion",
"EgtSurfFrIntersect",
"EgtSurfArea",
"ceil",
"pow",
"EgtGetEnableUI",
"EmtSetSimulPause",
"EgtResetAxisPos",
"EmtTleStart",
"EmtLenToMF",
"EmtSecToHMS",
"EmtTleAddTotal",
"EmtTleAddTool",
"EmtTleEnd",
"EmtTleAddMachining",
"GDB_ID",
"GDB_ST",
"MCH_TP",
"GEO",
"X_AX",
"Y_AX",
"Z_AX",
"MCH_TY",
"MCH_SCC",
"MCH_AT",
"MCH_TT",
"GDB_RT",
"MCH_MP",
"GDB_FR",
"GDB_LV",
"GDB_BB",
"EgtGetColor",
"SimulMoveAxes",
"MCH_SIM_STEP",
"MCH_OY",
"GDB_MD",
"MCH_MY",
"Color3d",
"tan",
"MCH_HT"
]
}
+199
View File
@@ -0,0 +1,199 @@
-- BeamData.lua by Egaltech s.r.l. 2022/03/20
-- Raccolta dati generali per Travi
EgtOutLog( ' KAIROS-BeamData started', 1)
-- Tabella per definizione modulo
local BeamData = {
ROT180 = true, -- flag abilitazione rotazione 90 gradi
MIN_WIDTH = 40, -- larghezza minima del grezzo
MIN_HEIGHT = 40, -- altezza minima del grezzo
MAX_WIDTH = 250, -- larghezza massima del grezzo
MAX_HEIGHT = 620, -- altezza massima del grezzo
LEN_SHORT_PART = 1200, -- lunghezza massima pezzo corto
LEN_VERY_SHORT_PART = 400, -- lunghezza massima pezzo molto corto (molto probabile lo scarico a caduta)
MAX_RAW = 30000, -- 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.4, -- sovramateriale intermedio (spessore lama)
MINRAW_S = 750, -- minimo grezzo in coda scaricabile per sezioni piccole
MINRAW_L = 1070, -- minimo grezzo in coda scaricabile per sezioni grandi
MAX_LEN_SCRAP = 270, -- massima lunghezza scarto di coda
MAX_LEN_SCRAP_START = 270, -- massima lunghezza scarto di testa
MAX_DIM_HTCUT = 130, -- larghezza massima taglio di testa o coda
MAX_DIM_HTCUT_HBEAM = -195, -- larghezza massima taglio di testa o coda con trave alta
MIN_DIM_HBEAM = 621, -- altezza minima di trave alta
MAX_DIM_DICE = 110, -- dimensione trasversale massima cubetto
MAX_LEN_DICE = 400, -- lunghezza massima cubetto
DECR_VERT_CUT = 12.5, -- riduzione profondità per affondamento verticale in taglio orizzontale
COLL_SIC = 5, -- distanza di sicurezza per collisioni
CUT_SIC = 20, -- distanza di sicurezza per tagli
CUT_EXTRA = 5, -- affondamento extra standard per tagli di lama e fresature
CUT_EXTRA_MIN = 1, -- affondamento extra ridotto per tagli di lama e fresature
NZ_MINA = -0.6, -- componente limite in Z normale di una faccia (-36.8deg)
NZ_MINB = -0.4, -- componente limite in Z normale di un insieme di facce (-23deg)
DRILL_TOL = 0.5, -- 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 = 2000.0, -- massima lunghezza di feature di testa o coda
LONGCUT_ENDLEN = 600, -- lunghezza lavoro estremi iniziale e finale (std=600)
LONGCUT_MAXLEN = 1200, -- lunghezza massima sezione di taglio longitudinale (std=1200)
MAX_LEN_RIDGELAP_FROM_BOTTOM = 141, -- massima lunghezza ridgelap lavorabile da sotto
MAX_LEN_RIDGELAP_FROM_BOTTOM_HBEAM = 96, -- massima lunghezza ridgelap lavorabile da sotto con trave alta
DIM_TO_CENTER_STRIP = 50, -- larghezza minima trave per inserimento codolo nel centro del trave; 0 = automatico
DIM_STRIP = -1, -- dimensione codolo sostegno parti lasciate su contorno libero o archi (-1 = da Q...)
DIM_STRIP_SMALL = 1, -- 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 = 311, -- massima lunghezza utensile 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 = 250, -- massima lunghezza utensile per poter eseguire lavorazioni (forature/svuotature) da dietro (faccia 4)
MAX_HEIGHT_ROT_B_ABOVE = 500, -- massima altezza della trave che permette di ruotare l'asse B sopra la stessa senza collisioni
KIOTP = 3, -- coefficiente moltiplicativo per attacco/uscita lama tangente anzichè perpendicolare
MAXDIAM_POCK_CORNER = 30, -- diametro massimo utensile ammesso per tasche con angoli interni
ADVANCE_TAIL_CUT = true, -- per spostare prima del taglio di separazione il taglio di coda su pezzi corti con probabile caduta
ADVANCE_TAIL_OFFS = 5, -- accorciamento taglio di coda avanzato (minimo 1)
STRATEGIES_CONFIG_FILE = 'Std2.json',
FASTCLAMPING = true
}
-- Aggiornamento con dati da B&W
local sData = EgtGetCurrMachineDir().."\\Beam\\EbwData.lua"
if EgtExistsFile( sData) then
local Machine = dofile( sData)
if Machine then
if Machine.Trave then
BeamData.MIN_WIDTH = Machine.Trave.YMIN or BeamData.MIN_WIDTH
BeamData.MIN_HEIGHT = Machine.Trave.ZMIN or BeamData.MIN_HEIGHT
BeamData.MAX_WIDTH = Machine.Trave.YMAX or BeamData.MAX_WIDTH
BeamData.MAX_HEIGHT = Machine.Trave.ZMAX or BeamData.MAX_HEIGHT
end
if Machine.User then
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
BeamData.OFFSET_DRILL_TENON = Machine.User.L040_OFFSET_P1 or BeamData.OFFSET_DRILL_TENON
end
end
end
-------------------------------------------------------------------------------------------------------------
local function GetNzLimDownUp( b3Raw, vtN, vtOrtho, bDiceCut)
return -0.173
end
BeamData.GetNzLimDownUp = GetNzLimDownUp
---------------------------------------------------------------------
local function GetChainSawBlockedAxis( nInd)
if nInd == 1 then
return 'CS=0'
else
return 'CS=-90'
end
end
BeamData.GetChainSawBlockedAxis = GetChainSawBlockedAxis
---------------------------------------------------------------------
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 GetMinNzTopHead( vtNFace, Tool)
if Tool and Tool.sFamily ~= 'SAWBLADE' then
if abs( vtNFace:getY()) < 0.68 then
return sin( -15)
else
return sin( -10)
end
else
if abs( vtNFace:getY()) < 0.68 then
return sin( -11)
else
return sin( -10)
end
end
end
---------------------------------------------------------------------
local function GetMinNzDownUp( b3Raw, vtNFace, vtToolDirection, Tool)
if vtNFace and abs( vtNFace:getY()) < 0.173
and vtToolDirection and vtToolDirection:getY() < 0.173 then
return sin ( -10.9)
else
return -1
end
end
---------------------------------------------------------------------
local function GetSetupInfo( sHead)
local SetupInfo = {}
-- dati comuni
SetupInfo.bIsCSymmetrical = false
SetupInfo.dCAxisEncumbrance = 180
SetupInfo.dCAxisSideEncumbrance = 200
SetupInfo.dPivot = 210
SetupInfo.bToolOnAggregate = false
-- testa 5 assi da sopra
if sHead == 'H1' then
SetupInfo.HeadType = { bTop = true, bBottom = false}
SetupInfo.PreferredSide = {}
SetupInfo.GetMinNz = GetMinNzTopHead
SetupInfo.GetMinNzDownUp = GetMinNzDownUp
end
return SetupInfo
end
BeamData.GetSetupInfo = GetSetupInfo
---------------------------------------------------------------------
local function GetMaxMatReductionBladeCut( sHead, vtDir)
local MaxMatReductionBladeCut = 0
-- la lama è montata solo su H2, non si controllano altre teste
if sHead == 'H2' then
if BeamData.NEWTOPC == nil or BeamData.NEWTOPC then
MaxMatReductionBladeCut = -65
end
if AreSameVectorApprox( vtDir, X_AX()) then
MaxMatReductionBladeCut = MaxMatReductionBladeCut + 175
elseif AreSameVectorApprox( vtDir, -X_AX()) then
MaxMatReductionBladeCut = MaxMatReductionBladeCut + 175
elseif AreSameVectorApprox( vtDir, Y_AX()) then
MaxMatReductionBladeCut = MaxMatReductionBladeCut + 175
elseif AreSameVectorApprox( vtDir, -Y_AX()) then
MaxMatReductionBladeCut = MaxMatReductionBladeCut + 175
elseif AreSameVectorApprox( vtDir, Z_AX()) then
MaxMatReductionBladeCut = 80
elseif AreSameVectorApprox( vtDir, -Z_AX()) then
MaxMatReductionBladeCut = 80
end
MaxMatReductionBladeCut = MaxMatReductionBladeCut + BeamData.COLL_SIC
end
return MaxMatReductionBladeCut + BeamData.COLL_SIC
end
BeamData.GetMaxMatReductionBladeCut = GetMaxMatReductionBladeCut
---------------------------------------------------------------------
return BeamData
+302
View File
@@ -0,0 +1,302 @@
-- BeamData.lua by Egalware s.r.l. 2025/12/03
-- Raccolta dati generali per Travi
EgtOutLog( ' KAIROS-BeamData started', 1)
-- Tabella per definizione modulo
local BeamData = {
RIGHT_LOAD = false, -- flag carico da destra
ROT90 = false, -- flag abilitazione rotazione 90 gradi
ROT180 = true, -- flag abilitazione rotazione 180 gradi
MIN_WIDTH = 40, -- larghezza minima del grezzo
MIN_HEIGHT = 40, -- altezza minima del grezzo
MAX_WIDTH = 250, -- larghezza massima del grezzo
MAX_HEIGHT = 620, -- altezza massima del grezzo
MAX_WIDTH2 = 250, -- seconda larghezza massima del grezzo
MAX_HEIGHT2 = 620, -- altezza massima per seconda larghezza massima del grezzo
LEN_SHORT_PART = 1200, -- RENAME lunghezza massima pezzo corto
LEN_VERY_SHORT_PART = 400, -- RENAME lunghezza massima pezzo molto corto (molto probabile lo scarico a caduta)
MAX_RAW = 30000, -- 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.4, -- sovramateriale intermedio (spessore lama)
MINRAW_S = 750, -- minimo grezzo in coda scaricabile per sezioni piccole
MINRAW_L = 1070, -- minimo grezzo in coda scaricabile per sezioni grandi
SAFE_DIM_DICE = 110, -- dimensione trasversale ridotta cubetto, valida in tutte le posizioni
MAX_LEN_DICE = 400, -- SOLO DICE lunghezza massima cubetto
COLL_SIC = 5, -- distanza di sicurezza per collisioni
CUT_SIC = 20, -- distanza di sicurezza per tagli
CUT_EXTRA = 5, -- affondamento extra standard per tagli di lama e fresature
CUT_EXTRA_MIN = 1, -- affondamento extra ridotto per tagli di lama e fresature
MILL_OVERLAP = 5, -- sovrapposizione tra due mezze fresature
LONGCUT_ENDLEN = 600, -- RENAME??lunghezza lavoro estremi iniziale e finale (std=600)
LONGCUT_MAXLEN = 1200, -- RENAME??lunghezza massima sezione di taglio longitudinale
DIM_STRIP = -1, -- dimensione codolo sostegno parti lasciate su contorno libero o archi (-1 = da Q...)
DIM_STRIP_SMALL = 1, -- 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
VICE_MAXH = 370, -- altezza massima zona pinzaggio orizzontale
USER_HOLE_DIAM = 0, -- diametro foro per L20
FASTCLAMPING = true
}
-- costanti riportate da mlde non necessarie per automatismo (sostituire con GetParameters o simile)
local MldeParameters = {}
MldeParameters.NumericalControl = 'SIEMENS' -- NUM o TPA o NUM_PLUS
MldeParameters.MinY = -823
MldeParameters.MaxY = 520
MldeParameters.MinZ = -298
MldeParameters.MaxZ = 915
MldeParameters.MillOffs = 211.0
MldeParameters.DeltaTabY = 0
MldeParameters.DeltaTabZ = 0
-- Aggiornamento con dati macchina personalizzati
-- TODO sostituire con GetParameters o simile
local sData = EgtGetCurrMachineDir().."\\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.MAX_Y then MldeParameters.MinY = - Machine.Offsets.MAX_Y end
if Machine.Offsets.MIN_Y then MldeParameters.MaxY = - Machine.Offsets.MIN_Y end
if Machine.Offsets.MIN_Z then MldeParameters.MinZ = Machine.Offsets.MIN_Z end
if Machine.Offsets.MAX_Z then MldeParameters.MaxZ = Machine.Offsets.MAX_Z end
if Machine.Offsets.MILL_PIVOT then MldeParameters.MillOffs = - Machine.Offsets.MILL_PIVOT end
if Machine.Offsets.TAB_OFFSET_Y then MldeParameters.DeltaTabY = Machine.Offsets.TAB_OFFSET_Y end
if Machine.Offsets.TAB_OFFSET_Z then MldeParameters.DeltaTabZ = Machine.Offsets.TAB_OFFSET_Z end
end
if Machine.Trave then
BeamData.MIN_WIDTH = Machine.Trave.YMIN or BeamData.MIN_WIDTH
BeamData.MIN_HEIGHT = Machine.Trave.ZMIN or BeamData.MIN_HEIGHT
BeamData.MAX_WIDTH = Machine.Trave.YMAX or BeamData.MAX_WIDTH
BeamData.MAX_HEIGHT = Machine.Trave.ZMAX or BeamData.MAX_HEIGHT
BeamData.MAX_WIDTH2 = Machine.Trave.YMAX or BeamData.MAX_WIDTH2
BeamData.MAX_HEIGHT2 = Machine.Trave.ZMAX or BeamData.MAX_HEIGHT2
end
if Machine.User then
BeamData.USER_HOLE_DIAM = Machine.User.L020_DIAM_HOLE or BeamData.USER_HOLE_DIAM
end
end
end
---------------------------------------------------------------------
local function GetBlockedAxis( sHead, nToolType, sBlockedAxis)
-- lama
if nToolType == MCH_TY.SAW_STD or nToolType == MCH_TY.SAW_FLAT then
return ''
-- sega a catena
elseif nToolType == MCH_TY.MORTISE_STD then
if sHead == 'H3' then
if sBlockedAxis == 'parallel' then
return 'CS=90'
elseif sBlockedAxis == 'perpendicular' then
return 'CS=0'
end
else
return ''
end
-- fresa
elseif nToolType == MCH_TY.MILL_STD or nToolType == MCH_TY.MILL_NOTIP then
return ''
-- punta
elseif nToolType == MCH_TY.DRILL_STD or nToolType == MCH_TY.DRILL_LONG then
return ''
else
return ''
end
end
BeamData.GetBlockedAxis = GetBlockedAxis
---------------------------------------------------------------------
local function GetChainSawInitAngs( vtN, vtO, nInd)
if nInd == 1 then
return ''
else
return EgtIf( vtN:getY() > 0, 'C=180', 'C=-180')
end
end
BeamData.GetChainSawInitAngs = GetChainSawInitAngs
---------------------------------------------------------------------
local function GetSCC( vtToolDirection, vtEdgeDirection, vtNFace)
local nSCC = MCH_SCC.NONE
if abs( vtToolDirection:getX()) > abs( vtToolDirection:getY()) - GEO.EPS_SMALL then
-- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno
if abs( vtEdgeDirection:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtNFace, Z_AX()) then
nSCC = EgtIf( ( vtToolDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
else
nSCC = EgtIf( ( vtToolDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM)
end
else
-- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno
if abs( vtEdgeDirection:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtNFace, Z_AX()) then
nSCC = EgtIf( ( vtToolDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YM, MCH_SCC.ADIR_YP)
else
nSCC = EgtIf( ( vtToolDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
end
end
return nSCC
end
---------------------------------------------------------------------
-- TODO leggere direttamente MinA, MinSawA, ...
local function GetMinNzTopHead( vtNFace, Tool)
if Tool and Tool.sFamily ~= 'SAWBLADE' then
return sin( -15)
else
return sin( -11)
end
end
---------------------------------------------------------------------
-- sAxis può essere AB, C, Z; restituisce direzioni, profondità di estrusione e punti per il controllo precollisione
local function GetPreCollisionData( sAxis, vtC, vtHead)
local PreCollisionData = {}
-- Pivot uguale per tutti; non c'è aggregato quindi non dipende da SCC
-- riferimento vtPivot
-- - vtHead (Z): asse rotazione utensile, guarda il mandrino
-- - vtToolSCC (X): direzione asse C o aggregato
-- - vtEdge (Y): direzione lato, verso in base a X e Z
-- - punto di applicazione: naso mandrino o aggregato
PreCollisionData.vtMovePivot = Vector3d( 0, 0, MldeParameters.MillOffs)
-- carro Z
if sAxis == 'Z' then
PreCollisionData.Directions = { vtDirectionX = Y_AX(), vtDirectionY = Z_AX(), vtDirectionZ = X_AX()}
PreCollisionData.dExtrusionDepth = 300
PreCollisionData.Points = {
Point3d( -150.001, 2209.004, 0),
Point3d( 150.001, 2209.004, 0),
Point3d( 150.001, 2204.955, 0),
Point3d( 194.679, 2204.955, 0),
Point3d( 195.004, 362.996, 0),
Point3d( 149.998, 362.996, 0),
Point3d( 149.998, 324.754, 0),
Point3d( 104.999, 324.754, 0),
Point3d( 104.999, 313.754, 0),
Point3d( -104.999, 313.754, 0),
Point3d( -104.999, 324.754, 0),
Point3d( -149.998, 324.754, 0),
Point3d( -149.998, 362.996, 0),
Point3d( -195.001, 362.996, 0),
Point3d( -194.679, 2204.955, 0),
Point3d( -150.001, 2204.995, 0),
Point3d( -150.001, 2209.004, 0)
}
-- motore (asse A o B)
elseif sAxis == 'AB' then
PreCollisionData.Directions = { vtDirectionX = vtHead ^ vtC, vtDirectionY = vtHead, vtDirectionZ = vtC}
PreCollisionData.dExtrusionDepth = 167
PreCollisionData.Points = {
Point3d( 35.5, -211.06, 0),
Point3d( -35.5, -211.06, 0),
Point3d( -35.5, -198.06, 0),
Point3d( -59.912, -198.06, 0),
Point3d( -60.012, -135.897, 0),
Point3d( -73.033, -135.897, 0),
Point3d( -73.033, -129, 0),
Point3d( -76.679, -129, 0),
Point3d( -94, -99, 0),
Point3d( -94, 36, 0),
Point3d( -79.854, 60.5, 0),
Point3d( -75.544, 60.5, 0),
Point3d( -75.544, 201.158, 0),
Point3d( -46.616, 209.792, 0),
Point3d( -6, 215.5, 0),
Point3d( 6, 215.5, 0),
Point3d( 46.616, 209.792, 0),
Point3d( 75.001, 201.158, 0),
Point3d( 75.001, 60.5, 0),
Point3d( 79.855, 60.5, 0),
Point3d( 94, 36, 0),
Point3d( 94, -99, 0),
Point3d( 76.68, -129, 0),
Point3d( 75.967, -129, 0),
Point3d( 75.967, -136.224, 0),
Point3d( 59.938, -136.224, 0),
Point3d( 59.938, -198.06, 0),
Point3d( 35.5, -198.06, 0),
Point3d( 35.5, -211.06, 0)
}
-- asse C
elseif sAxis == 'C' then
PreCollisionData.Directions = { vtDirectionX = vtC, vtDirectionY = Z_AX(), vtDirectionZ = vtC ^ Z_AX()}
PreCollisionData.dExtrusionDepth = 260
PreCollisionData.Points = {
Point3d( 91.5, 163.55, 0),
Point3d( 92.75, -103.001, 0),
Point3d( 304.669, -103.001, 0),
Point3d( 311.446, -79.727, 0),
Point3d( 318.015, -45.806, 0),
Point3d( 320.875, -2.072, 0),
Point3d( 320.875, 290, 0),
Point3d( 310, 314.5, 0),
Point3d( -110, 314.5, 0),
Point3d( -110, 235, 0),
Point3d( -49.992, 211.022, 0),
Point3d( 19.775, 199.927, 0),
Point3d( 65, 199.927, 0),
Point3d( 77, 190, 0),
Point3d( 77, 163.852, 0),
Point3d( 78, 163.55, 0),
Point3d( 91.5, 163.55, 0)
}
end
return PreCollisionData
end
---------------------------------------------------------------------
local function GetSetupInfo( sHead)
local SetupInfo = {}
-- dati comuni
SetupInfo.bIsCSymmetrical = false
SetupInfo.dCAxisEncumbrance = 180
SetupInfo.dCAxisSideEncumbrance = 200
SetupInfo.bToolOnAggregate = false
SetupInfo.vtRotationAxisC = EgtGetAxisDir( 'C')
SetupInfo.vtRotationAxisAB = EgtGetAxisDir( 'A')
-- TODO da rimuovere quando si fara PreSimulation di asse Z per frese
SetupInfo.dPivot = MldeParameters.MillOffs
-- testa 5 assi da sopra
if sHead == 'H1' then
SetupInfo.HeadType = { bTop = true, bBottom = false}
SetupInfo.PreferredSide = {}
SetupInfo.GetMinNz = GetMinNzTopHead
SetupInfo.GetPreCollisionData = GetPreCollisionData
SetupInfo.GetSCC = GetSCC
-- sega a catena
elseif sHead == 'H3' then
SetupInfo.HeadType = { bTop = true, bBottom = false}
SetupInfo.PreferredSide = {}
-- rinvio angolare 90° (considerato come fosse una testa da sotto)
elseif sHead == 'H5' then
SetupInfo.bToolOnAggregate = true
SetupInfo.HeadType = { bTop = false, bBottom = true}
SetupInfo.PreferredSide = {}
SetupInfo.GetMaxNz = function() return 0 end
end
return SetupInfo
end
BeamData.GetSetupInfo = GetSetupInfo
---------------------------------------------------------------------
return BeamData
+9
View File
@@ -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%
+45
View File
@@ -0,0 +1,45 @@
-- C:\EgtData\Machines\Saomad-KAIROS\Beam\EbwData.lua
local Offsets = {
MIN_Y=-1150,
MAX_Y=570,
MIN_Z=-298,
MAX_Z=910,
MIN_A=-120,
MAX_A=120,
MIN_C=-240,
MAX_C=240,
MIN_X1=62,
MAX_X1=3650,
PARK_X1=570,
MIN_X2=-3650,
MAX_X2=-62,
PARK_X2=-500,
BEAM_LOAD=1800.0,
BEAM_UNLOAD=-2060,
TURN_OFFS=0,
MILL_PIVOT=-247.6174,
TAB_OFFSET_Y=0,
TAB_OFFSET_Z=0,
TIPO_CN=0,
RIBCAR=0,
NOULOAD=0
}
local Trave = {
YMIN=30,
YMAX=291,
ZMIN=30,
ZMAX=621
}
local User = {
OPTIMIZATIONS_ENABLE_SLICES_F5=1,
OPTIMIZATIONS_ENABLE_SLICES_F6=1,
OPTIMIZATIONS_LENGTH_SLICES=100,
L020_DIAM_HOLE=14,
L040_OFFSET_P1=0
}
local Machine = { Offsets=Offsets, Trave=Trave, User=User}
return Machine
+52
View File
@@ -0,0 +1,52 @@
; PIndex = Type, PName, Default, Description
; Type : d=double, l=length, s=string
[1]
Name=Offsets
1=l,YCARICO,-1460.0,YCARICO
2=l,YSCARICO,1700.0,YSCARICO
3=l,OFFSETRIB,150.0,OFFSETRIB
4=l,PARKYY,480,PARKYY
5=l,PARKVV,-480,PARKVV
6=l,PIVOTFRESA,-177.0,PIVOTFRESA
7=l,PIVOTLAMA,242.0,PIVOTLAMA
8=l,OFFSETX,-900.0,OFFSETX
9=l,OFFSETZ,-1015.0,OFFSETZ
10=l,MIN_X,-1350,MIN_X
11=l,MAX_X,0,MAX_X
12=l,MIN_Y,110,MIN_Y
13=l,MAX_Y,3735,MAX_Y
14=l,MIN_Z,-1350,MIN_Z
15=l,MAX_Z,0,MAX_Z
16=d,MIN_B,-180,MIN_B
17=d,MAX_B,360,MAX_B
18=d,MIN_C,-360,MIN_C
19=d,MAX_C,360,MAX_C
20=l,MIN_V,-3735,MIN_V
21=l,MAX_V,-110,MAX_V
22=d,TIPO_CN,2,TIPO_CN
23=d,OFFSETCLAMA,0,OFFSETCLAMA
24=d,OFFSETBLAMA,0,OFFSETBLAMA
25=d,RIBCAR,0,RIBCAR
26=d,SECSUP,1,SECSUP
27=d,BLOCKHAUS,0,Blockhaus Configuration
28=l,NOULOAD,0,Max Unload Length (0=no limits)
29=l,OFFSETX_RINV_1,150,OFFSETX_RINV_1
30=l,OFFSETZ_RINV_1,347,OFFSETZ_RINV_1
31=l,OFFSETX_RINV_2,150,OFFSETX_RINV_2
32=l,OFFSETZ_RINV_2,347,OFFSETZ_RINV_2
[2]
Name=Trave
1=l,XMIN,29,XMIN
2=l,XMAX,305,XMAX
3=l,ZMIN,20,ZMIN
4=l,ZMAX,625,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
+43
View File
@@ -0,0 +1,43 @@
[Cut]
1=HeadSide
2=TailSide
[Drill]
1=Drill
2=Drill_AT
3=Pocket
4=AngleDrill
[Milling]
1=Prof
2=FreeContour
3=Tenon
4=DtTenon
5=DtMortise
6=DtMortise_AT
7=BirdsMouth
8=Chamfer
9=Mark
10=Text
11=Text_AT
12=Decor01
13=Long2Cut
14=Long2CutDown
15=LongSmallCut
16=BHSideMill
17=CleanCorner
18=ProfTCone
19=Long2CutSide
20=SmallToolContour
21=AntiSplintMillCut
[Pocketing]
1=Pocket
2=Pocket_AT
3=OpenPocket
4=Mortise
5=Mortise_AT
[Sawing]
1=Sawing
2=Mortising
+3
View File
@@ -0,0 +1,3 @@
[BEAM]
StartOffset=15
Offset=20
+36
View File
@@ -0,0 +1,36 @@
REM Compilazione degli script macchina Egaltech 2024.02.22
REM Per togliere info di debug aggiungere flag -s prima del nome del file di input
REM Compilazione 32 bit e copia file da non compilare
@echo off
REM chiedo all'utente la versione da assegnare alla macchina da compilare
set /p "machineVersion=Inserisci versione: "
REM variabili per costruire i percorsi delle cartelle
set "machineName=Saomad-KAIROS-MK3"
set "deployFolder=C:\MachinesDeploy"
set "machinePath=%deployFolder%\%machineName%\"
set "fullPathSource=%deployFolder%\%machineName%\%machineVersion%\%machineName%"
set "fullPathZip=%deployFolder%\%machineName%\%machineVersion%"
REM elimino eventuale cartella esistente
rmdir /s /Q %fullPathZip%
REM copio i sorgenti nel percorso di destinazione
ROBOCOPY . %fullPathSource%\ /E /XF "Compile.bat" /XF ".gitignore" /XD ".git" /XF "UpdateLog.txt"
REM copio i sorgenti nel percorso temporaneo per i compilati
ROBOCOPY . %fullPathSource%\bin\%machineName%\ /E /XF "Compile.bat" /XF ".gitignore" /XD ".git" /XF "UpdateLog.txt"
REM copio i file compilati nel percorso temporaneo per i compilati
\EgtProg\Dll32\luac54 -o %fullPathSource%\bin\%machineName%\Saomad-KAIROS-MK3.mlpe -s Saomad-KAIROS-MK3.mlpe
\EgtProg\Dll32\luac54 -o %fullPathSource%\bin\%machineName%\Saomad-KAIROS-MK3.mlse -s Saomad-KAIROS-MK3.mlse
\EgtProg\Dll32\luac54 -o %fullPathSource%\bin\%machineName%\Saomad-KAIROS-MK3.SIEMENS.mlpe -s Saomad-KAIROS-MK3.SIEMENS.mlpe
REM comprimo i file compilati in uno zip pronto per essere distribuito
tar.exe acvf %fullPathZip%\%machineName%.zip -C %fullPathSource%\bin\ %machineName%\*.*
REM elimino il percorso temporaneo
rmdir /s /Q %fullPathSource%\bin\
+58
View File
@@ -0,0 +1,58 @@
; Commento per evitare BOM con UTF-8
;Index = Type, Description, Default Value
; Type : b=boolean, d=double, l=lenght, s=string
[Drilling]
[Sawing]
[Milling]
0=l,MaxElev,0
1=d,OutRaw,0
2=l,SideElev,0
3=d,TrimExt,0
4=s,VtFaceUse,0,0,0
5=s,EdgesFaceUse,0
[Pocketing]
0=l,MaxElev,0
1=l,Open,0
2=l,OpenMinSafe,0
3=d,OpenOutRaw,0
4=l,MaxOptSize,0
[Mortising]
0=l,MaxElev,0
[Chiseling]
[SawRoughing]
[SawFinishing]
[GenMachining]
[SurfRoughing]
0=l,MaxElev,1000
1=b,PlaneZ,0
[SurfFinishing]
0=b,SkipMaxDown,1
[5AxMilling]
0=l,LinTol,0.01
1=l,MaxLen,10
2=s,Type,ZigZag
3=d,SideAng,90
4=l,Step,10
5=d,AngIni,-90
6=d,AngFin,90
7=l,LiTang,0
8=l,LiOrth,0
9=l,LiElev,0
10=l,LoTang,0
11=l,LoOrth,0
12=l,LoElev,0
13=b,DirFromGuide,0
14=b,SurfAvoid,0
+4
View File
@@ -0,0 +1,4 @@
// English machine message file 2023/12/06
[PLC]
+11
View File
@@ -0,0 +1,11 @@
// File dei messaggi macchina Italiano 2023/12/06
[MDI]
[PLC]
[CNC]
[INPUT]
+262
View File
@@ -0,0 +1,262 @@
<!DOCTYPE TS>
<TS>
<context>
<name>slaeconv</name>
<message>
<source>700000/PLC/PMC</source>
<translation>MACCHINA IN EMERGENZA</translation>
</message>
<message>
<source>700001/PLC/PMC</source>
<translation>FUNGO SU QUADRO PREMUTO</translation>
</message>
<message>
<source>700002/PLC/PMC</source>
<translation>FUNGO SU CONSOLLE PREMUTO</translation>
</message>
<message>
<source>700003/PLC/PMC</source>
<translation>PORTE APERTE</translation>
</message>
<message>
<source>700004/PLC/PMC</source>
<translation>ANOMALIA PRESENZA ARIA</translation>
</message>
<message>
<source>700005/PLC/PMC</source>
<translation>CAMBIO UTENSILE INTERROTTO! PREMERE RESET PER 5 SECONDI</translation>
</message>
<message>
<source>700006/PLC/PMC</source>
<translation>ANOMALIA SBLOCCO UTENSILE</translation>
</message>
<message>
<source>700007/PLC/PMC</source>
<translation>ANOMALIA BLOCCO UTENSILE</translation>
</message>
<message>
<source>700008/PLC/PMC</source>
<translation>ANOMALIA APERTURA PRESSORE ORIZZONTALE X2</translation>
</message>
<message>
<source>700009/PLC/PMC</source>
<translation>ANOMALIA CHIUSURA PRESSORE ORIZZONTALE X2</translation>
</message>
<message>
<source>700010/PLC/PMC</source>
<translation>ANOMALIA AVANTI PISTONE SCARICO </translation>
</message>
<message>
<source>700011/PLC/PMC</source>
<translation>ANOMALIA INDIETRO PISTONE SCARICO </translation>
</message>
<message>
<source>700012/PLC/PMC</source>
<translation>ANOMALIA SALITA SOLLEVATORE X1</translation>
</message>
<message>
<source>700013/PLC/PMC</source>
<translation>ANOMALIA DISCESA SOLLEVATORE X1</translation>
</message>
<message>
<source>700014/PLC/PMC</source>
<translation>ANOMALIA SALITA SOLLEVATORE X2</translation>
</message>
<message>
<source>700015/PLC/PMC</source>
<translation>ANOMALIA DISCESA SOLLEVATORE X2</translation>
</message>
<message>
<source>700016/PLC/PMC</source>
<translation>ANOMALIA SEGA AVANTI</translation>
</message>
<message>
<source>700017/PLC/PMC</source>
<translation>ANOMALIA SEGA INDIETRO</translation>
</message>
<message>
<source>700018/PLC/PMC</source>
<translation>ANOMALIA SALITA BATTUTA INTERMEDIA INGRESSO</translation>
</message>
<message>
<source>700019/PLC/PMC</source>
<translation>ANOMALIA DISCESA BATTUTA INTERMEDIA INGRESSO</translation>
</message>
<message>
<source>700020/PLC/PMC</source>
<translation>ANOMALIA CATENE INGRESSO SU</translation>
</message>
<message>
<source>700021/PLC/PMC</source>
<translation>ANOMALIA CATENE INGRESSO GIU</translation>
</message>
<message>
<source>700022/PLC/PMC</source>
<translation>ANOMALIA PIATTO AVANTI X1</translation>
</message>
<message>
<source>700023/PLC/PMC</source>
<translation>ANOMALIA PIATTO INDIETRO X1</translation>
</message>
<message>
<source>700024/PLC/PMC</source>
<translation>ANOMALIA PIATTO AVANTI X2</translation>
</message>
<message>
<source>700025/PLC/PMC</source>
<translation>ANOMALIA PIATTO INDIETRO X2</translation>
</message>
<message>
<source>700026/PLC/PMC</source>
<translation>ANOMALIA SALITA PRESSORE VERTICALE X1</translation>
</message>
<message>
<source>700027/PLC/PMC</source>
<translation>ANOMALIA DISCESA PRESSORE VERTICALE X1</translation>
</message>
<message>
<source>700028/PLC/PMC</source>
<translation>ANOMALIA SALITA PRESSORE VERTICALE X2</translation>
</message>
<message>
<source>700029/PLC/PMC</source>
<translation>ANOMALIA DISCESA PRESSORE VERTICALE X2</translation>
</message>
<message>
<source>700030/PLC/PMC</source>
<translation>ANOMALIA APERTURA PRESSORE ORIZZONTALE X1</translation>
</message>
<message>
<source>700031/PLC/PMC</source>
<translation>ANOMALIA CHIUSURA PRESSORE ORIZZONTALE X1</translation>
</message>
<message>
<source>700032/PLC/PMC</source>
<translation>ANOMALIA CONDIZIONATORE QUADRO ELETTRICO</translation>
</message>
<message>
<source>700033/PLC/PMC</source>
<translation>SBLOCCO UT NON POSSIBILE CON MANDRINO NON FERMO</translation>
</message>
<message>
<source>700034/PLC/PMC</source>
<translation>ANOMALIA SBLOCCO UTENSILE 2</translation>
</message>
<message>
<source>700035/PLC/PMC</source>
<translation>INTERVENTO TERMICO POMPA DI LUBRIFICAZIONE</translation>
</message>
<message>
<source>700036/PLC/PMC</source>
<translation>LIVELLO MINIMO OLIO LUBRIFICAZIONE</translation>
</message>
<message>
<source>700037/PLC/PMC</source>
<translation>ANOMALIA APERTURA PROTEZIONE CONI SINISTRA</translation>
</message>
<message>
<source>700038/PLC/PMC</source>
<translation>ANOMALIA CHIUSURA PROTEZIONE CONI SINISTRA</translation>
</message>
<message>
<source>700039/PLC/PMC</source>
<translation>ANOMALIA APERTURA PROTEZIONE CONI DESTRA</translation>
</message>
<message>
<source>700040/PLC/PMC</source>
<translation>ANOMALIA CHIUSURA PROTEZIONE CONI DESTRA</translation>
</message>
<message>
<source>700041/PLC/PMC</source>
<translation>ANOMALIA AVANTI RULLIERA MODILE X1</translation>
</message>
<message>
<source>700042/PLC/PMC</source>
<translation>ANOMALIA INDIETRO RULLIERA MOBILE X1</translation>
</message>
<message>
<source>700043/PLC/PMC</source>
<translation>ANOMALIA AVANTI RULLIERA 100 MODILE X1</translation>
</message>
<message>
<source>700044/PLC/PMC</source>
<translation>ANOMALIA INDIETRO RULLIERA 100 MOBILE X1</translation>
</message>
<message>
<source>700045/PLC/PMC</source>
<translation>ANOMALIA AVANTI RULLIERA MODILE X2</translation>
</message>
<message>
<source>700046/PLC/PMC</source>
<translation>ANOMALIA INDIETRO RULLIERA MOBILE X2</translation>
</message>
<message>
<source>700047/PLC/PMC</source>
<translation>ANOMALIA AVANTI RULLIERA 100 MODILE X2</translation>
</message>
<message>
<source>700048/PLC/PMC</source>
<translation>ANOMALIA INDIETRO RULLIERA 100 MOBILE X2</translation>
</message>
<message>
<source>700049/PLC/PMC</source>
<translation>SCARICO PIENO</translation>
</message>
<message>
<source>700050/PLC/PMC</source>
<translation>PASSO LEGNO IMPEGNATO</translation>
</message>
<message>
<source>700051/PLC/PMC</source>
<translation>ASSE Z NON IN POSIZIONE PER START CICLO</translation>
</message>
<message>
<source>700052/PLC/PMC</source>
<translation>ASSE Y NON IM POSIZIONE PER START CICLO</translation>
</message>
<message>
<source>700053/PLC/PMC</source>
<translation>INCONGRUENZA DATI UTENSILE IN MANDRINO</translation>
</message>
<message>
<source>700054/PLC/PMC</source>
<translation>STOP WORKING ATTIVO</translation>
</message>
<message>
<source>700055/PLC/PMC</source>
<translation>AUTO OFF ATTIVO</translation>
</message>
<message>
<source>700056/PLC/PMC</source>
<translation>LUNGHEZZA PEZZO ERRATA</translation>
</message>
<message>
<source>700057/PLC/PMC</source>
<translation>LARGHEZZA PEZZO ERRATA</translation>
</message>
<message>
<source>700058/PLC/PMC</source>
<translation>SPESSORE PEZZO ERRATO</translation>
</message>
<message>
<source>700059/PLC/PMC</source>
<translation>FEED HOLD - SPINDLE HOLD</translation>
</message>
<message>
<source>700060/PLC/PMC</source>
<translation>PRERISCALDO MANDRINO</translation>
</message>
<message>
<source>700061/PLC/PMC</source>
<translation>PRERISCALDO MANDRINO IN CORSO</translation>
</message>
<message>
<source>700062/PLC/PMC</source>
<translation>SELETTORE BYPASS PULSANTIERA WIRELESS ATTIVO</translation>
</message>
<message>
<source>700063/PLC/PMC</source>
<translation>VALVOLA PROPORZIONALE SMC PROFIBUS CHIUSURA PINZE FAULT</translation>
</message>
</context>
</TS>
-93
View File
@@ -1,93 +0,0 @@
# Saomad-KAIROS-MK3
## Getting started
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
* [Create](https://docs.gitlab.com/user/project/repository/web_editor/#create-a-file) or [upload](https://docs.gitlab.com/user/project/repository/web_editor/#upload-a-file) files
* [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command:
```
cd existing_repo
git remote add origin https://gitlab.steamware.net/egalware-machines/saomad/saomad-kairos-mk3.git
git branch -M main
git push -uf origin main
```
## Integrate with your tools
* [Set up project integrations](https://gitlab.steamware.net/egalware-machines/saomad/saomad-kairos-mk3/-/settings/integrations)
## Collaborate with your team
* [Invite team members and collaborators](https://docs.gitlab.com/user/project/members/)
* [Create a new merge request](https://docs.gitlab.com/user/project/merge_requests/creating_merge_requests/)
* [Automatically close issues from merge requests](https://docs.gitlab.com/user/project/issues/managing_issues/#closing-issues-automatically)
* [Enable merge request approvals](https://docs.gitlab.com/user/project/merge_requests/approvals/)
* [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/)
## Test and Deploy
Use the built-in continuous integration in GitLab.
* [Get started with GitLab CI/CD](https://docs.gitlab.com/ci/quick_start/)
* [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/user/application_security/sast/)
* [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/topics/autodevops/requirements/)
* [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/user/clusters/agent/)
* [Set up protected environments](https://docs.gitlab.com/ci/environments/protected_environments/)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
File diff suppressed because it is too large Load Diff
+117
View File
@@ -0,0 +1,117 @@
; Commento per evitare BOM con UTF-8
[General]
Material=Beam
NCType=5 ; 1=Tpa, 2=Num Flexium, 3=Num Axium APServer, 4=Num Axium PCToolkit, 5=Siemens_Sharp7
Flow=2
IsoFileDir=\\192.168.214.253\iso
Ip=192.168.214.1
Rack=0
Slot=1
Debug=2
[MainVariables]
; 1 = Name, Variable Path, ReadType, Type
; ReadType => o=one time;c=continuous
; Type => plc;cn
1=Data_ToRead,302:0.0:1,c,plc
2=Reset_State,302:0.1:1,c,plc
3=Running,302:2.0:2,c,plc
;1=Data_ToRead,302:0.0:3,c,plc
;2=Reset_State,302:1.0:2,c,plc
;3=Running,302:2.0:2,c,plc
4=P_Prod,302:4.0:2,c,plc
5=P_Machgroup,302:6.0:2,c,plc
6=P_Part,302:8.0:2,c,plc
7=P_State,302:10.0:2,c,plc
8=Laser_X,302:12.0:2,c,plc
9=Laser_Y,302:14.0:2,c,plc
10=Laser_Z,302:16.0:2,c,plc
11=Alarms1,302:18.0:2,c,plc
12=Alarms2,302:20.0:2,c,plc
13=Alarms3,302:22.0:2,c,plc
14=Alarms4,302:24.0:2,c,plc
15=Alarms5,302:26.0:2,c,plc
16=Alarms6,302:28.0:2,c,plc
17=Data_Readed,301:0.0:1,c,plc
18=Reset_Readed,301:0.1:1,c,plc
19=ISO_Num,301:2.0:2,c,plc
20=Reset_Step,301:1.4:1,c,plc
21=Reset_Step_Ok,302:0.2:1,c,plc
22=NC_Status,302:30.0:2,c,plc
23=NC_Mode,302:32.0:2,c,plc
24=Open_Clamp,302:0.4:1,c,plc
25=PLC_Messages1,302:18.0:2,c,plc
26=PLC_Messages2,302:20.0:2,c,plc
27=PLC_Messages3,302:22.0:2,c,plc
28=PLC_Messages4,302:24.0:2,c,plc
29=PLC_Messages5,302:26.0:2,c,plc
30=PLC_Messages6,302:28.0:2,c,plc
31=W_Carico,301:8.0:2,c,plc
[Languages]
Enable=0
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=0
[ToolHolder]
H1.1=Standard.nge
H1.1:MILL_NOTIP=MillNoTip.nge
H1.1:SAW_FLAT=TcSaw.nge
H3.1=ChainSaw.nge
[Machinings]
Drilling=1
Sawing=1
Milling=1
Pocketing=1
Mortising=1
Chiseling=0
GenMachining=0
SurfRoughing=1
SurfFinishing=1
5AxMilling=1
[5AxMilling]
5AxScript1=5AxProject
5AxScript2=5AxPocketProject
[Machining]
InitScript=InitMach.lua
ExitScript=ExitMach.lua
[Disposition]
;InitScript=InitDisp.lua
[Heads]
; 5 axis head
H1=6608
; 5 axis saw
H2=6615
; Chainsaw
H3=6616
; Angular transmission
H5=6603
[SetUp]
Default=Standard
[Estimations]
Enable=1
WinPlace=0,-1270,21,669,863
[VMill]
Enable=1
Save=0
+626
View File
@@ -0,0 +1,626 @@
-- Descrizione macchina Saomad-KAIROS by EgalWare s.r.l. 2024/07/08
-- 2024/06/27 ver 2.6f1 Prima versione (derivata da Kairos023)
-- 2024/07/01 ver 2.6g1 Aggiornato 3D con nuovo gruppo testa
-- 2024/07/03 ver 2.6g2 Aggiornato 3D con modello reale e altre piccole modifiche
-- 2024/07/08 ver 2.6g3 Aggiunta gestione sega a catena (MANCA generazione codice CN).
-- 2024/09/11 ver 2.6i1 In generazione movimento in Z dopo spostamento pinze
-- Corretto calcolo valori per feed assi
require( 'EmtGenerator')
EgtEnableDebug( false)
PP_VER = '3.1d1_DEV1'
MIN_MACH_VER = '2.7l2'
EgtOutLog ( '** Saomad-KAIROS '..PP_VER..' (MinMach '.. MIN_MACH_VER ..') **', 1)
-- Parametri macchina
NumericalControl = 'SIEMENS'
ChainSaw = false
MinY = -1150
MaxY = 570
ParkY = 400
FmaxY = 45000
MinZ = -298
MaxZ = 915
ParkZ = 900
FmaxZ = 45000
MinA = -120
MaxA = 120
MinSawA = -101
MaxSawA = 101
ParkA = 0
FmaxA = 10440
MinC = -240
MaxC = 240
ParkC = -90
FmaxC = 18000
MillOffs = 247.6174
ChSawLen = 141.5
MinX1 = 62.0
MaxX1 = 3650.0
ParkX1 = 480.0
FmaxX1 = 45000
MinX2 = -3650.0
MaxX2 = -62.0
ParkX2 = -480.0
FmaxX2 = 45000
LoadT = 1800.0
UnloadT = -1800
UnloadSmT = UnloadT
TurnerOffs = 0
MaxHOpen = 330 -- Massima apertura pinza PX
MaxVOpen = 150 -- Massima apertura pinza QX
LenToPress = 500
DeltaTabY = 0
DeltaTabZ = 0
DimTabY = 500
DimTabX = 34000
DistBack = 880
StartRotation = true
AutomaticRotation = true
AutoRotMinLen = 2600
MaxUnloadLen = 0
DefTcPos = 'T101'
CoeffVM = 0.5
DistZClampToTable = 5 -- distanza tra la tavola e il punto più basso della morsa
ClampingCoeffMin = nil -- coefficiente di fissaggio, se 0 o nil non fa controllo, per il momento da inizializzare da Ts3Data
ClampSmallH = 98.5 -- dimensioni area di pinzaggio
ClampH = 440.9
ClampL = 1491
ClampSmallL = 994.4 -- dimensioni area di pinzaggio
ClampFrontAngle = 35 -- angolo pinza frontale
MinJoinVV = 75
MinJoinSS = 100
MinJoinLS = 290
MinJoinSL = 100
MinJoinLL = 400
-- variabili per pinzaggio
CLAMP_MAXDIST_2CLAMP = 3000 -- massima distanza tra ingombro lavorazione e pinza quando il pezzo è staffato con entrtambe le pinze (lavorazioni centrali)
CLAMP_MAXDIST_1CLAMP = 500 -- massima distanza tra ingombro lavorazione e pinza quando il pezzo è staffato con una sola pinza (lavorazioni testa-coda)
-- Aggiornamento con dati da B&W
local sData = EgtGetCurrMachineDir().."\\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
if Machine.Offsets.MIN_JOIN_VV then MinJoinVV = EgtClamp( Machine.Offsets.MIN_JOIN_VV, 60, 150) end
if Machine.Offsets.MIN_JOIN_SS then MinJoinSS = EgtClamp( Machine.Offsets.MIN_JOIN_SS, 80, 275) end
if Machine.Offsets.MIN_JOIN_LS then MinJoinLS = EgtClamp( Machine.Offsets.MIN_JOIN_LS, 250, 400) end
if Machine.Offsets.MIN_JOIN_SL then MinJoinSL = EgtClamp( Machine.Offsets.MIN_JOIN_SL, 80, 400) end
if Machine.Offsets.MIN_JOIN_LL then MinJoinLL = EgtClamp( Machine.Offsets.MIN_JOIN_LL, 300, 600) end
if Machine.Offsets.COEFF_CLAMP_CHECK then ClampingCoeffMin = Machine.Offsets.COEFF_CLAMP_CHECK end
end
ParkY = EgtClamp( ParkY, MinY, MaxY)
ParkZ = EgtClamp( ParkZ, MinZ, MaxZ)
ParkA = EgtClamp( ParkA, MinA, MaxA)
ParkC = EgtClamp( ParkC, MinC, MaxC)
UnloadSmT = UnloadT
end
end
-- Aggiorno valori MinJoin
MinJoin = MinJoinSS
MinOther = abs( MinX1) + abs( MaxX2) + MinJoin
DeltaTol = 210
EmtGeneral {
File='Saomad-KAIROS-MK3.nge',
Offset = Vector3d( 0.0, 0.0, 0.0),
AxisMaxAdjust = 30,
AxisMaxRotAdj = 0.5,
ExitMaxAdjust = 30,
ExitMaxRotAdj = 0.5,
AngDeltaMinForHome = 165,
NewLinkMgr = 1,
Special = 'Saomad-KAIROS-MK3.mlse',
Processor = 'Saomad-KAIROS-MK3.mlpe'}
local BaseId = EmtBase {
Name = 'Base',
Geo='BASE/GEO',
Aux={'BASE/SOLID', 'BASE/LOAD', 'BASE/UNLOAD', 'BASE/TC', 'BASE/TC2', 'BASE/SIGN', 'BASE/COLLISION'}}
local YId = EmtAxis {
Name = 'Y',
Parent = 'Base',
Token = 'Y1',
Type = MCH_AT.LINEAR,
Dir = Y_AX(),
Pos = Point3d( -284.173, 196.388, 2252.44),
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( 0.0259, -149.993, 678.346),
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.314, 0.007, 547.115),
Stroke = {MinC, MaxC},
Home = ParkC,
Geo = 'C_AXIS/GEO',
Aux = {'C_AXIS/SOLID', 'C_AXIS/COLLISION'}}
local AId = EmtAxis {
Name = 'A',
Parent = 'C',
Token = 'A1',
Type = MCH_AT.ROTARY,
Dir = X_AX(),
Pos = Point3d( 35.3132, 0.001, 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
EmtAxis {
Name = 'CS',
Parent = 'A',
Token = '**',
Type = MCH_AT.ROTARY,
Dir = Z_AX(),
Pos = Point3d( 0, 0, 0),
Stroke = { -90, 0},
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 = Y_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')]]
-- Morse
local X1Id = EmtAxis {
Name = 'X1',
Token = 'X1',
Parent = 'Base',
Type = MCH_AT.LINEAR,
Dir = -X_AX(),
Pos = Point3d( -905, 124.5, 886.44),
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( -905, 94.5, 886.44),
Stroke = { 0, MaxHOpen},
Home = MaxHOpen,
Geo = 'PX1_AXIS/GEO',
Aux = {'PX1_AXIS/SOLID', 'PX1_AXIS/COLLISION', 'PX1_AXIS/CLAMP_CHECK'}}
local QX1Id = EmtAxis {
Name = 'QX1',
Parent = 'X1',
Type = MCH_AT.LINEAR,
Dir = Z_AX(),
Pos = Point3d( -598, -22, 839.44),
Stroke = { 0, MaxVOpen},
Home = MaxVOpen,
Geo = 'QX1_AXIS/GEO',
Aux = 'QX1_AXIS/SOLID'}
local X2Id = EmtAxis {
Name = 'X2',
Token = 'X2',
Parent = 'Base',
Type = MCH_AT.LINEAR,
Dir = -X_AX(),
Pos = Point3d( 905, 124.5, 886.44),
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( 905, 94.5, 886.44),
Stroke = { 0, MaxHOpen},
Home = MaxHOpen,
Geo = 'PX2_AXIS/GEO',
Aux = {'PX2_AXIS/SOLID', 'PX2_AXIS/COLLISION', 'PX2_AXIS/CLAMP_CHECK'}}
local QX2Id = EmtAxis {
Name = 'QX2',
Parent = 'X2',
Type = MCH_AT.LINEAR,
Dir = Z_AX(),
Pos = Point3d( 598, -22, 839.44),
Stroke = { 0, MaxVOpen},
Home = MaxVOpen,
Geo = 'QX2_AXIS/GEO',
Aux = 'QX2_AXIS/SOLID'}
EmtAxis {
Name = 'T',
Parent = 'Base',
--Token = '**',
Type = MCH_AT.LINEAR,
Dir = - X_AX(),
Pos = Point3d( 0, 0, 0),
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 12 posizioni verticale
local ptTcCen = Point3d( 533.814, -1030, 1153.94)
EmtTcPos {
Name = 'T101',
Parent = 'Base',
Pos = ptTcCen,
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T101'}
EmtTcPos {
Name = 'T102',
Parent = 'Base',
Pos = ptTcCen + Vector3d( 0, 0, -110),
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T102'}
EmtTcPos {
Name = 'T103',
Parent = 'Base',
Pos = ptTcCen + Vector3d( 0, 0, -110*2),
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T103'}
EmtTcPos {
Name = 'T104',
Parent = 'Base',
Pos = ptTcCen + Vector3d( 0, 0, -110*3),
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T104'}
EmtTcPos {
Name = 'T105',
Parent = 'Base',
Pos = ptTcCen + Vector3d( 0, 0, -110*4),
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T105'}
EmtTcPos {
Name = 'T106',
Parent = 'Base',
Pos = ptTcCen + Vector3d( 0, 0, -110*5),
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T106'}
EmtTcPos {
Name = 'T107',
Parent = 'Base',
Pos = ptTcCen + Vector3d( 0, 0, -110*6),
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T107'}
EmtTcPos {
Name = 'T108',
Parent = 'Base',
Pos = ptTcCen + Vector3d( 0, 0, -110*7),
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T108'}
EmtTcPos {
Name = 'T109',
Parent = 'Base',
Pos = ptTcCen + Vector3d( 0, 0, -110*8),
TDir = -X_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T109'}
local ptTcVert = Point3d( 640.3120, -1030.0, 92.4414)
EmtTcPos {
Name = 'T110',
Parent = 'Base',
Pos = ptTcVert,
TDir = Z_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T110'}
EmtTcPos {
Name = 'T111',
Parent = 'Base',
Pos = ptTcVert + Vector3d( 0, 120, 0),
TDir = Z_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T111'}
EmtTcPos {
Name = 'T112',
Parent = 'Base',
Pos = ptTcVert + Vector3d( 0, 120*2, 0),
TDir = Z_AX(),
ADir = -Y_AX(),
Geo = 'BASE/T112'}
-- ToolChanger 2 + Lama
local ptTc2Cen = Point3d( -533.1860, -1030.0, 1005.940)
EmtTcPos {
Name = 'T201',
Parent = 'Base',
Pos = ptTc2Cen,
TDir = X_AX(),
ADir = Y_AX(),
Geo = 'BASE/T201'}
EmtTcPos {
Name = 'T202',
Parent = 'Base',
Pos = ptTc2Cen + Vector3d( 0, 0, -380),
TDir = X_AX(),
ADir = Y_AX(),
Geo = 'BASE/T202'}
EmtTcPos {
Name = 'T203',
Parent = 'Base',
Pos = ptTc2Cen + Vector3d( 0, 0, -380-110),
TDir = X_AX(),
ADir = Y_AX(),
Geo = 'BASE/T203'}
EmtTcPos {
Name = 'T204',
Parent = 'Base',
Pos = ptTc2Cen + Vector3d( 0, 0, -380-(110*2)),
TDir = X_AX(),
ADir = Y_AX(),
Geo = 'BASE/T204'}
local ptTc2Vert = Point3d( -639.6860, -1030.0, 242.440)
EmtTcPos {
Name = 'T205',
Parent = 'Base',
Pos = ptTc2Vert,
TDir = Z_AX(),
ADir = Y_AX(),
Geo = 'BASE/T205'}
EmtTcPos {
Name = 'T206',
Parent = 'Base',
Pos = ptTc2Vert + Vector3d( 0, 120, 0),
TDir = Z_AX(),
ADir = Y_AX(),
Geo = 'BASE/T206'}
EmtTcPos {
Name = 'T207',
Parent = 'Base',
Pos = ptTc2Vert + Vector3d( 0, 120*2, 0),
TDir = Z_AX(),
ADir = Y_AX(),
Geo = 'BASE/T207'}
-- 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, 'TC2'), 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( PX1Id, 'CLAMP_CHECK'), vtMove + Vector3d(0,0,DistZClampToTable), GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( QX1Id, 'SOLID'), 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( PX2Id, 'CLAMP_CHECK'), vtMove + Vector3d(0,0,DistZClampToTable), GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( QX2Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( YId, 'SOLID'), vtMoveY, GDB_RT.GLOB)
-- Assegno identificativi alle spie delle morse
PX1LightId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( PX1Id, 'SOLID') or GDB_ID.NULL, 'Light')
PX2LightId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( PX2Id, '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))
-- recupero valore asse CS bloccato
local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS)
local dPosCS = tonumber( sVal:sub( 4) or '')
EmtModifyAxisHome( 'C', GetChainSawCHomeFromVirtualAxis( dPosCS))
-- limiti asse A
EmtModifyAxisStroke( 'A', { -91, 91})
-- altrimenti
else
EmtModifyAxisHome( 'C', ParkC)
-- se lama
if EMC.TCPOS == 'T201' then
EmtModifyAxisStroke( 'A', { MinSawA, MaxSawA})
-- altrimenti
else
EmtModifyAxisStroke( 'A', { MinA, MaxA})
end
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 -180
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
---------------------------------------------------------------------
function UpdateMinJoinDeltaTol( SB, HB, LB)
local L_SMALL = 800
local H_V = 90
local H_S = 200
local H_L = 400
local W_V = 90
local W_S = 150
local W_L = 250
local DELTA_TOL_S = 210
local DELTA_TOL_V = 110
local DELTA_TOL_L = 410
if SB <= W_V and HB <= H_V then
MinJoin = MinJoinVV
DeltaTol = DELTA_TOL_V
elseif LB <= L_SMALL then
MinJoin = MinJoinSS
DeltaTol = DELTA_TOL_S
else
local dMinJoinS
local dMinJoinL
if SB <= W_S then
dMinJoinS = MinJoinSS
dMinJoinL = MinJoinLS
elseif SB <= W_L then
local Coeff = ( SB - W_S) / ( W_L - W_S)
dMinJoinS = ( 1 - Coeff) * MinJoinSS + Coeff * MinJoinSL
dMinJoinL = ( 1 - Coeff) * MinJoinLS + Coeff * MinJoinLL
else
dMinJoinS = MinJoinSL
dMinJoinL = MinJoinLL
end
if HB <= H_S then
MinJoin = dMinJoinS
DeltaTol = DELTA_TOL_S
elseif HB <= H_L then
local Coeff = ( HB - H_S) / ( H_L - H_S)
MinJoin = ( 1 - Coeff) * dMinJoinS + Coeff * dMinJoinL
DeltaTol = ( 1 - Coeff) * DELTA_TOL_S + Coeff * DELTA_TOL_L
else
MinJoin = dMinJoinL
DeltaTol = DELTA_TOL_L
end
if SB < W_V then
DeltaTol = DELTA_TOL_V
end
end
MinOther = abs( MinX1) + abs( MaxX2) + MinJoin
end
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
+36
View File
@@ -0,0 +1,36 @@
-- 2023/09/22 13:00:00
-- Machining Exit for Saomad-KAIROS 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
+44
View File
@@ -0,0 +1,44 @@
-- 2023/09/22 13:00:00
-- Machining Init for Saomad-KAIROS 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
+209
View File
@@ -0,0 +1,209 @@
-- Gestione attrezzaggio per Saomad-KAIROS - 2023/10/16
-- 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
local PositionTable={{Pos = "Pos1", TcPos = "T101", Head = "H1", Group = "G1"},
{Pos = "Pos2", TcPos = "T102", Head = "H1", Group = "G1"},
{Pos = "Pos3", TcPos = "T103", Head = "H1", Group = "G1"},
{Pos = "Pos4", TcPos = "T104", Head = "H1", Group = "G1"},
{Pos = "Pos5", TcPos = "T105", Head = "H1", Group = "G1"},
{Pos = "Pos6", TcPos = "T106", Head = "H1", Group = "G1"},
{Pos = "Pos7", TcPos = "T107", Head = "H1", Group = "G1"},
{Pos = "Pos8", TcPos = "T108", Head = "H1", Group = "G1"},
{Pos = "Pos9", TcPos = "T109", Head = "H1", Group = "G1"},
{Pos = "Pos10", TcPos = "T110", Head = "H1", Group = "G2"},
{Pos = "Pos11", TcPos = "T111", Head = "H1", Group = "G2"},
{Pos = "Pos12", TcPos = "T112", Head = "H1", Group = "G2"},
{Pos = "Pos13", TcPos = "T201", Head = "H1", Group = "G3"},
{Pos = "Pos14", TcPos = "T202", Head = "H1", Group = "G3"},
{Pos = "Pos15", TcPos = "T203", Head = "H1", Group = "G3"},
{Pos = "Pos16", TcPos = "T204", Head = "H1", Group = "G3"},
{Pos = "Pos17", TcPos = "T205", Head = "H1", Group = "G4"},
{Pos = "Pos18", TcPos = "T206", Head = "H1", Group = "G4"},
{Pos = "Pos19", TcPos = "T207", Head = "H1", Group = "G4"}}
if EgtGetHeadId( 'H3') then
PositionTable[13].Head = 'H3'
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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+43
View File
@@ -0,0 +1,43 @@
; Commento per evitare BOM con UTF-8
; Index, Type, Description, Value
; Index = 0,1,..,n
; Type : d=double, l=lenght, s=string, b=boolean, dr=double recalc, sr= string recalc, lr=lenght recalc, br=boolean recalc, th=toolholder
; Description : STEP, SIDESTEP, ...
[DRILL_STD]
0=th,TH,
1=d,STEP
2=s,DOUBLE
[SAW_STD]
0=th,TH,
1=d,STEP
2=d,SIDESTEP
3=b,LONGCUT
[SAW_FLAT]
0=th,TH,
1=d,STEP
2=d,SIDESTEP
3=b,LONGCUT
[MILL_STD]
0=th,TH,
1=d,STEP
2=d,SIDESTEP
3=d,SIDEDEPTH
4=s,DOUBLE
5=dr,TOOL_OVERHANG
[MILL_NOTIP]
0=th,TH,
1=d,STEP
2=d,SIDESTEP
3=d,SIDEDEPTH
4=s,DOUBLE
5=dr,TOOL_OVERHANG
[MORTISE_STD]
0=b,MORTISE
1=d,STEP
2=d,SIDESTEP