Compare commits
209 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d8cd917aaf | |||
| ba63901305 | |||
| 507e75121f | |||
| 6d937b7e88 | |||
| 656982ca9c | |||
| d3c62ee5a9 | |||
| 89e2c495d1 | |||
| a58ed6015f | |||
| f4f94827d5 | |||
| 948df5b056 | |||
| 16510ed17f | |||
| 27bb16b3b7 | |||
| 43166831e8 | |||
| c509cefe08 | |||
| c520f90a5b | |||
| 35d573cc20 | |||
| 69054d2c90 | |||
| cddc5abcc1 | |||
| 0324b24222 | |||
| a845258a81 | |||
| 5486fab487 | |||
| d2f093772d | |||
| a362c59c6f | |||
| 69de0b9cc5 | |||
| dc14d46bbc | |||
| c4270df480 | |||
| 096d04f640 | |||
| 2d8d5a38a6 | |||
| 4fcf50951b | |||
| 4b2827f2cd | |||
| 29dddf0d52 | |||
| 45148ee0c5 | |||
| bc7fa48823 | |||
| 05ebbc9221 | |||
| ae772c6f74 | |||
| 164ad6fca4 | |||
| a97c8673f4 | |||
| a909f2460c | |||
| ff8044959a | |||
| 4454b1f069 | |||
| 00b67bd918 | |||
| b00d600839 | |||
| aad4c3cfd7 | |||
| c26ba36f6d | |||
| ba2f6b46f3 | |||
| bc541ddd24 | |||
| a64e4bd840 | |||
| 30b8fc08bd | |||
| bbfff9f9c2 | |||
| 12ffc06055 | |||
| 34f5f655d1 | |||
| e08d54b436 | |||
| e2bf7b4cd1 | |||
| 7d5eb3ab3e | |||
| 74a79b9767 | |||
| d82e8876d0 | |||
| bea64cd05f | |||
| 0ebd4ca860 | |||
| 36d6ad355f | |||
| eac1d9b636 | |||
| e38c1d5c02 | |||
| ca08fa89b3 | |||
| 61b81d07e0 | |||
| 7c32cf62c7 | |||
| 9af3f82691 | |||
| 87b6fad2d9 | |||
| ea0abe4368 | |||
| eca719326b | |||
| 39d4b1053f | |||
| 898df3626f | |||
| 7caf93246b | |||
| 110b9f66cf | |||
| 8fd55f9c29 | |||
| e6e1863ed9 | |||
| 4ae1f93e9e | |||
| 1260407fec | |||
| 6cabd0eb44 | |||
| 8561a31e3e | |||
| ab037d28c2 | |||
| 66070d5572 | |||
| 3ff5eff1c4 | |||
| 44c99bb9c0 | |||
| a20def92b8 | |||
| d53ee46d01 | |||
| a4428dfc7e | |||
| dee48eaa84 | |||
| 0c98a3b342 | |||
| 4663adcc5c | |||
| dace2e7321 | |||
| c7c9d4be20 | |||
| 632c28c667 | |||
| feb0f12b61 | |||
| e6fb6380cb | |||
| f7c241163c | |||
| e42381e231 | |||
| 5636d35be5 | |||
| 562416f232 | |||
| 5a584431cb | |||
| 07a004f18d | |||
| c332eccef2 | |||
| cdcfb0b053 | |||
| 09efa2d462 | |||
| 6a0d00e10b | |||
| 4d773f5bfa | |||
| cb0c293fd7 | |||
| b4235bcc9b | |||
| c5e0c1124d | |||
| 52e9ec6286 | |||
| 36f393ab79 | |||
| ad8091e168 | |||
| d738334a57 | |||
| 3100e615f7 | |||
| a6d54ac40d | |||
| 785e4490ea | |||
| 3bf7c1587f | |||
| 971fcc0c07 | |||
| db7cb8c1b1 | |||
| a71ba0ee9a | |||
| 7b2f9815d4 | |||
| 80fdaf23f4 | |||
| b832df5767 | |||
| 2b167ea927 | |||
| deaac78103 | |||
| 5f95d9821e | |||
| 8d7a29dd38 | |||
| 793fe00cc9 | |||
| e3107c9c30 | |||
| 33e5254ba4 | |||
| 3aceb8783d | |||
| dabb95858e | |||
| 636ce9eb01 | |||
| 306bef076c | |||
| 9499cdb2c4 | |||
| a14a637ec1 | |||
| b1486a762e | |||
| 0ce94917c4 | |||
| 3149c70b9c | |||
| 6ad6bc5e7f | |||
| 3757642127 | |||
| a133ab3514 | |||
| 910ad63d34 | |||
| 3b7ac164a1 | |||
| daf84e06b3 | |||
| ff1c51f68b | |||
| f164c8a046 | |||
| d1f5219be9 | |||
| e08a18811f | |||
| 758082ad22 | |||
| 745e6092b7 | |||
| 10db138855 | |||
| c2177f36bf | |||
| 76f6ed3346 | |||
| a89bf46837 | |||
| 688ec6e221 | |||
| 13a69fea58 | |||
| 75355f60f1 | |||
| 7922a3bb17 | |||
| 46665cf1fc | |||
| f50132446b | |||
| be5d362383 | |||
| 2acf712f28 | |||
| c7e7afd93a | |||
| 6cf09ac6a5 | |||
| 6a68e0484a | |||
| 37952d64d4 | |||
| ab82e63af3 | |||
| ed92ae901e | |||
| a3c8c97c56 | |||
| 0a792883ad | |||
| 548fdb7647 | |||
| 54b3402785 | |||
| cca7f64f51 | |||
| 391e33d176 | |||
| 5aae40068c | |||
| 0cf16eae0e | |||
| 63916ec50f | |||
| d53ebb1da6 | |||
| 51924f71ea | |||
| 2a44fc8635 | |||
| 5e7c3d7681 | |||
| 3f4feabbd9 | |||
| 90d7c59e97 | |||
| 2b3d65fd56 | |||
| 0ea9ef4266 | |||
| 2510bf8379 | |||
| 6c6e883a4c | |||
| 2be44e3499 | |||
| db4f901e2b | |||
| 99300bbb53 | |||
| a9134f502d | |||
| d226d1a5c1 | |||
| 5ea1bd718d | |||
| 5146f304b6 | |||
| 313a621eab | |||
| 34d1b6ea9c | |||
| 5c55da537e | |||
| 123c1d57fa | |||
| 6f52a41cb0 | |||
| cb1f97ba3b | |||
| b660adc8e8 | |||
| f0b2ce3720 | |||
| 975bc40d2b | |||
| 01105a8c6a | |||
| 3c1a1e5407 | |||
| e5ae54cc98 | |||
| 09e2dd991d | |||
| 66c94aece6 | |||
| 9f2e302d32 | |||
| a1f053e1d8 |
@@ -1,6 +1,7 @@
|
||||
/Tools
|
||||
/Machinings
|
||||
/SetUp
|
||||
/Beam/AISetup
|
||||
/Beam/Ts3Data.bak
|
||||
/Beam/CutData.lua
|
||||
/Beam/DrillData.lua
|
||||
|
||||
+318
@@ -0,0 +1,318 @@
|
||||
variables:
|
||||
VERS_MAIN: '1.0'
|
||||
MACH_NAME: ''
|
||||
MACH_NAME_TEST: ''
|
||||
MANUFACTURER: ''
|
||||
NEW_REL: ''
|
||||
NET_SHARE_X: '\\10.74.82.201\EgwTech'
|
||||
NET_SHARE_Z: '\\10.74.82.201\Artifacts'
|
||||
NET_SHARE_S: '\\10.74.82.201\Scambio'
|
||||
NET_SHARE_R: '\\10.74.82.201\EgwTech'
|
||||
NET_SHARE_H: '\\10.74.82.252\team drives'
|
||||
NET_USERQ: 'steamw\egalware'
|
||||
NET_USER_SERVICES: 'steamw\services'
|
||||
MACH_VERS: '0.0.0.0'
|
||||
TEMP_PATH: 'C:\MachinesDeploy'
|
||||
MACHINES_PATH_R: 'R:\EgtData\Machines_GIT'
|
||||
DEST_MACHINES_PATH_H: 'H:'
|
||||
SRC_PATH: ''
|
||||
BASE_PATH: ''
|
||||
TEST_PATH: ''
|
||||
URL_VERSIONS_LOG: "https://liman.egalware.com/ELM.API/api/release/save"
|
||||
MACH_VERS_NUM: '0.0.0.0'
|
||||
CRITICAL_STRING: "#critical#"
|
||||
TOOLS_MACHINE_PATH: ""
|
||||
|
||||
|
||||
#Note compilazione LUA:
|
||||
# lua54 -o bin\$FileName -s $FileName: -o = output, -s = NON include i debug symbols
|
||||
|
||||
# helper copia script verso cartella di rete S:\ delle cartelle bin
|
||||
.ReplicaS: &ReplicaS
|
||||
- |
|
||||
net use S: /delete
|
||||
SLEEP 2
|
||||
net use S: $env:NET_SHARE_S /u:$env:NET_USERQ $SDRIVE_PASSWD
|
||||
ROBOCOPY /MIR $env:BASE_PATH S:\LucaM\MachinesDeploy\$env:MACH_NAME\$env:MACH_VERS\ /XD "bin" /XD "$env:MACH_NAME_TEST"
|
||||
SLEEP 2
|
||||
net use S: /delete
|
||||
|
||||
# helper copia script verso cartella di rete R:\
|
||||
.ReplicaR: &ReplicaR
|
||||
- |
|
||||
net use R: /delete
|
||||
SLEEP 2
|
||||
net use R: $env:NET_SHARE_R /u:$env:NET_USERQ $ZDRIVE_PASSWD
|
||||
echo "-----------------------"
|
||||
echo " Copia macchina su R"
|
||||
echo "-----------------------"
|
||||
$customerPathR = $env:MACHINES_PATH_R + "\" + $env:MANUFACTURER
|
||||
ROBOCOPY /MIR "$env:SRC_PATH" "$customerPathR\$env:MACH_NAME\" /XD "bin"
|
||||
ROBOCOPY "$env:TEST_PATH" "$customerPathR\_TestMachines\$env:MACH_NAME_TEST\" /E /XD "bin"
|
||||
ROBOCOPY /MIR "$env:BASE_PATH" "$customerPathR\_Deploy\$env:MACH_NAME\$env:MACH_VERS\" /XD "bin" /XD "$env:MACH_NAME_TEST"
|
||||
SLEEP 2
|
||||
net use R: /delete
|
||||
|
||||
# helper copia script verso drive condiviso
|
||||
.ReplicaStor01: &ReplicaStor01
|
||||
- |
|
||||
net use H: /delete
|
||||
SLEEP 2
|
||||
net use H: $env:NET_SHARE_H /u:$env:NET_USER_SERVICES $SRVCS_PASSWD
|
||||
echo "-----------------------"
|
||||
echo " Copia macchina su stor01"
|
||||
echo "-----------------------"
|
||||
SLEEP 2
|
||||
$customerPathH = $env:DEST_MACHINES_PATH_H + "\" + $env:MANUFACTURER + "\test"
|
||||
$destinationPath = "$customerPathH\$env:MACH_NAME" + "\"
|
||||
ROBOCOPY "$env:BASE_PATH" "$destinationPath\" *.zip
|
||||
SLEEP 2
|
||||
net use H: /delete
|
||||
|
||||
# helper copia script verso cartella di rete R:\ per develop
|
||||
.ReplicaR_DEV: &ReplicaR_DEV
|
||||
- |
|
||||
net use R: /delete
|
||||
SLEEP 2
|
||||
net use R: $env:NET_SHARE_R /u:$env:NET_USERQ $ZDRIVE_PASSWD
|
||||
echo "-----------------------"
|
||||
echo " Copia macchina su R - DEV"
|
||||
echo "-----------------------"
|
||||
$customerPathR = $env:MACHINES_PATH_R + "\" + $env:MANUFACTURER
|
||||
ROBOCOPY /MIR "$env:BASE_PATH" "$customerPathR\_Deploy\$env:MACH_NAME\_DEV\$env:MACH_VERS\" /XD "bin" /XD "$env:MACH_NAME_TEST"
|
||||
SLEEP 2
|
||||
net use R: /delete
|
||||
|
||||
#helper copia sorgenti da R a percorso temporaneo
|
||||
.CreateBaseFolder: &CreateBaseFolder
|
||||
- |
|
||||
net use R: /delete
|
||||
SLEEP 2
|
||||
net use R: $env:NET_SHARE_R /u:$env:NET_USERQ $ZDRIVE_PASSWD
|
||||
echo "-----------------------"
|
||||
echo " Recupero file non git da R e copia su macchina virtuale"
|
||||
echo "-----------------------"
|
||||
# test se la cartella con gli utensili esiste per questa macchina
|
||||
if (!(Test-Path -Path $env:TOOLS_MACHINE_PATH)) {
|
||||
echo "-----------------------"
|
||||
echo "CANNOT FIND TOOLS FOR THIS MACHINE!!"
|
||||
echo "-----------------------"
|
||||
Exit 1}
|
||||
ROBOCOPY "$env:TOOLS_MACHINE_PATH" "$env:SRC_PATH" /E /XF "*.bat" /XF "*.yml" /XF ".gitignore" /XD ".git" /XF "UpdateLog.txt" /XD ".vscode"
|
||||
ROBOCOPY "$env:TOOLS_MACHINE_PATH" "$env:TEST_PATH" /E /XF "*.bat" /XF "*.yml" /XF ".gitignore" /XD ".git" /XF "UpdateLog.txt" /XD ".vscode"
|
||||
ROBOCOPY "$env:TOOLS_MACHINE_PATH" "$env:SRC_PATH\bin\$env:MACH_NAME\" /E /XF "*.bat" /XF "*.yml" /XF ".gitignore" /XD ".git" /XF "UpdateLog.txt" /XD ".vscode"
|
||||
SLEEP 2
|
||||
net use R: /delete
|
||||
|
||||
# helper compilazione LUA a 32 e 64 bit
|
||||
.LuaCompile: &LuaCompile
|
||||
- |
|
||||
Set-Alias lua54 C:\Tools\Lua32\luac54
|
||||
echo "-----------------------"
|
||||
echo " Copia file su macchina virtuale"
|
||||
echo "-----------------------"
|
||||
ROBOCOPY . "$env:SRC_PATH" /E /XF "*.bat" /XF "*.yml" /XF ".gitignore" /XD ".git" /XF "UpdateLog.txt" /XD ".vscode"
|
||||
ROBOCOPY . "$env:TEST_PATH" /E /XF "*.bat" /XF "*.yml" /XF ".gitignore" /XD ".git" /XF "UpdateLog.txt" /XD ".vscode"
|
||||
Rename-Item -Path "$env:TEST_PATH\$env:MACH_NAME.mlde" -NewName "$env:MACH_NAME_TEST.mlde"
|
||||
Rename-Item -Path "$env:TEST_PATH\$env:MACH_NAME.ini" -NewName "$env:MACH_NAME_TEST.ini"
|
||||
ROBOCOPY . "$env:SRC_PATH\bin\$env:MACH_NAME\" /E /XF "*.bat" /XF "*.yml" /XF ".gitignore" /XD ".git" /XF "UpdateLog.txt" /XD ".vscode"
|
||||
echo "-----------------------"
|
||||
echo " Compilazione file *.lua 32/64bit"
|
||||
echo "-----------------------"
|
||||
$FileList = Get-ChildItem * -Include( "*.mlpe", "*.mlse")
|
||||
ForEach ($File in $FileList) {
|
||||
$FileName = Split-Path $File -leaf
|
||||
lua54 -o $env:SRC_PATH\bin\$env:MACH_NAME\$FileName -s $FileName
|
||||
echo "lua54 -o bin\$FileName -s $FileName"
|
||||
}
|
||||
|
||||
# helper recupero nome macchina e costruttore
|
||||
.machName-fix: &machName-fix
|
||||
- |
|
||||
echo "-----------------------"
|
||||
echo " Recupero nome macchina e costruttore"
|
||||
echo "-----------------------"
|
||||
$fileName = dir *.mlde
|
||||
$env:MACH_NAME = $fileName.BaseName
|
||||
$env:MACH_NAME_TEST = $env:MACH_NAME + ".TEST"
|
||||
$comp = $fileName.BaseName -split "-"
|
||||
$env:MANUFACTURER = $comp[0]
|
||||
Write-Output $env:MANUFACTURER
|
||||
|
||||
# helper calcolo versione
|
||||
.version-fix: &version-fix
|
||||
- |
|
||||
echo "-----------------------"
|
||||
echo " Calcolo versione"
|
||||
echo "-----------------------"
|
||||
|
||||
# calcolo versione formato stringa
|
||||
$fPath = "$env:MACH_NAME.mlde";
|
||||
$vLine = Select-String -path $fPath -Pattern '^PP_VER';
|
||||
$comp = $vLine -split "=";
|
||||
$env:MACH_VERS = $comp[1].Replace("'","").Trim()
|
||||
# display versione formato stringa
|
||||
Write-Output $env:MACH_VERS
|
||||
|
||||
# calcolo versione formato numerico
|
||||
$fPath = "$env:MACH_NAME.mlde";
|
||||
$vLine = Select-String -path $fPath -Pattern '^PP_NVER';
|
||||
$comp = $vLine -split "=";
|
||||
$env:MACH_VERS_NUM = $comp[1].Replace("'","").Trim()
|
||||
# display versione formato numerico
|
||||
Write-Output $env:MACH_VERS_NUM
|
||||
|
||||
# helper calcolo versione se develop
|
||||
.version-fix_DEV: &version-fix_DEV
|
||||
- |
|
||||
echo "-----------------------"
|
||||
echo " Calcolo versione - DEV"
|
||||
echo "-----------------------"
|
||||
$commitAuthor = $CI_COMMIT_AUTHOR -split " "
|
||||
$commitAuthor = $commitAuthor[0].Trim()
|
||||
$env:MACH_VERS = $commitAuthor
|
||||
# display versione
|
||||
Write-Output $env:MACH_VERS
|
||||
|
||||
# helper creazione folders
|
||||
.folder-fix: &folder-fix
|
||||
- |
|
||||
echo "-----------------------"
|
||||
echo " Creazione cartelle su macchina virtuale"
|
||||
echo "-----------------------"
|
||||
$env:TOOLS_MACHINE_PATH = "$env:MACHINES_PATH_R\$env:MANUFACTURER\_DefaultMachineSetup\$env:MACH_NAME"
|
||||
Write-Output $env:TOOLS_MACHINE_PATH
|
||||
$env:SRC_PATH = "$env:TEMP_PATH\$env:MACH_NAME\$env:MACH_VERS\$env:MACH_NAME";
|
||||
$env:BASE_PATH = "$env:TEMP_PATH\$env:MACH_NAME\$env:MACH_VERS";
|
||||
$env:TEST_PATH = "$env:TEMP_PATH\$env:MACH_NAME\$env:MACH_VERS\$env:MACH_NAME_TEST";
|
||||
Write-Output $env:BASE_PATH;
|
||||
if (Test-Path $env:BASE_PATH) { Remove-Item -Path "$env:BASE_PATH\*" -R -Force };
|
||||
Write-Output $env:TEST_PATH;
|
||||
|
||||
# helper compressione e pulizia folders
|
||||
.ZipClean: &ZipClean
|
||||
- |
|
||||
" Compressione file su macchina virtuale"
|
||||
$7zipPath = $env:ProgramFiles+"\7-Zip\7z.exe";
|
||||
if (-not (Test-Path -Path $7zipPath -PathType Leaf)) {
|
||||
throw "7 zip file '$7zipPath' not found"
|
||||
}
|
||||
Set-Alias 7zip $7zipPath
|
||||
$Target = "$env:BASE_PATH\$env:MACH_NAME.zip"
|
||||
cd "$env:SRC_PATH\bin\"
|
||||
$Source = "*"
|
||||
7zip a -tzip $Target $Source
|
||||
Write-Output "called ZIP $Source --> $Target"
|
||||
|
||||
# helper invio notifica a log versioni online (LiMan)
|
||||
.SendToVersionsLog: &SendToVersionsLog
|
||||
- |
|
||||
echo "-----------------------"
|
||||
echo " Invio versione a log online"
|
||||
echo "-----------------------"
|
||||
$tags = ""
|
||||
$date = ""
|
||||
# se critico scrive tag
|
||||
if ( $CI_COMMIT_MESSAGE | Select-String -Pattern $env:CRITICAL_STRING) {
|
||||
$tags = "CRITICAL"
|
||||
$date = (Get-Date).AddDays(1).toString("yyyy-MM-ddTHH:mm:ss.fffZ")
|
||||
}
|
||||
else
|
||||
{
|
||||
$date = (Get-Date).AddDays(3).toString("yyyy-MM-ddTHH:mm:ss.fffZ")
|
||||
}
|
||||
$body =
|
||||
@{
|
||||
codInst = "EgalWare"
|
||||
codApp = $env:MACH_NAME
|
||||
uplAppId = "UpdateManager"
|
||||
masterKey = $LiMan_Key
|
||||
tipo = "Machine"
|
||||
versNum = $env:MACH_VERS_NUM
|
||||
versText = $env:MACH_VERS
|
||||
releaseDate = $date
|
||||
relTags = $tags
|
||||
}
|
||||
$jsonBody = ConvertTo-Json -InputObject $body
|
||||
echo $jsonBody
|
||||
Invoke-WebRequest -Method Post -URI $env:URL_VERSIONS_LOG -ContentType "application/json" -Body $jsonBody -UseBasicParsing
|
||||
|
||||
|
||||
# helper esecuzione test
|
||||
.RunTest: &RunTest
|
||||
- |
|
||||
Write-Output "Test done!"
|
||||
|
||||
|
||||
stages:
|
||||
- build
|
||||
# - test
|
||||
# - deploy
|
||||
|
||||
LuaCompile:build:
|
||||
stage: build
|
||||
only:
|
||||
- main
|
||||
- master
|
||||
tags:
|
||||
- win
|
||||
before_script:
|
||||
- *machName-fix
|
||||
- *version-fix
|
||||
- *folder-fix
|
||||
script:
|
||||
- *CreateBaseFolder
|
||||
- *LuaCompile
|
||||
- *ZipClean
|
||||
- *ReplicaR
|
||||
- *ReplicaStor01
|
||||
- *SendToVersionsLog
|
||||
|
||||
LuaCompileDev:build:
|
||||
stage: build
|
||||
only:
|
||||
- develop
|
||||
tags:
|
||||
- win
|
||||
before_script:
|
||||
- *machName-fix
|
||||
- *version-fix_DEV
|
||||
- *folder-fix
|
||||
script:
|
||||
- *CreateBaseFolder
|
||||
- *LuaCompile
|
||||
- *ZipClean
|
||||
- *ReplicaR_DEV
|
||||
|
||||
# LuaCompile:test:
|
||||
# stage: test
|
||||
# needs: ["LuaCompile:build"]
|
||||
# only:
|
||||
# - main
|
||||
# - master
|
||||
# - develop
|
||||
# tags:
|
||||
# - win
|
||||
# before_script:
|
||||
# - *version-fix
|
||||
# - *folder-fix
|
||||
# script:
|
||||
# - *LuaCompile
|
||||
# - *RunTest
|
||||
|
||||
# LuaCompile:deploy:
|
||||
# stage: deploy
|
||||
# needs: ["LuaCompile:test"]
|
||||
# only:
|
||||
# - main
|
||||
# - master
|
||||
# tags:
|
||||
# - win
|
||||
# before_script:
|
||||
# - *version-fix
|
||||
# - *folder-fix
|
||||
# script:
|
||||
# - *LuaCompile
|
||||
# - *ZipClean
|
||||
# - *ReplicaR
|
||||
|
||||
+226
-15
@@ -8,6 +8,9 @@ local BeamData = {
|
||||
GO_FAST = 0, -- flag abilitazione modalità veloce (0=no, 1=carrelli, 2=anche cambio utensili)
|
||||
RIGHT_LOAD = false, -- flag carico da destra
|
||||
ROT90 = false, -- flag abilitazione rotazione 90 gradi
|
||||
ROT180 = true, -- flag abilitazione rotazione 180 gradi
|
||||
NEWCLAMPING = true, -- flag abilitazione nuovo metodo riposizionamento carrelli
|
||||
FASTCLAMPING= false, -- flag abilitazione riduzione numero riposizionamenti al carico e durante grande trascinamento
|
||||
MIN_WIDTH = 40, -- larghezza minima del grezzo
|
||||
MIN_HEIGHT = 40, -- altezza minima del grezzo
|
||||
MAX_WIDTH = 240, -- larghezza massima del grezzo
|
||||
@@ -39,6 +42,7 @@ local BeamData = {
|
||||
DRILL_VZ_MIN = -0.51, -- componente limite in Z del versore di un foro
|
||||
DRILL_VX_MAX = 0.867, -- componente limite in X del versore di un foro sulle facce laterali
|
||||
DRILL_OVERLAP = 5, -- sovrapposizione tra due mezze forature
|
||||
MAX_ANGLE_DRILL_CUT = 10, -- angolo massimo tra la foratura e il taglio che la attraversa
|
||||
MILL_OVERLAP = 5, -- sovrapposizione tra due mezze fresature
|
||||
MAX_DIST_HTFEA = 50.0, -- massima distanza di feature da testa o coda per essere considerata tale
|
||||
MAX_LEN_HTFEA = 2000.0, -- massima lunghezza di feature di testa o coda
|
||||
@@ -68,7 +72,14 @@ local BeamData = {
|
||||
MAX_LEN_BH_FROM_BOTTOM = 195, -- massima lunghezza lavorabile da un lato di block haus da sotto
|
||||
MAX_DIST_BH_FROM_BOTTOM = 395, -- massima distanza tra naso mandrino e sopra della trave senza collisione
|
||||
BH_MACHINE = false, -- flag che indica la tipologia di macchina configurata BlockHaus
|
||||
ANG_TRASM = false -- presenza rinvio angolare per lavorazioni da sotto
|
||||
ANG_TRASM = false, -- presenza rinvio angolare per lavorazioni da sotto
|
||||
PRECUT_HEAD = true, -- flag abilitazione pretaglio grezzo a zero in testa
|
||||
PRECUT_TAIL = true, -- flag abilitazione pretaglio grezzo a zero in coda
|
||||
MIN_HEIGHT_ADDED_CUTS = 400, -- altezza minima pezzo per effettuare tagli orizzontali aggiuntivi in testa e coda
|
||||
GAIN_RECLAMPING = 1000, -- in caso di scarso pinzaggio, mm da recuperare con pinzaggio ulteriore prima di spostare
|
||||
NEWTOPC = true,
|
||||
STRATEGIES_SCRIPT = 'Essetre',
|
||||
STRATEGIES_CONFIG_FILE = 'Std1.json'
|
||||
}
|
||||
|
||||
-- Aggiornamento con dati da TechnoEssetre7
|
||||
@@ -84,15 +95,33 @@ if EgtExistsFile( sData) then
|
||||
local Machine = dofile( sData)
|
||||
if Machine then
|
||||
if Machine.Offsets then
|
||||
BeamData.ANG_TRASM = ( Machine.Offsets.SECSUP and Machine.Offsets.SECSUP >= 3)
|
||||
BeamData.BH_MACHINE = ( Machine.Offsets.BLOCKHAUS == 1)
|
||||
BeamData.MINRAW_S = max( BeamData.MINRAW_S, Machine.Offsets.MINRAW_S or BeamData.MINRAW_S)
|
||||
BeamData.MINRAW_L = max( BeamData.MINRAW_L, Machine.Offsets.MINRAW_L or BeamData.MINRAW_L)
|
||||
BeamData.CUT_EXTRA = Machine.Offsets.CUT_EXTRA or BeamData.CUT_EXTRA
|
||||
BeamData.CUT_EXTRA_MIN = Machine.Offsets.CUT_EXTRA_MIN or BeamData.CUT_EXTRA_MIN
|
||||
BeamData.DIM_STRIP_SMALL = Machine.Offsets.DIM_STRIP_SMALL or BeamData.DIM_STRIP_SMALL
|
||||
BeamData.DIM_TO_CENTER_STRIP = Machine.Offsets.DIM_TO_CENTER_STRIP or BeamData.DIM_TO_CENTER_STRIP
|
||||
BeamData.MAXDIAM_POCK_CORNER = Machine.Offsets.MAXDIAM_POCK_CORNER or BeamData.MAXDIAM_POCK_CORNER
|
||||
BeamData.ANG_TRASM = ( Machine.Offsets.SECSUP and Machine.Offsets.SECSUP >= 3)
|
||||
BeamData.BH_MACHINE = ( Machine.Offsets.BLOCKHAUS == 1)
|
||||
BeamData.MINRAW_S = max( BeamData.MINRAW_S, Machine.Offsets.MINRAW_S or BeamData.MINRAW_S)
|
||||
BeamData.MINRAW_L = max( BeamData.MINRAW_L, Machine.Offsets.MINRAW_L or BeamData.MINRAW_L)
|
||||
BeamData.CUT_EXTRA = Machine.Offsets.CUT_EXTRA or BeamData.CUT_EXTRA
|
||||
BeamData.CUT_EXTRA_MIN = Machine.Offsets.CUT_EXTRA_MIN or BeamData.CUT_EXTRA_MIN
|
||||
BeamData.DIM_STRIP_SMALL = Machine.Offsets.DIM_STRIP_SMALL or BeamData.DIM_STRIP_SMALL
|
||||
BeamData.DIM_TO_CENTER_STRIP = Machine.Offsets.DIM_TO_CENTER_STRIP or BeamData.DIM_TO_CENTER_STRIP
|
||||
BeamData.MAXDIAM_POCK_CORNER = Machine.Offsets.MAXDIAM_POCK_CORNER or BeamData.MAXDIAM_POCK_CORNER
|
||||
BeamData.LONGCUT_ENDLEN = Machine.Offsets.LONGCUT_ENDLEN or BeamData.LONGCUT_ENDLEN
|
||||
BeamData.LONGCUT_MAXLEN = Machine.Offsets.LONGCUT_MAXLEN or BeamData.LONGCUT_MAXLEN
|
||||
if Machine.Offsets.MAX_ANGLE_DRILL_CUT then BeamData.MAX_ANGLE_DRILL_CUT = EgtClamp( Machine.Offsets.MAX_ANGLE_DRILL_CUT, 1, 89) end
|
||||
BeamData.ADVANCE_TAIL_OFFS = Machine.Offsets.ADVANCE_TAIL_OFFS or BeamData.ADVANCE_TAIL_OFFS
|
||||
BeamData.LEN_VERY_SHORT_PART = Machine.Offsets.LEN_VERY_SHORT_PART or BeamData.LEN_VERY_SHORT_PART
|
||||
BeamData.LEN_SHORT_PART = Machine.Offsets.LEN_SHORT_PART or BeamData.LEN_SHORT_PART
|
||||
BeamData.MAX_DIM_HTCUT_HBEAM = Machine.Offsets.MAX_DIM_HTCUT_HBEAM or BeamData.MAX_DIM_HTCUT_HBEAM
|
||||
BeamData.MAX_HEIGHT2 = Machine.Offsets.MAX_HEIGHT2 or BeamData.MAX_HEIGHT2
|
||||
BeamData.OVM_MID = Machine.Offsets.OVM_MID or BeamData.OVM_MID
|
||||
if Machine.Offsets.PRECUT_HEAD_DISABLE then BeamData.PRECUT_HEAD = ( Machine.Offsets.PRECUT_HEAD_DISABLE == 0) end
|
||||
if Machine.Offsets.PRECUT_TAIL_DISABLE then BeamData.PRECUT_TAIL = ( Machine.Offsets.PRECUT_TAIL_DISABLE == 0) end
|
||||
if Machine.Offsets.MIN_HEIGHT_ADDED_CUTS then BeamData.MIN_HEIGHT_ADDED_CUTS = min( Machine.Offsets.MIN_HEIGHT_ADDED_CUTS, BeamData.MIN_HEIGHT_ADDED_CUTS) end
|
||||
if Machine.Offsets.NEWCLAMPING ~= nil then BeamData.NEWCLAMPING = ( Machine.Offsets.NEWCLAMPING == 1) end
|
||||
if Machine.Offsets.FASTCLAMPING ~= nil then BeamData.FASTCLAMPING = ( Machine.Offsets.FASTCLAMPING == 1) end
|
||||
if Machine.Offsets.ROT90 ~= nil then BeamData.ROT90 = ( Machine.Offsets.ROT90 == 1) end
|
||||
if Machine.Offsets.ROT180 ~= nil then BeamData.ROT180 = ( Machine.Offsets.ROT180 == 1) end
|
||||
if Machine.Offsets.CUT_SIC then BeamData.CUT_SIC = EgtClamp( Machine.Offsets.CUT_SIC, 15, 50) end
|
||||
if Machine.Offsets.NEWTOPC then BeamData.NEWTOPC = ( Machine.Offsets.NEWTOPC == 1) end
|
||||
end
|
||||
if Machine.Trave then
|
||||
BeamData.MIN_WIDTH = Machine.Trave.XMIN or BeamData.MIN_WIDTH
|
||||
@@ -117,6 +146,15 @@ if EgtExistsFile( sData) then
|
||||
end
|
||||
end
|
||||
end
|
||||
---------------------------------------------------------------------
|
||||
local function GetMaxLenRidgeLapFromBottom( dHRaw)
|
||||
if dHRaw < BeamData.MIN_DIM_HBEAM then
|
||||
return BeamData.MAX_LEN_RIDGELAP_FROM_BOTTOM + 0.01
|
||||
else
|
||||
return BeamData.MAX_LEN_RIDGELAP_FROM_BOTTOM_HBEAM + 0.01
|
||||
end
|
||||
end
|
||||
BeamData.GetMaxLenRidgeLapFromBottom = GetMaxLenRidgeLapFromBottom
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetBlockedAxis( sHead, nToolType, sBlockedAxis)
|
||||
@@ -147,14 +185,187 @@ end
|
||||
BeamData.GetBlockedAxis = GetBlockedAxis
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetMaxLenRidgeLapFromBottom( dHRaw)
|
||||
if dHRaw < BeamData.MIN_DIM_HBEAM then
|
||||
return BeamData.MAX_LEN_RIDGELAP_FROM_BOTTOM + 0.01
|
||||
local function GetChainSawInitAngs( vtN, vtO, nInd)
|
||||
if nInd == 1 then
|
||||
return ''
|
||||
else
|
||||
return BeamData.MAX_LEN_RIDGELAP_FROM_BOTTOM_HBEAM + 0.01
|
||||
return EgtIf( vtN:getY() > 0, 'C=180', 'C=-180')
|
||||
end
|
||||
end
|
||||
BeamData.GetMaxLenRidgeLapFromBottom = GetMaxLenRidgeLapFromBottom
|
||||
BeamData.GetChainSawInitAngs = GetChainSawInitAngs
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetSCC( vtToolDirection, vtEdgeDirection, vtNFace)
|
||||
local nSCC = MCH_SCC.NONE
|
||||
|
||||
if abs( vtToolDirection:getX()) > abs( vtToolDirection:getY()) - GEO.EPS_SMALL then
|
||||
-- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno
|
||||
if abs( vtEdgeDirection:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtNFace, Z_AX()) then
|
||||
nSCC = EgtIf( ( vtToolDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
|
||||
else
|
||||
nSCC = EgtIf( ( vtToolDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM)
|
||||
end
|
||||
else
|
||||
-- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno
|
||||
if abs( vtEdgeDirection:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtNFace, Z_AX()) then
|
||||
nSCC = EgtIf( ( vtToolDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YM, MCH_SCC.ADIR_YP)
|
||||
else
|
||||
nSCC = EgtIf( ( vtToolDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
||||
end
|
||||
end
|
||||
|
||||
return nSCC
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- sAxis può essere AB, C, Z; restituisce direzioni, profondità di estrusione e punti per il controllo precollisione
|
||||
local function GetPreCollisionData( sAxis, vtC, vtHead)
|
||||
|
||||
local PreCollisionData = {}
|
||||
|
||||
-- Pivot uguale per tutti; non c'è aggregato quindi non dipende da SCC
|
||||
-- riferimento vtPivot
|
||||
-- - vtHead (Z): asse rotazione utensile, guarda il mandrino
|
||||
-- - vtToolSCC (X): direzione asse C o aggregato
|
||||
-- - vtEdge (Y): direzione lato, verso in base a X e Z
|
||||
-- - punto di applicazione: naso mandrino o aggregato
|
||||
PreCollisionData.vtMovePivot = Vector3d( 0, 0, 242.55)
|
||||
|
||||
-- carro Z
|
||||
if sAxis == 'Z' then
|
||||
|
||||
PreCollisionData.Directions = { vtDirectionX = X_AX(), vtDirectionY = Z_AX(), vtDirectionZ = -Y_AX()}
|
||||
PreCollisionData.bSurfTmByRevolve = true
|
||||
PreCollisionData.Points = {
|
||||
Point3d( 0, 523, 0),
|
||||
Point3d( 109.556, 523, 0),
|
||||
Point3d( 109.556, 583, 0),
|
||||
Point3d( 143.113, 583, 0),
|
||||
Point3d( 143.113, 2533, 0),
|
||||
Point3d( 0, 2533, 0)
|
||||
}
|
||||
|
||||
-- motore (asse A o B)
|
||||
elseif sAxis == 'AB' then
|
||||
|
||||
PreCollisionData.Directions = { vtDirectionX = vtC, vtDirectionY = -vtHead, vtDirectionZ = vtC ^ -vtHead}
|
||||
PreCollisionData.dExtrusionDepth = 180
|
||||
PreCollisionData.Points = {
|
||||
Point3d( 100,-122,0),
|
||||
Point3d( 100, -232.5, 0),
|
||||
Point3d( -90, -232.5, 0),
|
||||
Point3d( -90, 204.505, 0),
|
||||
Point3d( -77.5, 216.55, 0),
|
||||
Point3d( -89, 234.05, 0),
|
||||
Point3d( -89, 242.55, 0),
|
||||
Point3d( 89, 242.55, 0),
|
||||
Point3d( 89, 234.05, 0),
|
||||
Point3d( 77.5, 216.55, 0),
|
||||
Point3d( 90, 204.505, 0),
|
||||
Point3d( 90, 93, 0),
|
||||
Point3d( 125, 93, 0),
|
||||
Point3d( 125, -122, 0),
|
||||
Point3d( 100, -122, 0)
|
||||
}
|
||||
|
||||
-- asse C
|
||||
elseif sAxis == 'C' then
|
||||
|
||||
PreCollisionData.Directions = { vtDirectionX = vtC, vtDirectionY = Z_AX(), vtDirectionZ = vtC ^ Z_AX()}
|
||||
PreCollisionData.dExtrusionDepth = 200
|
||||
PreCollisionData.Points = {
|
||||
Point3d( 125, -92.752, 0),
|
||||
Point3d( 203.5, -92.752, 0),
|
||||
Point3d( 203.5, -100, 0),
|
||||
Point3d( 400, -100, 0),
|
||||
Point3d( 450, -50, 0),
|
||||
Point3d( 450, 400, 0),
|
||||
Point3d( 360, 490, 0),
|
||||
Point3d( 170, 490, 0),
|
||||
Point3d( 170, 523, 0),
|
||||
Point3d( EgtIf( BeamData.NEWTOPC, -110, -175), 523, 0),
|
||||
Point3d( EgtIf( BeamData.NEWTOPC, -110, -175), 400, 0),
|
||||
Point3d( 230.858, 400, 0),
|
||||
Point3d( 325, 305.858, 0),
|
||||
Point3d( 325, 146, 0),
|
||||
Point3d( 203.5, 146, 0),
|
||||
Point3d( 203.5, 93, 0),
|
||||
Point3d( 125, 93, 0),
|
||||
Point3d( 125, -92.752, 0)
|
||||
}
|
||||
end
|
||||
|
||||
return PreCollisionData
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetSetupInfo( sHead)
|
||||
local SetupInfo = {}
|
||||
|
||||
-- dati comuni
|
||||
SetupInfo.bIsCSymmetrical = false
|
||||
SetupInfo.dCAxisEncumbrance = 180
|
||||
SetupInfo.dCAxisSideEncumbrance = 200
|
||||
SetupInfo.dPivot = 175 -- per uscita fresa, diverso da uscita lama
|
||||
SetupInfo.bToolOnAggregate = false
|
||||
SetupInfo.vtRotationAxisC = Z_AX()
|
||||
SetupInfo.vtRotationAxisAB = X_AX()
|
||||
|
||||
-- testa 5 assi da sopra
|
||||
if sHead == 'H1' then
|
||||
SetupInfo.HeadType = { bTop = true, bBottom = false}
|
||||
SetupInfo.PreferredSide = {}
|
||||
SetupInfo.GetMinNz = function() return sin( -45) end
|
||||
-- lama su testa 5 assi da sopra
|
||||
elseif sHead == 'H2' then
|
||||
SetupInfo.HeadType = { bTop = true, bBottom = false}
|
||||
SetupInfo.PreferredSide = {}
|
||||
SetupInfo.GetMinNz = function() return sin( -45) end
|
||||
SetupInfo.GetPreCollisionData = GetPreCollisionData
|
||||
SetupInfo.GetSCC = GetSCC
|
||||
-- motosega
|
||||
elseif sHead == 'H3' then
|
||||
SetupInfo.HeadType = { bTop = true, bBottom = false}
|
||||
SetupInfo.PreferredSide = {}
|
||||
SetupInfo.GetMinNz = function() return 0 end
|
||||
-- rinvio angolare 90° (considerato come fosse una testa da sotto)
|
||||
elseif sHead == 'H5' then
|
||||
SetupInfo.bToolOnAggregate = true
|
||||
SetupInfo.HeadType = { bTop = false, bBottom = true}
|
||||
SetupInfo.PreferredSide = {}
|
||||
SetupInfo.GetMaxNz = function() return 0 end
|
||||
end
|
||||
|
||||
return SetupInfo
|
||||
end
|
||||
BeamData.GetSetupInfo = GetSetupInfo
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetMaxMatReductionBladeCut( sHead, vtDir)
|
||||
local MaxMatReductionBladeCut = 0
|
||||
-- la lama è montata solo su H2, non si controllano altre teste
|
||||
if sHead == 'H2' then
|
||||
if BeamData.NEWTOPC == nil or BeamData.NEWTOPC then
|
||||
MaxMatReductionBladeCut = -65
|
||||
end
|
||||
if AreSameVectorApprox( vtDir, X_AX()) then
|
||||
MaxMatReductionBladeCut = MaxMatReductionBladeCut + 175
|
||||
elseif AreSameVectorApprox( vtDir, -X_AX()) then
|
||||
MaxMatReductionBladeCut = MaxMatReductionBladeCut + 175
|
||||
elseif AreSameVectorApprox( vtDir, Y_AX()) then
|
||||
MaxMatReductionBladeCut = MaxMatReductionBladeCut + 175
|
||||
elseif AreSameVectorApprox( vtDir, -Y_AX()) then
|
||||
MaxMatReductionBladeCut = MaxMatReductionBladeCut + 175
|
||||
elseif AreSameVectorApprox( vtDir, Z_AX()) then
|
||||
MaxMatReductionBladeCut = 80
|
||||
elseif AreSameVectorApprox( vtDir, -Z_AX()) then
|
||||
MaxMatReductionBladeCut = 80
|
||||
end
|
||||
MaxMatReductionBladeCut = MaxMatReductionBladeCut + BeamData.COLL_SIC
|
||||
end
|
||||
return MaxMatReductionBladeCut + BeamData.COLL_SIC
|
||||
end
|
||||
BeamData.GetMaxMatReductionBladeCut = GetMaxMatReductionBladeCut
|
||||
|
||||
---------------------------------------------------------------------
|
||||
return BeamData
|
||||
|
||||
@@ -0,0 +1,302 @@
|
||||
-- BeamData.lua by Egalware s.r.l. 2025/12/03
|
||||
-- Raccolta dati generali per Travi
|
||||
|
||||
EgtOutLog( ' FAST-BeamData started', 1)
|
||||
|
||||
-- Tabella per definizione modulo
|
||||
local BeamData = {
|
||||
RIGHT_LOAD = false, -- flag carico da destra
|
||||
ROT90 = false, -- flag abilitazione rotazione 90 gradi
|
||||
ROT180 = true, -- flag abilitazione rotazione 180 gradi
|
||||
MIN_WIDTH = 40, -- larghezza minima del grezzo
|
||||
MIN_HEIGHT = 40, -- altezza minima del grezzo
|
||||
MAX_WIDTH = 240, -- larghezza massima del grezzo
|
||||
MAX_HEIGHT = 625, -- altezza massima del grezzo
|
||||
MAX_WIDTH2 = 305, -- seconda larghezza massima del grezzo
|
||||
MAX_HEIGHT2 = 625, -- altezza massima per seconda larghezza massima del grezzo
|
||||
LEN_SHORT_PART = 1200, -- RENAME lunghezza massima pezzo corto
|
||||
LEN_VERY_SHORT_PART = 400, -- RENAME lunghezza massima pezzo molto corto (molto probabile lo scarico a caduta)
|
||||
MAX_RAW = 30000, -- massima lunghezza grezzo (deve essere minore di LenTable - RAW_OFFSET)
|
||||
STD_RAW = 14000, -- lunghezza standard della barra di grezzo
|
||||
OVM_HEAD = 10, -- sovramateriale testa
|
||||
OVM_MID = 5.4, -- sovramateriale intermedio (spessore lama)
|
||||
MINRAW_S = 750, -- minimo grezzo in coda scaricabile per sezioni piccole
|
||||
MINRAW_L = 1070, -- minimo grezzo in coda scaricabile per sezioni grandi
|
||||
MAX_DIM_HTCUT = 200, -- SOLO DICE larghezza massima taglio di testa o coda
|
||||
MIN_DIM_HBEAM = 380, -- SOLO DICE altezza minima di trave alta
|
||||
MAX_DIM_DICE = 155, -- dimensione trasversale massima cubetto
|
||||
MAX_LEN_DICE = 400, -- SOLO DICE lunghezza massima cubetto
|
||||
COLL_SIC = 5, -- distanza di sicurezza per collisioni
|
||||
CUT_SIC = 20, -- distanza di sicurezza per tagli
|
||||
CUT_EXTRA = 5, -- affondamento extra standard per tagli di lama e fresature
|
||||
CUT_EXTRA_MIN = 1, -- affondamento extra ridotto per tagli di lama e fresature
|
||||
MILL_OVERLAP = 5, -- sovrapposizione tra due mezze fresature
|
||||
LONGCUT_ENDLEN = 600, -- RENAME??lunghezza lavoro estremi iniziale e finale (std=600)
|
||||
LONGCUT_MAXLEN = 1200, -- RENAME??lunghezza massima sezione di taglio longitudinale
|
||||
DIM_STRIP = -1, -- dimensione codolo sostegno parti lasciate su contorno libero o archi (-1 = da Q...)
|
||||
DIM_STRIP_SMALL = 1, -- dimensione codolo piccolo (quando le parti sostenute sono sicuramente sulla parte sopra del pezzo)
|
||||
RAWCOL = { 255, 160, 32, 30}, -- colore del grezzo
|
||||
RAW_OFFSET = 2000, -- spostamento grezzo rimanente dopo split
|
||||
VICE_MINH = 110, -- altezza minima della morsa
|
||||
VICE_MAXH = 370, -- altezza massima zona pinzaggio orizzontale
|
||||
USER_HOLE_DIAM = 0, -- diametro foro per L20
|
||||
STRATEGIES_SCRIPT = 'Essetre',
|
||||
STRATEGIES_CONFIG_FILE = 'Std1.json'
|
||||
}
|
||||
|
||||
-- costanti riportate da mlde non necessarie per automatismo (sostituire con GetParameters o simile)
|
||||
local MldeParameters = {}
|
||||
MldeParameters.NumericalControl = 'TPA' -- NUM o TPA o NUM_PLUS
|
||||
MldeParameters.MinX = 0
|
||||
MldeParameters.MaxX = 1350
|
||||
MldeParameters.MinZ = -1350
|
||||
MldeParameters.MaxZ = 0
|
||||
MldeParameters.MillOffs = 177.35
|
||||
MldeParameters.SawOffs = -242.68
|
||||
MldeParameters.DeltaTabY = 898.0
|
||||
MldeParameters.DeltaTabZ = -1017.8 + MldeParameters.MillOffs -- per TPA : -1013.3 + MillOffs -- per NUM : -838.4
|
||||
MldeParameters.NewTopC = true
|
||||
|
||||
-- Aggiornamento con dati macchina personalizzati
|
||||
-- TODO sostituire con GetParameters o simile
|
||||
local sTs3Data = EgtGetStringFromIni( 'Beam', 'DATA_DIR', "C:\\TechnoEssetre7\\EgtData", EgtGetIniFile()).."\\Essetre-Fast.data"
|
||||
local sData = EgtGetCurrMachineDir().."\\Beam\\Ts3Data.lua"
|
||||
if EgtExistsFile( sTs3Data) then
|
||||
EgtCopyFile( sTs3Data, sData)
|
||||
local sTs3DataOld = sTs3Data..'.old'
|
||||
EgtEraseFile( sTs3DataOld)
|
||||
EgtRenameFile( sTs3Data, sTs3DataOld)
|
||||
end
|
||||
if EgtExistsFile( sData) then
|
||||
local Machine = dofile( sData)
|
||||
if Machine then
|
||||
if Machine.Offsets then
|
||||
if Machine.Offsets.TIPO_CN == 0 then
|
||||
MldeParameters.NumericalControl = 'NUM'
|
||||
elseif Machine.Offsets.TIPO_CN == 2 then
|
||||
MldeParameters.NumericalControl = 'NUM_PLUS'
|
||||
else
|
||||
MldeParameters.NumericalControl = 'TPA'
|
||||
end
|
||||
if Machine.Offsets.MAX_X then MldeParameters.MinX = - Machine.Offsets.MAX_X end
|
||||
if Machine.Offsets.MIN_X then MldeParameters.MaxX = - Machine.Offsets.MIN_X end
|
||||
if Machine.Offsets.MIN_Z then MldeParameters.MinZ = Machine.Offsets.MIN_Z end
|
||||
if Machine.Offsets.MAX_Z then MldeParameters.MaxZ = Machine.Offsets.MAX_Z end
|
||||
if Machine.Offsets.PIVOTFRESA then MldeParameters.MillOffs = - Machine.Offsets.PIVOTFRESA end
|
||||
if Machine.Offsets.PIVOTLAMA then MldeParameters.SawOffs = - Machine.Offsets.PIVOTLAMA end
|
||||
if Machine.Offsets.OFFSETX then MldeParameters.DeltaTabY = - Machine.Offsets.OFFSETX end
|
||||
if Machine.Offsets.OFFSETZ then MldeParameters.DeltaTabZ = Machine.Offsets.OFFSETZ + EgtIf( MldeParameters.NumericalControl == 'TPA', MldeParameters.MillOffs, 0) end
|
||||
if Machine.Offsets.NEWTOPC then MldeParameters.NewTopC = ( Machine.Offsets.NEWTOPC == 1) end
|
||||
BeamData.MINRAW_S = max( BeamData.MINRAW_S, Machine.Offsets.MINRAW_S or BeamData.MINRAW_S)
|
||||
BeamData.MINRAW_L = max( BeamData.MINRAW_L, Machine.Offsets.MINRAW_L or BeamData.MINRAW_L)
|
||||
BeamData.CUT_EXTRA = Machine.Offsets.CUT_EXTRA or BeamData.CUT_EXTRA
|
||||
BeamData.CUT_EXTRA_MIN = Machine.Offsets.CUT_EXTRA_MIN or BeamData.CUT_EXTRA_MIN
|
||||
BeamData.DIM_STRIP_SMALL = Machine.Offsets.DIM_STRIP_SMALL or BeamData.DIM_STRIP_SMALL
|
||||
BeamData.LONGCUT_ENDLEN = Machine.Offsets.LONGCUT_ENDLEN or BeamData.LONGCUT_ENDLEN
|
||||
BeamData.LONGCUT_MAXLEN = Machine.Offsets.LONGCUT_MAXLEN or BeamData.LONGCUT_MAXLEN
|
||||
BeamData.LEN_VERY_SHORT_PART = Machine.Offsets.LEN_VERY_SHORT_PART or BeamData.LEN_VERY_SHORT_PART
|
||||
BeamData.LEN_SHORT_PART = Machine.Offsets.LEN_SHORT_PART or BeamData.LEN_SHORT_PART
|
||||
BeamData.MAX_HEIGHT2 = Machine.Offsets.MAX_HEIGHT2 or BeamData.MAX_HEIGHT2
|
||||
BeamData.OVM_MID = Machine.Offsets.OVM_MID or BeamData.OVM_MID
|
||||
if Machine.Offsets.ROT90 ~= nil then BeamData.ROT90 = ( Machine.Offsets.ROT90 == 1) end
|
||||
if Machine.Offsets.ROT180 ~= nil then BeamData.ROT180 = ( Machine.Offsets.ROT180 == 1) end
|
||||
if Machine.Offsets.CUT_SIC then BeamData.CUT_SIC = EgtClamp( Machine.Offsets.CUT_SIC, 15, 50) end
|
||||
end
|
||||
if Machine.Trave then
|
||||
BeamData.MIN_WIDTH = Machine.Trave.XMIN or BeamData.MIN_WIDTH
|
||||
BeamData.MIN_HEIGHT = Machine.Trave.ZMIN or BeamData.MIN_HEIGHT
|
||||
BeamData.MAX_WIDTH = Machine.Trave.XMAX or BeamData.MAX_WIDTH
|
||||
BeamData.MAX_HEIGHT = Machine.Trave.ZMAX or BeamData.MAX_HEIGHT
|
||||
end
|
||||
if Machine.User then
|
||||
BeamData.USER_HOLE_DIAM = Machine.User.L020_DIAM_HOLE or BeamData.USER_HOLE_DIAM
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetBlockedAxis( sHead, nToolType, sBlockedAxis)
|
||||
-- lama
|
||||
if nToolType == MCH_TY.SAW_STD or nToolType == MCH_TY.SAW_FLAT then
|
||||
return ''
|
||||
-- sega a catena
|
||||
elseif nToolType == MCH_TY.MORTISE_STD then
|
||||
if sHead == 'H3' then
|
||||
if sBlockedAxis == 'parallel' then
|
||||
return 'A=0'
|
||||
elseif sBlockedAxis == 'perpendicular' then
|
||||
return 'A=90'
|
||||
end
|
||||
else
|
||||
return ''
|
||||
end
|
||||
-- fresa
|
||||
elseif nToolType == MCH_TY.MILL_STD or nToolType == MCH_TY.MILL_NOTIP then
|
||||
return ''
|
||||
-- punta
|
||||
elseif nToolType == MCH_TY.DRILL_STD or nToolType == MCH_TY.DRILL_LONG then
|
||||
return ''
|
||||
else
|
||||
return ''
|
||||
end
|
||||
end
|
||||
BeamData.GetBlockedAxis = GetBlockedAxis
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetChainSawInitAngs( vtN, vtO, nInd)
|
||||
if nInd == 1 then
|
||||
return ''
|
||||
else
|
||||
return EgtIf( vtN:getY() > 0, 'C=180', 'C=-180')
|
||||
end
|
||||
end
|
||||
BeamData.GetChainSawInitAngs = GetChainSawInitAngs
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetSCC( vtToolDirection, vtEdgeDirection, vtNFace)
|
||||
local nSCC = MCH_SCC.NONE
|
||||
|
||||
if abs( vtToolDirection:getX()) > abs( vtToolDirection:getY()) - GEO.EPS_SMALL then
|
||||
-- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno
|
||||
if abs( vtEdgeDirection:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtNFace, Z_AX()) then
|
||||
nSCC = EgtIf( ( vtToolDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
|
||||
else
|
||||
nSCC = EgtIf( ( vtToolDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM)
|
||||
end
|
||||
else
|
||||
-- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno
|
||||
if abs( vtEdgeDirection:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtNFace, Z_AX()) then
|
||||
nSCC = EgtIf( ( vtToolDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YM, MCH_SCC.ADIR_YP)
|
||||
else
|
||||
nSCC = EgtIf( ( vtToolDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM)
|
||||
end
|
||||
end
|
||||
|
||||
return nSCC
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- sAxis può essere AB, C, Z; restituisce direzioni, profondità di estrusione e punti per il controllo precollisione
|
||||
local function GetPreCollisionData( sAxis, vtC, vtHead)
|
||||
|
||||
local PreCollisionData = {}
|
||||
|
||||
-- Pivot uguale per tutti; non c'è aggregato quindi non dipende da SCC
|
||||
-- riferimento vtPivot
|
||||
-- - vtHead (Z): asse rotazione utensile, guarda il mandrino
|
||||
-- - vtToolSCC (X): direzione asse C o aggregato
|
||||
-- - vtEdge (Y): direzione lato, verso in base a X e Z
|
||||
-- - punto di applicazione: naso mandrino o aggregato
|
||||
PreCollisionData.vtMovePivot = Vector3d( 0, 0, -MldeParameters.SawOffs)
|
||||
|
||||
-- carro Z
|
||||
if sAxis == 'Z' then
|
||||
|
||||
PreCollisionData.Directions = { vtDirectionX = X_AX(), vtDirectionY = Z_AX(), vtDirectionZ = -Y_AX()}
|
||||
PreCollisionData.bSurfTmByRevolve = true
|
||||
PreCollisionData.Points = {
|
||||
Point3d( 0, 523, 0),
|
||||
Point3d( 109.556, 523, 0),
|
||||
Point3d( 109.556, 583, 0),
|
||||
Point3d( 143.113, 583, 0),
|
||||
Point3d( 143.113, 2533, 0),
|
||||
Point3d( 0, 2533, 0)
|
||||
}
|
||||
|
||||
-- motore (asse A o B)
|
||||
elseif sAxis == 'AB' then
|
||||
|
||||
PreCollisionData.Directions = { vtDirectionX = vtC, vtDirectionY = -vtHead, vtDirectionZ = vtC ^ -vtHead}
|
||||
PreCollisionData.dExtrusionDepth = 180
|
||||
PreCollisionData.Points = {
|
||||
Point3d( 100,-122,0),
|
||||
Point3d( 100, -232.5, 0),
|
||||
Point3d( -90, -232.5, 0),
|
||||
Point3d( -90, 204.505, 0),
|
||||
Point3d( -77.5, 216.55, 0),
|
||||
Point3d( -89, 234.05, 0),
|
||||
Point3d( -89, 242.55, 0),
|
||||
Point3d( 89, 242.55, 0),
|
||||
Point3d( 89, 234.05, 0),
|
||||
Point3d( 77.5, 216.55, 0),
|
||||
Point3d( 90, 204.505, 0),
|
||||
Point3d( 90, 93, 0),
|
||||
Point3d( 125, 93, 0),
|
||||
Point3d( 125, -122, 0),
|
||||
Point3d( 100, -122, 0)
|
||||
}
|
||||
|
||||
-- asse C
|
||||
elseif sAxis == 'C' then
|
||||
|
||||
PreCollisionData.Directions = { vtDirectionX = vtC, vtDirectionY = Z_AX(), vtDirectionZ = vtC ^ Z_AX()}
|
||||
PreCollisionData.dExtrusionDepth = 200
|
||||
PreCollisionData.Points = {
|
||||
Point3d( 125, -92.752, 0),
|
||||
Point3d( 203.5, -92.752, 0),
|
||||
Point3d( 203.5, -100, 0),
|
||||
Point3d( 400, -100, 0),
|
||||
Point3d( 450, -50, 0),
|
||||
Point3d( 450, 400, 0),
|
||||
Point3d( 360, 490, 0),
|
||||
Point3d( 170, 490, 0),
|
||||
Point3d( 170, 523, 0),
|
||||
Point3d( EgtIf( MldeParameters.NewTopC, -110, -175), 523, 0),
|
||||
Point3d( EgtIf( MldeParameters.NewTopC, -110, -175), 400, 0),
|
||||
Point3d( 230.858, 400, 0),
|
||||
Point3d( 325, 305.858, 0),
|
||||
Point3d( 325, 146, 0),
|
||||
Point3d( 203.5, 146, 0),
|
||||
Point3d( 203.5, 93, 0),
|
||||
Point3d( 125, 93, 0),
|
||||
Point3d( 125, -92.752, 0)
|
||||
}
|
||||
end
|
||||
|
||||
return PreCollisionData
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetSetupInfo( sHead)
|
||||
local SetupInfo = {}
|
||||
|
||||
-- dati comuni
|
||||
SetupInfo.bIsCSymmetrical = false
|
||||
SetupInfo.dCAxisEncumbrance = 180
|
||||
SetupInfo.dCAxisSideEncumbrance = 200
|
||||
SetupInfo.bToolOnAggregate = false
|
||||
SetupInfo.vtRotationAxisC = EgtGetAxisDir( 'C')
|
||||
SetupInfo.vtRotationAxisAB = EgtGetAxisDir( 'B')
|
||||
|
||||
-- testa 5 assi da sopra
|
||||
if sHead == 'H1' then
|
||||
SetupInfo.HeadType = { bTop = true, bBottom = false}
|
||||
SetupInfo.PreferredSide = {}
|
||||
SetupInfo.dPivot = MldeParameters.MillOffs -- per uscita fresa, diverso da uscita lama
|
||||
SetupInfo.GetMinNz = function() return sin( -45) end
|
||||
-- lama su testa 5 assi da sopra
|
||||
elseif sHead == 'H2' then
|
||||
SetupInfo.HeadType = { bTop = true, bBottom = false}
|
||||
SetupInfo.PreferredSide = {}
|
||||
SetupInfo.GetMinNz = function() return sin( -45) end
|
||||
SetupInfo.GetPreCollisionData = GetPreCollisionData
|
||||
SetupInfo.GetSCC = GetSCC
|
||||
-- motosega
|
||||
elseif sHead == 'H3' then
|
||||
SetupInfo.HeadType = { bTop = true, bBottom = false}
|
||||
SetupInfo.PreferredSide = {}
|
||||
SetupInfo.GetMinNz = function() return 0 end
|
||||
-- rinvio angolare 90° (considerato come fosse una testa da sotto)
|
||||
elseif sHead == 'H5' then
|
||||
SetupInfo.bToolOnAggregate = true
|
||||
SetupInfo.HeadType = { bTop = false, bBottom = true}
|
||||
SetupInfo.PreferredSide = {}
|
||||
SetupInfo.GetMaxNz = function() return 0 end
|
||||
end
|
||||
|
||||
return SetupInfo
|
||||
end
|
||||
BeamData.GetSetupInfo = GetSetupInfo
|
||||
|
||||
---------------------------------------------------------------------
|
||||
return BeamData
|
||||
@@ -35,6 +35,8 @@ Name=Offsets
|
||||
30=l,OFFSETZ_RINV_1,347,OFFSETZ_RINV_1
|
||||
31=l,OFFSETX_RINV_2,150,OFFSETX_RINV_2
|
||||
32=l,OFFSETZ_RINV_2,347,OFFSETZ_RINV_2
|
||||
33=l,MIN_JOIN_SS,100,MIN_JOIN_SS
|
||||
34=l,MIN_JOIN_VV,75,MIN_JOIN_VV
|
||||
|
||||
[2]
|
||||
Name=Trave
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
3=Pocket
|
||||
4=Pocket_AT
|
||||
5=AngleDrill
|
||||
6=Predrill
|
||||
|
||||
[Milling]
|
||||
1=Prof
|
||||
@@ -31,6 +32,9 @@
|
||||
19=Long2CutSide
|
||||
20=SmallToolContour
|
||||
21=AntiSplintMillCut
|
||||
22=Prof_end
|
||||
23=SideMillAsBlade
|
||||
24=FloatingAggregate
|
||||
|
||||
[Pocketing]
|
||||
1=Pocket
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[BEAM]
|
||||
StartOffset=10
|
||||
Offset=5.4
|
||||
@@ -3,9 +3,10 @@
|
||||
|
||||
-- carico librerie
|
||||
local INFO_STD_PP = require( 'Version')
|
||||
local BD = require( 'BeamData')
|
||||
|
||||
-- Variabili di modulo
|
||||
local CSP_INFO = INFO_STD_PP.NAME..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.'
|
||||
local CSP_INFO = INFO_STD_PP.NAME..'_'..NumericalControl..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.'
|
||||
local MACHINE_INFO = MACH_NAME..' ver.'..PP_VER
|
||||
local TEST_USE = false
|
||||
|
||||
@@ -26,7 +27,9 @@ function OnStart()
|
||||
--EMT.LINEINC = 1 -- incremento numerazione linee
|
||||
--EMT.Ft = 'F' -- token per feed
|
||||
--EMT.St = 'S' -- token per speed
|
||||
EMT.FMAXPINZE = 154000 -- feed massima pinze
|
||||
EMT.FMAXPINZE = EgtClamp( MaxFeedPinze or 154000, 20000, 160000) -- feed massima pinze
|
||||
EMT.MAXACC = MaxAcc or ( EMT.FMAXPINZE / ( 60 * 0.3)) -- accelerazione massima pinze
|
||||
EMT.MINACC = MinAcc or ( EMT.FMAXPINZE / ( 60 * 4)) -- accelerazione minima pinze
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -43,7 +46,7 @@ function OnProgramStart()
|
||||
EmtOutput( '%'..EgtNumToString( nPatt, 0)..'.0')
|
||||
|
||||
-- aggiungo prefisso per commentae commenti iniziali se la macchina è utilizzata per fare i test
|
||||
local sPrefixCommentLine = '' ; if IS_TEST_MACHINE then sPrefixCommentLine = '//' end
|
||||
local sPrefixCommentLine = '' ; if IS_TEST_MACHINE or EgtEndsWith( EgtGetCurrMachineDir(), '.TEST') then sPrefixCommentLine = '//' end
|
||||
|
||||
if EMT.INFO then
|
||||
EmtOutput( sPrefixCommentLine..'('..EMT.INFO..')')
|
||||
@@ -52,6 +55,7 @@ function OnProgramStart()
|
||||
end
|
||||
EmtOutput( sPrefixCommentLine..'('.. CSP_INFO..')')
|
||||
EmtOutput( sPrefixCommentLine..'('.. MACHINE_INFO..')\n')
|
||||
EmtOutput( '(HEADER)')
|
||||
-- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente)
|
||||
if TEST_USE then
|
||||
EmtOutput( 'M28')
|
||||
@@ -103,6 +107,7 @@ function OnProgramEnd()
|
||||
EMT.FALL = nil
|
||||
EMT.RELOAD = nil
|
||||
EMT.RELOAD2 = nil
|
||||
EmtOutput( '(FOOTER)')
|
||||
-- Se modalità test, termino il programma
|
||||
if TEST_USE then
|
||||
EmtOutput( 'M02')
|
||||
@@ -180,16 +185,12 @@ function OnDispositionEnd()
|
||||
local STrave = EMT.ST
|
||||
local HOverM = EMT.HOVM
|
||||
-- calcolo dati pinze
|
||||
local MinAccPinze = 0.3
|
||||
local MaxAccPinze = 4
|
||||
local KgMtCubo= 550 -- densità legno in Kg / metro cubo
|
||||
local KgMtCubo= WoodDensity or 550 -- densità legno in Kg / metro cubo
|
||||
local Massa = ( HTrave * STrave * LBarra * KgMtCubo ) / 1000000000
|
||||
local FMaxPinze = EMT.FMAXPINZE
|
||||
local ForzaAtrito = 700 / 2 -- Serve per regolare P32 (700 valore reale pistone)
|
||||
local TempoAcc = ( ( Massa * FMaxPinze) / ( 60 * ForzaAtrito) / 1000)
|
||||
if ( TempoAcc < MinAccPinze) then TempoAcc = MinAccPinze end
|
||||
if ( TempoAcc > MaxAccPinze) then TempoAcc = MaxAccPinze end
|
||||
local AccPinze = FMaxPinze / ( 60 * TempoAcc)
|
||||
local AccPinze = EgtClamp( FMaxPinze / ( 60 * TempoAcc), EMT.MINACC, EMT.MAXACC)
|
||||
local RidFeed = 100 / Massa * 100
|
||||
if ( RidFeed > 100) then RidFeed = 100 end
|
||||
if IdTrave >= 0 then
|
||||
@@ -249,9 +250,9 @@ function OnDispositionEnd()
|
||||
EmtOutput( sOut)
|
||||
-- altrimenti recupero rimanenza
|
||||
else
|
||||
EmtOutput( 'G112 EC1'..' Y'..EmtLenToString( LoadT, 3).. ' EY'..EmtLenToString( EMT.YPOS, 3)..' EV'..EmtLenToString( ParkV, 3) ..' EF'..GetFmaxClamp())
|
||||
EmtOutput( 'G112 EC1'..' Y'..EmtLenToString( EMT.TPOS, 3).. ' EY'..EmtLenToString( EMT.YPOS, 3)..' EV'..EmtLenToString( ParkV, 3) ..' EF'..GetFmaxClamp())
|
||||
-- aggiorno dati aggancio carrelli alla trave
|
||||
EMT.YDELTA = EMT.YPOS - LoadT
|
||||
EMT.YDELTA = EMT.YPOS - EMT.TPOS
|
||||
EMT.VDELTA = nil
|
||||
end
|
||||
-- eventuale preparazione per rotazione immediata
|
||||
@@ -495,6 +496,7 @@ function OnMachiningEnd()
|
||||
EMT.U_STD = nil
|
||||
EMT.PREVTOOL = EMT.TOOL
|
||||
EMT.PREVHEAD = EMT.HEAD
|
||||
EMT.PREVET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -508,6 +510,7 @@ function OnPathStart()
|
||||
-- salvo precedenti rotanti
|
||||
EMT.R1pp = EMT.R1p
|
||||
EMT.R2pp = EMT.R2p
|
||||
EMT.R3pp = EMT.R3p
|
||||
|
||||
-- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento)
|
||||
EmtResetPrev()
|
||||
@@ -602,9 +605,14 @@ end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnRapid()
|
||||
-- recupero prossimo utensile
|
||||
EMT.NEXTTOOL, EMT.NEXTHEAD, EMT.NEXTTCPOS = FindNextTool()
|
||||
MyBackupAxes()
|
||||
-- se primo movimento della lavorazione, gestione speciale
|
||||
if EMT.MCHFIRST and not EMT.OPEISDISP then
|
||||
-- primo posizionamento
|
||||
local MyZHome = EgtGetAxisHomePos( 'Z')
|
||||
local bZmax = ( #EMT.AUXSTR > 0 or EMT.TOOL ~= EMT.PREVTOOL or EMT.L3 > -1)
|
||||
-- decido se muovere prima testa o carrelli (standard prima testa)
|
||||
local bHeadFirst = true
|
||||
local sLateG101
|
||||
@@ -623,15 +631,31 @@ function OnRapid()
|
||||
end
|
||||
end
|
||||
|
||||
-- primo posizionamento
|
||||
local MyZHome = EgtGetAxisHomePos( 'Z')
|
||||
local bZmax = ( #EMT.AUXSTR > 0 or EMT.TOOL ~= EMT.PREVTOOL or EMT.L3 > -1)
|
||||
local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
|
||||
local bGoToHome = false
|
||||
-- se gli assi rotanti cambiano parecchio, con motosega si va in parcheggio
|
||||
if EMT.PREVHEAD == 'H3' and EMT.HEAD == 'H3' and ( sET ~= EMT.PREVET or abs( EMT.R2pp - EMT.R2) > 25 or abs( EMT.R1pp - EMT.R1) > 25) then
|
||||
bGoToHome = true
|
||||
end
|
||||
|
||||
-- ricavo i dati per la lavorazione
|
||||
local sEE = ' EE' .. EgtIf( bZmax, '3', '4')
|
||||
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ( EMT.TDIST or ChSawLen)), 3)
|
||||
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
|
||||
local sES = ' ES'..EgtNumToString( EMT.S, 0)
|
||||
|
||||
-- se avevo motosega, torno in zona sicura senza ruotare assi rotanti
|
||||
if EMT.PREVHEAD == 'H3' and EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then
|
||||
if not EMT.LOAD and EMT.PREVHEAD == 'H3' and EMT.FLAG2 == 1 then
|
||||
-- se ho ancora motosega, si setta già asse C, altrimenti asse C per andare in home
|
||||
local sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EmtLenToString( EMT.R2pp, 3) .. ' C' .. EmtLenToString( EMT.R1pp, 3) ..
|
||||
' EE' .. EgtIf( bZmax, '3', '4') .. EMT.PREVsEL .. EMT.PREVsER .. EMT.PREVsET .. EMT.PREVsES
|
||||
EmtOutput( sOutPreMove)
|
||||
sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EmtLenToString( 0, 3) .. ' C' .. EmtLenToString( EMT.R1pp, 3) ..
|
||||
' EE' .. EgtIf( bZmax, '3', '4') .. EMT.PREVsEL .. EMT.PREVsER .. EMT.PREVsET .. EMT.PREVsES
|
||||
EmtOutput( sOutPreMove)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
end
|
||||
@@ -641,18 +665,27 @@ function OnRapid()
|
||||
EmtOutput( '( *** ' .. sOut .. ' *** )')
|
||||
end
|
||||
|
||||
-- ricavo i dati per la lavorazione
|
||||
local sEE = ' EE' .. EgtIf( bZmax, '3', '4')
|
||||
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ( EMT.TDIST or ChSawLen)), 3)
|
||||
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
|
||||
local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
local sES = ' ES'..EgtNumToString( EMT.S, 0)
|
||||
|
||||
-- se carico motosega, ruoto in zona sicura prima di approcciare la lavorazione
|
||||
if EMT.HEAD == 'H3' and EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then
|
||||
local sEEPreMove = ' EE' .. EgtIf( bZmax, '3', '4')
|
||||
if EMT.HEAD == 'H3' and EMT.PREVHEAD ~= 'H3' then
|
||||
local sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
EmtGetAxis( 'R2') .. EmtGetAxis( 'R1') .. sEE .. sEL .. sER .. sET .. sES
|
||||
' B' .. EgtNumToString( 0, 3) .. ' C' .. EgtNumToString( EMT.R1, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOutPreMove)
|
||||
sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EgtNumToString( EMT.R2, 3) .. ' C' .. EgtNumToString( EMT.R1, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOutPreMove)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
-- se carico motosega, ruoto in zona sicura prima di approcciare la lavorazione
|
||||
elseif not EMT.LOAD and ( EMT.HEAD == 'H3' or ( bZmax and EMT.TTOTLEN > 200)) and
|
||||
( EMT.ST > BeamHeightForFixRot or ( EMT.HEAD == 'H1' and EMT.TTOTLEN > 350) or bGoToHome) and EMT.FLAG2 == 1 then
|
||||
local sOutPreMove
|
||||
if EMT.HEAD == 'H3' and bGoToHome then
|
||||
sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EgtNumToString( 0, 3) .. ' C' .. EgtNumToString( EMT.R1, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOutPreMove)
|
||||
end
|
||||
sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EgtNumToString( EMT.R2, 3) .. ' C' .. EgtNumToString( EMT.R1, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOutPreMove)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
@@ -833,12 +866,47 @@ function OnRapid()
|
||||
EmtAdjustRotaryAxes()
|
||||
EmitZmax()
|
||||
EMT.ZMAX = true
|
||||
-- se pezzi alti e devo cambiare utensile su testa con CU, porto la testa vicino al cambio utensile
|
||||
if EMT.ST > BeamHeightForFixRot and EMT.HEAD == 'H1' and EMT.TOOL ~= EMT.NEXTTOOL and EMT.NEXTHEAD ~= 'H2' then
|
||||
local dBAxis = 90
|
||||
local dCAxis = EgtIf( BD.RIGHT_LOAD, 90, -90)
|
||||
local sEE = ' EE3'
|
||||
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ( EMT.TDIST or ChSawLen)), 3)
|
||||
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
|
||||
local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
local sES = ' ES'..EgtNumToString( EMT.S, 0)
|
||||
local sOut = 'G101' .. EmtGetAxis( 'L2') .. EmtGetAxis( 'L3') ..' B' .. EgtNumToString( dBAxis, 3) ..
|
||||
' C' .. EgtNumToString( dCAxis, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
sOut = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. EmtGetAxis( 'L3') ..' B' .. EgtNumToString( dBAxis, 3) ..
|
||||
' C' .. EgtNumToString( dCAxis, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
end
|
||||
-- se altrimenti movimento in Home
|
||||
elseif EMT.FLAG == 4 then
|
||||
-- non previsto
|
||||
-- se altrimenti rotazione a Z max
|
||||
-- se altrimenti rotazione a Z max per lavorazione successiva
|
||||
elseif EMT.FLAG == 5 then
|
||||
-- viene gestito all'inizio della lavorazione successiva
|
||||
EMT.REFLOC = nil
|
||||
EMT.IPLGL = false
|
||||
MyAdjustLinearAxes()
|
||||
EmtAdjustRotaryAxes()
|
||||
EmtResetPrev()
|
||||
-- ricavo i dati per la lavorazione
|
||||
local sEE = ' EE3'
|
||||
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ( EMT.TDIST or ChSawLen)), 3)
|
||||
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
|
||||
local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
local sES = ' ES'..EgtNumToString( EMT.S, 0)
|
||||
local sOut = 'G101' .. EmtGetAxis( 'L2') .. EmtGetAxis( 'L3') ..
|
||||
EmtGetAxis( 'R2') .. EmtGetAxis( 'R1') .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
-- altrimenti errore
|
||||
else
|
||||
EmtSetLastError( 1212, "Unknown Rapid flag")
|
||||
@@ -930,13 +998,46 @@ function OnArc()
|
||||
local sFeed = EmtGetFeed()
|
||||
-- tipo arco
|
||||
local sArc = 'G' .. EgtNumToString(EMT.MOVE,0)
|
||||
-- emetto arco
|
||||
EmtOutput( sArc..sAxes..sRad..sFeed)
|
||||
-- se arco molto grande, approssimo con una retta
|
||||
if EMT.RR > 99999 then
|
||||
EmtOutput( "G1"..sAxes..sFeed)
|
||||
else
|
||||
EmtOutput( sArc..sAxes..sRad..sFeed)
|
||||
end
|
||||
|
||||
-- aggiorno valori come precedenti
|
||||
EmtUpdatePrev()
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function FindNextTool()
|
||||
-- salvo stato iniziale
|
||||
local CurrMachId = EgtGetCurrMachining()
|
||||
local CurrTool = EgtTdbGetCurrToolParam( MCH_TP.NAME)
|
||||
-- cerco lavorazione con utensile su gruppo testa indicato
|
||||
local sTool, sHead, sTcPos
|
||||
local OpId = EgtGetNextActiveOperation( CurrMachId or EMT.MCHID)
|
||||
while OpId do
|
||||
local nType = EgtGetOperationType( OpId)
|
||||
if nType ~= MCH_OY.NONE and nType ~= MCH_OY.DISP then
|
||||
if EgtSetCurrMachining( OpId) then
|
||||
sTool = EgtGetMachiningParam( MCH_MP.TOOL)
|
||||
if EgtTdbSetCurrTool( sTool) then
|
||||
sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
|
||||
sTcPos = EgtTdbGetCurrToolParam( MCH_TP.TCPOS)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
OpId = EgtGetNextActiveOperation( OpId)
|
||||
end
|
||||
-- ripristino stato iniziale
|
||||
EgtSetCurrMachining( CurrMachId or GDB_ID.NULL)
|
||||
EgtTdbSetCurrTool( CurrTool or '')
|
||||
-- restituisco risultato
|
||||
return sTool, sHead, sTcPos
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function CalcCharStatus( sCmd, bSkipPress)
|
||||
-- aperto
|
||||
@@ -1247,7 +1348,7 @@ function PrepareUnload( sCmd)
|
||||
table.insert( EMT.AUXCMD, sMsg)
|
||||
if Cmd[2] == 'V' then
|
||||
-- se non è ultima fase c'è una barra sulla pinza Y (1)
|
||||
local sEE = EgtIf( EMT.PHASE == EgtGetPhaseCount(), '0', '1')
|
||||
local sEE = EgtIf( EMT.PHASE == EgtGetPhaseCount() or IsEnd2Phase( EMT.PHASE), '0', '1')
|
||||
local sOut = 'G111 '..Cmd[2]..Cmd[3]..' EC141 ED83 EE'..sEE..' EF'..GetFmaxClamp()
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
end
|
||||
@@ -1256,7 +1357,7 @@ function PrepareUnload( sCmd)
|
||||
table.insert( EMT.AUXCMD, sMsg)
|
||||
if Cmd[4] == 'V' then
|
||||
-- se non è ultima fase c'è una barra sulla pinza Y (1)
|
||||
local sEAB = EgtIf( EMT.PHASE == EgtGetPhaseCount(), '111', '112')
|
||||
local sEAB = EgtIf( EMT.PHASE == EgtGetPhaseCount() or IsEnd2Phase( EMT.PHASE), '111', '112')
|
||||
local sOut = 'G111 '..Cmd[4]..Cmd[5]..' EA'..sEAB..' EB'..sEAB..' EC142 ED141 EE2 EF'..GetFmaxClamp()
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
EMT.U_STD = true
|
||||
@@ -1416,10 +1517,13 @@ function PreparePostRotation( sCmd)
|
||||
elseif nVDelta > 0 then
|
||||
EMT.YDELTA = nil
|
||||
EMT.VDELTA = nVDelta
|
||||
end
|
||||
local sYLoad = ' Y'..EmtLenToString( LoadT)
|
||||
local sOut = 'G111'..sYLoad..' EA76'..EMT.SB..' EE0 EF'..EmtLenToString( EMT.FMAXPINZE,0)..' ET1'
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
end
|
||||
local sYLoad = ' Y'..EmtLenToString( LoadT)
|
||||
local sOut = 'G111'..sYLoad..' EA76'..EMT.SB..' EE0 EF'..EmtLenToString( EMT.FMAXPINZE,0)..' ET1'
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
-- setto parametri di pinzaggio reali
|
||||
EMT.SA = ' EA110'
|
||||
EMT.SE = ' EE1'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1461,10 +1565,13 @@ function MyAdjustLinearAxes()
|
||||
|
||||
if EMT.REFLOC then
|
||||
local vtE
|
||||
if EMT.HEAD ~= 'H3' then
|
||||
-- su NUM aggregati non gestiti
|
||||
if EMT.HEAD == 'H5' or EMT.HEAD == 'H6' or EMT.HEAD == 'H7' then
|
||||
EmtSetLastError( 1211, "Aggregates not managed")
|
||||
elseif EMT.HEAD ~= 'H3' then
|
||||
local Len = EMT.TLEN + EgtIf( EMT.HEAD == 'H1', MillOffs, abs( SawOffs))
|
||||
local LenRef = MillOffs
|
||||
vtE = Vector3d( EMT.EXTR) * Len - Z_AX() * LenRef
|
||||
vtE = Vector3d( EMT.TDIR) * Len - Z_AX() * LenRef
|
||||
else
|
||||
local LenAux = ( EMT.TDIST or ChSawLen) + MillOffs
|
||||
local LenRef = MillOffs
|
||||
@@ -1576,7 +1683,7 @@ end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function GetET( sHead, sTcPos, dAxR3)
|
||||
if sHead == 'H1' then
|
||||
if sHead == 'H1' or sHead == 'H5' or sHead == 'H6' or sHead == 'H7' then
|
||||
return ' E'..sTcPos
|
||||
elseif sHead == 'H2' then
|
||||
return ' ET42'
|
||||
@@ -3,9 +3,10 @@
|
||||
|
||||
-- carico librerie
|
||||
local INFO_STD_PP = require( 'Version')
|
||||
local BD = require( 'BeamData')
|
||||
|
||||
-- Variabili di modulo
|
||||
local CSP_INFO = INFO_STD_PP.NAME..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.'
|
||||
local CSP_INFO = INFO_STD_PP.NAME..'_'..NumericalControl..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.'
|
||||
local MACHINE_INFO = MACH_NAME..' ver.'..PP_VER
|
||||
local TEST_USE = false
|
||||
|
||||
@@ -26,7 +27,9 @@ function OnStart()
|
||||
--EMT.LINEINC = 1 -- incremento numerazione linee
|
||||
--EMT.Ft = 'F' -- token per feed
|
||||
--EMT.St = 'S' -- token per speed
|
||||
EMT.FMAXPINZE = 154000 -- feed massima pinze
|
||||
EMT.FMAXPINZE = EgtClamp( MaxFeedPinze or 154000, 20000, 160000) -- feed massima pinze
|
||||
EMT.MAXACC = MaxAcc or ( EMT.FMAXPINZE / ( 60 * 0.3)) -- accelerazione massima pinze
|
||||
EMT.MINACC = MinAcc or ( EMT.FMAXPINZE / ( 60 * 4)) -- accelerazione minima pinze
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -43,7 +46,7 @@ function OnProgramStart()
|
||||
EmtOutput( '%'..EgtNumToString( nPatt, 0)..'.0')
|
||||
|
||||
-- aggiungo prefisso per commentae commenti iniziali se la macchina è utilizzata per fare i test
|
||||
local sPrefixCommentLine = '' ; if IS_TEST_MACHINE then sPrefixCommentLine = '//' end
|
||||
local sPrefixCommentLine = '' ; if IS_TEST_MACHINE or EgtEndsWith( EgtGetCurrMachineDir(), '.TEST') then sPrefixCommentLine = '//' end
|
||||
|
||||
if EMT.INFO then
|
||||
EmtOutput( sPrefixCommentLine..'('..EMT.INFO..')')
|
||||
@@ -52,6 +55,7 @@ function OnProgramStart()
|
||||
end
|
||||
EmtOutput( sPrefixCommentLine..'('.. CSP_INFO..')')
|
||||
EmtOutput( sPrefixCommentLine..'('.. MACHINE_INFO..')\n')
|
||||
EmtOutput( '(HEADER)')
|
||||
-- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente)
|
||||
if TEST_USE then
|
||||
EmtOutput( 'M28')
|
||||
@@ -107,6 +111,7 @@ function OnProgramEnd()
|
||||
EMT.FALL = nil
|
||||
EMT.RELOAD = nil
|
||||
EMT.RELOAD2 = nil
|
||||
EmtOutput( '(FOOTER)')
|
||||
-- Se modalità test, termino il programma
|
||||
if TEST_USE then
|
||||
EmtOutput( 'M02')
|
||||
@@ -137,6 +142,18 @@ function OnToolData()
|
||||
if EMT.TDIST and abs( EMT.TDIST) < 0.1 then EMT.TDIST = nil end
|
||||
local sOut = 'L11='..EgtNumToString( EMT.SMAX, 0)..' L12='..EmtLenToString( ( EMT.TDIST or ChSawLen), 1)..' G76H9998.1N301N304'
|
||||
EmtOutput( sOut)
|
||||
-- emissione dati rinvio
|
||||
elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' then
|
||||
local nPos = EgtIf( EMT.HEAD == 'H5', 91, 93)
|
||||
if EMT.EXIT == 2 then nPos = nPos + 1 end
|
||||
local sPos = 'N2' .. tostring(nPos)
|
||||
local sOut = 'L11=' .. EmtLenToString( EMT.SMAX, 3) .. ' L12=' .. EmtLenToString( AngTr1Offs, 1)..' G76H9998.1'..sPos..sPos
|
||||
EmtOutput( sOut)
|
||||
-- emissione dati sega a catena
|
||||
elseif EMT.HEAD == 'H7' then
|
||||
local sOut = 'L11='..EgtNumToString( EMT.SMAX, 0)..' L12='..EmtLenToString( ( 154.5), 1)..' G76H9998.1N121N121'
|
||||
EmtOutput( sOut)
|
||||
-- altro non previsto
|
||||
end
|
||||
end
|
||||
|
||||
@@ -155,7 +172,7 @@ function OnDispositionStart()
|
||||
' EG'..EmtLenToString( SawOffs, 2)..' EI'..EmtLenToString( ParkY, 2)..' EL'..EmtLenToString( ParkV, 2)..
|
||||
' EM'..EmtLenToString( TurnerOffs, 2)..' EN'..EmtLenToString( -DeltaTabY, 2)..' EO'..EmtLenToString( DeltaTabZ, 2)
|
||||
if SecondSupport >= 3 then
|
||||
sOut = sOut ..' EP'..EmtLenToString( AngTr1Len, 2) ..' EQ'..EmtLenToString( AngTr1Offs + MillOffs,2)
|
||||
sOut = sOut ..' EP'..EmtLenToString( AngTr1Len, 2) ..' EQ'..EmtLenToString( AngTr1Offs,2)
|
||||
end
|
||||
EmtOutput( '\n' .. sOut .. '\n')
|
||||
-- carico barra
|
||||
@@ -190,9 +207,9 @@ function OnDispositionEnd()
|
||||
local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or EgtGetCurrMachGroup() or GDB_ID.NULL
|
||||
local nLoad90 = EgtGetInfo( BtlInfoId, 'LOAD90', 'i') or 0
|
||||
-- calcolo dati pinze
|
||||
local AccPinze, AccMaxPinze, RidFeed, TempoAcc = CalcDinamicaPinze( HTrave, STrave, LBarra)
|
||||
local AccPinz1, AccMaxPinz1, RidFeed1, TempoAcc1 = CalcDinamicaPinze( HTrave, STrave, LBarra - LTrave)
|
||||
local AccPinz2, AccMaxPinz2, RidFeed2, TempoAcc2 = CalcDinamicaPinze( HTrave, STrave, LTrave)
|
||||
local AccPinze, AccMaxPinze, RidFeed, TempoAcc = CalcDinamicaPinze_NUM( HTrave, STrave, LBarra)
|
||||
local AccPinz1, AccMaxPinz1, RidFeed1, TempoAcc1 = CalcDinamicaPinze_NUM( HTrave, STrave, LBarra - LTrave)
|
||||
local AccPinz2, AccMaxPinz2, RidFeed2, TempoAcc2 = CalcDinamicaPinze_NUM( HTrave, STrave, LTrave)
|
||||
if IdTrave >= 0 then
|
||||
local sOut = '( SN='..IdTrave..' LBarra='..EmtLenToString( LBarra, 3)..' L='..EmtLenToString( LTrave, 3)..
|
||||
' H='..EmtLenToString( HTrave, 3)..' S='..EmtLenToString( STrave, 3)..' Acc='..EgtNumToString( TempoAcc, 1)..
|
||||
@@ -256,9 +273,9 @@ function OnDispositionEnd()
|
||||
EmtOutput( sOut)
|
||||
-- altrimenti recupero rimanenza
|
||||
else
|
||||
EmtOutput( 'G112 EC1'..' Y'..EmtLenToString( LoadT, 3).. ' EY'..EmtLenToString( EMT.YPOS, 3)..' EV'..EmtLenToString( ParkV, 3) ..' EF'..GetFmaxClamp())
|
||||
EmtOutput( 'G112 EC1'..' Y'..EmtLenToString( EMT.TPOS, 3).. ' EY'..EmtLenToString( EMT.YPOS, 3)..' EV'..EmtLenToString( ParkV, 3) ..' EF'..GetFmaxClamp())
|
||||
-- aggiorno dati aggancio carrelli alla trave
|
||||
EMT.YDELTA = EMT.YPOS - LoadT
|
||||
EMT.YDELTA = EMT.YPOS - EMT.TPOS
|
||||
EMT.VDELTA = nil
|
||||
end
|
||||
-- eventuale preparazione per rotazione immediata
|
||||
@@ -422,6 +439,10 @@ function OnMachiningStart()
|
||||
-- sistemazione speed
|
||||
if EMT.HEAD == 'H2' then
|
||||
EMT.S = EMT.S * 6
|
||||
elseif EMT.HEAD == 'H5' and EMT.EXIT == 1 then
|
||||
EMT.S = -EMT.S
|
||||
elseif EMT.HEAD == 'H6' and EMT.EXIT == 1 then
|
||||
EMT.S = -EMT.S
|
||||
end
|
||||
-- determino subito se taglio di separazione di pezzo a caduta
|
||||
EMT.PREFALLCUT = nil
|
||||
@@ -476,7 +497,7 @@ function OnMachiningEnd()
|
||||
end
|
||||
for i = 1, #EMT.AUXSTR do
|
||||
local sOut = EMT.AUXSTR[i]
|
||||
if EMT.AUXTYPE == 'S' then
|
||||
if EMT.AUXTYPE == 'S' and sOut:find( 'G101 ') then
|
||||
sOut = sOut .. ' EH1'
|
||||
elseif EMT.AUXTYPE == 'U' and not EMT.CHY_ON and not sOut:find( 'ET') then
|
||||
sOut = sOut .. ' ET2'
|
||||
@@ -523,6 +544,7 @@ function OnMachiningEnd()
|
||||
EMT.PREVTOOL = EMT.TOOL
|
||||
EMT.PREVHEAD = EMT.HEAD
|
||||
EMT.PREVR3 = EMT.R3
|
||||
EMT.PREVET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -536,6 +558,7 @@ function OnPathStart()
|
||||
-- salvo precedenti rotanti
|
||||
EMT.R1pp = EMT.R1p
|
||||
EMT.R2pp = EMT.R2p
|
||||
EMT.R3pp = EMT.R3p
|
||||
|
||||
-- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento)
|
||||
EmtResetPrev()
|
||||
@@ -630,9 +653,14 @@ end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnRapid()
|
||||
-- recupero prossimo utensile
|
||||
EMT.NEXTTOOL, EMT.NEXTHEAD, EMT.NEXTTCPOS = FindNextTool()
|
||||
MyBackupAxes()
|
||||
-- se primo movimento della lavorazione, gestione speciale
|
||||
if EMT.MCHFIRST and not EMT.OPEISDISP then
|
||||
-- primo posizionamento
|
||||
local MyZHome = EgtGetAxisHomePos( 'Z')
|
||||
local bZmax = ( #EMT.AUXSTR > 0 or EMT.TOOL ~= EMT.PREVTOOL or EMT.L3 > -1)
|
||||
-- decido se muovere prima testa o carrelli (standard prima testa)
|
||||
local bHeadFirst = true
|
||||
local sLateG101
|
||||
@@ -652,15 +680,54 @@ function OnRapid()
|
||||
end
|
||||
end
|
||||
|
||||
-- primo posizionamento
|
||||
local MyZHome = EgtGetAxisHomePos( 'Z')
|
||||
local bZmax = ( #EMT.AUXSTR > 0 or EMT.TOOL ~= EMT.PREVTOOL or EMT.L3 > -1)
|
||||
local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
|
||||
local bGoToHome = false
|
||||
-- se gli assi rotanti cambiano parecchio, con motosega si va in parcheggio
|
||||
if EMT.PREVHEAD == 'H3' and EMT.HEAD == 'H3' and ( sET ~= EMT.PREVET or abs( EMT.R2pp - EMT.R2) > 25 or abs( EMT.R1pp - EMT.R1) > 25) then
|
||||
bGoToHome = true
|
||||
end
|
||||
|
||||
-- ricavo i dati per la lavorazione
|
||||
local sEE = ' EE' .. EgtIf( bZmax, '3', '4')
|
||||
|
||||
local sEL = ' EL'
|
||||
-- se motosega
|
||||
if EMT.HEAD == 'H3' then
|
||||
sEL = sEL..EmtLenToString( ( EMT.TDIST or ChSawLen), 3)
|
||||
-- se aggregato
|
||||
elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' or EMT.HEAD == 'H7' then
|
||||
sEL = sEL..EmtLenToString( AngTr1Offs, 3)
|
||||
-- se testa normale ( H1 or H2)
|
||||
else
|
||||
sEL = sEL..EmtLenToString( EMT.TLEN, 3)
|
||||
end
|
||||
|
||||
local sER = ' ER'
|
||||
-- se motosega
|
||||
if EMT.HEAD == 'H3' then
|
||||
sER = sER..EmtLenToString( EMT.TLEN, 3)
|
||||
-- se aggregato
|
||||
elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' or EMT.HEAD == 'H7' then
|
||||
sER = sER..EmtLenToString( EMT.TLEN + AngTr1Len, 3)
|
||||
-- se testa normale ( H1 or H2)
|
||||
else
|
||||
sER = sER..EmtLenToString( EMT.TDIAM / 2, 3)
|
||||
end
|
||||
|
||||
local sES = ' ES'..EgtNumToString( EMT.S, 0)
|
||||
|
||||
-- se avevo motosega, torno in zona sicura senza ruotare assi rotanti
|
||||
if EMT.PREVHEAD == 'H3' and EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then
|
||||
if not EMT.LOAD and EMT.PREVHEAD == 'H3' and EMT.FLAG2 == 1 then
|
||||
-- se ho ancora motosega, si setta già asse C, altrimenti asse C per andare in home
|
||||
local sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EmtLenToString( EMT.R2pp, 3) .. ' C' .. EmtLenToString( EMT.R1pp, 3) ..
|
||||
' EE' .. EgtIf( bZmax, '3', '4') .. EMT.PREVsEL .. EMT.PREVsER .. EMT.PREVsET .. EMT.PREVsES
|
||||
EmtOutput( sOutPreMove)
|
||||
sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EmtLenToString( 0, 3) .. ' C' .. EmtLenToString( EMT.R1pp, 3) ..
|
||||
' EE' .. EgtIf( bZmax, '3', '4') .. EMT.PREVsEL .. EMT.PREVsER .. EMT.PREVsET .. EMT.PREVsES
|
||||
EmtOutput( sOutPreMove)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
end
|
||||
@@ -670,18 +737,27 @@ function OnRapid()
|
||||
EmtOutput( '( *** ' .. sOut .. ' *** )')
|
||||
end
|
||||
|
||||
-- ricavo i dati per la lavorazione
|
||||
local sEE = ' EE' .. EgtIf( bZmax, '3', '4')
|
||||
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ( EMT.TDIST or ChSawLen)), 3)
|
||||
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
|
||||
local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
local sES = ' ES'..EgtNumToString( EMT.S, 0)
|
||||
|
||||
-- se carico motosega, ruoto in zona sicura prima di approcciare la lavorazione
|
||||
if EMT.HEAD == 'H3' and EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then
|
||||
local sEEPreMove = ' EE' .. EgtIf( bZmax, '3', '4')
|
||||
if EMT.HEAD == 'H3' and EMT.PREVHEAD ~= 'H3' then
|
||||
local sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
EmtGetAxis( 'R2') .. EmtGetAxis( 'R1') .. sEE .. sEL .. sER .. sET .. sES
|
||||
' B' .. EgtNumToString( 0, 3) .. ' C' .. EgtNumToString( EMT.R1, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOutPreMove)
|
||||
sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EgtNumToString( EMT.R2, 3) .. ' C' .. EgtNumToString( EMT.R1, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOutPreMove)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
-- ruoto in zona sicura prima di approcciare la lavorazione
|
||||
elseif not EMT.LOAD and ( EMT.HEAD == 'H3' or ( bZmax and EMT.TTOTLEN > 200)) and
|
||||
( EMT.ST > BeamHeightForFixRot or ( EMT.HEAD == 'H1' and EMT.TTOTLEN > 350) or bGoToHome) and EMT.FLAG2 == 1 then
|
||||
local sOutPreMove
|
||||
if EMT.HEAD == 'H3' and bGoToHome then
|
||||
sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EgtNumToString( 0, 3) .. ' C' .. EgtNumToString( EMT.R1, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOutPreMove)
|
||||
end
|
||||
sOutPreMove = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. ' Z' .. EmtLenToString( MyZHome, 3) ..
|
||||
' B' .. EgtNumToString( EMT.R2, 3) .. ' C' .. EgtNumToString( EMT.R1, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOutPreMove)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
@@ -808,7 +884,7 @@ function OnRapid()
|
||||
sOut = 'G112 EA'..sA..' EB'..sB..EmtGetAxis('L1')..' EY'..sY..' EV'..sV..' EF'..GetFmaxClamp()
|
||||
EmtOutput( sOut)
|
||||
-- se taglio di coda senza residuo da scaricare, emetto M175 per accelerare il carico della barra successiva
|
||||
if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Cut') then
|
||||
if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Cut') and ( IsEndPhase( EMT.PHASE+1) or IsEnd2Phase( EMT.PHASE+1)) then
|
||||
EmtOutput( '(M175)')
|
||||
end
|
||||
if not bHeadFirst then
|
||||
@@ -872,12 +948,47 @@ function OnRapid()
|
||||
EmtAdjustRotaryAxes()
|
||||
EmitZmax( false)
|
||||
EMT.ZMAX = true
|
||||
-- se pezzi alti e devo cambiare utensile su testa con CU, porto la testa vicino al cambio utensile
|
||||
if EMT.ST > BeamHeightForFixRot and EMT.HEAD == 'H1' and EMT.TOOL ~= EMT.NEXTTOOL and EMT.NEXTHEAD ~= 'H2' then
|
||||
local dBAxis = 90
|
||||
local dCAxis = EgtIf( BD.RIGHT_LOAD, 90, -90)
|
||||
local sEE = ' EE3'
|
||||
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ( EMT.TDIST or ChSawLen)), 3)
|
||||
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
|
||||
local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
local sES = ' ES'..EgtNumToString( EMT.S, 0)
|
||||
local sOut = 'G101' .. EmtGetAxis( 'L2') .. EmtGetAxis( 'L3') ..' B' .. EgtNumToString( dBAxis, 3) ..
|
||||
' C' .. EgtNumToString( dCAxis, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
sOut = 'G101' .. ' X' .. EmtLenToString( -SafeXRotAxes, 3) .. EmtGetAxis( 'L3') ..' B' .. EgtNumToString( dBAxis, 3) ..
|
||||
' C' .. EgtNumToString( dCAxis, 3) .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
end
|
||||
-- se altrimenti movimento in Home
|
||||
elseif EMT.FLAG == 4 then
|
||||
-- non previsto
|
||||
-- se altrimenti rotazione a Z max
|
||||
-- se altrimenti rotazione a Z max per lavorazione successiva
|
||||
elseif EMT.FLAG == 5 then
|
||||
-- viene gestito all'inizio della lavorazione successiva
|
||||
EMT.REFLOC = nil
|
||||
EMT.IPLGL = false
|
||||
MyAdjustLinearAxes()
|
||||
EmtAdjustRotaryAxes()
|
||||
EmtResetPrev()
|
||||
-- ricavo i dati per la lavorazione
|
||||
local sEE = ' EE3'
|
||||
local sEL = ' EL' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TLEN, ( EMT.TDIST or ChSawLen)), 3)
|
||||
local sER = ' ER' .. EmtLenToString( EgtIf( EMT.HEAD ~= 'H3', EMT.TDIAM / 2, EMT.TLEN), 3)
|
||||
local sET = GetET( EMT.HEAD, EMT.TCPOS, EMT.R3)
|
||||
local sES = ' ES'..EgtNumToString( EMT.S, 0)
|
||||
local sOut = 'G101' .. EmtGetAxis( 'L2') .. EmtGetAxis( 'L3') ..
|
||||
EmtGetAxis( 'R2') .. EmtGetAxis( 'R1') .. sEE .. sEL .. sER .. sET .. sES
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'G101 ET1001')
|
||||
EmtOutput( 'G101 ET2001')
|
||||
-- altrimenti errore
|
||||
else
|
||||
EmtSetLastError( 1212, "Unknown Rapid flag")
|
||||
@@ -943,6 +1054,11 @@ end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnArc()
|
||||
-- con aggregato non si possono fare archi. Deve essere tutto spezzato
|
||||
if EMT.HEAD == 'H5' or EMT.HEAD == 'H6' or EMT.HEAD == 'H7' then
|
||||
EmtSetLastError( 1211, "With aggregate, the arcs must be splitted")
|
||||
end
|
||||
|
||||
MyBackupAxes()
|
||||
EMT.TLAST = EMT.L1
|
||||
-- non modale su archi
|
||||
@@ -969,33 +1085,44 @@ function OnArc()
|
||||
local sFeed = EmtGetFeed()
|
||||
-- tipo arco
|
||||
local sArc = 'G' .. EgtNumToString(EMT.MOVE,0)
|
||||
-- emetto arco
|
||||
EmtOutput( sArc..sAxes..sRad..sFeed)
|
||||
-- se arco molto grande, approssimo con una retta
|
||||
if EMT.RR > 99999 then
|
||||
EmtOutput( "G1"..sAxes..sFeed)
|
||||
else
|
||||
EmtOutput( sArc..sAxes..sRad..sFeed)
|
||||
end
|
||||
|
||||
-- aggiorno valori come precedenti
|
||||
EmtUpdatePrev()
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function CalcDinamicaPinze( dH, dS, dL)
|
||||
local MinTempoAcc = 0.3 -- [s]
|
||||
local MaxTempoAcc = 4.0 -- [s]
|
||||
local KgMtCubo= 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
|
||||
function FindNextTool()
|
||||
-- salvo stato iniziale
|
||||
local CurrMachId = EgtGetCurrMachining()
|
||||
local CurrTool = EgtTdbGetCurrToolParam( MCH_TP.NAME)
|
||||
-- cerco lavorazione con utensile su gruppo testa indicato
|
||||
local sTool, sHead, sTcPos
|
||||
local OpId = EgtGetNextActiveOperation( CurrMachId or EMT.MCHID)
|
||||
while OpId do
|
||||
local nType = EgtGetOperationType( OpId)
|
||||
if nType ~= MCH_OY.NONE and nType ~= MCH_OY.DISP then
|
||||
if EgtSetCurrMachining( OpId) then
|
||||
sTool = EgtGetMachiningParam( MCH_MP.TOOL)
|
||||
if EgtTdbSetCurrTool( sTool) then
|
||||
sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
|
||||
sTcPos = EgtTdbGetCurrToolParam( MCH_TP.TCPOS)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
OpId = EgtGetNextActiveOperation( OpId)
|
||||
end
|
||||
return AccPinze, AccMaxPinze, RidFeed, TempoAcc
|
||||
-- ripristino stato iniziale
|
||||
EgtSetCurrMachining( CurrMachId or GDB_ID.NULL)
|
||||
EgtTdbSetCurrTool( CurrTool or '')
|
||||
-- restituisco risultato
|
||||
return sTool, sHead, sTcPos
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -1308,7 +1435,7 @@ function PrepareUnload( sCmd)
|
||||
table.insert( EMT.AUXCMD, sMsg)
|
||||
if Cmd[2] == 'V' then
|
||||
-- se non è ultima fase c'è una barra sulla pinza Y (1)
|
||||
local sEE = EgtIf( EMT.PHASE == EgtGetPhaseCount(), '0', '1')
|
||||
local sEE = EgtIf( EMT.PHASE == EgtGetPhaseCount() or IsEnd2Phase( EMT.PHASE), '0', '1')
|
||||
local sOut = 'G111 '..Cmd[2]..Cmd[3]..' EC141 ED83 EE'..sEE..' EF'..GetFmaxClamp()
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
end
|
||||
@@ -1317,7 +1444,7 @@ function PrepareUnload( sCmd)
|
||||
table.insert( EMT.AUXCMD, sMsg)
|
||||
if Cmd[4] == 'V' then
|
||||
-- se non è ultima fase c'è una barra sulla pinza Y (1)
|
||||
local sEAB = EgtIf( EMT.PHASE == EgtGetPhaseCount(), '111', '112')
|
||||
local sEAB = EgtIf( EMT.PHASE == EgtGetPhaseCount() or IsEnd2Phase( EMT.PHASE), '111', '112')
|
||||
local sOut = 'G111 '..Cmd[4]..Cmd[5]..' EA'..sEAB..' EB'..sEAB..' EC142 ED141 EE2 EF'..GetFmaxClamp()
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
EMT.U_STD = true
|
||||
@@ -1477,10 +1604,13 @@ function PreparePostRotation( sCmd)
|
||||
elseif nVDelta > 0 then
|
||||
EMT.YDELTA = nil
|
||||
EMT.VDELTA = nVDelta
|
||||
end
|
||||
local sYLoad = ' Y'..EmtLenToString( LoadT)
|
||||
local sOut = 'G111'..sYLoad..' EA76'..EMT.SB..' EE0 EF'..EmtLenToString( EMT.FMAXPINZE,0)..' ET1'
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
end
|
||||
local sYLoad = ' Y'..EmtLenToString( LoadT)
|
||||
local sOut = 'G111'..sYLoad..' EA76'..EMT.SB..' EE0 EF'..EmtLenToString( EMT.FMAXPINZE,0)..' ET1'
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
-- setto parametri di pinzaggio reali
|
||||
EMT.SA = ' EA110'
|
||||
EMT.SE = ' EE1'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1522,16 +1652,29 @@ function MyAdjustLinearAxes()
|
||||
|
||||
if EMT.REFLOC then
|
||||
local vtE
|
||||
if EMT.HEAD ~= 'H3' then
|
||||
if EMT.HEAD == 'H1' or EMT.HEAD == 'H2' then
|
||||
local Len = EMT.TLEN + EgtIf( EMT.HEAD == 'H1', MillOffs, abs( SawOffs))
|
||||
local LenRef = MillOffs
|
||||
vtE = Vector3d( EMT.EXTR) * Len - Z_AX() * LenRef
|
||||
else
|
||||
vtE = Vector3d( EMT.TDIR) * Len - Z_AX() * LenRef
|
||||
elseif EMT.HEAD == 'H3' then
|
||||
local LenAux = ( EMT.TDIST or ChSawLen) + MillOffs
|
||||
local LenRef = MillOffs
|
||||
local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
|
||||
vtE = vtAux * LenAux - Z_AX() * LenRef
|
||||
elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' then
|
||||
local LenAux = AngTr1Offs + MillOffs
|
||||
local LenRef = MillOffs
|
||||
local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
|
||||
vtE = vtAux * LenAux - Z_AX() * LenRef
|
||||
elseif EMT.HEAD == 'H7' then
|
||||
local LenAux = AngTrBHOffs + MillOffs
|
||||
local LenRef = MillOffs
|
||||
local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
|
||||
vtE = vtAux * LenAux - Z_AX() * LenRef
|
||||
else
|
||||
EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD)
|
||||
end
|
||||
|
||||
EMT.L1 = EMT.L1 - vtE:getX()
|
||||
EMT.L2 = EMT.L2 - DeltaTabY - vtE:getY()
|
||||
EMT.L3 = EMT.L3 - DeltaTabZ - vtE:getZ()
|
||||
@@ -1571,7 +1714,7 @@ function CalcInterpPlane()
|
||||
local ptS = Point3d( xS, 0, 0)
|
||||
-- calcolo per piano generico
|
||||
local vtE
|
||||
if EMT.HEAD ~= 'H3' then
|
||||
if EMT.HEAD == 'H1' or EMT.HEAD == 'H2' then
|
||||
vtE = Vector3d( EMT.EXTR)
|
||||
else
|
||||
vtE = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
|
||||
@@ -1622,7 +1765,7 @@ end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function GetET( sHead, sTcPos, dAxR3)
|
||||
if sHead == 'H1' then
|
||||
if sHead == 'H1' or sHead == 'H5' or sHead == 'H6' or sHead == 'H7' then
|
||||
return ' E'..sTcPos
|
||||
elseif sHead == 'H2' then
|
||||
return ' ET42'
|
||||
@@ -3,9 +3,10 @@
|
||||
|
||||
-- carico librerie
|
||||
local INFO_STD_PP = require( 'Version')
|
||||
local BD = require( 'BeamData')
|
||||
|
||||
-- Variabili di modulo
|
||||
local CSP_INFO = INFO_STD_PP.NAME..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.'
|
||||
local CSP_INFO = INFO_STD_PP.NAME..'_'..NumericalControl..' ver.'..INFO_STD_PP.VERSION..' by EgalWare s.r.l.'
|
||||
local MACHINE_INFO = MACH_NAME..' ver.'..PP_VER
|
||||
local TEST_USE = false
|
||||
|
||||
@@ -20,14 +21,19 @@ function OnStart()
|
||||
EMT.USETO1 = false -- abilitazione uso origine tavola
|
||||
EMT.MODAL = true -- abilitazione emissione modale
|
||||
EMT.INCHES = false -- unità di misura mm/inches
|
||||
EMT.DECNUM = 5 -- numero di decimali dopo la virgola
|
||||
EMT.DECNUM = 4 -- numero di decimali dopo la virgola
|
||||
EMT.DECVERS = 6 -- numero di decimali dopo la virgola per versori
|
||||
EMT.DECRAD = 4 -- numero di decimali dopo la virgola per raggio
|
||||
EMT.DECMACRO = 3 -- numero di decimali dopo la virgola per macro
|
||||
EMT.NUM = false -- abilitazione numerazione linee
|
||||
--EMT.Nt = 'N' -- token per la numerazione di linea
|
||||
--EMT.LINENBR = 0 -- numero di linea
|
||||
--EMT.LINEINC = 1 -- incremento numerazione linee
|
||||
--EMT.Ft = 'F' -- token per feed
|
||||
--EMT.St = 'S' -- token per speed
|
||||
EMT.FMAXPINZE = 154000 -- feed massima pinze
|
||||
--EMT.Nt = 'N' -- token per la numerazione di linea
|
||||
--EMT.LINENBR = 0 -- numero di linea
|
||||
--EMT.LINEINC = 1 -- incremento numerazione linee
|
||||
--EMT.Ft = 'F' -- token per feed
|
||||
--EMT.St = 'S' -- token per speed
|
||||
EMT.FMAXPINZE = EgtClamp( MaxFeedPinze or 154000, 20000, 160000) -- feed massima pinze
|
||||
EMT.MAXACC = MaxAcc or 4000 -- accelerazione massima pinze. In realtà è il tempo in millisecondi, quindi MAXACC corrisponde al tempo massimo per raggiungere la velocità desiderata
|
||||
EMT.MINACC = MinAcc or 300 -- accelerazione minima pinze. In realtà è il tempo in millisecondi, quindi MINACC corrisponde al tempo massimo per raggiungere la velocità desiderata
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -40,7 +46,7 @@ end
|
||||
function OnProgramStart()
|
||||
|
||||
-- aggiungo prefisso per commentae commenti iniziali se la macchina è utilizzata per fare i test
|
||||
local sPrefixCommentLine = '' ; if IS_TEST_MACHINE then sPrefixCommentLine = '//' end
|
||||
local sPrefixCommentLine = '' ; if IS_TEST_MACHINE or EgtEndsWith( EgtGetCurrMachineDir(), '.TEST') then sPrefixCommentLine = '//' end
|
||||
|
||||
-- Intestazioni
|
||||
if EMT.INFO then
|
||||
@@ -50,6 +56,7 @@ function OnProgramStart()
|
||||
end
|
||||
ParkLine( sPrefixCommentLine..'('.. CSP_INFO..')')
|
||||
ParkLine( sPrefixCommentLine..'('.. MACHINE_INFO..')')
|
||||
ParkLine( '(HEADER)')
|
||||
|
||||
-- Se modalità test, aggiungo linee per muovere tappeto e alzare la testa (in automatico viene fatto dal main residente)
|
||||
if TEST_USE then
|
||||
@@ -107,6 +114,7 @@ function OnProgramEnd()
|
||||
EMT.FALL = nil
|
||||
EMT.RELOAD = nil
|
||||
EMT.RELOAD2 = nil
|
||||
EmtOutput( '(FOOTER)')
|
||||
-- Termino il programma
|
||||
EmtOutput( 'M02')
|
||||
end
|
||||
@@ -115,8 +123,8 @@ end
|
||||
function OnToolData()
|
||||
-- emissione dati utensili
|
||||
if EMT.HEAD == 'H1' then
|
||||
local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, 3)
|
||||
local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( EMT.TLEN, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( EMT.TDIAM, EMT.DECMACRO) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, EMT.DECMACRO) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, EMT.DECMACRO)
|
||||
ParkLine( sOut)
|
||||
-- cerco posizione di attrezzaggio del primo utensile di lavorazione
|
||||
if EMT.TOOL == EMT.TOOL_1 and EMT.TLEN_1 < LONG_TOOL_MINLEN then
|
||||
@@ -124,14 +132,14 @@ function OnToolData()
|
||||
end
|
||||
-- emissione dati lama
|
||||
elseif EMT.HEAD == 'H2' then
|
||||
local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, 3)
|
||||
local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( EMT.TLEN, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( EMT.TDIAM, EMT.DECMACRO) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, EMT.DECMACRO) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, EMT.DECMACRO)
|
||||
ParkLine( sOut)
|
||||
-- emissione dati sega a catena
|
||||
elseif EMT.HEAD == 'H3' then
|
||||
if EMT.TDIST and abs( EMT.TDIST) < 0.1 then EMT.TDIST = nil end
|
||||
local sData = ' P2=' .. EmtLenToString( ( EMT.TDIST or ChSawLen), 3) .. ' P3=' .. EmtLenToString( EMT.TLEN, 3) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( ( EMT.TDIST or ChSawLen), 3)
|
||||
local sData = ' P2=' .. EmtLenToString( ( EMT.TDIST or ChSawLen), EMT.DECMACRO) .. ' P3=' .. EmtLenToString( EMT.TLEN, EMT.DECMACRO) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, EMT.DECMACRO) .. ' P5=' .. EmtLenToString( ( EMT.TDIST or ChSawLen), EMT.DECMACRO)
|
||||
if EMT.TCPOS == 'T101' then
|
||||
ParkLine( 'M992 P1=101' .. sData)
|
||||
ParkLine( 'M992 P1=102' .. sData)
|
||||
@@ -147,10 +155,15 @@ function OnToolData()
|
||||
elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' then
|
||||
local nPos = EgtIf( EMT.HEAD == 'H5', 91, 93)
|
||||
if EMT.EXIT == 2 then nPos = nPos + 1 end
|
||||
local sOut = 'M992 P1=' .. EgtNumToString( nPos, 0) .. ' P2=' .. EmtLenToString( EMT.TLEN, 3) .. ' P3=' .. EmtLenToString( EMT.TDIAM, 3) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, 3) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, 3)
|
||||
local sOut = 'M992 P1=' .. EgtNumToString( nPos, 0) .. ' P2=' .. EmtLenToString( EMT.TLEN, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( EMT.TDIAM, EMT.DECMACRO) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, EMT.DECMACRO) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, EMT.DECMACRO)
|
||||
ParkLine( sOut)
|
||||
-- altro non previsto
|
||||
-- emissione dati sega a catena
|
||||
elseif EMT.HEAD == 'H7' then
|
||||
local sOut = 'M992 P1=' .. EMT.TCPOS:gsub( 'T', '') .. ' P2=' .. EmtLenToString( EMT.TLEN, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( EMT.TDIAM, EMT.DECMACRO) ..
|
||||
' P4=' .. EmtLenToString( EMT.SMAX, EMT.DECMACRO) .. ' P5=' .. EmtLenToString( EMT.TTOTLEN, EMT.DECMACRO)
|
||||
ParkLine( sOut)
|
||||
-- altro non previsto
|
||||
else
|
||||
EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD)
|
||||
end
|
||||
@@ -212,14 +225,14 @@ function OnDispositionEnd()
|
||||
local HOverM = EMT.HOVM
|
||||
|
||||
-- calcolo dati pinze
|
||||
local TempAccPinze, TempMinAccPinze, RidFeed = CalcDinamicaPinze( HTrave, STrave, LBarra)
|
||||
local TempAccPinz1, TempMinAccPinz1, RidFeed1 = CalcDinamicaPinze( HTrave, STrave, LBarra - LTrave)
|
||||
local TempAccPinz2, TempMinAccPinz2, RidFeed2 = CalcDinamicaPinze( HTrave, STrave, LTrave)
|
||||
local TempAccPinze, TempMinAccPinze, RidFeed = CalcDinamicaPinze_TPA( HTrave, STrave, LBarra)
|
||||
local TempAccPinz1, TempMinAccPinz1, RidFeed1 = CalcDinamicaPinze_TPA( HTrave, STrave, LBarra - LTrave)
|
||||
local TempAccPinz2, TempMinAccPinz2, RidFeed2 = CalcDinamicaPinze_TPA( HTrave, STrave, LTrave)
|
||||
|
||||
if IdTrave >= 0 then
|
||||
local sPrt = '( *** Part '.. EgtNumToString( IdTrave, 0) ..' ***)'
|
||||
local sOut = '( SN=' .. IdTrave .. ' LBarra=' .. EmtLenToString( LBarra, 3) .. ' L='..EmtLenToString( LTrave, 3) ..
|
||||
' H=' .. EmtLenToString( HTrave, 3) .. ' S=' .. EmtLenToString( STrave, 3) .. ' )'
|
||||
local sOut = '( SN=' .. IdTrave .. ' LBarra=' .. EmtLenToString( LBarra, EMT.DECMACRO) .. ' L='..EmtLenToString( LTrave, EMT.DECMACRO) ..
|
||||
' H=' .. EmtLenToString( HTrave, EMT.DECMACRO) .. ' S=' .. EmtLenToString( STrave, EMT.DECMACRO) .. ' )'
|
||||
EMT.PRODID = EgtGetInfo( BtlInfoId, 'PRODID', 'i') or 0
|
||||
EMT.PATTID = EgtGetInfo( BtlInfoId, 'PATTID', 'i') or 0
|
||||
EMT.CUTID = EgtGetInfo( EMT.IDT, 'CUTID', 'i') or 0
|
||||
@@ -262,9 +275,9 @@ function OnDispositionEnd()
|
||||
' P4=' .. EmtLenToString( HOverM, 2) .. ' P5=' .. tostring( nLoad90) .. ' P6=' .. EmtLenToString( EgtIf( IdTrave >= 0, LTrave, LBarra), 2) ..
|
||||
' P7=' .. EgtNumToString( TempAccPinze, 2) .. ' P8=' .. EgtNumToString( TempAccPinz2, 2) .. ' P9=' .. EgtNumToString( TempAccPinz1, 2)
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'M112'..' P1='..EmtLenToString( LoadT, 3).. ' P5=1 P6='..EmtLenToString( EMT.YPOS, 3)..' P7='..EmtLenToString( ParkV, 3) ..' P9='..GetFmaxClamp())
|
||||
EmtOutput( 'M112'..' P1='..EmtLenToString( EMT.TPOS, 3).. ' P5=1 P6='..EmtLenToString( EMT.YPOS, 3)..' P7='..EmtLenToString( ParkV, 3) ..' P9='..GetFmaxClamp())
|
||||
-- aggiorno dati aggancio carrelli alla trave
|
||||
EMT.YDELTA = EMT.YPOS - LoadT
|
||||
EMT.YDELTA = EMT.YPOS - EMT.TPOS
|
||||
EMT.VDELTA = nil
|
||||
end
|
||||
-- eventuale preparazione per rotazione immediata
|
||||
@@ -512,6 +525,9 @@ function OnMachiningEnd()
|
||||
EMT.PREVTOOL = EMT.TOOL
|
||||
EMT.PREVHEAD = EMT.HEAD
|
||||
EMT.PREVS = EMT.S
|
||||
-- salvo posizione
|
||||
EMT.PREVTCPOS = AdjustTcPos( false)
|
||||
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -526,6 +542,7 @@ function OnPathStart()
|
||||
-- salvo precedenti rotanti
|
||||
EMT.R1pp = EMT.R1p
|
||||
EMT.R2pp = EMT.R2p
|
||||
EMT.R3pp = EMT.R3p
|
||||
|
||||
-- reset valori precedenti (per forzare emissione di tutti gli assi del 1° movimento)
|
||||
EmtResetPrev()
|
||||
@@ -625,6 +642,8 @@ end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnRapid()
|
||||
-- recupero prossimo utensile
|
||||
EMT.NEXTTOOL, EMT.NEXTHEAD, EMT.NEXTTCPOS = FindNextTool()
|
||||
MyBackupAxes()
|
||||
-- se primo movimento della lavorazione, gestione speciale
|
||||
if EMT.MCHFIRST and not EMT.OPEISDISP then
|
||||
@@ -643,16 +662,30 @@ function OnRapid()
|
||||
bHeadFirst = false
|
||||
end
|
||||
end
|
||||
|
||||
local sTcPosReal = AdjustTcPos( false)
|
||||
|
||||
local bGoToHome = false
|
||||
-- se gli assi rotanti cambiano parecchio, con motosega si va in parcheggio
|
||||
if EMT.PREVHEAD == 'H3' and EMT.HEAD == 'H3' and ( sTcPosReal ~= EMT.PREVTCPOS or abs( EMT.R2pp - EMT.R2) > 25 or abs( EMT.R1pp - EMT.R1) > 25) then
|
||||
bGoToHome = true
|
||||
end
|
||||
|
||||
-- primo posizionamento
|
||||
local MyZHome = EgtGetAxisHomePos( 'Z')
|
||||
local bZmax = ( #EMT.AUXSTR > 0 or EMT.TOOL ~= EMT.PREVTOOL or EMT.L3 > -1)
|
||||
-- se avevo motosega, torno in zona sicura senza ruotare assi rotanti
|
||||
if EMT.PREVHEAD == 'H3' and EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then
|
||||
local sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, 3) .. ' P3=' .. EmtLenToString( MyZHome, 3) ..
|
||||
' P4=' .. EgtNumToString( EMT.R2pp, 3) .. ' P5=' .. EgtNumToString( EMT.R1pp, 3) ..
|
||||
' P6=' .. EgtNumToString( EMT.PREVTCPOS, 3) .. ' P7=' .. EgtNumToString( EMT.PREVS, 0) ..
|
||||
if not EMT.LOAD and EMT.PREVHEAD == 'H3' and EMT.FLAG2 == 1 then
|
||||
local sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( MyZHome, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( EMT.R2pp, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( EMT.R1pp, EMT.DECMACRO) ..
|
||||
' P6=' .. EgtNumToString( EMT.PREVTCPOS, EMT.DECMACRO) .. ' P7=' .. EgtNumToString( EMT.PREVS, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4')
|
||||
EmtOutput( sOutPreMove)
|
||||
sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( MyZHome, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( 0, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( EMT.R1pp, EMT.DECMACRO) ..
|
||||
' P6=' .. EgtNumToString( EMT.PREVTCPOS, EMT.DECMACRO) .. ' P7=' .. EgtNumToString( EMT.PREVS, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4')
|
||||
EmtOutput( sOutPreMove)
|
||||
EmtOutput( 'M101 P1=2')
|
||||
EmtOutput( 'M101 P1=3')
|
||||
end
|
||||
@@ -663,9 +696,41 @@ function OnRapid()
|
||||
end
|
||||
|
||||
-- se carico motosega, ruoto in zona sicura prima di approcciare la lavorazione
|
||||
if EMT.HEAD == 'H3' and EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then
|
||||
local sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, 3) .. ' P3=' .. EmtLenToString( MyZHome, 3) ..
|
||||
' P4=' .. EgtNumToString( EMT.R2, 3) .. ' P5=' .. EgtNumToString( EMT.R1, 3) ..
|
||||
if EMT.HEAD == 'H3' and EMT.PREVHEAD ~= 'H3' then
|
||||
local sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( MyZHome, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( 0, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( EMT.R1, EMT.DECMACRO) ..
|
||||
' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4')
|
||||
if EMT.LOAD then
|
||||
ParkLine( sOutPreMove)
|
||||
else
|
||||
EmtOutput( sOutPreMove)
|
||||
end
|
||||
sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( MyZHome, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( EMT.R2, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( EMT.R1, EMT.DECMACRO) ..
|
||||
' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4')
|
||||
if EMT.LOAD then
|
||||
ParkLine( sOutPreMove)
|
||||
ParkLine( 'M101 P1=2')
|
||||
ParkLine( 'M101 P1=3')
|
||||
else
|
||||
EmtOutput( sOutPreMove)
|
||||
EmtOutput( 'M101 P1=2')
|
||||
EmtOutput( 'M101 P1=3')
|
||||
end
|
||||
elseif not EMT.LOAD and ( EMT.HEAD == 'H3' or ( bZmax and EMT.TTOTLEN > 200)) and
|
||||
( EMT.ST > BeamHeightForFixRot or ( EMT.HEAD == 'H1' and EMT.TTOTLEN > 350) or bGoToHome) and EMT.FLAG2 == 1 then
|
||||
local sOutPreMove
|
||||
if EMT.HEAD == 'H3' and bGoToHome then
|
||||
sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( MyZHome, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( 0, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( EMT.R1, EMT.DECMACRO) ..
|
||||
' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4')
|
||||
EmtOutput( sOutPreMove)
|
||||
end
|
||||
sOutPreMove = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( MyZHome, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( EMT.R2, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( EMT.R1, EMT.DECMACRO) ..
|
||||
' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4')
|
||||
EmtOutput( sOutPreMove)
|
||||
@@ -679,8 +744,8 @@ function OnRapid()
|
||||
if EMT.ST > BeamHeightForFixRot and EMT.FLAG2 == 1 then
|
||||
MyZPos = MyZHome
|
||||
end
|
||||
local sOut = 'M101 P1=1' .. ' P2=' .. EmtLenToString( EMT.L2, 3) .. ' P3=' .. EmtLenToString( MyZPos, 3) ..
|
||||
' P4=' .. EgtNumToString( EMT.R2, 3) .. ' P5=' .. EgtNumToString( EMT.R1, 3) ..
|
||||
local sOut = 'M101 P1=1' .. ' P2=' .. EmtLenToString( EMT.L2, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( MyZPos, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( EMT.R2, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( EMT.R1, EMT.DECMACRO) ..
|
||||
' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=' .. EgtIf( bZmax, '3', '4')
|
||||
if EMT.LOAD then
|
||||
@@ -730,7 +795,7 @@ function OnRapid()
|
||||
sV = EmtLenToString( ParkV)
|
||||
sB = '2'
|
||||
end
|
||||
sOut = 'M112 P1='..EmtLenToString( EMT.L1, 3)..' P3='..sA..' P4='..sB..' P5=0 P6='..sY..' P7='..sV..' P9='..GetFmaxClamp()
|
||||
sOut = 'M112 P1='..EmtLenToString( EMT.L1, EMT.DECMACRO)..' P3='..sA..' P4='..sB..' P5=0 P6='..sY..' P7='..sV..' P9='..GetFmaxClamp()
|
||||
ParkLine( sOut)
|
||||
EMT.LOAD = false
|
||||
-- emissione prime linee speciali e linee parcheggiate
|
||||
@@ -774,14 +839,14 @@ function OnRapid()
|
||||
sB = '2'
|
||||
end
|
||||
-- se taglio di coda senza residuo da scaricare, emetto M175 per accelerare il carico della barra successiva
|
||||
if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Cut') then
|
||||
if EMT.MCHUSERNOTES and EMT.MCHUSERNOTES:find( 'Cut') and ( IsEndPhase( EMT.PHASE+1) or IsEnd2Phase( EMT.PHASE+1)) then
|
||||
EmtOutput( 'M175')
|
||||
end
|
||||
if bHeadFirst then
|
||||
sOut = 'M101 P1=3'
|
||||
EmtOutput( sOut)
|
||||
end
|
||||
sOut = 'M112 P1=' .. EmtLenToString( EMT.L1, 3) ..' P3='..sA..' P4='..sB..' P6='..sY..' P7='..sV..' P9=' .. GetFmaxClamp()
|
||||
sOut = 'M112 P1=' .. EmtLenToString( EMT.L1, EMT.DECMACRO) ..' P3='..sA..' P4='..sB..' P6='..sY..' P7='..sV..' P9=' .. GetFmaxClamp()
|
||||
EmtOutput( sOut)
|
||||
if not bHeadFirst then
|
||||
sOut = 'M101 P1=2'
|
||||
@@ -849,12 +914,42 @@ function OnRapid()
|
||||
EmtAdjustRotaryAxes()
|
||||
EmitZmax( true)
|
||||
EMT.ZMAX = true
|
||||
-- se pezzi alti e devo cambiare utensile su testa con CU, porto la testa vicino al cambio utensile
|
||||
if EMT.ST > BeamHeightForFixRot and EMT.HEAD == 'H1' and EMT.TOOL ~= EMT.NEXTTOOL and EMT.NEXTHEAD ~= 'H2' then
|
||||
local dBAxis = 90
|
||||
local dCAxis = EgtIf( BD.RIGHT_LOAD, 90, -90)
|
||||
local sOut = 'M101 P1=1' .. ' P2=' .. EmtLenToString( EMT.L2, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( EMT.L3, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( dBAxis, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( dCAxis, EMT.DECMACRO) ..
|
||||
' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=3'
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'M101 P1=2')
|
||||
EmtOutput( 'M101 P1=3')
|
||||
sOut = 'M101 P1=1' .. ' P2=' .. EmtLenToString( -SafeXRotAxes, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( EMT.L3, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( dBAxis, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( dCAxis, EMT.DECMACRO) ..
|
||||
' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=3'
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'M101 P1=2')
|
||||
EmtOutput( 'M101 P1=3')
|
||||
end
|
||||
-- se altrimenti movimento in Home
|
||||
elseif EMT.FLAG == 4 then
|
||||
-- non previsto
|
||||
-- se altrimenti rotazione a Z max
|
||||
-- se altrimenti rotazione a Z max per lavorazione successiva
|
||||
elseif EMT.FLAG == 5 then
|
||||
-- viene gestito all'inizio della lavorazione successiva
|
||||
EMT.REFLOC = nil
|
||||
EMT.IPLGL = false
|
||||
MyAdjustLinearAxes()
|
||||
EmtAdjustRotaryAxes()
|
||||
EmtResetPrev()
|
||||
local sOut = 'M101 P1=1' .. ' P2=' .. EmtLenToString( EMT.L2, EMT.DECMACRO) .. ' P3=' .. EmtLenToString( EMT.L3, EMT.DECMACRO) ..
|
||||
' P4=' .. EgtNumToString( EMT.R2, EMT.DECMACRO) .. ' P5=' .. EgtNumToString( EMT.R1, EMT.DECMACRO) ..
|
||||
' P6=' .. AdjustTcPos( false) .. ' P7=' .. EgtNumToString( EMT.S, 0) ..
|
||||
' P8=0' .. ' P9=0' .. ' P10=3'
|
||||
EmtOutput( sOut)
|
||||
EmtOutput( 'M101 P1=2')
|
||||
EmtOutput( 'M101 P1=3')
|
||||
-- altrimenti errore
|
||||
else
|
||||
error( "Unknown Rapid flag")
|
||||
@@ -969,7 +1064,7 @@ function OnArc()
|
||||
--local sCen = ' ' .. EMT.C1t .. EmtLenToString(EMT.C1,3) ..
|
||||
-- ' ' .. EMT.C2t .. EmtLenToString(EMT.C2,3)
|
||||
-- raggio
|
||||
local sRad = ' ' .. EMT.RRt .. EmtLenToString( EMT.RR, EMT.DECNUM)
|
||||
local sRad = ' ' .. EMT.RRt .. EmtLenToString( EMT.RR, EMT.DECRAD)
|
||||
-- aggiungo feed
|
||||
local sFeed = EmtGetFeed()
|
||||
-- tipo arco
|
||||
@@ -982,25 +1077,32 @@ function OnArc()
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function CalcDinamicaPinze( dH, dS, dL)
|
||||
local MinTempoAcc = 0.3 -- [s]
|
||||
local MaxTempoAcc = 4.0 -- [s]
|
||||
local KgMtCubo= 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
|
||||
function FindNextTool()
|
||||
-- salvo stato iniziale
|
||||
local CurrMachId = EgtGetCurrMachining()
|
||||
local CurrTool = EgtTdbGetCurrToolParam( MCH_TP.NAME)
|
||||
-- cerco lavorazione con utensile su gruppo testa indicato
|
||||
local sTool, sHead, sTcPos
|
||||
local OpId = EgtGetNextActiveOperation( CurrMachId or EMT.MCHID)
|
||||
while OpId do
|
||||
local nType = EgtGetOperationType( OpId)
|
||||
if nType ~= MCH_OY.NONE and nType ~= MCH_OY.DISP then
|
||||
if EgtSetCurrMachining( OpId) then
|
||||
sTool = EgtGetMachiningParam( MCH_MP.TOOL)
|
||||
if EgtTdbSetCurrTool( sTool) then
|
||||
sHead = EgtTdbGetCurrToolParam( MCH_TP.HEAD)
|
||||
sTcPos = EgtTdbGetCurrToolParam( MCH_TP.TCPOS)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
OpId = EgtGetNextActiveOperation( OpId)
|
||||
end
|
||||
return TempoAcc * 1000, MinTempoAcc * 1000, RidFeed
|
||||
-- ripristino stato iniziale
|
||||
EgtSetCurrMachining( CurrMachId or GDB_ID.NULL)
|
||||
EgtTdbSetCurrTool( CurrTool or '')
|
||||
-- restituisco risultato
|
||||
return sTool, sHead, sTcPos
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -1524,10 +1626,13 @@ function PreparePostRotation( sCmd)
|
||||
elseif nVDelta > 0 then
|
||||
EMT.YDELTA = nil
|
||||
EMT.VDELTA = nVDelta
|
||||
end
|
||||
local sYLoad = ' P2='..EmtLenToString( LoadT)
|
||||
local sOut = 'M111 P1=11'..sYLoad..' P4=76'..EMT.SB..' P8=0 P9='..GetFmaxClamp()
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
end
|
||||
local sYLoad = ' P2='..EmtLenToString( LoadT)
|
||||
local sOut = 'M111 P1=11'..sYLoad..' P4=76'..EMT.SB..' P8=0 P9='..GetFmaxClamp()
|
||||
table.insert( EMT.AUXSTR, sOut)
|
||||
-- setto parametri di pinzaggio reali
|
||||
EMT.SA = ' P4=110'
|
||||
EMT.SE = ' P8=1'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1572,18 +1677,24 @@ function MyAdjustLinearAxes()
|
||||
if EMT.HEAD == 'H1' or EMT.HEAD == 'H2' then
|
||||
local Len = EMT.TLEN + EgtIf( EMT.HEAD == 'H1', MillOffs, abs( SawOffs))
|
||||
local LenRef = MillOffs
|
||||
vtE = Vector3d( EMT.EXTR) * Len - Z_AX() * LenRef
|
||||
vtE = Vector3d( EMT.TDIR) * Len - Z_AX() * LenRef
|
||||
elseif EMT.HEAD == 'H3' then
|
||||
local LenAux = ( EMT.TDIST or ChSawLen) + MillOffs
|
||||
local LenRef = MillOffs
|
||||
local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2, EMT.R3)
|
||||
vtE = vtAux * LenAux - Z_AX() * LenRef
|
||||
elseif EMT.HEAD == 'H5' then
|
||||
elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' then
|
||||
local Len = EMT.TLEN + AngTr1Len
|
||||
local LenAux = MillOffs + AngTr1Offs
|
||||
local LenRef = MillOffs
|
||||
local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2)
|
||||
vtE = Vector3d( EMT.EXTR) * Len + vtAux * LenAux - Z_AX() * LenRef
|
||||
vtE = Vector3d( EMT.TDIR) * Len + vtAux * LenAux - Z_AX() * LenRef
|
||||
elseif EMT.HEAD == 'H7' then
|
||||
local Len = EMT.TLEN + AngTrBHLen
|
||||
local LenAux = MillOffs + AngTrBHOffs
|
||||
local LenRef = MillOffs
|
||||
local vtAux = EgtGetCalcAuxDirFromAngles( EMT.R1, EMT.R2)
|
||||
vtE = Vector3d( EMT.TDIR) * Len + vtAux * LenAux - Z_AX() * LenRef
|
||||
else
|
||||
EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD)
|
||||
end
|
||||
@@ -1620,6 +1731,8 @@ function AdjustToolKinematic()
|
||||
return EgtIf( EMT.EXIT == 1, '11', '12')
|
||||
elseif EMT.HEAD == 'H6' then
|
||||
return EgtIf( EMT.EXIT == 1, '21', '22')
|
||||
elseif EMT.HEAD == 'H7' then
|
||||
return '31'
|
||||
else
|
||||
EmtSetLastError( 1211, 'Head not allowed ' .. EMT.HEAD)
|
||||
end
|
||||
@@ -1668,8 +1781,6 @@ function AdjustTcPos( bLen3)
|
||||
sPos = '0' .. sPos
|
||||
end
|
||||
end
|
||||
-- salvo posizione
|
||||
EMT.PREVTCPOS = sPos
|
||||
return sPos
|
||||
end
|
||||
|
||||
@@ -1692,9 +1803,9 @@ function CalcInterpPlane()
|
||||
local vtY = EMT.IPLGLFR:getVersY()
|
||||
local vtZ = EMT.IPLGLFR:getVersZ()
|
||||
EMT.IPLGLSTR = ' X0 Y' .. EmtLenToString( xS, EMT.DECNUM) .. ' Z0' ..
|
||||
' A' .. EgtNumToString( - vtX:getY(), 6) .. ' B' .. EgtNumToString( vtX:getX(), 6) .. ' C' .. EgtNumToString( vtX:getZ(), 6) ..
|
||||
' I' .. EgtNumToString( - vtY:getY(), 6) .. ' J' .. EgtNumToString( vtY:getX(), 6) .. ' K' .. EgtNumToString( vtY:getZ(), 6) ..
|
||||
' P' .. EgtNumToString( - vtZ:getY(), 6) .. ' Q' .. EgtNumToString( vtZ:getX(), 6) .. ' R' .. EgtNumToString( vtZ:getZ(), 6)
|
||||
' A' .. EgtNumToString( - vtX:getY(), EMT.DECVERS) .. ' B' .. EgtNumToString( vtX:getX(), EMT.DECVERS) .. ' C' .. EgtNumToString( vtX:getZ(), EMT.DECVERS) ..
|
||||
' I' .. EgtNumToString( - vtY:getY(), EMT.DECVERS) .. ' J' .. EgtNumToString( vtY:getX(), EMT.DECVERS) .. ' K' .. EgtNumToString( vtY:getZ(), EMT.DECVERS) ..
|
||||
' P' .. EgtNumToString( - vtZ:getY(), EMT.DECVERS) .. ' Q' .. EgtNumToString( vtZ:getX(), EMT.DECVERS) .. ' R' .. EgtNumToString( vtZ:getZ(), EMT.DECVERS)
|
||||
EMT.IPLGL = true
|
||||
end
|
||||
|
||||
+522
-104
@@ -7,19 +7,16 @@ EgtEnableDebug( false)
|
||||
-- carico librerie
|
||||
local BD = require( 'BeamData')
|
||||
|
||||
LONG_TOOL_MINLEN = 221
|
||||
BIG_TOOL_DIAM = 300
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- *** GENERATION ***
|
||||
---------------------------------------------------------------------
|
||||
local sBaseDir = EgtGetCurrMachineDir()
|
||||
if NumericalControl == 'NUM' then
|
||||
dofile( sBaseDir .. '\\Common-FAST.NUM.mlpe')
|
||||
dofile( sBaseDir .. '\\Common_FAST.NUM.mlpe')
|
||||
elseif NumericalControl == 'TPA' then
|
||||
dofile( sBaseDir .. '\\Common-FAST.TPA.mlpe')
|
||||
dofile( sBaseDir .. '\\Common_FAST.TPA.mlpe')
|
||||
elseif NumericalControl == 'NUM_PLUS' then
|
||||
dofile( sBaseDir .. '\\Common-FAST.NUM_PLUS.mlpe')
|
||||
dofile( sBaseDir .. '\\Common_FAST.NUM_PLUS.mlpe')
|
||||
else
|
||||
EmtSetLastError( 1201, 'Numerical Control error : unkwnown type')
|
||||
end
|
||||
@@ -82,6 +79,14 @@ function OnSimulStart()
|
||||
for j = 1, #( vTools or {}) do
|
||||
if vTools[j] ~= '' then
|
||||
EgtLoadTool( vTcPos[i], j, vTools[j])
|
||||
-- Aggiunto controllo lunghezza lama minima * 0.9 per ricavare la tolleranza del VMILL
|
||||
if EgtTdbSetCurrTool(vTools[j]) then -- set utensile corrente
|
||||
if EgtTdbGetCurrToolParam( MCH_TP.TYPE) == MCH_TY.SAW_STD or EgtTdbGetCurrToolParam( MCH_TP.TYPE) == MCH_TY.SAW_FLAT then -- controllo tipo utensile sega
|
||||
local dCurrSawLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) * 0.9
|
||||
-- se non definito o minore del valore precedente aggiorna la tolleranza
|
||||
EMT.VMILLTOL = EgtIf( not EMT.VMILLTOL or dCurrSawLen < EMT.VMILLTOL, dCurrSawLen, EMT.VMILLTOL)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
ShowToolInTcPos( vTcPos[i], true)
|
||||
@@ -105,6 +110,7 @@ function OnSimulStart()
|
||||
AddToCollisionCheck( 'B', 'COLLISION', EMT.COLLOBJ)
|
||||
AddToCollisionCheck( 'C', 'COLLISION', EMT.COLLOBJ)
|
||||
AddToCollisionCheck( 'H5', 'COLLISION', EMT.COLLOBJ)
|
||||
AddToCollisionCheck( 'H6', 'COLLISION', EMT.COLLOBJ)
|
||||
AddToolToCollisionCheck( 'H2', 1, EMT.COLLOBJ)
|
||||
AddToolHolderToCollisionCheck( 'H2', 1, EMT.COLLOBJ)
|
||||
DumpCollisionCheck( EMT.COLLOBJ, 'Collision Objects :', 4)
|
||||
@@ -117,7 +123,8 @@ function OnSimulStart()
|
||||
{ Grp = 'V', Sub = 'COLLISION', Name = 'VOL2'},
|
||||
{ Grp = 'PV', Sub = 'COLLISION', Name = 'VOL'},
|
||||
{ Grp = 'Base', Sub = 'COLLISION', Name = 'SIDE1'},
|
||||
{ Grp = 'Base', Sub = 'COLLISION', Name = 'SIDE2'}}
|
||||
{ Grp = 'Base', Sub = 'COLLISION', Name = 'SIDE2'},
|
||||
{ Grp = 'C', Sub = 'COLLISION2', Name = 'C_TOP'}}
|
||||
EgtOutLog( 'MCODET Objects :', 4)
|
||||
local nMcdNullCnt = 0
|
||||
for i = 1, #McdData do
|
||||
@@ -130,7 +137,7 @@ function OnSimulStart()
|
||||
local nId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( nGrpId or GDB_ID.NULL, McdData[i].Sub) or GDB_ID.NULL, McdData[i].Name)
|
||||
if nId then
|
||||
table.insert( EMT.MCODET, nId)
|
||||
EgtOutLog( 'Element ' .. McdData[i].Grp .. '/' .. McdData[i].Sub .. '/' .. McdData[i].Name .. ' is ok', 4)
|
||||
EgtOutLog( 'Element ' .. McdData[i].Grp .. '/' .. McdData[i].Sub .. '/' .. McdData[i].Name .. ' (' .. tostring( nId) .. ') is ok', 4)
|
||||
else
|
||||
nMcdNullCnt = nMcdNullCnt + 1
|
||||
EgtOutLog( 'Element ' .. McdData[i].Grp .. '/' .. McdData[i].Sub .. '/' .. McdData[i].Name .. ' is null', 4)
|
||||
@@ -141,6 +148,30 @@ function OnSimulStart()
|
||||
end
|
||||
-- Preparo lista collisioni vuota
|
||||
EMT.COLLIDE = {}
|
||||
|
||||
-- si crea gruppo temporaneo appoggio controllo clamping
|
||||
CLAMP_CHECK_GROUP = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'CLAMP_CHECK')
|
||||
CLAMP_CHECK_INTERS = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'CLAMP_INTERS')
|
||||
|
||||
if CLAMP_CHECK_GROUP then
|
||||
EgtEmptyGroup( CLAMP_CHECK_GROUP)
|
||||
else
|
||||
local frClampCheckGroup = Frame3d( ORIG(), GDB_FR.FRONT)
|
||||
CLAMP_CHECK_GROUP = EgtGroup( GDB_ID.ROOT, frClampCheckGroup)
|
||||
EgtSetName( CLAMP_CHECK_GROUP, 'CLAMP_CHECK')
|
||||
EgtSetLevel( CLAMP_CHECK_GROUP, GDB_LV.TEMP)
|
||||
EgtSetStatus( CLAMP_CHECK_GROUP, GDB_ST.OFF)
|
||||
end
|
||||
|
||||
if CLAMP_CHECK_INTERS then
|
||||
EgtEmptyGroup( CLAMP_CHECK_INTERS)
|
||||
else
|
||||
CLAMP_CHECK_INTERS = EgtGroup( GDB_ID.ROOT)
|
||||
EgtSetName( CLAMP_CHECK_INTERS, 'CLAMP_INTERS')
|
||||
EgtSetLevel( CLAMP_CHECK_INTERS, GDB_LV.TEMP)
|
||||
EgtSetStatus( CLAMP_CHECK_INTERS, GDB_ST.OFF)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -152,7 +183,8 @@ function OnSimulDispositionStarting()
|
||||
EmtUnlinkAllRawPartsFromGroups()
|
||||
if EMT.PHASE > 1 then
|
||||
if IsStartOrRestPhase( EMT.PHASE) then
|
||||
EgtSetAxisPos( 'T', LoadT)
|
||||
local ParkT = GetParkT()
|
||||
EgtSetAxisPos( 'T', ParkT)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -166,20 +198,20 @@ function OnSimulDispositionStart()
|
||||
-- Determino dimensioni del grezzo
|
||||
local nSolId = EgtGetFirstNameInGroup( EgtGetFirstRawPart() or GDB_ID.NULL, 'RawSolid') or GDB_ID.NULL
|
||||
local b3Sol = EgtGetBBoxGlob( nSolId, GDB_BB.STANDARD)
|
||||
EMT.LB = 0
|
||||
EMT.SB = 0
|
||||
EMT.HB = 0
|
||||
EMT.LT = 0
|
||||
EMT.ST = 0
|
||||
EMT.HT = 0
|
||||
if b3Sol then
|
||||
EMT.LB = b3Sol:getDimX()
|
||||
EMT.SB = b3Sol:getDimY()
|
||||
EMT.HB = b3Sol:getDimZ()
|
||||
EMT.LT = b3Sol:getDimX()
|
||||
EMT.ST = b3Sol:getDimY()
|
||||
EMT.HT = b3Sol:getDimZ()
|
||||
end
|
||||
-- Carico primo utensile sulla testa 1
|
||||
local sTool, nTlen = FindFirstToolOnHead( 'H1')
|
||||
if sTool and nTlen < LONG_TOOL_MINLEN then
|
||||
EMT.TOOL_1 = sTool
|
||||
else
|
||||
EMT.TOOL_1 = GetDefaultToolName()
|
||||
EMT.TOOL_1 = GetDefaultToolName()
|
||||
end
|
||||
EgtLoadTool( 'H1', 1, EMT.TOOL_1)
|
||||
EMT.TCPOS_1 = GetToolTcPos( EMT.TOOL_1)
|
||||
@@ -189,7 +221,7 @@ function OnSimulDispositionStart()
|
||||
EMT.VMILL = {}
|
||||
if not EMT.SIM1ST and EgtGetInfo( EgtGetCurrMachGroup(), 'Vm', 'b') then
|
||||
local nLastOrd = GetPhaseOrd( EgtGetPhaseCount())
|
||||
local nPartRawId = EgtGetFirstRawPart()
|
||||
local nPartRawId = EgtGetFirstRawPart()
|
||||
while nPartRawId do
|
||||
-- se è lo scarto finale tagliato a pezzi, esco
|
||||
local nRawOrd = EgtGetInfo( nPartRawId, 'ORD', 'i')
|
||||
@@ -211,21 +243,26 @@ function OnSimulDispositionStart()
|
||||
end
|
||||
end
|
||||
-- determino la risoluzione dello Zmap
|
||||
local dArea = b3Raw:getDimX() * b3Raw:getDimY() + b3Raw:getDimX() * b3Raw:getDimZ() + b3Raw:getDimY() * b3Raw:getDimZ()
|
||||
local dTol = 4.71
|
||||
if dArea < CoeffVM * 0.15e6 then
|
||||
dTol = 0.71
|
||||
elseif dArea < CoeffVM * 0.3e6 then
|
||||
dTol = 1.01
|
||||
elseif dArea < CoeffVM * 0.6e6 then
|
||||
dTol = 1.51
|
||||
elseif dArea < CoeffVM * 1.2e6 then
|
||||
dTol = 1.97
|
||||
elseif dArea < CoeffVM * 2.4e6 then
|
||||
dTol = 2.81
|
||||
elseif dArea < CoeffVM * 4.8e6 then
|
||||
dTol = 3.77
|
||||
if EmtGetVMillStep then
|
||||
dTol = EmtGetVMillStep( b3Raw:getDimX(), b3Raw:getDimY(), b3Raw:getDimZ(), dTol)
|
||||
else
|
||||
local dArea = b3Raw:getDimX() * b3Raw:getDimY() + b3Raw:getDimX() * b3Raw:getDimZ() + b3Raw:getDimY() * b3Raw:getDimZ()
|
||||
if dArea < 0.075e6 then
|
||||
dTol = 0.71
|
||||
elseif dArea < 0.15e6 then
|
||||
dTol = 1.01
|
||||
elseif dArea < 0.3e6 then
|
||||
dTol = 1.51
|
||||
elseif dArea < 0.6e6 then
|
||||
dTol = 1.97
|
||||
elseif dArea < 1.2e6 then
|
||||
dTol = 2.81
|
||||
elseif dArea < 2.4e6 then
|
||||
dTol = 3.77
|
||||
end
|
||||
end
|
||||
dTol = min( dTol, EMT.VMILLTOL or dTol) -- imposto dTol al valore minore tra quello per volume e quello per spessore lama
|
||||
-- creo lo Zmap
|
||||
local VMillId = EgtVolZmapBox( nPartRawId, b3Raw:getMin(), b3Raw:getDimX(), b3Raw:getDimY(), b3Raw:getDimZ(), dTol, true, GDB_RT.GLOB)
|
||||
if VMillId then
|
||||
@@ -283,18 +320,24 @@ function OnSimulDispositionStart()
|
||||
local nOrd = GetPhaseOrd( EMT.PHASE)
|
||||
local nScrapOrd = GetPhaseOrd( EgtGetPhaseCount()) + 1
|
||||
local b3Raw = BBox3d()
|
||||
local b3Bar = BBox3d()
|
||||
local b3Part = BBox3d()
|
||||
local nPartRawId, nScrapRawId
|
||||
local nRawId = EgtGetFirstRawPart()
|
||||
while nRawId do
|
||||
local nNextRawId = EgtGetNextRawPart( nRawId)
|
||||
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
|
||||
EmtLinkRawPartToGroup( nRawId, 'Tab')
|
||||
local b3Tmp = EgtGetRawPartBBox( nRawId)
|
||||
b3Bar:Add( b3Tmp)
|
||||
local nRawOrd = EgtGetInfo( nRawId, 'ORD', 'i')
|
||||
if nRawOrd == nOrd then
|
||||
b3Raw = EgtGetRawPartBBox( nRawId)
|
||||
--b3Raw = EgtGetRawPartBBox( nRawId)
|
||||
b3Raw:Add( b3Tmp)
|
||||
b3Part:Add( b3Tmp)
|
||||
nPartRawId = nRawId
|
||||
elseif nRawOrd == nOrd + 1 and nRawOrd == nScrapOrd then
|
||||
local b3Tmp = EgtGetRawPartBBox( nRawId) or BBox3d()
|
||||
--local b3Tmp = EgtGetRawPartBBox( nRawId) or BBox3d()
|
||||
b3Raw:Add( b3Tmp)
|
||||
nScrapRawId = nRawId
|
||||
end
|
||||
@@ -308,6 +351,9 @@ function OnSimulDispositionStart()
|
||||
else
|
||||
EMT.SCRAP = nil
|
||||
end
|
||||
EMT.LB = b3Bar:getDimX()
|
||||
EMT.LR = b3Raw:getDimX()
|
||||
EMT.LT = b3Part:getDimX()
|
||||
-- recupero CutId del pezzo in lavorazione
|
||||
EMT.CUTID = EgtGetInfo( EgtGetFirstPartInRawPart( nPartRawId or GDB_ID.NULL) or GDB_ID.NULL, 'CUTID', 'i') or 0
|
||||
EMT.YSPEC = nil
|
||||
@@ -358,6 +404,8 @@ function OnSimulDispositionStart()
|
||||
EgtOutText( 'Barra non ruotata')
|
||||
end
|
||||
end
|
||||
-- verifico posizione di carico
|
||||
local ParkT = GetParkT()
|
||||
-- indice primo grezzo della fase
|
||||
local nOrd = GetPhaseOrd( EMT.PHASE)
|
||||
-- ricerco vettore movimento per i successivi
|
||||
@@ -365,7 +413,7 @@ function OnSimulDispositionStart()
|
||||
local nRawId = EgtGetFirstRawPart()
|
||||
while nRawId do
|
||||
if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd + 1 then
|
||||
vtMove = Vector3d( - LoadT - EgtGetRawPartBBox( nRawId):getMax():getX(), 0, 0)
|
||||
vtMove = Vector3d( - ParkT - EgtGetRawPartBBox( nRawId):getMax():getX(), 0, 0)
|
||||
break
|
||||
end
|
||||
nRawId = EgtGetNextRawPart( nRawId)
|
||||
@@ -377,6 +425,7 @@ function OnSimulDispositionStart()
|
||||
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
|
||||
if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then
|
||||
EmtLinkRawPartToGroup( nRawId, 'Tab')
|
||||
b3Bar = EgtGetRawPartBBox( nRawId)
|
||||
else
|
||||
EgtMove( nRawId, vtMove, GDB_RT.GLOB)
|
||||
EgtSetStatus( nRawId, GDB_ST.OFF)
|
||||
@@ -384,8 +433,12 @@ function OnSimulDispositionStart()
|
||||
end
|
||||
nRawId = nNextRawId
|
||||
end
|
||||
EMT.LB = b3Bar:getDimX()
|
||||
|
||||
-- altrimenti fase finale, aggancio primo grezzo alla tavola e gli altri in posizione carico al carro Y
|
||||
else
|
||||
-- verifico posizione di carico
|
||||
local ParkT = GetParkT()
|
||||
-- indice primo grezzo della fase
|
||||
local nOrd = GetPhaseOrd( EMT.PHASE)
|
||||
-- ricerco vettore movimento per i successivi
|
||||
@@ -393,18 +446,20 @@ function OnSimulDispositionStart()
|
||||
local nRawId = EgtGetFirstRawPart()
|
||||
while nRawId do
|
||||
if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd + 1 then
|
||||
vtMove = Vector3d( - LoadT - EgtGetRawPartBBox( nRawId):getMax():getX(), 0, 0)
|
||||
vtMove = Vector3d( - ParkT - EgtGetRawPartBBox( nRawId):getMax():getX(), 0, 0)
|
||||
break
|
||||
end
|
||||
nRawId = EgtGetNextRawPart( nRawId)
|
||||
end
|
||||
-- eseguo
|
||||
local b3Bar = BBox3d()
|
||||
nRawId = EgtGetFirstRawPart()
|
||||
while nRawId do
|
||||
local nNextRawId = EgtGetNextRawPart( nRawId)
|
||||
if EgtVerifyRawPartPhase( nRawId, EMT.PHASE) then
|
||||
if EgtGetInfo( nRawId, 'ORD', 'i') == nOrd then
|
||||
EmtLinkRawPartToGroup( nRawId, 'Tab')
|
||||
b3Bar = EgtGetRawPartBBox( nRawId)
|
||||
else
|
||||
EgtMove( nRawId, vtMove, GDB_RT.GLOB)
|
||||
EmtLinkRawPartToGroup( nRawId, 'Y')
|
||||
@@ -412,6 +467,7 @@ function OnSimulDispositionStart()
|
||||
end
|
||||
nRawId = nNextRawId
|
||||
end
|
||||
EMT.LB = b3Bar:getDimX()
|
||||
end
|
||||
-- Indicazione angolo rotazione pezzo
|
||||
EMT.ROT = EgtGetInfo( EMT.DISPID, 'ROT', 'i') or 0
|
||||
@@ -443,6 +499,7 @@ function OnSimulDispositionEnd()
|
||||
EMT.POSTROT = true
|
||||
end
|
||||
end
|
||||
EMT.SPLIT = false
|
||||
EMT.OPEISDISP = false
|
||||
end
|
||||
|
||||
@@ -456,8 +513,10 @@ function OnSimulToolSelect( dPosA)
|
||||
EMT.TOTDIAM = EgtTdbGetCurrToolParam( MCH_TP.TOTDIAM)
|
||||
-- se non è chiamato da altro script (non c'è parametro)
|
||||
if not dPosA then
|
||||
-- se attivo Vmill
|
||||
SetToolForVmill( EMT.TOOL, EMT.HEAD, EMT.EXIT, EMT.VMILL)
|
||||
-- se utensile non flottante, abilito per Vmill
|
||||
if not EMT.TFLOAT then
|
||||
EmtSetToolForVmill( EMT.TOOL, EMT.HEAD, EMT.EXIT, EMT.VMILL)
|
||||
end
|
||||
-- se attivo Collision Check
|
||||
EMT.SAFEDIST = COLL_SAFE_DIST
|
||||
if EMT.COLLOBJ then
|
||||
@@ -477,8 +536,8 @@ function OnSimulToolSelect( dPosA)
|
||||
EMT.A1n = 'Y'
|
||||
EMT.A2n = 'V'
|
||||
end
|
||||
-- carico utensile se non lama su sua testa o dummy
|
||||
if EMT.HEAD ~= 'H2' and EMT.HEAD ~= 'H4' then
|
||||
-- carico utensile se non lama
|
||||
if EMT.HEAD ~= 'H2' then
|
||||
-- se sega a catena, imposto subito angolo scelto per asse virtuale A
|
||||
if EMT.HEAD == 'H3' then
|
||||
if not dPosA then
|
||||
@@ -494,18 +553,27 @@ function OnSimulToolSelect( dPosA)
|
||||
end
|
||||
EgtSetCurrMachining( NextMchId)
|
||||
-- recupero il valore dell'asse virtuale bloccato A
|
||||
local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS)
|
||||
dPosA = tonumber( sVal:sub( 3))
|
||||
dPosA = GetCurrChainSawingVirtualAxis()
|
||||
else
|
||||
-- imposto visualizzazione
|
||||
EgtSetMode( EgtGetHeadId( EMT.HEAD) or GDB_ID.NULL, GDB_MD.STD)
|
||||
end
|
||||
-- imposto il valore di A
|
||||
EgtSetAxisPos( 'A', dPosA)
|
||||
if abs( dPosA) < 0.1 then
|
||||
EgtSetAxisPos( 'C', EgtIf( BD.RIGHT_LOAD, 180, 0))
|
||||
end
|
||||
local dHomeC = GetChainSawCHomeFromVirtualAxis( dPosA)
|
||||
EgtSetAxisPos( 'C', dHomeC)
|
||||
EgtSetAxisPos( 'B', 0)
|
||||
-- se aggregato per fresa tipo blockhaus
|
||||
elseif EMT.HEAD == 'H7' then
|
||||
EgtSetAxisPos( 'C', EgtIf( BD.RIGHT_LOAD, 180, 0))
|
||||
end
|
||||
-- se TC 1
|
||||
if GetTCSet( EMT.TCPOS) == 1 then
|
||||
EgtSetAxisPos( 'B', 90)
|
||||
else
|
||||
if EMT.HEAD ~= 'H3' then
|
||||
EgtSetAxisPos( 'B', -90)
|
||||
end
|
||||
end
|
||||
-- se punta lunga
|
||||
if EMT.TOTLEN > LONG_TOOL_MINLEN then
|
||||
@@ -513,8 +581,7 @@ function OnSimulToolSelect( dPosA)
|
||||
if EMT.TCPOS == 'T111' then
|
||||
EgtSetAxisPos( 'B', 0)
|
||||
end
|
||||
end
|
||||
-- breve pausa
|
||||
end -- breve pausa
|
||||
EgtPause( 100)
|
||||
EgtOutText( '')
|
||||
EMT.TOOL_1 = EMT.TOOL
|
||||
@@ -529,27 +596,26 @@ function OnSimulToolDeselect()
|
||||
-- se prossimo utensile non definito, è disposizione ed esco
|
||||
if EMT.NEXTTOOL == '' then return end
|
||||
-- se cambia uscita su rinvio non devo fare alcunché
|
||||
if EMT.HEAD == 'H5' and EMT.NEXTHEAD == 'H5' then return end
|
||||
if ( EMT.HEAD == 'H5' and EMT.NEXTHEAD == 'H5') or ( EMT.HEAD == 'H6' and EMT.NEXTHEAD == 'H6') then return end
|
||||
-- se sega a catena o rinvio o punta lunga o utensile di grosso diametro, devo cambiare
|
||||
if EMT.HEAD == 'H3' or EMT.HEAD == 'H5' or ( EMT.HEAD == 'H1' and ( EMT.TOTLEN > LONG_TOOL_MINLEN or EMT.TOTDIAM > BIG_TOOL_DIAM)) then
|
||||
if EMT.HEAD == 'H3' or EMT.HEAD == 'H5' or EMT.HEAD == 'H6' or EMT.HEAD == 'H7' or ( EMT.HEAD == 'H1' and ( EMT.TOTLEN > LONG_TOOL_MINLEN or EMT.TOTDIAM > BIG_TOOL_DIAM)) then
|
||||
EgtOutText( 'Tool change in progress...')
|
||||
-- movimento scarico sega a catena
|
||||
if EMT.HEAD == 'H3' then
|
||||
-- se avevo motosega, torno in zona sicura senza ruotare assi rotanti
|
||||
if EMT.HB > BeamHeightForFixRot then
|
||||
SimulMoveAxis( 'X', SafeXRotAxes, MCH_SIM_STEP.RAPID)
|
||||
end
|
||||
local dPosA = EgtGetAxisPos( 'A')
|
||||
if abs( dPosA) < 0.1 then
|
||||
SimulMoveAxes( 'B', 0, MCH_SIM_STEP.COLLROT, 'C', EgtIf( BD.RIGHT_LOAD, 180, 0), MCH_SIM_STEP.COLLROT)
|
||||
else
|
||||
SimulMoveAxes( 'B', 0, MCH_SIM_STEP.COLLROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.COLLROT)
|
||||
end
|
||||
SimulMoveAxis( 'X', SafeXRotAxes, MCH_SIM_STEP.RAPID)
|
||||
-- raddrizzo asse B prima di ruotare il C
|
||||
SimulMoveAxis( 'B', 0, MCH_SIM_STEP.COLLROT)
|
||||
SimulMoveAxis( 'C', 0, MCH_SIM_STEP.COLLROT)
|
||||
SimulMoveAxis( 'X', 0, MCH_SIM_STEP.RAPID)
|
||||
-- movimento scarico rinvio
|
||||
elseif EMT.HEAD == 'H5' then
|
||||
SimulMoveAxes( 'B', 0, MCH_SIM_STEP.COLLROT, 'C', -90, MCH_SIM_STEP.COLLROT)
|
||||
elseif EMT.HEAD == 'H5' or EMT.HEAD == 'H6' then
|
||||
SimulMoveAxes( 'B', 0, MCH_SIM_STEP.COLLROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.COLLROT)
|
||||
SimulMoveAxis( 'X', 0, MCH_SIM_STEP.RAPID)
|
||||
-- movimento scarico aggregato BlockHaus
|
||||
elseif EMT.HEAD == 'H7' then
|
||||
SimulMoveAxis( 'X', 0, MCH_SIM_STEP.RAPID)
|
||||
SimulMoveAxes( 'B', 90, MCH_SIM_STEP.COLLROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.COLLROT)
|
||||
-- movimento scarico punta lunga su T111
|
||||
elseif EMT.TOTLEN > LONG_TOOL_MINLEN then
|
||||
-- se su cambio utensile T111
|
||||
@@ -559,7 +625,11 @@ function OnSimulToolDeselect()
|
||||
-- altrimenti posizioni standard rastrelliera
|
||||
else
|
||||
SimulMoveAxis( 'X', 0, MCH_SIM_STEP.RAPID)
|
||||
SimulMoveAxes( 'B', 90, MCH_SIM_STEP.COLLROT, 'C', -90, MCH_SIM_STEP.COLLROT)
|
||||
if GetTCSet( EMT.TCPOS) == 1 then
|
||||
SimulMoveAxes( 'B', 90, MCH_SIM_STEP.COLLROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.COLLROT)
|
||||
else
|
||||
SimulMoveAxes( 'B', -90, MCH_SIM_STEP.COLLROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.COLLROT)
|
||||
end
|
||||
end
|
||||
-- movimento scarico utensile di grosso diametro (su T111)
|
||||
else
|
||||
@@ -573,24 +643,35 @@ function OnSimulToolDeselect()
|
||||
-- nascondo utensile su testa e lo visualizzo su TcPos
|
||||
EgtSetMode( EgtGetHeadId( EMT.HEAD), GDB_MD.HIDDEN)
|
||||
ShowToolInTcPos( EMT.TCPOS_1, true)
|
||||
|
||||
-- movimento per carico utensile
|
||||
if EMT.NEXTHEAD ~= 'H3' and EMT.NEXTHEAD ~= 'H5' then
|
||||
SimulMoveAxes( 'B', 90, MCH_SIM_STEP.RAPROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.RAPROT)
|
||||
if EMT.NEXTHEAD ~= 'H3' and EMT.NEXTHEAD ~= 'H5' and EMT.NEXTHEAD ~= 'H6' then
|
||||
SimulMoveAxes( 'B', EgtIf( GetTCSet( EMT.TCPOS) == 1, 90, -90), MCH_SIM_STEP.RAPROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.RAPROT)
|
||||
else
|
||||
SimulMoveAxes( 'B', 0, MCH_SIM_STEP.RAPROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.RAPROT)
|
||||
if EMT.NEXTHEAD == 'H3' then
|
||||
SimulMoveAxes( 'B', 0, MCH_SIM_STEP.RAPROT, 'C', 0, MCH_SIM_STEP.RAPROT)
|
||||
else
|
||||
SimulMoveAxes( 'B', 0, MCH_SIM_STEP.RAPROT, 'C', EgtIf( BD.RIGHT_LOAD, 90, -90), MCH_SIM_STEP.RAPROT)
|
||||
end
|
||||
end
|
||||
-- se segue lama, carico utensile di default
|
||||
if EMT.NEXTHEAD == 'H2' then
|
||||
local sDefTool = GetDefaultToolName()
|
||||
EgtLoadTool( 'H1', 1, sDefTool)
|
||||
EMT.TOOL_1 = sDefTool
|
||||
EMT.TCPOS_1 = GetToolTcPos( EMT.TOOL_1)
|
||||
-- se TC 1
|
||||
if GetTCSet( EMT.TCPOS_1) == 1 then
|
||||
EgtSetAxisPos( 'B', 90)
|
||||
else
|
||||
EgtSetAxisPos( 'B', -90)
|
||||
end
|
||||
EgtLoadTool( 'H1', 1, sDefTool)
|
||||
-- lo nascondo sul portautensili
|
||||
ShowToolInTcPos( EMT.TCPOS_1, false)
|
||||
end
|
||||
EgtOutText( '')
|
||||
-- deposito utensile se prossimo non lama su sua testa o dummy
|
||||
elseif EMT.NEXTHEAD ~= 'H2' and EMT.NEXTHEAD ~= 'H4' then
|
||||
-- deposito utensile se prossimo non lama su sua testa
|
||||
elseif EMT.NEXTHEAD ~= 'H2' then
|
||||
if EMT.NEXTTOOL ~= EMT.TOOL_1 then
|
||||
EgtOutText( 'Tool change in progress...')
|
||||
-- simulo movimento
|
||||
@@ -600,7 +681,7 @@ function OnSimulToolDeselect()
|
||||
EgtPause( 100)
|
||||
ShowToolInTcPos( EMT.TCPOS_1, true)
|
||||
-- se segue sega a catena
|
||||
if EMT.NEXTHEAD == 'H3' or EMT.NEXTHEAD == 'H5' then
|
||||
if EMT.NEXTHEAD == 'H3' or EMT.NEXTHEAD == 'H5' or EMT.NEXTHEAD == 'H6' then
|
||||
-- se non lama, nascondo l'utensile corrente
|
||||
if EMT.HEAD ~= 'H2' then
|
||||
EgtSetStatus( EgtGetHeadId( EMT.HEAD), GDB_ST.OFF)
|
||||
@@ -628,8 +709,7 @@ function OnSimulMachiningStart()
|
||||
-- se lavorazione attuale e precedente con sega a catena con angolo A diverso, devo scaricare e ricaricare
|
||||
if EMT.HEAD == 'H3' and EMT.HEAD == EMT.PREVHEAD then
|
||||
local dPrevA = EgtGetAxisPos( 'A')
|
||||
local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS)
|
||||
local dPosA = tonumber( sVal:sub( 3))
|
||||
local dPosA = GetCurrChainSawingVirtualAxis()
|
||||
if abs( dPosA - dPrevA) > 1 then
|
||||
OnSimulToolDeselect()
|
||||
EgtSetStatus( EgtGetHeadId( EMT.HEAD), GDB_ST.ON)
|
||||
@@ -661,7 +741,9 @@ function OnSimulMachiningEnd()
|
||||
EMT.UNLOADING = false
|
||||
EMT.FALL = false
|
||||
end
|
||||
EMT.SPLIT = nil
|
||||
EMT.PREVHEAD = EMT.HEAD
|
||||
EMT.PREVTOOL = EMT.TOOL
|
||||
EMT.PREVEXIT = EMT.EXIT
|
||||
end
|
||||
|
||||
@@ -747,31 +829,89 @@ function OnSimulMoveStart()
|
||||
VerifyVStroke( EMT.A2)
|
||||
-- se inizio lavorazione
|
||||
if EMT.MCHFIRST then
|
||||
|
||||
local bGoToHome = false
|
||||
-- se gli assi rotanti cambiano parecchio, con motosega si va in parcheggio
|
||||
if EMT.PREVHEAD == 'H3' and EMT.HEAD == 'H3' and EMT.TOOL == EMT.PREVTOOL and abs( EMT.R3p - EMT.R3) < 100 * GEO.EPS_SMALL and ( abs( EMT.R2p - EMT.R2) > 25 or abs( EMT.R1p - EMT.R1) > 25) then
|
||||
bGoToHome = true
|
||||
end
|
||||
|
||||
EgtOutText( '')
|
||||
EMT.MCHFIRST = false
|
||||
local bZmax = ( EMT.TOOL ~= EMT.PREVTOOL or EMT.L3 > -1)
|
||||
-- con pezzi alti aggiorno gli assi rotanti prima di muovermi sopra il pezzo
|
||||
if not EMT.LOAD and EMT.MOVE == 0 and EMT.HB > BeamHeightForFixRot and EMT.FLAG2 == 1 then
|
||||
-- se motosega mi muovo a X di sicurezza per ruotare
|
||||
if EMT.HEAD == 'H3'then
|
||||
if EMT.HEAD == 'H3' and EMT.PREVHEAD ~= 'H3' then
|
||||
SimulMoveAxis( 'X', SafeXRotAxes, MCH_SIM_STEP.RAPID)
|
||||
SimulMoveAxis( 'B', 0, MCH_SIM_STEP.COLLROT)
|
||||
SimulMoveAxis( 'C', EMT.R1, MCH_SIM_STEP.COLLROT)
|
||||
SimulMoveAxis( 'B', EMT.R2, MCH_SIM_STEP.COLLROT)
|
||||
elseif not EMT.LOAD and EMT.MOVE == 0 and ( EMT.HEAD == 'H3' or ( bZmax and EMT.TOTLEN > 200)) and
|
||||
( EMT.HT > BeamHeightForFixRot or ( EMT.HEAD == 'H1' and EMT.TOTLEN > 350) or bGoToHome) and EMT.FLAG2 == 1 then
|
||||
-- se motosega mi muovo a X di sicurezza per ruotare, prima si raddrizza B e poi C in posizione
|
||||
if EMT.HEAD == 'H3' and bGoToHome then
|
||||
SimulMoveAxis( 'X', SafeXRotAxes, MCH_SIM_STEP.RAPID)
|
||||
SimulMoveAxis( 'B', 0, MCH_SIM_STEP.COLLROT)
|
||||
SimulMoveAxis( 'C', EMT.R1, MCH_SIM_STEP.COLLROT)
|
||||
SimulMoveAxis( 'B', EMT.R2, MCH_SIM_STEP.COLLROT)
|
||||
elseif ( bZmax and EMT.TOTLEN > 200) then
|
||||
SimulMoveAxes( 'X', SafeXRotAxes, MCH_SIM_STEP.RAPID, 'C', EMT.R1, MCH_SIM_STEP.COLLROT, 'B', EMT.R2, MCH_SIM_STEP.COLLROT)
|
||||
end
|
||||
end
|
||||
EMT.POSTROT = nil
|
||||
end
|
||||
-- se aggregato flottante su inizio attacco va compresso
|
||||
if EMT.TFLOAT and not EMT.TFLOAT_CMP and EMT.MOVE == 1 and EgtGetName( EMT.MOVEID) == 'LI' then
|
||||
-- recupero lunghezza
|
||||
local dOffsL = - EgtGetMachiningParam( MCH_MP.OFFSL)
|
||||
-- imposto compressione della parte flottante
|
||||
SetFloatPos( EMT.HEAD, dOffsL)
|
||||
-- imposto dati utensile in posizione compressa
|
||||
EmtSetToolForVmill( EMT.TOOL, EMT.HEAD, EMT.EXIT, EMT.VMILL, 2, -dOffsL)
|
||||
-- dichiaro che è compresso (assegnando Id entità di movimento)
|
||||
EMT.TFLOAT_CMP = EMT.MOVEID
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnSimulMoveEnd()
|
||||
-- se termine di passata con lama
|
||||
if EMT.FLAG == 301 then
|
||||
-- rimozione eventuali sfridi
|
||||
ExecRemoveScraps()
|
||||
end
|
||||
-- se utensile flottante e movimento di compressione
|
||||
if EMT.TFLOAT and EMT.MOVEID == EMT.TFLOAT_CMP then
|
||||
-- verifico ci sia stata collisione tra ghiera flottante (portautensile e pezzo)
|
||||
if not EMT.TFLOAT_TH_COMPR_COLL then
|
||||
local sErr = 'CUTID='..tostring( EMT.CUTID)..'; TASKID='..tostring( EMT.TASKID)..'; Mach='..EMT.MCHNAME..'; Floating Ring not compressed on approach'
|
||||
EmtSetLastError( 1222, sErr)
|
||||
EgtOutLog( 'Error : ' .. sErr, 1)
|
||||
else
|
||||
EgtOutLog( 'Floating Ring compressed on approach (MOVEID='..EgtNumToString( EMT.MOVEID)..')', 1)
|
||||
end
|
||||
EMT.TFLOAT_TH_COMPR_COLL = nil
|
||||
end
|
||||
-- se aggregato flottante su fine uscita va rilasciato
|
||||
if EMT.TFLOAT and EMT.TFLOAT_CMP and EMT.MOVE == 1 and EgtGetName( EMT.MOVEID) == 'LO' and EgtGetName( EgtGetNext( EMT.MOVEID) or GDB_ID.NULL) ~= 'LO' then
|
||||
-- reset compressione della parte flottante
|
||||
SetFloatPos( EMT.HEAD, 0)
|
||||
-- dichiaro che è rilasciato
|
||||
EMT.TFLOAT_CMP = nil
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnSimulCollision()
|
||||
-- se prima collisione della lavorazione, la segnalo
|
||||
if EMT.MCHNAME ~= EMT.LAST_MCHNAME_COLLIDE then
|
||||
-- speciale per utensile flottante (suo holder contro il grezzo)
|
||||
if EMT.TFLOAT and EMT.TFLOAT_CMP and EMT.SIMCOBIND == 1002 and EMT.SIMVMID == EMT.VMILL[1] then
|
||||
if EMT.MOVEID == EMT.TFLOAT_CMP then
|
||||
EMT.TFLOAT_TH_COMPR_COLL = true
|
||||
end
|
||||
return
|
||||
end
|
||||
-- standard
|
||||
local Class = ''
|
||||
if EMT.SIMCOBIND == 1001 then
|
||||
Class = 'T_H1'
|
||||
@@ -795,6 +935,8 @@ function ExecAuxCmd( sCmd)
|
||||
if Cmd[1] == '0' then
|
||||
if Cmd[2] == 'Unloading' then
|
||||
EMT.UNLOADING = true
|
||||
elseif Cmd[2] == 'Split' then
|
||||
EMT.SPLIT = true
|
||||
elseif Cmd[2] == 'Fall' then
|
||||
EMT.FALL = true
|
||||
end
|
||||
@@ -836,19 +978,9 @@ function ExecAuxCmd( sCmd)
|
||||
end
|
||||
end
|
||||
elseif Cmd[1] == '11' then
|
||||
local dPY = MaxOpen
|
||||
if Cmd[2] ~= '0' then
|
||||
dPY = EgtIf( EMT.ROT == -1, EMT.HB, EMT.SB)
|
||||
end
|
||||
SimulMoveAxis( 'PY', dPY, MCH_SIM_STEP.RAPID)
|
||||
SetPYLight( Cmd[2] ~= '0')
|
||||
ExecMovePY( Cmd[2] ~= '0')
|
||||
elseif Cmd[1] == '12' then
|
||||
local dPV = MaxOpen
|
||||
if Cmd[2] ~= '0' then
|
||||
dPV = EgtIf( EMT.ROT == -1, EMT.HB, EMT.SB)
|
||||
end
|
||||
SimulMoveAxis( 'PV', dPV, MCH_SIM_STEP.RAPID)
|
||||
SetPVLight( Cmd[2] ~= '0')
|
||||
ExecMovePV( Cmd[2] ~= '0')
|
||||
elseif Cmd[1] == '21' then
|
||||
local nYDelta = tonumber( Cmd[2])
|
||||
local nVDelta = tonumber( Cmd[3])
|
||||
@@ -892,7 +1024,7 @@ function ExecRemoveScraps()
|
||||
for i = nPart, 1, -1 do
|
||||
if i ~= nPartMax then
|
||||
local b3Vmill = EgtVolZmapGetPartBBoxGlob( vMillId, i - 1, GDB_BB.STANDARD)
|
||||
if b3Vmill:getDimX() < 1200 then
|
||||
if b3Vmill:getDimX() < 1250 then
|
||||
EgtRemoveVolZmapPart( vMillId, i - 1)
|
||||
end
|
||||
end
|
||||
@@ -912,14 +1044,14 @@ function ExecUnloading()
|
||||
-- li sposto per lasciare spazio al nuovo pezzo
|
||||
local nId = EgtGetFirstInGroup( nVmGrpId)
|
||||
while nId do
|
||||
EgtMove( nId, Vector3d( 0, EgtIf( BD.RIGHT_LOAD, ( EMT.SB + 50.0), -( EMT.SB + 50.0)), 0), GDB_RT.GLOB)
|
||||
EgtMove( nId, Vector3d( 0, EgtIf( BD.RIGHT_LOAD, ( EMT.ST + 50.0), -( EMT.ST + 50.0)), 0), GDB_RT.GLOB)
|
||||
nId = EgtGetNext( nId)
|
||||
end
|
||||
-- creo un nuovo layer e vi inserisco il nuovo pezzo
|
||||
local nLayId = EgtGroup( nVmGrpId, EgtGetGlobFrame( vMillId))
|
||||
EgtRelocate( vMillId, nLayId)
|
||||
local vtMove = Vector3d( 0, EgtIf( BD.RIGHT_LOAD, 450, -450), 0)
|
||||
if EMT.FALL then vtMove = Vector3d( -500, 0, EgtIf( BD.RIGHT_LOAD, 750, -750)) end
|
||||
if EMT.FALL then vtMove = Vector3d( 0, EgtIf( BD.RIGHT_LOAD, 500, -500), -750) end
|
||||
EgtMove( nLayId, vtMove, GDB_RT.GLOB)
|
||||
EgtSetLevel( vMillId, GDB_LV.USER)
|
||||
-- aggiungo gli spigoli
|
||||
@@ -957,6 +1089,176 @@ function ExecUnloading()
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function CheckClamping( sClampName)
|
||||
|
||||
local nClampId = EgtGetAxisId( sClampName) or GDB_ID.NULL
|
||||
local nClampPathId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nClampId, 'CLAMP_CHECK') or GDB_ID.NULL)
|
||||
local b3ClampingArea = EgtGetBBoxGlob( nClampPathId or GDB_ID.NULL, GDB_BB.STANDARD)
|
||||
-- se non trovo percorso area di clamping, esco subito
|
||||
if not nClampPathId or not EMT.VMILL or not ClampingCoeffMin then
|
||||
return
|
||||
end
|
||||
|
||||
local function GetCurveListFromIntersection( sPosIntersPlane, sIntersPlane, dDepth)
|
||||
local vCurveListId = {}
|
||||
local vtIntersPlane
|
||||
-- piano di interpolazione
|
||||
if sIntersPlane == 'X' then
|
||||
vtIntersPlane = X_AX()
|
||||
elseif sIntersPlane == 'Y' then
|
||||
vtIntersPlane = Y_AX()
|
||||
elseif sIntersPlane == 'Z' then
|
||||
vtIntersPlane = Z_AX()
|
||||
end
|
||||
|
||||
for i = 1, #EMT.VMILL do
|
||||
local b3VMill = EgtGetBBoxGlob( EMT.VMILL[i], GDB_BB.EXACT)
|
||||
local ptPosIntersPlane
|
||||
if sPosIntersPlane == 'MIN' then
|
||||
ptPosIntersPlane = b3VMill:getMin() + dDepth * vtIntersPlane
|
||||
elseif sPosIntersPlane == 'MAX' then
|
||||
ptPosIntersPlane = b3VMill:getMax() - dDepth * vtIntersPlane
|
||||
end
|
||||
local nLoopId, nLoopCnt = EgtPlaneVolZmapInters( ptPosIntersPlane, vtIntersPlane, EMT.VMILL[i], CLAMP_CHECK_INTERS, GDB_RT.GLOB)
|
||||
vCurveListId = EgtTableAdd( vCurveListId, nLoopId, nLoopCnt)
|
||||
end
|
||||
|
||||
return vCurveListId
|
||||
end
|
||||
|
||||
local function CalculateIntersectionArea( sPosIntersPlane, sIntersPlane, dDepth)
|
||||
-- test piano frontale
|
||||
local vCurveListId = GetCurveListFromIntersection( sPosIntersPlane, sIntersPlane, dDepth)
|
||||
-- si copia curva intersezione e curva pinza in gruppo di confronto
|
||||
local nFlatSurfId, nFlatSurfCnt = EgtSurfFlatRegion( CLAMP_CHECK_GROUP, vCurveListId)
|
||||
local vFlatSurfId = EgtTableFill( nFlatSurfId, nFlatSurfCnt) or {}
|
||||
local nClampSurfId = EgtSurfFlatRegion( CLAMP_CHECK_GROUP, nClampPathId)
|
||||
|
||||
local dTotalArea = 0
|
||||
local dTotalXLenght = 0
|
||||
for i = 1, #vFlatSurfId do
|
||||
local nTempSurfId = vFlatSurfId[i]
|
||||
EgtSurfFrIntersect( nTempSurfId, nClampSurfId)
|
||||
if nTempSurfId then
|
||||
dTotalArea = dTotalArea + ceil( EgtSurfArea( nTempSurfId) or 0)
|
||||
local b3BoxIntersectionBox = EgtGetBBoxGlob( nTempSurfId, GDB_BB.STANDARD)
|
||||
if b3BoxIntersectionBox then
|
||||
dTotalXLenght = dTotalXLenght + ceil( b3BoxIntersectionBox:getDimX()) -- somma lunghezze (x) delle aree pinzate
|
||||
end
|
||||
end
|
||||
end
|
||||
return dTotalArea, dTotalXLenght
|
||||
end
|
||||
|
||||
-- minima area considerata per un corretto pinzaggio
|
||||
DistZClampToTable = DistZClampToTable or 0
|
||||
--local MinJoin = BD.GetMinJoin( EMT.ST, EMT.HT, EgtIf( EMT.SPLIT, EMT.LT, EMT.LB))
|
||||
UpdateMinJoinDeltaTol( EMT.ST, EMT.HT, EgtIf( EMT.SPLIT, EMT.LT, EMT.LB))
|
||||
local MinZClamping = min( b3ClampingArea:getDimZ() + DistZClampToTable, EMT.HT) - DistZClampToTable
|
||||
local dMinClamping = ( MinJoin * MinZClamping)
|
||||
-- si moltiplica per un coefficiente minimo sotto al quale si da l'errore di pinzaggio
|
||||
ClampingCoeffMin = EgtClamp( ClampingCoeffMin, 0.01, 1)
|
||||
if MinZClamping > 116 then
|
||||
dMinClamping = MinJoin * 116 + ( pow( MinJoin, 2) / 2)
|
||||
if MinJoin > 280 then
|
||||
dMinClamping = MinJoin * 116 + ( pow( 280, 2) / 2) + ( pow( MinJoin - 280, 2))
|
||||
end
|
||||
end
|
||||
|
||||
local dMinClampingAreaWarn = dMinClamping * ClampingCoeffMin
|
||||
local dMinClampingAreaErr = dMinClamping * ( ClampingCoeffMin / 3)
|
||||
|
||||
local bError = true
|
||||
local sWrn, sErr
|
||||
local bWriteWarnMessage = false
|
||||
local bWriteErrMessage = false
|
||||
-- controllo faccia frontale
|
||||
local dArea, dXClampedLenght = CalculateIntersectionArea( 'MIN', 'Y', 3)
|
||||
-- ERRORE: pinza troppo poco (meno di 1/3 del minimo richiesto)
|
||||
if dArea and dArea < dMinClampingAreaErr then
|
||||
-- solo se pinza almeno 1cm2, e la somma della lunghezza pinzata è maggiore della lunghezza minima pinzabile da Warning e non errore
|
||||
if dXClampedLenght >= MinJoin * ClampingCoeffMin and dArea > 1000 then
|
||||
bError = false
|
||||
end
|
||||
-- pinzaggio non fattibile, errore
|
||||
if bError then
|
||||
sErr = 'ERROR CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
|
||||
bWriteErrMessage = true
|
||||
end
|
||||
end
|
||||
-- WARNING: pinza meno del minimo richiesto
|
||||
if dArea and dArea < dMinClampingAreaWarn and not bWriteErrMessage then
|
||||
sWrn = 'WARNING CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
|
||||
bWriteWarnMessage = true
|
||||
end
|
||||
EgtEmptyGroup( CLAMP_CHECK_GROUP)
|
||||
EgtEmptyGroup( CLAMP_CHECK_INTERS)
|
||||
|
||||
-- controllo altro lato solo se non sono già in errore
|
||||
if not bWriteErrMessage then
|
||||
-- controllo faccia posteriore
|
||||
dArea, dXClampedLenght = CalculateIntersectionArea( 'MAX', 'Y', 3)
|
||||
-- ERRORE: pinza troppo poco (meno di 1/3 del minimo richiesto)
|
||||
if dArea and dArea < dMinClampingAreaErr then
|
||||
-- solo se pinza almeno 1cm2, e la somma della lunghezza pinzata è maggiore della lunghezza minima pinzabile da Warning e non errore
|
||||
if dXClampedLenght >= MinJoin * ClampingCoeffMin and dArea > 1000 then
|
||||
bError = false
|
||||
end
|
||||
-- pinzaggio non fattibile, errore
|
||||
if bError then
|
||||
sErr = 'ERROR CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
|
||||
bWriteErrMessage = true
|
||||
end
|
||||
end
|
||||
-- WARNING: pinza meno del minimo richiesto
|
||||
if dArea and dArea < dMinClampingAreaWarn and not bWriteWarnMessage and not bWriteErrMessage then
|
||||
sWrn = 'WARNING CLAMPING ' .. sClampName .. ' : '..tostring( ceil( ( dArea / dMinClampingAreaWarn) * 100))..'% ( '.. tostring( dArea/1000)..'cm2)'
|
||||
bWriteWarnMessage = true
|
||||
end
|
||||
EgtEmptyGroup( CLAMP_CHECK_GROUP)
|
||||
EgtEmptyGroup( CLAMP_CHECK_INTERS)
|
||||
end
|
||||
|
||||
if bWriteErrMessage then
|
||||
EmtSetLastError( 1213, sErr, EgtGetEnableUI())
|
||||
EgtOutBox( sErr, 'CLAMPING', 'ERROR', 'OK')
|
||||
EmtSetSimulPause()
|
||||
elseif bWriteWarnMessage then
|
||||
EgtOutLog( sWrn)
|
||||
EgtOutBox( sWrn, 'CLAMPING', 'WARNING', 'OK')
|
||||
EmtSetSimulPause()
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function ExecMovePY( bClose)
|
||||
--SimulMoveAxes( 'PY', EgtIf( not bClose, MaxHoOpen, EMT.HB), MCH_SIM_STEP.RAPID)
|
||||
local dPY = MaxOpen
|
||||
if bClose then
|
||||
dPY = EgtIf( EMT.ROT == -1, EMT.HT, EMT.ST)
|
||||
end
|
||||
SimulMoveAxis( 'PY', dPY, MCH_SIM_STEP.RAPID)
|
||||
SetPYLight( bClose)
|
||||
if bClose then
|
||||
CheckClamping( 'PY')
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function ExecMovePV( bClose)
|
||||
--EgtIf( not bClose, MaxHoOpen, EMT.HB), MCH_SIM_STEP.RAPID)
|
||||
local dPV = MaxOpen
|
||||
if bClose then
|
||||
dPV = EgtIf( EMT.ROT == -1, EMT.HT, EMT.ST)
|
||||
end
|
||||
SimulMoveAxis( 'PV', dPV, MCH_SIM_STEP.RAPID)
|
||||
SetPVLight( bClose)
|
||||
if bClose then
|
||||
CheckClamping( 'PV')
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function VerifyYSlide( sName1, dVal1, sName2, dVal2)
|
||||
-- Se movimento trave agganciata con carrello Y
|
||||
@@ -1113,22 +1415,35 @@ end
|
||||
---------------------------------------------------------------------
|
||||
-- *** ESTIMATION T&L ***
|
||||
---------------------------------------------------------------------
|
||||
local RAPID_X_FEED = 75000 -- mm/min
|
||||
local RAPID_Y_FEED = 100000 -- mm/min
|
||||
local RAPID_Z_FEED = 50000 -- mm/min
|
||||
local RAPID_C_FEED = 15000 -- deg/min
|
||||
local RAPID_B_FEED = 15000 -- deg/min
|
||||
local RAPID_MIN_T = 0.1 -- s
|
||||
local LOAD_T = 2 -- s
|
||||
local CHAR_ONE_MOVE_T = 1 -- s
|
||||
local ROTATION_T = 40 -- s
|
||||
local SPLIT_T = 6 -- s
|
||||
local UNLOAD_T = 4 -- s
|
||||
local FALL_T = 2 -- s
|
||||
local ESTIMATION_RAPID_COEFF = EstimationRapidMultiplier or 1
|
||||
local RAPID_X_FEED = 100000 / ESTIMATION_RAPID_COEFF -- mm/min
|
||||
local RAPID_Y_FEED = 100000 / ESTIMATION_RAPID_COEFF -- mm/min
|
||||
local RAPID_Z_FEED = 100000 / ESTIMATION_RAPID_COEFF -- mm/min
|
||||
local RAPID_C_FEED = 12000 / ESTIMATION_RAPID_COEFF -- deg/min
|
||||
local RAPID_B_FEED = 12000 / ESTIMATION_RAPID_COEFF -- deg/min
|
||||
local RAPID_MIN_T = 0.1 * ESTIMATION_RAPID_COEFF -- s
|
||||
local LOAD_T = 2 * ESTIMATION_RAPID_COEFF -- s
|
||||
local CHAR_ONE_MOVE_T = 1 * ESTIMATION_RAPID_COEFF -- s
|
||||
local ROTATION_T = 40 * ESTIMATION_RAPID_COEFF -- s
|
||||
local SPLIT_T = 6 * ESTIMATION_RAPID_COEFF -- s
|
||||
local UNLOAD_T = 4 * ESTIMATION_RAPID_COEFF -- s
|
||||
local FALL_T = 2 * ESTIMATION_RAPID_COEFF -- s
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnEstimStart()
|
||||
EMT.INCHES = not EgtUiUnitsAreMM() -- unità di misura mm/inches
|
||||
|
||||
-- TPA
|
||||
if NumericalControl == 'TPA' then
|
||||
EMT.FMAXPINZE = EgtClamp( MaxFeedPinze or 154000, 20000, 160000) -- feed massima pinze
|
||||
EMT.MAXACC = MaxAcc or 4000 -- accelerazione massima pinze. In realtà è il tempo in millisecondi, quindi MAXACC corrisponde al tempo massimo per raggiungere la velocità desiderata
|
||||
EMT.MINACC = MinAcc or 300 -- accelerazione minima pinze. In realtà è il tempo in millisecondi, quindi MINACC corrisponde al tempo massimo per raggiungere la velocità desiderata
|
||||
-- NUM_PLUS e NUM
|
||||
else
|
||||
EMT.FMAXPINZE = EgtClamp( MaxFeedPinze or 154000, 20000, 160000) -- feed massima pinze
|
||||
EMT.MAXACC = MaxAcc or ( EMT.FMAXPINZE / ( 60 * 0.3)) -- accelerazione massima pinze
|
||||
EMT.MINACC = MinAcc or ( EMT.FMAXPINZE / ( 60 * 4)) -- accelerazione minima pinze
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -1214,6 +1529,15 @@ function OnEstimDispositionEnd()
|
||||
EMT.OPEISDISP = false
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnEstimRawMoveData()
|
||||
-- se start del pezzo
|
||||
if IsStartOrRestPhase( EMT.PHASE) then
|
||||
EMT.SPLIT = false
|
||||
end
|
||||
OnRawMoveData()
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function OnEstimToolSelect()
|
||||
-- reset indice utensile in tabella lunghezze
|
||||
@@ -1270,6 +1594,12 @@ function OnEstimMachiningEnd()
|
||||
EMT.TLE_NAME = nil
|
||||
EMT.TLE_TIME = nil
|
||||
end
|
||||
|
||||
EMT.MCHUSERNOTES = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
|
||||
EMT.MCHSPLIT = ( EMT.MCHUSERNOTES:find( 'Split;', 1, true) ~= nil)
|
||||
if EMT.MCHSPLIT then
|
||||
EMT.SPLIT = true
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -1400,15 +1730,15 @@ function OnEstimRapid()
|
||||
EMT.MCHEXTLEN = EMT.MCHEXTLEN + dLen
|
||||
-- calcolo tempo
|
||||
local dTime = RAPID_MIN_T
|
||||
local dT1 = abs( dL1) / RAPID_X_FEED * 60
|
||||
local dT1 = CalcMoveTime( abs( dL1), EMT.FMAXPINZE, EMT.SPLIT)
|
||||
if dT1 > dTime then dTime = dT1 end
|
||||
local dT2 = abs( dL2) / RAPID_Y_FEED * 60
|
||||
local dT2 = abs( dL2) / ( RAPID_X_FEED / 60) -- CalcMoveTime( abs( dL2), RAPID_X_FEED, EMT.SPLIT)
|
||||
if dT2 > dTime then dTime = dT2 end
|
||||
local dT3 = abs( dL3) / RAPID_Z_FEED * 60
|
||||
local dT3 = abs( dL3) / ( RAPID_Z_FEED * 60) -- CalcMoveTime( abs( dL3), RAPID_Z_FEED, EMT.SPLIT)
|
||||
if dT3 > dTime then dTime = dT3 end
|
||||
local dT4 = abs( dR1) / RAPID_C_FEED * 60
|
||||
local dT4 = abs( dR1) / ( RAPID_C_FEED / 60)
|
||||
if dT4 > dTime then dTime = dT4 end
|
||||
local dT5 = abs( dR2) / RAPID_B_FEED * 60
|
||||
local dT5 = abs( dR2) / ( RAPID_B_FEED / 60)
|
||||
if dT5 > dTime then dTime = dT5 end
|
||||
EMT.MCHEXTTIME = EMT.MCHEXTTIME + dTime
|
||||
EgtOutLog( string.format( ' G0 Len=%.0f Rot=%.0f° Time=%.2f', dLen, abs( dR1) + abs( dR2), dTime), 5)
|
||||
@@ -1426,7 +1756,7 @@ function OnEstimLinear()
|
||||
local dLen = sqrt( dL1 * dL1 + dL2 * dL2 + dL3 * dL3)
|
||||
EMT.MCHCUTLEN = EMT.MCHCUTLEN + dLen
|
||||
-- calcolo tempo
|
||||
local dTime = dLen / EMT.F * 60
|
||||
local dTime = dLen / ( EMT.F / 60) -- CalcMoveTime( dLen, EMT.F, EMT.SPLIT)
|
||||
EMT.MCHCUTTIME = EMT.MCHCUTTIME + dTime
|
||||
EgtOutLog( string.format( ' G1 Len=%.0f Time=%.2f', dLen, dTime), 5)
|
||||
-- aggiorno valori come precedenti
|
||||
@@ -1524,6 +1854,12 @@ function IsStartOrRestPhase( nPhase)
|
||||
return ( sVal == 'START' or sVal == 'REST')
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function IsEndPhase( nPhase)
|
||||
local sVal = GetPhaseType( nPhase)
|
||||
return ( sVal == 'END')
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function IsMidPhase( nPhase)
|
||||
local sVal = GetPhaseType( nPhase)
|
||||
@@ -1557,6 +1893,88 @@ function GetPhaseRot( nPhase)
|
||||
return ( EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'ROT', 'i') or 0)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function GetParkT()
|
||||
local dTmp = EgtGetInfo( EMT.DISPID, 'TPOS', 'd') or EgtGetInfo( EMT.DISPID, 'TPARK', 'd')
|
||||
if dTmp then
|
||||
return dTmp
|
||||
else
|
||||
return LoadT
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function GetCurrChainSawingVirtualAxis()
|
||||
-- recupero il valore dell'asse virtuale bloccato A
|
||||
local sVal = EgtGetMachiningParam( MCH_MP.BLOCKEDAXIS) or 'A=0'
|
||||
local dPosA = tonumber( sVal:sub( 3)) or 0
|
||||
return dPosA
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function CalcDinamicaPinze_TPA( dH, dS, dL)
|
||||
local MinTempoAcc = EMT.MINACC -- [ms] ~300
|
||||
local MaxTempoAcc = EMT.MAXACC -- [ms] ~4000
|
||||
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 = EgtClamp( ( Massa * FMaxPinze) / ( 60 * ForzaAttrito), MinTempoAcc, MaxTempoAcc)
|
||||
local RidFeed = 100 / Massa * 100
|
||||
if RidFeed > 100 then
|
||||
RidFeed = 100
|
||||
elseif RidFeed < 10 then
|
||||
RidFeed = 10
|
||||
end
|
||||
return TempoAcc, MinTempoAcc, RidFeed
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function CalcDinamicaPinze_NUM( dH, dS, dL)
|
||||
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)
|
||||
local AccMaxPinze = EMT.MAXACC
|
||||
local AccPinze = EgtClamp( FMaxPinze / ( 60 * TempoAcc), EMT.MINACC, EMT.MAXACC)
|
||||
local RidFeed = 100 / Massa * 100
|
||||
if RidFeed > 100 then
|
||||
RidFeed = 100
|
||||
elseif RidFeed < 10 then
|
||||
RidFeed = 10
|
||||
end
|
||||
return AccPinze, AccMaxPinze, RidFeed, TempoAcc
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function CalcMoveTime( dPathLen, dFeed, bIsSplitted)
|
||||
local dTime
|
||||
local dFeedInSec = dFeed / 60
|
||||
|
||||
if NumericalControl == 'TPA' then
|
||||
local dTempoAcc, _, _ = CalcDinamicaPinze_TPA( EMT.HT, EMT.ST, EgtIf( bIsSplitted, EMT.LT, EMT.LB))
|
||||
dTempoAcc = dTempoAcc / 1000
|
||||
-- se si raggiunge la velocità massima
|
||||
if dPathLen >= dFeedInSec * dTempoAcc then
|
||||
dTime = dTempoAcc * 2 + ( ( dPathLen - dFeedInSec * dTempoAcc) / dFeedInSec)
|
||||
else
|
||||
dTime = 2 * sqrt( (dPathLen * dTempoAcc) / dFeedInSec)
|
||||
end
|
||||
else
|
||||
local dAcc, _, _, _ = CalcDinamicaPinze_NUM( EMT.HT, EMT.ST, EgtIf( bIsSplitted, EMT.LT, EMT.LB))
|
||||
-- Caso 1: dFeed raggiunta
|
||||
if dPathLen >= ( dFeedInSec ^ 2) / dAcc then
|
||||
dTime = ( dFeedInSec / dAcc) + ( dPathLen / dFeedInSec)
|
||||
-- Caso 2: dFeed non raggiunta
|
||||
else
|
||||
dTime = 2 * sqrt( dPathLen / dAcc)
|
||||
end
|
||||
end
|
||||
|
||||
return dTime
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- *** END GENERAL ***
|
||||
---------------------------------------------------------------------
|
||||
+1037
-286
File diff suppressed because it is too large
Load Diff
+13
-3
@@ -59,6 +59,7 @@ H5.1=AngTransm.nge
|
||||
H5.2=AngTransm.nge
|
||||
H6.1=AngTransm.nge
|
||||
H6.2=AngTransm.nge
|
||||
H7.1=AngTransmBH.nge
|
||||
|
||||
[Machinings]
|
||||
Drilling=1
|
||||
@@ -67,10 +68,15 @@ Milling=1
|
||||
Pocketing=1
|
||||
Mortising=1
|
||||
Chiseling=0
|
||||
SawRoughing=0
|
||||
SawFinishing=0
|
||||
GenMachining=0
|
||||
SurfFinishing=0
|
||||
SurfRoughing=1
|
||||
SurfFinishing=1
|
||||
5AxMilling=1
|
||||
|
||||
[5AxMilling]
|
||||
5AxScript1=5AxProject
|
||||
5AxScript2=5AxPocketProject
|
||||
5AxScript3=5AxCylProject
|
||||
|
||||
[Machining]
|
||||
InitScript=InitMach.lua
|
||||
@@ -88,6 +94,10 @@ H2=6615
|
||||
H3=6616
|
||||
; Angular transmission
|
||||
H5=6603
|
||||
; Angular transmission
|
||||
H6=6603
|
||||
; Angular transmission
|
||||
H7=6617
|
||||
|
||||
[SetUp]
|
||||
Default=Standard
|
||||
|
||||
+388
-131
@@ -1,4 +1,4 @@
|
||||
-- Descrizione macchina Essetre-FAST by EgalTech s.r.l. 2024/03/28
|
||||
-- Descrizione macchina Essetre-FAST by EgalTech s.r.l. 2024/12/23
|
||||
-- 2021/12/29 DS ver 2.3l4 Per NUM non va considerato MillOffs negli offset in Z.
|
||||
-- 2022/01/27 DS ver 2.4a2 Modifiche per tagli testa/coda su pezzi alti.
|
||||
-- 2022/02/10 DS ver 2.4a3 Ridotto di 10mm pinzaggio con pezzi alti ma sottili.
|
||||
@@ -17,43 +17,17 @@
|
||||
-- 2022/12/05 DS ver 2.4l1 In OnLinear di genera CN per Num e NumPlus eliminato recupero sovramateriale di testa EMT.X_OFF dopo riutilizzo EMT.L1o.
|
||||
-- 2023/01/23 DS Ver.2.5a2 In simulazione corretta visualizzazione Sega a catena.
|
||||
-- 2023/02/09 DS Ver.2.5b1 Correzioni NumPlus per parametri G115 e EG2/EG3 al cambio orientazione sega a catena.
|
||||
-- 2023/03/20 DS Ver.2.5c1 Inserita gestione fresa BH al posto della lama.
|
||||
-- 2023/07/26 DS ver.2.5g1 Per NUM e NUM_PLUS aggiunta gestione rotazione in alto su pezzi alti (G101 EH1) come per TPA in versione 2.3f2.
|
||||
-- 2023/07/26 DS ver.2.5g2 Per NUM e NUM_PLUS tolta segnalazione errore rotazione a Zmax per pezzi alti non gestita (era su EMT.FLAG == 5).
|
||||
-- 2023/07/27 DS ver.2.5g3 Il parametro di cui alle modifiche precedenti ora viene emesso solo se anche EMT.FLAG2==1.
|
||||
-- 2023/08/17 DS ver 2.5h2 Possibilità di nuova gestione SawCOffs e SawBOffs con flag NewBCOffs.
|
||||
-- 2023/08/22 DS ver 2.5h3 Eliminata nuova gestione di 2.5h2 perchè inclinando la direzione utensile rispetto al primo rotante limitava le direzioni raggiungibili.
|
||||
-- 2023/09/29 ver 2.5i1 In BeamData e mlde aggiunta la lettura di alcuni parametri da Ts3Data.
|
||||
-- 2023/10/18 DS ver 2.5j1 Con SpliRot ora si assegna da primo movimento di M111/G111 a EE/P8 il corretto valore 2.
|
||||
-- 2023/10/19 DS ver 2.5j2 Per NUM_PLUS correzione per scarico con pezzo dopo oppure passando da Y a V per eliminare ET2 e scommentare ET2004.
|
||||
-- 2023/10/21 DS ver 2.5j3 Gestione caso speciale di rotazione dopo separazione senza lavorazioni sul posizionamento finale.
|
||||
-- 2023/11/04 DS ver 2.5k1 Eliminata testa H4. Aggiunta visualizzazione rinvio su TC.Aggiunta gestione MIN_MACH_VER per simulazione e generazione.
|
||||
-- 2023/12/13 AV ver.2.5l1 Piccola correzione per errore digitazione variabile in calcolo riposizionamento carrelli (SpecAdjustCarrB3)
|
||||
-- Corretto segno di una variabile in calcolo posizionamento carrelli
|
||||
-- 2023/12/15 AV ver.2.5l2 Migliorato calcolo stima tempi di lavorazione
|
||||
-- 2024/01/19 DS ver 2.6a1 Piccola modifica per direzione preferenziale rinvio da sotto (per evitare di accedere dal lato della barra).
|
||||
-- 2024/01/29 DS ver 2.6a2 In portautensili per mortasa e sega a catena aggiunti ingombri dello stesso.
|
||||
-- 2024/02/09 LM ver 2.6b1 In BeamData aggiunta funzione GetBlockedAxis che sostituisce la GetChainSawBlockedAxis.
|
||||
-- 2024/02/23 AV ver 2.6c1 Prima versione con post-processore common
|
||||
-- Allineamento con common ver. 2.6c1
|
||||
-- 2024/02/23 AV ver 2.6c2 Rimossa chiamata funzione EgtGetSourceDir
|
||||
-- Allineamento con common ver. 2.6c2
|
||||
-- 2024/02/23 AV ver 2.6c3 Allineamento con common ver. 2.6c3
|
||||
-- 2024/02/27 AV ver 2.6c4 Allineamento con common ver. 2.6c4. Aggiunto parametro 'SafeXRotAxes' per rotazione motosega con pezzi alti
|
||||
-- 2024/02/29 AV ver 2.6c5 Allineamento con common ver. 2.6c5
|
||||
-- 2024/03/04 AV ver 2.6c6 Modificato log con nome macchina
|
||||
-- Allineamento con common ver. 2.6c6
|
||||
-- 2024/03/09 DS ver 2.6c7 Migliorie alla geometria macchina e suo caricamento.
|
||||
-- 2024/03/12 AV ver 2.6c8 Allineamento con common ver. 2.6c7.
|
||||
-- 2024/03/28 DS ver 2.6c9 Modificata posizione supporto rinvio.
|
||||
-- 2024/03/28 AV ver 2.6d1 Allineamento con common ver. 2.6c8
|
||||
-------------------------------------
|
||||
-- NOTE VERSIONI SUCCESSIVE IN GIT --
|
||||
-------------------------------------
|
||||
|
||||
require( 'EmtGenerator')
|
||||
EgtEnableDebug( false)
|
||||
|
||||
PP_VER = '2.6d1'
|
||||
MIN_MACH_VER = '2.5k1'
|
||||
MACH_NAME = 'Essetre-FAST'
|
||||
PP_VER = '3.1d2'
|
||||
PP_NVER = '3.1.4.2'
|
||||
MIN_MACH_VER = '2.7j1'
|
||||
MACH_NAME = EgtGetCurrMachineName()
|
||||
|
||||
-- Carico i dati globali
|
||||
local sMachDir = EgtGetCurrMachineDir()
|
||||
@@ -72,7 +46,7 @@ end
|
||||
EgtOutLog ( '** ' .. MACH_NAME..' '..PP_VER..' ** ( '..INFO_STD_PP.NAME..': '..INFO_STD_PP.VERSION..' - MinMach: '.. MIN_MACH_VER ..') **', 1)
|
||||
|
||||
-- Parametri macchina
|
||||
NumericalControl = 'TPA' -- NUM o TPA o NUM_PLUS
|
||||
NumericalControl = 'TPA' -- NUM o TPA o NUM_PLUS
|
||||
MinX = 0
|
||||
MaxX = 1350
|
||||
MinZ = -1350
|
||||
@@ -91,15 +65,18 @@ LoadT = 1454.2
|
||||
UnloadT = -1700
|
||||
MaxOpen = 305
|
||||
MillOffs = 177.35
|
||||
DistRotCenterBToTopC = 403 -- distanza tra il centro di rotazione del mandrino B e la mensola C
|
||||
SawOffs = -242.68
|
||||
SawBOffs = 0
|
||||
SawCOffs = 0
|
||||
ChSawLen = 90.0
|
||||
AngTr1Offs = 170
|
||||
AngTr1Len = 150
|
||||
AngTrBHOffs = 154.5
|
||||
AngTrBHLen = 90
|
||||
TurnerOffs = 200.0
|
||||
DeltaTabY = 898.0
|
||||
DeltaTabZ = -1017.8 + MillOffs -- per TPA : -1013.3 + MillOffs -- per NUM : -838.4
|
||||
DeltaTabZ = -1017.8 + MillOffs -- per TPA : -1013.3 + MillOffs -- per NUM : -838.4
|
||||
DimTabY = 400
|
||||
DimTabX = 34000
|
||||
LenToPress = 900
|
||||
@@ -110,10 +87,25 @@ DefTcPos = 'T2'
|
||||
SecondSupport = 0
|
||||
SpecialBH = false
|
||||
MaxUnloadLen = 0
|
||||
BeamHeightForFixRot = 9999 -- per abilitare assegnare 500
|
||||
CoeffVM = 0.5
|
||||
BeamHeightForFixRot = 9999 -- per abilitare assegnare 500
|
||||
NewTopC = true
|
||||
SafeXRotAxes = 150
|
||||
AggreBlockHaus = false
|
||||
SecondToolChanger = false
|
||||
EstimationRapidMultiplier = 1
|
||||
DistZClampToTable = 5 -- distanza tra la tavola e il punto più basso della morsa
|
||||
ClampingCoeffMin = nil -- coefficiente di fissaggio, se 0 o nil non fa controllo, per il momento da inizializzare da Ts3Data
|
||||
MinJoinVV = 75
|
||||
MinJoinSS = 100
|
||||
MinJoinLS = 290
|
||||
MinJoinSL = 100
|
||||
MinJoinLL = 400
|
||||
DistHeadToCabinUnload = nil -- distanza tra la paratia al carico e la testa macchina (Y) in valore assoluto
|
||||
DistHeadToCabinLoad = nil -- distanza tra la paratia allo scarico e la testa macchina (Y) in valore assoluto
|
||||
|
||||
-- costanti dimensioni utensili
|
||||
LONG_TOOL_MINLEN = 218.5
|
||||
BIG_TOOL_DIAM = 300
|
||||
|
||||
-- leggo e aggiorno con parametri da BeamData
|
||||
if BD then
|
||||
@@ -164,6 +156,8 @@ if EgtExistsFile( sData) then
|
||||
AngTr1Len = Machine.Offsets.OFFSETX_RINV_1 or AngTr1Len
|
||||
--if Machine.Offsets.OFFSETZ_RINV_2 then AngTr2Offs = Machine.Offsets.OFFSETZ_RINV_2 - EgtIf( NumericalControl == 'TPA', MillOffs, 0) end
|
||||
--AngTr2Len = Machine.Offsets.OFFSETX_RINV_2 or AngTr2Len
|
||||
if Machine.Offsets.OFFSETZ_RINV_BH then AngTrBHOffs = Machine.Offsets.OFFSETZ_RINV_BH - EgtIf( NumericalControl == 'TPA', MillOffs, 0) end
|
||||
AngTrBHLen = Machine.Offsets.OFFSETX_RINV_BH or AngTrBHLen
|
||||
TurnerOffs = Machine.Offsets.OFFSETRIB or TurnerOffs
|
||||
if Machine.Offsets.OFFSETX then DeltaTabY = - Machine.Offsets.OFFSETX end
|
||||
if Machine.Offsets.OFFSETZ then DeltaTabZ = Machine.Offsets.OFFSETZ + EgtIf( NumericalControl == 'TPA', MillOffs, 0) end
|
||||
@@ -172,10 +166,37 @@ if EgtExistsFile( sData) then
|
||||
if Machine.Offsets.RIB_AUTO then AutomaticRotation = ( Machine.Offsets.RIB_AUTO == 1) end
|
||||
if Machine.Offsets.NOULOAD then MaxUnloadLen = Machine.Offsets.NOULOAD end
|
||||
if Machine.Offsets.DEFTCPOS then DefTcPos = ( 'T' .. Machine.Offsets.DEFTCPOS) end
|
||||
if Machine.Offsets.WOOD_DENSITY then WoodDensity = Machine.Offsets.WOOD_DENSITY end
|
||||
if Machine.Offsets.MIN_JOIN_VV then MinJoinVV = EgtClamp( Machine.Offsets.MIN_JOIN_VV, 60, 150) end
|
||||
if Machine.Offsets.MIN_JOIN_SS then MinJoinSS = EgtClamp( Machine.Offsets.MIN_JOIN_SS, 80, 275) end
|
||||
if Machine.Offsets.MIN_JOIN_LS then MinJoinLS = EgtClamp( Machine.Offsets.MIN_JOIN_LS, 250, 400) end
|
||||
if Machine.Offsets.MIN_JOIN_SL then MinJoinSL = EgtClamp( Machine.Offsets.MIN_JOIN_SL, 80, 400) end
|
||||
if Machine.Offsets.MIN_JOIN_LL then MinJoinLL = EgtClamp( Machine.Offsets.MIN_JOIN_LL, 300, 600) end
|
||||
if Machine.Offsets.MAXFEEDPINZE then MaxFeedPinze = Machine.Offsets.MAXFEEDPINZE end
|
||||
if Machine.Offsets.MAXACC then MaxAcc = Machine.Offsets.MAXACC end
|
||||
if Machine.Offsets.MINACC then MinAcc = Machine.Offsets.MINACC end
|
||||
if Machine.Offsets.NEWTOPC then NewTopC = ( Machine.Offsets.NEWTOPC == 1) end
|
||||
if Machine.Offsets.AGGRE_BH then AggreBlockHaus = ( Machine.Offsets.AGGRE_BH == 1) end
|
||||
if Machine.Offsets.SEC_TC then SecondToolChanger = ( Machine.Offsets.SEC_TC == 1) end
|
||||
if Machine.Offsets.COEFF_STIMATEMPI and Machine.Offsets.COEFF_STIMATEMPI > 0 then EstimationRapidMultiplier = Machine.Offsets.COEFF_STIMATEMPI end
|
||||
if Machine.Offsets.MAX_HEIGHT_ROT_B_ABOVE then BeamHeightForFixRot = Machine.Offsets.MAX_HEIGHT_ROT_B_ABOVE end
|
||||
if Machine.Offsets.COEFF_CLAMP_CHECK then ClampingCoeffMin = Machine.Offsets.COEFF_CLAMP_CHECK end
|
||||
if Machine.Offsets.DIST_ROT_CENTER_B_TO_TOP_C then DistRotCenterBToTopC = EgtClamp( Machine.Offsets.DIST_ROT_CENTER_B_TO_TOP_C, 395, 410) end
|
||||
if Machine.Offsets.LONG_TOOL_MINLEN then LONG_TOOL_MINLEN = EgtClamp( Machine.Offsets.LONG_TOOL_MINLEN, 216, 226.1) end
|
||||
if Machine.Offsets.DIST_HEAD_TO_CABIN_UNLOAD then DistHeadToCabinUnload = Machine.Offsets.DIST_HEAD_TO_CABIN_UNLOAD end
|
||||
if Machine.Offsets.DIST_HEAD_TO_CABIN_LOAD then DistHeadToCabinLoad = Machine.Offsets.DIST_HEAD_TO_CABIN_LOAD end
|
||||
end
|
||||
end
|
||||
end
|
||||
if SpecialBH then SecondSupport = 0 end
|
||||
-- Aggiorno valori MinJoin
|
||||
MinJoin = MinJoinSS
|
||||
MinOther = abs( MinY) + abs( MaxV) + MinJoin
|
||||
DeltaTol = 210
|
||||
|
||||
-- compongo i gruppi appartenenti alla base
|
||||
local sBaseAux = {'BASE/SOLID', 'BASE/TC', 'BASE/SIGN', 'BASE/COLLISION'}
|
||||
if SecondToolChanger then table.insert( sBaseAux, 5, 'BASE/TC2') end
|
||||
|
||||
EmtGeneral {
|
||||
File='Essetre-FAST.nge',
|
||||
@@ -185,12 +206,25 @@ EmtGeneral {
|
||||
ExitMaxAdjust = 30,
|
||||
ExitMaxRotAdj = 0.5,
|
||||
AngDeltaMinForHome = 165,
|
||||
Special = 'Common-FAST.mlse',
|
||||
Processor = 'Common-FAST.mlpe'}
|
||||
Special = 'Common_FAST.mlse',
|
||||
Processor = 'Common_FAST.mlpe'}
|
||||
local BaseId = EmtBase {
|
||||
Name = 'Base',
|
||||
Geo='BASE/GEO',
|
||||
Aux={'BASE/SOLID', 'BASE/TC', 'BASE/SIGN', 'BASE/COLLISION'}}
|
||||
Aux = sBaseAux}
|
||||
-- Sposta la faccia interna alla cabina dei solidi di collisione se sono impostati nel TS3Data, valori positivi
|
||||
if DistHeadToCabinLoad then
|
||||
local nSide1Id = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( BaseId, 'COLLISION'), 'SIDE1')
|
||||
local b3Collision = EgtGetBBox( nSide1Id, GDB_BB.STANDARD)
|
||||
local vtMove = Vector3d( -abs( DistHeadToCabinLoad) - b3Collision:getMax()[1], 0, 0)
|
||||
EgtSurfTmMoveFacet( nSide1Id, 3, vtMove, GDB_RT.GLOB)
|
||||
end
|
||||
if DistHeadToCabinUnload then
|
||||
local nSide2Id = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( BaseId, 'COLLISION'), 'SIDE2')
|
||||
local b3Collision = EgtGetBBox( nSide2Id, GDB_BB.STANDARD)
|
||||
local vtMove = Vector3d( abs( DistHeadToCabinUnload) - b3Collision:getMin()[1], 0, 0)
|
||||
EgtSurfTmMoveFacet( nSide2Id, 3, vtMove, GDB_RT.GLOB)
|
||||
end
|
||||
local XId = EmtAxis {
|
||||
Name = 'X',
|
||||
Parent = 'Base',
|
||||
@@ -221,25 +255,29 @@ local CId = EmtAxis {
|
||||
Stroke = {MinC, MaxC},
|
||||
Home = 0,
|
||||
Geo = 'C_AXIS/GEO',
|
||||
Aux = {'C_AXIS/SOLID', 'C_AXIS/COLLISION'}}
|
||||
if NewTopC then
|
||||
local vtMove = Vector3d( 65,0,0)
|
||||
local SolidArmId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( CId, 'SOLID'), 'ARM')
|
||||
if EgtSurfTmMoveFacet then
|
||||
EgtSurfTmMoveFacet( SolidArmId, 11, vtMove, GDB_RT.GLOB)
|
||||
else
|
||||
EgtSurfTmMoveVertex( SolidArmId, 23, EgtSurfTmGetVertex( SolidArmId, 23, GDB_RT.GLOB) + vtMove, GDB_RT.GLOB)
|
||||
EgtSurfTmMoveVertex( SolidArmId, 25, EgtSurfTmGetVertex( SolidArmId, 25, GDB_RT.GLOB) + vtMove, GDB_RT.GLOB)
|
||||
EgtSurfTmMoveVertex( SolidArmId, 35, EgtSurfTmGetVertex( SolidArmId, 35, GDB_RT.GLOB) + vtMove, GDB_RT.GLOB)
|
||||
EgtSurfTmMoveVertex( SolidArmId, 36, EgtSurfTmGetVertex( SolidArmId, 36, GDB_RT.GLOB) + vtMove, GDB_RT.GLOB)
|
||||
end
|
||||
local CollTopId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( CId, 'COLLISION'), 'TOP')
|
||||
EgtMove( CollTopId, vtMove, GDB_RT.GLOB)
|
||||
EgtSetName( CollTopId, 'BOX')
|
||||
else
|
||||
local CollTopId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( CId, 'COLLISION'), 'TOP')
|
||||
EgtSetName( CollTopId, 'BOX')
|
||||
end
|
||||
Aux = {'C_AXIS/SOLID', 'C_AXIS/COLLISION', 'C_AXIS/COLLISION2'}}
|
||||
|
||||
-- Imposto i vettori di movimento separatamente se sono presenti le variabili di riferimento
|
||||
local vtXMove = Vector3d( EgtIf( NewTopC, 65, 0), 0, 0)
|
||||
-- si prende la minima distanza tra DistRotCenterBToTopC e LONG_TOOL_MINLEN + pivot (comunque distanza minima 403)
|
||||
local dZMove = max( 403, min( ( MillOffs + LONG_TOOL_MINLEN + 5), DistRotCenterBToTopC)) - 400
|
||||
local vtZMove = Vector3d( 0, 0, dZMove)
|
||||
-- Muove le facce in X e Z del solido principale
|
||||
local SolidArmId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( CId, 'SOLID'), 'ARM')
|
||||
EgtSurfTmMoveFacet( SolidArmId, 14, vtZMove, GDB_RT.GLOB)
|
||||
EgtSurfTmMoveFacet( SolidArmId, 11, vtXMove, GDB_RT.GLOB)
|
||||
-- Muove il solido di collisione denominato "TOP" in X e muove la sua faccia inferiore per portarla al pari del solido principale
|
||||
local CollTopId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( CId, 'COLLISION'), 'TOP')
|
||||
EgtMove( CollTopId, vtXMove, GDB_RT.GLOB)
|
||||
EgtSurfTmMoveFacet( CollTopId, 4, vtZMove, GDB_RT.GLOB)
|
||||
EgtSetName( CollTopId, 'BOX')
|
||||
-- Imposta nel Frame di riferimento l'info "CollSkip"
|
||||
local RefId = CollTopId + EgtGetInfo( CollTopId, 'Frame', 'i')
|
||||
EgtSetInfo( RefId, 'CollSkip', 'C_TOP')
|
||||
-- Muove il solido di collisione C_TOP
|
||||
local CollUtTopId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( CId, 'COLLISION2'), 'C_TOP')
|
||||
EgtMove( CollUtTopId, vtZMove, GDB_RT.GLOB)
|
||||
|
||||
EmtAxis {
|
||||
Name = 'B',
|
||||
Parent = 'C',
|
||||
@@ -312,21 +350,21 @@ end
|
||||
-- Eventuale rinvio angolare
|
||||
if SecondSupport >= 3 then
|
||||
local H5Id = EmtHead {
|
||||
Name = 'H5',
|
||||
Parent = 'B',
|
||||
HSet = 'H1',
|
||||
Type = MCH_HT.MULTI,
|
||||
ExitNbr = 2,
|
||||
Pos1 = Point3d( 0, -AngTr1Len, -AngTr1Offs),
|
||||
TDir1 = Y_AX(),
|
||||
Pos2 = Point3d( 0, AngTr1Len, -AngTr1Offs),
|
||||
TDir2 = -Y_AX(),
|
||||
ADir = Z_AX(),
|
||||
Rot1W = 0.2,
|
||||
Rot2Stroke = { -120, 120},
|
||||
OthColl = { 'H2', 'B/SOLID', 'C/SOLID'},
|
||||
Geo = 'H5_HEAD/GEO',
|
||||
Aux = {'H5_HEAD/SOLID', 'H5_HEAD/COLLISION'}}
|
||||
Name = 'H5',
|
||||
Parent = 'B',
|
||||
HSet = 'H1',
|
||||
Type = MCH_HT.MULTI,
|
||||
ExitNbr = 2,
|
||||
Pos1 = Point3d( 0, -AngTr1Len, -AngTr1Offs),
|
||||
TDir1 = Y_AX(),
|
||||
Pos2 = Point3d( 0, AngTr1Len, -AngTr1Offs),
|
||||
TDir2 = -Y_AX(),
|
||||
ADir = Z_AX(),
|
||||
Rot1W = 0.2,
|
||||
Rot2Stroke = { -120, 120},
|
||||
OthColl = { 'H2', 'B/SOLID', 'C/SOLID'},
|
||||
Geo = 'H5_HEAD/GEO',
|
||||
Aux = {'H5_HEAD/SOLID', 'H5_HEAD/COLLISION'}}
|
||||
EgtSetInfo( H5Id, 'AGB_TYPE', 2)
|
||||
EgtSetInfo( H5Id, 'AGB_DMAX', 240)
|
||||
EgtSetInfo( H5Id, 'AGB_ENCH', 44)
|
||||
@@ -334,6 +372,23 @@ if SecondSupport >= 3 then
|
||||
EgtSetInfo( H5Id, 'AGB_MDIR', X_AX())
|
||||
EgtSetInfo( H5Id, 'ZMAXONROT', '1,15')
|
||||
end
|
||||
-- Eventuale aggregato per lavorazioni BlockHaus
|
||||
if AggreBlockHaus then
|
||||
local H7Id = EmtHead {
|
||||
Name = 'H7',
|
||||
Parent = 'B',
|
||||
HSet = 'H1',
|
||||
Type = MCH_HT.STD,
|
||||
Pos = Point3d( AngTrBHLen, 0, -AngTrBHOffs),
|
||||
TDir = -X_AX(),
|
||||
ADir = X_AX(),
|
||||
Rot1W = 0.2,
|
||||
SolCh = MCH_SCC.ADIR_NEAR,
|
||||
OthColl = {'H2', 'B/SOLID', 'C/SOLID'},
|
||||
Geo = 'H7_HEAD/GEO',
|
||||
Aux = {'H7_HEAD/SOLID', 'H7_HEAD/COLLISION'}}
|
||||
end
|
||||
|
||||
-- Morse
|
||||
local YId = EmtAxis {
|
||||
Name = 'Y',
|
||||
@@ -354,7 +409,7 @@ local PYId = EmtAxis {
|
||||
Stroke = { 0, MaxOpen},
|
||||
Home = MaxOpen,
|
||||
Geo = 'PY_AXIS/GEO',
|
||||
Aux = {'PY_AXIS/SOLID', 'PY_AXIS/COLLISION'}}
|
||||
Aux = {'PY_AXIS/SOLID', 'PY_AXIS/COLLISION', 'PY_AXIS/CLAMP_CHECK'}}
|
||||
local VId = EmtAxis {
|
||||
Name = 'V',
|
||||
Parent = 'Base',
|
||||
@@ -374,7 +429,7 @@ local PVId = EmtAxis {
|
||||
Stroke = { 0, MaxOpen},
|
||||
Home = MaxOpen,
|
||||
Geo = 'PV_AXIS/GEO',
|
||||
Aux = {'PV_AXIS/SOLID', 'PV_AXIS/COLLISION'}}
|
||||
Aux = {'PV_AXIS/SOLID', 'PV_AXIS/COLLISION', 'PV_AXIS/CLAMP_CHECK'}}
|
||||
EmtAxis {
|
||||
Name = 'T',
|
||||
Parent = 'Base',
|
||||
@@ -464,50 +519,138 @@ EmtTcPos {
|
||||
TDir = -X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T10'}
|
||||
EmtTcPos {
|
||||
Name = 'T11',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( 523.8, 88.0, -877.5),
|
||||
TDir = -X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T11'}
|
||||
if not SpecialBH then
|
||||
EmtTcPos {
|
||||
Name = 'T101',
|
||||
if AggreBlockHaus then
|
||||
local TcpSsId = EmtTcPos {
|
||||
Name = 'T11',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -510.4, 113.2, -160.8),
|
||||
TDir = X_AX(),
|
||||
ADir = Z_AX(),
|
||||
Geo = 'BASE/T101'}
|
||||
Pos = Point3d( 678.3, -1.963, -877.5),
|
||||
TDir = Y_AX(),
|
||||
ADir = -X_AX(),
|
||||
Geo = 'BASE/T121',
|
||||
Aux = 'BASE/T121_HS'}
|
||||
else
|
||||
EmtTcPos {
|
||||
Name = 'T101',
|
||||
Name = 'T11',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -510.4, 113.2, -1160.8),
|
||||
TDir = X_AX(),
|
||||
ADir = Z_AX(),
|
||||
Geo = 'BASE/T101S'}
|
||||
Pos = Point3d( 523.8, 88.0, -877.5),
|
||||
TDir = -X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T11'}
|
||||
end
|
||||
if SecondSupport == 1 then
|
||||
-- supporto per punta
|
||||
|
||||
-- ToolChanger 2
|
||||
if SecondToolChanger then
|
||||
EmtTcPos {
|
||||
Name = 'T111',
|
||||
Name = 'T21',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -510.4, 113.2, -329.8),
|
||||
TDir = Z_AX(),
|
||||
ADir = X_AX(),
|
||||
Geo = 'BASE/T111'}
|
||||
elseif SecondSupport == 2 then
|
||||
-- supporto per mortasatrice
|
||||
Pos = Point3d( -503.2, 88.0, 172.5),
|
||||
TDir = X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T21'}
|
||||
EmtTcPos {
|
||||
Name = 'T22',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -503.2, 88.0, 67.5),
|
||||
TDir = X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T22'}
|
||||
EmtTcPos {
|
||||
Name = 'T23',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -503.2, 88.0, -37.5),
|
||||
TDir = X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T23'}
|
||||
EmtTcPos {
|
||||
Name = 'T24',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -503.2, 88.0, -142.5),
|
||||
TDir = X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T24'}
|
||||
EmtTcPos {
|
||||
Name = 'T25',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -503.2, 88.0, -247.5),
|
||||
TDir = X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T25'}
|
||||
EmtTcPos {
|
||||
Name = 'T26',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -503.2, 88.0, -352.5),
|
||||
TDir = X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T26'}
|
||||
EmtTcPos {
|
||||
Name = 'T27',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -503.2, 88.0, -457.5),
|
||||
TDir = X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T27'}
|
||||
EmtTcPos {
|
||||
Name = 'T28',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -503.2, 88.0, -562.5),
|
||||
TDir = X_AX(),
|
||||
ADir = -Y_AX(),
|
||||
Geo = 'BASE/T28'}
|
||||
else
|
||||
if not SpecialBH then
|
||||
EmtTcPos {
|
||||
Name = 'T101',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -510.4, 113.2, -160.8),
|
||||
TDir = X_AX(),
|
||||
ADir = Z_AX(),
|
||||
Geo = 'BASE/T101'}
|
||||
end
|
||||
if SecondSupport == 1 then
|
||||
-- supporto per punta
|
||||
EmtTcPos {
|
||||
Name = 'T111',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -510.4, 113.2, -329.8),
|
||||
TDir = Z_AX(),
|
||||
ADir = X_AX(),
|
||||
Geo = 'BASE/T111'}
|
||||
elseif SecondSupport == 2 then
|
||||
-- supporto per mortasatrice
|
||||
local TcpSsId = EmtTcPos {
|
||||
Name = 'T111',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -510.4, 113.2, -430.8),
|
||||
TDir = X_AX(),
|
||||
ADir = Z_AX(),
|
||||
Geo = 'BASE/T111M'}
|
||||
EgtSetInfo( TcpSsId, 'Mortiser', true)
|
||||
end
|
||||
if SpecialBH then
|
||||
EmtTcPos {
|
||||
Name = 'T111',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -810.4, 113.2, -329.8),
|
||||
TDir = Y_AX(),
|
||||
ADir = X_AX(),
|
||||
Geo = 'BASE/T111S'}
|
||||
end
|
||||
end
|
||||
-- motosega in caso di magazzino 2 o SpecialBH
|
||||
if SpecialBH or SecondToolChanger then
|
||||
local TcpSsId = EmtTcPos {
|
||||
Name = 'T111',
|
||||
Name = 'T101',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -510.4, 113.2, -430.8),
|
||||
Pos = Point3d( -510.4, 113.2, -1160.8),
|
||||
TDir = X_AX(),
|
||||
ADir = Z_AX(),
|
||||
Geo = 'BASE/T111M'}
|
||||
EgtSetInfo( TcpSsId, 'Mortiser', true)
|
||||
elseif SecondSupport == 3 then
|
||||
Geo = 'BASE/T101S'}
|
||||
-- spostamento in caso di magazzino 2
|
||||
if SecondToolChanger then
|
||||
EgtMove( TcpSsId, Vector3d( 0, 0, 140), GDB_RT.GLOB)
|
||||
end
|
||||
end
|
||||
if SecondSupport == 3 then
|
||||
-- supporto per rinvio angolare
|
||||
local TcpSsId = EmtTcPos {
|
||||
Name = 'T91',
|
||||
@@ -520,15 +663,9 @@ elseif SecondSupport == 3 then
|
||||
ADir = Z_AX(),
|
||||
Geo = 'BASE/T91',
|
||||
Aux = 'BASE/T91_HS'}
|
||||
end
|
||||
if SpecialBH then
|
||||
EmtTcPos {
|
||||
Name = 'T111',
|
||||
Parent = 'Base',
|
||||
Pos = Point3d( -810.4, 113.2, -329.8),
|
||||
TDir = Y_AX(),
|
||||
ADir = X_AX(),
|
||||
Geo = 'BASE/T111S'}
|
||||
if SecondToolChanger then
|
||||
EgtMove( TcpSsId, Vector3d( 0, 0, -900), GDB_RT.GLOB)
|
||||
end
|
||||
end
|
||||
|
||||
-- Aggiusto posizioni geometriche
|
||||
@@ -542,10 +679,12 @@ EgtMove( EgtGetFirstNameInGroup( YId, 'SOLID'), vtMove, GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( YId, 'COLLISION'), vtMove, GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( PYId, 'SOLID'), vtMove, GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( PYId, 'COLLISION'), vtMove, GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( PYId, 'CLAMP_CHECK'), vtMove + Vector3d(0,0,DistZClampToTable), GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( VId, 'SOLID'), vtMove, GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( VId, 'COLLISION'), vtMove, GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( PVId, 'SOLID'), vtMove, GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( PVId, 'COLLISION'), vtMove, GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( PVId, 'CLAMP_CHECK'), vtMove + Vector3d(0,0,DistZClampToTable), GDB_RT.GLOB)
|
||||
EgtMove( EgtGetFirstNameInGroup( XId, 'SOLID'), vtMoveX, GDB_RT.GLOB)
|
||||
|
||||
-- Assegno identificativi alle spie delle morse
|
||||
@@ -560,28 +699,49 @@ PVLightId = EgtGetFirstNameInGroup( EgtGetFirstNameInGroup( PVId, 'SOLID') or GD
|
||||
---------------------------------------------------------------------
|
||||
function OnSetHead()
|
||||
-- se testa lama
|
||||
if EMC.HEAD == 'H2' then
|
||||
EmtModifyAxisDirection( 'B', VectorFromRotated( X_AX(), Z_AX(), -SawCOffs))
|
||||
-- altrimenti
|
||||
if EMC.HEAD == 'H1' then
|
||||
if EMC.TOTLEN and EMC.TOTLEN < LONG_TOOL_MINLEN then
|
||||
EmtModifyAxisStroke( 'B', {MinB, MaxB})
|
||||
else
|
||||
EmtModifyAxisStroke( 'B', {-140, 140})
|
||||
end
|
||||
else
|
||||
EmtModifyAxisDirection( 'B', X_AX())
|
||||
if EMC.HEAD == 'H3' then
|
||||
local dDist = EgtIf( EMC.DIST and abs( EMC.DIST) > 1, EMC.DIST, ChSawLen)
|
||||
EmtModifyExitPosition( EMC.HEAD, EMC.EXIT, Point3d( 0, 0, -dDist))
|
||||
if not EMC.VER or EMC.VER < '2.5h2' then
|
||||
local vtMove = Point3d( 0, 0, -dDist) - Point3d( EMC.EXITPOS)
|
||||
local ExitId = EgtGetFirstNameInGroup( EgtGetHeadId( EMC.HEAD), 'T'..tostring( EMC.EXIT))
|
||||
EgtMove( ExitId, vtMove)
|
||||
EmtModifyAxisStroke( 'B', {MinB, MaxB})
|
||||
if EMC.HEAD == 'H2' then
|
||||
EmtModifyAxisDirection( 'B', VectorFromRotated( X_AX(), Z_AX(), -SawCOffs))
|
||||
-- altrimenti
|
||||
else
|
||||
EmtModifyAxisDirection( 'B', X_AX())
|
||||
if EMC.HEAD == 'H3' then
|
||||
local dDist = EgtIf( EMC.DIST and abs( EMC.DIST) > 1, EMC.DIST, ChSawLen)
|
||||
EmtModifyExitPosition( EMC.HEAD, EMC.EXIT, Point3d( 0, 0, -dDist))
|
||||
if not EMC.VER or EMC.VER < '2.5h2' then
|
||||
local vtMove = Point3d( 0, 0, -dDist) - Point3d( EMC.EXITPOS)
|
||||
local ExitId = EgtGetFirstNameInGroup( EgtGetHeadId( EMC.HEAD), 'T'..tostring( EMC.EXIT))
|
||||
EgtMove( ExitId, vtMove)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Funzione che calcola l'angolo Home di C per la sega a catena dal valore dell'asse virtuale
|
||||
function GetChainSawCHomeFromVirtualAxis( dPosA)
|
||||
-- se A=0 -> T111 -> HomeC = 0
|
||||
if abs( dPosA) < 0.1 then
|
||||
return EgtIf( BD.RIGHT_LOAD, -180, 0)
|
||||
-- altrimenti A=90 -> T114 -> HomeC = -90
|
||||
else
|
||||
return EgtIf( BD.RIGHT_LOAD, 90, 270)
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Funzione per impostare spia stato morsa carrello Y
|
||||
function SetPYLight( bClosed)
|
||||
if not PYLightId then return end
|
||||
EgtSetColor( PYLightId, EgtIf( bClosed, 'RED', 'LIME'))
|
||||
EgtSetColor( PYLightId, EgtIf( bClosed, 'RED', 'LIME'))
|
||||
if bClosed then
|
||||
EgtSetInfo( PYLightId, 'On', '1')
|
||||
else
|
||||
@@ -615,6 +775,52 @@ function GetPVLight()
|
||||
return ( EgtGetInfo( PVLightId, 'On') == '1')
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
---------------------------- Cambio Utensile ------------------------
|
||||
function GetTCSet( sTcPos)
|
||||
-- TC 1
|
||||
if sTcPos == 'T1' or sTcPos == 'T2' or sTcPos == 'T3' or sTcPos == 'T4' or sTcPos == 'T5' or
|
||||
sTcPos == 'T6' or sTcPos == 'T7' or sTcPos == 'T8' or sTcPos == 'T9' or sTcPos == 'T10' or sTcPos == 'T11' then
|
||||
return 1
|
||||
-- TC 2
|
||||
elseif sTcPos == 'T21' or sTcPos == 'T22' or sTcPos == 'T23' or sTcPos == 'T24' or
|
||||
sTcPos == 'T25' or sTcPos == 'T26' or sTcPos == 'T27' or sTcPos == 'T28' then
|
||||
return 2
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Funzione per impostare la posizione del rinvio flottante
|
||||
function SetFloatPos( sHead, dPos)
|
||||
-- recupero Id testa
|
||||
local nHeadId = EgtGetHeadId( sHead)
|
||||
if not nHeadId then return false end
|
||||
-- se ci sono entità flottanti nel ToolHolder
|
||||
local nRefId = EgtGetFirstNameInGroup( nHeadId, '_T1')
|
||||
local vtTool = EgtFR( nRefId, GDB_ID.ROOT):getVersZ()
|
||||
local nObjId = EgtGetFirstGroupInGroup( EgtGetFirstNameInGroup( nHeadId, 'T1'))
|
||||
local FloatEntities = EgtGetInfoInGroup( nObjId, 'Float')
|
||||
if FloatEntities and #FloatEntities > 0 then
|
||||
-- il porta-utensile flottante non può comprimersi più di 10mm
|
||||
if dPos > 10 then
|
||||
local sErr = 'Floating Ring compressed more than 10mm'
|
||||
EmtSetLastError( 1222, sErr)
|
||||
EgtOutLog( 'Error : ' .. sErr, 1)
|
||||
end
|
||||
local dFloat = EgtGetInfo( FloatEntities[1], 'Float', 'd')
|
||||
if abs( dPos - dFloat) > 10 * GEO.EPS_SMALL then
|
||||
local vtMove = ( dPos - dFloat) * vtTool
|
||||
-- sposto tutte le entità flottanti
|
||||
for i = 1, #FloatEntities do
|
||||
EgtMove( FloatEntities[i], vtMove, GDB_RT.GLOB)
|
||||
EgtSetInfo( FloatEntities[i], 'Float', dPos)
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
-- Funzione per resettare tutte le attivazioni della macchina
|
||||
function OnResetMachine()
|
||||
@@ -622,6 +828,7 @@ function OnResetMachine()
|
||||
EmtUnlinkAllFixturesFromGroups()
|
||||
SetPYLight( false)
|
||||
SetPVLight( false)
|
||||
SetFloatPos( 'H1', 0)
|
||||
-- nascondo Vmill
|
||||
local nRawId = EgtGetFirstRawPart()
|
||||
while nRawId do
|
||||
@@ -635,3 +842,53 @@ function OnResetMachine()
|
||||
end
|
||||
EgtSetStatus( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'VMill') or GDB_ID.NULL, GDB_ST.OFF)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
function UpdateMinJoinDeltaTol( SB, HB, LB)
|
||||
local L_SMALL = 800
|
||||
local H_V = 90
|
||||
local H_S = 200
|
||||
local H_L = 400
|
||||
local W_V = 90
|
||||
local W_S = 150
|
||||
local W_L = 250
|
||||
local DELTA_TOL_S = 210
|
||||
local DELTA_TOL_V = 110
|
||||
local DELTA_TOL_L = 410
|
||||
if SB <= W_V and HB <= H_V then
|
||||
MinJoin = MinJoinVV
|
||||
DeltaTol = DELTA_TOL_V
|
||||
elseif LB <= L_SMALL then
|
||||
MinJoin = MinJoinSS
|
||||
DeltaTol = DELTA_TOL_S
|
||||
else
|
||||
local dMinJoinS
|
||||
local dMinJoinL
|
||||
if SB <= W_S then
|
||||
dMinJoinS = MinJoinSS
|
||||
dMinJoinL = MinJoinLS
|
||||
elseif SB <= W_L then
|
||||
local Coeff = ( SB - W_S) / ( W_L - W_S)
|
||||
dMinJoinS = ( 1 - Coeff) * MinJoinSS + Coeff * MinJoinSL
|
||||
dMinJoinL = ( 1 - Coeff) * MinJoinLS + Coeff * MinJoinLL
|
||||
else
|
||||
dMinJoinS = MinJoinSL
|
||||
dMinJoinL = MinJoinLL
|
||||
end
|
||||
if HB <= H_S then
|
||||
MinJoin = dMinJoinS
|
||||
DeltaTol = DELTA_TOL_S
|
||||
elseif HB <= H_L then
|
||||
local Coeff = ( HB - H_S) / ( H_L - H_S)
|
||||
MinJoin = ( 1 - Coeff) * dMinJoinS + Coeff * dMinJoinL
|
||||
DeltaTol = ( 1 - Coeff) * DELTA_TOL_S + Coeff * DELTA_TOL_L
|
||||
else
|
||||
MinJoin = dMinJoinL
|
||||
DeltaTol = DELTA_TOL_L
|
||||
end
|
||||
if SB < W_V then
|
||||
DeltaTol = DELTA_TOL_V
|
||||
end
|
||||
end
|
||||
MinOther = abs( MinY) + abs( MaxV) + MinJoin
|
||||
end
|
||||
Binary file not shown.
@@ -0,0 +1,67 @@
|
||||
; Commento per evitare BOM con UTF-8
|
||||
;Index = Type, Description, Default Value
|
||||
; Type : b=boolean, d=double, l=lenght, s=string
|
||||
|
||||
[Drilling]
|
||||
|
||||
[Sawing]
|
||||
|
||||
[Milling]
|
||||
0=l,MaxElev,0
|
||||
1=d,OutRaw,0
|
||||
2=l,SideElev,0
|
||||
3=d,TrimExt,0
|
||||
4=s,VtFaceUse,0,0,0
|
||||
5=s,EdgesFaceUse,0
|
||||
|
||||
[Pocketing]
|
||||
0=l,MaxElev,0
|
||||
1=b,Open,0
|
||||
2=d,OpenMinSafe,0
|
||||
3=d,OpenOutRaw,0
|
||||
4=l,MaxOptSize,0
|
||||
5=b,AdjustFeed,1
|
||||
|
||||
[Mortising]
|
||||
0=l,MaxElev,0
|
||||
|
||||
[Chiseling]
|
||||
|
||||
[SawRoughing]
|
||||
|
||||
[SawFinishing]
|
||||
|
||||
[GenMachining]
|
||||
|
||||
[SurfRoughing]
|
||||
0=l,MaxElev,0
|
||||
1=b,PlaneZ,0
|
||||
2=i,Order,[0=ByPlane;1=ByDepth]
|
||||
|
||||
[SurfFinishing]
|
||||
0=b,SkipMaxDown,1
|
||||
1=i,OptimalType,[0=ZigZag;2=SpiralIn;3=SpiralOut]
|
||||
2=d,SplitAngle,45
|
||||
3=d,AngleTol,5
|
||||
|
||||
[5AxMilling]
|
||||
0=s,VtAuxDir,0,1,0
|
||||
1=l,LinTol,0.01
|
||||
2=l,MaxLen,10
|
||||
3=i,ProjType,[0=MinDist;1=FixedDir;2=Guide]
|
||||
4=i,PocketType,[0=ZigZag;2=SpiralIn;3=SpiralOut]
|
||||
5=d,PocketAng,0
|
||||
6=d,SideAng,90
|
||||
7=d,LeadAng,0
|
||||
8=l,Step,10
|
||||
9=d,AngIni,-90
|
||||
10=d,AngFin,90
|
||||
11=l,LiTang,0
|
||||
12=l,LiOrth,0
|
||||
13=l,LiElev,0
|
||||
14=l,LoTang,0
|
||||
15=l,LoOrth,0
|
||||
16=l,LoElev,0
|
||||
17=b,DirFromGuide,0
|
||||
18=b,SurfAvoid,0
|
||||
19=d,SingConeAng,0.1
|
||||
+29
-12
@@ -24,7 +24,7 @@ local INVALIDPOS = ""
|
||||
local POS = "Pos"
|
||||
|
||||
-- Geom Set
|
||||
local GS = {}
|
||||
local GS = {{"H1", "H7"}}
|
||||
|
||||
-- Configurazione posizioni
|
||||
local PositionTable={{Pos = "Pos1", TcPos = "T1", Head = "H1", Group = "G1"},
|
||||
@@ -40,20 +40,37 @@ local PositionTable={{Pos = "Pos1", TcPos = "T1", Head = "H1", Group = "G1"},
|
||||
{Pos = "Pos11", TcPos = "T11", Head = "H1", Group = "G1"},
|
||||
{Pos = "Pos12", TcPos = "T42", Head = "H2", Group = "G1"},
|
||||
{Pos = "Pos13", TcPos = "T101", Head = "H3", Group = "G2"}}
|
||||
local SecSuppId = EgtGetTcPosId( 'T111')
|
||||
if SecSuppId then
|
||||
local bMortiser = EgtGetInfo( SecSuppId, 'Mortiser', 'b')
|
||||
if bMortiser then
|
||||
table.insert( PositionTable, {Pos = "Pos14", TcPos = "T111", Head = "H3", Group = "G2"})
|
||||
else
|
||||
table.insert( PositionTable, {Pos = "Pos14", TcPos = "T111", Head = "H1", Group = "G2"})
|
||||
|
||||
local IsTC2Active = ( EgtGetFirstNameInGroup( EgtGetBaseId( 'Base'), 'TC2') ~= nil)
|
||||
if IsTC2Active then
|
||||
local PositionTableTC2={{Pos = "Pos14", TcPos = "T21", Head = "H1", Group = "G3"},
|
||||
{Pos = "Pos15", TcPos = "T22", Head = "H1", Group = "G3"},
|
||||
{Pos = "Pos16", TcPos = "T23", Head = "H1", Group = "G3"},
|
||||
{Pos = "Pos17", TcPos = "T24", Head = "H1", Group = "G3"},
|
||||
{Pos = "Pos18", TcPos = "T25", Head = "H1", Group = "G3"},
|
||||
{Pos = "Pos19", TcPos = "T26", Head = "H1", Group = "G3"},
|
||||
{Pos = "Pos20", TcPos = "T27", Head = "H1", Group = "G3"},
|
||||
{Pos = "Pos21", TcPos = "T28", Head = "H1", Group = "G3"}}
|
||||
if EgtGetHeadId( 'H5') then
|
||||
table.insert( PositionTableTC2, {Pos = "Pos22", TcPos = "T91", Head = "H5", Group = "G2"})
|
||||
end
|
||||
EgtJoinTables( PositionTable, PositionTableTC2)
|
||||
else
|
||||
local SecSuppId = EgtGetTcPosId( 'T111')
|
||||
if SecSuppId then
|
||||
local bMortiser = EgtGetInfo( SecSuppId, 'Mortiser', 'b')
|
||||
if bMortiser then
|
||||
table.insert( PositionTable, {Pos = "Pos14", TcPos = "T111", Head = "H3", Group = "G2"})
|
||||
else
|
||||
table.insert( PositionTable, {Pos = "Pos14", TcPos = "T111", Head = "H1", Group = "G2"})
|
||||
end
|
||||
end
|
||||
if EgtGetHeadId( 'H5') then
|
||||
table.insert( PositionTable, {Pos = "Pos14", TcPos = "T91", Head = "H5", Group = "G2"})
|
||||
end
|
||||
end
|
||||
if EgtGetHeadId( 'H5') then
|
||||
table.insert( PositionTable, {Pos = "Pos14", TcPos = "T91", Head = "H5", Group = "G2"})
|
||||
end
|
||||
|
||||
local UsePositionHead = true
|
||||
local UsePositionHead = false
|
||||
|
||||
local function IsInGeomSet( ToolHead, PosHead)
|
||||
for GsIndex = 1, #GS do
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,43 @@
|
||||
; Commento per evitare BOM con UTF-8
|
||||
; Index, Type, Description, Value
|
||||
; Index = 0,1,..,n
|
||||
; Type : d=double, l=lenght, s=string, b=boolean, dr=double recalc, sr= string recalc, lr=lenght recalc, br=boolean recalc, th=toolholder
|
||||
; Description : STEP, SIDESTEP, ...
|
||||
|
||||
[DRILL_STD]
|
||||
0=th,TH,
|
||||
1=l,STEP
|
||||
2=tl,DOUBLE
|
||||
|
||||
[SAW_STD]
|
||||
0=th,TH,
|
||||
1=l,STEP
|
||||
2=l,SIDESTEP
|
||||
3=b,LONGCUT
|
||||
|
||||
[SAW_FLAT]
|
||||
0=th,TH,
|
||||
1=l,STEP
|
||||
2=l,SIDESTEP
|
||||
3=b,LONGCUT
|
||||
|
||||
[MILL_STD]
|
||||
0=th,TH,
|
||||
1=l,STEP
|
||||
2=l,SIDESTEP
|
||||
3=l,SIDEDEPTH
|
||||
4=tl,DOUBLE
|
||||
5=lr,TOOL_OVERHANG
|
||||
|
||||
[MILL_NOTIP]
|
||||
0=th,TH,
|
||||
1=l,STEP
|
||||
2=l,SIDESTEP
|
||||
3=l,SIDEDEPTH
|
||||
4=tl,DOUBLE
|
||||
5=lr,TOOL_OVERHANG
|
||||
|
||||
[MORTISE_STD]
|
||||
0=b,MORTISE
|
||||
1=l,STEP
|
||||
2=l,SIDESTEP
|
||||
+186
@@ -1,5 +1,191 @@
|
||||
==== Common_FAST Update Log ====
|
||||
|
||||
Versione 3.1d2 (22/04/2026)
|
||||
- (GEN) Corretta generazione del PreparePostRotation (in tutti i CN) ora salva lo stato della pinza per lo spostamento successivo. Ticket#2933
|
||||
- (SIM-GEN) Corretto pinzaggio in caso di passo del pellegrino con recupero completo di una sola pinza
|
||||
|
||||
Versione 3.1d1 (14/04/2026)
|
||||
- (SIM-GEN) Aggiorna lo step totale del PilgrimStep e lo step Y con il valore di MyMinY, di modo che tenga conto del AGG_LOAD quando c'è. Ticket#2919
|
||||
- (GEN) Per NUM, si lascia aperta la pinza di carico in caso di END2. TPA era già corretto. Ticket#2869
|
||||
|
||||
Versione 3.1c2 (30/03/2026)
|
||||
- (SIM-GEN) Corretti moviemnti con motosega. Ora si ruota la C con B sempre a zero, anche alla posizione X di sicurezza. Ticket#2866
|
||||
|
||||
Versione 3.1c1 (27/03/2026)
|
||||
- (SIM-GEN) FASTCLAMPING = true : si suddivide il movimento metà tirando e metà spingendo con altra pinza. Così si aumenta la velocità.
|
||||
- FASTCLAMPING = false : una pinza resta ferma e si fa il movimento tutto con una pinza. Così si limita lo scivolamento del pezzo.
|
||||
- (GEN) In caso di motosega prelevata, si ruota in home. Ticket#2866
|
||||
|
||||
Versione 3.1a2 (26/01/2026)
|
||||
- (GEN) Nella G101 il parametro EE era sempre a 4 perchè la variabile veniva settata dopo. Ticket#2796
|
||||
|
||||
Versione 3.1a1 (08/01/2026)
|
||||
- (SIM) Ottimizzata scrittura funzione ClampCheck post aggiornamento dll
|
||||
- (SIM) Corretto problema della funzione OnSimulDispositionStart in caso di fase finale.
|
||||
- (MLDE-SIM-GEN) Variabile DeltaTol deve essere spostata in MLDE
|
||||
|
||||
Versione 2.7l3 (22/12/2025)
|
||||
- (SIM) Eliminata MinJoin, utilizzata al suo posto funzione già esistente UpdateMinJoin nell'mlde
|
||||
- (SIM) Modificata formula calcolo Area minima
|
||||
|
||||
Versione 2.7l2 (18/12/2025)
|
||||
- (SIM) Aggiunta funzione CheckClamping
|
||||
|
||||
Versione 2.7l1 (10/12/2025)
|
||||
- (SIM) Aggiornata risoluzione VMillTol in funzione dello spessore lama
|
||||
- (EST) Modifiche a calcolo stima tempi, da verificare.
|
||||
- (SIM) Corretto movimento in simulazione che non rispettava movimento generato.
|
||||
- (GEN) Con controllo NUM/NUM_PLUS nella scrittura della coordinata tolto il simbolo '='
|
||||
- (SIM) Aggiunto controllo C in base a carico Dx o Sx durante il cambio utensile
|
||||
|
||||
Versione 2.7k1 (10/11/2025)
|
||||
- (GEN) Corretto set variabili info utensile prima del movimento in home in caso di pezzi alti per NUM/NUM_PLUS.
|
||||
|
||||
Versione 2.7j2 (08/10/2025)
|
||||
- (SIM-GEN) Quando si scarica motosega, si raddrizza prima l'asse B e poi si muove il C. Ora sempre e non solo se pezzo alto.
|
||||
|
||||
Versione 2.7j1 (06/10/2025)
|
||||
- (SIM-GEN) Quando si scarica motosega, si raddrizza prima l'asse B e poi si muove il C.
|
||||
- (MLDE-SIM) Controllo collisione tra utensile e TOP testa C. Serve CAM5 2.7j1
|
||||
|
||||
Versione 2.7i3 (23/09/2025)
|
||||
- (MLDE-ALL) Spostate costanti dimensioni utensili in MLDE.
|
||||
|
||||
Versione 2.7i2 (17/09/2025)
|
||||
- (EST) Stima tempi considerando accelerazioni
|
||||
- (SIM) Prelievo e deposito motosega con gli angoli comunicati da Essetre
|
||||
|
||||
Versione 2.7i1 (08/09/2025)
|
||||
- (SIM-GEN) Se lavorazione precedente e successiva con motosega e si cambiano assi rotanti, vado in parcheggio per ruotare. Ticket#1844
|
||||
- (SIM-GEN) Per NEWCLAMPING, corretto un caso di riposizionemento allo scarico dove la pinza V poteva andare in posizione direttamente, ma cercava di fare passo pellegrino. Ticket#2572
|
||||
|
||||
Versione 2.7g1 (01/07/2025)
|
||||
- (GEN) Aggiunti parametri FMAXPINZE, MAXACC, MINACC configurabili da TS3. Ticket#2052
|
||||
|
||||
Versione 2.7f3 (26/06/2025)
|
||||
- (SIM-GEN) Aggiunti 10mm di sicurezza in caso di primo pinzaggio per stare oltre tolleranza riqualifica laser di 50mm. Ticket#2504
|
||||
|
||||
Versione 2.7f2 (19/06/2025)
|
||||
- (GEN) Se in separazione il pezzo è andato più lontano della posizione standard, viene riletta. Ticket#2498
|
||||
|
||||
Versione 2.7f1 (18/06/2025)
|
||||
- (SIM-GEN) Se utensile più lungo di 350mm, si va in posizione sicurezza come per la motosega. Ticket#2438
|
||||
|
||||
Versione 2.7e1 (26/05/2025)
|
||||
- (SIM) Aumentata dimensione massima per la quale si rimuove uno scarto dal VMILL. Ticket#1438
|
||||
- (SIM) In simulazione, corretto selezione utensile per punte lunghe. Ticket#2438
|
||||
|
||||
Versione 2.7d1 (14/04/2025)
|
||||
- (GEN) Corretto movimento iniziale in caso di motosega, si controlla solo se non è il carico. Ticket#2385
|
||||
|
||||
Versione 2.7c1 (26/03/2025)
|
||||
- (GEN) All'inizio del codice ISO si scrive nel commento anche il controllo numerico utilizzato per la generazione.
|
||||
- (GEN) Aggiunta commenti HEADER e FOOTER per comunicazione con linea o altre macchine, da parte di Essetre.
|
||||
- (GEN) In MyAdjustLinearAxes si utilizza TDIR per calcolarsi gli offset per compatibilità con lavorazioni a 5 assi.
|
||||
|
||||
Versione 2.7b1 (20/02/2025)
|
||||
- (SIM-GEN) Aggiunta possibilità di settare HCING/TCING nelle note di ogni singola lavorazione per gestire parte non pinzabile del pezzo. Funziona solo con nuovo pinzaggio.
|
||||
- (SIM-GEN) Piccola correzione calcolo posizione carrelli con nuova strategia di pinzaggio.
|
||||
- (SIM-GEN) Caricamento libreria EmtGenMachining. Si fa una require con PCALL perchè la libreria è opzionale e non è detto che ci sia. In installazione CAM5 dalla 2.7a1
|
||||
- (GEN) Per controllo TPA, modifica al numero di decimali.
|
||||
- (SIM) Aggiunta gestione per ToolHolder flottante
|
||||
|
||||
Versione 2.7a3 (08/01/2025)
|
||||
- (GEN) Dopo separazione, in NUM_PLUS, si srive EH1 solo se macro G101, perchè altrimenti non è prevista. Ticket#2239
|
||||
|
||||
Versione 2.7a2 (08/01/2025)
|
||||
- (MLDE-SIM) Aggiunta gestione FACOLTATIVA 'EstimationRapidMultiplier' in MLDE per regolare il tempo stimato. Se non presente in MLDE, default 1.
|
||||
- (SIM) Aggiunta gestione qualità VMILL da impostazioni macchina
|
||||
|
||||
Versione 2.7a1 (07/01/2025)
|
||||
- (MLDE-SIM-GEN) Nuovo aggregato 90° (H7) per fresa tipo BlockHaus. Ticket#2142
|
||||
- (SIM-GEN) Aumentati limiti massimi di pinzaggio minimo
|
||||
|
||||
Versione 2.6l1 (02/12/2024)
|
||||
- (SIM) Corretto movimento VMILL durante scarico pezzo piccolo a caduta
|
||||
- (SIM-GEN) Per decidere posizione parcheggio barra dopo separazione, si considera lunghezza coda del pezzo in lavoro per evitare collisioni. Ticket#2168
|
||||
|
||||
Versione 2.6k1 (11/11/2024)
|
||||
- (GEN) Aggiunta gestione aggregato a T per NUM
|
||||
- (SIM) Tolta gestione testa dummy H4
|
||||
- (SIM-GEN) Aggiustato parametro in calcolo ingombro lavorazione. Ticket#2163
|
||||
|
||||
Versione 2.6j10 (25/10/2024)
|
||||
- (SIM-GEN) Miglioria 2.6j9. Si ribadisce pinza in presa sempre, all'inizio, in base a quella attiva
|
||||
|
||||
Versione 2.6j9 (22/10/2024)
|
||||
- (SIM-GEN) Miglioria 2.6j6. Oltre al passo pellegrino si ribadisce anche quando è scambio diretto
|
||||
|
||||
Versione 2.6j8 (21/10/2024)
|
||||
- (SIM-GEN) Corretto problema tolleranza aggiunto con versione 2.6j7
|
||||
|
||||
Versione 2.6j7 (18/10/2024)
|
||||
- (SIM-GEN) In nuova disposizione carrelli, aggiunta tolleranza di 100 EPS quando si calcola minimo posizionamento
|
||||
|
||||
Versione 2.6j6 (17/10/2024)
|
||||
- (GEN) Si ribadisce che la pinza era in presa, prima di cominciare con lo scambio del passo del pellegrino. Ticket#2121
|
||||
|
||||
Versione 2.6j5 (17/10/2024)
|
||||
- (SIM-GEN) Piccola correzione nuovo riposizionamento. Nel taglio dello scarto finale riposizionava nel vuoto. Ticket#2115
|
||||
|
||||
Versione 2.6j4 (15/10/2024)
|
||||
- (SIM-GEN) Piccola correzione nuovo riposizionamento. Non considerava i 50mm di tolleranza su primo pinzaggio dopo ribaltamento
|
||||
- (SIM-GEN) Gestione attivazione pressore verticale in nuovo riposizionamento
|
||||
|
||||
Versione 2.6j3 (11/10/2024)
|
||||
- (GEN) Corretta scrittura macro start/attesa movimenti per NUM. Veniva scritto codice per TPA.
|
||||
|
||||
Versione 2.6j2 (03/10/2024)
|
||||
- (SIM-GEN) Piccola correzione calcolo posizione carrello durante riposizionamento, nuova gestione
|
||||
|
||||
Versione 2.6j1 (01/10/2024)
|
||||
- (SIM-GEN) Sistemato calcolo in nuova disposzione carrelli
|
||||
|
||||
Versione 2.6i6 (25/09/2024)
|
||||
- (GEN) Migliorata gestione movimenti per portare testa vicino a cambio utensile se trave alta. Ticket#2066
|
||||
|
||||
Versione 2.6i5 (24/09/2024)
|
||||
- (SIM-GEN) Tolto controllo su lunghezza maggiore di 200mm introdotto con 2.6i2 perchè non completamente funzionante
|
||||
- (GEN) Gestione in OnRapid() di EMT.FLAG=5 (rotazione a Z max per lavorazione successiva). Ora allineata alla simulazione
|
||||
|
||||
Versione 2.6i4 (24/09/2024)
|
||||
- (SIM-GEN) Aggiunto ripinzaggio extra in caso servisse un grande spostamento e si sta pinzando poco.
|
||||
L'aggiunta del ripinzaggio dipende da FASTCLAMPING (che deve essere disattiva). Viene aggiunta GAIN_RECLAMPING per decidere il guadagno in mm del ripinzaggio.
|
||||
|
||||
Versione 2.6i3 (23/09/2024)
|
||||
- (SIM-GEN) Aggiunta nuova strategia riposizionamento morse
|
||||
- (SIM-GEN) Aggiunta lettura flag NEWCLAMPING in BeamData, per abilitare nuova strategia riposizionamento. Se false o nil, funziona con metodo vecchio.
|
||||
- (SIM-GEN) Aggiunta lettura flag FASTCLAMPING. Se false, al carico prende al massimo 1000mm, per evitare collisioni durante ciclo di lettura laser e prima lavorazione.
|
||||
|
||||
Versione 2.6i2 (16/09/2024)
|
||||
- (SIM-GEN) Se utensili più lunghi di 200mm, si ruota in home e poi si approccia il pezzo. Ticket#2038
|
||||
- (SIM-GEN) Aumentata distanza ingombro da 650mm a 660mm. In casi di utensile abbastanza lungo poteva andare in colisione. Ticket#2041
|
||||
|
||||
Versione 2.6i1 (02/09/2024)
|
||||
- (MLDE-SIM-GEN) Rinominato file da "Common-" a "Common_" per uniformità con i file common delle altre macchine. Serve modifica a MLDE macchina.
|
||||
|
||||
Versione 2.6g1 (03/07/2024)
|
||||
- (GEN) Corretto chiamata macro precarico in caso di taglio finale, ma con ribaltamento successivo. Ora si chiama solo se la fase successiva è una "END". Ticket#1881
|
||||
- (GEN) Per controllo NUM, se arco maggiore di 99999mm, si approssima con una retta. Ticket#1888
|
||||
|
||||
Versione 2.6e3 (06/05/2024)
|
||||
- (MLDE-SIM-GEN) Gestione facoltativa parametri MIN_JOIN_xx settabili in Ts3. Ticket#1794
|
||||
|
||||
Versione 2.6e2 (06/05/2024)
|
||||
- (SIM-GEN) Modificata tolleranza calcolo ingombri lavorazioni per posizionamento pinze. Ticket#1790
|
||||
|
||||
Versione 2.6e1 (30/04/2024)
|
||||
- (MLDE-GEN) Gestione facoltativa parametro WOOD_DENSITY settabile in Ts3. In MLDE, mettere il valore di WOOD_DENSITY nella nostra variabile 'WoodDensity'.
|
||||
|
||||
Versione 2.6d2 (18/04/2024)
|
||||
- (SIM-GEN) In MLSE, quando c'è una rotazione, viene settato EMT.CNT=1 per considerare i 50mm di compensazione laser.
|
||||
- (SIM) Nel file di log dove c'è stampa gruppi di collisione, viene scritto anche ID del gruppo
|
||||
|
||||
Versione 2.6d1 (15/04/2024)
|
||||
- (GEN) Aggiunta gestione aggregato doppia uscita per controllo NUM_PLUS
|
||||
- (GEN) Con aggregato con si possono fare archi, se OnArc con aggregato, dà errore.
|
||||
- (GEN) Chiamando la macchina con un nome che termini con '.TEST' si abilita come macchina per test interni, equivalente a settare 'IS_TEST_MACHINE' (che comunque rimane)
|
||||
|
||||
Versione 2.6c8 (28/03/2024)
|
||||
- (MLSE) Possibilità di lavorazione da X- tra le pinze, se abilitata da flag (User.ENABLE_TOOL_BETWEEN_VICES == 1).
|
||||
- (MLDE-GEN) Aggiunto parametro 'IS_TEST_MACHINE' FACOLTATIVO. Se non esiste o 'false' è macchina standard, se 'true' è una macchina utilizzata per i test Egalware interni
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
-- Gestione della versione dei file comuni post-processori macchine FAST e FASTrl di Essetre
|
||||
|
||||
local InfoCommon_STD_PP = {
|
||||
NAME = 'Common-FAST', -- nome script PP standard
|
||||
VERSION = '2.6c8', -- versione script
|
||||
NAME = 'Common_FAST', -- nome script PP standard
|
||||
VERSION = '3.1d2', -- versione script
|
||||
MIN_MACH_VER_PP_COMMON = '2.5k1' -- versione minima kernel
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user