diff --git a/SMGen.Data/Services/SMGDataService.cs b/SMGen.Data/Services/SMGDataService.cs index 1e65387..0da0836 100644 --- a/SMGen.Data/Services/SMGDataService.cs +++ b/SMGen.Data/Services/SMGDataService.cs @@ -686,6 +686,55 @@ namespace SMGen.Data.Services return currFile; } + + public async Task modFile(FilesClass file) + { + Dictionary eventsFromDb = await AnagEventiGetAll(); + Dictionary statesFromDb = await AnagStatiGetAll(); + string filePath = file.tempFileName; + var lines = File.ReadLines(filePath); + var fileTxt = File.ReadAllText(filePath); + foreach (var line in lines) + { + var txt = ""; + if (line != "" && line.Contains(":")) + { + if (!line.StartsWith("$EVENT") && !line.StartsWith("#") && line.StartsWith("$STATE")) + { + var lineSplit = line.Split(":"); + if (lineSplit.Count() >= 3) + { + if (statesFromDb[int.Parse(lineSplit[1].Trim())] != lineSplit[2].Trim()) + { + fileTxt = fileTxt.Replace(lineSplit[2].Trim(), statesFromDb[int.Parse(lineSplit[1].Trim())]); + } + } + } + else if (line.StartsWith("$EVENT") && !line.StartsWith("#") && !line.StartsWith("$STATE")) + { + var lineSplit = line.Split(":"); + if (lineSplit.Count() >= 3) + { + if (eventsFromDb[int.Parse(lineSplit[1].Trim())] != lineSplit[2].Trim()) + { + fileTxt = fileTxt.Replace(lineSplit[2].Trim(), eventsFromDb[int.Parse(lineSplit[1].Trim())]); + } + } + } + } + } + + var fileName = $"{file.origFileName.Split(".")[0]}.rul"; + file.DLoadFileName = $"{Path.Combine(procRootDir, bitCsvPath, fileName)}"; + + await FileUpdate(file.origFileName, file); + using (StreamWriter sw = new StreamWriter(file.DLoadFileName)) + { + sw.Write(fileTxt); + } + + } + /// /// Valuta un file di ruoles x ingressi 2 Stati e restituisce esito /// diff --git a/SMGen/Pages/FilesFix.razor b/SMGen/Pages/FilesFix.razor index 5d1bbf7..766bab8 100644 --- a/SMGen/Pages/FilesFix.razor +++ b/SMGen/Pages/FilesFix.razor @@ -2,4 +2,22 @@

FilesFix

