72 Commits

Author SHA1 Message Date
andrea.villa 779e049eca - Sistemati codici per ripartenze
- Aggiunti movimenti simulazione cambio utensile
2026-05-12 08:25:15 +02:00
andrea.villa 938c9fc536 - Scarico diviso in più chiamate per gestire ripartenza
- variabili OFS_T5_X1 diventano OFS_TS1_X1
2026-05-11 16:40:39 +02:00
andrea.villa 24b5d0190b Aggiunta attesa canale 2 in caso di riposizionamento dei carrelli 2026-04-30 13:10:32 +02:00
andrea.villa 4454073970 Modificata posizione di scarico 2026-04-30 08:33:11 +02:00
andrea.villa e729a12c2d Migliorata emissione TRANS e STOPRE 2026-04-30 08:21:17 +02:00
andrea.villa 169476cb43 - Se c'è un restante, l'ultimo pezzo scaricato con POSIZ_T(6) su processo 2
- Il restante scaricato con macro POSIZ_T(5) su processo 1 che permette di lanciare il precarico su processo 2
2026-04-29 18:11:59 +02:00
andrea.villa cc817a8d39 Merge remote-tracking branch 'origin/NewLink' into develop 2026-04-29 11:11:25 +02:00
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 5118 additions and 5264 deletions
+86 -1
View File
@@ -96,6 +96,91 @@
"EgtGetOperationPhase",
"EgtSetOperationMode",
"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
ADVANCE_TAIL_CUT = true, -- per spostare prima del taglio di separazione il taglio di coda su pezzi corti con probabile caduta
ADVANCE_TAIL_OFFS = 5, -- accorciamento taglio di coda avanzato (minimo 1)
STRATEGIES_CONFIG_FILE = 'Std2.json'
STRATEGIES_CONFIG_FILE = 'Std2.json',
FASTCLAMPING = false
}
-- Aggiornamento con dati da B&W
local sData = EgtGetSourceDir().."EbwData.lua"
local sData = EgtGetCurrMachineDir().."\\Beam\\EbwData.lua"
if EgtExistsFile( sData) then
local Machine = dofile( sData)
if Machine then
+10 -7
View File
@@ -22,9 +22,7 @@ local BeamData = {
OVM_MID = 5.4, -- sovramateriale intermedio (spessore lama)
MINRAW_S = 750, -- minimo grezzo in coda scaricabile per sezioni piccole
MINRAW_L = 1070, -- minimo grezzo in coda scaricabile per sezioni grandi
MAX_DIM_HTCUT = 130, -- SOLO DICE larghezza massima taglio di testa o coda
MIN_DIM_HBEAM = 621, -- SOLO DICE altezza minima di trave alta
MAX_DIM_DICE = 110, -- dimensione trasversale massima cubetto
SAFE_DIM_DICE = 110, -- dimensione trasversale ridotta cubetto, valida in tutte le posizioni
MAX_LEN_DICE = 400, -- SOLO DICE lunghezza massima cubetto
COLL_SIC = 5, -- distanza di sicurezza per collisioni
CUT_SIC = 20, -- distanza di sicurezza per tagli
@@ -40,6 +38,7 @@ local BeamData = {
VICE_MINH = 110, -- altezza minima della morsa
VICE_MAXH = 370, -- altezza massima zona pinzaggio orizzontale
USER_HOLE_DIAM = 0, -- diametro foro per L20
FASTCLAMPING = false
}
-- 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
-- TODO sostituire con GetParameters o simile
local sData = EgtGetSourceDir().."EbwData.lua"
local sData = EgtGetCurrMachineDir().."\\Beam\\EbwData.lua"
if EgtExistsFile( sData) then
local Machine = dofile( sData)
if Machine then
@@ -94,9 +93,9 @@ local function GetBlockedAxis( sHead, nToolType, sBlockedAxis)
elseif nToolType == MCH_TY.MORTISE_STD then
if sHead == 'H3' then
if sBlockedAxis == 'parallel' then
return 'A=0'
return 'CS=-90'
elseif sBlockedAxis == 'perpendicular' then
return 'A=90'
return 'CS=0'
end
else
return ''
@@ -271,7 +270,7 @@ local function GetSetupInfo( sHead)
SetupInfo.dCAxisSideEncumbrance = 200
SetupInfo.bToolOnAggregate = false
SetupInfo.vtRotationAxisC = EgtGetAxisDir( 'C')
SetupInfo.vtRotationAxisAB = EgtGetAxisDir( 'B')
SetupInfo.vtRotationAxisAB = EgtGetAxisDir( 'A')
-- TODO da rimuovere quando si fara PreSimulation di asse Z per frese
SetupInfo.dPivot = MldeParameters.MillOffs
@@ -283,6 +282,10 @@ local function GetSetupInfo( sHead)
SetupInfo.GetMinNz = GetMinNzTopHead
SetupInfo.GetPreCollisionData = GetPreCollisionData
SetupInfo.GetSCC = GetSCC
-- sega a catena
elseif sHead == 'H3' then
SetupInfo.HeadType = { bTop = true, bBottom = false}
SetupInfo.PreferredSide = {}
-- rinvio angolare 90° (considerato come fosse una testa da sotto)
elseif sHead == 'H5' then
SetupInfo.bToolOnAggregate = true
+2 -2
View File
@@ -16,7 +16,7 @@ local Offsets = {
MAX_X2=-62,
PARK_X2=-500,
BEAM_LOAD=1800.0,
BEAM_UNLOAD=-2060,
BEAM_UNLOAD=-2150,
TURN_OFFS=0,
MILL_PIVOT=-211.00,
TAB_OFFSET_Y=0,
@@ -28,7 +28,7 @@ local Offsets = {
local Trave = {
YMIN=30,
YMAX=251,
YMAX=291,
ZMIN=30,
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
NCType=5 ; 1=Tpa, 2=Num Flexium, 3=Num Axium APServer, 4=Num Axium PCToolkit, 5=Siemens_Sharp7
Flow=2
IsoFileDir=\\192.168.214.253\iso
Ip=192.168.214.1
IsoFileDir=\\192.168.0.253\iso
Ip=192.168.0.1
Rack=0
Slot=1
Debug=2
@@ -47,6 +47,15 @@ Debug=2
29=PLC_Messages5,302:26.0:2,c,plc
30=PLC_Messages6,302:28.0:2,c,plc
31=W_Carico,301:8.0:2,c,plc
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]
Enable=0
@@ -110,7 +119,7 @@ Default=Standard
[Estimations]
Enable=1
WinPlace=0,698,85,669,863
WinPlace=0,-1270,21,669,863
[VMill]
Enable=1
+95 -15
View File
@@ -9,8 +9,8 @@
require( 'EmtGenerator')
EgtEnableDebug( false)
PP_VER = '2.7l3'
MIN_MACH_VER = '2.7l2'
PP_VER = '3.1e1_DEV1'
MIN_MACH_VER = '3.1c1'
EgtOutLog ( '** Saomad-KAIROS '..PP_VER..' (MinMach '.. MIN_MACH_VER ..') **', 1)
@@ -19,7 +19,7 @@ NumericalControl = 'SIEMENS'
ChainSaw = false
MinY = -823
MaxY = 520
ParkY = 400
ParkY = -125
FmaxY = 45000
MinZ = -298
MaxZ = 915
@@ -30,6 +30,8 @@ MaxA = 120
MinSawA = -101
MaxSawA = 101
ParkA = 0
TakePosTC_R = -90
TakePosTC_L = 90
FmaxA = 10440
MinC = -240
MaxC = 240
@@ -63,9 +65,24 @@ AutoRotMinLen = 2600
MaxUnloadLen = 0
DefTcPos = 'T101'
CoeffVM = 0.5
DistZClampToTable = 5 -- distanza tra la tavola e il punto più basso della morsa
ClampingCoeffMin = nil -- coefficiente di fissaggio, se 0 o nil non fa controllo, per il momento da inizializzare da Ts3Data
ClampSmallH = 98.5 -- dimensioni area di pinzaggio
ClampH = 440.9
ClampL = 1491
ClampSmallL = 994.4 -- dimensioni area di pinzaggio
ClampFrontAngle = 35 -- angolo pinza frontale
MinJoinVV = 75
MinJoinSS = 100
MinJoinLS = 290
MinJoinSL = 100
MinJoinLL = 400
-- variabili per pinzaggio
CLAMP_MAXDIST_2CLAMP = 3000 -- massima distanza tra ingombro lavorazione e pinza quando il pezzo è staffato con entrtambe le pinze (lavorazioni centrali)
CLAMP_MAXDIST_1CLAMP = 500 -- massima distanza tra ingombro lavorazione e pinza quando il pezzo è staffato con una sola pinza (lavorazioni testa-coda)
-- Aggiornamento con dati da B&W
local sData = EgtGetSourceDir().."Beam\\EbwData.lua"
local sData = EgtGetCurrMachineDir().."\\Beam\\EbwData.lua"
if EgtExistsFile( sData) then
local Machine = dofile( sData)
if Machine then
@@ -94,6 +111,12 @@ if EgtExistsFile( sData) then
if Machine.Offsets.TAB_OFFSET_Y then DeltaTabY = Machine.Offsets.TAB_OFFSET_Y end
if Machine.Offsets.TAB_OFFSET_Z then DeltaTabZ = Machine.Offsets.TAB_OFFSET_Z end
if Machine.Offsets.NOULOAD then MaxUnloadLen = Machine.Offsets.NOULOAD end
if Machine.Offsets.MIN_JOIN_VV then MinJoinVV = EgtClamp( Machine.Offsets.MIN_JOIN_VV, 60, 150) end
if Machine.Offsets.MIN_JOIN_SS then MinJoinSS = EgtClamp( Machine.Offsets.MIN_JOIN_SS, 80, 275) end
if Machine.Offsets.MIN_JOIN_LS then MinJoinLS = EgtClamp( Machine.Offsets.MIN_JOIN_LS, 250, 400) end
if Machine.Offsets.MIN_JOIN_SL then MinJoinSL = EgtClamp( Machine.Offsets.MIN_JOIN_SL, 80, 400) end
if Machine.Offsets.MIN_JOIN_LL then MinJoinLL = EgtClamp( Machine.Offsets.MIN_JOIN_LL, 300, 600) end
if Machine.Offsets.COEFF_CLAMP_CHECK then ClampingCoeffMin = Machine.Offsets.COEFF_CLAMP_CHECK end
end
ParkY = EgtClamp( ParkY, MinY, MaxY)
ParkZ = EgtClamp( ParkZ, MinZ, MaxZ)
@@ -102,17 +125,22 @@ if EgtExistsFile( sData) then
UnloadSmT = UnloadT
end
end
-- Aggiorno valori MinJoin
MinJoin = MinJoinSS
MinOther = abs( MinX1) + abs( MaxX2) + MinJoin
DeltaTol = 210
EmtGeneral {
File='Saomad-KAIROS.nge',
File='Saomad-KAIROS-MK2.nge',
Offset = Vector3d( 0.0, -835, -779.06),
AxisMaxAdjust = 30,
AxisMaxRotAdj = 0.5,
ExitMaxAdjust = 30,
ExitMaxRotAdj = 0.5,
AngDeltaMinForHome = 165,
Special = 'Saomad-KAIROS.mlse',
Processor = 'Saomad-KAIROS.mlpe'}
--AngDeltaMinForHome = 165,
NewLinkMgr = 1,
Special = 'Saomad-KAIROS-MK2.mlse',
Processor = 'Saomad-KAIROS-MK2.mlpe'}
local BaseId = EmtBase {
Name = 'Base',
Geo='BASE/GEO',
@@ -150,7 +178,7 @@ local CId = EmtAxis {
Home = ParkC,
Geo = 'C_AXIS/GEO',
Aux = {'C_AXIS/SOLID', 'C_AXIS/COLLISION'}}
EmtAxis {
local AId = EmtAxis {
Name = 'A',
Parent = 'C',
Token = 'A1',
@@ -173,7 +201,7 @@ local H1Id = EmtHead {
Rot1W = 2,
OthColl = {'A/SOLID', 'C/SOLID'},
Geo = 'H1_HEAD/GEO'}
EgtSetInfo( H1Id, 'ZMAXONROT', '1,60')
--EgtSetInfo( H1Id, 'ZMAXONROT', '1,60')
-- Sega a catena
EmtAxis {
Name = 'CS',
@@ -197,7 +225,7 @@ local H3Id = EmtHead {
SolCh = MCH_SCC.ADIR_NEAR,
OthColl = {'A/SOLID', 'C/SOLID'},
Geo = 'H3_HEAD/GEO'}
EgtSetInfo( H3Id, 'ZMAXONROT', '1,5')
--EgtSetInfo( H3Id, 'ZMAXONROT', '1,5')
-- Morse
local X1Id = EmtAxis {
Name = 'X1',
@@ -219,7 +247,7 @@ local PX1Id = EmtAxis {
Stroke = { 0, MaxHOpen},
Home = MaxHOpen,
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 {
Name = 'QX1',
Parent = 'X1',
@@ -250,7 +278,7 @@ local PX2Id = EmtAxis {
Stroke = { 0, MaxHOpen},
Home = MaxHOpen,
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 {
Name = 'QX2',
Parent = 'X2',
@@ -389,11 +417,13 @@ EgtMove( EgtGetFirstNameInGroup( X1Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( X1Id, 'COLLISION'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX1Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX1Id, 'COLLISION'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX1Id, 'CLAMP_CHECK'), vtMove + Vector3d(0,0,DistZClampToTable), GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( QX1Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( X2Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( X2Id, 'COLLISION'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX2Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX2Id, 'COLLISION'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( PX2Id, 'CLAMP_CHECK'), vtMove + Vector3d(0,0,DistZClampToTable), GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( QX2Id, 'SOLID'), vtMove, GDB_RT.GLOB)
EgtMove( EgtGetFirstNameInGroup( YId, 'SOLID'), vtMoveY, GDB_RT.GLOB)
@@ -414,8 +444,8 @@ function OnSetHead()
local dDist = EgtIf( EMC.DIST and abs( EMC.DIST) > 1, EMC.DIST, ChSawLen)
EmtModifyExitPosition( EMC.HEAD, EMC.EXIT, Point3d( 0, 0, -dDist))
-- recupero valore asse CS bloccato
local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS)
local dPosCS = tonumber( sVal:sub( 4) or '')
local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS) or ''
local dPosCS = tonumber( sVal:sub( 4)) or 0
EmtModifyAxisHome( 'C', GetChainSawCHomeFromVirtualAxis( dPosCS))
-- limiti asse A
EmtModifyAxisStroke( 'A', { -91, 91})
@@ -502,3 +532,53 @@ function OnResetMachine()
end
EgtSetStatus( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill') or GDB_ID.NULL, GDB_ST.OFF)
end
---------------------------------------------------------------------
function UpdateMinJoinDeltaTol( SB, HB, LB)
local L_SMALL = 800
local H_V = 90
local H_S = 200
local H_L = 400
local W_V = 90
local W_S = 150
local W_L = 250
local DELTA_TOL_S = 210
local DELTA_TOL_V = 110
local DELTA_TOL_L = 410
if SB <= W_V and HB <= H_V then
MinJoin = MinJoinVV
DeltaTol = DELTA_TOL_V
elseif LB <= L_SMALL then
MinJoin = MinJoinSS
DeltaTol = DELTA_TOL_S
else
local dMinJoinS
local dMinJoinL
if SB <= W_S then
dMinJoinS = MinJoinSS
dMinJoinL = MinJoinLS
elseif SB <= W_L then
local Coeff = ( SB - W_S) / ( W_L - W_S)
dMinJoinS = ( 1 - Coeff) * MinJoinSS + Coeff * MinJoinSL
dMinJoinL = ( 1 - Coeff) * MinJoinLS + Coeff * MinJoinLL
else
dMinJoinS = MinJoinSL
dMinJoinL = MinJoinLL
end
if HB <= H_S then
MinJoin = dMinJoinS
DeltaTol = DELTA_TOL_S
elseif HB <= H_L then
local Coeff = ( HB - H_S) / ( H_L - H_S)
MinJoin = ( 1 - Coeff) * dMinJoinS + Coeff * dMinJoinL
DeltaTol = ( 1 - Coeff) * DELTA_TOL_S + Coeff * DELTA_TOL_L
else
MinJoin = dMinJoinL
DeltaTol = DELTA_TOL_L
end
if SB < W_V then
DeltaTol = DELTA_TOL_V
end
end
MinOther = abs( MinX1) + abs( MaxX2) + MinJoin
end
+294 -63
View File
@@ -7,13 +7,15 @@ EgtEnableDebug( false)
LONG_TOOL_MINLEN = 221
BIG_TOOL_DIAM = 300
ALL_CLAMP_POS = {}
CLAMP_POS = {}
---------------------------------------------------------------------
-- *** GENERATION ***
---------------------------------------------------------------------
local sBaseDir = EgtGetSourceDir()
local sBaseDir = EgtGetCurrMachineDir()
if NumericalControl == 'SIEMENS' then
dofile( sBaseDir .. 'Saomad-KAIROS.SIEMENS.mlpe')
dofile( sBaseDir .. '\\Saomad-KAIROS-MK2.SIEMENS.mlpe')
else
EmtSetLastError( 1201, 'Numerical Control error : unkwnown type')
end
@@ -30,10 +32,20 @@ function OnSimulStart()
if vTcPos then
for i = 1, #vTcPos do
local vTools = EgtGetToolsInCurrSetupPos( vTcPos[i])
if vTools and vTools[1] then
EgtLoadTool( vTcPos[i], 1, vTools[1])
ShowToolInTcPos( vTcPos[i], true)
for j = 1, #( vTools or {}) do
if vTools[j] ~= '' then
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
ShowToolInTcPos( vTcPos[i], true)
end
end
-- Carico l'utensile iniziale o di default sulla testa
@@ -97,6 +109,29 @@ function OnSimulStart()
end
-- Preparo lista collisioni vuota
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
---------------------------------------------------------------------
@@ -122,13 +157,13 @@ function OnSimulDispositionStart()
-- Determino dimensioni del grezzo
local nSolId = EgtGetFirstNameInGroup( EgtGetFirstRawPart() or GDB_ID.NULL, 'RawSolid') or GDB_ID.NULL
local b3Sol = EgtGetBBoxGlob( nSolId, GDB_BB.STANDARD)
EMT.LB = 0
EMT.SB = 0
EMT.HB = 0
EMT.LENGTHBEAM = 0
EMT.WIDTHBEAM = 0
EMT.HEIGHTBEAM = 0
if b3Sol then
EMT.LB = b3Sol:getDimX()
EMT.SB = b3Sol:getDimY()
EMT.HB = b3Sol:getDimZ()
EMT.LENGTHBEAM = b3Sol:getDimX()
EMT.WIDTHBEAM = b3Sol:getDimY()
EMT.HEIGHTBEAM = b3Sol:getDimZ()
end
-- Se vero inizio e abilitato creo gli Zmap
EMT.VMILL = {}
@@ -193,7 +228,7 @@ function OnSimulDispositionStart()
end
table.insert( EMT.VMILL, VMillId)
end
nPartRawId = EgtGetNextRawPart( nPartRawId)
nPartRawId = EgtGetNextRawPart( nPartRawId)
end
end
-- fasi successive
@@ -234,18 +269,22 @@ function OnSimulDispositionStart()
local nOrd = GetPhaseOrd( EMT.PHASE)
local nScrapOrd = GetPhaseOrd( EgtGetPhaseCount()) + 1
local b3Raw = BBox3d()
local b3Bar = BBox3d()
local b3Part = BBox3d()
local nPartRawId, nScrapRawId
local nRawId = EgtGetFirstRawPart()
while nRawId do
local nNextRawId = EgtGetNextRawPart( nRawId)
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
EmtLinkRawPartToGroup( nRawId, 'Tab')
local b3Tmp = EgtGetRawPartBBox( nRawId)
b3Bar:Add( b3Tmp)
local nRawOrd = EgtGetInfo( nRawId, 'ORD', 'i')
if nRawOrd == nOrd then
b3Raw = EgtGetRawPartBBox( nRawId)
b3Raw:Add( b3Tmp)
b3Part:Add( b3Tmp)
nPartRawId = nRawId
elseif nRawOrd == nOrd + 1 and nRawOrd == nScrapOrd then
local b3Tmp = EgtGetRawPartBBox( nRawId) or BBox3d()
b3Raw:Add( b3Tmp)
nScrapRawId = nRawId
end
@@ -259,6 +298,9 @@ function OnSimulDispositionStart()
else
EMT.SCRAP = nil
end
EMT.LENGTHBEAM = b3Bar:getDimX()
EMT.LENGTHRAW = b3Raw:getDimX()
EMT.LENGTHPART = b3Part:getDimX()
-- recupero CutId del pezzo in lavorazione
EMT.CUTID = EgtGetInfo( EgtGetFirstPartInRawPart( nPartRawId or GDB_ID.NULL) or GDB_ID.NULL, 'CUTID', 'i') or 0
EMT.X1SPEC = nil
@@ -328,6 +370,7 @@ function OnSimulDispositionStart()
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then
EmtLinkRawPartToGroup( nRawId, 'Tab')
b3Bar = EgtGetRawPartBBox( nRawId)
else
EgtMove( nRawId, vtMove, GDB_RT.GLOB)
EgtSetStatus( nRawId, GDB_ST.OFF)
@@ -335,6 +378,7 @@ function OnSimulDispositionStart()
end
nRawId = nNextRawId
end
EMT.LENGTHBEAM = b3Bar:getDimX()
-- altrimenti fase finale, aggancio primo grezzo alla tavola e gli altri in posizione carico al carro Y
else
-- indice primo grezzo della fase
@@ -350,12 +394,14 @@ function OnSimulDispositionStart()
nRawId = EgtGetNextRawPart( nRawId)
end
-- eseguo
local b3Bar = BBox3d()
nRawId = EgtGetFirstRawPart()
while nRawId do
local nNextRawId = EgtGetNextRawPart( nRawId)
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then
EmtLinkRawPartToGroup( nRawId, 'Tab')
b3Bar = EgtGetRawPartBBox( nRawId)
else
EgtMove( nRawId, vtMove, GDB_RT.GLOB)
EmtLinkRawPartToGroup( nRawId, 'X1')
@@ -363,6 +409,7 @@ function OnSimulDispositionStart()
end
nRawId = nNextRawId
end
EMT.LENGTHBEAM = b3Bar:getDimX()
end
-- Indicazione angolo rotazione pezzo
EMT.ROT = EgtGetInfo( EMT.DISPID, 'ROT', 'i') or 0
@@ -394,6 +441,7 @@ function OnSimulDispositionEnd()
EMT.POSTROT = true
end
end
EMT.SPLIT = false
EMT.OPEISDISP = false
end
@@ -456,6 +504,10 @@ function OnSimulToolSelect( dPosCS)
EMT.TCPOS_1 = EMT.TCPOS
-- lo nascondo sul portautensili
ShowToolInTcPos( EMT.TCPOS, false)
-- movimento di uscita dal porta utensile
if EMT.HEAD == 'H1' or EMT.HEAD == 'H2' then
SimulMoveAxes( 'Y', ParkY, MCH_SIM_STEP.RAPID, 'A', ParkA, MCH_SIM_STEP.RAPROT, 'C', ParkC, MCH_SIM_STEP.RAPROT)
end
end
---------------------------------------------------------------------
@@ -474,30 +526,39 @@ function OnSimulToolDeselect()
else
SimulMoveAxes( 'A', ParkA, MCH_SIM_STEP.COLLROT, 'C', GetChainSawCHomeFromVirtualAxis( dPosCS), MCH_SIM_STEP.COLLROT)
end
SimulMoveAxis( 'Y', ParkY, MCH_SIM_STEP.RAPID)
elseif EMT.HEAD == 'H2' then
SimulMoveAxes( 'A', TakePosTC_R, MCH_SIM_STEP.COLLROT, 'C', ParkC, MCH_SIM_STEP.COLLROT)
elseif EMT.HEAD == 'H1' then
SimulMoveAxes( 'A', TakePosTC_L, MCH_SIM_STEP.COLLROT, 'C', ParkC, MCH_SIM_STEP.COLLROT)
end
SimulMoveAxis( 'Y', MinY, MCH_SIM_STEP.RAPID)
-- breve pausa
EgtPause( 100)
-- nascondo utensile su testa e lo visualizzo su TcPos
EgtSetMode( EgtGetHeadId( EMT.HEAD), GDB_MD.HIDDEN)
ShowToolInTcPos( EMT.TCPOS_1, true)
-- movimento per carico utensile
SimulMoveAxes( 'A', ParkA, MCH_SIM_STEP.RAPROT, 'C', ParkC, MCH_SIM_STEP.RAPROT)
--SimulMoveAxes( 'Y', ParkY, MCH_SIM_STEP.RAPID, 'A', ParkA, MCH_SIM_STEP.RAPROT, 'C', ParkC, MCH_SIM_STEP.RAPROT)
EgtOutText( '')
-- deposito utensile
else
if EMT.NEXTTOOL ~= EMT.TOOL_1 then
EgtOutText( 'Tool change in progress...')
-- simulo movimento
SimulMoveAxes( 'A', ParkA, MCH_SIM_STEP.COLLROT, 'C', ParkC, MCH_SIM_STEP.COLLROT)
SimulMoveAxis( 'Y', ParkY, MCH_SIM_STEP.RAPID)
if EMT.HEAD == 'H2' then
SimulMoveAxes( 'A', TakePosTC_R, MCH_SIM_STEP.COLLROT, 'C', ParkC, MCH_SIM_STEP.COLLROT)
elseif EMT.HEAD == 'H1' then
SimulMoveAxes( 'A', TakePosTC_L, MCH_SIM_STEP.COLLROT, 'C', ParkC, MCH_SIM_STEP.COLLROT)
end
SimulMoveAxis( 'Y', MinY, MCH_SIM_STEP.RAPID)
-- breve pausa
EgtPause( 100)
-- nascondo utensile su testa e lo visualizzo su TcPos
EgtSetMode( EgtGetHeadId( EMT.HEAD), GDB_MD.HIDDEN)
ShowToolInTcPos( EMT.TCPOS_1, true)
-- nascondo l'utensile corrente
EgtSetStatus( EgtGetHeadId( EMT.HEAD), GDB_ST.OFF)
-- eseguo movimento opportuno
SimulMoveAxes( 'A', ParkA, MCH_SIM_STEP.RAPROT, 'C', ParkC, MCH_SIM_STEP.RAPROT)
EgtOutText( '')
-- eseguo movimento opportuno
--SimulMoveAxes( 'A', ParkA, MCH_SIM_STEP.RAPROT, 'C', ParkC, MCH_SIM_STEP.RAPROT)
else
EMT.TOOL_1 = nil
EMT.TCPOS_1 = nil
@@ -543,6 +604,7 @@ function OnSimulMachiningEnd()
EMT.UNLOADING = false
EMT.FALL = false
end
EMT.SPLIT = nil
EMT.PREVHEAD = EMT.HEAD
EMT.PREVEXIT = EMT.EXIT
end
@@ -697,6 +759,8 @@ function ExecAuxCmd( sCmd)
if Cmd[1] == '0' then
if Cmd[2] == 'Unloading' then
EMT.UNLOADING = true
elseif Cmd[2] == 'Split' then
EMT.SPLIT = true
elseif Cmd[2] == 'Fall' then
EMT.FALL = true
end
@@ -738,29 +802,9 @@ function ExecAuxCmd( sCmd)
end
end
elseif Cmd[1] == '11' then
local dPX1 = MaxHOpen
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')
ExecMovePX1( Cmd)
elseif Cmd[1] == '12' then
local dPX2 = MaxHOpen
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')
ExecMovePX2( Cmd)
elseif Cmd[1] == '21' then
local nX1Delta = tonumber( Cmd[2])
local nX2Delta = tonumber( Cmd[3])
@@ -791,7 +835,7 @@ function ExecUnloading()
-- li sposto per lasciare spazio al nuovo pezzo
local nId = EgtGetFirstInGroup( nVmGrpId)
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)
end
-- creo un nuovo layer e vi inserisco il nuovo pezzo
@@ -833,15 +877,199 @@ function ExecUnloading()
end
---------------------------------------------------------------------
function VerifyYSlide( sName1, dVal1, sName2, dVal2)
-- Se movimento trave agganciata con carrello Y
function CheckClamping( sClampName)
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
local dYDeltaP = EgtGetAxisPos( 'T') - EgtGetAxisPos( 'X1')
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
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)
end
end
@@ -850,15 +1078,15 @@ function VerifyYSlide( sName1, dVal1, sName2, dVal2)
end
---------------------------------------------------------------------
function VerifyVSlide( sName1, dVal1, sName2, dVal2)
-- Se movimento trave agganciata con carrello V
function VerifyX2Slide( sName1, dVal1, sName2, dVal2)
-- Se movimento trave agganciata con carrello X1
if sName1 == 'T' and sName2 == 'X2' and GetPX2Light() then
local dVDeltaP = EgtGetAxisPos( 'T') - EgtGetAxisPos( 'X2')
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
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)
end
end
@@ -874,9 +1102,9 @@ function VerifyOneChariotSlide( sName1, dVal1, sName2, dVal2)
end
-- Eseguo verifica
if sName2 == 'X1' then
return VerifyYSlide( sName1, dVal1, sName2, dVal2)
return VerifyX1Slide( sName1, dVal1, sName2, dVal2)
elseif sName2 == 'X2' then
return VerifyVSlide( sName1, dVal1, sName2, dVal2)
return VerifyX2Slide( sName1, dVal1, sName2, dVal2)
end
return true
end
@@ -893,9 +1121,9 @@ function VerifyTwoChariotsSlide( sName1, dVal1, sName2, dVal2, sName3, dVal3)
end
-- Eseguo verifica
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
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
return true
end
@@ -999,14 +1227,14 @@ local RAPID_Y_FEED = FmaxY -- mm/min ex: 45000
local RAPID_Z_FEED = FmaxZ -- mm/min ex: 45000
local RAPID_C_FEED = FmaxC -- deg/min ex: 18000
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 LOAD_T = 20 -- s ex: 16
local CHAR_ONE_MOVE_T = 3.5 -- s ex: 2
local LOAD_T = 10 -- s ex: 16
local CHAR_ONE_MOVE_T = 1.7 -- s ex: 2
local ROTATION_T = 40 -- s ex: 40
local SPLIT_T = 12 -- s ex: 9
local UNLOAD_T = 15 -- s ex: 12
local FALL_T = 4 -- s ex: 4
local SPLIT_T = 3 -- s ex: 9
local UNLOAD_T = 10 -- s ex: 12
local FALL_T = 2 -- s ex: 4
---------------------------------------------------------------------
function OnEstimStart()
@@ -1450,8 +1678,11 @@ function IsLastMachining( nMchId)
local nOpeId = EgtGetNextActiveOperation( nMchId)
while nOpeId do
local nType = EgtGetOperationType( nOpeId)
-- se c'è una lavorazione
if nType ~= MCH_OY.NONE and nType ~= MCH_OY.DISP then
return false
elseif nType == MCH_OY.DISP and IsRestPhase( EMT.PHASE + 1) then
return false
end
nOpeId = EgtGetNextActiveOperation( nOpeId)
end
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