Compare commits

...

144 Commits

Author SHA1 Message Date
andrea.villa 5e9912eb5f Merge provvisorio con common 2026-06-05 15:19:34 +02:00
daniele.nicoli 0c2333df8b In caso di ultimo movimento come scarico rimanenza, porta V2 in posizione di parcheggio 2026-05-28 14:44:39 +02:00
daniele.nicoli d1ddc26d8f Merge branch 'main' into develop 2026-05-28 14:40:43 +02:00
andrea.villa 0ea2adecbb Merge branch 'develop' 2026-05-15 10:36:20 +02:00
andrea.villa d401d8e37c Corretta gestione scarico manuale ( errore in versione 3.1e1) 2026-05-15 10:35:44 +02:00
andrea.villa ebbe1c9ac6 corretto nome variabile 2026-05-15 09:24:18 +02:00
andrea.villa e88ce08053 Merge remote-tracking branch 'origin/main' into develop 2026-05-15 09:23:57 +02:00
andrea.villa 97ec5d29c6 Merge branch 'develop' 2026-05-12 15:50:24 +02:00
andrea.villa 293dc97749 Cambio versione per rilascio a cliente 2026-05-12 15:50:14 +02:00
daniele.nicoli 1fa5c7de64 Sistemata gestione di pezzi lunghi che necessitano lo scarico manuale :
- Simulazione (muoveva Y2 a MaxY2 senza aprire pinza).
- Generazione (non chiudeva rulliere e dava extracorsa e non generava P7=-85).
2026-05-12 13:14:47 +02:00
daniele.nicoli 61fe9ba362 Merge remote-tracking branch 'origin/main' into develop 2026-05-12 13:00:11 +02:00
andrea.villa 300eead9d1 Merge branch 'develop' 2026-03-12 16:12:37 +01:00
andrea.villa caf3739c3f Cambio versione per rilascio a cliente 2026-03-12 16:12:04 +01:00
daniele.nicoli bd04fcb4ab Solo se dY1DeltaMaxSP > WorkTab.dY1DeltaMinF lo prende in considerazione per il valore di WorkTab.dY1DeltaMaxF 2026-03-12 15:55:01 +01:00
andrea.villa 021e841126 - Aggiunta OnSpecialApplyMachining per calcolare i carrelli da subito
- Aggiungendo OnSpecialApplyMachining, ora la OnSpecialGetPrevMachiningOffset lavora correttamente
2026-03-12 15:22:46 +01:00
andrea.villa 87f7aad2f0 - Revert modifica fatta al ParkRoller
- Ora calcola la lunghezza del pezzo sulla lavorazioen di  precut con DELTA_LT
2026-03-12 15:14:30 +01:00
daniele.nicoli 5e4ec03149 Merge branch 'Test_Ticket2832' into develop 2026-02-26 16:27:10 +01:00
andrea.villa 8cd863c4b7 Corretto caricamento geometrie di collisioni. Modificato indice di collisione per una migliore gestione 2026-02-26 11:38:19 +01:00
daniele.nicoli 67a45afd0d Corretto calcolo rimanenza durante ParkRoller 2026-02-25 10:18:23 +01:00
daniele.nicoli 66a0e4f2e8 Merge remote-tracking branch 'origin/main' into develop 2026-02-25 10:13:45 +01:00
andrea.villa dba3a45080 Migliorata gestione aggiornamento valori 2026-02-17 10:23:50 +01:00
andrea.villa 7631f4f86c In OnPathStart, la L3o viene salvata sulla L3pp solo se non è nil. Altrimenti si tiene valore vecchio 2026-02-17 09:49:34 +01:00
andrea.villa 34a5cb79b6 Merge remote-tracking branch 'origin/develop' 2026-01-30 13:06:22 +01:00
andrea.villa 6c81d8c21d - Simulazione non allineata a generazione. Mancava reset flag di pezzo a caduta
- Cambio versione per rilascio a cliente
2026-01-30 13:06:11 +01:00
daniele.nicoli 12445313c6 Allineato approccio in simulazione a generazione in caso di lavorazione in doppio verticale 2026-01-19 13:28:37 +01:00
andrea.villa 1164be0cb6 Merge remote-tracking branch 'origin/main' into develop 2026-01-16 15:54:55 +01:00
andrea.villa 651ab27194 Merge commit 'c385253e0bebdd6c5a69dbaacf2a4b639395869f' 2026-01-16 15:54:34 +01:00
andrea.villa c385253e0b Commit per rilascio versione 2026-01-16 15:54:20 +01:00
daniele.nicoli 93701378db Corretto movimento di approccio con sega a catena e allineati Simulazione e Generazione 2026-01-13 11:59:22 +01:00
daniele.nicoli 367fcdce2e Merge branch 'main' into develop 2026-01-13 10:25:13 +01:00
andrea.villa b9f0713dda Cambio versione per rilascio a cliente 2025-12-18 12:05:16 +01:00
andrea.villa 4853f7459f Merge remote-tracking branch 'origin/develop' 2025-12-18 12:04:20 +01:00
daniele.nicoli d3f5b0e7e8 Modifica errori del commit precedente 2025-12-16 11:41:25 +01:00
daniele.nicoli 61b9c86cc4 Divisione movimento B in approccio se > 90°. Risolto Ticket#2485 2025-12-16 11:23:46 +01:00
daniele.nicoli 22c451fde6 Cambiato delta di correzione Z per lama con inclinazione >= 81° da 70 a 60 mm. Risoluzione Ticket#2210 2025-12-16 09:39:50 +01:00
daniele.nicoli 727d1812a1 Aggiunto controllo post movimenti ausiliari dell' EMC.PREVOFFSX nella funzione OnSpecialGetPrevMachiningOffset() come su ONE-PF. Ticket#2727 2025-12-01 17:05:14 +01:00
daniele.nicoli 716a404ea8 Merge branch 'main' into develop 2025-12-01 17:02:11 +01:00
andrea.villa 018bd2d80a Merge branch 'develop' 2025-11-26 09:30:05 +01:00
andrea.villa 6d921cdd39 Commit per rilascio versione 2025-11-26 09:29:55 +01:00
daniele.nicoli 70618a298f - Migliorata funzione CheckClamping, ora il controllo di warning si basa sulla somma delle lunghezze delle aree pinzate
- Aggiornato UpdateLog
2025-11-26 09:22:19 +01:00
andrea.villa 8b1c51b766 Merge branch 'main' into develop 2025-11-25 10:26:10 +01:00
andrea.villa 85a7efdfa0 Aggiornata versione MACH_KERNEL minima necessaria 2025-11-25 10:26:01 +01:00
andrea.villa 71ed6a3db4 Merge branch 'main' into develop 2025-11-25 09:49:21 +01:00
andrea.villa 72bf618c83 Merge branch 'develop' 2025-11-25 09:45:32 +01:00
andrea.villa 36bc89cec4 Commit per rilascio versione 2025-11-25 09:45:19 +01:00
daniele.nicoli a96333d99d Migliorata funzione checkclamp, ora la sezione rientra di 3 mm, aggiornati anche i dll 2025-11-25 09:42:36 +01:00
andrea.villa 217d641fbf Merge remote-tracking branch 'origin/develop' 2025-11-21 10:27:53 +01:00
andrea.villa 7a0c2d19c2 Commit per rilascio ultima versione 2025-11-21 10:27:40 +01:00
daniele.nicoli 32a7deb792 Aggiornato UpdateLog 2025-11-21 08:58:59 +01:00
daniele.nicoli 7df6d3ee0d Aggiornata risoluzione VMillTol in funzione dello spessore lama 2025-11-21 08:51:58 +01:00
andrea.villa 46aa3a34aa Corretto problema riposizionamento carrelli 2025-11-19 14:56:21 +01:00
andrea.villa e4c0e4acdb Merge remote-tracking branch 'origin/main' into develop 2025-11-19 14:55:21 +01:00
andrea.villa ed7cc79bb4 Con testa H38 si va in home quando testa viene comandata a Zmassima 2025-11-19 13:44:49 +01:00
andrea.villa 0a1c916cba Merge remote-tracking branch 'origin/develop' 2025-11-19 08:00:47 +01:00
andrea.villa 9393aa07c7 - Se testa H38 e si chiudono i rulli, si deve andare in home
- Aggiornata versione per rilascio
2025-11-19 08:00:33 +01:00
andrea.villa 007314a354 Prima versione controllo pinzaggio. Per attivarlo serve modifica della macchina a MLDE e NGE.
Per ora il controllo è sul BOX.
2025-11-18 15:47:50 +01:00
andrea.villa 2247b7e332 Aggiunto controllo Extra-Corsa testa 2 in caso di lavorazione in doppio 2025-11-11 14:22:35 +01:00
andrea.villa fcd802e499 Corretto calcolo per decidere se serve aprire i rulli 2025-11-04 13:05:40 +01:00
andrea.villa 283a981c17 Aggiuntio numero ticket di riferimento 2025-11-04 09:17:42 +01:00
andrea.villa 4a69712c69 Preselzione testa 1 spostata prima della selezione testa 3 2025-10-03 13:11:05 +02:00
andrea.villa 575e5e7dfb Merge remote-tracking branch 'origin/main' into develop 2025-09-08 09:34:30 +02:00
andrea.villa b406dfd7fa Merge remote-tracking branch 'origin/develop' 2025-09-08 09:34:13 +02:00
andrea.villa 771a612d0f Commit per versione 2025-09-08 09:33:27 +02:00
andrea.villa fadf0c79f1 Se testa 3 deve salire a ZMAX, sale alla X dove si trova e non torna in home 2025-09-02 10:25:43 +02:00
andrea.villa 0ec5ddca1f Corretto controllo ultimo utensile utilizzato su testa 1 2025-09-02 09:12:28 +02:00
andrea.villa 518acb995c - Se fase start o restart, si aggiorna la posizione in X dell'asse per calcolare il link corretto
- La stima tempi considera ora le accelerazoni degli assi
2025-08-26 08:32:23 +02:00
andrea.villa ed14366cfc Merge branch 'EstimateWithAcceleration' into develop 2025-08-26 08:31:17 +02:00
andrea.villa 25cb3a93d1 Merge branch 'develop' into EstimateWithAcceleration 2025-08-21 17:46:44 +02:00
andrea.villa b0b0c00227 Merge branch 'main' into develop 2025-08-21 17:46:38 +02:00
andrea.villa b9c6d08038 Corretto movimento in Z massima dopo scarico pezzo 2025-08-21 17:46:24 +02:00
andrea.villa 8720b78821 Merge branch 'develop' into EstimateWithAcceleration 2025-08-21 16:36:50 +02:00
andrea.villa 4c1ff2bf92 Merge branch 'main' into develop 2025-08-21 16:36:38 +02:00
andrea.villa 9b1057ed44 Se la testa rimane bassa, corretto caso di reset del piano generico a fine lavorazione 2025-08-21 16:36:12 +02:00
andrea.villa 86fcc7c9eb Prima versione stima tempi considerando accelerazioni 2025-08-21 15:49:45 +02:00
andrea.villa aae1dc8e33 Merge remote-tracking branch 'origin/main' into develop 2025-08-20 15:35:02 +02:00
andrea.villa 87366bd1d9 Merge remote-tracking branch 'origin/develop' 2025-08-20 15:34:38 +02:00
andrea.villa 8cb74ef922 Aggiunta variabile 'EstimationRapidMultiplier' in mlde per regolare il tempo stimato 2025-08-20 15:34:24 +02:00
andrea.villa d1816c5048 Gestione terzo asse rotante in caso di utensile standard 2025-07-09 10:13:43 +02:00
andrea.villa 77f3e8f084 Merge branch 'main' into develop 2025-07-01 09:35:47 +02:00
andrea.villa 0057704864 Merge commit 'a5d40e4922835f76439eee4d5cd47f9a051438ba' 2025-07-01 09:35:23 +02:00
andrea.villa a5d40e4922 Aggiunta gestione massima lunghezza scarico 2025-07-01 09:34:17 +02:00
andrea.villa 76fe0c0f33 Cambiati limiti minimi e massimi 2025-06-30 12:24:11 +02:00
andrea.villa 9fb97665c2 Piccola correzione agestione accelerazioni 2025-06-10 13:32:44 +02:00
andrea.villa 033577bae9 Lettura e gestione parametri accelerazioni da TS3 2025-06-10 10:18:44 +02:00
andrea.villa f444561df7 Merge remote-tracking branch 'origin/main' into develop 2025-04-28 13:29:42 +02:00
andrea.villa 030aad4781 Merge remote-tracking branch 'origin/develop' 2025-04-24 12:43:22 +02:00
andrea.villa 3a00390416 Commit per versione 2025-04-24 12:43:10 +02:00
andrea.villa afad80d39f Modifica qualità VMILL. Da ora si può impostare da impostazioni CAM5 2025-04-22 09:39:03 +02:00
andrea.villa ddfb887034 Merge remote-tracking branch 'origin/main' into develop 2025-04-01 09:55:11 +02:00
andrea.villa 4e24ac0ed1 Merge remote-tracking branch 'origin/develop' 2025-04-01 09:54:56 +02:00
andrea.villa 231c54b8a9 Commit per versione 2025-04-01 09:54:43 +02:00
andrea.villa 271cdafc62 Aggiunta commenti HEADER e FOOTER per comunicazione con linea o altre macchine, da parte di Essetre. 2025-03-10 09:01:38 +01:00
andrea.villa 9008c7e3ec Merge remote-tracking branch 'origin/main' into develop 2025-02-26 15:25:15 +01:00
andrea.villa 4b92ff97b8 Gestione lettura feed massima pinze da Ts3 2025-02-26 15:24:56 +01:00
andrea.villa 4b875e24d5 Merge remote-tracking branch 'origin/main' into develop 2025-02-21 08:07:52 +01:00
andrea.villa 9b4bae3bb4 Merge branch 'develop' 2025-02-21 08:07:32 +01:00
andrea.villa 136ba65283 Gestione aggregato flottante 2025-02-21 08:07:08 +01:00
andrea.villa 98ac928d62 Ripristinato comportamento precedente calcolo posizione dei rulli di pinzaggio fatto con 2.7b2. 2025-02-06 10:26:03 +01:00
andrea.villa eb667d7cf2 Merge remote-tracking branch 'origin/main' into develop 2025-02-06 08:36:04 +01:00
andrea.villa 3cdb1bf90a Merge remote-tracking branch 'origin/develop' 2025-02-06 08:35:44 +01:00
andrea.villa f28d57cb8a Dopo aver scaricato utensile, si setta nota "HIDDEN" per dichiarare utensile non più sulla testa e non considerare le collisioni. 2025-02-06 08:35:31 +01:00
andrea.villa a428628c92 Merge branch 'main' into develop 2025-02-04 12:27:23 +01:00
andrea.villa 238361859e Merge branch 'develop' 2025-02-04 12:27:08 +01:00
andrea.villa 83613f2fad Piccola modifica nel calcolo posizione dei rulli di pinzaggio. 2025-02-04 12:26:56 +01:00
andrea.villa a28c536971 Merge branch 'main' into develop 2025-02-03 08:46:45 +01:00
andrea.villa 01cb082121 Merge remote-tracking branch 'origin/develop' 2025-02-03 08:46:27 +01:00
andrea.villa 1431cfcee5 Corretta simulazioen che non mandava testa in home in caso di utensile lungo. Generazione era già ok. 2025-02-03 08:46:11 +01:00
andrea.villa 546b3c01ef Merge remote-tracking branch 'origin/main' into develop 2025-01-28 12:01:15 +01:00
andrea.villa d1ac93ff71 Merge commit '15034765ac4542f10b835816dc7d3fd54a24c119' 2025-01-28 12:00:58 +01:00
andrea.villa 15034765ac In MLSE aggiunta piccola correzione quota Z in caso di direzione Z tra 0.5 e 0.707 2025-01-28 12:00:44 +01:00
andrea.villa 9bc55636aa Merge remote-tracking branch 'origin/main' into develop 2025-01-17 09:26:27 +01:00
andrea.villa fd0b0f6093 Merge remote-tracking branch 'origin/develop' 2025-01-17 09:26:06 +01:00
andrea.villa e088be7b1d Corretto primo punto X preselezione utensile 2025-01-17 09:25:57 +01:00
andrea.villa 643188ac75 Piccola correzione posizione X in preselezione utensile 2025-01-15 12:57:35 +01:00
andrea.villa abc95d7b38 Merge branch 'main' into develop 2024-12-19 10:26:38 +01:00
andrea.villa 0310daed48 HOTFIX : corretto posizione Z zero alla selezione dell'utensile in caso di motosega 2024-12-19 10:26:20 +01:00
andrea.villa 67edcfc59b Merge commit '301ff170331694a46aed93badb4169a6bf67d309' into develop 2024-12-18 16:58:54 +01:00
andrea.villa 301ff17033 Merge remote-tracking branch 'origin/develop' 2024-12-18 16:58:40 +01:00
andrea.villa 70cf39d693 Commit per versione 2024-12-18 16:58:17 +01:00
andrea.villa ec0fbde5cc Aggiunta variabile 'SafeX2RotAxis' in sostituzionme della 'ParkMchY2' che era usata impropriamente 2024-12-17 13:33:23 +01:00
andrea.villa 36e3c35e82 Merge remote-tracking branch 'origin/main' into develop 2024-12-17 11:42:43 +01:00
andrea.villa 808456ed60 Merge branch 'develop' 2024-12-17 11:42:23 +01:00
andrea.villa da3f3c0db0 Corretta posizione iniziale testa 2 2024-12-17 11:42:10 +01:00
andrea.villa ad7579e0ae Merge remote-tracking branch 'origin/main' into develop 2024-12-16 13:19:24 +01:00
andrea.villa 0c2b92cd89 HOTFIX : In MLSE ripristinati vecchi valori indici calcolo Z massima 2024-12-16 13:19:06 +01:00
andrea.villa 3c754c329c Merge remote-tracking branch 'origin/main' into develop 2024-12-16 09:50:04 +01:00
andrea.villa f8520a90c3 Merge commit '6e79e47885f2e1c0e1cddf7e237871734f29a6a5' 2024-12-16 09:49:48 +01:00
andrea.villa 6e79e47885 - Corretto scarico utensile se aggregato. Se non presente utensile di default, non seleziona nulla.
- In MLSE ritoccati indici calcolo Z massima. Ticket#2210
2024-12-16 09:49:35 +01:00
andrea.villa eef2b3911f Merge remote-tracking branch 'origin/main' into develop 2024-12-13 17:44:22 +01:00
andrea.villa 2524ba9443 HOTFIX : Corretta chiamata calcolo asse virtuale 2024-12-13 17:44:04 +01:00
andrea.villa ce2887c579 Merge remote-tracking branch 'origin/main' into develop 2024-12-13 17:06:51 +01:00
andrea.villa 77fdc8c12a Merge remote-tracking branch 'origin/develop' 2024-12-13 17:06:33 +01:00
andrea.villa ca86c79672 - Corretto primo movimento in X quando si parte con testa 3. Ticket#2216
- Se su testa 1 c'è un aggregato e si utilizzerà la testa 3, si pscarica aggregato e si prende utensile di default. Ticket#2222
- Durante utilizzo della testa 3, non si preselezionano altre teste. Ticket#2220
- Se lavorazione con testa dedicata lama e su testa 1 c'era aggregato, viene scaricato. Ticket#2216
2024-12-13 17:06:23 +01:00
andrea.villa f8dc3b691a Controllo esistenza terzo asse ausiliario 2024-12-11 17:07:06 +01:00
andrea.villa 2c5a16eeae - Non si fa preselezione se testa 3
- Corretta emissione coordinata rotazione testa 3 in zona sicura
- A fine barra, testa 3 sempre in home
2024-12-11 10:45:31 +01:00
andrea.villa 58b8f07446 Corretta gestione in caso di prima lavorazione con motosega 2024-12-04 08:19:57 +01:00
andrea.villa 4cf4d57d2a Corretto errore di collisione per errata simulazione cambio utensile da lama a motosega 2024-12-03 08:56:55 +01:00
andrea.villa 7e6822b6c6 Gestione aggregato foratore multiplo (H14) 2024-12-02 08:51:59 +01:00
andrea.villa 6920fd4272 Merge branch 'main' into develop 2024-12-02 08:49:49 +01:00
andrea.villa b93a21605d Merge remote-tracking branch 'origin/hotfix/PreselLongToolCorrection' 2024-11-26 15:57:52 +01:00
andrea.villa d22e223017 Corretto controllo preselezione per utensili lunghi 2024-11-26 15:57:39 +01:00
andrea.villa 71875429cd Gestione caricamento utensili in caso di testa con uscita multipla 2024-11-25 16:50:34 +01:00
andrea.villa a005386b7d Merge remote-tracking branch 'origin/main' into develop 2024-11-25 15:59:51 +01:00
andrea.villa 76f2de42d0 Merge remote-tracking branch 'origin/main' into develop 2024-11-04 08:29:47 +01:00
5 changed files with 1410 additions and 279 deletions
+411 -152
View File
@@ -28,8 +28,14 @@ function OnStart()
--EMT.LINEINC = 1 -- incremento numerazione linee --EMT.LINEINC = 1 -- incremento numerazione linee
--EMT.Ft = 'F' -- token per feed --EMT.Ft = 'F' -- token per feed
--EMT.St = 'S' -- token per speed --EMT.St = 'S' -- token per speed
EMT.FMAXPINZE = 116000 -- feed massima pinze EMT.FMAXPINZE = EgtClamp( MaxFeedPinze or 116000, 20000, 130000) -- feed massima pinze
EMT.MAXACC = MaxAcc or 6000 -- accelerazione massima pinze. In realtà è il tempo in millisecondi, quindi MAXACC corrisponde al tempo massimo per raggiungere la velocità desiderata
EMT.MINACC = MinAcc or 600 -- accelerazione minima pinze. In realtà è il tempo in millisecondi, quindi MINACC corrisponde al tempo massimo per raggiungere la velocità desiderata
SetToParkLine() -- si inizia con linee da parcheggiare su stack SetToParkLine() -- si inizia con linee da parcheggiare su stack
-- se il pezzo dev'essere scaricato al carico
local dUnloadType = EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL, 'UNLOAD', 'd')
EMT.UNLOAD = dUnloadType == 1 or dUnloadType == -1
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
@@ -51,6 +57,7 @@ function OnProgramStart()
end end
MyOutput( sPrefixCommentLine..'('.. CSP_INFO..')') MyOutput( sPrefixCommentLine..'('.. CSP_INFO..')')
MyOutput( sPrefixCommentLine..'('.. MACHINE_INFO..')') MyOutput( sPrefixCommentLine..'('.. MACHINE_INFO..')')
MyOutput( '(HEADER)')
-- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente) -- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente)
if TEST_USE then if TEST_USE then
@@ -102,6 +109,7 @@ function OnProgramEnd()
EMT.FALL = nil EMT.FALL = nil
EMT.RELOAD = nil EMT.RELOAD = nil
EMT.RELOAD2 = nil EMT.RELOAD2 = nil
MyOutput( '(FOOTER)')
-- Termino il programma -- Termino il programma
MyOutput( 'M202') MyOutput( 'M202')
MyOutput( 'M02') MyOutput( 'M02')
@@ -128,6 +136,8 @@ function OnToolData()
dAddLen = -SawOffsZ dAddLen = -SawOffsZ
elseif EMT.HEAD == 'H16' then elseif EMT.HEAD == 'H16' then
dAddLen = -Saw2OffsZ dAddLen = -Saw2OffsZ
elseif EMT.HEAD == 'H14' then
dAddLen = 206 -- dimensione aggregato
end end
local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( dAddLen + EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) .. local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( dAddLen + EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) ..
' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( dAddLen + EMT.TTOTLEN, 3) ' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( dAddLen + EMT.TTOTLEN, 3)
@@ -283,26 +293,47 @@ function OnDispositionEnd()
-- altrimenti disposizione finale, eventuale scarico pezzo lavorato se non ci sono lavorazioni -- altrimenti disposizione finale, eventuale scarico pezzo lavorato se non ci sono lavorazioni
else else
if #EMT.MDCHAR > 0 then if #EMT.MDCHAR > 0 then
EmitRemark( 'PART UNLOAD') if EMT.AUXTYPE == 'R' and EMT.UNLOAD then
EmitRemark( 'PART UNLOAD ON LOAD POSITION')
else
EmitRemark( 'PART UNLOAD')
end
end end
for i = 1, #EMT.MDCHAR do for i = 1, #EMT.MDCHAR do
EmitMoveDataChars( EMT.MDCHAR[i]) -- Se è un'istruzione del piano ferma pezzo
if EMT.MDCHAR[i].Y1 then EMT.CHY_ON = true end if EMT.MDCHAR[i].StopBeamStat then
EmitStopBeam( EMT.MDCHAR[i])
EMT.LASTOISBRAKE = true
else
EmitMoveDataChars( EMT.MDCHAR[i])
if EMT.MDCHAR[i].Y1 then EMT.CHY_ON = true end
if EMT.MDCHAR[i].V1 then EMT.V1POS = EMT.MDCHAR[i].V1 end
if EMT.MDCHAR[i].V2 then EMT.V2POS = EMT.MDCHAR[i].V2 end
EMT.LASTOISBRAKE = false
end
end end
if #EMT.MDCHAR > 0 then if #EMT.MDCHAR > 0 then
local nMoveType = EgtIf( EMT.CHY_ON, 3, 2) if not EMT.LASTOISBRAKE then
EmitMoveStartChars( nMoveType) local nMoveType = EgtIf( EMT.CHY_ON, 3, 2)
-- se dopo c'è scarico spezzone devo mettere attesa termine esecuzione EmitMoveStartChars( nMoveType)
if IsRestPhase( EMT.PHASE + 1) then -- se dopo c'è scarico spezzone devo mettere attesa termine esecuzione
EmitMoveWaitChars( nMoveType) if IsRestPhase( EMT.PHASE + 1) then
EmitMoveWaitChars( nMoveType)
else
EmitMoveWaitChars( nMoveType, true)
end
else else
EmitMoveWaitChars( nMoveType, true) EMT.LASTOISBRAKE = nil
end end
-- emissione conclusione pezzo precedente (se non in modalità test) -- emissione conclusione pezzo precedente (se non in modalità test)
if not TEST_USE and EMT.PRODID then if not TEST_USE and EMT.PRODID then
local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2' local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2'
MyOutput( sEnd) MyOutput( sEnd)
end end
if EMT.UNLOAD then
MyOutput('M77')
end
end end
EMT.MDCHAR = {} EMT.MDCHAR = {}
EMT.AUXTYPE = nil EMT.AUXTYPE = nil
@@ -350,6 +381,7 @@ function OnRawMoveData()
EMT.HT = b3Part:getDimY() EMT.HT = b3Part:getDimY()
EMT.ST = b3Part:getDimZ() EMT.ST = b3Part:getDimZ()
EMT.HOVM = EgtGetInfo( EMT.RAWID, 'HOVM', 'd') or 0 EMT.HOVM = EgtGetInfo( EMT.RAWID, 'HOVM', 'd') or 0
EMT.XMINT = b3Part:getMin():getX()
EMT.PARTTYPE = 0 EMT.PARTTYPE = 0
local sMaterial = EgtGetInfo( PartId, 'MATERIAL') local sMaterial = EgtGetInfo( PartId, 'MATERIAL')
if sMaterial and sMaterial:find( 'CLT-', 1, true) == 1 then if sMaterial and sMaterial:find( 'CLT-', 1, true) == 1 then
@@ -397,6 +429,7 @@ function OnMachiningStart()
EMT.MCHNAME = EgtGetOperationName( EMT.MCHID) EMT.MCHNAME = EgtGetOperationName( EMT.MCHID)
EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE) EMT.MCHTYPE = EgtGetMachiningParam( MCH_MP.TYPE)
EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES) EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES)
EMT.MCHPRECUT = ( EMT.MCHUSERNOTES:find( 'Precut;', 1, true) ~= nil)
EMT.MCHCUT = ( EMT.MCHUSERNOTES:find( 'Cut;', 1, true) ~= nil) EMT.MCHCUT = ( EMT.MCHUSERNOTES:find( 'Cut;', 1, true) ~= nil)
-- se sega a catena, aggiusto subito angolo scelto per asse virtuale A -- se sega a catena, aggiusto subito angolo scelto per asse virtuale A
@@ -406,6 +439,13 @@ function OnMachiningStart()
-- imposto home dell'asse C1 (A=0 -> T101, A=90 -> T104) -- imposto home dell'asse C1 (A=0 -> T101, A=90 -> T104)
local MyParkCSawC1 = GetChainSawCHomeFromVirtualAxis( dPosA, EMT.TTOTLEN) local MyParkCSawC1 = GetChainSawCHomeFromVirtualAxis( dPosA, EMT.TTOTLEN)
EmtModifyAxisHome( 'C1', MyParkCSawC1) EmtModifyAxisHome( 'C1', MyParkCSawC1)
-- aggregato foratura multipla, aggiusto subito angolo scelto per asse virtuale A
elseif EMT.HEAD == 'H14' then
-- valore dell'asse virtuale
dPosA = GetCurrMultiDrillVirtualAxis()
-- imposto home dell'asse C1 (A=0 -> T121, A=90 -> T124)
local MyParkMultiDrillC1 = GetMultiDrillCHomeFromVirtualAxis( dPosA, EMT.TTOTLEN)
EmtModifyAxisHome( 'C1', MyParkMultiDrillC1)
-- se lama su aggregato testa sotto, aggiusto subito angolo scelto per asse virtuale A -- se lama su aggregato testa sotto, aggiusto subito angolo scelto per asse virtuale A
elseif EMT.HEAD == 'H22' then elseif EMT.HEAD == 'H22' then
-- valore dell'asse virtuale -- valore dell'asse virtuale
@@ -474,6 +514,10 @@ function OnMachiningEnd()
elseif EMT.AUXTYPE == 'U' then elseif EMT.AUXTYPE == 'U' then
EmitRemark( 'PART UNLOAD') EmitRemark( 'PART UNLOAD')
elseif EMT.AUXTYPE == 'P' then elseif EMT.AUXTYPE == 'P' then
local nNextPathId
local nNextMchId
if EMT.PATHID then nNextPathId = EgtGetNextActiveOperation( EMT.PATHID) end
if EMT.MCHID then nNextMchId = EgtGetNextActiveOperation( EMT.MCHID) end
if EMT.PREROT then if EMT.PREROT then
EmitZmax( false, true, EMT.R1, EMT.R2, false, false, false) EmitZmax( false, true, EMT.R1, EMT.R2, false, false, false)
EMT.ZMAX = true EMT.ZMAX = true
@@ -485,6 +529,12 @@ function OnMachiningEnd()
EMT.TO_ZMAX = nil EMT.TO_ZMAX = nil
end end
EmitRemark( 'PART FALL') EmitRemark( 'PART FALL')
elseif EMT.UNLOAD and not nNextPathId and not nNextMchId then
if not EMT.ZMAX then
EmitZmax( false, true, EMT.R1, EMT.R2, false, false, false)
EMT.ZMAX = true
end
EmitRemark( 'PART UNLOAD ON LOAD POSITION')
else else
EmitZmax( false, true, EMT.R1, EMT.R2, false, false, false) EmitZmax( false, true, EMT.R1, EMT.R2, false, false, false)
EMT.ZMAX = true EMT.ZMAX = true
@@ -493,20 +543,31 @@ function OnMachiningEnd()
end end
end end
for i = 1, #EMT.MDCHAR do for i = 1, #EMT.MDCHAR do
EmitMoveDataChars( EMT.MDCHAR[i]) -- Se è un'istruzione del piano ferma pezzo
if EMT.MDCHAR[i].StopBeamStat then
EmitStopBeam( EMT.MDCHAR[i])
EMT.LASTOISBRAKE = true
else
EmitMoveDataChars( EMT.MDCHAR[i])
EMT.LASTOISBRAKE = false
end
end end
if #EMT.MDCHAR > 0 then if #EMT.MDCHAR > 0 then
if EMT.AUXTYPE == 'S' then if EMT.AUXTYPE == 'S' then
EmitMoveStartChars( 1) if not EMT.LASTOISBRAKE then
EmitMoveWaitChars( 1) EmitMoveStartChars( 1)
EmitMoveWaitChars( 1)
end
elseif EMT.AUXTYPE == 'U' then elseif EMT.AUXTYPE == 'U' then
local nMoveType = EgtIf( EMT.CHY_ON, 3, 2) if not EMT.LASTOISBRAKE then
EmitMoveStartChars( nMoveType) local nMoveType = EgtIf( EMT.CHY_ON, 3, 2)
-- se dopo cè scarico spezzone devo mettere attesa termine esecuzione EmitMoveStartChars( nMoveType)
if IsRestPhase( EMT.PHASE + 1) then -- se dopo cè scarico spezzone devo mettere attesa termine esecuzione
EmitMoveWaitChars( nMoveType) if IsRestPhase( EMT.PHASE + 1) then
else EmitMoveWaitChars( nMoveType)
EmitMoveWaitChars( nMoveType, true) else
EmitMoveWaitChars( nMoveType, true)
end
end end
-- emissione conclusione pezzo precedente (se non è modalità test) -- emissione conclusione pezzo precedente (se non è modalità test)
if not TEST_USE and EMT.PRODID then if not TEST_USE and EMT.PRODID then
@@ -514,8 +575,10 @@ function OnMachiningEnd()
MyOutput( sEnd) MyOutput( sEnd)
end end
elseif EMT.AUXTYPE == 'P' then elseif EMT.AUXTYPE == 'P' then
EmitMoveStartChars( 3) if not EMT.LASTOISBRAKE then
EmitMoveWaitChars( 3) EmitMoveStartChars( 3)
EmitMoveWaitChars( 3)
end
if EMT.FALL then if EMT.FALL then
MyOutput( 'M155') MyOutput( 'M155')
-- emissione conclusione pezzo (se non in modalità test) -- emissione conclusione pezzo (se non in modalità test)
@@ -523,7 +586,13 @@ function OnMachiningEnd()
local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2' local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2'
MyOutput( sEnd) MyOutput( sEnd)
end end
EMT.FALL = nil
elseif not EMT.PREROT then elseif not EMT.PREROT then
-- emissione conclusione pezzo (se non in modalità test)
if not TEST_USE and EMT.PRODID and ( EMT.UNLOAD and ( not nNextPathId) and ( not nNextMchId)) then
local sEnd= 'M113 P1='..tostring( EMT.PRODID)..' P2='..tostring( EMT.PATTID)..' P3='..tostring( EMT.CUTID)..' P4=2'
MyOutput( sEnd)
end
MyOutput( 'M77') MyOutput( 'M77')
end end
end end
@@ -558,12 +627,22 @@ end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function OnPathStart() function OnPathStart()
if EMT.OPEISDISP then
return
end
-- non ancora iniziata la lavorazione -- non ancora iniziata la lavorazione
EMT.MCHFIRST = true EMT.MCHFIRST = true
EMT.MCHFIRSTFEED = true EMT.MCHFIRSTFEED = true
-- primo posizionamento sempre in globale -- primo posizionamento sempre in globale
EMT.REFLOC = nil EMT.REFLOC = nil
EMT.IPLGL = false EMT.IPLGL = false
-- se taglio di precut verifico quanto è più lungo il grezzo rispetto al pezzo (non tiene conto dell'ultimo cubetto)
EMT.DELTA_LT = 0
if EMT.MCHPRECUT then
local dCosA = sqrt( max( 1 - EMT.EXTR[1] * EMT.EXTR[1], 0))
EMT.DELTA_LT = max( EMT.XMINT - Point3d( EMT.MMAX):getX() - dCosA * EMT.TDIAM / 2, 0)
end
-- leggo se ancora presa iniziale carrello -- leggo se ancora presa iniziale carrello
--EMT.CNT = EgtGetInfo( EMT.PATHID, 'CNT', 'i') --EMT.CNT = EgtGetInfo( EMT.PATHID, 'CNT', 'i')
--MyOutput( 'CNT='.. tostring( EMT.CNT or 0)) --MyOutput( 'CNT='.. tostring( EMT.CNT or 0))
@@ -571,8 +650,8 @@ function OnPathStart()
if EMT.TOOL == EMT.PREVTOOL and not EMT.ZMAX then if EMT.TOOL == EMT.PREVTOOL and not EMT.ZMAX then
EMT.L2pp = EMT.L2op EMT.L2pp = EMT.L2op
EMT.L3pp = EMT.L3op EMT.L3pp = EMT.L3op
EMT.R1pp = EMT.R1p EMT.R1pp = EMT.R1p or EMT.R1pp
EMT.R2pp = EMT.R2p EMT.R2pp = EMT.R2p or EMT.R2pp
else else
EMT.L2pp = nil EMT.L2pp = nil
EMT.L3pp = nil EMT.L3pp = nil
@@ -587,6 +666,9 @@ end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function OnPathEnd() function OnPathEnd()
if EMT.OPEISDISP then
return
end
if not EMT.ZMAX then if not EMT.ZMAX then
EmitResetMachining() EmitResetMachining()
end end
@@ -613,6 +695,9 @@ function OnPathStartAux()
local Cmd = EgtSplitString( EMT.AUX) local Cmd = EgtSplitString( EMT.AUX)
if Cmd[1] == '4' then if Cmd[1] == '4' then
EMT.TO_ZMAX = true EMT.TO_ZMAX = true
if Cmd[2] == '1' then
EMT.ROLL_IN = true
end
end end
end end
@@ -729,9 +814,12 @@ function OnRapid()
local MyMaxZ1 = EgtGetAxisMax( 'Z1') local MyMaxZ1 = EgtGetAxisMax( 'Z1')
-- in caso di rotazione della lama lontano dalla posizione di home degli assi rotanti -- in caso di rotazione della lama lontano dalla posizione di home degli assi rotanti
local bXSpec = EgtIf( BD.RIGHT_LOAD, ( EMT.L2 > -DeltaTabY), ( EMT.L2 < -DeltaTabY)) local bXSpec = EgtIf( BD.RIGHT_LOAD, ( EMT.L2 > -DeltaTabY), ( EMT.L2 < -DeltaTabY))
EmitMoveDataHead( 1, { X=EgtIf( bXSpec, -DeltaTabY, EMT.L2), Z=MyMaxZ1, S=Speed}) -- se non è aggregato, posso preselezionare testa e andare in posizione
EmitMoveStartHead( 1) if EMT.HEAD ~= 'H13' and EMT.HEAD ~= 'H14' then
EmitMoveWaitHead( 1) EmitMoveDataHead( 1, { X=EgtIf( bXSpec, -DeltaTabY, EMT.L2), Z=MyMaxZ1, S=Speed})
EmitMoveStartHead( 1)
EmitMoveWaitHead( 1)
end
EmitMoveWaitChars( EgtIf( bOnlyCharY, 1, 3)) EmitMoveWaitChars( EgtIf( bOnlyCharY, 1, 3))
-- se necessario allargo le cabine -- se necessario allargo le cabine
if RollerParkingNeeded( EMT.HEAD, PrevR1, PrevR2, EMT.R1, EMT.R2) or if RollerParkingNeeded( EMT.HEAD, PrevR1, PrevR2, EMT.R1, EMT.R2) or
@@ -749,7 +837,15 @@ function OnRapid()
EmitMoveDataHead( 1, { B=0, S=Speed}) EmitMoveDataHead( 1, { B=0, S=Speed})
EmitMoveDataHead( 1, { C=EMT.R1, S=Speed}) EmitMoveDataHead( 1, { C=EMT.R1, S=Speed})
EmitMoveDataHead( 1, { X=EMT.L2, S=Speed}) EmitMoveDataHead( 1, { X=EMT.L2, S=Speed})
EmitMoveDataHead( 1, { Z=EMT.L3, B=EMT.R2, S=Speed}) -- se movimento di B > di 90°, spezza il movimento in 2 arrivando alla quota Z con B+-90 e poi muove l'ultimo segmento
-- evita collisione con carro X
if EMT.R2 > 91 or EMT.R2 < -91 then
local dBref = EgtClamp( EMT.R2, -91, 91)
EmitMoveDataHead( 1, { Z=EMT.L3, B=dBref, S=Speed})
EmitMoveDataHead( 1, { B=EMT.R2, S=Speed})
else
EmitMoveDataHead( 1, { Z=EMT.L3, B=EMT.R2, S=Speed})
end
-- caso standard -- caso standard
else else
-- se bisogna scrivere tutti gli assi -- se bisogna scrivere tutti gli assi
@@ -757,6 +853,9 @@ function OnRapid()
-- se sega a catena -- se sega a catena
if EMT.HEAD == 'H13' then if EMT.HEAD == 'H13' then
EmitMoveDataHead( 1, { X=-ParkCSawX1, Z=HomeZ1, B=HomeR2, C=HomeR1, TRad=dTRad, TLen=dTLen, S=Speed}) EmitMoveDataHead( 1, { X=-ParkCSawX1, Z=HomeZ1, B=HomeR2, C=HomeR1, TRad=dTRad, TLen=dTLen, S=Speed})
-- aggregato foratore multiplo
elseif EMT.HEAD == 'H14' then
EmitMoveDataHead( 1, { X=-ParkMultiDrillX1, Z=HomeZ1, B=HomeR2, C=HomeR1, TRad=dTRad, TLen=dTLen, S=Speed})
-- utensili standard -- utensili standard
else else
-- utensili lunghi -- utensili lunghi
@@ -849,8 +948,8 @@ function OnRapid()
EmitParkRoller( dPosT, bSplitCut) EmitParkRoller( dPosT, bSplitCut)
end end
-- vado a quota sicurezza in X per permettere rotazione assi rotanti -- vado a quota sicurezza in X per permettere rotazione assi rotanti
if ( not EMT.L2pp or ( EMT.L2pp and EMT.L2pp > ParkMchY2)) and ( ParkB2 ~= EMT.R2 or ParkC2 ~= EMT.R1) then if ( not EMT.L2pp or ( EMT.L2pp and EMT.L2pp > SafeX2RotAxis)) and ( ParkB2 ~= EMT.R2 or ParkC2 ~= EMT.R1) then
EmitMoveDataHead( 2, { X=ParkMchY2, Z=ParkZ2, B=ParkB2, C=ParkC2, S=Speed}) EmitMoveDataHead( 2, { X=SafeX2RotAxis, Z=ParkZ2, B=ParkB2, C=ParkC2, S=Speed})
end end
-- scrivo solo se gli assi rotanti sono cambiati -- scrivo solo se gli assi rotanti sono cambiati
if EMT.HEAD == 'H22' and ( CurrB2 ~= EMT.R2 or CurrC2 ~= EMT.R1) then if EMT.HEAD == 'H22' and ( CurrB2 ~= EMT.R2 or CurrC2 ~= EMT.R1) then
@@ -870,11 +969,12 @@ function OnRapid()
else else
-- selezione testa (posso muovere X solo a Zmax) -- selezione testa (posso muovere X solo a Zmax)
local MaxZ3 = EgtGetAxisMax( 'Z3') local MaxZ3 = EgtGetAxisMax( 'Z3')
local MyParkX3 = EgtGetAxisHomePos( 'X3')
-- se bisogna scrivere tutti gli assi -- se bisogna scrivere tutti gli assi
if WriteAllCoordsOnFirstM101 then if WriteAllCoordsOnFirstM101 then
EmitMoveDataHead( 3, { X=EMT.L2, Z=MaxZ3, B=ParkB3, C=0, S=Speed}) EmitMoveDataHead( 3, { X=MyParkX3, Z=MaxZ3, B=ParkB3, C=ParkC3, S=Speed})
else else
EmitMoveDataHead( 3, { X=EMT.L2, Z=MaxZ3, S=Speed}) EmitMoveDataHead( 3, { X=MyParkX3, Z=MaxZ3, S=Speed})
end end
EmitMoveStartHead( 3) EmitMoveStartHead( 3)
EmitMoveWaitHead( 3) EmitMoveWaitHead( 3)
@@ -885,6 +985,8 @@ function OnRapid()
local dPosT = EMT.TPOS or EMT.L1op local dPosT = EMT.TPOS or EMT.L1op
EmitParkRoller( dPosT, bSplitCut) EmitParkRoller( dPosT, bSplitCut)
end end
-- eventuale preselezione successiva testa 2
PreselectNextDiffHead( EMT.MCHID, EMT.HEAD)
-- eseguo movimenti -- eseguo movimenti
local Speed = EMT.S local Speed = EMT.S
-- se è macchina a 3 teste con gruppo truciolatore 4 assi -- se è macchina a 3 teste con gruppo truciolatore 4 assi
@@ -892,35 +994,31 @@ function OnRapid()
EmitMoveDataHead( 3, { Z=EMT.L3, S=Speed}) EmitMoveDataHead( 3, { Z=EMT.L3, S=Speed})
EmitMoveDataHead( 3, { B=EMT.R2, C=EMT.R1, S=Speed}) EmitMoveDataHead( 3, { B=EMT.R2, C=EMT.R1, S=Speed})
EmitMoveStartHead( 3) EmitMoveStartHead( 3)
-- eventuale preselezione successiva testa 2
PreselectNextDiffHead( EMT.MCHID, EMT.HEAD)
-- aspetto esecuzione movimento testa 3
EmitMoveWaitHead( 3)
-- se gruppo lama dedicato, senza cambio utensile -- se gruppo lama dedicato, senza cambio utensile
elseif EgtGetHeadId( 'H38') then elseif EgtGetHeadId( 'H38') then
local B3Home = EgtGetAxisHomePos( 'B3') local B3Home = EgtGetAxisHomePos( 'B3')
local C3Home = EgtGetAxisHomePos( 'C3') local C3Home = EgtGetAxisHomePos( 'C3')
EmitMoveDataHead( 3, { X=SafeX3RotAxis, S=Speed}) EmitMoveDataHead( 3, { X=-SafeX3RotAxis, S=Speed})
-- se non sono esattamente in home, devo ruotare in zona sicura -- se non sono esattamente in home, devo ruotare in zona sicura
if abs( C3Home - EMT.R1) > 1 or abs( B3Home - EMT.R2) > 1 then if abs( C3Home - EMT.R1) > 1 or abs( B3Home - EMT.R2) > 1 then
EMT.L3 = min( EMT.L3, SafeZ3RotAxis) EMT.L3 = min( EMT.L3, SafeZ3RotAxis)
EmitMoveDataHead( 3, { Z=SafeZ3RotAxis, S=Speed}) EmitMoveDataHead( 3, { Z=SafeZ3RotAxis, S=Speed})
EmitMoveDataHead( 3, { B=EMT.R2, C=EMT.R1, S=Speed}) EmitMoveDataHead( 3, { B=EMT.R2, C=EMT.R1, S=Speed})
EmitMoveDataHead( 3, { Z=EMT.L3, S=Speed}) if ( EMT.L3 - SafeZ3RotAxis) > 100 * GEO.EPS_SMALL then
EmitMoveDataHead( 3, { Z=EMT.L3, S=Speed})
end
EmitMoveDataHead( 3, { X=EMT.L2, S=Speed}) EmitMoveDataHead( 3, { X=EMT.L2, S=Speed})
end end
-- muovo in posizione finale -- muovo in posizione finale
EmitMoveDataHead( 3, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, S=Speed}) EmitMoveDataHead( 3, { X=EMT.L2, Z=EMT.L3, B=EMT.R2, C=EMT.R1, S=Speed})
EmitMoveStartHead( 3)
-- eventuale preselezione successiva testa 2
PreselectNextDiffHead( EMT.MCHID, EMT.HEAD)
-- aspetto esecuzione movimento testa 3
EmitMoveWaitHead( 3)
-- errore, testa non gestita
else else
EmtSetLastError( 1212, "HEAD not managed") EmtSetLastError( 1212, "HEAD not managed")
end end
EmitMoveStartHead( 3)
-- aspetto esecuzione movimento testa 3
EmitMoveWaitHead( 3)
-- errore, testa non gestita
end end
-- dati aggancio a trave -- dati aggancio a trave
local BhData = { T=EMT.L1, SetHead=0} local BhData = { T=EMT.L1, SetHead=0}
@@ -974,17 +1072,18 @@ function OnRapid()
else else
--MyOutput( string.format( 'V1Pos=%.3f V2Pos=%.3f', EMT.V1POS, EMT.V2POS)) --MyOutput( string.format( 'V1Pos=%.3f V2Pos=%.3f', EMT.V1POS, EMT.V2POS))
if not EMT.RELOAD and not EMT.ZMAX and #EMT.AUXCMD > 0 and EMT.TO_ZMAX then if not EMT.RELOAD and not EMT.ZMAX and #EMT.AUXCMD > 0 and EMT.TO_ZMAX then
local bGotoHome = EMT.HEAD == 'H38' and EMT.ROLL_IN
-- caso speciale in cui bisogna solo cambiare presa aggregato lama sotto -- caso speciale in cui bisogna solo cambiare presa aggregato lama sotto
if EMT.R3_CHANGED then if EMT.R3_CHANGED then
-- EmitZmax è fatta per essere chiamata con utensile attuale. In questo caso l'attuale è già quello con nuova rotazione -- EmitZmax è fatta per essere chiamata con utensile attuale. In questo caso l'attuale è già quello con nuova rotazione
-- Allora salvo l'attuale e imposto il vecchio solo momentanemente, per poi ripristinarlo -- Allora salvo l'attuale e imposto il vecchio solo momentanemente, per poi ripristinarlo
local sBckTcPos = EMT.TCPOS local sBckTcPos = EMT.TCPOS
EMT.TCPOS = EMT.PREVTCPOSREAL_H2 EMT.TCPOS = EMT.PREVTCPOSREAL_H2
EmitZmax( false, false, PrevR1, PrevR2, false, false, true) EmitZmax( false, false, PrevR1, PrevR2, false, bGotoHome, true)
EMT.TCPOS = sBckTcPos EMT.TCPOS = sBckTcPos
EMT.R3_CHANGED = nil EMT.R3_CHANGED = nil
else else
EmitZmax( false, false, PrevR1, PrevR2, false, false, true) EmitZmax( false, false, PrevR1, PrevR2, false, bGotoHome, true)
end end
EMT.ZMAX = true EMT.ZMAX = true
EMT.TO_ZMAX = nil EMT.TO_ZMAX = nil
@@ -1060,7 +1159,15 @@ function OnRapid()
EmitMoveDataHead( 1, { Z=MyMaxZ1, B=0, S=Speed}) EmitMoveDataHead( 1, { Z=MyMaxZ1, B=0, S=Speed})
EmitMoveDataHead( 1, { C=EMT.R1, S=Speed}) EmitMoveDataHead( 1, { C=EMT.R1, S=Speed})
EmitMoveDataHead( 1, { X=EMT.L2, S=Speed}) EmitMoveDataHead( 1, { X=EMT.L2, S=Speed})
EmitMoveDataHead( 1, { Z=EMT.L3, B=EMT.R2, S=Speed}) -- se movimento di B > di 90°, spezza il movimento in 2 arrivando alla quota Z con B+-90 e poi muove l'ultimo segmento
-- evita collisione con carro X
if EMT.R2 > 91 or EMT.R2 < -91 then
local dBref = EgtClamp( EMT.R2, -91, 91)
EmitMoveDataHead( 1, { Z=EMT.L3, B=dBref, S=Speed})
EmitMoveDataHead( 1, { B=EMT.R2, S=Speed})
else
EmitMoveDataHead( 1, { Z=EMT.L3, B=EMT.R2, S=Speed})
end
-- caso standard -- caso standard
else else
-- se ero in posizione speciale, prima ruoto poi scendo -- se ero in posizione speciale, prima ruoto poi scendo
@@ -1081,16 +1188,24 @@ function OnRapid()
-- altrimenti sega a catena -- altrimenti sega a catena
else else
-- se bisogna scrivere tutti gli assi -- se bisogna scrivere tutti gli assi
local dSafeZ1 = EgtIf( EMT.TTOTLEN < MinLengthLongCSaw, ParkCSawZ1, ParkLongCSawZ1)
if WriteAllCoordsOnFirstM101 then if WriteAllCoordsOnFirstM101 then
local dSafeZ1 = EgtIf( EMT.TTOTLEN < MinLengthLongCSaw, ParkCSawZ1, ParkLongCSawZ1)
EmitMoveDataHead( 1, { X=-ParkCSawX1, Z=dSafeZ1, B=HomeB1, C=HomeC1, TRad=dTRad, TLen=dTLen, S=Speed}) EmitMoveDataHead( 1, { X=-ParkCSawX1, Z=dSafeZ1, B=HomeB1, C=HomeC1, TRad=dTRad, TLen=dTLen, S=Speed})
end end
-- Porto la Z alla giusta quota -- Porto la Z alla giusta quota
if EMT.L3 > HomeZ1 + 1 and abs( EMT.R2) > 89.9 then if EMT.L3 > dSafeZ1 + 1 and abs( EMT.R2) > 89.9 then
EmitMoveDataHead( 1, { X=EMT.L2, S=Speed}) EmitMoveDataHead( 1, { X=EMT.L2, S=Speed})
EmitMoveDataHead( 1, { Z=HomeZ1, S=Speed}) EmitMoveDataHead( 1, { Z=dSafeZ1, S=Speed})
end
local dChSawEncumbrance = EMT.L3 + MillOffs - ( ( ChSawLen + MillOffs) * EMT.ADIR[3]) - ( EMT.TTOTLEN * EMT.TDIR[3])
local dBeamQuote = DeltaTabZ + EMT.SB + 30
if dChSawEncumbrance < dBeamQuote then
EmitMoveDataHead( 1, { Z=dSafeZ1, B=EMT.R2, S=Speed})
EmitMoveDataHead( 1, { X=EMT.L2, C=EMT.R1, S=Speed})
EmitMoveDataHead( 1, { Z=EMT.L3, S=Speed})
else
EmitMoveDataHead( 1, { Z=EMT.L3, B=EMT.R2, S=Speed})
end end
EmitMoveDataHead( 1, { Z=EMT.L3, B=EMT.R2, S=Speed})
-- se motosega molto lunga, ruoto prima di muovermi in X -- se motosega molto lunga, ruoto prima di muovermi in X
if EMT.TTOTLEN >= MinLengthLongCSaw then if EMT.TTOTLEN >= MinLengthLongCSaw then
EmitMoveDataHead( 1, { C=EMT.R1, S=Speed}) EmitMoveDataHead( 1, { C=EMT.R1, S=Speed})
@@ -1182,20 +1297,20 @@ function OnRapid()
end end
-- scrivo solo se gli assi rotanti sono cambiati -- scrivo solo se gli assi rotanti sono cambiati
EmitMoveDataHead( 2, { Z=-dSafeZ2, S=Speed}) EmitMoveDataHead( 2, { Z=-dSafeZ2, S=Speed})
if EMT.L2pp > ParkMchY2 and ( CurrB2 ~= EMT.R2 or CurrC2 ~= EMT.R1) then if EMT.L2pp > SafeX2RotAxis and ( CurrB2 ~= EMT.R2 or CurrC2 ~= EMT.R1) then
EmitMoveDataHead( 2, { X=ParkMchY2, Z=-dSafeZ2, B=CurrB2, C=CurrC2, S=Speed}) EmitMoveDataHead( 2, { X=SafeX2RotAxis, Z=-dSafeZ2, B=CurrB2, C=CurrC2, S=Speed})
end end
else else
-- scrivo solo se gli assi rotanti sono cambiati -- scrivo solo se gli assi rotanti sono cambiati
if EMT.L2pp > ParkMchY2 and ( CurrB2 ~= EMT.R2 or CurrC2 ~= EMT.R1) then if EMT.L2pp > SafeX2RotAxis and ( CurrB2 ~= EMT.R2 or CurrC2 ~= EMT.R1) then
EmitMoveDataHead( 2, { X=ParkMchY2, Z=-dSafeZ2, B=CurrB2, C=CurrC2, S=Speed}) EmitMoveDataHead( 2, { X=SafeX2RotAxis, Z=-dSafeZ2, B=CurrB2, C=CurrC2, S=Speed})
end end
end end
-- se stesso utensile vado già alla X di lavoro -- se stesso utensile vado già alla X di lavoro
else else
-- scrivo solo se gli assi rotanti sono cambiati -- scrivo solo se gli assi rotanti sono cambiati
if EMT.ZMAX and EMT.L2pp > ParkMchY2 and ( CurrB2 ~= EMT.R2 or CurrC2 ~= EMT.R1) then if EMT.ZMAX and EMT.L2pp > SafeX2RotAxis and ( CurrB2 ~= EMT.R2 or CurrC2 ~= EMT.R1) then
EmitMoveDataHead( 2, { X=ParkMchY2, Z=-dSafeZ2, B=CurrB2, C=CurrC2, S=Speed}) EmitMoveDataHead( 2, { X=SafeX2RotAxis, Z=-dSafeZ2, B=CurrB2, C=CurrC2, S=Speed})
end end
end end
-- scrivo solo se gli assi rotanti sono cambiati -- scrivo solo se gli assi rotanti sono cambiati
@@ -1214,6 +1329,8 @@ function OnRapid()
EmitMoveWaitHead( 2) EmitMoveWaitHead( 2)
-- altrimenti testa 3 -- altrimenti testa 3
else else
-- eventuale preselezione successiva testa 2
PreselectNextDiffHead( EMT.MCHID, EMT.HEAD)
-- selezione testa (posso muovere X solo a Zmax) -- selezione testa (posso muovere X solo a Zmax)
local MyMaxZ3 = EgtGetAxisMax( 'Z3') local MyMaxZ3 = EgtGetAxisMax( 'Z3')
local dSafeZ3 = EgtGetAxisHomePos( 'Z3') local dSafeZ3 = EgtGetAxisHomePos( 'Z3')
@@ -1241,13 +1358,15 @@ function OnRapid()
if EMT.ZMAX or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then if EMT.ZMAX or ( EMT.FLAG == 2 and EMT.FLAG2 == 1) then
local B3Home = EgtGetAxisHomePos( 'B3') local B3Home = EgtGetAxisHomePos( 'B3')
local C3Home = EgtGetAxisHomePos( 'C3') local C3Home = EgtGetAxisHomePos( 'C3')
EmitMoveDataHead( 3, { X=SafeX3RotAxis, S=Speed}) EmitMoveDataHead( 3, { X=-SafeX3RotAxis, S=Speed})
-- se non sono esattamente in home, devo ruotare in zona sicura -- se non sono esattamente in home, devo ruotare in zona sicura
if abs( C3Home - EMT.R1) > 1 or abs( B3Home - EMT.R2) > 1 then if abs( C3Home - EMT.R1) > 1 or abs( B3Home - EMT.R2) > 1 then
EMT.L3 = min( EMT.L3, SafeZ3RotAxis) EMT.L3 = min( EMT.L3, SafeZ3RotAxis)
EmitMoveDataHead( 3, { Z=SafeZ3RotAxis, S=Speed}) EmitMoveDataHead( 3, { Z=SafeZ3RotAxis, S=Speed})
EmitMoveDataHead( 3, { B=EMT.R2, C=EMT.R1, S=Speed}) EmitMoveDataHead( 3, { B=EMT.R2, C=EMT.R1, S=Speed})
EmitMoveDataHead( 3, { Z=EMT.L3, S=Speed}) if ( EMT.L3 - SafeZ3RotAxis) > 100 * GEO.EPS_SMALL then
EmitMoveDataHead( 3, { Z=EMT.L3, S=Speed})
end
EmitMoveDataHead( 3, { X=EMT.L2, S=Speed}) EmitMoveDataHead( 3, { X=EMT.L2, S=Speed})
end end
end end
@@ -1258,8 +1377,6 @@ function OnRapid()
end end
EmitMoveStartHead( 3) EmitMoveStartHead( 3)
-- eventuale preselezione successiva testa 2
PreselectNextDiffHead( EMT.MCHID, EMT.HEAD)
-- aspetto esecuzione movimento testa 3 -- aspetto esecuzione movimento testa 3
EmitMoveWaitHead( 3) EmitMoveWaitHead( 3)
end end
@@ -1366,6 +1483,7 @@ function OnRapid()
MyOutput( 'M98') MyOutput( 'M98')
MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true)) MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true))
MyOutput( 'G24' .. EMT.IPLGLSTR) MyOutput( 'G24' .. EMT.IPLGLSTR)
EMT.PLANEACTIVE = true
-- forzo successiva emissione assi rotanti -- forzo successiva emissione assi rotanti
EMT.R1p = nil EMT.R1p = nil
EMT.R2p = nil EMT.R2p = nil
@@ -1402,7 +1520,9 @@ function OnRapid()
local bSplitCut = ( EMT.MCHUSERNOTES:find( 'Split', 1, true) ~= nil) local bSplitCut = ( EMT.MCHUSERNOTES:find( 'Split', 1, true) ~= nil)
-- porto in home la testa corrente se lavorazione successiva sopra con testa diversa oppure se punta lunga -- porto in home la testa corrente se lavorazione successiva sopra con testa diversa oppure se punta lunga
local nNextTopHSet = GetNextTopHSet( EMT.MCHID) local nNextTopHSet = GetNextTopHSet( EMT.MCHID)
local bTopGoHome = ( nHSet ~= 2 and nNextTopHSet ~= 0 and nHSet ~= nNextTopHSet) or ( nHSet == 1 and EMT.TTOTLEN > LongTool) -- ricavo prossimo utensile
local sNextTool = GetNextTool( EMT.MCHID)
local bTopGoHome = ( IsLastPath( EMT.PATHID) and not sNextTool and nHSet == 3) or EMT.HEAD == 'H38' or ( nHSet ~= 2 and nNextTopHSet ~= 0 and nHSet ~= nNextTopHSet) or ( nHSet == 1 and EMT.TTOTLEN > LongTool)
EmitZmax( true, true, EMT.R1p, EMT.R2p, bSplitCut, bTopGoHome, false) EmitZmax( true, true, EMT.R1p, EMT.R2p, bSplitCut, bTopGoHome, false)
-- aggiorno quota finale trave dopo Zmax -- aggiorno quota finale trave dopo Zmax
EMT.L1o = EMT.TPOS EMT.L1o = EMT.TPOS
@@ -1445,6 +1565,7 @@ function OnLinear()
MyOutput( 'M98') MyOutput( 'M98')
MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true)) MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true))
MyOutput( 'G24' .. EMT.IPLGLSTR) MyOutput( 'G24' .. EMT.IPLGLSTR)
EMT.PLANEACTIVE = true
-- emissione movimento -- emissione movimento
EMT.R1p = nil EMT.R1p = nil
EMT.R2p = nil EMT.R2p = nil
@@ -1535,6 +1656,7 @@ function OnArc()
MyOutput( 'M98') MyOutput( 'M98')
MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true)) MyOutput( 'M6 ' .. GetHeadToolCode() .. AdjustTcPos( true))
MyOutput( 'G24' .. EMT.IPLGLSTR) MyOutput( 'G24' .. EMT.IPLGLSTR)
EMT.PLANEACTIVE = true
-- emissione movimento -- emissione movimento
EMT.R1p = nil EMT.R1p = nil
EMT.R2p = nil EMT.R2p = nil
@@ -1597,28 +1719,6 @@ function OnArc()
EmtUpdatePrev() EmtUpdatePrev()
end end
---------------------------------------------------------------------
function CalcDinamicaPinze( dH, dS, dL)
local MinTempoAcc = 0.6 -- [s]
local MaxTempoAcc = 6.0 -- [s]
local KgMtCubo= WoodDensity or 550 -- densità legno [Kg / metro cubo]
local Massa = ( dH * dS * dL * KgMtCubo ) / 1e9 -- massa [Kg]
local FMaxPinze = EMT.FMAXPINZE -- Feed massima pinze [mm/min]
local ForzaAttrito = 350 * 9.8 * 0.2 -- Forza chiusura pinze [Kgf] * g * Coeff_Attrito -> [N]
local TempoAcc = ( ( Massa * FMaxPinze) / ( 60 * ForzaAttrito) / 1000)
if ( TempoAcc < MinTempoAcc) then TempoAcc = MinTempoAcc end
if ( TempoAcc > MaxTempoAcc) then TempoAcc = MaxTempoAcc end
local AccMaxPinze = FMaxPinze / ( 60 * MinTempoAcc)
local AccPinze = FMaxPinze / ( 60 * TempoAcc)
local RidFeed = 100 / Massa * 100
if RidFeed > 100 then
RidFeed = 100
elseif RidFeed < 10 then
RidFeed = 10
end
return TempoAcc * 1000, MinTempoAcc * 1000, RidFeed
end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function CalcForzaPinze( dH, dS, dL, dT) function CalcForzaPinze( dH, dS, dL, dT)
local MassaRef = 1500 -- [Kg] local MassaRef = 1500 -- [Kg]
@@ -1921,20 +2021,40 @@ function PrepareResidue( sCmd, nInd)
else else
EMT.UNL = true EMT.UNL = true
end end
-- se è scarico al carico
if Cmd[2] == 'Unload-On-Load' then
EMT.UNL2 = true
end
elseif Cmd[1] == '1' then elseif Cmd[1] == '1' then
if Cmd[2] ~= 'Z' then if Cmd[2] ~= 'Z' then
local MDChar local MDChar
if not EMT.UNL then if not EMT.UNL then
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV} MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
else else
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY2=1, FinStatY2=-84, BeamVise=0} if IsLastMachining( EMT.MCHID) then
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY2=1, FinStatY2=-84, V2=ParkV2, BeamVise=0}
else
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY2=1, FinStatY2=-84, BeamVise=0}
end
end end
if EMT.ROLL_IN then if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1 MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2 MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil EMT.ROLL_IN = nil
end end
-- se scarico al carico parcheggio per sicurezza morsa e paratia lato scarico
if EMT.UNL2 then
MDChar.V1 = ParkV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = ParkV2 ; EMT.V2POS = MDChar.V2
MDChar.BeamVise = 0
end
table.insert( EMT.MDCHAR, MDChar) table.insert( EMT.MDCHAR, MDChar)
-- Se scarico in linea con abbassamento piano ferma pezzo allo scarico
if Cmd[4] == 'UnBrakeBeam' then
-- Abbassa ferma pezzo
local MDStopBeam = { StopBeamStat=2, Load=1}
table.insert( EMT.MDCHAR, MDStopBeam)
end
end end
elseif Cmd[1] == '2' then elseif Cmd[1] == '2' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV2=1, BeamVise=EMT.BV} local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV2=1, BeamVise=EMT.BV}
@@ -1946,6 +2066,11 @@ function PrepareResidue( sCmd, nInd)
EMT.ROLL_IN = nil EMT.ROLL_IN = nil
end end
table.insert( EMT.MDCHAR, MDChar) table.insert( EMT.MDCHAR, MDChar)
-- Alza ferma pezzo
if Cmd[6] == 'BrakeBeam' then
local MDStopBeam = { StopBeamStat=1, Load=1}
table.insert( EMT.MDCHAR, MDStopBeam)
end
elseif Cmd[1] == '3' then elseif Cmd[1] == '3' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV1=1, IniStatV2=1, BeamVise=EMT.BV} local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV1=1, IniStatV2=1, BeamVise=EMT.BV}
if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end
@@ -2027,20 +2152,58 @@ function PrepareUnload( sCmd, nInd)
local Cmd = EgtSplitString( sCmd) local Cmd = EgtSplitString( sCmd)
if Cmd[1] == '0' then if Cmd[1] == '0' then
-- non interessa if Cmd[3] == 'Manual Unloading' then
EMT.MANUAL_UNL = true
end
elseif Cmd[1] == '1' then elseif Cmd[1] == '1' then
if Cmd[2] == 'Y2' then if Cmd[2] == 'Y2' then
-- se non è ultima fase e non è fase successiva a scarico su carico c'è una barra sulla pinza Y1
local bBarOnY = ( EMT.PHASE < EgtGetPhaseCount() and not IsEnd2Phase( EMT.PHASE)) local bBarOnY = ( EMT.PHASE < EgtGetPhaseCount() and not IsEnd2Phase( EMT.PHASE))
local MDChar = { Y2=tonumber(Cmd[3]), V2=ParkV2, IniStatY2=1, FinStatY2=-84, BeamVise=EgtIf( bBarOnY, 1, 0), MovType=EgtIf( EMT.CHY_ON, 3, 2)} -- Se scarico in linea con abbassamento piano ferma pezzo allo scarico
table.insert( EMT.MDCHAR, MDChar) if Cmd[4] == 'UnBrakeBeam' then
-- Muove carrello aperto e lo mantiene aperto
local MDChar = { Y2=tonumber(Cmd[3]), V2=ParkV2, IniStatY2=1, FinStatY2=1, BeamVise=EgtIf( bBarOnY, 1, 0), MovType=EgtIf( EMT.CHY_ON, 3, 2)}
table.insert( EMT.MDCHAR, MDChar)
-- Abbassa ferma pezzo
local MDStopBeam = { StopBeamStat=2, Unload=1}
table.insert( EMT.MDCHAR, MDStopBeam)
-- Dopo che si è abbassato il ferma pezzo chiude il pezzo in morsa per evitare che esso possa essere pinzato inclinato dal pistone
MDChar = { Y2=tonumber(Cmd[3]), V2=ParkV2, IniStatY2=1, FinStatY2=-1, BeamVise=EgtIf( bBarOnY, 1, 0), MovType=EgtIf( EMT.CHY_ON, 3, 2)}
table.insert( EMT.MDCHAR, MDChar)
-- Se non è ultima fase e non è fase successiva a scarico su carico c'è una barra sulla pinza Y1
else
if EMT.MANUAL_UNL then
-- se non è ultima fase e non è fase successiva a scarico su carico c'è una barra sulla pinza Y1
local dUnloadMacroCode = EgtIf( EMT.MANUAL_UNL, 85, 84)
EMT.MANUAL_UNL = nil
local bBarOnY = ( EMT.PHASE < EgtGetPhaseCount() and not IsEnd2Phase( EMT.PHASE))
local MDChar = { Y2=tonumber(Cmd[3]), V2=ParkV2, IniStatY2=1, FinStatY2=-dUnloadMacroCode, BeamVise=EgtIf( bBarOnY, 1, 0), MovType=EgtIf( EMT.CHY_ON, 3, 2)}
table.insert( EMT.MDCHAR, MDChar)
else
local nFinStatY2 = EgtIf( Cmd[4] == 'NoWaitUnload', -84, -1)
local MDChar = { Y2=tonumber(Cmd[3]), V2=ParkV2, IniStatY2=1, FinStatY2=nFinStatY2, BeamVise=EgtIf( bBarOnY, 1, 0), MovType=EgtIf( EMT.CHY_ON, 3, 2)}
table.insert( EMT.MDCHAR, MDChar)
end
end
end end
elseif Cmd[1] == '2' then elseif Cmd[1] == '2' then
if Cmd[4] == 'Y2' then if Cmd[4] == 'Y2' then
-- se non è ultima fase c'è una barra sulla pinza Y1
local bBarOnY = ( EMT.PHASE < EgtGetPhaseCount() and not IsEnd2Phase( EMT.PHASE)) local bBarOnY = ( EMT.PHASE < EgtGetPhaseCount() and not IsEnd2Phase( EMT.PHASE))
local MDChar = { Y2=tonumber(Cmd[5]), IniStatY1=EgtIf( bBarOnY, -1, 1), FinStatY1=EgtIf( bBarOnY, -1, 1), IniStatY2=-1, FinStatY2=1, IniStatV2=1, BeamVise=2, MovType=EgtIf( EMT.CHY_ON, 3, 2)} -- Se scarico in linea con alzata piano ferma pezzo allo scarico
table.insert( EMT.MDCHAR, MDChar) if Cmd[6] == 'BrakeBeam' then
-- Muove carrello e lo mantiene in presa
local MDChar = { Y2=tonumber(Cmd[5]), IniStatY1=EgtIf( bBarOnY, -1, 1), FinStatY1=EgtIf( bBarOnY, -1, 1), IniStatY2=-1, FinStatY2=-1, IniStatV2=1, BeamVise=2, MovType=EgtIf( EMT.CHY_ON, 3, 2)}
table.insert( EMT.MDCHAR, MDChar)
-- Alza ferma pezzo
local MDStopBeam = { StopBeamStat=1, Unload=1}
table.insert( EMT.MDCHAR, MDStopBeam)
-- Ribadisce le quote del carrello appena mosso e Apre la pinza
MDChar = { Y2=tonumber(Cmd[5]), IniStatY1=EgtIf( bBarOnY, -1, 1), FinStatY1=EgtIf( bBarOnY, -1, 1), IniStatY2=-1, FinStatY2=1, IniStatV2=1, BeamVise=2, MovType=EgtIf( EMT.CHY_ON, 3, 2)}
table.insert( EMT.MDCHAR, MDChar)
-- se non è ultima fase c'è una barra sulla pinza Y1
else
local MDChar = { Y2=tonumber(Cmd[5]), IniStatY1=EgtIf( bBarOnY, -1, 1), FinStatY1=EgtIf( bBarOnY, -1, 1), IniStatY2=-1, FinStatY2=1, IniStatV2=1, BeamVise=2, MovType=EgtIf( EMT.CHY_ON, 3, 2)}
table.insert( EMT.MDCHAR, MDChar)
end
end end
elseif Cmd[1] == '3' then elseif Cmd[1] == '3' then
-- non interessa -- non interessa
@@ -2074,27 +2237,55 @@ function PreparePreRotation( sCmd, nInd)
EMT.PREROT = true EMT.PREROT = true
elseif Cmd[2] == 'SplitRot' then elseif Cmd[2] == 'SplitRot' then
EMT.SPLITROT = true EMT.SPLITROT = true
-- se è scarico al carico
elseif Cmd[2] == 'Unload-On-Load' then
EMT.UNL2 = true
end end
elseif Cmd[1] == '1' then elseif Cmd[1] == '1' then
if Cmd[2] ~= 'Z' then if Cmd[2] ~= 'Z' then
local MDChar local MDChar
if not EMT.PREROT then if not EMT.PREROT then
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV} MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV}
if EMT.UNL2 then
MDChar.V1 = ParkV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = ParkV2 ; EMT.V2POS = MDChar.V2
end
else else
MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=86, FinStatY1=87, IniStatY2=1, BeamVise=0} MDChar = { [Cmd[2]]=tonumber(Cmd[3]), IniStatY1=86, FinStatY1=87, IniStatY2=1, BeamVise=0}
end end
table.insert( EMT.MDCHAR, MDChar) table.insert( EMT.MDCHAR, MDChar)
-- Se scarico in linea con abbassamento piano ferma pezzo allo scarico
if Cmd[4] == 'UnBrakeBeam' then
-- Abbassa ferma pezzo
local MDStopBeam = { StopBeamStat=2, Load=1}
table.insert( EMT.MDCHAR, MDStopBeam)
end
end end
elseif Cmd[1] == '2' then elseif Cmd[1] == '2' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV} local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV2=1, BeamVise=EMT.BV}
if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end
if Cmd[4] ~= 'T' then MDChar[Cmd[4]] = tonumber( Cmd[5]) end if Cmd[4] ~= 'T' then MDChar[Cmd[4]] = tonumber( Cmd[5]) end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar) table.insert( EMT.MDCHAR, MDChar)
-- Alza ferma pezzo
if Cmd[6] == 'BrakeBeam' then
local MDStopBeam = { StopBeamStat=1, Load=1}
table.insert( EMT.MDCHAR, MDStopBeam)
end
elseif Cmd[1] == '3' then elseif Cmd[1] == '3' then
local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, BeamVise=EMT.BV} local MDChar = { IniStatY1=EMT.ISY1, FinStatY1=EMT.FSY1, IniStatY2=EMT.ISY2, FinStatY2=EMT.FSY2, IniStatV1=1, IniStatV2=1, BeamVise=EMT.BV}
if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end if Cmd[2] ~= 'T' then MDChar[Cmd[2]] = tonumber( Cmd[3]) end
if Cmd[4] ~= 'T' then MDChar[Cmd[4]] = tonumber( Cmd[5]) end if Cmd[4] ~= 'T' then MDChar[Cmd[4]] = tonumber( Cmd[5]) end
if Cmd[6] ~= 'T' then MDChar[Cmd[6]] = tonumber( Cmd[7]) end if Cmd[6] ~= 'T' then MDChar[Cmd[6]] = tonumber( Cmd[7]) end
if EMT.ROLL_IN then
MDChar.V1 = MinV1 ; EMT.V1POS = MDChar.V1
MDChar.V2 = MaxV2 ; EMT.V2POS = MDChar.V2
EMT.ROLL_IN = nil
end
table.insert( EMT.MDCHAR, MDChar) table.insert( EMT.MDCHAR, MDChar)
elseif Cmd[1] == '4' then elseif Cmd[1] == '4' then
EMT.TO_ZMAX = true EMT.TO_ZMAX = true
@@ -2190,6 +2381,9 @@ end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function GetV1ToCloseTPA() function GetV1ToCloseTPA()
if EMT.MCHPRECUT or EMT.MCHCUT then
return false
end
local dMaxHeadPos = EMT.MAXMAX[1] + ( EMT.HOVM or 0) - ( EMT.X_OFF or 0) local dMaxHeadPos = EMT.MAXMAX[1] + ( EMT.HOVM or 0) - ( EMT.X_OFF or 0)
local dMinTailPos = EMT.MAXMIN[1] + EMT.LB + EgtIf( IsStartOrMidPhase( EMT.PHASE), 0, ( EMT.HOVM or 0)) - ( EMT.X_OFF or 0) local dMinTailPos = EMT.MAXMIN[1] + EMT.LB + EgtIf( IsStartOrMidPhase( EMT.PHASE), 0, ( EMT.HOVM or 0)) - ( EMT.X_OFF or 0)
--MyOutput( string.format( 'V1 MaxHeadPos=%.3f MinTailPos=%.3f BarLen=%.3f HeadOvm=%.3f V1NextPos=%.3f', dMaxHeadPos, dMinTailPos, EMT.LB, ( EMT.HOVM or 0), EMT.V1NEXTPOS)) --MyOutput( string.format( 'V1 MaxHeadPos=%.3f MinTailPos=%.3f BarLen=%.3f HeadOvm=%.3f V1NextPos=%.3f', dMaxHeadPos, dMinTailPos, EMT.LB, ( EMT.HOVM or 0), EMT.V1NEXTPOS))
@@ -2285,30 +2479,53 @@ function AdjustTcPos( bLen3, sTcPos, dAxR3)
end end
if sPos == '101' then if sPos == '101' then
if not dAxR3 then dAxR3 = EMT.R3 end if not dAxR3 then dAxR3 = EMT.R3 end
if abs( dAxR3 - 0) < 0.1 then -- controllo che il valore esista. Altrimenti è una testa senza asse ausiliario
sPos = '101' if dAxR3 then
elseif abs( dAxR3 - 270) < 0.1 then if abs( dAxR3 - 0) < 0.1 then
sPos = '102' sPos = '101'
elseif abs( dAxR3 - 180) < 0.1 then elseif abs( dAxR3 - 270) < 0.1 then
sPos = '103' sPos = '102'
elseif abs( dAxR3 - 90) < 0.1 then elseif abs( dAxR3 - 180) < 0.1 then
sPos = '104' sPos = '103'
else elseif abs( dAxR3 - 90) < 0.1 then
EmtSetLastError( 1210, 'Chain saw orientation not allowed') sPos = '104'
else
EmtSetLastError( 1210, 'Tool T101 orientation not allowed')
end
end end
end end
if sPos == '111' then if sPos == '111' then
if not dAxR3 then dAxR3 = EMT.R3 end if not dAxR3 then dAxR3 = EMT.R3 or 0 end
if abs( dAxR3 - 0) < 0.1 then -- controllo che il valore esista. Altrimenti è una testa senza asse ausiliario
sPos = '111' if dAxR3 then
elseif abs( dAxR3 - 270) < 0.1 then if abs( dAxR3 - 0) < 0.1 then
sPos = '112' sPos = '111'
elseif abs( dAxR3 - 180) < 0.1 then elseif abs( dAxR3 - 270) < 0.1 then
sPos = '113' sPos = '112'
elseif abs( dAxR3 - 90) < 0.1 then elseif abs( dAxR3 - 180) < 0.1 then
sPos = '114' sPos = '113'
else elseif abs( dAxR3 - 90) < 0.1 then
EmtSetLastError( 1210, 'Chain saw orientation not allowed') sPos = '114'
else
EmtSetLastError( 1210, 'Tool T111 orientation not allowed')
end
end
end
if sPos == '121' then
if not dAxR3 then dAxR3 = EMT.R3 or 0 end
-- controllo che il valore esista. Altrimenti è una testa senza asse ausiliario
if dAxR3 then
if abs( dAxR3 - 0) < 0.1 then
sPos = '121'
elseif abs( dAxR3 - 270) < 0.1 then
sPos = '122'
elseif abs( dAxR3 - 180) < 0.1 then
sPos = '123'
elseif abs( dAxR3 - 90) < 0.1 then
sPos = '124'
else
EmtSetLastError( 1210, 'Tool T121 orientation not allowed')
end
end end
end end
if sPos == '201' then if sPos == '201' then
@@ -2468,7 +2685,17 @@ function EmitZmax( bReset, bEnd, PrevR1, PrevR2, bSplitCut, bTopGoHome, bUsePrev
-- salgo in Z sicurezza raddrizzando la B -- salgo in Z sicurezza raddrizzando la B
local dSafeZ1 = EgtIf( EMT.TTOTLEN < MinLengthLongCSaw, ParkCSawZ1, ParkLongCSawZ1) local dSafeZ1 = EgtIf( EMT.TTOTLEN < MinLengthLongCSaw, ParkCSawZ1, ParkLongCSawZ1)
EmitMoveDataHead( 1, { Z=dSafeZ1, B=dHomeB1, Fmt=1}) EmitMoveDataHead( 1, { Z=dSafeZ1, B=dHomeB1, Fmt=1})
EmitMoveDataHead( 1, { X=-dHomeX1, C=dHomeC1, Fmt=1}) -- lascio la motosega a parcheggio. In caso di utilizzo della testa 3, la motosega viene scaricata automaticamente dalla macro.
EmitMoveDataHead( 1, { X=-ParkCSawX1, C=dHomeC1, Fmt=1})
EmitMoveStartHead( 1)
EmitMoveWaitHead( 1)
end
-- se ho degli aggregati e la prossima è la testa 3, scarico e prendo utensile di default
local nNextTopHSet = GetNextTopHSet( EMT.MCHID)
if IsHeadExisting( 3) and nNextTopHSet == 3 and ( EMT.TCPOS == 'T101' or EMT.TCPOS == 'T111' or EMT.TCPOS == 'T121') then
-- lascio la motosega a parcheggio. In caso di utilizzo della testa 3, la motosega viene scaricata automaticamente dalla macro.
local sDefToolToLoad = AdjustTcPos( false, DefTcPos1)
EmitMoveDataHead( 1, { X=-ParkX1, TPos=sDefToolToLoad, Fmt=1})
EmitMoveStartHead( 1) EmitMoveStartHead( 1)
EmitMoveWaitHead( 1) EmitMoveWaitHead( 1)
end end
@@ -2519,9 +2746,9 @@ function EmitZmax( bReset, bEnd, PrevR1, PrevR2, bSplitCut, bTopGoHome, bUsePrev
local dPosT = EgtIf( bEnd, EMT.L1o, EMT.TPOS or EMT.L1op) local dPosT = EgtIf( bEnd, EMT.L1o, EMT.TPOS or EMT.L1op)
EmitParkRoller( dPosT, bSplitCut) EmitParkRoller( dPosT, bSplitCut)
end end
-- se non sono esattamente in home, devo ruotare in zona sicura -- se non sono esattamente in home, ruoto dove sono
if abs( dHomeC3 - PrevR1) > 1 or abs( dHomeB3 - PrevR2) > 1 then if abs( dHomeC3 - PrevR1) > 1 or abs( dHomeB3 - PrevR2) > 1 then
EmitMoveDataHead( 3, { X=SafeX3RotAxis, Fmt=1}) --EmitMoveDataHead( 3, { X=-SafeX3RotAxis, Fmt=1})
EmitMoveDataHead( 3, { Z=SafeZ3RotAxis, Fmt=1}) EmitMoveDataHead( 3, { Z=SafeZ3RotAxis, Fmt=1})
EmitMoveDataHead( 3, { B=dHomeB3, C=dHomeC3, Fmt=1}) EmitMoveDataHead( 3, { B=dHomeB3, C=dHomeC3, Fmt=1})
end end
@@ -2567,15 +2794,19 @@ end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function EmitResetMachining() function EmitResetMachining()
MyOutput( 'G27') if EMT.PLANEACTIVE then
if EMT.PREFALLCUT then MyOutput( 'G27')
MyOutput( 'M29') if EMT.PREFALLCUT then
EMT.PREFALLCUT = nil MyOutput( 'M29')
EMT.PREFALLCUT = nil
end
local sP12 = ''
if EMT.TOOL ~= GetNextTool( EMT.MCHID) then sP12 = EgtIf( EMT.HEAD ~= 'H21', ' P1=0'..EgtIf( EMT.DOU_TYPE, ' P2=0', ''), ' P2=0') end
local sP4 = EgtIf( EMT.MCHUSERNOTES:find( 'Split', 1, true), ' P4=1', '')
MyOutput( 'M99'..sP12..sP4)
-- piano non più attivo
EMT.PLANEACTIVE = false
end end
local sP12 = ''
if EMT.TOOL ~= GetNextTool( EMT.MCHID) then sP12 = EgtIf( EMT.HEAD ~= 'H21', ' P1=0'..EgtIf( EMT.DOU_TYPE, ' P2=0', ''), ' P2=0') end
local sP4 = EgtIf( EMT.MCHUSERNOTES:find( 'Split', 1, true), ' P4=1', '')
MyOutput( 'M99'..sP12..sP4)
end end
--------------------------------------------------------------------- ---------------------------------------------------------------------
@@ -2640,8 +2871,8 @@ function EmitParkRoller( dPosT, bSplitCut)
local dPosY2 = dPosT + EMT.Y2DELTA local dPosY2 = dPosT + EMT.Y2DELTA
local DiffY2 = MyParkY2 - dPosY2 local DiffY2 = MyParkY2 - dPosY2
local dMoveY2 = EgtIf( DiffY2 < -0.1, dMoveV2, 0) local dMoveY2 = EgtIf( DiffY2 < -0.1, dMoveV2, 0)
local dTryMoveY2 = max( ParkV2 - dPosT - EMT.LT - EMT.HOVM, MinY2 - dPosY2 + 10) local dTryMoveY2 = max( ParkV2 - dPosT - EMT.LT - EMT.DELTA_LT - EMT.HOVM, MinY2 - dPosY2 + 10)
if ( dPosT + EMT.LT + EMT.HOVM < ParkV1 + ExtraParkV and dPosT + EMT.LT + EMT.HOVM > ParkV2 and dPosY2 + dTryMoveY2 > MinY2) then dMoveY2 = min( dMoveY2, dTryMoveY2) end if ( dPosT + EMT.LT + EMT.DELTA_LT + EMT.HOVM < ParkV1 + ExtraParkV and dPosT + EMT.LT + EMT.DELTA_LT + EMT.HOVM > ParkV2 and dPosY2 + dTryMoveY2 > MinY2) then dMoveY2 = min( dMoveY2, dTryMoveY2) end
--MyOutput( string.format( 'PosT=%.3f LT=%.3f PosY2=%.3f V2POS=%.3f', dPosT, EMT.LT, dPosY2, EMT.V2POS)) --MyOutput( string.format( 'PosT=%.3f LT=%.3f PosY2=%.3f V2POS=%.3f', dPosT, EMT.LT, dPosY2, EMT.V2POS))
MDChar.Y2 = dPosY2 + dMoveY2 MDChar.Y2 = dPosY2 + dMoveY2
MDChar.MovType = 2 MDChar.MovType = 2
@@ -2756,35 +2987,44 @@ function PreselectNextDiffHead( nMchId, sHead)
end end
-- altrimenti (testa 3) -- altrimenti (testa 3)
else else
-- se preselezione testa 1 -- se è macchina a 3 teste con gruppo truciolatore 4 assi
if nNextHSet == 1 then if EgtGetHeadId( 'H39') then
local nNextTc = GetTcForTopHeadTool( sNextTcPos) -- utensile da caricare -- se preselezione testa 1
local nPrevTc = GetTcForTopHeadTool( EMT.PREVTCPOS_H1) -- utensile da depositare if nNextHSet == 1 then
-- se devo lasciare o prelevare da TC1 oppure non so cosa c'è montato, non posso preselezionare local nNextTc = GetTcForTopHeadTool( sNextTcPos) -- utensile da caricare
if nNextTc == 1 or nPrevTc == 1 or nPrevTc == 0 then return local nPrevTc = GetTcForTopHeadTool( EMT.PREVTCPOS_H1) -- utensile da depositare
-- TC su montante sinistro -- se devo lasciare o prelevare da TC1 oppure non so cosa c'è montato, non posso preselezionare
if nNextTc == 1 or nPrevTc == 1 or nPrevTc == 0 then return
-- TC su montante sinistro
else
if BD.RIGHT_LOAD and EMT.MAXMAX[2] > ( DeltaTabY + MaxHoOpen + 200) then return end
if not BD.RIGHT_LOAD and EMT.MAXMAX[2] > DeltaTabY then return end
end
-- se preselezione testa 2
else else
if BD.RIGHT_LOAD and EMT.MAXMAX[2] > ( DeltaTabY + MaxHoOpen + 200) then return end -- se agregato lama speciale non preseleziono mai
if not BD.RIGHT_LOAD and EMT.MAXMAX[2] > DeltaTabY then return end if sNextHead == 'H22' or EMT.PREVHEAD_H2 == 'H22' then return end
end -- se la Z di lavoro è più bassa del cambio utensili, verifico quota X (la nostra Y)
-- se preselezione testa 2 if EMT.MAXMIN[3] < MinZ1ToChangeH2 then
else if BD.RIGHT_LOAD and EMT.MAXMAX[2] > ( DeltaTabY + MaxHoOpen + 200) then return end
-- se agregato lama speciale non preseleziono mai if not BD.RIGHT_LOAD and EMT.MAXMAX[2] > DeltaTabY then return end
if sNextHead == 'H22' or EMT.PREVHEAD_H2 == 'H22' then return end end
-- se la Z di lavoro è più bassa del cambio utensili, verifico quota X (la nostra Y)
if EMT.MAXMIN[3] < MinZ1ToChangeH2 then
if BD.RIGHT_LOAD and EMT.MAXMAX[2] > ( DeltaTabY + MaxHoOpen + 200) then return end
if not BD.RIGHT_LOAD and EMT.MAXMAX[2] > DeltaTabY then return end
end end
-- se gruppo lama dedicato, senza cambio utensile non si preseleziona mai
elseif EgtGetHeadId( 'H38') then
return
end end
end end
-- faccio preselezione ( se sono arrivato qui, vuol dire che posso preselezionare) -- faccio preselezione ( se sono arrivato qui, vuol dire che posso preselezionare)
if nNextHSet == 1 then if nNextHSet == 1 then
local dNextX local dNextX
-- se sto lavorando con testa 3 oppure utensile lungo, la testa 1 deve restare in home -- se sto lavorando con testa 3, la testa 1 preselezionata deve restare in home
if nHSet == 3 or dNextTotLen < LongTool then if nHSet == 3 then
dNextX = EgtGetAxisHomePos( 'X1') dNextX = - EgtGetAxisHomePos( 'X1')
-- se il prossimo utensile su testa 1 è utensile lungo, resta in home
elseif sNextHead == 'H11' and dNextTotLen > LongTool then
dNextX = - EgtGetAxisHomePos( 'X1')
-- altrimenti recupero quota X1 (nostro L2) -- altrimenti recupero quota X1 (nostro L2)
else else
dNextX = GetStartMachiningXaxis( nNextMchId) dNextX = GetStartMachiningXaxis( nNextMchId)
@@ -2796,7 +3036,7 @@ function PreselectNextDiffHead( nMchId, sHead)
EmitMoveDataHead( 1, { X=dNextX, B=ParkB1, C=ParkC1, TPos=AdjustTcPos( false, sNextTcPos), Fmt=2}) EmitMoveDataHead( 1, { X=dNextX, B=ParkB1, C=ParkC1, TPos=AdjustTcPos( false, sNextTcPos), Fmt=2})
else else
local nNextTc = GetTcForTopHeadTool( sNextTcPos) local nNextTc = GetTcForTopHeadTool( sNextTcPos)
EmitMoveDataHead( 1, { X=dNextX, B=ParkLongB1, C=EgtIf( nPrevTc ~= 2, ParkLongTc1C1, ParkLongTc2C1), TPos=AdjustTcPos( false, sNextTcPos), Fmt=2}) EmitMoveDataHead( 1, { X=dNextX, B=ParkLongB1, C=EgtIf( nNextTc ~= 2, ParkLongTc1C1, ParkLongTc2C1), TPos=AdjustTcPos( false, sNextTcPos), Fmt=2})
end end
EmitMoveStartHead( 1) EmitMoveStartHead( 1)
elseif sNextHead == 'H12' or sNextHead == 'H16' then elseif sNextHead == 'H12' or sNextHead == 'H16' then
@@ -2810,9 +3050,11 @@ function PreselectNextDiffHead( nMchId, sHead)
EmitMoveDataHead( 1, { X=EgtIf( bXSpec, -DeltaTabY, dNextX), B=ParkCSawB1, C=MyParkCSawC1, TPos=AdjustTcPos( false, sNextTcPos, dPosA), Fmt=2}) EmitMoveDataHead( 1, { X=EgtIf( bXSpec, -DeltaTabY, dNextX), B=ParkCSawB1, C=MyParkCSawC1, TPos=AdjustTcPos( false, sNextTcPos, dPosA), Fmt=2})
EmitMoveStartHead( 1) EmitMoveStartHead( 1)
end end
else elseif nNextHSet == 2 then
EmitMoveDataHead( 2, { B=ParkB2, C=ParkC2, TPos=AdjustTcPos( false, sNextTcPos), Fmt=2}) EmitMoveDataHead( 2, { B=ParkB2, C=ParkC2, TPos=AdjustTcPos( false, sNextTcPos), Fmt=2})
EmitMoveStartHead( 2) EmitMoveStartHead( 2)
else
; -- non si preseleziona testa 3
end end
end end
end end
@@ -2944,6 +3186,23 @@ function EmitMoveWaitHead( nHead)
MyOutput( sOut) MyOutput( sOut)
end end
---------------------------------------------------------------------
-- Emette i movimenti di esecuzione movimenti trave e alzata o discesa del piano ferma pezzo
function EmitStopBeam( MoData)
if MoData.StopBeamStat then
if MoData.Load then
EmitMoveStartChars( 3)
EmitMoveWaitChars( 3)
sOut = 'M125 P1=' .. EgtNumToString( MoData.StopBeamStat, 0)
else
EmitMoveStartChars( 2)
EmitMoveWaitChars( 2)
sOut = 'M125 P2=' .. EgtNumToString( MoData.StopBeamStat, 0)
end
end
MyOutput( sOut)
end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function EmitMoveDataChars( MoData) function EmitMoveDataChars( MoData)
local sOut = 'M111' local sOut = 'M111'
+595 -91
View File
File diff suppressed because it is too large Load Diff
+269 -34
View File
@@ -7,6 +7,65 @@ EgtEnableDebug( false)
-- Carico libreria -- Carico libreria
local BD = require( 'BeamData') local BD = require( 'BeamData')
---------------------------------------------------------------------
-- *** Generic Machinings ***
---------------------------------------------------------------------
require( 'EmtGenMachining')
---------------------------------------------------------------------
-- *** Special GetPrevMachiningOffset ***
---------------------------------------------------------------------
-----------------------------------------------------------------------------------------
function OnSpecialGetPrevMachiningOffset()
-- Aggiorno posizione della testa della trave a seguito di movimenti delle pinze non previsti tra le fasi
local function TPosUpdate()
local nClId = EgtGetFirstNameInGroup( EMC.CURRMCHID, 'CL') -- recupero Id del gruppo CL della lavorazione corrente
local nPathId = EgtGetFirstInGroup( nClId or GDB_ID.NULL) -- Id del primo gruppo nella lavorazione (P1)
if not nPathId then
EMC.ERR = 12
EMC.MSG = ' Error : CL group path not found'
return
end
local dAuxMoveCount = EgtGetInfo( nPathId, 'AS#', 'd') or 0 -- numero di movimenti ausiliari
local dTRepos = nil
-- controlla ogni gruppo di movimenti ausiliari
for i = 1, dAuxMoveCount do
local aAuxMove = EgtGetInfo( nPathId, 'AS' .. tostring( i), 'vs') or {} -- array contenete i parametri di ogni gruppo
-- controlla solo i movimenti della testa trave e salva l'ultimo
if aAuxMove[1] == '2' or aAuxMove[1] == '3' then
for j = 2, #aAuxMove do
if aAuxMove[j] == 'T' then
dTRepos = aAuxMove[j+1]
break
end
end
end
end
return dTRepos
end
-- default
EMC.ERR = 0
EMC.PREVOFFSX = 0
-- se c'è cambio di fase tra le lavorazioni (quindi la precedente è l'ultima della sua fase e la corrente la prima)
if EMC.PREVPHASE ~= EMC.CURRPHASE then
-- se la fase corrente è di inizio lavorazione di nuova trave
if IsStartOrRestPhase( EMC.CURRPHASE) then
-- recupero la posizione finale della lavorazione precedente
local vPrevAx = EmtGetFinalAxesPos( EMC.PREVMCHID)
-- ricava se e quanto la trave viene spostata tra le due fasi dai movimenti ausiliari e corregge l'offset di fine fase
local dNewTPos = TPosUpdate()
-- se ci sono dei movimenti della testa trave tra le due fasi ricava il delta tra la vecchia e la nuova posizione
if dNewTPos then
EMC.PREVOFFSX = dNewTPos - vPrevAx[1]
-- oppure la X (L1) di questa corrisponde alla posizione iniziale della nuova trave, se ne deduce l'offset
else
EMC.PREVOFFSX = ParkV1 - vPrevAx[1]
end
end
end
end
--------------------------------------------------------------------- ---------------------------------------------------------------------
-- *** Special Z moves *** -- *** Special Z moves ***
--------------------------------------------------------------------- ---------------------------------------------------------------------
@@ -77,6 +136,8 @@ function OnSpecialGetMaxZ()
EMC.MAXZ = MaxZ1Blade - EgtIf( abs( EMC.R2) < 90.1 and abs( EMC.R2p) < 90.1, 0, 130) EMC.MAXZ = MaxZ1Blade - EgtIf( abs( EMC.R2) < 90.1 and abs( EMC.R2p) < 90.1, 0, 130)
elseif vtTp:getZ() > 0.707 or vtT:getZ() > 0.707 then elseif vtTp:getZ() > 0.707 or vtT:getZ() > 0.707 then
EMC.MAXZ = ParkZ1 + 200 EMC.MAXZ = ParkZ1 + 200
elseif vtTp:getZ() > 0.5 or vtT:getZ() > 0.5 then
EMC.MAXZ = ParkZ1 + 100
else else
EMC.MAXZ = ParkZ1 + 1 EMC.MAXZ = ParkZ1 + 1
end end
@@ -86,7 +147,7 @@ function OnSpecialGetMaxZ()
local vMZ = {{ Tz=0.85, Ez=440}, { Tz=0.5, Ez=200}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}} local vMZ = {{ Tz=0.85, Ez=440}, { Tz=0.5, Ez=200}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}}
EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ) EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ)
else else
local vMZ = {{ Tz=0.85, Ez=400}, { Tz=0.7, Ez=300}, { Tz=0.5, Ez=195}, { Tz=0.15, Ez=70}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}} local vMZ = {{ Tz=0.85, Ez=400}, { Tz=0.7, Ez=300}, { Tz=0.5, Ez=195}, { Tz=0.15, Ez=60}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}}
EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ) EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ)
end end
elseif EMC.HEAD == 'H16' then elseif EMC.HEAD == 'H16' then
@@ -95,6 +156,8 @@ function OnSpecialGetMaxZ()
EMC.MAXZ = MaxZ1Blade - EgtIf( abs( EMC.R2) < 90.1 and abs( EMC.R2p) < 90.1, 0, 130) EMC.MAXZ = MaxZ1Blade - EgtIf( abs( EMC.R2) < 90.1 and abs( EMC.R2p) < 90.1, 0, 130)
elseif vtTp:getZ() > 0.707 or vtT:getZ() > 0.707 then elseif vtTp:getZ() > 0.707 or vtT:getZ() > 0.707 then
EMC.MAXZ = ParkZ1 + 200 EMC.MAXZ = ParkZ1 + 200
elseif vtTp:getZ() > 0.5 or vtT:getZ() > 0.5 then
EMC.MAXZ = ParkZ1 + 100
else else
EMC.MAXZ = ParkZ1 + 1 EMC.MAXZ = ParkZ1 + 1
end end
@@ -104,7 +167,7 @@ function OnSpecialGetMaxZ()
local vMZ = {{ Tz=0.85, Ez=440}, { Tz=0.5, Ez=200}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}} local vMZ = {{ Tz=0.85, Ez=440}, { Tz=0.5, Ez=200}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}}
EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ) EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ)
else else
local vMZ = {{ Tz=0.85, Ez=400}, { Tz=0.7, Ez=300}, { Tz=0.5, Ez=195}, { Tz=0.15, Ez=70}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}} local vMZ = {{ Tz=0.85, Ez=400}, { Tz=0.7, Ez=300}, { Tz=0.5, Ez=195}, { Tz=0.15, Ez=60}, { Tz=-0.01, Ez=5}, { Tz=-0.5, Ez=1}}
EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ) EMC.MAXZ = ParkZ1 + CalcExtraZ( vtTpZm, vtT, vMZ)
end end
elseif EMC.HEAD == 'H21' then elseif EMC.HEAD == 'H21' then
@@ -205,7 +268,7 @@ local SIC_V = 50 -- sicurezza da testa
local MIN_ENG_V = 115 -- ingombro asse Z local MIN_ENG_V = 115 -- ingombro asse Z
local MIN_ENG_RACK_V = 161 -- ingombro asse Z con cremagliera local MIN_ENG_RACK_V = 161 -- ingombro asse Z con cremagliera
local MIN_ENG_XZ2_V = 180 -- ingombro assi XZ sotto local MIN_ENG_XZ2_V = 180 -- ingombro assi XZ sotto
local MIN_Z2_FOR_ENG_XZ2_V = 270 -- quota Z2 da cui considerare ingombro assi XZ sotto local MIN_Z2_FOR_ENG_XZ2_V = 250 -- quota Z2 da cui considerare ingombro assi XZ sotto
local AGG_V = MinDeltaYV -- ingombro rulli pressori + sicurezza local AGG_V = MinDeltaYV -- ingombro rulli pressori + sicurezza
local MaxLenSmT = 1500 -- massima lunghezza pezzo scaricato con nastri verdi local MaxLenSmT = 1500 -- massima lunghezza pezzo scaricato con nastri verdi
local DIST_Y1MAX_LOAD = 100 -- distanza carrello Y1 da massimo asse al carico local DIST_Y1MAX_LOAD = 100 -- distanza carrello Y1 da massimo asse al carico
@@ -318,7 +381,7 @@ local function GetNextRawInOrd( nCurrRawId)
end end
----------------------------------------------------------------------- -----------------------------------------------------------------------
local function EnsureZmax( bCloseV, vCmd) local function EnsureZmax( bCloseV, vCmd, nInd)
-- verifico non sia già inserito nella lista dei comandi -- verifico non sia già inserito nella lista dei comandi
for i = 1, #vCmd do for i = 1, #vCmd do
if vCmd[i][1] == 4 then if vCmd[i][1] == 4 then
@@ -330,7 +393,11 @@ local function EnsureZmax( bCloseV, vCmd)
end end
end end
-- posizionamento sicuro teste e rulli -- posizionamento sicuro teste e rulli
table.insert( vCmd, { 4, EgtIf( bCloseV, 1, 0)}) if not nInd then
table.insert( vCmd, { 4, EgtIf( bCloseV, 1, 0)})
else
table.insert( vCmd, nInd, { 4, EgtIf( bCloseV, 1, 0)})
end
return true return true
end end
@@ -504,6 +571,14 @@ function OnSpecialApplyDisposition()
end end
-- eseguo scarico -- eseguo scarico
SpecSetCarrPosFromCmds( vCmd2) SpecSetCarrPosFromCmds( vCmd2)
-- determino posizione testa trave
local nLastEntId = EgtGetLastInGroup( EgtGetLastInGroup( EgtGetFirstNameInGroup( EgtGetPrev( EMC.DISPID), 'CL')))
if nLastEntId then
local vAxes = EmtGetAxesPos( nLastEntId)
if #vAxes > 0 then EMC.TPOS = vAxes[1] end
else
EMC.TPOS = EgtGetInfo( EMC.DISPID, 'TPOS', 'd')
end
local vCmd3 = SpecCalcUnload() local vCmd3 = SpecCalcUnload()
-- unisco ed emetto i comandi -- unisco ed emetto i comandi
vCmd = EgtJoinTables( vCmd, vCmd2) vCmd = EgtJoinTables( vCmd, vCmd2)
@@ -513,6 +588,24 @@ end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function OnPostApplyMachining() function OnPostApplyMachining()
-- Inizializzo codice di errore
EMC.ERR = 0
-- Verifico se ultima lavorazione della fase
local nNextOpeId = EgtGetNextActiveOperation( EMC.MCHID)
local bMchLast = ( not nNextOpeId or EgtGetOperationPhase( nNextOpeId) ~= EMC.PHASE) -- Agisco sui diversi percorsi della lavorazione
local nPathId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( EMC.MCHID, 'CL') or GDB_ID.NULL)
while nPathId do
-- recupero id del successivo
nPathId = EgtGetNext( nPathId)
-- verifico se ultimo percorso di ultima lavorazione della fase
local bLast = ( bMchLast and ( not nPathId))
-- se ultimo, elimino ritorno in home
if bLast then EgtRemoveOperationHome( EMC.MCHID) end
end
end
---------------------------------------------------------------------
function OnSpecialApplyMachining()
EgtOutLog( ' Lavorazione : ' .. EgtGetName( EMC.MCHID) .. ' (' .. tostring( EMC.MCHID) .. ')') EgtOutLog( ' Lavorazione : ' .. EgtGetName( EMC.MCHID) .. ' (' .. tostring( EMC.MCHID) .. ')')
@@ -605,14 +698,14 @@ function OnPostApplyMachining()
-- verifico se ultimo percorso di ultima lavorazione della fase -- verifico se ultimo percorso di ultima lavorazione della fase
local bLast = ( bMchLast and ( not nPathId)) local bLast = ( bMchLast and ( not nPathId))
-- se ultimo, elimino ritorno in home -- se ultimo, elimino ritorno in home
if bLast then EgtRemoveOperationHome( EMC.MCHID) end -- if bLast then EgtRemoveOperationHome( EMC.MCHID) end
-- salvo lo stato dei carrelli -- salvo lo stato dei carrelli
local OriTPos = EMC.TPOS local OriTPos = EMC.TPOS
local OriY1Delta = EMC.Y1DELTA local OriY1Delta = EMC.Y1DELTA
local OriY2Delta = EMC.Y2DELTA local OriY2Delta = EMC.Y2DELTA
local OriV1Pos = EMC.V1POS local OriV1Pos = EMC.V1POS
local OriV2Pos = EMC.V2POS local OriV2Pos = EMC.V2POS
local OriCnt = EMC.CNT local OriCnt = EMC.CNT
-- eseguo le elaborazioni -- eseguo le elaborazioni
SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bLast and bUnload) SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bLast and bUnload)
-- se separazione, verifico il risultato -- se separazione, verifico il risultato
@@ -669,7 +762,10 @@ function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload)
-- Verifico se lavorazione pareti -- Verifico se lavorazione pareti
local bWall = ( EgtGetInfo( EgtGetCurrMachGroup() or GDB_ID.NULL, 'Wall', 'd') == 1) local bWall = ( EgtGetInfo( EgtGetCurrMachGroup() or GDB_ID.NULL, 'Wall', 'd') == 1)
-- se il pezzo dev'essere scaricato al carico
local dUnloadType = EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL, 'UNLOAD', 'd')
local bUnloadOnLoadPos = dUnloadType == 1 or dUnloadType == -1
-- mi salvo info lavorazione su una lista -- mi salvo info lavorazione su una lista
local AuxInfoMach = {} local AuxInfoMach = {}
AuxInfoMach.bPreSplit = bPreSplit AuxInfoMach.bPreSplit = bPreSplit
@@ -677,7 +773,7 @@ function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload)
AuxInfoMach.bPreCut = bPreCut AuxInfoMach.bPreCut = bPreCut
AuxInfoMach.bCutting = bCutting AuxInfoMach.bCutting = bCutting
AuxInfoMach.bUnload = bUnload AuxInfoMach.bUnload = bUnload
-- Assegno flag di pezzo separato dal resto del grezzo -- Assegno flag di pezzo separato dal resto del grezzo
SPLIT = IsEndPhase( EMC.PHASE) SPLIT = IsEndPhase( EMC.PHASE)
@@ -685,6 +781,13 @@ function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload)
local b3Tot = BBox3d() local b3Tot = BBox3d()
local b3Raw = BBox3d() local b3Raw = BBox3d()
local nNextOddPhase = GetNextStartOrRestPhase( EMC.PHASE) local nNextOddPhase = GetNextStartOrRestPhase( EMC.PHASE)
-- se esistono più grezzi toglie l'impostazione di scarico al carico e ritorna errore
if bUnloadOnLoadPos and ( nNextOddPhase and nNextOddPhase <= EgtGetPhaseCount()) then
bUnloadOnLoadPos = false
EMC.ERR = 22
EMC.MSG = ' Error : Unload on Load Position not reachable if raw part on Load Position'
return
end
local nRawId = EgtGetFirstRawPart() local nRawId = EgtGetFirstRawPart()
local nCurrRawId = GDB_ID.NULL local nCurrRawId = GDB_ID.NULL
while nRawId do while nRawId do
@@ -735,6 +838,10 @@ function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload)
elseif bPreCut or bCutting then elseif bPreCut or bCutting then
local dDistF, dDistB, dRollF, dRollB = SpecialCalcPhaseEncumbrance( EMC.PHASE + 1) local dDistF, dDistB, dRollF, dRollB = SpecialCalcPhaseEncumbrance( EMC.PHASE + 1)
dDistFront = min( dDistFront, dDistF) dDistFront = min( dDistFront, dDistF)
-- Se è previsto lo scarico al carico aumenta l'ingombro dell'area di lavoro
if bUnloadOnLoadPos then
dDistFront = dDistFront -( MinDeltaYV*2 + AGG_V)
end
dDistBack = min( dDistBack, dDistB) dDistBack = min( dDistBack, dDistB)
end end
@@ -833,7 +940,7 @@ function SpecApplyPath( bPreSplit, bSplitting, bPreCut, bCutting, bUnload)
EgtSetInfo( NextDispId, 'V1POS', EMC.V1POS) EgtSetInfo( NextDispId, 'V1POS', EMC.V1POS)
EgtSetInfo( NextDispId, 'V2POS', EMC.V2POS) EgtSetInfo( NextDispId, 'V2POS', EMC.V2POS)
end end
end end
-- Se previsto scarico, lo eseguo -- Se previsto scarico, lo eseguo
if bUnload then if bUnload then
@@ -1105,7 +1212,7 @@ function SpecCalcCarriages( dDistFront, dDistBack, dRollFront, dRollBack, dY1Del
-- dopo che si è calcolato il minimo e massimo dell'intervallo, verifico che in testa rimanga almeno il minimo per poter fare passaggio pinze e scaricare -- dopo che si è calcolato il minimo e massimo dell'intervallo, verifico che in testa rimanga almeno il minimo per poter fare passaggio pinze e scaricare
if AuxInfoMach and ( AuxInfoMach.bSplitting or AuxInfoMach.bCutting) then if AuxInfoMach and ( AuxInfoMach.bSplitting or AuxInfoMach.bCutting) then
if WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF > 1.5 * BD.CHAR_EXTRA_DIST and WorkTab.dY1DeltaMaxF > EMC.LT + BD.MINRAW_S + BD.CHAR_EXTRA_DIST then if WorkTab.dY1DeltaMaxF - WorkTab.dY1DeltaMinF > 1.5 * BD.CHAR_EXTRA_DIST and WorkTab.dY1DeltaMaxF > EMC.LT + BD.MINRAW_S + BD.CHAR_EXTRA_DIST then
WorkTab.dY1DeltaMinF = max( min( EMC.LT + BD.MINRAW_S, WorkTab.dY1DeltaMaxF - 1), WorkTab.dY1DeltaMinF) WorkTab.dY1DeltaMinF = max( min( EMC.LT + BD.MINRAW_S, WorkTab.dY1DeltaMaxF - 1), WorkTab.dY1DeltaMinF + EMC.LT)
end end
end end
@@ -1138,7 +1245,9 @@ function SpecCalcCarriages( dDistFront, dDistBack, dRollFront, dRollBack, dY1Del
WorkTab.dY1DeltaMaxF = min( EMC.LB - MinJoin, MaxY1 + dDistFront + dRollFront + AGG_V) WorkTab.dY1DeltaMaxF = min( EMC.LB - MinJoin, MaxY1 + dDistFront + dRollFront + AGG_V)
WorkTab.dY2DeltaMinF = max( MinJoin + EMC.HCING + EMC.HOVM, EMC.LB + MinY2 - dMyDistBack - AGG_V - dRollBack) WorkTab.dY2DeltaMinF = max( MinJoin + EMC.HCING + EMC.HOVM, EMC.LB + MinY2 - dMyDistBack - AGG_V - dRollBack)
WorkTab.dY2DeltaMaxF = min( dDistFront, EMC.LB - MyMinOther) -- - EMC.TCING WorkTab.dY2DeltaMaxF = min( dDistFront, EMC.LB - MyMinOther) -- - EMC.TCING
if dY1DeltaMaxSP then WorkTab.dY1DeltaMaxF = min( WorkTab.dY1DeltaMaxF, dY1DeltaMaxSP) end if dY1DeltaMaxSP and dY1DeltaMaxSP > WorkTab.dY1DeltaMinF then
WorkTab.dY1DeltaMaxF = min( WorkTab.dY1DeltaMaxF, dY1DeltaMaxSP)
end
if dY2DeltaMinUL then WorkTab.dY2DeltaMinF = max( WorkTab.dY2DeltaMinF, dY2DeltaMinUL) end if dY2DeltaMinUL then WorkTab.dY2DeltaMinF = max( WorkTab.dY2DeltaMinF, dY2DeltaMinUL) end
WorkTab.dV1PosF = dRollBack WorkTab.dV1PosF = dRollBack
WorkTab.bV1CloseF = false WorkTab.bV1CloseF = false
@@ -1263,8 +1372,100 @@ function SpecCalcSplit( dLenRaw, dMaxLenLeft)
return vCmd return vCmd
end end
---------------------------------------------------------------------
-- Scarica il pezzo in zona di carico
function SpecCalcUnloadOnLoadPos()
local vCmdPre = {}
EgtOutLog( ' *[UL]', 1)
if not EMC.Y1DELTA and not EMC.Y2DELTA then
EMC.ERR = 21
EMC.MSG = ' Error : Y1 and Y2 not clamped for unloading'
return {}
end
-- Se pinza Y2 chiusa, devo effettuare uno scambio
local dY1DeltaMaxSP = MaxY1 - UnloadOnLoadTPos - TurnerOffs - 10 * GEO.EPS_SMALL
if EMC.Y2DELTA or EMC.Y1DELTA > dY1DeltaMaxSP then
-- imposto quote aggancio per avere solo pinza Y
local dDistFront = 0
local dDistBack = EMC.LB - MinOther - EMC.HOVM + 10 * GEO.EPS_SMALL
-- dico che le paratie sono chiuse perchè poi se ho dei movimenti, verranno chiuse, quindi parto considerandole già chiuse
EMC.V1POS = 0
EMC.V2POS = 0
-- effettuo scambio
vCmdPre = SpecCalcCarriages( dDistFront, dDistBack, 0, 0, dY1DeltaMaxSP)
-- recupero nuova posizione carrelli
SpecSetCarrPosFromCmds( vCmdPre)
EgtOutLog( ' [UL1]', 1)
end
-- porto il pezzo alla zona di rotazione con il carro Y1
local vCmd = {}
-- Commento
table.insert( vCmd, { 0, 'Unload-On-Load'})
-- posizionamento sicuro teste e rulli
if #vCmdPre > 0 then
EnsureZmax( true, vCmdPre, 2)
else
EnsureZmax( true, vCmd)
end
-- Se pinza V chiusa, la apro
if EMC.Y2DELTA then
table.insert( vCmd, { 12, 0})
end
-- riporto la trave al carico
local dRotT = UnloadOnLoadTPos + TurnerOffs
local dY1Move = dRotT + EMC.Y1DELTA
if dY1Move > MaxY1 then
local dRotTStep, dY1MoveStep = dRotT - dY1Move + MaxY1, MaxY1
if MinBeamLenUnloadInLine and EMC.LB >= MinBeamLenUnloadInLine then
table.insert( vCmd, { 2, 'Y1', dY1MoveStep, 'T', dRotTStep, 'BrakeBeam'})
-- apro la morsa
table.insert( vCmd, { 11, 0})
-- riporto il carrello in fondo alla trave
dY1MoveStep = dRotTStep + ( EMC.HCING or 0)
dY1Move = dY1MoveStep + dY1Move - MaxY1
table.insert( vCmd, { 1, 'Y1', dY1MoveStep, 'UnBrakeBeam'})
-- chiudo la morsa
table.insert( vCmd, { 11, 1})
end
end
table.insert( vCmd, { 2, 'Y1', dY1Move, 'T', dRotT, 'BrakeBeam'})
-- apro la morsa
table.insert( vCmd, { 11, 0})
EMC.CNT = nil
-- riporto il carrello in home
table.insert( vCmd, { 1, 'Y1', ParkY1, 'UnBrakeBeam'})
-- eventuale unione tabelle
if #vCmdPre > 0 then
vCmd = EgtJoinTables( vCmdPre, vCmd)
end
return vCmd
end
--------------------------------------------------------------------- ---------------------------------------------------------------------
function SpecCalcUnload() function SpecCalcUnload()
-- In caso di condizioni rispettate richiama lo scarico al carico e ritorna
local nNextPathId
local nNextMchId
local nNextDispId
if EMC.PATHID then nNextPathId = EgtGetNextActiveOperation( EMC.PATHID) end
if EMC.MCHID then nNextMchId = EgtGetNextActiveOperation( EMC.MCHID) end
if EMC.DISPID then nNextDispId = EgtGetNextActiveOperation( EMC.DISPID) end
-- se il pezzo dev'essere scaricato al carico
local dUnloadType = EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL, 'UNLOAD', 'd')
local bUnloadOnLoadPos = dUnloadType == 1 or dUnloadType == -1
if bUnloadOnLoadPos then
-- è l'ultimo path, è l'ultima lavorazione, non ci sono altre disposizioni e non c'è rimanenza
if not nNextPathId and not nNextMchId and not nNextDispId and not IsStartOrRestPhase(EMC.PHASE) then
local vCmd = SpecCalcUnloadOnLoadPos()
return vCmd
else
EMC.ERR = 21
EMC.MSG = ' Error : Unload on Load Position not reachable if raw part on Load Position'
return {}
end
end
local vCmdPre = {} local vCmdPre = {}
EgtOutLog( ' *[U]', 1) EgtOutLog( ' *[U]', 1)
if not EMC.Y1DELTA and not EMC.Y2DELTA then if not EMC.Y1DELTA and not EMC.Y2DELTA then
@@ -1297,8 +1498,11 @@ function SpecCalcUnload()
EgtOutLog( ' *[U1]', 1) EgtOutLog( ' *[U1]', 1)
end end
local vCmd = {} local vCmd = {}
-- Tipo di scarico
local bStdUl = ( not MaxUnloadLen or MaxUnloadLen < 1 or EMC.LB - EMC.HOVM < MaxUnloadLen + 1)
-- Commento -- Commento
table.insert( vCmd, { 0, 'Unloading'}) table.insert( vCmd, { 0, 'Unloading', EgtIf( bStdUl, 'Unloading', 'Manual Unloading')})
-- posizionamento sicuro teste e rulli (non serve ?) -- posizionamento sicuro teste e rulli (non serve ?)
--table.insert( vCmd, { 4, 0}) --table.insert( vCmd, { 4, 0})
-- Se pinza Y chiusa, la apro -- Se pinza Y chiusa, la apro
@@ -1306,15 +1510,43 @@ function SpecCalcUnload()
table.insert( vCmd, { 11, 0}) table.insert( vCmd, { 11, 0})
EMC.CNT = nil EMC.CNT = nil
end end
-- Sposto il pezzo in posizione di scarico -- Se non supero la lunghezza massima di scarico, sposto il pezzo in posizione di scarico
local dFinT = EgtIf( EMC.LB < MaxLenSmT, UnloadSmT, UnloadT) - EMC.LB if bStdUl then
local dFinY2 = dFinT + EMC.Y2DELTA local dFinT = EgtIf( EMC.LB < MaxLenSmT, UnloadSmT, UnloadT) - EMC.LB
table.insert( vCmd, { 2, 'T', dFinT, 'Y2', dFinY2}) local dFinY2 = dFinT + EMC.Y2DELTA
EgtOutLog( ' Y2PosF=' .. EgtNumToString( dFinY2), 1) local dBeamTailY2 = dFinY2 + ( EMC.LB - EMC.Y2DELTA) - ( EMC.TCING or 0)
-- Se scarico in linea scrivo una nota in più per l'attivazione del piano ferma pezzo (M125)
if MinBeamLenUnloadInLine and EMC.LB >= MinBeamLenUnloadInLine then
table.insert( vCmd, { 2, 'T', dFinT, 'Y2', dFinY2, 'BrakeBeam'})
else
table.insert( vCmd, { 2, 'T', dFinT, 'Y2', dFinY2})
end
EgtOutLog( ' Y2PosF=' .. EgtNumToString( dFinY2), 1)
-- Se scarico in "linea"
if MinBeamLenUnloadInLine and EMC.LB >= MinBeamLenUnloadInLine then
-- apro la morsa
table.insert( vCmd, { 12, 0})
local dY2MoveMax = MinY2
if dBeamTailY2 >= ( dY2MoveMax + ( EMC.TCING or 0)) then
local dTMove = dY2MoveMax - EMC.LB + ( EMC.TCING or 0)
-- riporto il carrello in fondo alla trave
table.insert( vCmd, { 1, 'Y2', dBeamTailY2, 'UnBrakeBeam'})
-- chiudo la morsa
table.insert( vCmd, { 12, 1})
-- finisco scarico trave
table.insert( vCmd, { 2, 'T', dTMove, 'Y2', dY2MoveMax})
EgtOutLog( ' Y2PosF=' .. EgtNumToString( dY2MoveMax), 1)
end
end
else
local dFinT = min( MaxY2 - EMC.Y2DELTA, max( UnloadT - MaxUnloadLen, MinY2 - EMC.Y2DELTA))
local dFinY2 = dFinT + EMC.Y2DELTA
table.insert( vCmd, { 2, 'T', dFinT, 'Y2', dFinY2})
end
-- apro la morsa -- apro la morsa
table.insert( vCmd, { 12, 0}) table.insert( vCmd, { 12, 0})
-- riporto il carrello in home -- riporto il carrello in home
table.insert( vCmd, { 1, 'Y2', ParkY2}) table.insert( vCmd, { 1, 'Y2', ParkY2, 'NoWaitUnload'})
-- eventuale unione tabelle -- eventuale unione tabelle
if #vCmdPre > 0 then if #vCmdPre > 0 then
@@ -1491,7 +1723,7 @@ local function PosForEnl1FY1( dY1a, dY2a, dTa, dExtra, dCorsaY1e, dCorsaY2Te)
if dDispl/2 <= dCorsaY1e then if dDispl/2 <= dCorsaY1e then
dY1a = dY1a + dDispl / 2 dY1a = dY1a + dDispl / 2
dY2a = dY2a - dDispl / 2 dY2a = dY2a - dDispl / 2
dTa = dTa - dDispl / 2 dTa = dTa - dDispl / 2
else else
dY1a = dY1a + dCorsaY1e dY1a = dY1a + dCorsaY1e
dY2a = dY2a - (dDispl - dCorsaY1e) dY2a = dY2a - (dDispl - dCorsaY1e)
@@ -1513,7 +1745,7 @@ local function PosForEnl1FY2( dY1a, dY2a, dTa, dExtra, dCorsaY1Te, dCorsaY2e)
if dDispl/2 <= dCorsaY1Te then if dDispl/2 <= dCorsaY1Te then
if dDispl/2 <= dCorsaY2e then if dDispl/2 <= dCorsaY2e then
dY1a = dY1a + dDispl / 2 dY1a = dY1a + dDispl / 2
dTa = dTa + dDispl / 2 dTa = dTa + dDispl / 2
dY2a = dY2a - dDispl / 2 dY2a = dY2a - dDispl / 2
else else
dY2a = dY2a - dCorsaY2e dY2a = dY2a - dCorsaY2e
@@ -1541,7 +1773,7 @@ local function MaxDispl( TabI, vCmd, sType)
-- allontano (Y1+T) e (Y2) -- allontano (Y1+T) e (Y2)
dY1a = MaxY1 dY1a = MaxY1
dY2a = MinY2 dY2a = MinY2
dTa = ( dY1a - TabI.dY1PosI) + dTa dTa = ( dY1a - TabI.dY1PosI) + dTa
-- **[M2]** = allontanamento dei trascinatori con Y2 in presa -- **[M2]** = allontanamento dei trascinatori con Y2 in presa
elseif sType == 'M2' then elseif sType == 'M2' then
EmitComment( vCmd, '[M2]') EmitComment( vCmd, '[M2]')
@@ -1552,7 +1784,7 @@ local function MaxDispl( TabI, vCmd, sType)
-- allontano (Y2+T) e (Y1) -- allontano (Y2+T) e (Y1)
dY1a = MaxY1 dY1a = MaxY1
dY2a = MinY2 dY2a = MinY2
dTa = ( dY2a - TabI.dY2PosI) + dTa dTa = ( dY2a - TabI.dY2PosI) + dTa
-- **[M3]** = accentramento dei trascinatori con Y1 in presa -- **[M3]** = accentramento dei trascinatori con Y1 in presa
elseif sType == 'M3' then elseif sType == 'M3' then
EmitComment( vCmd, '[M3]') EmitComment( vCmd, '[M3]')
@@ -1562,7 +1794,7 @@ local function MaxDispl( TabI, vCmd, sType)
-- accentro (Y1+T) e (Y2) -- accentro (Y1+T) e (Y2)
dY1a = TabI.MyMinY1V1 dY1a = TabI.MyMinY1V1
dY2a = TabI.MaxY2V2 dY2a = TabI.MaxY2V2
dTa = ( dY1a - TabI.dY1PosI) + dTa dTa = ( dY1a - TabI.dY1PosI) + dTa
-- **[M4]** = accentramento dei trascinatori con Y2 in presa -- **[M4]** = accentramento dei trascinatori con Y2 in presa
elseif sType == 'M4' then elseif sType == 'M4' then
EmitComment( vCmd, '[M4]') EmitComment( vCmd, '[M4]')
@@ -1573,7 +1805,7 @@ local function MaxDispl( TabI, vCmd, sType)
-- accentro (Y2+T) e (Y1) -- accentro (Y2+T) e (Y1)
dY1a = TabI.MyMinY1V1 dY1a = TabI.MyMinY1V1
dY2a = TabI.MaxY2V2 dY2a = TabI.MaxY2V2
dTa = ( dY2a - TabI.dY2PosI) + dTa dTa = ( dY2a - TabI.dY2PosI) + dTa
end end
-- --
table.insert( vCmd, { 3, 'Y1', dY1a, 'Y2', dY2a, 'T', dTa, EMC.CNT}) table.insert( vCmd, { 3, 'Y1', dY1a, 'Y2', dY2a, 'T', dTa, EMC.CNT})
@@ -1861,7 +2093,7 @@ local function PosY1Y2B( TabI, vCmd)
PosY2FromY1B( TabI, vCmd) PosY2FromY1B( TabI, vCmd)
end end
end end
bXW = false bXW = false
-- se posso posizionare 'direttamente' Y2 all'interno dell'intervallo I2 (casi [rp] o [ri]) -- se posso posizionare 'direttamente' Y2 all'interno dell'intervallo I2 (casi [rp] o [ri])
else else
-- |POSIZIONO MORSA 2| e poi MORSA 1 -- |POSIZIONO MORSA 2| e poi MORSA 1
@@ -1872,7 +2104,7 @@ local function PosY1Y2B( TabI, vCmd)
TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then
PosY2FromY1A( TabI, vCmd) PosY2FromY1A( TabI, vCmd)
PosY1FromY2B( TabI, vCmd) PosY1FromY2B( TabI, vCmd)
bXW = false bXW = false
end end
-- in **accentramento** -- in **accentramento**
else else
@@ -1881,9 +2113,9 @@ local function PosY1Y2B( TabI, vCmd)
TabI.dY1PosI <= TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then TabI.dY1PosI <= TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then
PosY2FromY1B( TabI, vCmd) PosY2FromY1B( TabI, vCmd)
PosY1FromY2B( TabI, vCmd) PosY1FromY2B( TabI, vCmd)
bXW = false bXW = false
end end
end end
end end
if bXW then if bXW then
-- Massimo trascinamento della trave in direzione positiva (casi **[xw]** ) -- Massimo trascinamento della trave in direzione positiva (casi **[xw]** )
@@ -1893,10 +2125,10 @@ local function PosY1Y2B( TabI, vCmd)
TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then TabI.dY1PosI < TabI.dTPosI + EMC.LB - MinJoin - EgtIf( SPLIT, EMC.TCING, 0) + 10 * GEO.EPS_SMALL then
-- allontanamento morse, trascinamento trave con Y1 -- allontanamento morse, trascinamento trave con Y1
MaxDispl( TabI, vCmd, 'M1') MaxDispl( TabI, vCmd, 'M1')
else else
-- accentramento morse, trascinamento trave con Y2 -- accentramento morse, trascinamento trave con Y2
MaxDispl( TabI, vCmd, 'M4') MaxDispl( TabI, vCmd, 'M4')
end end
end end
nCnt = nCnt + 1 nCnt = nCnt + 1
if nCnt > 10 then return end if nCnt > 10 then return end
@@ -2436,14 +2668,17 @@ function SpecOutputCmds( vCmd, bEnd)
-- commento -- commento
if Cmd[1] == 0 then if Cmd[1] == 0 then
local sInfo = '0,'..Cmd[2] local sInfo = '0,'..Cmd[2]
if Cmd[3] then
sInfo = sInfo..','..Cmd[3]
end
EgtSetInfo( EMC.PATHID, sKey, sInfo) EgtSetInfo( EMC.PATHID, sKey, sInfo)
-- movimento di 1 asse -- movimento di 1 asse
elseif Cmd[1] == 1 then elseif Cmd[1] == 1 then
local sInfo = '1,'..Cmd[2]..','..EgtNumToString( Cmd[3],3)..EgtIf( Cmd[4], ',*', '') local sInfo = '1,'..Cmd[2]..','..EgtNumToString( Cmd[3],3)..EgtIf( Cmd[4], ','..tostring(Cmd[4]), '')
EgtSetInfo( EMC.PATHID, sKey, sInfo) EgtSetInfo( EMC.PATHID, sKey, sInfo)
-- movimento di 2 assi -- movimento di 2 assi
elseif Cmd[1] == 2 then elseif Cmd[1] == 2 then
local sInfo = '2,'..Cmd[2]..','..EgtNumToString( Cmd[3],3)..','..Cmd[4]..','..EgtNumToString( Cmd[5],3)..EgtIf( Cmd[6], ',*', '') local sInfo = '2,'..Cmd[2]..','..EgtNumToString( Cmd[3],3)..','..Cmd[4]..','..EgtNumToString( Cmd[5],3)..EgtIf( Cmd[6], ','..tostring(Cmd[6]), '')
EgtSetInfo( EMC.PATHID, sKey, sInfo) EgtSetInfo( EMC.PATHID, sKey, sInfo)
-- movimento di 3 assi -- movimento di 3 assi
elseif Cmd[1] == 3 then elseif Cmd[1] == 3 then
+133
View File
@@ -1,5 +1,138 @@
==== Common_PF1250 Update Log ==== ==== Common_PF1250 Update Log ====
Versione 3.1-- (--/--/2026)
- (GEN) In caso di ultimo movimento come scarico rimanenza, porta V2 in posizione di parcheggio. Ticket#3006
Versione 3.1e2 (15/05/2026)
- (SIM-GEN) Corretta gestione scarico manuale ( errore in versione 3.1e1)
Versione 3.1e1 (12/05/2026)
- (SIM-GEN) Corretta SIM (muoveva Y2 a MaxY2 senza aprire pinza) e GEN (non chiudeva rulliere e dava extracorsa e non generava P7=-85) di pezzi lunghi che necessitano lo scarico manuale. Ticket#2971
Versione 3.1c1
- (SIM-GEN) Corretto calcolo rimanenza durante ParkRoller. Ticket#2832
- (SIM) Corretto caricamento geometrie di collisioni. Modificato indice di collisione per una migliore gestione. ATT: MIN_MACH -> 3.1b2
- (SIM-GEN) Aggiunta OnSpecialApplyMachining per calcolare i carrelli da subito
- Aggiungendo OnSpecialApplyMachining, ora la OnSpecialGetPrevMachiningOffset lavora correttamente. Ticket#2798
- (SIM-GEN) Solo se dY1DeltaMaxSP > WorkTab.dY1DeltaMinF lo prende in considerazione per il valore di WorkTab.dY1DeltaMaxF Ticket#2798
Versione 3.1b1 (17/02/2026)
- (GEN) Generazione non allineata a simulazione. Ticket#2819
Versione 3.1a2 (30/01/2026)
- (SIM) Allineato approccio simulazione a generazione in caso di lavorazione in doppio verticale. Ticket#2781
- (GEN) Simulazione non allineata a generazione. Mancava reset flag di pezzo a caduta. Ticket#2798
Versione 3.1a1 (16/01/2026)
- (SIM-GEN) Corretto movimento di approccio con sega a catena e allineati Simulazione e Generazione. Ticket#2771
Versione 2.7l1 (18/12/2025)
- (SIM-GEN) Aggiunto controllo post movimenti ausiliari dell' EMC.PREVOFFSX nella funzione OnSpecialGetPrevMachiningOffset() come su ONE-PF. Ticket#2727
- (SIM-GEN) Cambiato delta di correzione Z per lama con inclinazione >= 81° da 70 a 60 mm. Risoluzione Ticket#2210
- (SIM-GEN) Divisione movimento B in approccio se > 90°.
Versione 2.7k5 (26/11/2025)
- (SIM) Migliorata funzione CheckClamping, ora il controllo di warning si basa sulla somma delle lunghezze delle aree pinzate
Versione 2.7k4 (25/11/2025)
- (SIM) Migliorata funzione CheckClamping, ora la sezione rientra di 3 mm
Versione 2.7k3 (21/11/2025)
- (SIM-GEN) Corretto problema riposizionamento carrelli. Ticket#2704
- (SIM) Aggiornata risoluzione VMillTol in funzione dello spessore lama
Versione 2.7k2 (19/11/2025)
- (SIM-GEN) Con testa H38 si va in home quando testa viene comandata a Zmassima. Ticket#2703_b
Versione 2.7k1 (19/11/2025)
- (GEN) Preselzione testa 1 spostata prima della selezione testa 3. Ticket#2513
- (SIM-GEN) Corretto calcolo per decidere se serve aprire i rulli
- (SIM) Aggiunto controllo Extra-Corsa testa 2 in caso di lavorazione in doppio. Ticket#2201
- (SIM) Prima versione controllo pinzaggio su VMILL. Per attivarlo serve modifica della macchina a MLDE e NGE.
- (GEN) Simulazione non allineata a generazione. Se testa H38 e si chiudono i rulli, si deve andare in home. Ticket#2703
Versione 2.7i1 (08/09/2025)
- (GEN) Se fase start o restart, si aggiorna la posizione in X dell'asse per calcolare il link corretto. Serve CAM5 2.7h1 (facoltativo)
- (EST) La stima tempi considera ora le accelerazoni degli assi
- (SIM) Corretto controllo ultimo utensile utilizzato su testa 1, prima si controllava il precedente, ma poteva essere la testa 2
- (SIM-GEN) Se testa 3 deve salire a ZMAX, sale alla X dove si trova e non torna in home
Versione 2.7h2 (21/08/2025)
- (GEN) Se la testa rimane bassa, corretto caso di reset del piano generico a fine lavorazione
- (GEN) Corretto movimento in Z massima dopo scarico pezzo
Versione 2.7h1 (20/08/2025)
- (GEN) Per posizione T111 e T121, se non è presente asse rotante per presa aggregato (es. se si mette una fresa normale) viene settato a zero.
- (MLDE-SIM) Aggiunta variabile FACOLTATIVA 'EstimationRapidMultiplier' in mlde per regolare il tempo stimato di rapido su macchine vecchie. Se non presente default 1.
Versione 2.7g1 (01/07/2025)
- (GEN) Lettura parametri accelerazioni da TS3. Ticket#2052
- (SIM-GEN) Aggiunta gestione massima lunghezza scarico
Versione 2.7d2 (24/04/2025)
- (SIM) Modifica qualità VMILL. Da ora si può impostare da impostazioni CAM5
Versione 2.7d1 (01/04/2025)
- (GEN) Aggiunta commenti HEADER e FOOTER per comunicazione con linea o altre macchine, da parte di Essetre.
Versione 2.7b5 (26/02/2025)
- (MLDE-GEN) Gestione lettura feed massima pinze da Ts3.
Versione 2.7b4 (21/02/2025)
- (SIM-GEN) Ripristinato comportamento precedente calcolo posizione dei rulli di pinzaggio fatto con 2.7b2.
- (MLDE-SIM) Gestione aggregato flottante. Serve modifica MLDE. Ticket#2297
Versione 2.7b3 (06/02/2025)
- (SIM) Dopo aver scaricato utensile, si setta nota "HIDDEN" per dichiarare utensile non più sulla testa e non considerare le collisioni.
Versione 2.7b2 (04/02/2025)
- (SIM-GEN) Piccola modifica nel calcolo posizione dei rulli di pinzaggio.
Versione 2.7b1 (03/02/2025)
- (SIM) Corretta simulazione che non mandava testa in home in caso di utensile lungo. Generazione era già ok. Ticket#2280
Versione 2.7a2 (28/01/2025)
- (SIM-GEN) In MLSE aggiunta piccola correzione quota Z in caso di direzione Z tra 0.5 e 0.707.
Versione 2.7a1 (17/01/2025)
- (GEN) Piccola correzione posizione X in preselezione utensile
- (GEN) Corretto primo punto X preselezione utensile. Ticket#2183 e #2250
Versione 2.6l7 (19/12/2024)
- (SIM) HOTFIX : corretto posizione Z zero alla selezione dell'utensile in caso di motosega. Ticket#2235
Versione 2.6l6 (18/12/2024)
- (MLDE-SIM-GEN) Aggiunta variabile 'SafeX2RotAxis' in sostituzione della 'ParkMchY2' che era usata impropriamente
Versione 2.6l5 (17/12/2024)
- (SIM) Corretta posizione iniziale testa 2. Ticket#2228
Versione 2.6l4 (16/12/2024)
- (SIM-GEN) In MLSE ripristinati vecchi valori indici calcolo Z massima. In alcuni casi peggioravano la situazione.
Versione 2.6l3 (16/12/2024)
- (SIM) Corretto scarico utensile se aggregato. Se non presente utensile di default, non seleziona nulla.
- (SIM-GEN) In MLSE ritoccati indici calcolo Z massima. Ticket#2210
Versione 2.6l2 (13/12/2024)
- (SIM) Corretta chiamata calcolo asse virtuale
Versione 2.6l1 (13/12/2024)
- (SIM) Gestione caricamento utensili in caso di testa con uscita multipla.
- (SIM) Corretto errore di collisione per errata simulazione cambio utensile da lama a motosega.
- (SIM-GEN) Corretta gestione in caso di prima lavorazione con motosega.
- (GEN) Non si fa preselezione della testa 3
- (GEN) Corretta emissione coordinata rotazione testa 3 in zona sicura
- (SIM-GEN) A fine barra, testa 3 sempre in home
- (GEN) Controllo esistenza terzo asse ausiliario
- (GEN) Corretto primo movimento in X quando si parte con testa 3. Ticket#2216
- (GEN) Se su testa 1 c'è un aggregato e si utilizzerà la testa 3, si scarica aggregato e si prende utensile di default. Ticket#2222
- (GEN) Durante utilizzo della testa 3, non si preselezionano altre teste. Ticket#2220
- (SIM-GEN) Se lavorazione con testa dedicata lama e su testa 1 c'era aggregato, viene scaricato. Ticket#2216
Versione 2.6k3 (26/11/2024)
- (GEN) Corretta modifica fatta in versione 2.6k2. Ticket#2183
Versione 2.6k2 (25/11/2024) Versione 2.6k2 (25/11/2024)
- (GEN) Se si preseleziona su testa 1 un utensile lungo, non si va alla X successiva di lavoro ma si resta in home. Infatti potrebbe toccare le paratie in caso di scambio pezzo. Ticket#2183 - (GEN) Se si preseleziona su testa 1 un utensile lungo, non si va alla X successiva di lavoro ma si resta in home. Infatti potrebbe toccare le paratie in caso di scambio pezzo. Ticket#2183
+2 -2
View File
@@ -3,8 +3,8 @@
local InfoCommon_STD_PP = { local InfoCommon_STD_PP = {
NAME = 'Common_PF1250', -- nome script PP standard NAME = 'Common_PF1250', -- nome script PP standard
VERSION = '2.6k2', -- versione script VERSION = '3.1--', -- versione script
MIN_MACH_VER_PP_COMMON = '2.5k1' -- versione minima kernel MIN_MACH_VER_PP_COMMON = '3.1b2' -- versione minima kernel
} }
return InfoCommon_STD_PP return InfoCommon_STD_PP