+
+
+ +
+
+ +@foreach (var item in Files) +{ +
+ + @item.Key + + @if(item.Value.DLoadFileName != "") + { + @item.Value.DLoadFileName + } +
+} diff --git a/SMGen/Pages/FilesFix.razor.cs b/SMGen/Pages/FilesFix.razor.cs index c862886..76963a9 100644 --- a/SMGen/Pages/FilesFix.razor.cs +++ b/SMGen/Pages/FilesFix.razor.cs @@ -22,6 +22,8 @@ using SMGen.Data.DbModels; using SMGen.Data.Services; using Microsoft.VisualBasic; using System.Text; +using NLog.Fluent; +using SMGen.Data.Data; namespace SMGen.Pages { @@ -33,39 +35,77 @@ namespace SMGen.Pages [Inject] protected SMGDataService SMGDService { get; set; } = null!; - protected async Task modFile(string filePath) + protected Dictionary Files { get; set; } = new Dictionary(); + + + protected int maxAllowedFiles { get; set; } = 100; + protected string pathDir { get; set; } = ""; + protected string pathFile { get; set; } = ""; + protected int resetSucc { get; set; } = 0; + + private async Task LoadFiles(InputFileChangeEventArgs e) { - var lines = File.ReadLines(filePath); - var fileTxt = File.ReadAllText(filePath); - foreach (var line in lines) + List loadedFiles = new(); + long maxFileSize = 1024 * 1024; + loadedFiles.Clear(); + Files.Clear(); + + // path cartella root (development) + pathDir = Path.Combine("Temp", "unsafe_uploads"); + // se la cartella non esistesse la creo + if (!Directory.Exists(pathDir)) { - var txt = ""; - if (line != "" && line.Contains(":")) + Directory.CreateDirectory(pathDir); + Log.Info($"Creato directory {pathDir}"); + } + + foreach (var file in e.GetMultipleFiles(maxAllowedFiles)) + { + try { - if (!line.StartsWith("$EVENT") && !line.StartsWith("#") && line.StartsWith("$STATE")) + loadedFiles.Add(file); + + //assegno un nome file randomico x sicurezza + var trustedFileNameForFileStorage = Path.GetRandomFileName(); + + //path del file da scrivere + pathFile = Path.Combine(pathDir, trustedFileNameForFileStorage); + + // creo file + using (FileStream fs = new(pathFile, FileMode.Create)) { - var lineSplit = line.Split(":"); - if (lineSplit.Count() >= 3) - { - if (statesFromDb[int.Parse(lineSplit[1].Trim())] != lineSplit[2].Trim()) - { - fileTxt = fileTxt.Replace(lineSplit[2].Trim(), statesFromDb[int.Parse(lineSplit[1].Trim())]); - } - } + // copio il contenuto del file + await file.OpenReadStream(maxFileSize).CopyToAsync(fs); + // scrivo log + Log.Info($"Salvato file temp {pathFile}"); } - else if (line.StartsWith("$EVENT") && !line.StartsWith("#") && !line.StartsWith("$STATE")) + + if (file.Name.Contains(".rul")) { - var lineSplit = line.Split(":"); - if (lineSplit.Count() >= 3) + var newFIle = new FilesClass() { - if (eventsFromDb[int.Parse(lineSplit[1].Trim())] != lineSplit[2].Trim()) - { - fileTxt = fileTxt.Replace(lineSplit[2].Trim(), eventsFromDb[int.Parse(lineSplit[1].Trim())]); - } - } + tempFileName = pathFile, + isOk = false, + origFileName = file.Name, + calcRunning = false, + DLoadFileName = "" + }; + + Files.Add(file.Name, newFIle); } } + catch (Exception exc) + { + Log.Error($"Errore durante salvataggio file temp {file.Name}: {exc}{Environment.NewLine}"); + } } + if (Files != null && Files.Count > 0) + { + await SMGDService.FilesLoadRedis(Files); + } + resetSucc = 0; + await InvokeAsync(() => StateHasChanged()); + await ReloadData(); } protected override async Task OnInitializedAsync() @@ -73,7 +113,20 @@ namespace SMGen.Pages await Task.Delay(1); eventsFromDb = await SMGDService.AnagEventiGetAll(); statesFromDb = await SMGDService.AnagStatiGetAll(); - await modFile("S:\\Zaccaria Majid\\File_RUL\\Jetco\\12_FAMIGLIA_JETCO_NEW.rul"); + } + + protected async Task doProc() + { + foreach (var item in Files.OrderBy(x => x.Value.origFileName)) + { + await Task.Delay(1); + await SMGDService.modFile(item.Value); + } + } + + protected async Task ReloadData() + { + Files = await SMGDService.FilesGetAll(); } } } \ No newline at end of file diff --git a/SMGen/Temp/Rules/PROCESSED/BIT/test.rul b/SMGen/Temp/Rules/PROCESSED/BIT/test.rul new file mode 100644 index 0000000..6748e41 --- /dev/null +++ b/SMGen/Temp/Rules/PROCESSED/BIT/test.rul @@ -0,0 +1,298 @@ +# +# Macchine MANUALE/BArcode di partenza +# +# **** ATTENZIONE!!! ***** Se si aggiunge un Evento o uno Stato va prima aggiunto nel FILE MASTE ELENCO_EVENTI_E_STATI_MASTER.rul se non presente +# +# 2023.08.01 +# 2023.08.11 Eventi 34,35,36 +# +$DEFINITIONS + +$NAME : FAMIGLIA_12 +$IDX : 12 + +#definizione stati (MACRO) : obbligatorio iniziare da 0 --> select * from AnagraficaStati + +# +# 27 MancaRifornMPD -> Manca_Materia_Prima +# +$STATE : 0 : ND +$STATE : 2 : Attrezzaggio +$STATE : 3 : Creazione_Programmi +$STATE : 4 : Lavori_Vari +$STATE : 5 : Guasto +$STATE : 6 : Manca_Pezzo +$STATE : 7 : Manca_Lavoro +$STATE : 8 : Assenteismo +$STATE : 9 : Manutenzione +$STATE : 10 : Pulizia +$STATE : 11 : Macchina_Spenta +$STATE : 12 : Fermo_Generico +$STATE : 13 : Lavorazione +$STATE : 14 : Cambio_Pezzo +$STATE : 15 : Allarme_CN +$STATE : 23 : Rottura_Nastro +$STATE : 24 : Manuale +$STATE : 25 : Scarico_Pieno +$STATE : 26 : Non_Disponibile +$STATE : 27 : Manca_Materia_Prima +$STATE : 28 : Magazzino_Grezzi_Vuoto +$STATE : 29 : Emergenza +$STATE : 30 : Fermo_Organizzativo +$STATE : 31 : Modifica_Programmi +$STATE : 32 : Sostituzione_Utensile +$STATE : 33 : Riempimento_Vasca +$STATE : 34 : Riscaldamento +$STATE : 35 : Anomalia_Macchina +$STATE : 49 : Manca_Attrezzatura +$STATE : 50 : Usura_Utensile + +#definizione eventi : obbligatorio iniziare da 0 --> select * from AnagraficaEventi +# NOTE +# +# BARCODE SOSTITUITI +# +# 4 NoBarcode_Riempimento_Vasca -> Barcode_Lavori_Vari (DONATI) +# 6 NoBarcode_Riscaldamento -> Barcode_Manca_Pezzo (DONATI) +# 26 Barcode_Manca_Riforn_MPD -> Barcode_Manca_Materia_Prima +# 29 HW_Magazzino_Grezzi_Vuoto POTREBBE ESSERE HW - mancanza materiale DA CAMBIARE +# 34 HW_End_Pallet_1 -> HW_deposito_robot +# 35 HW_End_Pallet_2 -> HW_StartTavola +# 36 HW_deposito_robot -> HW_End_Tavola +# + +$EVENT : 00 : EMPTY +$EVENT : 01 : Barcode_Lavora +$EVENT : 02 : Barcode_Attrezzaggio +$EVENT : 03 : Barcode_Creazione_Programmi +$EVENT : 04 : Barcode_Lavori_Vari +$EVENT : 05 : Barcode_Guasto +$EVENT : 06 : Barcode_Manca_Pezzo +$EVENT : 07 : Barcode_Manca_Ciclo_Lavoro +$EVENT : 08 : Barcode_Assenteismo +$EVENT : 09 : Barcode_Manutenzione +$EVENT : 10 : Barcode_Pulizia +$EVENT : 12 : Barcode_Macchina_Spenta +$EVENT : 14 : HW_Power_Off +$EVENT : 15 : HW_Power_On +$EVENT : 16 : HW_Machining +$EVENT : 17 : HW_End_Machining +$EVENT : 18 : HW_Error +$EVENT : 19 : Barcode_Fermo_Organizzativo +$EVENT : 20 : Contapezzi +$EVENT : 21 : HW_Start_Pallet +$EVENT : 22 : HW_End_Pallet +$EVENT : 23 : HW_Rottura_Nastro_Abrasivo +$EVENT : 24 : HW_Manuale +$EVENT : 25 : HW_Nastro_Scarico_Pieno +$EVENT : 26 : Barcode_Manca_Materia_Prima +$EVENT : 27 : Timer_Timeout_Tempo_Ciclo +$EVENT : 28 : Timer_Timeout_Turno_By_Tempo_Ciclo +$EVENT : 29 : HW_Magazzino_Grezzi_Vuoto +$EVENT : 30 : HW_Emergenza +$EVENT : 31 : Barcode_Modifica_Programmi +$EVENT : 32 : Barcode_Sostituzione_Utensile +$EVENT : 33 : HW_Allarme_Macchina +$EVENT : 36 : HW_End_Tavola +$EVENT : 37 : Barcode_Riempimento_Vasca +$EVENT : 38 : Barcode_Riscaldamento +$EVENT : 39 : Barcode_Anomalia_macchina +$EVENT : 40 : HW_Ciclo_Accensione_Spegnimento +$EVENT : 49 : Barcode_Manca_Attrezzatura +$EVENT : 50 : Barcode_Usura_Utensile + +$RULES + +# state : event : next state + +ALL_STATES : EMPTY : ND +ALL_STATES : Barcode_Lavora : Lavorazione +ALL_STATES : Barcode_Attrezzaggio : Attrezzaggio +ALL_STATES : Barcode_Creazione_Programmi : Creazione_Programmi +ALL_STATES : Barcode_Lavori_Vari : Lavori_Vari +ALL_STATES : Barcode_Guasto : Guasto +ALL_STATES : Barcode_Manca_Pezzo : Manca_Pezzo +ALL_STATES : Barcode_Manca_Ciclo_Lavoro : Manca_Lavoro +ALL_STATES : Barcode_Assenteismo : Assenteismo +ALL_STATES : Barcode_Manutenzione : Manutenzione +ALL_STATES : Barcode_Pulizia : Pulizia +#ALL_STATES : Bcode_Cambio_Pallet : Cambio_Pezzo # 11 TOLTO perchè non dovrebbe mai essere usato da nessuno infatti nome sbagliato bcode +ALL_STATES : Barcode_Macchina_Spenta : Macchina_Spenta +ALL_STATES : Barcode_Fermo_Organizzativo : Fermo_Organizzativo +ALL_STATES : Barcode_Manca_Materia_Prima : Manca_Materia_Prima # 26 +ALL_STATES : Barcode_Modifica_Programmi : Modifica_Programmi +ALL_STATES : Barcode_Sostituzione_Utensile : Sostituzione_Utensile +ALL_STATES : Barcode_Riempimento_Vasca : Riempimento_Vasca +ALL_STATES : Barcode_Riscaldamento : Riscaldamento +ALL_STATES : Barcode_Anomalia_macchina : Anomalia_Macchina +ALL_STATES : Barcode_Manca_Attrezzatura : Manca_Attrezzatura # 49 +ALL_STATES : Barcode_Usura_Utensile : Usura_Utensile # 50 + +ALL_STATES : HW_Power_Off : Macchina_Spenta + +Macchina_Spenta : HW_Power_On : Fermo_Generico +Lavorazione : HW_Power_On : Fermo_Generico +Cambio_Pezzo : HW_Power_On : Fermo_Generico +Allarme_CN : HW_Power_On : Fermo_Generico +Rottura_Nastro : HW_Power_On : Fermo_Generico +Manuale : HW_Power_On : Fermo_Generico +Non_Disponibile : HW_Power_On : Fermo_Generico +Riscaldamento : HW_Power_On : Fermo_Generico + +Macchina_Spenta : HW_Machining : Lavorazione +Fermo_Generico : HW_Machining : Lavorazione +Cambio_Pezzo : HW_Machining : Lavorazione +Allarme_CN : HW_Machining : Lavorazione +Rottura_Nastro : HW_Machining : Lavorazione +Manuale : HW_Machining : Lavorazione +Scarico_Pieno : HW_Machining : Lavorazione +Non_Disponibile : HW_Machining : Lavorazione +Magazzino_Grezzi_Vuoto: HW_Machining : Lavorazione +Emergenza : HW_Machining : Lavorazione +Riscaldamento : HW_Machining : Lavorazione + +Macchina_Spenta : HW_End_Machining : Cambio_Pezzo +Fermo_Generico : HW_End_Machining : Fermo_Generico +Lavorazione : HW_End_Machining : Lavorazione +Allarme_CN : HW_End_Machining : Allarme_CN +Rottura_Nastro : HW_End_Machining : Cambio_Pezzo +Manuale : HW_End_Machining : Manuale +Scarico_Pieno : HW_End_Machining : Cambio_Pezzo +Non_Disponibile : HW_End_Machining : Cambio_Pezzo + +Macchina_Spenta : HW_Error : Allarme_CN +Fermo_Generico : HW_Error : Allarme_CN +Lavorazione : HW_Error : Allarme_CN +Cambio_Pezzo : HW_Error : Allarme_CN +Rottura_Nastro : HW_Error : Allarme_CN +Manuale : HW_Error : Allarme_CN +Scarico_Pieno : HW_Error : Allarme_CN +Non_Disponibile : HW_Error : Allarme_CN + +Macchina_Spenta : Contapezzi : Cambio_Pezzo +Fermo_Generico : Contapezzi : Fermo_Generico +Lavorazione : Contapezzi : Lavorazione +Allarme_CN : Contapezzi : Allarme_CN +Rottura_Nastro : Contapezzi : Cambio_Pezzo +Manuale : Contapezzi : Manuale +Scarico_Pieno : Contapezzi : Cambio_Pezzo +Non_Disponibile : Contapezzi : Cambio_Pezzo + +Macchina_Spenta : HW_Start_Pallet : Lavorazione +Fermo_Generico : HW_Start_Pallet : Lavorazione +Cambio_Pezzo : HW_Start_Pallet : Lavorazione +Allarme_CN : HW_Start_Pallet : Lavorazione +Rottura_Nastro : HW_Start_Pallet : Lavorazione +Manuale : HW_Start_Pallet : Lavorazione +Scarico_Pieno : HW_Start_Pallet : Lavorazione +Non_Disponibile : HW_Start_Pallet : Lavorazione + +Macchina_Spenta : HW_End_Pallet : Cambio_Pezzo +Fermo_Generico : HW_End_Pallet : Fermo_Generico +Lavorazione : HW_End_Pallet : Lavorazione +Allarme_CN : HW_End_Pallet : Allarme_CN +Rottura_Nastro : HW_End_Pallet : Cambio_Pezzo +Manuale : HW_End_Pallet : Manuale +Scarico_Pieno : HW_End_Pallet : Cambio_Pezzo +Non_Disponibile : HW_End_Pallet : Cambio_Pezzo + +Macchina_Spenta : HW_Rottura_Nastro_Abrasivo : Rottura_Nastro +Fermo_Generico : HW_Rottura_Nastro_Abrasivo : Rottura_Nastro +Lavorazione : HW_Rottura_Nastro_Abrasivo : Rottura_Nastro +Cambio_Pezzo : HW_Rottura_Nastro_Abrasivo : Rottura_Nastro +Allarme_CN : HW_Rottura_Nastro_Abrasivo : Rottura_Nastro +Manuale : HW_Rottura_Nastro_Abrasivo : Rottura_Nastro +Scarico_Pieno : HW_Rottura_Nastro_Abrasivo : Rottura_Nastro +Non_Disponibile : HW_Rottura_Nastro_Abrasivo : Rottura_Nastro + +Macchina_Spenta : HW_Manuale : Manuale +Fermo_Generico : HW_Manuale : Manuale +Lavorazione : HW_Manuale : Manuale +Cambio_Pezzo : HW_Manuale : Manuale +Allarme_CN : HW_Manuale : Manuale +Rottura_Nastro : HW_Manuale : Manuale +Scarico_Pieno : HW_Manuale : Manuale +Non_Disponibile : HW_Manuale : Manuale +Emergenza : HW_Manuale : Manuale +Riscaldamento : HW_Manuale : Manuale + +Macchina_Spenta : HW_Nastro_Scarico_Pieno : Scarico_Pieno +Fermo_Generico : HW_Nastro_Scarico_Pieno : Scarico_Pieno +Lavorazione : HW_Nastro_Scarico_Pieno : Scarico_Pieno +Cambio_Pezzo : HW_Nastro_Scarico_Pieno : Scarico_Pieno +Allarme_CN : HW_Nastro_Scarico_Pieno : Scarico_Pieno +Rottura_Nastro : HW_Nastro_Scarico_Pieno : Scarico_Pieno +Manuale : HW_Nastro_Scarico_Pieno : Scarico_Pieno +Non_Disponibile : HW_Nastro_Scarico_Pieno : Scarico_Pieno + +Lavorazione : Timer_Timeout_Tempo_Ciclo : Fermo_Generico # 27 + +Attrezzaggio : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Creazione_Programmi : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Lavori_Vari : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Guasto : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Manca_Pezzo : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Manca_Lavoro : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Assenteismo : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Manutenzione : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Pulizia : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Fermo_Generico : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Lavorazione : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Cambio_Pezzo : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Allarme_CN : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Rottura_Nastro : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Manuale : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Scarico_Pieno : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Manca_Materia_Prima : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Modifica_Programmi : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Sostituzione_Utensile: Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Riempimento_Vasca : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Riscaldamento : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Anomalia_Macchina : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Manca_Attrezzatura : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile +Usura_Utensile : Timer_Timeout_Turno_By_Tempo_Ciclo : Non_Disponibile + +Macchina_Spenta : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto +Fermo_Generico : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto +Lavorazione : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto +Cambio_Pezzo : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto +Allarme_CN : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto +Rottura_Nastro : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto +Manuale : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto +Scarico_Pieno : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto +Non_Disponibile : HW_Magazzino_Grezzi_Vuoto : Magazzino_Grezzi_Vuoto + +Macchina_Spenta : HW_Emergenza : Emergenza +Fermo_Generico : HW_Emergenza : Emergenza +Lavorazione : HW_Emergenza : Emergenza +Cambio_Pezzo : HW_Emergenza : Emergenza +Allarme_CN : HW_Emergenza : Emergenza +Rottura_Nastro : HW_Emergenza : Emergenza +Manuale : HW_Emergenza : Emergenza +Scarico_Pieno : HW_Emergenza : Emergenza +Non_Disponibile : HW_Emergenza : Emergenza + +Macchina_Spenta : HW_Allarme_Macchina : Allarme_CN +Fermo_Generico : HW_Allarme_Macchina : Allarme_CN +Lavorazione : HW_Allarme_Macchina : Allarme_CN +Cambio_Pezzo : HW_Allarme_Macchina : Allarme_CN +Rottura_Nastro : HW_Allarme_Macchina : Allarme_CN +Manuale : HW_Allarme_Macchina : Allarme_CN +Scarico_Pieno : HW_Allarme_Macchina : Allarme_CN +Non_Disponibile : HW_Allarme_Macchina : Allarme_CN + +Macchina_Spenta : HW_End_Tavola : Cambio_Pezzo +Fermo_Generico : HW_End_Tavola : Fermo_Generico +Lavorazione : HW_End_Tavola : Lavorazione +Allarme_CN : HW_End_Tavola : Allarme_CN +Rottura_Nastro : HW_End_Tavola : Cambio_Pezzo +Manuale : HW_End_Tavola : Manuale +Scarico_Pieno : HW_End_Tavola : Cambio_Pezzo +Non_Disponibile : HW_End_Tavola : Cambio_Pezzo + +ALL_STATES : HW_Ciclo_Accensione_Spegnimento : Riscaldamento # 40 + +#-------------------------------------------------------------------------- + +$DO +