Compare commits

...

7 Commits

Author SHA1 Message Date
andrea.villa 8544e05690 - Modifiche per lavorazioni in doppio
- Corretto problema in risalita, scriveva un movimento CLIMB
2026-06-15 15:20:01 +02:00
andrea.villa 11dfc9c4b7 - Si resetta piano lavoraizone anche se cambiano solo i rulli
- Piccole modifiche minori
2026-06-12 14:54:18 +02:00
andrea.villa 982fa60005 Lettura posizione parcheggi da Offset TS3 2026-06-08 10:05:30 +02:00
daniele.nicoli 28606a4a3a Merge branch 'Test_M77' into NewLink. Test fatti da Mariano Ok. 2026-06-04 11:30:44 +02:00
daniele.nicoli c414cde957 Split - spostate travi alla quota di parcheggio dei rulli in modo che l'area di lavoro sia sgombra dopo uno split. 2026-06-04 08:56:04 +02:00
daniele.nicoli ce76fe23d2 OnRapid() diminuita la tolleranza 0.1 -> GEO.EPS_SMALL per il cambio degli assi rotativi. 2026-05-29 11:52:37 +02:00
daniele.nicoli 95867ec10f Tolto commento a M77, versione DEV1 da testare 2026-05-27 13:17:58 +02:00
4 changed files with 75 additions and 80 deletions
+43 -56
View File
@@ -326,7 +326,6 @@ function OnDispositionEnd()
if IsRestPhase( EMT.PHASE + 1) then
EmitMoveWaitChars( 2)
else
-- EmitMoveWaitChars( 2, TEST_USE)
-- posticipo attesa fine scarico alla lavorazione successiva
EMT.LASTOPEISUNLOAD = true
end
@@ -593,7 +592,7 @@ function OnMachiningEnd()
EmtOutput( sOut)
end
elseif not EMT.PREROT then
EmtOutput( '(M77)')
EmtOutput( 'M77')
end
end
end
@@ -697,9 +696,7 @@ end
---------------------------------------------------------------------
function OnPathEnd()
if not EMT.ZMAX then
-- EmitResetMachining( true)
end
-- salvo dati precedenti
EMT.L2pp = EMT.L2o
@@ -829,6 +826,12 @@ function OnRapid()
-- gruppo della testa
local nHSet = GetHeadSet( EMT.HEAD)
-- se ultimo movimento era LastClimb, su questo punto si attiva il piano
if EMT.PREVLASTCLIMB or ( bStdMachRapid and EMT.MCHFIRST) then
EMT.PREVLASTCLIMB = nil
EMT.LAST_APPROACH_RAPID = true
end
-- se primo movimento della lavorazione, gestione speciale
if EMT.MCHFIRST then
-- se carico trave
@@ -865,9 +868,10 @@ function OnRapid()
EmitMoveWaitChars( EgtIf( bOnlyCharY, 1, 3))
else
-- controllo se ci sono spostamenti dei carrelli programmati
local bChangeCarriageClamping = CheckChangeCarriageClamping()
local bChangeCarriageClamping = GetMovesInAuxCmd( EMT.AUXCMD)
local bRotAxChanged = ( abs( EMT.R1prec - EMT.R1) > GEO.EPS_SMALL or abs( EMT.R2prec - EMT.R2) > GEO.EPS_SMALL)
-- se non ci sono riposizionamenti dei carrelli, se stesso utensile, e c'è ancora piano attivo dalla lavorazione precedente, allora questo è un climb
if not bChangeCarriageClamping and EMT.TOOL == EMT.PREVTOOL and EMT.PLANEACTIVE and ( abs( EMT.R1prec - EMT.R1) < 0.1 and abs( EMT.R2prec - EMT.R2) < 0.1) then
if EMT.PLANEACTIVE and EMT.TOOL == EMT.PREVTOOL and not bChangeCarriageClamping and not bRotAxChanged then
-- dichiaro finita lavorazione precedente
local sOut = 'G157 EA1'
EmtOutput( sOut)
@@ -905,7 +909,7 @@ function OnRapid()
end
-- si disattiva piano a meno che non sia lavorazione con stesso utensile e stesso orientamento assi
if EMT.PLANEACTIVE then
if EMT.PLANEACTIVE then
EmitResetMachining( false)
end
@@ -972,7 +976,6 @@ function OnRapid()
end
end
EMT.MCHFIRST = false
-- movimento standard CLIMB
elseif EMT.FLAG == 2 then
MyAdjustLinearAxes()
@@ -999,7 +1002,7 @@ function OnRapid()
-- se lavorazione in doppio
if nHSet == 1 and EMT.DOU_TYPE == 2 then
for i = 1, #EMT.APPROACH.DBLRISES do
EmitMoveDataHead( 2, { X=EMT.APPROACH.DBLRISES[i].L2, Z=EMT.APPROACH.DBLRISES[i].L3, C=EMT.APPROACH.DBLRISES[i].R1, B=EMT.APPROACH.DBLRISES[i].R2})
EmitMoveDataHead( 2, { X=-EMT.APPROACH.DBLRISES[i].L2, Z=EMT.APPROACH.DBLRISES[i].L3, C=EMT.APPROACH.DBLRISES[i].R1, B=EMT.APPROACH.DBLRISES[i].R2})
end
EmitMoveStartHead( 2)
EmitMoveWaitHead( 2)
@@ -1017,7 +1020,17 @@ function OnRapid()
end
-- se ultimo, oppure unico, movimento in discesa sul pezzo, attivo piano generico. Se già attivo siginifica che è seconda lavorazione compatibile
if not EMT.PLANEACTIVE and ( bLastClimb or bUniqueClimb or bStdClimb) then
if not EMT.PLANEACTIVE and ( EMT.LAST_APPROACH_RAPID or bLastClimb or bUniqueClimb) then
-- si scrive ultimo punto prima di attivare il piano solo in caso sia un rapido calcolato da CAM5, altrimenti siamo già sul punto
if not ( bLastClimb or bUniqueClimb) and not EMT.MCHFIRST then
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
local dTRad, dTLen = GetToolRadLen()
EmitMoveDataHead( nHSet, { X=EMT.L2, Z=EMT.L3, C=EMT.R1, B=EMT.R2, TRad=dTRad, TLen=dTLen, S=CalcRealSpeed( EMT.S)})
end
EMT.LAST_APPROACH_RAPID = nil
bStdMachRapid = false
EMT.ZMAX = false
-- movimenti testa
-- scrittura comando start movimenti testa
@@ -1025,7 +1038,7 @@ function OnRapid()
-- se lavorazione in doppio
if nHSet == 1 and EMT.DOU_TYPE == 2 then
for i = 1, #EMT.APPROACH.DBLCLIMBS do
EmitMoveDataHead( 2, { X=EMT.APPROACH.DBLCLIMBS[i].L2, Z=EMT.APPROACH.DBLCLIMBS[i].L3, C=EMT.APPROACH.DBLCLIMBS[i].R1, B=EMT.APPROACH.DBLCLIMBS[i].R2})
EmitMoveDataHead( 2, { X=-EMT.APPROACH.DBLCLIMBS[i].L2, Z=EMT.APPROACH.DBLCLIMBS[i].L3, C=EMT.APPROACH.DBLCLIMBS[i].R1, B=EMT.APPROACH.DBLCLIMBS[i].R2})
end
EmitMoveStartHead( 2)
EmitMoveWaitHead( 2)
@@ -1210,6 +1223,15 @@ function OnRapid()
EMT.TPOS = EMT.L1o
EmtUpdatePrev()
EMT.MCHFIRST = false
-- se si è attivato il piano, disattivo che è stato climb ultimo movimento
if EMT.PLANEACTIVE then
EMT.PREVLASTCLIMB = nil
-- se è ultimo movimento di climb, si salva per scrivere il piano in movimento successivo
elseif bStdClimb then
EMT.PREVLASTCLIMB = true
end
-- si salva posizione assi rotanti
EMT.R1prec = EMT.R1
EMT.R2prec = EMT.R2
@@ -1260,7 +1282,7 @@ function OnLinear()
MyAdjustLinearAxes()
EmtAdjustRotaryAxes()
-- se lavorazione in doppio e fondo foro, inverto movimento punta doppia
-- se lavorazione in doppio e fondo foro, inverto movimento punta doppia
if EMT.MCHTYPE == MCH_MY.DRILLING and not EMT.DBLHEADPARA and EMT.DOU_TYPE == 2 and EMT.FLAG == 105 then
EmtOutput( "G157 EE-1")
EMT.DBLHEADPARA = true
@@ -1380,28 +1402,6 @@ function CalcCharStatusN( sCmd)
end
end
---------------------------------------------------------------------
-- controlla se nella tabella AUX sono presenti dei movimenti dei carrelli
function CheckChangeCarriageClamping()
local ChangeCarriagesParam = {
'1', -- movimento singolo carro
'2', -- movimento carro e trave
'3', -- movimento 2 carri e trave
'4', -- risalita a Z max
'11', -- comando pinza 1
'12' -- comando pinza 2
}
for i=1, #EMT.AUXCMD do
local Cmd = EgtSplitString( EMT.AUXCMD[i])
for j=1, #ChangeCarriagesParam do
if Cmd[1] == ChangeCarriagesParam[j] then
return true
end
end
end
return false
end
---------------------------------------------------------------------
function PrepareLoad( sCmd, nInd, bStart)
local Cmd = EgtSplitString( sCmd)
@@ -2352,27 +2352,14 @@ function EmitParkRoller( dPosT, bSplitCut, bUsePrevDelta)
local DiffY2 = MyParkY2 - dPosY2
--EmtOutput( string.format( 'PosT=%.3f DiffY1=%.3f DiffY2=%.3f', dPosT, DiffY1, DiffY2))
if bSplitCut then
local bYNoMove, bVNoMove
if DiffY1 > 0.1 then
bYNoMove = false
MDChar.Y1 = dPosY1 + DiffY1
else
bYNoMove = true
MDChar.Y1 = dPosY1
end
if DiffY2 < -0.1 then
bVNoMove = false
MDChar.Y2 = dPosY2 + DiffY2
dPosT = dPosT + DiffY2
else
bVNoMove = true
MDChar.Y2 = dPosY2
end
-- se anche solo una morsa è restata in posizione, le sposto comunque entrambe di 5mm per distanziare i pezzi separati
if bYNoMove or bVNoMove then
MDChar.Y1 = MDChar.Y1 + 150
MDChar.Y2 = MDChar.Y2 - 150
end
local dAddMoveY1 = ParkV1 + ( -dPosT - EMT.LT)
local dAddMoveY2 = ParkV2 + ( -dPosT - EMT.LT)
local MoveY1 = max( DiffY1, dAddMoveY1, 30.0)
local MoveY2 = min( DiffY2, dAddMoveY2, -30.0)
MDChar.Y1 = dPosY1 + MoveY1
MDChar.Y2 = dPosY2 + MoveY2
dPosT = dPosT + MoveY2
elseif DiffY1 > 0.1 and DiffY2 < -0.1 then
EmtSetLastError( 1201, 'Error Collision in ParkRoller')
elseif DiffY1 > 0.1 then
+14 -18
View File
@@ -843,10 +843,15 @@ end
function OnSimulMoveStart()
-- tipo di movimento
local bFirstClimb = EgtGetInfo( EMT.MOVEID, 'FirstClimb', 'b')
local bLastClimb = EgtGetInfo( EMT.MOVEID, 'LastClimb', 'b')
local bFirstRise = EgtGetInfo( EMT.MOVEID, 'FirstRise', 'b')
local bLastRise = EgtGetInfo( EMT.MOVEID, 'LastRise', 'b')
local bUniqueClimb = EgtGetInfo( EMT.MOVEID, 'UniqueClimb', 'b')
local bUniqueRise = EgtGetInfo( EMT.MOVEID, 'UniqueRise', 'b')
-- se il link non arriva dalla OnSpecial, non ha nessuna nota
local bStdClimb = ( EMT.FLAG2 ~= 2 and EMT.FLAG == 2)
local bStdRise = ( EMT.FLAG2 ~= 2 and EMT.FLAG == 3)
local bStdMachRapid = ( EMT.FLAG2 == 0 and ( EMT.FLAG == 0 or EMT.FLAG == 1))
-- se primo rapido della lavorazione è un movimento standard, allora questo è l'ultimo climb
@@ -974,11 +979,11 @@ function OnSimulMoveStart()
-- se lavorazione in doppio
if EMT.DOU_TYPE then
if EgtGetInfo( EMT.MOVEID, 'FirstClimb', 'b') or EgtGetInfo( EMT.MOVEID, 'UniqueClimb', 'b') then
if bFirstClimb or bUniqueClimb or bStdClimb then
EMT.IS_CLIMB = true
EMT.IS_RISE = false
EMT.INDEX_APPROACH_MOVE = 0
elseif EgtGetInfo( EMT.MOVEID, 'FirstRise', 'b') or EgtGetInfo( EMT.MOVEID, 'UniqueRise', 'b') then
elseif bFirstRise or bUniqueRise or bStdRise then
EMT.IS_CLIMB = false
EMT.IS_RISE = true
EMT.INDEX_APPROACH_MOVE = 0
@@ -1002,7 +1007,7 @@ function OnSimulMoveStart()
if EMT.DOU_TYPE == 2 then
-- controllo minima distanza tra utensili di X1 e X2
local dDeltaX1X2 = EMT.L2 - EMT.A5 - Head2Y
local dDistToolX1X2 = -dDeltaX1X2 - MillOffs - EMT.TTOTLEN - Mill2Offs - EMT.DOU_TTOTLEN
local dDistToolX1X2 = dDeltaX1X2 - MillOffs - EMT.TTOTLEN - Mill2Offs - EMT.DOU_TTOTLEN
if dDistToolX1X2 < MinDistToolX1X2 and EMT.MCHNAME ~= EMT.DOUBLECOLLMACH then
EMT.DOUBLECOLLMACH = EMT.MCHNAME
local sErr = 'X1 X2 tools in collision (distance=' .. EgtNumToString( dDistToolX1X2, 1) .. ')'
@@ -1068,7 +1073,7 @@ function OnSimulMoveStart()
if EMT.DOU_TYPE then
-- se testa 2 ha più movimenti della testa 1, eseguo tutti i movimenti della testa due che mancano
if EgtGetInfo( EMT.MOVEID, 'LastClimb', 'b') or EgtGetInfo( EMT.MOVEID, 'UniqueClimb', 'b') then
if bLastClimb or bUniqueClimb then
if #EMT.APPROACH.DBLCLIMBS > #EMT.APPROACH.CLIMBS then
while EMT.INDEX_APPROACH_MOVE < #EMT.APPROACH.DBLCLIMBS do
EMT.INDEX_APPROACH_MOVE = EMT.INDEX_APPROACH_MOVE + 1
@@ -1079,7 +1084,7 @@ function OnSimulMoveStart()
SimulMoveAxes( 'X2', EMT.A5, MCH_SIM_STEP.RAPID, 'Z2', EMT.A6, MCH_SIM_STEP.RAPID, 'C2', EMT.A7, MCH_SIM_STEP.COLLROT, 'B2', EMT.A8, MCH_SIM_STEP.COLLROT)
end
end
elseif EgtGetInfo( EMT.MOVEID, 'LastRise', 'b') or EgtGetInfo( EMT.MOVEID, 'UniqueRise', 'b') then
elseif bLastRise or bUniqueRise then
if #EMT.APPROACH.DBLRISES > #EMT.APPROACH.RISES then
while EMT.INDEX_APPROACH_MOVE < #EMT.APPROACH.DBLRISES do
EMT.INDEX_APPROACH_MOVE = EMT.INDEX_APPROACH_MOVE + 1
@@ -1661,19 +1666,10 @@ function ExecParkRoller( PosY1, PosY2, PosV1, PosV2, bSpliCut, bAgg)
local DiffY2 = MyParkY2 - PosY2
-- se appena eseguito taglio di separazione
if bSpliCut then
local dAddMove
-- se entrambe le morse si spostano vado in posizione calcolata
if DiffY1 > 0.1 and DiffY2 < -0.1 then
dAddMove = 0
-- se almeno una è rimasta ferma in posizione, allontano comunque di 30mm ulteriori
else
dAddMove = 150
end
local MoveY1 = max( DiffY1, 0.0)
local MoveY2 = min( DiffY2, 0.0)
MoveY1 = MoveY1 + dAddMove
MoveY2 = MoveY2 - dAddMove
local dAddMoveY1 = ParkV1 + ( -PosT - EMT.LR)
local dAddMoveY2 = ParkV2 + ( -PosT - EMT.LR)
local MoveY1 = max( DiffY1, dAddMoveY1, 30.0)
local MoveY2 = min( DiffY2, dAddMoveY2, -30.0)
-- aggancio i pezzi rimanenti all'asse Y1
LinkRemainingPartsToY1()
+13 -3
View File
@@ -175,6 +175,16 @@ function OnSpecialLink()
EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN)
EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, MaxZ1, EMC.R1, 0}, 30, 2, 2, 'FirstClimb=1;')
EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1, EMC.L2, EMC.L3, EMC.R1, EMC.R2}, 30, 2, 2, 'LastClimb=1;')
else
-- se altra testa arriva da home, devo per forza avere un CLIMB, creo il punto
if EMC.OTHERLINKTYPE == 1 then
EmtRemoveClimb( EMC.NEXTMCHID, EMC.NEXTMAIN)
EmtAddClimb( EMC.NEXTMCHID, EMC.NEXTMAIN, vInitAxLink, 30, 2, 2, 'UniqueClimb=1;')
-- se altra testa deve andare in home, devo per forza avere un RISE, creo il punto
elseif EMC.OTHERLINKTYPE == 2 then
EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN)
EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, vFinalAxLink, 30, 3, 2, 'UniqueRise=1;')
end
end
end
@@ -230,7 +240,7 @@ function OnSpecialLink()
-- retrazione
EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN)
if abs( EMC.R2) > 91 then
EmtAddRise( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1p, EMC.L2p, ParkZ1, EMC.R1p, EgtClamp( EMC.R2, -90, 90)}, 30, 2, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;')
EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, ParkZ1, EMC.R1p, EgtClamp( EMC.R2p, -90, 90)}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;')
EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1Blade, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'LastRise=1;')
else
EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1Blade, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'UniqueRise=1;')
@@ -415,7 +425,7 @@ function OnSpecialLink()
-- retrazione
EmtRemoveRise( EMC.PREVMCHID, EMC.PREVMAIN)
if abs( EMC.R2) > 91 then
EmtAddRise( EMC.NEXTMCHID, EMC.NEXTMAIN, { EMC.L1p, EMC.L2p, ParkZ1, EMC.R1p, EgtClamp( EMC.R2, -90, 90)}, 30, 2, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;')
EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, ParkZ1, EMC.R1p, EgtClamp( EMC.R2p, -90, 90)}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'FirstRise=1;')
EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1Blade, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'LastRise=1;')
else
EmtAddRise( EMC.PREVMCHID, EMC.PREVMAIN, { EMC.L1p, EMC.L2p, MaxZ1Blade, EMC.R1p, 0}, 30, 3, 2, EgtIf( bSplit, 'Split=1;', '')..'UniqueRise=1;')
@@ -3159,7 +3169,7 @@ function SpecOutputCmds( vCmd, bEnd)
local sInfo = '23,'..EgtNumToString( Cmd[2],3)
EgtSetInfo( EMC.PATHID, sKey, sInfo)
EMC.W2DELTA = Cmd[2]
-- riporta trave in zona carico dopo una fase start partita con un riposizionam,ento
-- riporta trave in zona carico dopo una fase start partita con un riposizionamento
elseif Cmd[1] == 24 then
local sInfo = '24,'..Cmd[2]..','..EgtNumToString( Cmd[3],3)..','..Cmd[4]..','..EgtNumToString( Cmd[5],3)..EgtIf( Cmd[6], ',*', '')
EgtSetInfo( EMC.PATHID, sKey, sInfo)
+5 -3
View File
@@ -32,8 +32,8 @@
require( 'EmtGenerator')
EgtEnableDebug( false)
PP_VER = '3.1e1_NL10'
PP_NVER = '3.1.3.2'
PP_VER = '3.1f1_CR2'
PP_NVER = '3.1.6.1'
MIN_MACH_VER = '2.5k1'
MACH_NAME = EgtGetCurrMachineName()
@@ -165,7 +165,8 @@ if EgtExistsFile( sData) then
end
if Machine.Offsets.X1_POS then MinX1 = -Machine.Offsets.X1_POS end
if Machine.Offsets.X1_NEG then MaxX1 = -Machine.Offsets.X1_NEG end
if Machine.Offsets.PARK_X1 then ParkX1 = -Machine.Offsets.PARK_X1 end
if Machine.Offsets.PARK_X1POS then ParkFrnX1 = -Machine.Offsets.PARK_X1POS end
if Machine.Offsets.PARK_X1NEG then ParkX1 = -Machine.Offsets.PARK_X1NEG end
if Machine.Offsets.Z1_NEG then MinZ1 = Machine.Offsets.Z1_NEG end
if Machine.Offsets.Z1_POS then MaxZ1 = min( MaxZ1, Machine.Offsets.Z1_POS) end
if Machine.Offsets.Z1_POS_LAMA then MaxZ1Blade = min( MaxZ1Blade, Machine.Offsets.Z1_POS_LAMA) end
@@ -230,6 +231,7 @@ if EgtExistsFile( sData) then
ParkV2 = MinV2
ParkY2 = ParkV2 - MinDeltaYV
ParkX1 = min( ParkX1, MaxX1)
ParkFrnX1 = max( ParkFrnX1, MinX1)
MaxZ1Blade = min( MaxZ1Blade, MaxZ1)
ParkCSawZ1 = min( ParkCSawZ1, MaxZ1)
ParkCSaw0Z1 = min( ParkCSaw0Z1, MaxZ1)