From b7133b5ffd12d8fc4c87008d902b6aced66ef3f1 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Tue, 29 Dec 2020 08:11:32 +0000 Subject: [PATCH] DataBeam : - aggiunto script per nuova interfaccia utente. --- BatchProcessNew.lua | 525 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 525 insertions(+) create mode 100644 BatchProcessNew.lua diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua new file mode 100644 index 0000000..cd558cb --- /dev/null +++ b/BatchProcessNew.lua @@ -0,0 +1,525 @@ +-- BatchProcess.lua by Egaltech s.r.l. 2020/06/12 +-- Gestione calcolo batch disposizione e lavorazioni per Travi +-- 2019/07/11 Aggiunta gestione stato rotazione di feature per TS3. +-- 2019/07/16 Aggiunta gestione modalità oltre 10 per impostazione macchina e uscita. +-- 2019/07/19 Aggiunta gestione collisioni. +-- 2019/07/24 Aggiunta gestione extra-corse. +-- 2019/08/29 Aggiunta possibilità di processare file NGE. +-- 2019/10/04 Migliorato log dei parametri ricevuti. +-- 2019/10/07 Aggiunta gestione Flag 4 = Check+Generate. +-- 2019/10/09 In ImportBtl aggiunto flag per usare UserAttr. +-- 2019/12/09 Gestione conservazione modifiche su barre. +-- 2019/12/20 Gestione LOAD90 tramite file ausiliario (btm). +-- 2019/12/28 Tolta uscita in caso di errore su features. +-- 2020/01/08 Aggiunta seconda sezione limite (BD.MAX_WIDTH2 x BD.MAX_HEIGHT2). +-- 2020/01/14 Si carica ultimo gruppo di lavoro. Corretto problema con nome non definito in segnalazione errore in generazione o stima. +-- 2020/01/30 File Diff con nome del btl. +-- 2020/02/12 Migliorie nella gestione degli errori. +-- 2020/06/12 Si esegue sempre Processing se parametri macchina TS3 successivi al btl. + +-- Intestazioni +require( 'EgtBase') +_ENV = EgtProtectGlobal() +EgtEnableDebug( false) + +-- Per test +--BEAM = {} +--BEAM.FILE = 'c:\\EgtData\\Varie\\TestEssetreFast\\TestFilippo\\BTL\\Bar_20_1.btl' +--BEAM.MACHINE = 'FAST' +--BEAM.FLAG = 3 + +-- Log dati in input +local sFlag = '' +if BEAM.FLAG == 0 then + sFlag = 'GENERATE' +elseif BEAM.FLAG == 1 then + sFlag = 'MODIFY' +elseif BEAM.FLAG == 2 then + sFlag = 'SIMULATE' +elseif BEAM.FLAG == 3 then + sFlag = 'CHECK' +elseif BEAM.FLAG == 4 then + sFlag = 'CHECK+GENERATE' +elseif BEAM.FLAG == 11 then + sFlag = 'TOOLS' +elseif BEAM.FLAG == 12 then + sFlag = 'JOBS' +else + sFlag = 'FLAG='..tostring( BEAM.FLAG) +end +local sLog = 'BatchProcess : ' .. BEAM.FILE .. ', ' .. BEAM.MACHINE .. ', ' .. sFlag +EgtOutLog( sLog) + +-- Cancello file di log specifico +local sLogFile = EgtChangePathExtension( BEAM.FILE, '.txt') +EgtEraseFile( sLogFile) + +local function WriteErr( nErr, sMsg, nRot, nCutId, nTaskId) + if nTaskId > 0 then + EgtSetInfo(nTaskId, "nErr", nErr) + EgtSetInfo(nTaskId, "sMsg", sMsg) + EgtSetInfo(nTaskId, "nRot", nRot) + elseif nCutId > 0 then + EgtSetInfo(nCutId, "nErr", nErr) + EgtSetInfo(nCutId, "sMsg", sMsg) + end +end + +-- Funzioni per scrittura su file di log specifico +local function WriteErrToLogFile( nErr, sMsg, nRot, nCutId, nTaskId) + local hFile = io.open( sLogFile, 'a') + hFile:write( 'ERR=' .. tostring( nErr) .. '\n') + hFile:write( sMsg .. '\n') + hFile:write( 'ROT=' .. tostring( nRot or 0) .. '\n') + hFile:write( 'CUTID=' .. tostring( nCutId or 0) .. '\n') + hFile:write( 'TASKID=' .. tostring( nTaskId or 0) .. '\n') + hFile:close() + WriteErr( nErr, sMsg, nRot, nCutId, nTaskId) +end + +local function WriteTimeToLogFile( dTime) + local hFile = io.open( sLogFile, 'a') + hFile:write( 'TIME=' .. EgtNumToString( dTime) .. '\n') + hFile:close() +end + +-- Funzione per gestire visualizzazione dopo errore +local function PostErrView( nErr, sMsg) + if nErr ~= 0 and ( BEAM.FLAG == 1 or BEAM.FLAG == 2) then + EgtSetView( SCE_VD.ISO_SW, false) + EgtZoom( SCE_ZM.ALL) + EgtOutBox( sMsg, 'BatchProcess (err=' .. tostring( nErr) .. ')', 'ERRORS') + end +end + +-- Funzione per gestire visualizzazione dopo warning +local function PostWarnView( nWarn, sMsg) + if nWarn ~= 0 and ( BEAM.FLAG == 1 or BEAM.FLAG == 2) then + EgtSetView( SCE_VD.ISO_SW, false) + EgtZoom( SCE_ZM.ALL) + EgtOutBox( sMsg, 'BatchProcess (wrn=' .. tostring( nWarn) .. ')', 'WARNINGS') + end +end + +-- Funzione per aggiornare dati ausiliari +local function UpdateAuxData( sAuxFile) + local bModif = false + -- Se definito LOAD90, aggiorno + local sLoad90 = EgtGetStringFromIni( 'AuxData', 'LOAD90', '', sAuxFile) + if sLoad90 ~= '' then + local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL + EgtSetInfo( BtlInfoId, 'LOAD90', sLoad90) + bModif = true + end + return bModif +end + +-- Imposto direttorio libreria specializzata per Travi +local sBaseDir = EgtGetSourceDir() +EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') + +-- Impostazione della macchina corrente +EgtResetCurrMachGroup() +local sMachine = 'Essetre-' .. BEAM.MACHINE +if not EgtSetCurrMachine( sMachine) then + BEAM.ERR = 11 + BEAM.MSG = 'Error selecting machine : ' .. sMachine + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return +end + +-- Verifico che la macchina corrente sia abilitata per la lavorazione delle Travi +local sMachDir = EgtGetCurrMachineDir() +if not EgtExistsFile( sMachDir .. '\\Beam\\BeamData.lua') then + BEAM.ERR = 12 + BEAM.MSG = 'Error not configured for beams machine : ' .. sMachine + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return +end + +-- Elimino direttori altre macchine e imposto direttorio macchina corrente per ricerca librerie +EgtRemoveBaseMachineDirFromPackagePath() +EgtAddToPackagePath( sMachDir .. '\\Beam\\?.lua') + +-- Se modalità visualizzazione finestre per DB esco +if BEAM.FLAG > 10 then + BEAM.ERR = 0 + return +end + +-- Carico le librerie +_G.package.loaded.BeamExec = nil +local BE = require( 'BeamExec') +local BL = require( 'BeamLib') + +-- Carico i dati globali +local BD = require( 'BeamData') + +-- Dati del file +local sDir, sTitle, sExt = EgtSplitPath( BEAM.FILE) +local bBtl = ( string.upper( sExt or '') ~= '.BWE') +local sNgeFile = sDir..sTitle..'.bwe' +local sBtmFile = sDir..sTitle..'.btm' + +-- In generale va completamente riprocessato +local bToProcess = true +local bToRecalc = false +-- se BTL, barra ed esiste già il corrispondente progetto Nge +if bBtl and string.find( sTitle, 'Bar_', 1, true) and EgtExistsFile( sNgeFile) then + local sOriFile = sDir..sTitle..'.ori'..sExt + local sDiffFile = sDir..sTitle..'.diff.txt' + EgtEraseFile( sDiffFile) + local _, nDiff = EgtTextFileCompare( BEAM.FILE, sOriFile, ';', sDiffFile) + -- se BTL corrente coincide con originale, salto il riprocessamento + if nDiff == 0 then + bToProcess = false + -- se cambiata configurazione macchina da ultima elaborazione, devo riprocessare + if EgtCompareFilesLastWriteTime( sOriFile, sMachDir .. '\\Beam\\TS3Data.lua') == -1 or + EgtCompareFilesLastWriteTime( sOriFile, sMachDir .. '\\Tools\\Tools.data') == -1 then + bToRecalc = true + end + end +end + +-- Inizializzo contatori errori e avvisi +local nErrCnt = 0 +local nWarnCnt = 0 + +-- Se da elaborare +if bToProcess then + EgtOutLog( ' +++ Processing Parts >>>') + -- Se Btl, lo importo + if bBtl then + -- cancello eventuale vecchio progetto omonimo + EgtEraseFile( sNgeFile) + -- eseguo import + EgtNewFile() + if not EgtImportBtl( BEAM.FILE, EIB_FL.TS3_POS + EIB_FL.USEUATTR) then + BEAM.ERR = 13 + BEAM.MSG = 'Error importing BTL file : ' .. BEAM.FILE + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + end + -- faccio copia del file btl originale + EgtCopyFile( BEAM.FILE, sDir..sTitle..'.ori'..sExt) + -- altrimenti Bwe, lo apro + else + if not EgtOpenFile( BEAM.FILE) then + BEAM.ERR = 13 + BEAM.MSG = 'Error opening BWE file : ' .. BEAM.FILE + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + end + -- faccio copia del file originale + EgtCopyFile( BEAM.FILE, sDir..sTitle..'.ori'..sExt) + end + + -- Aggiorno eventuali dati ausiliari + UpdateAuxData( sBtmFile) + + -- Recupero l'elenco ordinato delle travi + local vBeam = {} + local nPartId = EgtGetFirstPart() + while nPartId do + table.insert( vBeam, { Id = nPartId, Name = ( EgtGetName( nPartId) or ( 'Id=' .. tonumber( nPartId)))}) + nPartId = EgtGetNextPart( nPartId) + end + if #vBeam == 0 then + BEAM.ERR = 14 + BEAM.MSG = 'Error no beams in the file : ' .. BEAM.FILE + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + else + local sOut = '' + for i = 1, #vBeam do + sOut = sOut .. vBeam[i].Name .. ', ' + end + sOut = sOut:sub( 1, -3) + EgtOutLog( 'Travi trovate : ' .. sOut, 1) + end + + -- Ne recupero le dimensioni + for i = 1, #vBeam do + local Ls = EgtGetFirstNameInGroup( vBeam[i].Id, 'Box') + local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD) + if not b3Solid then + BEAM.ERR = 15 + BEAM.MSG = 'Box undefined for beam ' .. vBeam[i].Name + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + else + vBeam[i].Box = b3Solid + end + end + + -- Ne recupero la posizione + for i = 1, #vBeam do + local PosX = EgtGetInfo( vBeam[i].Id, 'POSX', 'd') + vBeam[i].PosX = PosX + end + + -- Eseguo eventuali rotazioni e inversioni testa-coda + for i = 1, #vBeam do + local b3Solid = vBeam[i].Box + -- rotazione +-- local dRotAng = EgtGetInfo( vBeam[i].Id, 'ROTATED', 'd') +-- if dRotAng and abs( dRotAng) > GEO.EPS_ANG_SMALL then +-- local ptRotCen = b3Solid:getCenter() +-- EgtRotate( vBeam[i].Id, ptRotCen, X_AX(), dRotAng, GDB_RT.GLOB) +-- b3Solid:rotate( ptRotCen, X_AX(), dRotAng) +-- end + -- inversione + local dInvAng = 180 - ( EgtGetInfo( vBeam[i].Id, 'INVERTED', 'd') or 0) + if abs( dInvAng) > GEO.EPS_ANG_SMALL then + local ptInvCen = b3Solid:getCenter() + EgtRotate( vBeam[i].Id, ptInvCen, Z_AX(), dInvAng, GDB_RT.GLOB) + end + end + + -- Ne verifico le dimensioni + local dRawW = vBeam[1].Box:getDimY() + local dRawH = vBeam[1].Box:getDimZ() + local vBeamErr = {} + for i = 2, #vBeam do + local dDimW = vBeam[i].Box:getDimY() + local dDimH = vBeam[i].Box:getDimZ() + if ( abs( dDimW - dRawW) > 10 * GEO.EPS_SMALL or abs( dDimH - dRawH) > 10 * GEO.EPS_SMALL) and + ( abs( dDimH - dRawW) > 10 * GEO.EPS_SMALL or abs( dDimW - dRawH) > 10 * GEO.EPS_SMALL) then + table.insert( vBeamErr, i) + end + end + if #vBeamErr > 0 then + local sOut = 'Rimosse travi con sezioni diverse dalla prima :\n' + for i = #vBeamErr, 1, -1 do + sOut = sOut .. vBeam[vBeamErr[i]].Name .. '\n' + table.remove( vBeam, vBeamErr[i]) + end + BEAM.ERR = 16 + BEAM.MSG = sOut + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + end + + -- Verifico sezione barra non troppo grande + if ( dRawW > BD.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > BD.MAX_HEIGHT + 10 * GEO.EPS_SMALL) and + ( dRawW > BD.MAX_WIDTH2 + 10 * GEO.EPS_SMALL or dRawH > BD.MAX_HEIGHT2 + 10 * GEO.EPS_SMALL) then + local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. + 'oltre i limiti della macchina (' .. EgtNumToString( BD.MAX_WIDTH, 2) .. ' x ' .. EgtNumToString( BD.MAX_HEIGHT, 2) .. ') ' .. + 'e (' .. EgtNumToString( BD.MAX_WIDTH2, 2) .. ' x ' .. EgtNumToString( BD.MAX_HEIGHT2, 2) .. ')' + BEAM.ERR = 17 + BEAM.MSG = sOut + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + end + + -- Verifico sezione barra non troppo piccola + if dRawW < BD.MIN_WIDTH - 10 * GEO.EPS_SMALL or dRawH < BD.MIN_HEIGHT - 10 * GEO.EPS_SMALL then + local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. + 'sotto i limiti della macchina (' .. EgtNumToString( BD.MIN_WIDTH, 2) .. ' x ' .. EgtNumToString( BD.MIN_HEIGHT, 2) .. ')' + BEAM.ERR = 17 + BEAM.MSG = sOut + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + end + + -- Lunghezza della barra + local dRawL = ( EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL, 'BARLEN', 'd') or 12000) + 0.1 + -- Sovramateriale di testa + local dOvmHead = vBeam[1].PosX or 0 + + -- Sistemo le travi nel grezzo + local bPbOk, sPbErr = BE.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, vBeam) + if not bPbOk then + BEAM.ERR = 18 + BEAM.MSG = sPbErr + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + end + + -- Imposto Nome file CN + local _, sName, _ = EgtSplitPath( BEAM.FILE) + EgtSetInfo( EgtGetCurrMachGroup(), 'NcName', sName .. '.cnc') + + -- Abilito Vmill + EgtSetInfo( EgtGetCurrMachGroup(), 'Vm', '1') + + -- Lavoro le features + local bPfOk, Stats = BE.ProcessFeatures() + local sOutput = '' + for i = 1, #Stats do + local sMsg = Stats[i].Msg + sMsg = string.gsub( sMsg, '\n', ' ', 10) + sMsg = string.gsub( sMsg, '\r', ' ', 10) + if Stats[i].Err == 0 then + BEAM.ERR = 0 + BEAM.MSG = '---' + BEAM.ROT = Stats[i].Rot or 0 + BEAM.CUTID = Stats[i].CutId + BEAM.TASKID = Stats[i].TaskId + WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) + elseif Stats[i].Err > 0 then + nErrCnt = nErrCnt + 1 + sOutput = sOutput .. string.format( '[%d,%d] %s\n', Stats[i].CutId, Stats[i].TaskId, sMsg) + BEAM.ERR = 19 + BEAM.MSG = sMsg + BEAM.ROT = Stats[i].Rot or 0 + BEAM.CUTID = Stats[i].CutId + BEAM.TASKID = Stats[i].TaskId + WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) + elseif Stats[i].Err < 0 then + nWarnCnt = nWarnCnt + 1 + sOutput = sOutput .. string.format( '[%d,%d] %s\n', Stats[i].CutId, Stats[i].TaskId, sMsg) + BEAM.ERR = -19 + BEAM.MSG = sMsg + BEAM.ROT = Stats[i].Rot or 0 + BEAM.CUTID = Stats[i].CutId + BEAM.TASKID = Stats[i].TaskId + WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) + end + end + + -- Salvo il progetto + EgtSaveFile( sNgeFile) + + -- Visualizzazione avvisi o errori + if #sOutput > 0 then EgtOutLog( sOutput) end + if nErrCnt > 0 then + PostErrView( 19, sOutput) + elseif nWarnCnt > 0 then + PostWarnView( 19, sOutput) + end + +-- Altrimenti carico il progetto salvato e dichiaro nessun errore +else + EgtOutLog( ' +++ Loading Project already processed >>>') + -- Carico il progetto già fatto + EgtOpenFile( sNgeFile) + -- Dichiaro nessun errore + local nPartId = EgtGetFirstPart() + while nPartId do + local nCutId = EgtGetInfo( nPartId, 'CUTID') + if nCutId then + local nProcId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nPartId, 'Processings') or GDB_ID.NULL) + while nProcId do + local bIsFea = EgtExistsInfo( nProcId, 'GRP') and EgtExistsInfo( nProcId, 'PRC') + local nTaskId = EgtGetInfo( nProcId, 'TASKID') + if bIsFea and nTaskId then + BEAM.ERR = 0 + BEAM.MSG = '---' + BEAM.ROT = 0 + BEAM.CUTID = nCutId + BEAM.TASKID = nTaskId + WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) + end + nProcId = EgtGetNext( nProcId) + end + end + nPartId = EgtGetNextPart( nPartId) + end + -- Aggiorno eventuali dati ausiliari + UpdateAuxData( sBtmFile) + -- Passo in modalità lavora + EgtSetCurrMachGroup( EgtGetLastMachGroup()) + -- Se necessario eseguo aggiornamento con ricalcolo delle lavorazioni + if bToRecalc then + EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>') + EgtApplyAllMachinings() + -- copia del file btl originale (per dichiarare progetto ricalcolato) + EgtCopyFile( BEAM.FILE, sDir..sTitle..'.ori'..sExt) + end + -- Salvo il progetto + EgtSaveFile( sNgeFile) +end + +-- *** Eseguo simulazione con verifica collisione in cieco *** +if ( BEAM.FLAG == 0 and ( bToProcess or bToRecalc)) or BEAM.FLAG == 3 or BEAM.FLAG == 4 then + EgtOutLog( ' +++ Simulating with collision check >>>') + local bSimOk, nErr, sErr = EgtSimulate() + if not bSimOk then + if nErr == MCH_SHE.INIT then + BEAM.ERR = 19 + BEAM.MSG = 'Error in clamps disposition' + elseif nErr == MCH_SHE.COLLISION then + BEAM.ERR = 22 + BEAM.MSG = 'Head-part collision' + elseif nErr == MCH_SHE.OUTSTROKE then + BEAM.ERR = 23 + BEAM.MSG = 'Axis outstroke ' .. sErr + elseif nErr == MCH_SHE.SPECIAL then + BEAM.ERR = 24 + BEAM.MSG = 'Clamp move error ' .. sErr + else + BEAM.ERR = 25 + BEAM.MSG = 'General failure (contact supplier)' + end + BEAM.ROT = 0 + BEAM.CUTID = 0 + BEAM.TASKID = 0 + local vItem = EgtSplitString( sErr, ';') or {} + for i = 1, #vItem do + vItem[i] = EgtTrim( vItem[i] or '') + if string.find( vItem[i], 'CUTID', 1, true) then + BEAM.CUTID = EgtGetVal( vItem[i], 'CUTID', 'i') or 0 + elseif string.find( vItem[i], 'TASKID', 1, true) then + BEAM.TASKID = EgtGetVal( vItem[i], 'TASKID', 'i') or 0 + end + end + WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) + return + end +end + +-- *** Genero programma CN *** ( se richiesto) +if BEAM.FLAG == 0 or BEAM.FLAG == 4 then + EgtOutLog( ' +++ Generating NC part program >>>') + if not EgtGenerate( '', 'EgtCAM5 - ' .. sNgeFile) then + BEAM.ERR = 20 + local _, sName, _ = EgtSplitPath( BEAM.FILE) + BEAM.MSG = 'Error generating NC part program : ' .. sName + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return + end +end + +-- *** Eseguo stima tempi *** +EgtOutLog( ' +++ Estimating T&L >>>') +if not EgtEstimate( '', 'EgtCAM5 - ' .. sNgeFile) then + + BEAM.ERR = 21 + local _, sName, _ = EgtSplitPath( BEAM.FILE) + BEAM.MSG = 'Error estimating production time : ' .. sName + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) + PostErrView( BEAM.ERR, BEAM.MSG) + return +end +local Ttot = EgtGetInfo( EgtGetCurrMachGroup(), 'Ttot') +local sTime = 'Total Time = ' .. EgtNumToString( Ttot, 1) +EgtOutLog( sTime) + +-- Imposto la vista ISO 3d, se richiesto +if BEAM.FLAG == 1 or BEAM.FLAG == 2 then + EgtSetView( SCE_VD.ISO_SW, false) +end + +-- Completamento senza errori e avvisi +if nWarnCnt == 0 then + BEAM.ERR = 0 + BEAM.MSG = '---' + WriteErrToLogFile( BEAM.ERR, BEAM.MSG) +end + +-- Scrittura tempo totale stimato di lavorazione +WriteTimeToLogFile( Ttot) + +EgtOutLog( ' +++ BatchProcess completed')