Prima versione macchina

This commit is contained in:
andrea.villa
2024-07-17 13:02:09 +02:00
commit b4adf6b004
13 changed files with 3318 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
/Tools
/Machinings
/SetUp
/THolders
+101
View File
@@ -0,0 +1,101 @@
{
"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"
]
}
+37
View File
@@ -0,0 +1,37 @@
; Commento per evitare BOM con UTF-8
;Index = Type, Description
; Type : d=double
; Description : l=lenght, s=string, b=boolean
[Drilling]
[Sawing]
[Milling]
0=d,MaxElev,0
1=d,OutRaw,0
2=d,SideElev,0
[Pocketing]
0=d,MaxElev,0
1=b,Open,0
2=d,OpenMinSafe,0
3=d,OpenOutRaw,0
4=d,MaxOptSize,0
[Mortising]
0=d,MaxElev,0
[Chiseling]
[ChainsawCutting]
[SawRoughing]
[SawFinishing]
[GenMachining]
[SurfRoughing]
[SurfFinishing]
File diff suppressed because it is too large Load Diff
+59
View File
@@ -0,0 +1,59 @@
; Commento per evitare BOM con UTF-8
[General]
Material=Wood
[Tools]
Drillbit=1
Sawblade=1
Mill=1
Mortise=0
Chisel=0
DrillMaker=MakeWoodDrill.lua
SawbladeMaker=MakeSawblade.lua
MillMaker=MakeWoodCylMill.lua
MortiseMaker=MakeMortise.lua
ChiselMaker=MakeChisel.lua
Active=0
[ToolHolder]
H11.1=Standard.nge
H21.1=
H31.1=
H41.1=Standard.nge
[Machinings]
Drilling=1
Sawing=0
Milling=1
Pocketing=1
Mortising=0
SawRoughing=0
SawFinishing=0
Chiseling=0
[Disposition]
InitScript=InitDisp.lua
[Estimations]
Enable=1
[Heads]
; Main Vertical head 4ax
H11=6601
; rotary horizontal head 4-exit
H21=6611
; fixed horizontal head 2-exit
H31=6602
; Vertical head
H41=6601
[Estimations]
Enable=1
WinPlace=0,458,74,669,933
[VMill]
Enable=1
Save=0
[SetUp]
Default=Default
+354
View File
@@ -0,0 +1,354 @@
-- Special Operations macchina Saomad Just3500 by Egalware s.r.l. 15/01/2024
-- 2024.01.15 ver 2.6g1 Prima versione
-- Intestazioni
require( 'EmtGenerator')
EgtEnableDebug( false)
PP_VER = '2.6g1'
MIN_MACH_VER = '2.6g1'
EgtOutLog ( '** Saomad-Just3500 '..PP_VER..' (MinMach '.. MIN_MACH_VER ..') **', 1)
-- Parametri macchina
NumericalControl = 'SIEMENS'
-- posizione assi
C1 = Point3d( 0, 0, 100)
C2 = Point3d( -10.5, -506, -127.85)
-- corse assi
MinX1 = -1000
MaxX1 = 7000
MinY1 = -2400
MaxY1 = 5
MinZ1 = -700
MaxZ1 = 5
MinC1 = -360
MaxC1 = 360
MinC2 = -360
MaxC2 = 360
-- posizione tavola
--#region posizione tavola
DeltaTabX = 793.96
DeltaTabY = -1820
DeltaTabZ = -717.75
--#endregion
-- testa 1 - testa 4 assi con CU
H11 = Vector3d( 0, 0, 0)
-- testa 2 - 4 uscite orizzontali rotanti
H21_1 = C2 + Vector3d( -80, 0, 0)
H21_2 = C2 + Vector3d( 80, 0, 0)
H21_3 = C2 + Vector3d( 0, -80, 0)
H21_4 = C2 + Vector3d( 0, 80, 0)
-- testa 3 - 2 uscite orizzontali fisse
H31_1 = Vector3d( 285.5, -699.5, -149.6)
H31_2 = Vector3d( 285.5, -310, -149.6)
-- testa 4 - testa 3 assi
H41 = Vector3d( 432, -935, 33.95)
-- morse
ClampMaxVert = 170
ClampDeltaZDeact = 50
ClampRotDeact = 50
ClampOnCar = 8
ClampCarNumber = 2
-- altri parametri
CoeffVM = 0.75 -- coefficiente utilizzato per creazione VMILL
----------------------------------------------------------------------
EmtGeneral {
File='Saomad-Just3500.nge',
Offset = Vector3d( -678.04, -3193, 171.25),
AxisMaxAdjust = 10,
ExitMaxAdjust = 10,
Special = 'Saomad-Just3500.mlse',
Processor = 'Saomad-Just3500.mlpe'}
EmtBase {
Name = 'Base',
Geo='BASE/GEO',
Aux= {'BASE/SOLID', 'BASE/TC'}}
-- Carrelli ----------
local X1Id = EmtAxis {
Name = 'X1',
Parent = 'Base',
Token = '**',
Type = MCH_AT.LINEAR,
Dir = -X_AX(),
Pos = Point3d( 2223.5, -1792, -809),
Stroke = {MinX1, MaxX1},
Home = 0,
Geo = 'X1_AXIS/GEO',
Aux = {'X1_AXIS/SOLID','X1_AXIS/COLLISION','X1_AXIS/CLAMP_1','X1_AXIS/CLAMP_2','X1_AXIS/CLAMP_3','X1_AXIS/CLAMP_4','X1_AXIS/CLAMP_5','X1_AXIS/CLAMP_6','X1_AXIS/CLAMP_7','X1_AXIS/CLAMP_8'}}
local X2Id = EmtAxis {
Name = 'X2',
Parent = 'Base',
Token = '**',
Type = MCH_AT.LINEAR,
Dir = -X_AX(),
Pos = Point3d( 703.5, -3165, -809),
Stroke = {MinX1, MaxX1},
Home = 0,
Geo = 'X2_AXIS/GEO',
Aux = {'X2_AXIS/SOLID','X2_AXIS/COLLISION','X2_AXIS/CLAMP_1','X2_AXIS/CLAMP_2','X2_AXIS/CLAMP_3','X2_AXIS/CLAMP_4','X2_AXIS/CLAMP_5','X2_AXIS/CLAMP_6','X2_AXIS/CLAMP_7','X2_AXIS/CLAMP_8'}}
-- *** Tavola ***
local TId = EmtAxis {
Name = 'T',
Parent = 'Base',
Token = 'X',
Type = MCH_AT.LINEAR,
Dir = - X_AX(),
Pos = Point3d( DeltaTabX, DeltaTabY, DeltaTabZ),
Stroke = {-20000, 20000},
Home = LoadT,
Geo = 'T_AXIS/GEO'}
local TabId = EmtTable {
Name = 'Tab',
Parent = 'T',
Type = MCH_TT.FLAT,
Ref1 = Point3d( DeltaTabX, DeltaTabY, DeltaTabZ),
Coll = 'Tab/SOLID',
Geo = 'TABLE/GEO',
Aux = 'TABLE/SOLID'}
local Tab2Id = EmtTable {
Name = 'Tab2',
Parent = 'T',
Type = MCH_TT.FLAT,
Ref1 = Point3d( DeltaTabX, DeltaTabY, DeltaTabZ),
Coll = 'Tab2/SOLID',
Geo = 'TABLE2/GEO',
Aux = 'TABLE2/SOLID'}
-- Gruppop teste ----------
local Y1Id = EmtAxis {
Name = 'Y1',
Parent = 'Base',
Token = 'Y',
Type = MCH_AT.LINEAR,
Dir = Y_AX(),
Pos = Point3d( -375, -776, 849.75),
Stroke = {MinY1, MaxY1},
Home = 0,
Geo = 'Y1_AXIS/GEO',
Aux = 'Y1_AXIS/SOLID'}
local Z1Id = EmtAxis {
Name = 'Z1',
Parent = 'Y1',
Token = 'Z',
Type = MCH_AT.LINEAR,
Dir = Z_AX(),
Pos = Point3d( -262, -811, 883.4),
Stroke = {MinZ1, MaxZ1},
Home = 0,
Geo = 'Z1_AXIS/GEO',
Aux = {'Z1_AXIS/SOLID','H11_BODY/H11_SOLID','H11_BODY/H11_COLLISION','H21_BODY/H21_SOLID','H21_BODY/H21_COLLISION','H31_BODY/H31_SOLID','H31_BODY/H31_COLLISION','H41_BODY/H41_SOLID','H41_BODY/H41_COLLISION','MANIPOLATORE/SOLID'}}
-- testa 1 ( testa verticale con asse rotante per rinvii con CU) ----------
local H11Id = EmtHead {
Name = 'H11',
Parent = 'Z1',
HSet = 'H11',
Type = MCH_HT.STD,
Pos = H11,
TDir = Z_AX(),
Geo = 'H11_HEAD/GEO',
Aux = 'H11_HEAD/SOLID'}
-- asse C su testa 1 per aggregati
local C1Id = EmtAxis {
Name = 'C1',
Parent = 'Z1',
Token = 'C',
Type = MCH_AT.ROTARY,
Dir = Z_AX(),
Pos = C1,
Stroke = {MinC1, MaxC1},
Home = 0,
Geo = 'C1_AXIS/GEO',
Aux = 'C1_AXIS/SOLID'}
-- Testa 2 ( 4 uscite orizzontali rotanti) ----------
local C2Id = EmtAxis {
Name = 'C2',
Parent = 'Z1',
Token = 'C',
Type = MCH_AT.ROTARY,
Dir = Z_AX(),
Pos = C2,
Stroke = {MinC2, MaxC2},
Home = 0,
Geo = 'C2_AXIS/GEO',
Aux = {'C2_AXIS/SOLID','C2_AXIS/COLLISION'}}
local H21Id = EmtHead {
Name = 'H21',
Parent = 'C2',
HSet = 'H21',
Type = MCH_HT.MULTI,
ExitNbr = 4,
Pos1 = H21_1,
TDir1 = X_AX(),
Pos2 = H21_2,
TDir2 = -X_AX(),
Pos3 = H21_3,
TDir3 = Y_AX(),
Pos4 = H21_4,
TDir4 = -Y_AX(),
ADir = Z_AX(),
Geo = 'H21_HEAD/GEO',
Aux = {'H21_HEAD/SOLID','H21_HEAD/COLLISION'}}
-- testa 3 ( 2 uscite orizzontali fisse) ----------
local H31Id = EmtHead {
Name = 'H31',
Parent = 'Z1',
HSet = 'H31',
Type = MCH_HT.MULTI,
ExitNbr = 2,
Pos1 = H31_1,
TDir1 = Y_AX(),
Pos2 = H31_2,
TDir2 = -Y_AX(),
ADir = Z_AX(),
Geo = 'H31_HEAD/GEO',
Aux = {'H31_HEAD/SOLID','H31_HEAD/COLLISION'}}
-- testa 4 ( testa verticale fissa) ----------
local H41Id = EmtHead {
Name = 'H41',
Parent = 'Z1',
HSet = 'H41',
Type = MCH_HT.STD,
Pos = H41,
TDir = Z_AX(),
Geo = 'H41_HEAD/GEO'}
---------------------------------------------------------------------
-- Salvo ID morse
local ClampsInfo = {}
for i = 1, ClampCarNumber do
local IdCarr = 0
if i == 1 then
IdCarr = X1Id
elseif i == 2 then
IdCarr = X2Id
end
for j = 1, ClampOnCar do
local sName = 'CLAMP_' .. tostring( j)
local ClampId = EgtGetFirstNameInGroup( IdCarr, sName)
local sNameTot = 'CLAMP_' .. tostring( i) .. '_' .. tostring( j)
table.insert( ClampsInfo, { Id = ClampId, Name = sNameTot})
end
end
---------------------------------------------------------------------
-- Funzioni richiamate per modificare i dati macchina in casi particolari
---------------------------------------------------------------------
local function MoveGroup( nGrpId, vtVers, dPos, bLoc)
local dVal = EgtGetInfo( nGrpId, 'Val')
if not dVal then return end
if abs( dPos - dVal) > GEO.EPS_SMALL then
local nRT = EgtIf( bLoc, GDB_RT.LOC, GDB_RT.GLOB)
EgtMove( nGrpId, ( dPos - dVal) * vtVers, nRT)
EgtSetInfo( nGrpId, 'Val', dPos)
end
end
--------------------------------------------------------------------------------
function SetClamp( nNumClamp, nNumCarr, nPos)
local nClampId = ClampsInfo[( ( nNumCarr - 1) * ClampOnCar) + nNumClamp].Id
local nVal = tonumber( EgtGetInfo( nClampId, 'Val'))
if not nVal then return end
-- controllo che la posizione passata sia nei limiti di pinzaggio
if nPos > ClampMaxVert or nPos == 0 then
nPos = ClampMaxVert
end
-- se è cambiata la posizione
if abs( nPos - nVal) > GEO.EPS_SMALL * 10 then
-- asse di rotazione
local RotAxId = EgtGetFirstNameInGroup( nClampId, 'RotAx')
local ptAx = EgtSP( RotAxId, GDB_ID.ROOT)
local vtAx = EgtSV( RotAxId, GDB_ID.ROOT)
local nRot = 0
local nZMove = 0
-- se devo metterla a riposo bassa disattivata. Situazione precedente in presa sul pezzo o tutta aperta
if nPos < 0 then
nRot = ClampRotDeact
nZMove = -( nVal + ClampDeltaZDeact)
-- se devo pinzare il pezzo
elseif nPos > 0 then
-- se era a riposo devo ruotare e muovere alla quota
if nVal < 0 then
nRot = -ClampRotDeact
nZMove = nPos + ClampDeltaZDeact
-- se stava pinzando il pezzo o se era tutta aperta, si cambia solo la Z di pinzaggio
else
nZMove = nPos - nVal
end
-- se devo aprirla tutta -> dPos == 0
else
-- se era a riposo devo ruotare e muovere alla quota
if nVal < 0 then
nRot = -ClampRotDeact
nZMove = nPos + ClampDeltaZDeact
-- se stava pinzando il pezzo
else
nZMove = nPos - nVal
end
end
-- rotazione
if nRot ~= 0 then EgtRotate( nClampId, ptAx, vtAx, nRot, GDB_RT.GLOB) end
-- movimento Z
if nZMove ~= 0 then EgtMove( nClampId, Vector3d( 0, 0, nZMove), GDB_RT.LOC) end
EgtSetInfo( nClampId, 'Val', nPos)
end
end
--------------------------------------------------------------------------------
function OnSetTable()
end
--------------------------------------------------------------------------------
function OnSetHead()
-- impegno/disimpegno le teste su gruppi pneumatici
-- testa 3 assi con CU
MoveGroup( EgtGetFirstNameInGroup( Z1Id, 'H11_SOLID'), Z_AX(), EgtIf( EMC.HEAD == 'H11', 0, 450), true)
MoveGroup( EgtGetFirstNameInGroup( Z1Id, 'H11_COLLISION'), Z_AX(), EgtIf( EMC.HEAD == 'H11', 0, 450), true)
MoveGroup( EgtGetFirstNameInGroup( H11Id, 'T1'), Z_AX(), EgtIf( EMC.HEAD == 'H11', 0, 450), true)
-- testa 4 uscite orizzontali rotanti
MoveGroup( EgtGetFirstNameInGroup( Z1Id, 'H21_SOLID'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( Z1Id, 'H21_COLLISION'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( C2Id, 'SOLID'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( C2Id, 'COLLISION'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( H21Id, 'SOLID'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( H21Id, 'COLLISION'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( H21Id, 'T1'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( H21Id, 'T2'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( H21Id, 'T3'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( H21Id, 'T4'), Z_AX(), EgtIf( EMC.HEAD == 'H21', 0, 300), true)
-- testa 2 uscite orizzontali fisse
MoveGroup( EgtGetFirstNameInGroup( Z1Id, 'H31_SOLID'), Z_AX(), EgtIf( EMC.HEAD == 'H31', 0, 350), true)
MoveGroup( EgtGetFirstNameInGroup( Z1Id, 'H31_COLLISION'), Z_AX(), EgtIf( EMC.HEAD == 'H31', 0, 350), true)
MoveGroup( EgtGetFirstNameInGroup( H31Id, 'SOLID'), Z_AX(), EgtIf( EMC.HEAD == 'H31', 0, 350), true)
MoveGroup( EgtGetFirstNameInGroup( H31Id, 'COLLISION'), Z_AX(), EgtIf( EMC.HEAD == 'H31', 0, 350), true)
MoveGroup( EgtGetFirstNameInGroup( H31Id, 'T1'), Z_AX(), EgtIf( EMC.HEAD == 'H31', 0, 350), true)
MoveGroup( EgtGetFirstNameInGroup( H31Id, 'T2'), Z_AX(), EgtIf( EMC.HEAD == 'H31', 0, 350), true)
-- testa 3 assi
MoveGroup( EgtGetFirstNameInGroup( Z1Id, 'H41_SOLID'), Z_AX(), EgtIf( EMC.HEAD == 'H41', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( Z1Id, 'H41_COLLISION'), Z_AX(), EgtIf( EMC.HEAD == 'H41', 0, 300), true)
MoveGroup( EgtGetFirstNameInGroup( H41Id, 'T1'), Z_AX(), EgtIf( EMC.HEAD == 'H41', 0, 300), true)
end
---------------------------------------------------------------------
-- Funzione per resettare tutte le attivazioni della macchina
function OnResetMachine()
EmtUnlinkAllRawPartsFromGroups()
EmtUnlinkAllFixturesFromGroups()
-- 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
+728
View File
@@ -0,0 +1,728 @@
-- Special Operations macchina Saomad Just3500 by Egalware s.r.l. 15/01/2024
-- Intestazioni
require( 'EmtGenerator')
EgtEnableDebug( false)
---------------------------------------------------------------------
-- *** GENERATION ***
---------------------------------------------------------------------
local sBaseDir = EgtGetSourceDir()
if NumericalControl == 'SIEMENS' then
dofile( sBaseDir .. 'Saomad-Just3500.SIEMENS.mlpe')
else
EmtSetLastError( 1201, 'Numerical Control error : unkwnown type')
end
---------------------------------------------------------------------
-- *** SIMULATION ***
---------------------------------------------------------------------
local COLL_SAFE_DIST = 3
---------------------------------------------------------------------
function OnSimulInit()
EgtSetStatus( EgtGetFirstNameInGroup( EgtGetTableId( 'Tab'), 'SOLID'), GDB_ST.OFF)
EgtSetStatus( EgtGetFirstNameInGroup( EgtGetTableId( 'Tab2'), 'SOLID'), GDB_ST.OFF)
end
---------------------------------------------------------------------
function OnSimulExit()
EgtSetStatus( EgtGetFirstNameInGroup( EgtGetTableId( 'Tab'), 'SOLID'), GDB_ST.ON)
EgtSetStatus( EgtGetFirstNameInGroup( EgtGetTableId( 'Tab2'), 'SOLID'), GDB_ST.ON)
end
---------------------------------------------------------------------
function OnSimulStart()
-- Se reset o home, esco
if EMT.SIM1ST then return end
-- Creo o svuoto gruppo per copia finale degli oggetti virtual milling
local nVmGrpId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill')
if nVmGrpId then
EgtSetStatus( nVmGrpId, GDB_ST.ON)
EgtEmptyGroup( nVmGrpId)
else
nVmGrpId = EgtGroup( GDB_ID.ROOT)
EgtSetName( nVmGrpId, 'VMill')
EgtSetLevel( nVmGrpId, GDB_LV.TEMP)
end
-- Preparo lista oggetti da verificare per collisioni
EMT.COLLOBJ = {}
AddToCollisionCheck( 'Z1', 'H11_COLLISION', EMT.COLLOBJ)
AddToCollisionCheck( 'Z1', 'H21_COLLISION', EMT.COLLOBJ)
AddToCollisionCheck( 'Z1', 'H31_COLLISION', EMT.COLLOBJ)
AddToCollisionCheck( 'Z1', 'H41_COLLISION', EMT.COLLOBJ)
AddToCollisionCheck( 'C2', 'COLLISION', EMT.COLLOBJ)
AddToCollisionCheck( 'H21', 'COLLISION', EMT.COLLOBJ)
DumpCollisionCheck( EMT.COLLOBJ, 'Collision Objects :', 4)
-- Preparo lista solidi macchina con cui possono collidere gli oggetti sopra riportati (in aggiunta a VMill)
EMT.MCODET = {}
local McdData = { { Grp = 'X1', Sub = 'COLLISION', Name = {'CAR1'}},
{ Grp = 'X1', Sub = 'CLAMP_1', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X1', Sub = 'CLAMP_2', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X1', Sub = 'CLAMP_3', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X1', Sub = 'CLAMP_4', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X1', Sub = 'CLAMP_5', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X1', Sub = 'CLAMP_6', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X1', Sub = 'CLAMP_7', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X1', Sub = 'CLAMP_8', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X2', Sub = 'COLLISION', Name = {'CAR2'}},
{ Grp = 'X2', Sub = 'CLAMP_1', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X2', Sub = 'CLAMP_2', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X2', Sub = 'CLAMP_3', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X2', Sub = 'CLAMP_4', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X2', Sub = 'CLAMP_5', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X2', Sub = 'CLAMP_6', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X2', Sub = 'CLAMP_7', Name = { 'COLLISION1', 'COLLISION2'}},
{ Grp = 'X2', Sub = 'CLAMP_8', Name = { 'COLLISION1', 'COLLISION2'}}}
EgtOutLog( 'MCODET Objects :', 4)
local nMcdNullCnt = 0
for i = 1, #McdData do
local nGrpId
if McdData[i].Grp == 'Base' then
nGrpId = EgtGetBaseId( 'Base')
else
nGrpId = EgtGetAxisId( McdData[i].Grp)
end
for j = 1, #McdData[i].Name do
local nId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( nGrpId, McdData[i].Sub), McdData[i].Name[j])
if nId then
table.insert( EMT.MCODET, nId)
EgtOutLog( 'Element ' .. McdData[i].Grp .. '/' .. McdData[i].Sub .. '/' .. McdData[i].Name[j] .. ' (' .. tostring( nId) .. ') is ok', 4)
else
nMcdNullCnt = nMcdNullCnt + 1
EgtOutLog( 'Element ' .. McdData[i].Grp .. '/' .. McdData[i].Sub .. '/' .. McdData[i].Name[j] .. ' is null', 4)
end
end
end
if nMcdNullCnt > 0 then
EgtOutLog( 'Warning : MCODET with one or more null Element(s) ')
end
-- Preparo lista collisioni vuota
EMT.COLLIDE = {}
end
---------------------------------------------------------------------
function OnSimulEnd()
ExecMoveToHome()
end
---------------------------------------------------------------------
function OnSimulDispositionStarting()
if EMT.PHASE == 2 then
-- carrelli tornano in parcheggio
local dLoadPos = EgtGetAxisHomePos( 'T')
SimulMoveAxes( 'T', dLoadPos, MCH_SIM_STEP.RAPID, 'X1', dLoadPos, MCH_SIM_STEP.RAPID, 'X2', dLoadPos - EMT.X2DELTA, MCH_SIM_STEP.RAPID)
end
end
---------------------------------------------------------------------
function OnSimulDispositionStart()
EMT.OPEISDISP = true
-- se non esiste la lista con le info dei pezzi, la creo
if not EMT.PIECES or EMT.PHASE > 1 then
EMT.PIECES = {}
end
-- recupero tutte le info dei pezzi, dimensioni e posizione
local nPartRawId = EgtGetFirstRawPart()
while nPartRawId do
local vPiece = {}
-- recupero il solido
local nSolId = EgtGetFirstNameInGroup( nPartRawId, 'RawSolid')
local b3Raw = EgtGetBBoxGlob( nSolId, GDB_BB.STANDARD)
vPiece.Id = nPartRawId
vPiece.IdPiece = EgtGetFirstPartInRawPart( nPartRawId)
vPiece.SolId = nSolId
vPiece.Len = b3Raw:getDimX()
vPiece.Wid = b3Raw:getDimY()
vPiece.Thk = b3Raw:getDimZ()
vPiece.Offs = b3Raw:getMin() -- offset rispetto a zero
vPiece.OffTab = b3Raw:getMin() - Vector3d( DeltaTabX, DeltaTabY, DeltaTabZ) -- offset rispetto a zero tavola
vPiece.Clamp = {}
vPiece.Clamp.dPhase1 = EgtGetInfo( vPiece.IdPiece, 'CLAMPV_1', 'd') or vPiece.Thk
vPiece.Clamp.dPhase2 = EgtGetInfo( vPiece.IdPiece, 'CLAMPV_2', 'd') or vPiece.Thk
vPiece.Area = vPiece.Len * vPiece.Wid + vPiece.Len * vPiece.Thk + vPiece.Wid * vPiece.Thk
table.insert( EMT.PIECES, vPiece)
nPartRawId = EgtGetNextRawPart( nPartRawId)
end
-- se ho più di un pezzo, devo aprire carrelli (default sono chiusi)
local MAXDIMPIECE1CAR = 1500 -- da InitDisp.lua
if #EMT.PIECES > 1 or ( #EMT.PIECES == 1 and EMT.PIECES[1].Len <= MAXDIMPIECE1CAR) then
EMT.X2DELTA = 380
else
EMT.X2DELTA = 0
end
-- Se prima disposizione
if EMT.PHASE == 1 then
-- imposto carro X2 a interasse
EgtSetAxisPos( 'X2', -EMT.X2DELTA)
-- Carico primo utensile sulla testa 1
EMT.LOAD = true
-- Se vero inizio e abilitato creo gli Zmap
EMT.VMILL = {}
if not EMT.SIM1ST and EgtGetInfo( EgtGetCurrMachGroup(), 'Vm', 'b') then
for i = 1, #EMT.PIECES do
-- elimino eventuale vecchio Zmap
EgtErase( EgtGetFirstNameInGroup( EMT.PIECES[i].Id, 'VMill') or GDB_ID.NULL)
-- recupero il solido
local nSolId = EgtGetFirstNameInGroup( EMT.PIECES[i].Id, 'RawSolid')
-- determino la risoluzione dello Zmap
local dArea = EMT.PIECES[i].Area
local dTol = 3.77
if dArea < CoeffVM * 0.07e6 then
dTol = 0.49
elseif dArea < CoeffVM * 0.15e6 then
dTol = 0.71
elseif dArea < CoeffVM * 0.3e6 then
dTol = 1.01
elseif dArea < CoeffVM * 0.6e6 then
dTol = 1.51
elseif dArea < CoeffVM * 1.2e6 then
dTol = 1.97
elseif dArea < CoeffVM * 2.4e6 then
dTol = 2.81
end
-- creo lo Zmap
local VMillId = EgtVolZmapBox( EMT.PIECES[i].Id, EMT.PIECES[i].Offs, EMT.PIECES[i].Len, EMT.PIECES[i].Wid, EMT.PIECES[i].Thk, dTol, true, GDB_RT.GLOB)
if VMillId then
EgtSetName( VMillId, 'VMill')
EgtSetLevel( VMillId, GDB_LV.TEMP)
EgtSetColor( VMillId, EgtGetColor( nSolId), false)
-- nascondo le altre geometrie
local nId = EgtGetFirstInGroup( EMT.PIECES[i].Id)
while nId do
if nId ~= VMillId then
EgtSetStatus( nId, GDB_ST.OFF)
end
nId = EgtGetNext( nId)
end
table.insert( EMT.VMILL, VMillId)
end
end
end
-- se vero inizio, assegno solidi per verifica collisione
if not EMT.SIM1ST then
EMT.CODET = {}
for i = 1, #( EMT.MCODET or {}) do
EMT.CODET[i] = EMT.MCODET[i]
end
for i = 1, #( EMT.VMILL or {}) do
table.insert( EMT.CODET, EMT.VMILL[i])
end
end
-- se fase 2
else
ExecMoveToZmax()
end
-- Nascondo tutte le lavorazioni
local nMchId = EgtGetFirstOperation()
while nMchId do
if EgtGetOperationType( nMchId) ~= MCH_OY.DISP then
EgtSetOperationStatus( nMchId, false)
end
nMchId = EgtGetNextOperation( nMchId)
end
end
---------------------------------------------------------------------
function OnSimulDispositionEnd()
-- ottengo il grezzo relativo alla fase
local bGotRawIdInfo = false
-- Aggancio grezzi alla tavola
local nRawId = EgtGetFirstRawPart()
while nRawId do
if not bGotRawIdInfo and EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
nRawIGetInfo = nRawId
bGotRawIdInfo = true
end
local nNextRawId = EgtGetNextRawPart( nRawId)
EmtLinkRawPartToGroup( nRawId, EMT.TABNAME)
nRawId = nNextRawId
end
-- se fase 1 pinzo direttamente
if EMT.PHASE == 1 then
-- carico pezzo
-- se fase 2, sposto il pezzo in nuova posizione (carrelli già in home da 'OnSimulDispositionStarting')
elseif EMT.PHASE == 2 then
-- manipolatore prende il pezzo
-- apro morse
-- manipolatore sposta il pezzo in nuova posizione
end
-- alla fine della disposizione pinzo i pezzi
ExecClampPieces()
-- manipolatore in posizione a parcheggio
EMT.OPEISDISP = false
end
---------------------------------------------------------------------
function OnSimulToolSelect()
-- se utensile non definito, è disposizione ed esco
if EMT.TOOL == '' then return end
-- recupero dati utensile
EMT.TOOLTYPE = EgtTdbGetCurrToolParam( MCH_TP.TYPE)
EMT.TOTLEN = EgtTdbGetCurrToolParam( MCH_TP.TOTLEN)
EMT.TOTDIAM = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM)
-- se attivo Vmill
SetToolForVmill( EMT.TOOL, EMT.HEAD, EMT.EXIT, EMT.VMILL)
-- se attivo Collision Check
EMT.SAFEDIST = COLL_SAFE_DIST
if EMT.COLLOBJ then
for i, Coll in ipairs( EMT.COLLOBJ) do
EmtAddCollisionObjEx( i, Coll.Fr, Coll.Ty, Coll.Mv, Coll.P1, Coll.P2, Coll.P3)
end
AddToolToCollisionObj( EMT.TOOL, EMT.HEAD, EMT.EXIT, 1001)
AddToolHolderToCollisionObj( EMT.TOOL, EMT.HEAD, EMT.EXIT, 1002)
end
-- breve pausa
EgtPause( 100)
EgtOutText( '')
end
---------------------------------------------------------------------
function OnSimulToolDeselect()
end
---------------------------------------------------------------------
function OnSimulMachiningStart()
-- recupero alcuni dati della lavorazione
EMT.MCHNAME = EgtGetOperationName( EMT.MCHID)
end
---------------------------------------------------------------------
function OnSimulMachiningEnd()
-- se ultima lavorazione, visualizzo spigoli
if not EgtGetNextActiveOperation( EMT.MCHID) then
if EMT.VMILL and #EMT.VMILL > 0 then
-- setto che voglio vedere gli spigoli
for i = 1, #EMT.VMILL do
EgtVolZmapSetShowEdges( EMT.VMILL[i], true)
end
-- aggiorno la visualizzazione
EgtDraw()
end
end
end
---------------------------------------------------------------------
function OnSimulPathStart()
end
---------------------------------------------------------------------
function OnSimulPathEnd()
-- se attivo VMILL, lavorazione ed è richiesto di eliminare gli sfridi
if EMT.VMILL and #EMT.VMILL > 0 and not EMT.OPEISDISP and EMT.VMRS then
EgtOutLog( 'OnSimulPathEnd', 5)
local vMillId = EMT.VMILL[1]
local nPart = EgtVolZmapPartCount( vMillId)
if nPart > 1 then
-- ricerca del pezzo con massimo volume
local nPartMax = 0
local dVolMax = 0
for i = 1, nPart do
local dVol = EgtVolZmapPartVolume( vMillId, i - 1)
if dVol > dVolMax then
dVolMax = dVol
nPartMax = i
end
end
-- eliminazione di tutti i pezzi piccoli
for i = nPart, 1, -1 do
if i ~= nPartMax then
local b3Vmill = EgtVolZmapGetPartBBoxGlob( vMillId, i - 1, GDB_BB.STANDARD)
if b3Vmill:getDimX() < 1200 then
EgtRemoveVolZmapPart( vMillId, i - 1)
end
end
end
-- aggiorno visualizzazione
EgtDraw()
end
end
end
---------------------------------------------------------------------
function OnSimulMoveStart()
-- muovo i carrelli assieme al pezzo
EMT.AuxAxes = 2
EMT.A1n = 'X1'
EMT.A1m = 'T'
EMT.A1 = EMT.L1
EMT.A2n = 'X2'
EMT.A2m = 'T'
EMT.A2 = EMT.L1 - EMT.X2DELTA
-- se standard
if EMT.FLAG == 0 or EMT.FLAG == 1 or EMT.FLAG == 2 then
-- se primo movimento della lavorazione, gestione speciale
if EMT.MCHFIRST then
if EMT.GROUP == 1 then
-- muovo prima i primi due assi lineari
if EMT.L1 and EMT.L2 then
SimulMoveAxes( EMT.L1n, EMT.L1, MCH_SIM_STEP.RAPID, EMT.L2n, EMT.L2, MCH_SIM_STEP.RAPID)
end
-- muovo i restanti assi lineari
SimulMoveAxes( EMT.L3n, EMT.L3, MCH_SIM_STEP.RAPID, EMT.R1n, EMT.R1, MCH_SIM_STEP.RAPROT, EMT.R2n, EMT.R2, MCH_SIM_STEP.RAPROT)
elseif EMT.GROUP == 4 then
SimulMoveAxes( EMT.L1n, EMT.L1, MCH_SIM_STEP.RAPID, EMT.L2n, EMT.L2, MCH_SIM_STEP.RAPID, EMT.R1n, EMT.R1, MCH_SIM_STEP.RAPROT, EMT.R2n, EMT.R2, MCH_SIM_STEP.RAPROT)
SimulMoveAxes( EMT.L3n, EMT.L3, MCH_SIM_STEP.RAPID)
end
EMT.MCHFIRST = false
else -- caso standard
;
end
-- se altrimenti risalita a Z max a fine lavorazione
elseif EMT.FLAG == 3 then
ExecMoveToZmax()
-- se altrimenti movimento in Home (non si muove la X)
elseif EMT.FLAG == 4 then
ExecMoveToHome()
end
end
---------------------------------------------------------------------
function OnSimulMoveEnd()
end
---------------------------------------------------------------------
function OnSimulCollision()
-- se prima collisione della lavorazione, la segnalo
if EMT.MCHNAME ~= EMT.LAST_MCHNAME_COLLIDE then
local Class = ''
if EMT.SIMCOBIND == 1001 then
Class = 'T_H1'
elseif EMT.SIMCOBIND == 1002 then
Class = 'TH_H1'
else
Class = EMT.COLLOBJ[EMT.SIMCOBIND].Cl
end
table.insert( EMT.COLLIDE, { Mc = EMT.MCHNAME, Cl = Class, Vm = EMT.SIMVMID})
EMT.LAST_MCHNAME_COLLIDE = EMT.MCHNAME
EMT.ERR = 1
local sErr = 'Mach='..EMT.MCHNAME..'; Class='..Class..'; VMill='..EMT.SIMVMID
EmtSetLastError( 1221, sErr, true)
EgtOutLog( 'Collision : ' .. sErr, 1)
end
end
---------------------------------------------------------------------
function VerifyClampWithRawX( vPiece, dPosClamp)
local CLAMP_WID = 100
if ( vPiece.OffTab:getX() < dPosClamp) and ( ( vPiece.OffTab:getX() + vPiece.Len) > ( dPosClamp + CLAMP_WID)) then
return true
end
return false
end
---------------------------------------------------------------------
function VerifyClampWithMachining( vPiece, dPosClamp)
-- QQQQQ da controllare con lavorazioni
-- per il momento ritorna sempre ok
return true
end
---------------------------------------------------------------------
function ExecClampPieces()
-- COSTANTI (da mettere in MLDE)
local DIM_CAR = 1430
local DIST_CARR_CLOSED = 90
local DIMTABY = 250
local CLAMP_INTERAX = 190
local TOT_CLAMPS_ON_CAR = 8
local TOT_CARS = 2
for i = 1, TOT_CARS do
local dDeltaCarr = EgtIf( i == 1, 0, DIM_CAR + DIST_CARR_CLOSED + EMT.X2DELTA)
for j = 1, TOT_CLAMPS_ON_CAR do
local bFront
local dPosClamp = ( j - 1) * CLAMP_INTERAX + dDeltaCarr
local bClamp = true
local bFound = false
local dPieceThikness = 0
local k = 1
while k <= #EMT.PIECES and not bFound do
bFront = EMT.PIECES[k].OffTab:getY() < DIMTABY/2
bClamp = VerifyClampWithRawX( EMT.PIECES[k], dPosClamp)
bClamp = bClamp and VerifyClampWithMachining( EMT.PIECES[k], dPosClamp)
-- al primo controllo che dice che posso pinzare, esco
if bClamp then
if EMT.PHASE == 1 then
dPieceThikness = EMT.PIECES[k].Clamp.dPhase1
else
dPieceThikness = EMT.PIECES[k].Clamp.dPhase2
end
bFound = true
end
k = k + 1
end
if ( bFront and j == 8) or ( not bFront and j == 1) then bClamp = false end
SetClamp( j, i, EgtIf( bClamp, dPieceThikness, -1))
end
end
end
---------------------------------------------------------------------
function ExecMoveToZmax()
-- posizioni home degli assi testa
local HomeZ = EgtGetAxisHomePos( 'Z1')
SimulMoveAxis( 'Z1', HomeZ, MCH_SIM_STEP.RAPID)
end
---------------------------------------------------------------------
function ExecMoveToHome()
-- salgo a ZMAX
ExecMoveToZmax()
-- posizioni home degli assi testa
local HomeY = EgtGetAxisHomePos( 'Y1')
local HomeC1 = EgtGetAxisHomePos( 'C1')
local HomeC2 = EgtGetAxisHomePos( 'C2')
SimulMoveAxes( 'Y1', HomeY, MCH_SIM_STEP.RAPID, 'C1', HomeC1, MCH_SIM_STEP.COLLROT, 'C2', HomeC2, MCH_SIM_STEP.COLLROT)
end
---------------------------------------------------------------------
-- *** ESTIMATION T&L ***
---------------------------------------------------------------------
local RAPID_X_FEED = 50000 -- mm/min
local RAPID_Y_FEED = 50000 -- mm/min
local RAPID_Z_FEED = 10000 -- mm/min
local RAPID_C_FEED = 8000 -- deg/min
local RAPID_B_FEED = 8000 -- deg/min
local RAPID_MIN_T = 0.4 -- s
local TOOL_CHANGE_T = 15 -- s
local TOOL_CHANGE_T4 = 5 -- s
local TOOL_CHANGE_TSH = 3 -- s
---------------------------------------------------------------------
function OnEstimStart()
EMT.INCHES = not EgtUiUnitsAreMM() -- unità di misura mm/inches
end
---------------------------------------------------------------------
function OnEstimEnd()
end
---------------------------------------------------------------------
function OnEstimProgramStart()
-- imposto inizio movimenti da Home
EMT.L1 = EgtGetAxisHomePos( 'X1')
EMT.L2 = EgtGetAxisHomePos( 'Y1')
EMT.L3 = EgtGetAxisHomePos( 'Z1')
EMT.R1 = EgtGetAxisHomePos( 'C1')
EMT.R2 = EgtGetAxisHomePos( 'A1')
-- aggiorno valori come precedenti
EmtUpdatePrev()
-- totalizzatori tempi e lunghezze
EMT.TOTCUTLEN = 0
EMT.TOTCUTTIME = 0
EMT.TOTCUTTIMEPR = 0
EMT.TOTCUTTIME1 = 0
EMT.TOTCUTTIME2 = 0
EMT.TOTCUTTIME3 = 0
EMT.TOTEXTLEN = 0
EMT.TOTEXTTIME = 0
EMT.TOTEXTTIME1 = 0
EMT.TOTEXTTIME2 = 0
EMT.TOTEXTTIME3 = 0
-- variabile per lunghezza taglio utensili
EMT.TOOLCUTLEN = {}
-- intestazioni
EmtTleStart( EMT.INFO)
end
---------------------------------------------------------------------
function OnEstimProgramEnd()
-- stampa dei totali delle lavorazioni
-- per il tempo utilizzo quello tra i due più lungo
-- (è ovvio che è approssimativo ma meglio che sommare il tempo delle lavorazioni di tutti i gruppi)
EMT.TOTCUTTIME = EMT.TOTCUTTIME1 + EMT.TOTEXTTIME1 + EMT.TOTCUTTIME2 + EMT.TOTEXTTIME2 + EMT.TOTCUTTIME3 + EMT.TOTEXTTIME3
EMT.TOTCUTTIMEPR = max( (EMT.TOTCUTTIME1+EMT.TOTEXTTIME1), (EMT.TOTCUTTIME2+EMT.TOTEXTTIME2), (EMT.TOTCUTTIME3+EMT.TOTEXTTIME3))
EmtTleAddTotal( EmtSecToHMS( EMT.TOTCUTTIME), EmtLenToMF( EMT.TOTCUTLEN))
-- stampa dei totali degli utensili
for i = 1, #EMT.TOOLCUTLEN do
local TCL = EMT.TOOLCUTLEN[i]
EmtTleAddTool( TCL.Name, EmtLenToMF( TCL.Len))
end
-- completo il file
local _, _, sExt = EgtSplitPath( EMT.FILE)
EmtTleEnd( sExt:sub( 2))
-- salvo i dati principali nel progetto
EgtSetInfo( EgtGetCurrMachGroup(), 'Ttot' , EgtNumToString( EMT.TOTCUTTIME, 0))
EgtSetInfo( EgtGetCurrMachGroup(), 'Ttotpr', EgtNumToString( EMT.TOTCUTTIMEPR, 0))
EgtSetInfo( EgtGetCurrMachGroup(), 'Ttot1' , EgtNumToString( (EMT.TOTCUTTIME1+EMT.TOTEXTTIME1), 0))
EgtSetInfo( EgtGetCurrMachGroup(), 'Ttot2' , EgtNumToString( (EMT.TOTCUTTIME2+EMT.TOTEXTTIME2), 0))
EgtSetInfo( EgtGetCurrMachGroup(), 'Ttot3' , EgtNumToString( (EMT.TOTCUTTIME3+EMT.TOTEXTTIME3), 0))
EgtSetInfo( EgtGetCurrMachGroup(), 'Ltot' , EgtNumToString( EMT.TOTCUTLEN, 0))
end
---------------------------------------------------------------------
function OnEstimDispositionStart()
-- inizio disposizione
EMT.OPEISDISP = true
end
---------------------------------------------------------------------
function OnEstimDispositionEnd()
-- termine disposizione
EMT.OPEISDISP = false
end
---------------------------------------------------------------------
function OnEstimToolSelect()
-- reset indice utensile in tabella lunghezze
EMT.TCLIND = 0
-- verifico che l'utensile sia definito
if #EMT.TOOL == 0 then return end
-- cerco l'utensile nella tabella
for i = 1, #EMT.TOOLCUTLEN do
if EMT.TOOLCUTLEN[i].Name == EMT.TOOL then
EMT.TCLIND = i
break
end
end
-- se non trovato, lo aggiungo
if EMT.TCLIND == 0 then
table.insert( EMT.TOOLCUTLEN, { Name = EMT.TOOL, Len = 0})
EMT.TCLIND = #EMT.TOOLCUTLEN
end
EMT.GROUP = EgtIf( EMT.HEAD == 'H8', 1, tonumber( EMT.HEAD:sub( 2, 2))) -- calcolo il gruppo per il diverso cambio di utensile
-- aggiungo tempo di cambio utensile
if EMT.GROUP == 4 then
EMT.TC_T = TOOL_CHANGE_T4
elseif EMT.GROUP == 2 or EMT.GROUP == 3 then
EMT.TC_T = TOOL_CHANGE_TSH
else
EMT.TC_T = TOOL_CHANGE_T
end
end
---------------------------------------------------------------------
function OnEstimToolDeselect()
end
---------------------------------------------------------------------
function OnEstimMachiningStart()
EMT.MCHNAME = EgtGetMachiningParam( MCH_MP.NAME)
EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE)
-- reset contatori di lavorazione
EMT.MCHCUTLEN = 0
EMT.MCHCUTTIME = 0
EMT.MCHEXTLEN = 0
EMT.MCHEXTTIME = ( EMT.TC_T or 0)
EMT.TC_T = 0
end
---------------------------------------------------------------------
function OnEstimMachiningEnd()
-- nel caso di foratura devo dimezzare la lunghezza di taglio perchè comprende anche l'uscita
if EMT.MCHTYPE == MCH_MY.DRILLING then
EMT.MCHCUTLEN = EMT.MCHCUTLEN / 2
end
local sName = EgtGetName( EMT.MCHID)
EmtTleAddMachining( sName, EmtSecToHMS( EMT.MCHCUTTIME + EMT.MCHEXTTIME), EmtLenToMF( EMT.MCHCUTLEN), EMT.TOOL)
-- aggiorno totali e utensili
EMT.TOTCUTLEN = EMT.TOTCUTLEN + EMT.MCHCUTLEN
if EMT.GROUP == 2 then
EMT.TOTCUTTIME2 = EMT.TOTCUTTIME2 + EMT.MCHCUTTIME
elseif EMT.GROUP == 3 then
EMT.TOTCUTTIME3 = EMT.TOTCUTTIME3 + EMT.MCHCUTTIME
else
EMT.TOTCUTTIME1 = EMT.TOTCUTTIME1 + EMT.MCHCUTTIME
end
-- EMT.TOTCUTTIME = EMT.TOTCUTTIME + EMT.MCHCUTTIME
if EMT.GROUP == 2 then
EMT.TOTEXTTIME2 = EMT.TOTEXTTIME2 + EMT.MCHEXTTIME
elseif EMT.GROUP == 3 then
EMT.TOTEXTTIME3 = EMT.TOTEXTTIME3 + EMT.MCHEXTTIME
else
EMT.TOTEXTTIME1 = EMT.TOTEXTTIME1 + EMT.MCHEXTTIME
end
-- EMT.TOTEXTTIME = EMT.TOTEXTTIME + EMT.MCHEXTTIME
EMT.TOTEXTLEN = EMT.TOTEXTLEN + EMT.MCHEXTLEN
EMT.TOOLCUTLEN[EMT.TCLIND].Len = EMT.TOOLCUTLEN[EMT.TCLIND].Len + EMT.MCHCUTLEN
end
---------------------------------------------------------------------
function OnEstimPathStart()
end
---------------------------------------------------------------------
function OnEstimPathEnd()
end
---------------------------------------------------------------------
function OnEstimRapid()
-- dati movimento
local dL1 = EMT.L1 - EMT.L1p
local dL2 = EMT.L2 - EMT.L2p
local dL3 = EMT.L3 - EMT.L3p
local dR1 = 0
local dR2 = 0
if EMT.R1 and EMT.R1p then dR1 = EMT.R1 - EMT.R1p end
if EMT.R2 and EMT.R2p then dR2 = EMT.R2 - EMT.R2p end
-- calcolo lunghezza
local dLen = sqrt( dL1 * dL1 + dL2 * dL2 + dL3 * dL3)
EMT.MCHEXTLEN = EMT.MCHEXTLEN + dLen
-- calcolo tempo
local dTime = RAPID_MIN_T
local dT1 = abs( dL1) / RAPID_X_FEED * 60
if dT1 > dTime then dTime = dT1 end
local dT2 = abs( dL2) / RAPID_Y_FEED * 60
if dT2 > dTime then dTime = dT2 end
local dT3 = abs( dL3) / RAPID_Z_FEED * 60
if dT3 > dTime then dTime = dT3 end
local dT4 = abs( dR1) / RAPID_C_FEED * 60
if dT4 > dTime then dTime = dT4 end
local dT5 = abs( dR2) / RAPID_B_FEED * 60
if dT5 > dTime then dTime = dT5 end
EMT.MCHEXTTIME = EMT.MCHEXTTIME + dTime
-- aggiorno valori come precedenti
EmtUpdatePrev()
end
---------------------------------------------------------------------
function OnEstimLinear()
-- dati movimento
local dL1 = EMT.L1 - EMT.L1p
local dL2 = EMT.L2 - EMT.L2p
local dL3 = EMT.L3 - EMT.L3p
-- calcolo lunghezza
local dLen = sqrt( dL1 * dL1 + dL2 * dL2 + dL3 * dL3)
EMT.MCHCUTLEN = EMT.MCHCUTLEN + dLen
-- calcolo tempo
local dTime = dLen / EMT.F * 60
EMT.MCHCUTTIME = EMT.MCHCUTTIME + dTime
-- aggiorno valori come precedenti
EmtUpdatePrev()
end
---------------------------------------------------------------------
function OnEstimArc()
-- dati movimento
local dLxy = EMT.RR * abs( EMT.AC) * pi / 180
local dLz = abs( ( Point3d( EMT.L1, EMT.L2, EMT.L3) - Point3d( EMT.L1p, EMT.L2p, EMT.L3p)) * Vector3d( EMT.EXTR))
-- calcolo lunghezza
local dLen = sqrt( dLxy * dLxy + dLz * dLz)
EMT.MCHCUTLEN = EMT.MCHCUTLEN + dLen
-- calcolo tempo
local dTime = dLen / EMT.F * 60
EMT.MCHCUTTIME = EMT.MCHCUTTIME + dTime
-- aggiorno valori come precedenti
EmtUpdatePrev()
end
+6
View File
@@ -0,0 +1,6 @@
-- Special Operations macchina Saomad Just3500 by Egalware s.r.l. 15/01/2024
-- Intestazioni
require( 'EmtGenerator')
EgtEnableDebug( false)
Binary file not shown.
+250
View File
@@ -0,0 +1,250 @@
-- Disposition Init for Saomad Just3500 2024/02/07
-- Intestazioni
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
--------------------------------------------------------------------------------
-- Colore del grezzo
local ColA = Color3d( 255, 165, 0, 30)
--------------------------------------------------------------------------------
-- COSTANTI
local DIM_CAR = 1430
local DIST_CARR_OPEN = 470
local DIMTABY = 250
local MAXDIMPIECE1CAR = 1500
local TABNAME_1PZ = 'Tab'
local TABNAME_2PZ = 'Tab2'
-- Variabili globali modulo
local vPiece = {}
--------------------------------------------------------------------------------
-- * Verifica esistenza MachGroup *
if not EgtGetCurrMachGroup() then
EgtOutLog( 'InitDisp for Saomad-Just3500 : missing CurrMachGroup')
DISP.ERR = 1
return
end
-------------------------------------------------------------------------------------------------------------
-- recupero i pezzi da processare
function MyProcessInputData()
-- controllo che esista il pezzo
local nIdpz = DISP.PARTID
if not nIdpz or nIdpz == GDB_ID.NULL then
DISP.ERR = 0
return false
end
-- Recupero i dati del pezzo
local nId = EgtGetFirstNameInGroup( nIdpz, 'Solid')
if not nId then
EgtOutBox( 'SOLID non definito per pezzo: ' .. EgtGetName( nIdpz), 'Info', 'ERROR')
return false
end
-- salvo i pezzi in lista
local vsPiece = EgtSplitString( DISP.PARTS)
for i = 1, #vsPiece do
table.insert( vPiece, { Ind = #vPiece + 1, Id = tonumber( vsPiece[i]), Name = ( EgtGetName( vsPiece[i]) or ( 'Id=' .. tonumber( vsPiece[i])))})
local Ls = EgtGetFirstNameInGroup( vPiece[i].Id, 'Box')
local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD)
if not b3Solid then
EgtOutBox( 'Box non definito per il pezzo ' .. vPiece[i].Name, 'Lavora Pezzi', 'ERROR')
return false
else
vPiece[i].Box = b3Solid
vPiece[i].Len = vPiece[i].Box:getDimX()
vPiece[i].Wid = vPiece[i].Box:getDimY()
end
end
return true
end
-------------------------------------------------------------------------------------------------------------
-- operazione sui pezzi
function MyProcessPieces()
--------------------------------------------------------------------------------
-- *** Disposizione ***
-- scelta della configurazione tavola in base al numero di pezzi
if not vPiece or #vPiece > 2 then
EgtOutBox( 'ATTENZIONE : massimo due pezzi per macchinata', 'Lavora Pezzi', 'ERROR')
return false
-- se ho un pezzo
elseif #vPiece == 1 then
EgtSetTable( TABNAME_1PZ)
-- se ho due pezzi
else
EgtSetTable( TABNAME_2PZ)
end
-- controllo che le dimensioni siano compatibili
if #vPiece == 1 then
if vPiece[DISP.IND].Len > ( DIM_CAR + DIST_CARR_OPEN + DIM_CAR) then
EgtOutBox( 'ATTENZIONE : pezzo troppo lungo', 'Lavora Pezzi', 'ERROR')
return false
end
else
if vPiece[DISP.IND].Len > MAXDIMPIECE1CAR then
EgtOutBox( 'ATTENZIONE : pezzo ' .. vPiece[DISP.IND].Name .. ' troppo lungo', 'Lavora Pezzi', 'ERROR')
return false
end
end
-- dati di default
local sHeadSporgF1 = '40'
local sHeadSporgF2 = '40'
local sSideSporgF1 = '40'
local sSideSporgF2 = '40'
local sPosZF1 = '0'
local sPosZF2 = '0'
-- cerco se ci sono delle note di offset sul pezzo
local dHeadSporgF1 = nil
local dHeadSporgF2 = nil
local dSideSporgF1 = EgtGetInfo( vPiece[DISP.IND].Id, 'OFFY_1', 'd')
local dSideSporgF2 = EgtGetInfo( vPiece[DISP.IND].Id, 'OFFY_2', 'd')
local dPosZF1 = EgtGetInfo( vPiece[DISP.IND].Id, 'OFFZ_1', 'd')
local dPosZF2 = EgtGetInfo( vPiece[DISP.IND].Id, 'OFFZ_2', 'd')
local bInsertAllOffs = false
-- se non tutti gli offset Y-Z sono settati, avviso e poi chiedo tutti i dati
if not( dSideSporgF1 and dSideSporgF2 and dPosZF1 and dPosZF2) then
EgtOutBox( 'OFFSET di posizionamento non trovati. Inserire tutti i dati per calcolo posizionamento', 'ATTENZIONE PEZZO : ' .. vPiece[DISP.IND].Name, 'WARNING', 'OK')
bInsertAllOffs = true
end
-- assegno alle stringhe i valori letti, in modo che vengano proposti quelli nel dialogo
sHeadSporgF1 = EgtIf( dHeadSporgF1, tostring( dHeadSporgF1), '40')
sHeadSporgF2 = EgtIf( dHeadSporgF2, tostring( dHeadSporgF2), '40')
sSideSporgF1 = EgtIf( dSideSporgF1, tostring( dSideSporgF1), '40')
sSideSporgF2 = EgtIf( dSideSporgF2, tostring( dSideSporgF2), '40')
sPosZF1 = EgtIf( dPosZF1, tostring( dPosZF1), '0')
sPosZF2 = EgtIf( dPosZF2, tostring( dPosZF2), '0')
-- se devo inserire tutti gli offset
if bInsertAllOffs then
local vInp = EgtDialogBox( 'Dati di disposizione pezzo: ' .. vPiece[DISP.IND].Name,
{'Sporgenza Testa FASE1', sHeadSporgF1}, {'Sporgenza laterale FASE1', sSideSporgF1}, {'Posizione Z FASE1', sPosZF1},
{'Sporgenza Testa FASE2', sHeadSporgF2}, {'Sporgenza laterale FASE2', sSideSporgF2}, {'Posizione Z FASE2', sPosZF2})
if not vInp or #vInp == 0 then
DISP.ERR = 100
return
end
-- salvo input nei valori che utilizzerò dopo
dHeadSporgF1 = tonumber( vInp[1])
dSideSporgF1 = tonumber( vInp[2])
dPosZF1 = tonumber( vInp[3])
dHeadSporgF2 = tonumber( vInp[4])
dSideSporgF2 = tonumber( vInp[5])
dPosZF2 = tonumber( vInp[6])
else
local vInp = EgtDialogBox( 'Dati di disposizione pezzo: ' .. vPiece[DISP.IND].Name, {'Sporgenza Testa FASE1', sHeadSporgF1}, {'Sporgenza Testa FASE2', sHeadSporgF2})
if not vInp or #vInp == 0 then
DISP.ERR = 100
return
end
dHeadSporgF1 = tonumber( vInp[1])
dHeadSporgF2 = tonumber( vInp[2])
end
local dPosX = 0
local dPosY = 0
local dPosZ = 0
local dOverMat = 0
local nRawID
local vtOffs = Vector3d( 0, 0, 0)
-- PRIMA FASE
EgtSetCurrPhase( 1)
-- Abilito Vmill
EgtSetInfo( EgtGetCurrMachGroup(), 'Vm', '1')
-- posizionamento pezzi prima fase
-- setto gli offset iniziali
if DISP.IND == 2 then dPosX = DIM_CAR + DIST_CARR_OPEN end
dPosX = dPosX - dHeadSporgF1
dPosY = dPosY - dSideSporgF1
dPosZ = dPosZF1
vtOffs = Vector3d( dPosX, dPosY, dPosZ)
-- Definizione e posizionamento del grezzo
if vPiece[DISP.IND].Raw then
nRawID = EgtAddRawPartWithPart( vPiece[DISP.IND].Id, vPiece[DISP.IND].Raw, 0, ColA)
EgtSetStatus( Er, GDB_ST.ON)
else
nRawID = EgtAddRawPartWithPart( vPiece[DISP.IND].Id, GDB_ID.NULL, dOverMat, ColA)
end
if not nRawID then
EgtOutLog( 'InitDisp for Saomad-Just3500 : error defining raw part')
DISP.ERR = 3
return false
end
-- ammetto di uscire dalla tavola dello sbordo calcolato
EgtSetTableAreaOffset( 100, 100, 100, 100)
if not EgtMoveToCornerRawPart( nRawID, vtOffs, MCH_CR.BL) then
EgtOutLog( 'InitDisp for Saomad-Just3500 : error positioning raw part on table')
DISP.ERR = 4
return false
end
-- creo la seconda fase se primo pezzo
if DISP.IND == 1 then
EgtAddPhase()
-- altrimenti setto la due come corrente
else
EgtSetCurrPhase( 2)
end
-- ammetto di uscire dalla tavola dello sbordo calcolato
EgtSetTableAreaOffset( 100, 100, 100, 100)
-- posizionamento pezzi seconda fase
-- reset offset
dPosX = 0 ; dPosY = DIMTABY ;
-- se sono al secondo pezzo da inserire, lo metto sul secondo carrello
if DISP.IND == 2 then
dPosX = DIM_CAR + DIST_CARR_OPEN + DIM_CAR
-- se primo pezzo
else
if vPiece[DISP.IND].Len > MAXDIMPIECE1CAR then
dPosX = DIM_CAR + DIST_CARR_OPEN + DIM_CAR
else
dPosX = DIM_CAR
end
end
EgtKeepRawPart( nRawID)
dPosX = dPosX - vPiece[DISP.IND].Len + dHeadSporgF2
dPosY = dPosY - vPiece[DISP.IND].Wid + dSideSporgF2
dPosZ = dPosZF2
vtOffs = Vector3d( dPosX, dPosY, dPosZ)
EgtMoveToCornerRawPart( nRawID, vtOffs, MCH_CR.BL)
DISP.ERR = 0
return true
end
-------------------------------------------------------------------------------------------------------------
-- operazioni sulle lavorazioni
function MyProcessFeatures()
-- per il momento non applico lavorazioni
return true
end
-------------------------------------------------------------------------------------------------------------
-- *** Esecuzione ***
-------------------------------------------------------------------------------------------------------------
if not MyProcessInputData() then return end
if not MyProcessPieces() then return end
if not MyProcessFeatures() then return end
+44
View File
@@ -0,0 +1,44 @@
-- 2018/11/21 16:30:00
-- Machining Init for Essetre-FAST machine
-- Intestazioni
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
--------------------------------------------------------------------------------
-- *** Ingresso in Lavorazioni ***
-- Rendo visibile il pezzo e le geometrie aggiunte, nascondo il Box
local function ProcessPart( PartId)
-- nascondo il Box
EgtSetStatus( EgtGetFirstNameInGroup( PartId, 'Box') or GDB_ID.NULL, GDB_ST.OFF)
end
-- Disabilito segnalazione modifica progetto
local bEnMod = EgtGetEnableModified()
EgtDisableModified()
-- Processo i pezzi nella radice
local PartId = EgtGetFirstPart()
while PartId do
ProcessPart( PartId)
PartId = EgtGetNextPart( PartId)
end
-- Processo i pezzi già nei gruppi di lavoro (quando appena lanciata Process)
local GhostId = EgtGetFirstGhostPart()
while GhostId do
local PartId = EgtGetInfo( GhostId, GDB_SI.SOURCE, 'i')
if PartId then
ProcessPart( PartId)
end
GhostId = EgtGetNextGhostPart( GhostId)
end
-- Ripristino segnalazione modifica progetto
if bEnMod then
EgtEnableModified()
end
MACH.ERR = 0
+211
View File
@@ -0,0 +1,211 @@
-- by Egalware s.r.l. 2024/01/15
-- Gestione attrezzaggio
-- 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 = "H11", Group = "G1"},
{Pos = "Pos2", TcPos = "T102", Head = "H11", Group = "G1"},
{Pos = "Pos3", TcPos = "T103", Head = "H11", Group = "G1"},
{Pos = "Pos4", TcPos = "T104", Head = "H11", Group = "G1"},
{Pos = "Pos5", TcPos = "T105", Head = "H11", Group = "G1"},
{Pos = "Pos6", TcPos = "T106", Head = "H11", Group = "G1"},
{Pos = "Pos7", TcPos = "T107", Head = "H11", Group = "G1"},
{Pos = "Pos8", TcPos = "T108", Head = "H11", Group = "G1"},
{Pos = "Pos9", TcPos = "T109", Head = "H11", Group = "G1"},
{Pos = "Pos10", TcPos = "T110", Head = "H11", Group = "G1"},
{Pos = "Pos11", TcPos = "T111", Head = "H11", Group = "G1"},
{Pos = "Pos12", TcPos = "T112", Head = "H11", Group = "G1"},
{Pos = "Pos13", TcPos = "T113", Head = "H11", Group = "G1"},
{Pos = "Pos14", TcPos = "T114", Head = "H11", Group = "G1"},
{Pos = "Pos15", TcPos = "T115", Head = "H11", Group = "G1"},
{Pos = "Pos16", TcPos = "T116", Head = "H11", Group = "G1"},
{Pos = "Pos17", TcPos = "T117", Head = "H11", Group = "G1"},
{Pos = "Pos18", TcPos = "T118", Head = "H11", Group = "G1"},
{Pos = "Pos19", TcPos = "T119", Head = "H11", Group = "G1"},
{Pos = "Pos20", TcPos = "T120", Head = "H11", Group = "G1"},
{Pos = "Pos21", TcPos = "T201", Head = "H21", Group = "G2"},
{Pos = "Pos22", TcPos = "T301", Head = "H31", Group = "G3"},
{Pos = "Pos23", TcPos = "T401", Head = "H41", Group = "G4"}}
local UsePositionHead = false
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
+164
View File
@@ -0,0 +1,164 @@
-- WinData.lua by Egalware s.r.l. 2024/06/13
-- Raccolta dati generali per Serramenti
EgtOutLog( ' Just3500-WinData started', 1)
-- Tabella per definizione modulo
local WinData = {
-- COSTANTI
MACH_TYPE = 'LINE',
FIRST_PHASE_LOAD = 'PUSH',
DIM_CAR = 1430,
DIST_CARR_OPEN = 470,
DIST_CARR_CLOSE = 90,
DIMTABY = 250,
MAXDIMPIECE1CAR = 1500,
TABNAME_1PZ = 'Tab',
TABNAME_2PZ = 'Tab2',
PART_ALIGN = Vector3d( 1, 0, 0)
}
---------------------------------------------------------------------
-- Verifica che i pezzi da processare siano compatibili con la configurazione della macchina
---------------------------------------------------------------------
local function VerifyPieces( PARTS)
if not PARTS or #PARTS > 2 then
EgtOutBox( 'ATTENZIONE : massimo due pezzi per macchinata', 'Lavora Pezzi', 'ERROR')
return false
end
-- controllo che le dimensioni siano compatibili
for i = 1, #PARTS do
if #PARTS == 1 then
if PARTS[i].dPartLength > ( WinData.DIM_CAR + WinData.DIST_CARR_OPEN + WinData.DIM_CAR) then
EgtOutBox( 'ATTENZIONE : pezzo troppo lungo', 'Lavora Pezzi', 'ERROR')
return false
end
else
if PARTS[i].dPartLength > WinData.MAXDIMPIECE1CAR then
EgtOutBox( 'ATTENZIONE : pezzo ' .. PARTS[i].sName .. ' troppo lungo', 'Lavora Pezzi', 'ERROR')
return false
end
end
end
return true
end
WinData.VerifyPieces = VerifyPieces
---------------------------------------------------------------------
-- Dispone i pezzi in macchina
---------------------------------------------------------------------
local function ExecDisposition( PARTS)
-- si verifica che i pezzi selezionati siano compatibili con la macchina
VerifyPieces( PARTS)
-- se ho un pezzo
if #PARTS == 1 then
EgtSetTable( WinData.TABNAME_1PZ)
-- se ho due pezzi
else
EgtSetTable( WinData.TABNAME_2PZ)
end
-- fase 1 (non serve creare fase 1 perchè già presente alla creazione del machgroup)
EgtSetCurrPhase( 1)
for i = 1, #PARTS do
local dPosX = 0
local dPosY = 0
local dPosZ = 0
-- posizionamento pezzi prima fase
-- setto gli offset iniziali
if i == 2 then dPosX = WinData.DIM_CAR + WinData.DIST_CARR_OPEN end
dPosX = dPosX - PARTS[i].OffsetPartToRaw.X
dPosY = - PARTS[i].OffsetPartToRaw.Y - PARTS[i].DispOffsets.Phase1.dOffsetY
dPosZ = 0
local vtOffs = Vector3d( dPosX, dPosY, dPosZ)
-- ammetto di uscire dalla tavola dello sbordo calcolato
EgtSetTableAreaOffset( 100, 100, 100, 100)
EgtSetStatus( PARTS[i].idRaw, GDB_ST.ON)
if not EgtMoveToCornerRawPart( PARTS[i].idRaw, vtOffs, MCH_CR.BL) then
EgtOutLog( 'InitDisp for Saomad-Just3500 : error positioning raw part on table')
return false
end
end
-- fase 2
EgtAddPhase()
EgtSetCurrPhase( 2)
for i = 1, #PARTS do
-- ammetto di uscire dalla tavola dello sbordo calcolato
EgtSetTableAreaOffset( 100, 100, 100, 100)
-- posizionamento pezzi seconda fase
-- reset offset
local dPosX = 0
local dPosY = WinData.DIMTABY
local dPosZ = 0
-- se sono al secondo pezzo da inserire, lo metto sul secondo carrello
if i == 2 then
dPosX = WinData.DIM_CAR + WinData.DIST_CARR_OPEN + WinData.DIM_CAR
-- se primo pezzo
else
if PARTS[i].dPartLength > WinData.MAXDIMPIECE1CAR then
dPosX = WinData.DIM_CAR + WinData.DIST_CARR_CLOSE + WinData.DIM_CAR
else
dPosX = WinData.DIM_CAR
end
end
EgtKeepRawPart( PARTS[i].idRaw)
dPosX = dPosX - PARTS[i].dPartLength - PARTS[i].OffsetPartToRaw.X
dPosY = dPosY - PARTS[i].dPartWidth - PARTS[i].OffsetPartToRaw.Y + PARTS[i].DispOffsets.Phase2.dOffsetY
dPosZ = PARTS[i].DispOffsets.Phase2.dOffsetZ
local vtOffs = Vector3d( dPosX, dPosY, dPosZ)
EgtMoveToCornerRawPart( PARTS[i].idRaw, vtOffs, MCH_CR.BL)
end
return true
end
WinData.ExecDisposition = ExecDisposition
---------------------------------------------------------------------
-- Info che dipendono dal setup dell'utensile e configurazione macchina
---------------------------------------------------------------------
local function GetSetupInfo( ToolData)
local SetupInfo = {}
-- dati comuni
SetupInfo.bToolOnAggregate = false
-- testa 1 ( testa verticale con asse rotante per rinvii con CU)
if ToolData.sHead == 'H11' then
SetupInfo.nNumberOfAxis = 4
SetupInfo.bIsVerticalHead = true
SetupInfo.bIsHorizontalHead = not SetupInfo.bIsVerticalHead
-- testa 2 ( 4 uscite orizzontali rotanti)
elseif ToolData.sHead == 'H21' then
SetupInfo.nNumberOfAxis = 4
SetupInfo.nAxisNumber = 4
SetupInfo.bIsHorizontalHead = true
SetupInfo.bIsVerticalHead = not SetupInfo.bIsHorizontalHead
-- testa 3 ( 2 uscite orizzontali fisse)
elseif ToolData.sHead == 'H31' then
SetupInfo.nNumberOfAxis = 3
SetupInfo.bIsHorizontalHead = true
SetupInfo.bIsVerticalHead = not SetupInfo.bIsHorizontalHead
-- testa 4 ( testa verticale fissa)
elseif ToolData.sHead == 'H41' then
SetupInfo.nNumberOfAxis = 3
SetupInfo.bIsVerticalHead = true
SetupInfo.bIsHorizontalHead = not SetupInfo.bIsVerticalHead
end
return SetupInfo
end
WinData.GetSetupInfo = GetSetupInfo
---------------------------------------------------------------------
return WinData