65 Commits

Author SHA1 Message Date
andrea.villa 54f5c7e488 Commentata chiamata alla funzionalità per attivare i supporti perchè questa macchina ne è sprovvista 2026-04-29 11:06:29 +02:00
andrea.villa 62d5cefb35 Corretta scrittura step per ripartenza 2026-04-28 17:10:17 +02:00
andrea.villa 913be3f3e7 - Se unload , rimossa risalita a ZMAX
- GEOAX sempre riscritto se stato non coerente
2026-04-28 15:54:31 +02:00
andrea.villa 898380b4ba - Aggiunta nuova variabile PLC
- Selezione X2 dopo uno split
2026-04-28 14:53:56 +02:00
andrea.villa ec79024eb3 Anticipo movimento di carico ( che viene messo su canale 2) prima del movimento testa 2026-04-28 13:38:15 +02:00
andrea.villa f9fb148fd8 Messe funzioni vecchie per lavorazioni in doppio 2026-04-27 17:28:58 +02:00
andrea.villa 6780390b28 Prima versione generazione per rimanere basso su pezzo in caso non ci sia cambio carrelli 2026-04-27 16:56:58 +02:00
andrea.villa 482e6fb281 Per info ID pezzo e barra si cerca prima sul MachGroup. DA VERIFICARE 2026-04-23 17:00:30 +02:00
andrea.villa ef60e7916c Se split è ultima lavorazione, allo scarico si mette X2 come asse X 2026-04-23 15:28:14 +02:00
andrea.villa d89163d208 - corretto calcolo posizionamento carrelli in caso di passo pellegrino con recupero completo di una singola pinza
- corretta scrittura paraemtri per precarico
2026-04-23 11:50:12 +02:00
luca.mazzoleni 8cd916754f - in mlde e BeamDataNew correzioni per sega a catena 2026-03-26 16:18:33 +01:00
andrea.villa 3188a7c976 Piccola correzione riposizionamento pinze 2026-03-23 12:53:49 +01:00
andrea.villa 3da0b82f13 Cambio nome macchina con suffisso MK2 2026-03-18 15:26:31 +01:00
andrea.villa ff8d632c04 Merge branch 'New_POSIZ_T' into develop 2026-03-18 15:17:29 +01:00
andrea.villa 7a565f0618 - Ripristinati i nomi originale. Successivamente rinomineremo le versioni macchina con MKx
- Corretto BeamDataNew per asse rotante virtuale motosega
2026-03-18 12:32:06 +01:00
andrea.villa fa0be99e58 Cambio nome macchina in KAIROS025 2026-03-17 16:50:42 +01:00
andrea.villa aa61e122df Migliorie varie ad algoritmo riposizionamento carrelli 2026-03-17 16:41:59 +01:00
andrea.villa 8195fe4d3e Piccola correzione nella stima tempi 2026-03-16 14:25:07 +01:00
andrea.villa 414434ae28 Cambio versione per rilascio a cliente 2026-03-13 09:37:41 +01:00
andrea.villa aa49d110ef - Correto primo scambio pinze
- Corretto scambio pinze quando la prima lavorazione è il taglio di split
- Calcolo tempi adeguati ai primi test fatti in macchina
2026-03-12 17:25:15 +01:00
andrea.villa 89aaa5941f Aggiunti TRANS e STOPRE prima del movimento YAC diretto 2026-03-11 16:56:35 +01:00
andrea.villa 42b9cac647 Corretta scrittura valori A e C 2026-03-11 16:45:39 +01:00
andrea.villa 07f37a21e6 - Non si utilizza più POSIZ_YAC, ma si scrivono le coordinate direttamente
- Rimosso SUPA con Z sicurezza a inizio lavorazione se non a ZMAX
- Scrittura ENDIF in file dei posizionamenti
2026-03-11 16:39:18 +01:00
andrea.villa 761653699d Aggiunta gestione per evitare ripinzaggio in testa al pezzo successivo. Se la posizone calcolata è oltre quella attuale, si tiene quella 2026-03-11 15:58:26 +01:00
andrea.villa facb55621a - Separazione del pezzo con movimento asincrono
- Prima della separazione, posiziona X1 in posizione corretta per lavorare la testa della trave successiva, senza bisogno di riposizionare.
2026-03-11 14:47:29 +01:00
andrea.villa 16eb684d4e - Rimosse alcune attese del canale 2
- Aggiunti alcuni comandi STOPRE per sincronizzare lettura e non andare avanti con pre-lettura
2026-03-11 10:21:33 +01:00
andrea.villa 26596555ee Modifica file POSIZ con salti 2026-03-10 17:07:44 +01:00
andrea.villa e574a01ff5 In PrepareUnload, si chiama una funzionalità diversa in base a dove si vuol fare eseguire i comandi, processo 1 o processo 2 2026-03-10 10:01:01 +01:00
andrea.villa f559be5e4a Macro per carico anticipato spostata dopo GEOAX 2026-03-09 16:42:42 +01:00
andrea.villa 4c62569373 - Nei parametri per precarico si passa anche feed e accelerazione (per ora fissi, poi da calcolare su dimensioni barra )
- Scrittura del POSIZ_T(1) in caso di precarico subito dopo primo movimento assi
- Anticipata chiamata precarico
2026-03-09 14:44:32 +01:00
andrea.villa f3c41b1b80 Aggiunta chiamata precarico 2026-03-09 10:06:15 +01:00
andrea.villa 043478e7b9 - Durante spostamento differenziato feed pinza in presa da quella senza pezzo
- Piccola correzione gestione pinzaggi ottimizzati
2026-03-09 09:31:58 +01:00
andrea.villa 8a707155e7 - Aumentata feed massima pinze
- Ripristinato uso _POSIZ_YAC
- Piccole correzioni in chiusura file
- Modificato intro file dei posizionamenti
- Cambio versione per rilascio aa Saomad
2026-03-06 16:14:51 +01:00
andrea.villa ca80f2950b Info PreviewShow spostata direttamente su NGE 2026-03-06 15:00:44 +01:00
andrea.villa fd9439452d Salvataggio stato pinze per scrivere comando GRIPPER solo se necessario 2026-03-06 14:40:45 +01:00
andrea.villa 41df1c1e24 - Aggiunta definizione variabile JUMP in file POSIZ
- Rimosse info per salirte a Z massima con rotazione assi rotanti
2026-03-06 13:32:49 +01:00
andrea.villa 719864ee49 1 - POSIZ_YAC sostituita con una semplice G1 (ora gli assi sono interpolati)
2 - In MLDE note per preview utensile nel MACH
2026-03-06 10:17:05 +01:00
andrea.villa 183c3e2e06 - Scrittura parametri per precarico (chiamata ancora da fare in attesa di Aedifica)
- Tolti da POSIZ_T funz.77 i parametri inutili
2026-03-05 16:53:29 +01:00
andrea.villa e07e222ec3 - Funzione EgtGetSourceDir sostituita con EgtGetCurrMachineDir per macchian compilata
- In movimento pinze durante riposizionamento, cambio scrittura per comandare ogni pinza alla propria velocità
2026-03-05 15:00:11 +01:00
luca.mazzoleni 163729319a - aggiunto compile 2026-03-05 11:56:15 +01:00
luca.mazzoleni f49747ac94 Merge branch 'develop' into New_POSIZ_T 2026-03-05 11:43:48 +01:00
andrea.villa 949d44011f Aggiunta MyEmtOutput per posticipare scrittura comandi fino ad avere tutti i dati per precarico.
Recupero dati ancora da fare
2026-03-05 11:43:06 +01:00
luca.mazzoleni 442d37e8e2 - update BeamDataNew con SAFE_DIM_DICE 2026-03-05 11:42:43 +01:00
andrea.villa 5e51c37da0 - Gestione comandi pre e post rotazione del pezzo
- Aggiunti nuovi link
2026-03-03 16:38:19 +01:00
andrea.villa 5f8e1d47f1 Prima versione scrittura secondo file con posizionamento carrelli 2026-03-03 12:13:55 +01:00
andrea.villa 225aef964e Merge branch 'NewClamping' into develop 2026-03-03 08:13:51 +01:00
andrea.villa 8a82349ea7 Piccola correzione movimenti rapido 2026-02-24 17:13:14 +01:00
andrea.villa 2451607d90 Corretto pinzaggio in caso sia in presa una sola pinza 2026-02-12 08:42:15 +01:00
andrea.villa e93405a828 Rimossa gestione MAXLENLEFT 2026-01-28 16:00:40 +01:00
andrea.villa 27ec467b40 Corretto salvataggio variabili 2026-01-28 15:39:02 +01:00
andrea.villa 6d4b1b0254 - Corretto calcolo scarico pezzo per rotazione
- Corretto mancato aggiornamento posizione carrelli in caso di raggruppamento di più lavorazioni
2026-01-28 13:47:03 +01:00
andrea.villa d2b8530c30 Migliorie varie 2026-01-28 12:22:08 +01:00
andrea.villa cce36780c2 - Aggiunte variabili pinzaggio
- Piccole correzioni
2026-01-23 17:03:47 +01:00
andrea.villa ff7a1ed430 - Migliorie a nuovo riposizionamento
- Aggiunto caso di riposizionamento X2->X1+X2 in tre movimenti
2026-01-23 14:33:21 +01:00
andrea.villa 2458fcba22 - Piccole correzioni nuovo calcolo posizioni di clamping
- Tolta chiamata debug
2026-01-23 09:40:36 +01:00
andrea.villa 00b46b98d6 Prima versione (non funzionante) del nuovo pinzaggio 2026-01-22 17:23:15 +01:00
andrea.villa 4f38f2805e Rimossa vecchia gestione riposizionamento carrelli, ora presente solo NEWCLAMPING 2026-01-20 08:18:10 +01:00
andrea.villa 653eb2dadb Merge remote-tracking branch 'origin/newMachineClamping' into develop 2026-01-19 09:00:21 +01:00
daniele.nicoli 3044f43826 - Altri nomi variabili
- Corretta ClampCheck con nuove variabili impostabili da mlde e gestione angolo pinza diverso da 45°
2026-01-19 08:54:58 +01:00
daniele.nicoli 11e76bd5a7 Modificati nomi variabili EMT/EMC.LB, HB, SB, LR... 2026-01-15 12:19:54 +01:00
daniele.nicoli adee9b835c Merge remote-tracking branch 'origin/main' into newClampCheck 2026-01-15 08:58:43 +01:00
daniele.nicoli ef9a446830 Altre modifiche ai nomi delle variabili 2026-01-15 08:56:25 +01:00
daniele.nicoli fabcacaea0 - Modifica nomi variabili/funzioni
- Aggiornamento a stato "Fast"
- Aggiornato funzionamento carrelli (versione OLD ancora presente)
2026-01-14 13:47:29 +01:00
daniele.nicoli 2600eb720a - Aggiunta funzione ClampCheck come su Fast
- Spostata funzione UpdateMinJoin da mlse a mlde
2025-12-23 15:01:47 +01:00
daniele.nicoli 4665f4cfa6 Merge branch 'main' into develop 2025-12-23 09:25:59 +01:00
13 changed files with 4930 additions and 5158 deletions
+86 -1
View File
@@ -96,6 +96,91 @@
"EgtGetOperationPhase", "EgtGetOperationPhase",
"EgtSetOperationMode", "EgtSetOperationMode",
"EgtSetCalcTool", "EgtSetCalcTool",
"EmtModifyAxisStroke" "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"
] ]
} }
+1350 -555
View File
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -59,11 +59,12 @@ local BeamData = {
MAXDIAM_POCK_CORNER = 30, -- diametro massimo utensile ammesso per tasche con angoli interni 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_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) ADVANCE_TAIL_OFFS = 5, -- accorciamento taglio di coda avanzato (minimo 1)
STRATEGIES_CONFIG_FILE = 'Std2.json' STRATEGIES_CONFIG_FILE = 'Std2.json',
FASTCLAMPING = false
} }
-- Aggiornamento con dati da B&W -- Aggiornamento con dati da B&W
local sData = EgtGetSourceDir().."EbwData.lua" local sData = EgtGetCurrMachineDir().."\\Beam\\EbwData.lua"
if EgtExistsFile( sData) then if EgtExistsFile( sData) then
local Machine = dofile( sData) local Machine = dofile( sData)
if Machine then if Machine then
+10 -7
View File
@@ -22,9 +22,7 @@ local BeamData = {
OVM_MID = 5.4, -- sovramateriale intermedio (spessore lama) OVM_MID = 5.4, -- sovramateriale intermedio (spessore lama)
MINRAW_S = 750, -- minimo grezzo in coda scaricabile per sezioni piccole MINRAW_S = 750, -- minimo grezzo in coda scaricabile per sezioni piccole
MINRAW_L = 1070, -- minimo grezzo in coda scaricabile per sezioni grandi MINRAW_L = 1070, -- minimo grezzo in coda scaricabile per sezioni grandi
MAX_DIM_HTCUT = 130, -- SOLO DICE larghezza massima taglio di testa o coda SAFE_DIM_DICE = 110, -- dimensione trasversale ridotta cubetto, valida in tutte le posizioni
MIN_DIM_HBEAM = 621, -- SOLO DICE altezza minima di trave alta
MAX_DIM_DICE = 110, -- dimensione trasversale massima cubetto
MAX_LEN_DICE = 400, -- SOLO DICE lunghezza massima cubetto MAX_LEN_DICE = 400, -- SOLO DICE lunghezza massima cubetto
COLL_SIC = 5, -- distanza di sicurezza per collisioni COLL_SIC = 5, -- distanza di sicurezza per collisioni
CUT_SIC = 20, -- distanza di sicurezza per tagli CUT_SIC = 20, -- distanza di sicurezza per tagli
@@ -40,6 +38,7 @@ local BeamData = {
VICE_MINH = 110, -- altezza minima della morsa VICE_MINH = 110, -- altezza minima della morsa
VICE_MAXH = 370, -- altezza massima zona pinzaggio orizzontale VICE_MAXH = 370, -- altezza massima zona pinzaggio orizzontale
USER_HOLE_DIAM = 0, -- diametro foro per L20 USER_HOLE_DIAM = 0, -- diametro foro per L20
FASTCLAMPING = false
} }
-- costanti riportate da mlde non necessarie per automatismo (sostituire con GetParameters o simile) -- costanti riportate da mlde non necessarie per automatismo (sostituire con GetParameters o simile)
@@ -55,7 +54,7 @@ MldeParameters.DeltaTabZ = 0
-- Aggiornamento con dati macchina personalizzati -- Aggiornamento con dati macchina personalizzati
-- TODO sostituire con GetParameters o simile -- TODO sostituire con GetParameters o simile
local sData = EgtGetSourceDir().."EbwData.lua" local sData = EgtGetCurrMachineDir().."\\Beam\\EbwData.lua"
if EgtExistsFile( sData) then if EgtExistsFile( sData) then
local Machine = dofile( sData) local Machine = dofile( sData)
if Machine then if Machine then
@@ -94,9 +93,9 @@ local function GetBlockedAxis( sHead, nToolType, sBlockedAxis)
elseif nToolType == MCH_TY.MORTISE_STD then elseif nToolType == MCH_TY.MORTISE_STD then
if sHead == 'H3' then if sHead == 'H3' then
if sBlockedAxis == 'parallel' then if sBlockedAxis == 'parallel' then
return 'A=0' return 'CS=-90'
elseif sBlockedAxis == 'perpendicular' then elseif sBlockedAxis == 'perpendicular' then
return 'A=90' return 'CS=0'
end end
else else
return '' return ''
@@ -271,7 +270,7 @@ local function GetSetupInfo( sHead)
SetupInfo.dCAxisSideEncumbrance = 200 SetupInfo.dCAxisSideEncumbrance = 200
SetupInfo.bToolOnAggregate = false SetupInfo.bToolOnAggregate = false
SetupInfo.vtRotationAxisC = EgtGetAxisDir( 'C') SetupInfo.vtRotationAxisC = EgtGetAxisDir( 'C')
SetupInfo.vtRotationAxisAB = EgtGetAxisDir( 'B') SetupInfo.vtRotationAxisAB = EgtGetAxisDir( 'A')
-- TODO da rimuovere quando si fara PreSimulation di asse Z per frese -- TODO da rimuovere quando si fara PreSimulation di asse Z per frese
SetupInfo.dPivot = MldeParameters.MillOffs SetupInfo.dPivot = MldeParameters.MillOffs
@@ -283,6 +282,10 @@ local function GetSetupInfo( sHead)
SetupInfo.GetMinNz = GetMinNzTopHead SetupInfo.GetMinNz = GetMinNzTopHead
SetupInfo.GetPreCollisionData = GetPreCollisionData SetupInfo.GetPreCollisionData = GetPreCollisionData
SetupInfo.GetSCC = GetSCC 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) -- rinvio angolare 90° (considerato come fosse una testa da sotto)
elseif sHead == 'H5' then elseif sHead == 'H5' then
SetupInfo.bToolOnAggregate = true SetupInfo.bToolOnAggregate = true
+1 -1
View File
@@ -28,7 +28,7 @@ local Offsets = {
local Trave = { local Trave = {
YMIN=30, YMIN=30,
YMAX=251, YMAX=291,
ZMIN=30, ZMIN=30,
ZMAX=621 ZMAX=621
} }
+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-MK2"
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-MK2.mlpe -s Saomad-KAIROS-MK2.mlpe
\EgtProg\Dll32\luac54 -o %fullPathSource%\bin\%machineName%\Saomad-KAIROS-MK2.mlse -s Saomad-KAIROS-MK2.mlse
\EgtProg\Dll32\luac54 -o %fullPathSource%\bin\%machineName%\Saomad-KAIROS-MK2.SIEMENS.mlpe -s Saomad-KAIROS-MK2.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\
File diff suppressed because it is too large Load Diff
+12 -3
View File
@@ -3,8 +3,8 @@
Material=Beam Material=Beam
NCType=5 ; 1=Tpa, 2=Num Flexium, 3=Num Axium APServer, 4=Num Axium PCToolkit, 5=Siemens_Sharp7 NCType=5 ; 1=Tpa, 2=Num Flexium, 3=Num Axium APServer, 4=Num Axium PCToolkit, 5=Siemens_Sharp7
Flow=2 Flow=2
IsoFileDir=\\192.168.214.253\iso IsoFileDir=\\192.168.0.253\iso
Ip=192.168.214.1 Ip=192.168.0.1
Rack=0 Rack=0
Slot=1 Slot=1
Debug=2 Debug=2
@@ -47,6 +47,15 @@ Debug=2
29=PLC_Messages5,302:26.0:2,c,plc 29=PLC_Messages5,302:26.0:2,c,plc
30=PLC_Messages6,302:28.0:2,c,plc 30=PLC_Messages6,302:28.0:2,c,plc
31=W_Carico,301:8.0:2,c,plc 31=W_Carico,301:8.0:2,c,plc
32=NextPartL,301:10.0:2,c,plc
33=NextPartW,301:12.0:2,c,plc
34=NextPartH,301:14.0:2,c,plc
35=NextPartPressX1,301:16.0:4,c,plc
36=NextPartFeed,301:20.0:4,c,plc
37=NextPartAcc,301:24.0:4,c,plc
38=NextPartRef1,301:28.0:4,c,plc
39=NextPartRef2,301:32.0:4,c,plc
40=Stop_Working,301:1.7:1,c,plc
[Languages] [Languages]
Enable=0 Enable=0
@@ -110,7 +119,7 @@ Default=Standard
[Estimations] [Estimations]
Enable=1 Enable=1
WinPlace=0,698,85,669,863 WinPlace=0,-1270,21,669,863
[VMill] [VMill]
Enable=1 Enable=1
+92 -14
View File
@@ -9,8 +9,8 @@
require( 'EmtGenerator') require( 'EmtGenerator')
EgtEnableDebug( false) EgtEnableDebug( false)
PP_VER = '2.7l3' PP_VER = '3.1d1_DEV7'
MIN_MACH_VER = '2.7l2' MIN_MACH_VER = '3.1c1'
EgtOutLog ( '** Saomad-KAIROS '..PP_VER..' (MinMach '.. MIN_MACH_VER ..') **', 1) EgtOutLog ( '** Saomad-KAIROS '..PP_VER..' (MinMach '.. MIN_MACH_VER ..') **', 1)
@@ -63,9 +63,24 @@ AutoRotMinLen = 2600
MaxUnloadLen = 0 MaxUnloadLen = 0
DefTcPos = 'T101' DefTcPos = 'T101'
CoeffVM = 0.5 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 -- Aggiornamento con dati da B&W
local sData = EgtGetSourceDir().."Beam\\EbwData.lua" local sData = EgtGetCurrMachineDir().."\\Beam\\EbwData.lua"
if EgtExistsFile( sData) then if EgtExistsFile( sData) then
local Machine = dofile( sData) local Machine = dofile( sData)
if Machine then if Machine then
@@ -94,6 +109,12 @@ if EgtExistsFile( sData) then
if Machine.Offsets.TAB_OFFSET_Y then DeltaTabY = Machine.Offsets.TAB_OFFSET_Y end 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.TAB_OFFSET_Z then DeltaTabZ = Machine.Offsets.TAB_OFFSET_Z end
if Machine.Offsets.NOULOAD then MaxUnloadLen = Machine.Offsets.NOULOAD 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 end
ParkY = EgtClamp( ParkY, MinY, MaxY) ParkY = EgtClamp( ParkY, MinY, MaxY)
ParkZ = EgtClamp( ParkZ, MinZ, MaxZ) ParkZ = EgtClamp( ParkZ, MinZ, MaxZ)
@@ -102,17 +123,22 @@ if EgtExistsFile( sData) then
UnloadSmT = UnloadT UnloadSmT = UnloadT
end end
end end
-- Aggiorno valori MinJoin
MinJoin = MinJoinSS
MinOther = abs( MinX1) + abs( MaxX2) + MinJoin
DeltaTol = 210
EmtGeneral { EmtGeneral {
File='Saomad-KAIROS.nge', File='Saomad-KAIROS-MK2.nge',
Offset = Vector3d( 0.0, -835, -779.06), Offset = Vector3d( 0.0, -835, -779.06),
AxisMaxAdjust = 30, AxisMaxAdjust = 30,
AxisMaxRotAdj = 0.5, AxisMaxRotAdj = 0.5,
ExitMaxAdjust = 30, ExitMaxAdjust = 30,
ExitMaxRotAdj = 0.5, ExitMaxRotAdj = 0.5,
AngDeltaMinForHome = 165, --AngDeltaMinForHome = 165,
Special = 'Saomad-KAIROS.mlse', NewLinkMgr = 1,
Processor = 'Saomad-KAIROS.mlpe'} Special = 'Saomad-KAIROS-MK2.mlse',
Processor = 'Saomad-KAIROS-MK2.mlpe'}
local BaseId = EmtBase { local BaseId = EmtBase {
Name = 'Base', Name = 'Base',
Geo='BASE/GEO', Geo='BASE/GEO',
@@ -150,7 +176,7 @@ local CId = EmtAxis {
Home = ParkC, Home = ParkC,
Geo = 'C_AXIS/GEO', Geo = 'C_AXIS/GEO',
Aux = {'C_AXIS/SOLID', 'C_AXIS/COLLISION'}} Aux = {'C_AXIS/SOLID', 'C_AXIS/COLLISION'}}
EmtAxis { local AId = EmtAxis {
Name = 'A', Name = 'A',
Parent = 'C', Parent = 'C',
Token = 'A1', Token = 'A1',
@@ -173,7 +199,7 @@ local H1Id = EmtHead {
Rot1W = 2, Rot1W = 2,
OthColl = {'A/SOLID', 'C/SOLID'}, OthColl = {'A/SOLID', 'C/SOLID'},
Geo = 'H1_HEAD/GEO'} Geo = 'H1_HEAD/GEO'}
EgtSetInfo( H1Id, 'ZMAXONROT', '1,60') --EgtSetInfo( H1Id, 'ZMAXONROT', '1,60')
-- Sega a catena -- Sega a catena
EmtAxis { EmtAxis {
Name = 'CS', Name = 'CS',
@@ -197,7 +223,7 @@ local H3Id = EmtHead {
SolCh = MCH_SCC.ADIR_NEAR, SolCh = MCH_SCC.ADIR_NEAR,
OthColl = {'A/SOLID', 'C/SOLID'}, OthColl = {'A/SOLID', 'C/SOLID'},
Geo = 'H3_HEAD/GEO'} Geo = 'H3_HEAD/GEO'}
EgtSetInfo( H3Id, 'ZMAXONROT', '1,5') --EgtSetInfo( H3Id, 'ZMAXONROT', '1,5')
-- Morse -- Morse
local X1Id = EmtAxis { local X1Id = EmtAxis {
Name = 'X1', Name = 'X1',
@@ -219,7 +245,7 @@ local PX1Id = EmtAxis {
Stroke = { 0, MaxHOpen}, Stroke = { 0, MaxHOpen},
Home = MaxHOpen, Home = MaxHOpen,
Geo = 'PX1_AXIS/GEO', Geo = 'PX1_AXIS/GEO',
Aux = {'PX1_AXIS/SOLID', 'PX1_AXIS/COLLISION'}} Aux = {'PX1_AXIS/SOLID', 'PX1_AXIS/COLLISION', 'PX1_AXIS/CLAMP_CHECK'}}
local QX1Id = EmtAxis { local QX1Id = EmtAxis {
Name = 'QX1', Name = 'QX1',
Parent = 'X1', Parent = 'X1',
@@ -250,7 +276,7 @@ local PX2Id = EmtAxis {
Stroke = { 0, MaxHOpen}, Stroke = { 0, MaxHOpen},
Home = MaxHOpen, Home = MaxHOpen,
Geo = 'PX2_AXIS/GEO', Geo = 'PX2_AXIS/GEO',
Aux = {'PX2_AXIS/SOLID', 'PX2_AXIS/COLLISION'}} Aux = {'PX2_AXIS/SOLID', 'PX2_AXIS/COLLISION', 'PX2_AXIS/CLAMP_CHECK'}}
local QX2Id = EmtAxis { local QX2Id = EmtAxis {
Name = 'QX2', Name = 'QX2',
Parent = 'X2', Parent = 'X2',
@@ -389,11 +415,13 @@ EgtMove( EgtGetFirstNameInGroup( X1Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( X1Id, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( X1Id, 'COLLISION'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX1Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( PX1Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX1Id, 'COLLISION'), 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( QX1Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( X2Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( X2Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( X2Id, 'COLLISION'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( X2Id, 'COLLISION'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX2Id, 'SOLID'), vtMove, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( PX2Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX2Id, 'COLLISION'), 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( QX2Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( YId, 'SOLID'), vtMoveY, GDB_RT.GLOB) EgtMove( EgtGetFirstNameInGroup( YId, 'SOLID'), vtMoveY, GDB_RT.GLOB)
@@ -414,8 +442,8 @@ function OnSetHead()
local dDist = EgtIf( EMC.DIST and abs( EMC.DIST) > 1, EMC.DIST, ChSawLen) local dDist = EgtIf( EMC.DIST and abs( EMC.DIST) > 1, EMC.DIST, ChSawLen)
EmtModifyExitPosition( EMC.HEAD, EMC.EXIT, Point3d( 0, 0, -dDist)) EmtModifyExitPosition( EMC.HEAD, EMC.EXIT, Point3d( 0, 0, -dDist))
-- recupero valore asse CS bloccato -- recupero valore asse CS bloccato
local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS) local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS) or ''
local dPosCS = tonumber( sVal:sub( 4) or '') local dPosCS = tonumber( sVal:sub( 4)) or 0
EmtModifyAxisHome( 'C', GetChainSawCHomeFromVirtualAxis( dPosCS)) EmtModifyAxisHome( 'C', GetChainSawCHomeFromVirtualAxis( dPosCS))
-- limiti asse A -- limiti asse A
EmtModifyAxisStroke( 'A', { -91, 91}) EmtModifyAxisStroke( 'A', { -91, 91})
@@ -502,3 +530,53 @@ function OnResetMachine()
end end
EgtSetStatus( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill') or GDB_ID.NULL, GDB_ST.OFF) EgtSetStatus( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill') or GDB_ID.NULL, GDB_ST.OFF)
end 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
+270 -55
View File
@@ -7,13 +7,15 @@ EgtEnableDebug( false)
LONG_TOOL_MINLEN = 221 LONG_TOOL_MINLEN = 221
BIG_TOOL_DIAM = 300 BIG_TOOL_DIAM = 300
ALL_CLAMP_POS = {}
CLAMP_POS = {}
--------------------------------------------------------------------- ---------------------------------------------------------------------
-- *** GENERATION *** -- *** GENERATION ***
--------------------------------------------------------------------- ---------------------------------------------------------------------
local sBaseDir = EgtGetSourceDir() local sBaseDir = EgtGetCurrMachineDir()
if NumericalControl == 'SIEMENS' then if NumericalControl == 'SIEMENS' then
dofile( sBaseDir .. 'Saomad-KAIROS.SIEMENS.mlpe') dofile( sBaseDir .. '\\Saomad-KAIROS-MK2.SIEMENS.mlpe')
else else
EmtSetLastError( 1201, 'Numerical Control error : unkwnown type') EmtSetLastError( 1201, 'Numerical Control error : unkwnown type')
end end
@@ -30,10 +32,20 @@ function OnSimulStart()
if vTcPos then if vTcPos then
for i = 1, #vTcPos do for i = 1, #vTcPos do
local vTools = EgtGetToolsInCurrSetupPos( vTcPos[i]) local vTools = EgtGetToolsInCurrSetupPos( vTcPos[i])
if vTools and vTools[1] then for j = 1, #( vTools or {}) do
EgtLoadTool( vTcPos[i], 1, vTools[1]) if vTools[j] ~= '' then
ShowToolInTcPos( vTcPos[i], true) EgtLoadTool( vTcPos[i], j, vTools[j])
-- Aggiunto controllo lunghezza lama minima * 0.9 per ricavare la tolleranza del VMILL
if EgtTdbSetCurrTool(vTools[j]) then -- set utensile corrente
if EgtTdbGetCurrToolParam( MCH_TP.TYPE) == MCH_TY.SAW_STD or EgtTdbGetCurrToolParam( MCH_TP.TYPE) == MCH_TY.SAW_FLAT then -- controllo tipo utensile sega
local dCurrSawLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) * 0.9
-- se non definito o minore del valore precedente aggiorna la tolleranza
EMT.VMILLTOL = EgtIf( not EMT.VMILLTOL or dCurrSawLen < EMT.VMILLTOL, dCurrSawLen, EMT.VMILLTOL)
end
end
end
end end
ShowToolInTcPos( vTcPos[i], true)
end end
end end
-- Carico l'utensile iniziale o di default sulla testa -- Carico l'utensile iniziale o di default sulla testa
@@ -97,6 +109,29 @@ function OnSimulStart()
end end
-- Preparo lista collisioni vuota -- Preparo lista collisioni vuota
EMT.COLLIDE = {} EMT.COLLIDE = {}
-- si crea gruppo temporaneo appoggio controllo clamping
CLAMP_CHECK_GROUP = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'CLAMP_CHECK')
CLAMP_CHECK_INTERS = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'CLAMP_INTERS')
if CLAMP_CHECK_GROUP then
EgtEmptyGroup( CLAMP_CHECK_GROUP)
else
local frClampCheckGroup = Frame3d( ORIG(), GDB_FR.FRONT)
CLAMP_CHECK_GROUP = EgtGroup( GDB_ID.ROOT, frClampCheckGroup)
EgtSetName( CLAMP_CHECK_GROUP, 'CLAMP_CHECK')
EgtSetLevel( CLAMP_CHECK_GROUP, GDB_LV.TEMP)
EgtSetStatus( CLAMP_CHECK_GROUP, GDB_ST.OFF)
end
if CLAMP_CHECK_INTERS then
EgtEmptyGroup( CLAMP_CHECK_INTERS)
else
CLAMP_CHECK_INTERS = EgtGroup( GDB_ID.ROOT)
EgtSetName( CLAMP_CHECK_INTERS, 'CLAMP_INTERS')
EgtSetLevel( CLAMP_CHECK_INTERS, GDB_LV.TEMP)
EgtSetStatus( CLAMP_CHECK_INTERS, GDB_ST.OFF)
end
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
@@ -122,13 +157,13 @@ function OnSimulDispositionStart()
-- Determino dimensioni del grezzo -- Determino dimensioni del grezzo
local nSolId = EgtGetFirstNameInGroup( EgtGetFirstRawPart() or GDB_ID.NULL, 'RawSolid') or GDB_ID.NULL local nSolId = EgtGetFirstNameInGroup( EgtGetFirstRawPart() or GDB_ID.NULL, 'RawSolid') or GDB_ID.NULL
local b3Sol = EgtGetBBoxGlob( nSolId, GDB_BB.STANDARD) local b3Sol = EgtGetBBoxGlob( nSolId, GDB_BB.STANDARD)
EMT.LB = 0 EMT.LENGTHBEAM = 0
EMT.SB = 0 EMT.WIDTHBEAM = 0
EMT.HB = 0 EMT.HEIGHTBEAM = 0
if b3Sol then if b3Sol then
EMT.LB = b3Sol:getDimX() EMT.LENGTHBEAM = b3Sol:getDimX()
EMT.SB = b3Sol:getDimY() EMT.WIDTHBEAM = b3Sol:getDimY()
EMT.HB = b3Sol:getDimZ() EMT.HEIGHTBEAM = b3Sol:getDimZ()
end end
-- Se vero inizio e abilitato creo gli Zmap -- Se vero inizio e abilitato creo gli Zmap
EMT.VMILL = {} EMT.VMILL = {}
@@ -193,7 +228,7 @@ function OnSimulDispositionStart()
end end
table.insert( EMT.VMILL, VMillId) table.insert( EMT.VMILL, VMillId)
end end
nPartRawId = EgtGetNextRawPart( nPartRawId) nPartRawId = EgtGetNextRawPart( nPartRawId)
end end
end end
-- fasi successive -- fasi successive
@@ -234,18 +269,22 @@ function OnSimulDispositionStart()
local nOrd = GetPhaseOrd( EMT.PHASE) local nOrd = GetPhaseOrd( EMT.PHASE)
local nScrapOrd = GetPhaseOrd( EgtGetPhaseCount()) + 1 local nScrapOrd = GetPhaseOrd( EgtGetPhaseCount()) + 1
local b3Raw = BBox3d() local b3Raw = BBox3d()
local b3Bar = BBox3d()
local b3Part = BBox3d()
local nPartRawId, nScrapRawId local nPartRawId, nScrapRawId
local nRawId = EgtGetFirstRawPart() local nRawId = EgtGetFirstRawPart()
while nRawId do while nRawId do
local nNextRawId = EgtGetNextRawPart( nRawId) local nNextRawId = EgtGetNextRawPart( nRawId)
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
EmtLinkRawPartToGroup( nRawId, 'Tab') EmtLinkRawPartToGroup( nRawId, 'Tab')
local b3Tmp = EgtGetRawPartBBox( nRawId)
b3Bar:Add( b3Tmp)
local nRawOrd = EgtGetInfo( nRawId, 'ORD', 'i') local nRawOrd = EgtGetInfo( nRawId, 'ORD', 'i')
if nRawOrd == nOrd then if nRawOrd == nOrd then
b3Raw = EgtGetRawPartBBox( nRawId) b3Raw:Add( b3Tmp)
b3Part:Add( b3Tmp)
nPartRawId = nRawId nPartRawId = nRawId
elseif nRawOrd == nOrd + 1 and nRawOrd == nScrapOrd then elseif nRawOrd == nOrd + 1 and nRawOrd == nScrapOrd then
local b3Tmp = EgtGetRawPartBBox( nRawId) or BBox3d()
b3Raw:Add( b3Tmp) b3Raw:Add( b3Tmp)
nScrapRawId = nRawId nScrapRawId = nRawId
end end
@@ -259,6 +298,9 @@ function OnSimulDispositionStart()
else else
EMT.SCRAP = nil EMT.SCRAP = nil
end end
EMT.LENGTHBEAM = b3Bar:getDimX()
EMT.LENGTHRAW = b3Raw:getDimX()
EMT.LENGTHPART = b3Part:getDimX()
-- recupero CutId del pezzo in lavorazione -- recupero CutId del pezzo in lavorazione
EMT.CUTID = EgtGetInfo( EgtGetFirstPartInRawPart( nPartRawId or GDB_ID.NULL) or GDB_ID.NULL, 'CUTID', 'i') or 0 EMT.CUTID = EgtGetInfo( EgtGetFirstPartInRawPart( nPartRawId or GDB_ID.NULL) or GDB_ID.NULL, 'CUTID', 'i') or 0
EMT.X1SPEC = nil EMT.X1SPEC = nil
@@ -328,6 +370,7 @@ function OnSimulDispositionStart()
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then
EmtLinkRawPartToGroup( nRawId, 'Tab') EmtLinkRawPartToGroup( nRawId, 'Tab')
b3Bar = EgtGetRawPartBBox( nRawId)
else else
EgtMove( nRawId, vtMove, GDB_RT.GLOB) EgtMove( nRawId, vtMove, GDB_RT.GLOB)
EgtSetStatus( nRawId, GDB_ST.OFF) EgtSetStatus( nRawId, GDB_ST.OFF)
@@ -335,6 +378,7 @@ function OnSimulDispositionStart()
end end
nRawId = nNextRawId nRawId = nNextRawId
end end
EMT.LENGTHBEAM = b3Bar:getDimX()
-- altrimenti fase finale, aggancio primo grezzo alla tavola e gli altri in posizione carico al carro Y -- altrimenti fase finale, aggancio primo grezzo alla tavola e gli altri in posizione carico al carro Y
else else
-- indice primo grezzo della fase -- indice primo grezzo della fase
@@ -350,12 +394,14 @@ function OnSimulDispositionStart()
nRawId = EgtGetNextRawPart( nRawId) nRawId = EgtGetNextRawPart( nRawId)
end end
-- eseguo -- eseguo
local b3Bar = BBox3d()
nRawId = EgtGetFirstRawPart() nRawId = EgtGetFirstRawPart()
while nRawId do while nRawId do
local nNextRawId = EgtGetNextRawPart( nRawId) local nNextRawId = EgtGetNextRawPart( nRawId)
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then
EmtLinkRawPartToGroup( nRawId, 'Tab') EmtLinkRawPartToGroup( nRawId, 'Tab')
b3Bar = EgtGetRawPartBBox( nRawId)
else else
EgtMove( nRawId, vtMove, GDB_RT.GLOB) EgtMove( nRawId, vtMove, GDB_RT.GLOB)
EmtLinkRawPartToGroup( nRawId, 'X1') EmtLinkRawPartToGroup( nRawId, 'X1')
@@ -363,6 +409,7 @@ function OnSimulDispositionStart()
end end
nRawId = nNextRawId nRawId = nNextRawId
end end
EMT.LENGTHBEAM = b3Bar:getDimX()
end end
-- Indicazione angolo rotazione pezzo -- Indicazione angolo rotazione pezzo
EMT.ROT = EgtGetInfo( EMT.DISPID, 'ROT', 'i') or 0 EMT.ROT = EgtGetInfo( EMT.DISPID, 'ROT', 'i') or 0
@@ -394,6 +441,7 @@ function OnSimulDispositionEnd()
EMT.POSTROT = true EMT.POSTROT = true
end end
end end
EMT.SPLIT = false
EMT.OPEISDISP = false EMT.OPEISDISP = false
end end
@@ -543,6 +591,7 @@ function OnSimulMachiningEnd()
EMT.UNLOADING = false EMT.UNLOADING = false
EMT.FALL = false EMT.FALL = false
end end
EMT.SPLIT = nil
EMT.PREVHEAD = EMT.HEAD EMT.PREVHEAD = EMT.HEAD
EMT.PREVEXIT = EMT.EXIT EMT.PREVEXIT = EMT.EXIT
end end
@@ -697,6 +746,8 @@ function ExecAuxCmd( sCmd)
if Cmd[1] == '0' then if Cmd[1] == '0' then
if Cmd[2] == 'Unloading' then if Cmd[2] == 'Unloading' then
EMT.UNLOADING = true EMT.UNLOADING = true
elseif Cmd[2] == 'Split' then
EMT.SPLIT = true
elseif Cmd[2] == 'Fall' then elseif Cmd[2] == 'Fall' then
EMT.FALL = true EMT.FALL = true
end end
@@ -738,29 +789,9 @@ function ExecAuxCmd( sCmd)
end end
end end
elseif Cmd[1] == '11' then elseif Cmd[1] == '11' then
local dPX1 = MaxHOpen ExecMovePX1( Cmd)
if Cmd[2] ~= '0' then
dPX1 = EgtIf( EMT.ROT == -1, EMT.HB, EMT.SB)
end
SimulMoveAxis( 'PX1', dPX1, MCH_SIM_STEP.RAPID)
local dQX1 = MaxVOpen
if Cmd[2] == '2' then
dQX1 = EgtIf( EMT.ROT == -1, EMT.SB, EMT.HB)
end
SimulMoveAxis( 'QX1', dQX1, MCH_SIM_STEP.RAPID)
SetPX1Light( Cmd[2] ~= '0')
elseif Cmd[1] == '12' then elseif Cmd[1] == '12' then
local dPX2 = MaxHOpen ExecMovePX2( Cmd)
if Cmd[2] ~= '0' then
dPX2 = EgtIf( EMT.ROT == -1, EMT.HB, EMT.SB)
end
SimulMoveAxis( 'PX2', dPX2, MCH_SIM_STEP.RAPID)
local dQX2 = MaxVOpen
if Cmd[2] == '2' then
dQX2 = EgtIf( EMT.ROT == -1, EMT.SB, EMT.HB)
end
SimulMoveAxis( 'QX2', dQX2, MCH_SIM_STEP.RAPID)
SetPX2Light( Cmd[2] ~= '0')
elseif Cmd[1] == '21' then elseif Cmd[1] == '21' then
local nX1Delta = tonumber( Cmd[2]) local nX1Delta = tonumber( Cmd[2])
local nX2Delta = tonumber( Cmd[3]) local nX2Delta = tonumber( Cmd[3])
@@ -791,7 +822,7 @@ function ExecUnloading()
-- li sposto per lasciare spazio al nuovo pezzo -- li sposto per lasciare spazio al nuovo pezzo
local nId = EgtGetFirstInGroup( nVmGrpId) local nId = EgtGetFirstInGroup( nVmGrpId)
while nId do while nId do
EgtMove( nId, Vector3d( 0, -( EMT.SB + 50.0), 0), GDB_RT.GLOB) EgtMove( nId, Vector3d( 0, -( EMT.WIDTHBEAM + 50.0), 0), GDB_RT.GLOB)
nId = EgtGetNext( nId) nId = EgtGetNext( nId)
end end
-- creo un nuovo layer e vi inserisco il nuovo pezzo -- creo un nuovo layer e vi inserisco il nuovo pezzo
@@ -833,15 +864,199 @@ function ExecUnloading()
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function VerifyYSlide( sName1, dVal1, sName2, dVal2) function CheckClamping( sClampName)
-- Se movimento trave agganciata con carrello Y
local nClampId = EgtGetAxisId( sClampName) or GDB_ID.NULL
local nClampPathId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nClampId, 'CLAMP_CHECK') or GDB_ID.NULL)
local b3ClampingArea = EgtGetBBoxGlob( nClampPathId or GDB_ID.NULL, GDB_BB.STANDARD)
-- se non trovo percorso area di clamping, esco subito
if not nClampPathId or not EMT.VMILL or not ClampingCoeffMin then
return
end
local function GetCurveListFromIntersection( sPosIntersPlane, sIntersPlane, dDepth)
local vCurveListId = {}
local vtIntersPlane
-- piano di interpolazione
if sIntersPlane == 'X' then
vtIntersPlane = X_AX()
elseif sIntersPlane == 'Y' then
vtIntersPlane = Y_AX()
elseif sIntersPlane == 'Z' then
vtIntersPlane = Z_AX()
end
for i = 1, #EMT.VMILL do
local b3VMill = EgtGetBBoxGlob( EMT.VMILL[i], GDB_BB.EXACT)
local ptPosIntersPlane
if sPosIntersPlane == 'MIN' then
ptPosIntersPlane = b3VMill:getMin() + dDepth * vtIntersPlane
elseif sPosIntersPlane == 'MAX' then
ptPosIntersPlane = b3VMill:getMax() - dDepth * vtIntersPlane
end
local nLoopId, nLoopCnt = EgtPlaneVolZmapInters( ptPosIntersPlane, vtIntersPlane, EMT.VMILL[i], CLAMP_CHECK_INTERS, GDB_RT.GLOB)
vCurveListId = EgtTableAdd( vCurveListId, nLoopId, nLoopCnt)
end
return vCurveListId
end
local function CalculateIntersectionArea( sPosIntersPlane, sIntersPlane, dDepth)
-- test piano frontale
local vCurveListId = GetCurveListFromIntersection( sPosIntersPlane, sIntersPlane, dDepth)
-- si copia curva intersezione e curva pinza in gruppo di confronto
local nFlatSurfId, nFlatSurfCnt = EgtSurfFlatRegion( CLAMP_CHECK_GROUP, vCurveListId)
local vFlatSurfId = EgtTableFill( nFlatSurfId, nFlatSurfCnt) or {}
local nClampSurfId = EgtSurfFlatRegion( CLAMP_CHECK_GROUP, nClampPathId)
local dTotalArea = 0
local dTotalXLenght = 0
for i = 1, #vFlatSurfId do
local nTempSurfId = vFlatSurfId[i]
EgtSurfFrIntersect( nTempSurfId, nClampSurfId)
if nTempSurfId then
dTotalArea = dTotalArea + ceil( EgtSurfArea( nTempSurfId) or 0)
local b3BoxIntersectionBox = EgtGetBBoxGlob( nTempSurfId, GDB_BB.STANDARD)
if b3BoxIntersectionBox then
dTotalXLenght = dTotalXLenght + ceil( b3BoxIntersectionBox:getDimX()) -- somma lunghezze (x) delle aree pinzate
end
end
end
return dTotalArea, dTotalXLenght
end
-- minima area considerata per un corretto pinzaggio
DistZClampToTable = DistZClampToTable or 0
--local MinJoin = BD.GetMinJoin( EMT.WIDTHPART, EMT.HEIGHTPART, EgtIf( EMT.SPLIT, EMT.LENGTHPART , EMT.LENGTHBEAM))
UpdateMinJoinDeltaTol( EMT.WIDTHPART, EMT.HEIGHTPART, EgtIf( EMT.SPLIT, EMT.LENGTHPART , EMT.LENGTHBEAM))
local MinZClamping = min( b3ClampingArea:getDimZ() + DistZClampToTable, EMT.HEIGHTPART) - DistZClampToTable
local dMinClamping = ( MinJoin * MinZClamping)
-- si moltiplica per un coefficiente minimo sotto al quale si da l'errore di pinzaggio
ClampingCoeffMin = EgtClamp( ClampingCoeffMin, 0.01, 1)
if MinZClamping > ClampSmallH then
-- somma area parallelepipedo sotto + area triangolo superiore
dMinClamping = MinJoin * ClampSmallH + ( ( MinJoin * ( MinJoin * tan( ClampFrontAngle))) / 2)
local dTriangleBase = ClampL - ClampSmallL
if MinJoin > dTriangleBase then
local dTriangleHeight = ClampH - ClampSmallH
-- somma area parallelepipedo sotto + area triangolo superiore + parallelepipedo grande
dMinClamping = ( MinJoin * ClampSmallH) + ( dTriangleBase * dTriangleHeight / 2) + ( ( MinJoin - dTriangleBase) * dTriangleHeight)
end
end
local dMinClampingAreaWarn = dMinClamping * ClampingCoeffMin
local dMinClampingAreaErr = dMinClamping * ( ClampingCoeffMin / 3)
local bError = true
local sWrn, sErr
local bWriteWarnMessage = false
local bWriteErrMessage = false
-- controllo faccia frontale
local dArea, dXClampedLenght = CalculateIntersectionArea( 'MIN', 'Y', 3)
-- ERRORE: pinza troppo poco (meno di 1/3 del minimo richiesto)
if dArea and dArea < dMinClampingAreaErr then
-- solo se pinza almeno 1cm2, e la somma della lunghezza pinzata è maggiore della lunghezza minima pinzabile da Warning e non errore
if dXClampedLenght >= MinJoin * ClampingCoeffMin and dArea > 1000 then
bError = false
end
-- pinzaggio non fattibile, errore
if bError then
sErr = 'ERROR CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
bWriteErrMessage = true
end
end
-- WARNING: pinza meno del minimo richiesto
if dArea and dArea < dMinClampingAreaWarn and not bWriteErrMessage then
sWrn = 'WARNING CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
bWriteWarnMessage = true
end
EgtEmptyGroup( CLAMP_CHECK_GROUP)
EgtEmptyGroup( CLAMP_CHECK_INTERS)
-- controllo altro lato solo se non sono già in errore
if not bWriteErrMessage then
-- controllo faccia posteriore
dArea, dXClampedLenght = CalculateIntersectionArea( 'MAX', 'Y', 3)
-- ERRORE: pinza troppo poco (meno di 1/3 del minimo richiesto)
if dArea and dArea < dMinClampingAreaErr then
-- solo se pinza almeno 1cm2, e la somma della lunghezza pinzata è maggiore della lunghezza minima pinzabile da Warning e non errore
if dXClampedLenght >= MinJoin * ClampingCoeffMin and dArea > 1000 then
bError = false
end
-- pinzaggio non fattibile, errore
if bError then
sErr = 'ERROR CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
bWriteErrMessage = true
end
end
-- WARNING: pinza meno del minimo richiesto
if dArea and dArea < dMinClampingAreaWarn and not bWriteWarnMessage and not bWriteErrMessage then
sWrn = 'WARNING CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
bWriteWarnMessage = true
end
EgtEmptyGroup( CLAMP_CHECK_GROUP)
EgtEmptyGroup( CLAMP_CHECK_INTERS)
end
if bWriteErrMessage then
EmtSetLastError( 1213, sErr, EgtGetEnableUI())
EgtOutBox( sErr, 'CLAMPING', 'ERROR', 'OK')
EmtSetSimulPause()
elseif bWriteWarnMessage then
EgtOutLog( sWrn)
EgtOutBox( sWrn, 'CLAMPING', 'WARNING', 'OK')
EmtSetSimulPause()
end
end
---------------------------------------------------------------------
function ExecMovePX1( Cmd)
--SimulMoveAxes( 'PX1', EgtIf( not bClose, MaxHoOpen, EMT.HEIGHTBEAM), MCH_SIM_STEP.RAPID)
local dPX1 = MaxHOpen
if Cmd[2] ~= '0' then
dPX1 = EgtIf( EMT.ROT == -1, EMT.HEIGHTBEAM, EMT.WIDTHBEAM)
end
SimulMoveAxis( 'PX1', dPX1, MCH_SIM_STEP.RAPID)
local dQX1 = MaxVOpen
if Cmd[2] == '2' then
dQX1 = EgtIf( EMT.ROT == -1, EMT.WIDTHBEAM, EMT.HEIGHTBEAM)
end
SimulMoveAxis( 'QX1', dQX1, MCH_SIM_STEP.RAPID)
SetPX1Light( Cmd[2] ~= '0')
if Cmd[2] ~= '0' then
CheckClamping( 'PX1')
end
end
---------------------------------------------------------------------
function ExecMovePX2( Cmd)
--EgtIf( not bClose, MaxHoOpen, EMT.HEIGHTBEAM), MCH_SIM_STEP.RAPID)
local dPX2 = MaxHOpen
if Cmd[2] ~= '0' then
dPX2 = EgtIf( EMT.ROT == -1, EMT.HEIGHTBEAM, EMT.WIDTHBEAM)
end
SimulMoveAxis( 'PX2', dPX2, MCH_SIM_STEP.RAPID)
local dQX2 = MaxVOpen
if Cmd[2] == '2' then
dQX2 = EgtIf( EMT.ROT == -1, EMT.WIDTHBEAM, EMT.HEIGHTBEAM)
end
SimulMoveAxis( 'QX2', dQX2, MCH_SIM_STEP.RAPID)
SetPX2Light( Cmd[2] ~= '0')
if Cmd[2] ~= '0' then
CheckClamping( 'PX2')
end
end
---------------------------------------------------------------------
function VerifyX1Slide( sName1, dVal1, sName2, dVal2)
-- Se movimento trave agganciata con carrello X1
if sName1 == 'T' and sName2 == 'X1' and GetPX1Light() then if sName1 == 'T' and sName2 == 'X1' and GetPX1Light() then
local dYDeltaP = EgtGetAxisPos( 'T') - EgtGetAxisPos( 'X1') local dYDeltaP = EgtGetAxisPos( 'T') - EgtGetAxisPos( 'X1')
local dYDeltaA = tonumber( dVal1) - tonumber( dVal2) local dYDeltaA = tonumber( dVal1) - tonumber( dVal2)
EgtOutLog( string.format( 'YDeltaP=%.3f YDeltaA=%.3f', dYDeltaP, dYDeltaA), 5) EgtOutLog( string.format( 'X1DeltaP=%.3f X1DeltaA=%.3f', dYDeltaP, dYDeltaA), 5)
if abs( dYDeltaA - dYDeltaP) > 0.5 then if abs( dYDeltaA - dYDeltaP) > 0.5 then
EMT.ERR = 2 EMT.ERR = 2
local sErr = 'Y slide : ' .. EmtLenToString( dYDeltaP, 3) .. ' -> ' .. EmtLenToString( dYDeltaA, 3) local sErr = 'X1 slide : ' .. EmtLenToString( dYDeltaP, 3) .. ' -> ' .. EmtLenToString( dYDeltaA, 3)
EmtSetLastError( 1202, sErr) EmtSetLastError( 1202, sErr)
end end
end end
@@ -850,15 +1065,15 @@ function VerifyYSlide( sName1, dVal1, sName2, dVal2)
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function VerifyVSlide( sName1, dVal1, sName2, dVal2) function VerifyX2Slide( sName1, dVal1, sName2, dVal2)
-- Se movimento trave agganciata con carrello V -- Se movimento trave agganciata con carrello X1
if sName1 == 'T' and sName2 == 'X2' and GetPX2Light() then if sName1 == 'T' and sName2 == 'X2' and GetPX2Light() then
local dVDeltaP = EgtGetAxisPos( 'T') - EgtGetAxisPos( 'X2') local dVDeltaP = EgtGetAxisPos( 'T') - EgtGetAxisPos( 'X2')
local dVDeltaA = tonumber( dVal1) - tonumber( dVal2) local dVDeltaA = tonumber( dVal1) - tonumber( dVal2)
EgtOutLog( string.format( 'VDeltaP=%.3f VDeltaA=%.3f', dVDeltaP, dVDeltaA), 5) EgtOutLog( string.format( 'X2DeltaP=%.3f X2DeltaA=%.3f', dVDeltaP, dVDeltaA), 5)
if abs( dVDeltaA - dVDeltaP) > 0.5 then if abs( dVDeltaA - dVDeltaP) > 0.5 then
EMT.ERR = 2 EMT.ERR = 2
local sErr = 'V slide : ' .. EmtLenToString( dVDeltaP, 3) .. ' -> ' .. EmtLenToString( dVDeltaA, 3) local sErr = 'X2 slide : ' .. EmtLenToString( dVDeltaP, 3) .. ' -> ' .. EmtLenToString( dVDeltaA, 3)
EmtSetLastError( 1202, sErr) EmtSetLastError( 1202, sErr)
end end
end end
@@ -874,9 +1089,9 @@ function VerifyOneChariotSlide( sName1, dVal1, sName2, dVal2)
end end
-- Eseguo verifica -- Eseguo verifica
if sName2 == 'X1' then if sName2 == 'X1' then
return VerifyYSlide( sName1, dVal1, sName2, dVal2) return VerifyX1Slide( sName1, dVal1, sName2, dVal2)
elseif sName2 == 'X2' then elseif sName2 == 'X2' then
return VerifyVSlide( sName1, dVal1, sName2, dVal2) return VerifyX2Slide( sName1, dVal1, sName2, dVal2)
end end
return true return true
end end
@@ -893,9 +1108,9 @@ function VerifyTwoChariotsSlide( sName1, dVal1, sName2, dVal2, sName3, dVal3)
end end
-- Eseguo verifica -- Eseguo verifica
if sName2 == 'X1' then if sName2 == 'X1' then
return VerifyYSlide( sName1, dVal1, sName2, dVal2) and VerifyVSlide( sName1, dVal1, sName3, dVal3) return VerifyX1Slide( sName1, dVal1, sName2, dVal2) and VerifyX2Slide( sName1, dVal1, sName3, dVal3)
elseif sName2 == 'X2' then elseif sName2 == 'X2' then
return VerifyVSlide( sName1, dVal1, sName2, dVal2) and VerifyYSlide( sName1, dVal1, sName3, dVal3) return VerifyX2Slide( sName1, dVal1, sName2, dVal2) and VerifyX1Slide( sName1, dVal1, sName3, dVal3)
end end
return true return true
end end
@@ -999,14 +1214,14 @@ local RAPID_Y_FEED = FmaxY -- mm/min ex: 45000
local RAPID_Z_FEED = FmaxZ -- mm/min ex: 45000 local RAPID_Z_FEED = FmaxZ -- mm/min ex: 45000
local RAPID_C_FEED = FmaxC -- deg/min ex: 18000 local RAPID_C_FEED = FmaxC -- deg/min ex: 18000
local RAPID_B_FEED = FmaxA -- deg/min ex: 10440 local RAPID_B_FEED = FmaxA -- deg/min ex: 10440
local RAPID_MIN_T = 0.2 -- s ex: 0.2 local RAPID_MIN_T = 1 -- s ex: 0.2
local TOOL_CHANGE = 20 -- s ex: 14 local TOOL_CHANGE = 20 -- s ex: 14
local LOAD_T = 20 -- s ex: 16 local LOAD_T = 10 -- s ex: 16
local CHAR_ONE_MOVE_T = 3.5 -- s ex: 2 local CHAR_ONE_MOVE_T = 1.7 -- s ex: 2
local ROTATION_T = 40 -- s ex: 40 local ROTATION_T = 40 -- s ex: 40
local SPLIT_T = 12 -- s ex: 9 local SPLIT_T = 3 -- s ex: 9
local UNLOAD_T = 15 -- s ex: 12 local UNLOAD_T = 10 -- s ex: 12
local FALL_T = 4 -- s ex: 4 local FALL_T = 2 -- s ex: 4
--------------------------------------------------------------------- ---------------------------------------------------------------------
function OnEstimStart() function OnEstimStart()
File diff suppressed because it is too large Load Diff
Binary file not shown.
-3867
View File
File diff suppressed because it is too large Load Diff