diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 16eb11eb..03b1bc67 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,9 +35,9 @@ variables: # helper x fix version number .version-fix: &version-fix - | - $env:NEW_REL = $env:VERS_MAIN+"."+(get-date –format yyMM)+"."+(get-date –format ddHH) - $env:NUM_REL = $env:VERS_MAIN+"."+(get-date –format yyMM)+"."+(get-date –format dHH) - $env:NUM_DEB = $env:VERS_MAIN+"."+(get-date –format yyMM)+"-beta."+(get-date –format dHH) + $env:NEW_REL = $env:VERS_MAIN+"."+(get-date -format yyMM)+"."+(get-date -format ddHH) + $env:NUM_REL = $env:VERS_MAIN+"."+(get-date -format yyMM)+"."+(get-date -format dHH) + $env:NUM_DEB = $env:VERS_MAIN+"."+(get-date -format yyMM)+"-beta."+(get-date -format dHH) $env:NEW_COPYRIGHT = "EgalWare @ 2006-" + (get-date -format yyyy) $contenuto = Get-Content -path 'VersGen\VersGen.cs' -Raw $newContenuto = $contenuto -replace '0.0.0.0', $env:NEW_REL @@ -269,6 +269,23 @@ EgwProxy.OsaiCncLib:build: script: - '& "$env:MSBUILD_PATH" "$env:APP_NAME\$env:APP_NAME.vbproj" -target:Build /p:Configuration=Release /p:Platform="x86" /p:OutputPath=bin/ /nodeReuse:false /verbosity:minimal /m' +EgwProxy.SqlDb:build: + stage: build + tags: + - win + variables: + APP_NAME: EgwProxy.SqlDb + only: + refs: + - develop + - SDK/SqlDb + before_script: + - *nuget-fix + - '& "$env:NUGET_PATH" restore "$env:APP_NAME.sln" -verbosity quiet' + - *version-fix + script: + - '& "$env:MSBUILD_PATH" "$env:APP_NAME\$env:APP_NAME.csproj" -target:Build /p:Configuration=Release /p:Platform="x86" /p:OutputPath=bin/ /nodeReuse:false /verbosity:minimal /m' + # -------------------------------- # STAGING: (nuget beta) @@ -367,6 +384,29 @@ EgwProxy.OsaiCncLib:build:staging: - '& "$env:NUGET_PATH" setapikey fe387daa-d07c-3207-877e-96c8be1be91b -source http://nexus.steamware.net/repository/nuget-hosted' - '& "$env:NUGET_PATH" push *$env:NUM_DEB.nupkg -Source http://nexus.steamware.net/repository/nuget-hosted' +EgwProxy.SqlDb:build:staging: + stage: staging + needs: ["EgwProxy.SqlDb:build"] + tags: + - win + variables: + CONFIG: Debug + APP_NAME: EgwProxy.SqlDb + only: + refs: + - develop + before_script: + - *nuget-fix + - '& "$env:NUGET_PATH" restore "$env:APP_NAME.sln" -verbosity quiet' + - *version-fix + - *nuspec-fix + script: + - '& "$env:MSBUILD_PATH" "$env:APP_NAME\$env:APP_NAME.csproj" -target:Build /p:Configuration=$env:CONFIG /p:Platform="Any CPU" /p:OutputPath=bin/$env:CONFIG /verbosity:minimal /m' + - '& Remove-Item *.nupkg' + - '& $env:NUGET_PATH pack "$env:APP_NAME.Debug.nuspec"' + - '& "$env:NUGET_PATH" setapikey fe387daa-d07c-3207-877e-96c8be1be91b -source http://nexus.steamware.net/repository/nuget-hosted' + - '& "$env:NUGET_PATH" push *$env:NUM_DEB.nupkg -Source http://nexus.steamware.net/repository/nuget-hosted' + # -------------------------------- # RELEASE # -------------------------------- @@ -534,6 +574,30 @@ EgwProxy.OsaiCncLib:build:release: - '& "$env:NUGET_PATH" setapikey fe387daa-d07c-3207-877e-96c8be1be91b -source http://nexus.steamware.net/repository/nuget-hosted' - '& "$env:NUGET_PATH" push *$env:NUM_REL.nupkg -Source http://nexus.steamware.net/repository/nuget-hosted' +EgwProxy.SqlDb:build:release: + stage: release + needs: ["EgwProxy.SqlDb:build"] + tags: + - win + variables: + CONFIG: Release + APP_NAME: EgwProxy.SqlDb + only: + refs: + - SDK/SqlDb + before_script: + - *nuget-fix + - '& "$env:NUGET_PATH" restore "$env:APP_NAME.sln" -verbosity quiet' + - *version-fix + - *nuspec-fix + script: + - '& "$env:MSBUILD_PATH" "$env:APP_NAME\$env:APP_NAME.csproj" -target:Build /p:Configuration=$env:CONFIG /p:Platform="Any CPU" /p:OutputPath=bin/$env:CONFIG /verbosity:minimal /m' + - '& Remove-Item *.nupkg' + - '& $env:NUGET_PATH pack "$env:APP_NAME.Release.nuspec"' +# - '& "$env:NUGET_PATH" pack "$env:APP_NAME\$env:APP_NAME.csproj" -properties Configuration=$env:CONFIG -Version $env:NUM_REL' + - '& "$env:NUGET_PATH" setapikey fe387daa-d07c-3207-877e-96c8be1be91b -source http://nexus.steamware.net/repository/nuget-hosted' + - '& "$env:NUGET_PATH" push *$env:NUM_REL.nupkg -Source http://nexus.steamware.net/repository/nuget-hosted' + # -------------------------------- # DocFx # -------------------------------- @@ -593,6 +657,20 @@ EgwProxy.OsaiCncLib:docfx: - mv $env:APP_NAME/_site "docfx" - *DocReplica +EgwProxy.SqlDb:docfx: + stage: docfx + needs: ["EgwProxy.Icoel:build"] + tags: + - win + variables: + APP_NAME: EgwProxy.Icoel + only: + - SDK/Icoel + script: + - docfx $env:APP_NAME/docfx.json + - mv $env:APP_NAME/_site "docfx" + - *DocReplica + IOB-WIN-NEXT:docfx: stage: docfx needs: ["IOB-WIN-NEXT:build"] diff --git a/EgwCApp/EgwCApp.Core/ConfigFile.cs b/EgwCApp/EgwCApp.Core/ConfigFile.cs new file mode 100644 index 00000000..9114467c --- /dev/null +++ b/EgwCApp/EgwCApp.Core/ConfigFile.cs @@ -0,0 +1,72 @@ +namespace EgwCApp.Core +{ + /// + /// Implementazione di riferimento x un file di configurazione x esecuzione task tramite EgwCApp + /// + public class ConfigFile + { + #region Public Properties + + /// + /// Path Archivio dove depositare file ORIGINALI processati (se !="" vanno archiviati) + /// + public string ArchiveDir { get; set; } = ""; + + /// + /// Path dove depositare file tradotti processati (se !="" vanno spostati li) + /// + public string ConvertDir { get; set; } = ""; + + /// + /// Path file da processare + /// + public string FileInPath { get; set; } = "demoIn.txt"; + + /// + /// Path file dove salvare + /// + public string FileOutPath { get; set; } = ""; + + /// + /// IdxODL da registrare + /// + public int IdxODL { get; set; } = 0; + + /// + /// Parametri per processing file string --> int + /// + public Dictionary ProcessParamInt { get; set; } = new Dictionary(); + + /// + /// Parametri per processing file string --> string + /// + public Dictionary ProcessParamStr { get; set; } = new Dictionary(); + + /// + /// DB Redis dove salvare + /// + public int RedisDB { get; set; } = 0; + + /// + /// Posizione Redis dove salvare (HashKey) + /// + public string RedisOut { get; set; } = ""; + + /// + /// Modalità ritorno risutlati + /// + public ReturnMode Return { get; set; } = ReturnMode.ND; + + /// + /// Path file da processare + /// + public string TargetName { get; set; } = ""; + + /// + /// Tipologia di iport da condurre + /// + public ImportType Type { get; set; } = ImportType.ND; + + #endregion Public Properties + } +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.Core/EgwCApp.Core.csproj b/EgwCApp/EgwCApp.Core/EgwCApp.Core.csproj new file mode 100644 index 00000000..4ed381d7 --- /dev/null +++ b/EgwCApp/EgwCApp.Core/EgwCApp.Core.csproj @@ -0,0 +1,15 @@ + + + + net6.0 + enable + enable + + + + + + + + + diff --git a/EgwCApp/EgwCApp.Core/Enum.cs b/EgwCApp/EgwCApp.Core/Enum.cs new file mode 100644 index 00000000..0d6745cb --- /dev/null +++ b/EgwCApp/EgwCApp.Core/Enum.cs @@ -0,0 +1,37 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace EgwCApp.Core +{ + /// + /// Tipologia file da importare + /// + [JsonConverter(typeof(StringEnumConverter))] + public enum ImportType + { + ND = 0, + CSV, + Excel + } + + [JsonConverter(typeof(StringEnumConverter))] + public enum rawTransfType + { + ND, + IcoelBatch, + IcoelVarInfo, + RegGiacenze + } + + /// + /// Modalità ritorno risultati + /// + [JsonConverter(typeof(StringEnumConverter))] + public enum ReturnMode + { + ND = 0, + Console, + File, + Redis + } +} \ No newline at end of file diff --git a/IOB-UT-NEXT/ExcelMan.cs b/EgwCApp/EgwCApp.Core/ExcelMan.cs similarity index 96% rename from IOB-UT-NEXT/ExcelMan.cs rename to EgwCApp/EgwCApp.Core/ExcelMan.cs index 084e29ec..4ae75d61 100644 --- a/IOB-UT-NEXT/ExcelMan.cs +++ b/EgwCApp/EgwCApp.Core/ExcelMan.cs @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace IOB_UT_NEXT +namespace EgwCApp.Core { /// /// Gestione lettura excel: @@ -37,6 +37,7 @@ namespace IOB_UT_NEXT // Auto-detect format, supports: // - Binary Excel files (2.0-2003 format; *.xls) // - OpenXml Excel files (2007 format; *.xlsx, *.xlsb) + System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); using (var reader = ExcelReaderFactory.CreateReader(stream)) { // 2. Use the AsDataSet extension method @@ -103,4 +104,4 @@ namespace IOB_UT_NEXT return rows; } } -} +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.Core/RedisMan.cs b/EgwCApp/EgwCApp.Core/RedisMan.cs new file mode 100644 index 00000000..74d733ac --- /dev/null +++ b/EgwCApp/EgwCApp.Core/RedisMan.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwCApp.Core +{ + public class RedisMan + { + protected string connString = ""; + protected string servAddr = ""; + protected int servPort = 0; + protected int redisDb = 0; + public RedisMan(string server, int port, int db) + { + servAddr = server; + servPort = port; + redisDb = db; + connString = $"{servAddr}:{servPort},db={redisDb},abortConnect=false,ssl=false"; + } + + public bool writeData(string redKey, string rawData) + { + return false; + } + public string getRSV(string redKey) + { + return ""; + } + } +} diff --git a/EgwCApp/EgwCApp.Core/WharehouseData.cs b/EgwCApp/EgwCApp.Core/WharehouseData.cs new file mode 100644 index 00000000..f90a0441 --- /dev/null +++ b/EgwCApp/EgwCApp.Core/WharehouseData.cs @@ -0,0 +1,28 @@ +namespace EgwCApp.Core +{ + public class WharehouseData + { + #region Public Classes + + public class BatchRec + { + #region Public Properties + + public DateTime DateRif { get; set; } = DateTime.Today; + public string ExtDoc { get; set; } = "Doc"; + public string IdentRG { get; set; } = "NA"; + public int IdxODL { get; set; } = 0; + public string Notes { get; set; } = "Notes"; + public int NumPack { get; set; } = 0; + public string Product { get; set; } = "Prod"; + + public double QtyTot { get; set; } = 0.0; + public string Supplier { get; set; } = "Suppl"; + public string Variety { get; set; } = "Var"; + + #endregion Public Properties + } + + #endregion Public Classes + } +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.ExImp.sln b/EgwCApp/EgwCApp.ExImp.sln new file mode 100644 index 00000000..d57a072e --- /dev/null +++ b/EgwCApp/EgwCApp.ExImp.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32516.85 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EgwCApp.Testing", "EgwCApp.Testing\EgwCApp.Testing.csproj", "{E37013B7-E5C6-48ED-8051-0BA5F29CB234}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EgwCApp.ExcImport", "EgwCApp.ExcImport\EgwCApp.ExcImport.csproj", "{D689CB4E-14DB-4CD4-B0D6-D2029219EF7E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EgwCApp.Core", "EgwCApp.Core\EgwCApp.Core.csproj", "{DF02D478-2309-48B8-BF0D-90B02327AF02}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E37013B7-E5C6-48ED-8051-0BA5F29CB234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E37013B7-E5C6-48ED-8051-0BA5F29CB234}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E37013B7-E5C6-48ED-8051-0BA5F29CB234}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E37013B7-E5C6-48ED-8051-0BA5F29CB234}.Release|Any CPU.Build.0 = Release|Any CPU + {D689CB4E-14DB-4CD4-B0D6-D2029219EF7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D689CB4E-14DB-4CD4-B0D6-D2029219EF7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D689CB4E-14DB-4CD4-B0D6-D2029219EF7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D689CB4E-14DB-4CD4-B0D6-D2029219EF7E}.Release|Any CPU.Build.0 = Release|Any CPU + {DF02D478-2309-48B8-BF0D-90B02327AF02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF02D478-2309-48B8-BF0D-90B02327AF02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF02D478-2309-48B8-BF0D-90B02327AF02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF02D478-2309-48B8-BF0D-90B02327AF02}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2AF3181F-288A-47D5-8087-2AB660476D85} + EndGlobalSection +EndGlobal diff --git a/EgwCApp/EgwCApp.ExcImport/EgwCApp.ExcImport.csproj b/EgwCApp/EgwCApp.ExcImport/EgwCApp.ExcImport.csproj new file mode 100644 index 00000000..cbbe5b71 --- /dev/null +++ b/EgwCApp/EgwCApp.ExcImport/EgwCApp.ExcImport.csproj @@ -0,0 +1,32 @@ + + + + Exe + net6.0 + enable + enable + ExcImport + + + + + + + + + + + + + + Never + + + Never + + + Always + + + + diff --git a/EgwCApp/EgwCApp.ExcImport/ImportProc.cs b/EgwCApp/EgwCApp.ExcImport/ImportProc.cs new file mode 100644 index 00000000..0daebe4a --- /dev/null +++ b/EgwCApp/EgwCApp.ExcImport/ImportProc.cs @@ -0,0 +1,373 @@ +using EgwCApp.Core; +using Newtonsoft.Json; +using static EgwCApp.Core.WharehouseData; + +namespace EgwCApp.ExcImport +{ + public class ImportProc + { + #region Public Constructors + + /// + /// Init oggetto per import + /// + /// + public ImportProc(string confFileName) + { + if (!string.IsNullOrEmpty(confFileName)) + { + fileConfName = confFileName; + } + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Decodifica configurazione + /// + /// + public bool decodeConfig() + { + bool answ = false; + if (!string.IsNullOrEmpty(fileConfName)) + { + // deserializzo config + if (!File.Exists(fileConfName)) + { + Console.WriteLine($"Error: ConfigFile not found | {fileConfName}"); + } + else + { + string rawData = File.ReadAllText(fileConfName); + // se ho contenuto procedo + if (string.IsNullOrEmpty(rawData)) + { + Console.WriteLine($"Error: ConfigFile empty! | {fileConfName}"); + } + else + { + // deserializzo + taskConfig = JsonConvert.DeserializeObject(rawData); + answ = taskConfig != null; + } + } + } + return answ; + } + + /// + /// Esegue import (se possibile) + /// + /// + public bool doProcess() + { + bool answ = false; + if (taskConfig != null) + { + // verifico esista il file... + if (string.IsNullOrEmpty(taskConfig.FileInPath) && File.Exists(taskConfig.FileInPath)) + { + // manca file ingresso!!! esco! + } + else + { + // verifico il tipo di process necessario... + switch (taskConfig.Type) + { + case ImportType.CSV: + fileReturnData = File.ReadAllText(taskConfig.FileInPath); + answ = true; + break; + + case ImportType.Excel: + fileReturnData = processExcelImport(taskConfig.FileInPath); + answ = true; + break; + + case ImportType.ND: + default: + break; + } + } + } + return answ; + } + + /// + /// Esecuzione ritorno informazioni secondo configurazione... + /// + /// + public bool doReturn() + { + bool answ = false; + if (taskConfig != null) + { + // verifico il tipo di return necessario... + switch (taskConfig.Return) + { + case ReturnMode.Console: + Console.WriteLine(fileReturnData); + answ = true; + break; + + case ReturnMode.Redis: + break; + + case ReturnMode.File: + // verifico path ci sia... sennò creo + string outPath = string.IsNullOrEmpty(taskConfig.FileOutPath) ? "FileOut.txt" : taskConfig.FileOutPath; + // verifico se vadano salvati in una folder differente... + if (!string.IsNullOrEmpty(taskConfig.ConvertDir)) + { + if (!Directory.Exists(taskConfig.ConvertDir)) + { + Directory.CreateDirectory(taskConfig.ConvertDir); + } + outPath = Path.Combine(taskConfig.ConvertDir, Path.GetFileName(outPath)); + } + // salvo il file! + File.WriteAllText(outPath, fileReturnData); + answ = true; + break; + + case ReturnMode.ND: + default: + break; + } + // se fatto eventualmente archivio + if (answ) + { + if (!string.IsNullOrEmpty(taskConfig.ArchiveDir)) + { + // verifico cartella archivio + if (!Directory.Exists(taskConfig.ArchiveDir)) + { + Directory.CreateDirectory(taskConfig.ArchiveDir); + } + // sposto file + string fName = Path.GetFileName(taskConfig.FileInPath); + File.Move(taskConfig.FileInPath, Path.Combine(taskConfig.ArchiveDir, fName), true); + } + } + } + return answ; + } + + #endregion Public Methods + + #region Protected Properties + + /// + /// Nome del file config da processare + /// + protected string fileConfName { get; set; } = ""; + + /// + /// Contenuto del file da restituire come return data (serializzato) + /// + protected string fileReturnData { get; set; } = ""; + + /// + /// Configurazione del task da eseguire + /// + protected ConfigFile? taskConfig { get; set; } = new ConfigFile(); + + #endregion Protected Properties + + #region Protected Methods + + /// + /// Estrae da una riga l'i-esimo elemento + /// + /// + /// + /// + protected string getCellVal(System.Data.DataRow? riga, int col) + { + string answ = ""; + if (riga != null) + { + try + { + answ = $"{riga.ItemArray[col]}".Trim(); + } + catch + { } + } + return answ; + } + + /// + /// Cleanup stringa x impiego tipo ident da char dubbi + /// + /// + /// + protected string strFixId(string origData) + { + return origData.Replace(".", "").Replace(" ", "_"); + } + + #endregion Protected Methods + + #region Private Methods + + /// + /// Importa un file excel e restituisce una + /// + /// + /// + private string processExcelImport(string fileItem) + { + string outVal = ""; + int numErr = 0; + // test procedura di import files excel x Giacovelli... + var currExcel = new ExcelMan(fileItem); + // creo lista dati in formato RegGiacenze... + Dictionary listaGiac = new Dictionary(); + var dtSet = currExcel.getDataSet(); + if (dtSet != null && dtSet.Tables != null && dtSet.Tables.Count > 0) + { + string nomeFile = Path.GetFileName(fileItem); + nomeFile = nomeFile.Substring(0, nomeFile.LastIndexOf(".")); + var elSheet = dtSet.Tables; + int idxTab = 0; + // cerco lo sheet corretto se > 1 + if (dtSet.Tables.Count > 1) + { + bool found = false; + for (int i = 0; i < dtSet.Tables.Count; i++) + { + if (nomeFile.Contains(dtSet.Tables[i].TableName)) + { + idxTab = i; + found = true; + break; + } + // controllo parametro opzionale... + if (!found && taskConfig != null && !string.IsNullOrEmpty(taskConfig.TargetName)) + { + if (dtSet.Tables[i].TableName == taskConfig.TargetName) + { + idxTab = i; + break; + } + } + } + } + var tabella = dtSet.Tables[idxTab]; + int numRighe = tabella.Rows.Count; + int idxODL = taskConfig != null ? taskConfig.IdxODL : 0; + for (int i = 0; i < numRighe; i++) + { + if (taskConfig != null && taskConfig.ProcessParamInt != null && taskConfig.ProcessParamInt.Count > 5) + { + if (numErr < numRighe / 5) + { + try + { + // variabili di appoggio... + DateTime dtRif = DateTime.Today; + double qtyTot = 0; + int numPack = 0; + var riga = tabella.Rows[i]; + if (riga != null) + { + string ddt = getCellVal(riga, taskConfig.ProcessParamInt["ExtDoc"]); + string sDate = getCellVal(riga, taskConfig.ProcessParamInt["DateRif"]); + string prod = getCellVal(riga, taskConfig.ProcessParamInt["Product"]); + // verifiche x import: header, data e DDT (vuoti o "-") --> SKIP! + bool checkHeaderKo = (ddt == "DDT" || prod == "PRODOTTO"); + bool checkEmptyDdt = (string.IsNullOrEmpty(ddt) || ddt == "-"); + bool checkEmptyDate = (string.IsNullOrEmpty(sDate) || sDate == "-"); + if (checkHeaderKo) + { + //lgTrace($"SKIP header"); + } + else if (checkEmptyDdt || checkEmptyDate) + { + //lgTrace($"SKIP linea vuota | i: {i} | ddt: {ddt} | date: {sDate} | prod: {prod}"); + } + else + { + string variety = getCellVal(riga, taskConfig.ProcessParamInt["Variety"]); + string suppl = getCellVal(riga, taskConfig.ProcessParamInt["Supplier"]); + string sQty = getCellVal(riga, taskConfig.ProcessParamInt["QtyTot"]); + string sNum = getCellVal(riga, taskConfig.ProcessParamInt["NumPack"]); + string numPed = getCellVal(riga, taskConfig.ProcessParamInt["NumPed"]); + string packPed = getCellVal(riga, taskConfig.ProcessParamInt["PackPed"]); + string pesoPack = getCellVal(riga, taskConfig.ProcessParamInt["PesoPack"]); + DateTime.TryParse(sDate, out dtRif); + int.TryParse(sNum, out numPack); + double.TryParse(sQty, out qtyTot); + string identRG = ddt.Length > 2 ? $"{strFixId(ddt)}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}" : $"{dtRif:yyyyMMdd}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}"; + string notes = $"{numPed}x{packPed}x{pesoPack}"; + // verifico di avere dati per proseguire... + bool checkIdent = !string.IsNullOrEmpty($"{prod}{variety}{suppl}"); + if (checkIdent) + { + BatchRec newRow = new BatchRec() + { + IdxODL = idxODL, + IdentRG = identRG, + DateRif = dtRif, + ExtDoc = ddt, + Product = prod, + Variety = variety, + Supplier = suppl, + NumPack = numPack, + QtyTot = qtyTot, + Notes = notes + }; + // verifico: se manca aggiungo + if (!listaGiac.ContainsKey(identRG)) + { + listaGiac.Add(identRG, newRow); + } + else + { + // altrimenti aggiorno giacenza con valori numerici + listaGiac[identRG].NumPack += newRow.NumPack; + listaGiac[identRG].QtyTot += newRow.QtyTot; + } + } + else + { + //lgError($"Errore verifica identità riga | prod: {prod} | variety: {variety} | suppl: {suppl}"); + numErr++; + } + } + } + } + catch (Exception exc) + { + numErr++; + } + } + } + } + } + if (listaGiac.Count > 0) + { + // converto in una nuova lista... + int rCounter = 1; + Dictionary list2Send = new Dictionary(); + foreach (var item in listaGiac) + { + list2Send.Add(rCounter, item.Value); + rCounter++; + } + // serializzo e restituisco file JSON... + var serVal = JsonConvert.SerializeObject(list2Send); + if (serVal != null && !string.IsNullOrEmpty(serVal)) + { + outVal = serVal; + } + } + return outVal; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.ExcImport/Program.cs b/EgwCApp/EgwCApp.ExcImport/Program.cs new file mode 100644 index 00000000..d9fad2e9 --- /dev/null +++ b/EgwCApp/EgwCApp.ExcImport/Program.cs @@ -0,0 +1,61 @@ +// See https://aka.ms/new-console-template for more information + +// ExcImport: Excel Importer, per IobWin in logica lettura Giacenze +// parametri: +// $0: Path ConfigFile file per esecuzione + +using EgwCApp.ExcImport; + +string separator = "--------------------------------------"; +string fileName = ""; + +// controllo args, se mancassero o incompleti mostro help +if (args.Length < 1) +{ + Console.WriteLine(separator); + Console.WriteLine("- ExcelFileImporter - Core 6.0"); + Console.WriteLine("- v.0.0.0.0 | @Egalware 2022+"); + Console.WriteLine(separator); + Console.WriteLine(); + Console.WriteLine("Mancano parametri per esecuzione:"); + Console.WriteLine(""); + Console.WriteLine("$0: ConfigFile da impiegare"); + + // provo a processare testConf... + fileName = "testConf.json"; +} +else +{ + fileName = args[0]; +} + +// ora processo se ho filename valido... +if (!string.IsNullOrEmpty(fileName)) +{ + // verifico se ho file... + if (File.Exists(fileName)) + { + ImportProc importObj = new ImportProc(fileName); + bool stepOk = importObj.decodeConfig(); + if (stepOk) + { + stepOk = importObj.doProcess(); + if (!stepOk) + { + Console.WriteLine("Errore in processing file"); + } + else + { + importObj.doReturn(); + } + } + else + { + Console.WriteLine("Errore in processing config file"); + } + } + else + { + Console.WriteLine("Errore file non trovato!"); + } +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.ExcImport/Properties/PublishProfiles/FolderProfile.pubxml b/EgwCApp/EgwCApp.ExcImport/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 00000000..4ca6c8df --- /dev/null +++ b/EgwCApp/EgwCApp.ExcImport/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,18 @@ + + + + + Release + Any CPU + bin\Release\net6.0\win-x64\publish\ + FileSystem + <_TargetId>Folder + net6.0 + win-x64 + false + true + false + + \ No newline at end of file diff --git a/EgwCApp/EgwCApp.ExcImport/postBuild.bat b/EgwCApp/EgwCApp.ExcImport/postBuild.bat new file mode 100644 index 00000000..e6852aea --- /dev/null +++ b/EgwCApp/EgwCApp.ExcImport/postBuild.bat @@ -0,0 +1,4 @@ +@echo off + +REM compilo in publish +dotnet publish EgwCApp.ExcImport.csproj -p:PublishSingleFile=true -r win-x64 -c Release --self-contained false diff --git a/EgwCApp/EgwCApp.ExcImport/testConf.json b/EgwCApp/EgwCApp.ExcImport/testConf.json new file mode 100644 index 00000000..a62fe2c3 --- /dev/null +++ b/EgwCApp/EgwCApp.ExcImport/testConf.json @@ -0,0 +1,25 @@ +{ + "ArchiveDir": "C:\\temp\\import\\archive", + "ConvertDir": "C:\\temp\\import\\convert", + "FileInPath": "C:\\temp\\import\\01.12.xlsx", + "FileOutPath": "01.12.json", + "IdxODL": 987654321, + "ProcessParamInt": { + "Product": 3, + "Variety": 9, + "Supplier": 8, + "ExtDoc": 2, + "DateRif": 14, + "QtyTot": 22, + "NumPack": 21, + "NumPed": 17, + "PackPed": 18, + "PesoPack": 20 + }, + "ProcessParamStr": {}, + "RedisDB": 0, + "RedisOut": "", + "Return": "File", + "TargetName": "DB Loco", + "Type": "Excel" +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.ExcImport/testConfCsv.json b/EgwCApp/EgwCApp.ExcImport/testConfCsv.json new file mode 100644 index 00000000..5278eb08 --- /dev/null +++ b/EgwCApp/EgwCApp.ExcImport/testConfCsv.json @@ -0,0 +1,6 @@ +{ + "FilePath": "C:\\Temp\\test.log", + "ProcessParams": {}, + "Return": "Console", + "Type": "Excel" +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.ExcImport/testConfExcel.json b/EgwCApp/EgwCApp.ExcImport/testConfExcel.json new file mode 100644 index 00000000..a62fe2c3 --- /dev/null +++ b/EgwCApp/EgwCApp.ExcImport/testConfExcel.json @@ -0,0 +1,25 @@ +{ + "ArchiveDir": "C:\\temp\\import\\archive", + "ConvertDir": "C:\\temp\\import\\convert", + "FileInPath": "C:\\temp\\import\\01.12.xlsx", + "FileOutPath": "01.12.json", + "IdxODL": 987654321, + "ProcessParamInt": { + "Product": 3, + "Variety": 9, + "Supplier": 8, + "ExtDoc": 2, + "DateRif": 14, + "QtyTot": 22, + "NumPack": 21, + "NumPed": 17, + "PackPed": 18, + "PesoPack": 20 + }, + "ProcessParamStr": {}, + "RedisDB": 0, + "RedisOut": "", + "Return": "File", + "TargetName": "DB Loco", + "Type": "Excel" +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.Testing/Appunti.txt b/EgwCApp/EgwCApp.Testing/Appunti.txt new file mode 100644 index 00000000..6e57618e --- /dev/null +++ b/EgwCApp/EgwCApp.Testing/Appunti.txt @@ -0,0 +1,9 @@ +echo ------------ Parametri compilazione ------------ +echo OutDir: $(OutDir) +echo Configuration: $(ConfigurationName) +echo ProjectDir: $(ProjectDir) +echo AssemblyName: $(AssemblyName) +echo TargetDir: $(TargetDir) +echo ------------ Parametri compilazione ------------ + +preBuild.bat $(SolutionDir)EgwCApp.ExcImport\EgwCApp.ExcImport.csproj $(SolutionDir)EgwCApp.ExcImport\bin\Release\net6.0\publish\win-x64\ $(ProjectDir)Utils \ No newline at end of file diff --git a/EgwCApp/EgwCApp.Testing/EgwCApp.Testing.csproj b/EgwCApp/EgwCApp.Testing/EgwCApp.Testing.csproj new file mode 100644 index 00000000..ec11a64c --- /dev/null +++ b/EgwCApp/EgwCApp.Testing/EgwCApp.Testing.csproj @@ -0,0 +1,42 @@ + + + + Exe + net6.0 + enable + enable + $(MSBuildProjectName) + + + + embedded + + + + embedded + + + + + + + + + + + + + + + + + + Always + + + + + + + + diff --git a/EgwCApp/EgwCApp.Testing/FileProcMan.cs b/EgwCApp/EgwCApp.Testing/FileProcMan.cs new file mode 100644 index 00000000..aedbefe9 --- /dev/null +++ b/EgwCApp/EgwCApp.Testing/FileProcMan.cs @@ -0,0 +1,114 @@ +using EgwCApp.Core; +using Newtonsoft.Json; +using System.Diagnostics; + +namespace EgwCApp.Testing +{ + public class FileProcMan + { + #region Public Constructors + + public FileProcMan(string toolDir, string exeFileName) + { + this.confFileName = "conf.json"; + this.baseDir = toolDir; + this.exeName = exeFileName; + appPath = $"./{baseDir}/{exeName}"; + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Processa il singolo file e riporta tempo esecuzione + /// + /// + public TimeSpan doProcess(string fPath) + { + TimeSpan outVal = new TimeSpan(); + Stopwatch sw = new Stopwatch(); + // preparo file conf + createConfFile(fPath); + // avvio processing + Console.WriteLine("calling ext app with args:"); + Console.WriteLine($"{appPath} {confFileName}"); + Console.WriteLine(); + + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = appPath, + Arguments = $"{confFileName}", + WindowStyle = ProcessWindowStyle.Minimized, + //WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + //CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardInput = true, + }; + + sw.Start(); + + Process p = Process.Start(psi); + + string q = ""; + while (!p.HasExited) + { + q += p.StandardOutput.ReadToEnd(); + } + + sw.Stop(); + outVal = sw.Elapsed; + + return outVal; + } + + #endregion Public Methods + + #region Protected Fields + + protected string appPath = ""; + protected string baseDir = ""; + protected string confFileName = ""; + protected string exeName = ""; + + #endregion Protected Fields + + #region Private Methods + + private void createConfFile(string item) + { + Dictionary importParams = new Dictionary(); + importParams.Add("Product", 3); + importParams.Add("Variety", 9); + importParams.Add("Supplier", 8); + importParams.Add("ExtDoc", 2); + importParams.Add("DateRif", 14); + importParams.Add("QtyTot", 22); + importParams.Add("NumPack", 21); + importParams.Add("NumPed", 17); + importParams.Add("PackPed", 18); + importParams.Add("PesoPack", 20); + // calcolo nome file conf specifico + string outFileName = Path.GetFileName(item).Replace("xlsx", "json"); + confFileName = $"conf_{outFileName}"; + // calcolo outFIleName + var newConf = new ConfigFile() + { + ArchiveDir = @"C:\temp\import\archive\", + ConvertDir = @"C:\temp\import\convert\", + Type = ImportType.Excel, + FileInPath = item, + FileOutPath = outFileName, + Return = ReturnMode.File, + ProcessParamInt = importParams, + TargetName = "DB Loco" + }; + // serializzo e salvo! + var rawData = JsonConvert.SerializeObject(newConf, Formatting.Indented); + File.WriteAllText(confFileName, rawData); + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.Testing/Program.cs b/EgwCApp/EgwCApp.Testing/Program.cs new file mode 100644 index 00000000..29779573 --- /dev/null +++ b/EgwCApp/EgwCApp.Testing/Program.cs @@ -0,0 +1,65 @@ +// See https://aka.ms/new-console-template for more information + +using EgwCApp.Core; +using System.Diagnostics; +using Newtonsoft.Json; +using EgwCApp.Testing; + +Dictionary statsColl = new Dictionary(); +Stopwatch sw = new Stopwatch(); + +string separator = "--------------------------------------"; +Console.WriteLine(separator); +Console.WriteLine("Console Test Application"); +Console.WriteLine(separator); +Console.WriteLine(); + +// creo il file di configurazione... +string fileName = "conf.json"; +ConfigFile newConf = new ConfigFile(); +string rawData = ""; + +// test CSV +//newConf = new ConfigFile() +//{ +// Type = ImportType.CSV, +// FileInPath = @"C:\Temp\test.log", +// Return = ReturnMode.Console +//}; + + +// svuoto eventuali conf vecchi +var listaConf = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.json"); +if (listaConf != null && listaConf.Count() > 0) +{ + foreach (var file2del in listaConf) + { + File.Delete(file2del); + } +} +// cerco file xlsx e ciclo... +var listaFiles = Directory.GetFiles(@"C:\temp\import\", "*.xlsx"); +if (listaFiles != null && listaFiles.Count() > 0) +{ + FileProcMan fpm = new FileProcMan("Tools", "ExcImport.exe"); + foreach (var item in listaFiles) + { + TimeSpan timeElaps = fpm.doProcess(item); + + statsColl.Add($"Ext prog executed for {item}", timeElaps); + } +} + + +Console.WriteLine(separator); +Console.WriteLine("press enter to proceed..."); + +Console.ReadLine(); + +foreach (var item in statsColl) +{ + Console.WriteLine($"{item.Key} {item.Value.TotalMilliseconds} ms"); +} +//Console.WriteLine($"Display executed in {timeElaps.TotalMilliseconds} ms"); + +Console.ReadLine(); \ No newline at end of file diff --git a/EgwCApp/EgwCApp.Testing/Tools/ExcImport.exe b/EgwCApp/EgwCApp.Testing/Tools/ExcImport.exe new file mode 100644 index 00000000..b5f962e4 Binary files /dev/null and b/EgwCApp/EgwCApp.Testing/Tools/ExcImport.exe differ diff --git a/EgwCApp/EgwCApp.Testing/preBuild.bat b/EgwCApp/EgwCApp.Testing/preBuild.bat new file mode 100644 index 00000000..2fe8abf9 --- /dev/null +++ b/EgwCApp/EgwCApp.Testing/preBuild.bat @@ -0,0 +1,6 @@ +@echo off + +REM recupero versione compilata +ROBOCOPY %1 %2 *.exe /MIR + +echo Eseguito restore CApp! \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlProc.sln b/EgwCApp/EgwCApp.XmlProc.sln new file mode 100644 index 00000000..2139c5b7 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32516.85 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EgwCApp.Core", "EgwCApp.Core\EgwCApp.Core.csproj", "{DF02D478-2309-48B8-BF0D-90B02327AF02}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EgwCApp.XmlProc", "EgwCApp.XmlProc\EgwCApp.XmlProc.csproj", "{64BC5889-BE30-489A-B78F-8B3EE08819CB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EgwCApp.XmlTesting", "EgwCApp.XmlTesting\EgwCApp.XmlTesting.csproj", "{52D72303-ACAB-4289-8856-0F56A50474FC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DF02D478-2309-48B8-BF0D-90B02327AF02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF02D478-2309-48B8-BF0D-90B02327AF02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF02D478-2309-48B8-BF0D-90B02327AF02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF02D478-2309-48B8-BF0D-90B02327AF02}.Release|Any CPU.Build.0 = Release|Any CPU + {64BC5889-BE30-489A-B78F-8B3EE08819CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64BC5889-BE30-489A-B78F-8B3EE08819CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64BC5889-BE30-489A-B78F-8B3EE08819CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64BC5889-BE30-489A-B78F-8B3EE08819CB}.Release|Any CPU.Build.0 = Release|Any CPU + {52D72303-ACAB-4289-8856-0F56A50474FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52D72303-ACAB-4289-8856-0F56A50474FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52D72303-ACAB-4289-8856-0F56A50474FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52D72303-ACAB-4289-8856-0F56A50474FC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2AF3181F-288A-47D5-8087-2AB660476D85} + EndGlobalSection +EndGlobal diff --git a/EgwCApp/EgwCApp.XmlProc/EgwCApp.XmlProc.csproj b/EgwCApp/EgwCApp.XmlProc/EgwCApp.XmlProc.csproj new file mode 100644 index 00000000..d18020f3 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc/EgwCApp.XmlProc.csproj @@ -0,0 +1,20 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + Always + + + + diff --git a/EgwCApp/EgwCApp.XmlProc/ImportProc.cs b/EgwCApp/EgwCApp.XmlProc/ImportProc.cs new file mode 100644 index 00000000..2084be68 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc/ImportProc.cs @@ -0,0 +1,378 @@ +using EgwCApp.Core; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static EgwCApp.Core.WharehouseData; + +namespace EgwCApp.XmlProc +{ + public class ImportProc + { + #region Public Constructors + + /// + /// Init oggetto per import + /// + /// + public ImportProc(string confFileName) + { + if (!string.IsNullOrEmpty(confFileName)) + { + fileConfName = confFileName; + } + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Decodifica configurazione + /// + /// + public bool decodeConfig() + { + bool answ = false; + if (!string.IsNullOrEmpty(fileConfName)) + { + // deserializzo config + if (!File.Exists(fileConfName)) + { + Console.WriteLine($"Error: ConfigFile not found | {fileConfName}"); + } + else + { + string rawData = File.ReadAllText(fileConfName); + // se ho contenuto procedo + if (string.IsNullOrEmpty(rawData)) + { + Console.WriteLine($"Error: ConfigFile empty! | {fileConfName}"); + } + else + { + // deserializzo + taskConfig = JsonConvert.DeserializeObject(rawData); + answ = taskConfig != null; + } + } + } + return answ; + } + + /// + /// Esegue import (se possibile) + /// + /// + public bool doProcess() + { + bool answ = false; + if (taskConfig != null) + { + // verifico esista il file... + if (string.IsNullOrEmpty(taskConfig.FileInPath) && File.Exists(taskConfig.FileInPath)) + { + // manca file ingresso!!! esco! + } + else + { + // verifico il tipo di process necessario... + switch (taskConfig.Type) + { + case ImportType.CSV: + fileReturnData = File.ReadAllText(taskConfig.FileInPath); + answ = true; + break; + + case ImportType.Excel: + fileReturnData = processExcelImport(taskConfig.FileInPath); + answ = true; + break; + + case ImportType.ND: + default: + break; + } + } + } + return answ; + } + + /// + /// Esecuzione ritorno informazioni secondo configurazione... + /// + /// + public bool doReturn() + { + bool answ = false; + if (taskConfig != null) + { + // verifico il tipo di return necessario... + switch (taskConfig.Return) + { + case ReturnMode.Console: + Console.WriteLine(fileReturnData); + answ = true; + break; + + case ReturnMode.Redis: + break; + + case ReturnMode.File: + // verifico path ci sia... sennò creo + string outPath = string.IsNullOrEmpty(taskConfig.FileOutPath) ? "FileOut.txt" : taskConfig.FileOutPath; + // verifico se vadano salvati in una folder differente... + if (!string.IsNullOrEmpty(taskConfig.ConvertDir)) + { + if (!Directory.Exists(taskConfig.ConvertDir)) + { + Directory.CreateDirectory(taskConfig.ConvertDir); + } + outPath = Path.Combine(taskConfig.ConvertDir, Path.GetFileName(outPath)); + } + // salvo il file! + File.WriteAllText(outPath, fileReturnData); + answ = true; + break; + + case ReturnMode.ND: + default: + break; + } + // se fatto eventualmente archivio + if (answ) + { + if (!string.IsNullOrEmpty(taskConfig.ArchiveDir)) + { + // verifico cartella archivio + if (!Directory.Exists(taskConfig.ArchiveDir)) + { + Directory.CreateDirectory(taskConfig.ArchiveDir); + } + // sposto file + string fName = Path.GetFileName(taskConfig.FileInPath); + File.Move(taskConfig.FileInPath, Path.Combine(taskConfig.ArchiveDir, fName), true); + } + } + } + return answ; + } + + #endregion Public Methods + + #region Protected Properties + + /// + /// Nome del file config da processare + /// + protected string fileConfName { get; set; } = ""; + + /// + /// Contenuto del file da restituire come return data (serializzato) + /// + protected string fileReturnData { get; set; } = ""; + + /// + /// Configurazione del task da eseguire + /// + protected ConfigFile? taskConfig { get; set; } = new ConfigFile(); + + #endregion Protected Properties + + #region Protected Methods + + /// + /// Estrae da una riga l'i-esimo elemento + /// + /// + /// + /// + protected string getCellVal(System.Data.DataRow? riga, int col) + { + string answ = ""; + if (riga != null) + { + try + { + answ = $"{riga.ItemArray[col]}".Trim(); + } + catch + { } + } + return answ; + } + + /// + /// Cleanup stringa x impiego tipo ident da char dubbi + /// + /// + /// + protected string strFixId(string origData) + { + return origData.Replace(".", "").Replace(" ", "_"); + } + + #endregion Protected Methods + + #region Private Methods + + /// + /// Importa un file excel e restituisce una + /// + /// + /// + private string processExcelImport(string fileItem) + { + string outVal = ""; + int numErr = 0; + // test procedura di import files excel x Giacovelli... + var currExcel = new ExcelMan(fileItem); + // creo lista dati in formato RegGiacenze... + Dictionary listaGiac = new Dictionary(); + var dtSet = currExcel.getDataSet(); + if (dtSet != null && dtSet.Tables != null && dtSet.Tables.Count > 0) + { + string nomeFile = Path.GetFileName(fileItem); + nomeFile = nomeFile.Substring(0, nomeFile.LastIndexOf(".")); + var elSheet = dtSet.Tables; + int idxTab = 0; + // cerco lo sheet corretto se > 1 + if (dtSet.Tables.Count > 1) + { + bool found = false; + for (int i = 0; i < dtSet.Tables.Count; i++) + { + if (nomeFile.Contains(dtSet.Tables[i].TableName)) + { + idxTab = i; + found = true; + break; + } + // controllo parametro opzionale... + if (!found && taskConfig != null && !string.IsNullOrEmpty(taskConfig.TargetName)) + { + if (dtSet.Tables[i].TableName == taskConfig.TargetName) + { + idxTab = i; + break; + } + } + } + } + var tabella = dtSet.Tables[idxTab]; + int numRighe = tabella.Rows.Count; + int idxODL = taskConfig != null ? taskConfig.IdxODL : 0; + for (int i = 0; i < numRighe; i++) + { + if (taskConfig != null && taskConfig.ProcessParamInt != null && taskConfig.ProcessParamInt.Count > 5) + { + if (numErr < numRighe / 5) + { + try + { + // variabili di appoggio... + DateTime dtRif = DateTime.Today; + double qtyTot = 0; + int numPack = 0; + var riga = tabella.Rows[i]; + if (riga != null) + { + string ddt = getCellVal(riga, taskConfig.ProcessParamInt["ExtDoc"]); + string sDate = getCellVal(riga, taskConfig.ProcessParamInt["DateRif"]); + string prod = getCellVal(riga, taskConfig.ProcessParamInt["Product"]); + // verifiche x import: header, data e DDT (vuoti o "-") --> SKIP! + bool checkHeaderKo = (ddt == "DDT" || prod == "PRODOTTO"); + bool checkEmptyDdt = (string.IsNullOrEmpty(ddt) || ddt == "-"); + bool checkEmptyDate = (string.IsNullOrEmpty(sDate) || sDate == "-"); + if (checkHeaderKo) + { + //lgTrace($"SKIP header"); + } + else if (checkEmptyDdt || checkEmptyDate) + { + //lgTrace($"SKIP linea vuota | i: {i} | ddt: {ddt} | date: {sDate} | prod: {prod}"); + } + else + { + string variety = getCellVal(riga, taskConfig.ProcessParamInt["Variety"]); + string suppl = getCellVal(riga, taskConfig.ProcessParamInt["Supplier"]); + string sQty = getCellVal(riga, taskConfig.ProcessParamInt["QtyTot"]); + string sNum = getCellVal(riga, taskConfig.ProcessParamInt["NumPack"]); + string numPed = getCellVal(riga, taskConfig.ProcessParamInt["NumPed"]); + string packPed = getCellVal(riga, taskConfig.ProcessParamInt["PackPed"]); + string pesoPack = getCellVal(riga, taskConfig.ProcessParamInt["PesoPack"]); + DateTime.TryParse(sDate, out dtRif); + int.TryParse(sNum, out numPack); + double.TryParse(sQty, out qtyTot); + string identRG = ddt.Length > 2 ? $"{strFixId(ddt)}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}" : $"{dtRif:yyyyMMdd}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}"; + string notes = $"{numPed}x{packPed}x{pesoPack}"; + // verifico di avere dati per proseguire... + bool checkIdent = !string.IsNullOrEmpty($"{prod}{variety}{suppl}"); + if (checkIdent) + { + BatchRec newRow = new BatchRec() + { + IdxODL = idxODL, + IdentRG = identRG, + DateRif = dtRif, + ExtDoc = ddt, + Product = prod, + Variety = variety, + Supplier = suppl, + NumPack = numPack, + QtyTot = qtyTot, + Notes = notes + }; + // verifico: se manca aggiungo + if (!listaGiac.ContainsKey(identRG)) + { + listaGiac.Add(identRG, newRow); + } + else + { + // altrimenti aggiorno giacenza con valori numerici + listaGiac[identRG].NumPack += newRow.NumPack; + listaGiac[identRG].QtyTot += newRow.QtyTot; + } + } + else + { + //lgError($"Errore verifica identità riga | prod: {prod} | variety: {variety} | suppl: {suppl}"); + numErr++; + } + } + } + } + catch (Exception exc) + { + numErr++; + } + } + } + } + } + if (listaGiac.Count > 0) + { + // converto in una nuova lista... + int rCounter = 1; + Dictionary list2Send = new Dictionary(); + foreach (var item in listaGiac) + { + list2Send.Add(rCounter, item.Value); + rCounter++; + } + // serializzo e restituisco file JSON... + var serVal = JsonConvert.SerializeObject(list2Send); + if (serVal != null && !string.IsNullOrEmpty(serVal)) + { + outVal = serVal; + } + } + return outVal; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlProc/Program.cs b/EgwCApp/EgwCApp.XmlProc/Program.cs new file mode 100644 index 00000000..03e44040 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc/Program.cs @@ -0,0 +1,62 @@ +// See https://aka.ms/new-console-template for more information + +// ExcImport: Excel Importer, per IobWin in logica lettura Giacenze +// parametri: +// $0: Path ConfigFile file per esecuzione + + +using EgwCApp.XmlProc; + +string separator = "--------------------------------------"; +string fileName = ""; + +// controllo args, se mancassero o incompleti mostro help +if (args.Length < 1) +{ + Console.WriteLine(separator); + Console.WriteLine("- ExcelFileImporter - Core 6.0"); + Console.WriteLine("- v.0.0.0.0 | @Egalware 2022+"); + Console.WriteLine(separator); + Console.WriteLine(); + Console.WriteLine("Mancano parametri per esecuzione:"); + Console.WriteLine(""); + Console.WriteLine("$0: ConfigFile da impiegare"); + + // provo a processare testConf... + fileName = "testConf.json"; +} +else +{ + fileName = args[0]; +} + +// ora processo se ho filename valido... +if (!string.IsNullOrEmpty(fileName)) +{ + // verifico se ho file... + if (File.Exists(fileName)) + { + ImportProc importObj = new ImportProc(fileName); + bool stepOk = importObj.decodeConfig(); + if (stepOk) + { + stepOk = importObj.doProcess(); + if (!stepOk) + { + Console.WriteLine("Errore in processing file"); + } + else + { + importObj.doReturn(); + } + } + else + { + Console.WriteLine("Errore in processing config file"); + } + } + else + { + Console.WriteLine("Errore file non trovato!"); + } +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlProc/Properties/PublishProfiles/FolderProfile.pubxml b/EgwCApp/EgwCApp.XmlProc/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 00000000..4ca6c8df --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,18 @@ + + + + + Release + Any CPU + bin\Release\net6.0\win-x64\publish\ + FileSystem + <_TargetId>Folder + net6.0 + win-x64 + false + true + false + + \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlProc/postBuild.bat b/EgwCApp/EgwCApp.XmlProc/postBuild.bat new file mode 100644 index 00000000..e6852aea --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc/postBuild.bat @@ -0,0 +1,4 @@ +@echo off + +REM compilo in publish +dotnet publish EgwCApp.ExcImport.csproj -p:PublishSingleFile=true -r win-x64 -c Release --self-contained false diff --git a/EgwCApp/EgwCApp.XmlProc/testConf.json b/EgwCApp/EgwCApp.XmlProc/testConf.json new file mode 100644 index 00000000..a62fe2c3 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc/testConf.json @@ -0,0 +1,25 @@ +{ + "ArchiveDir": "C:\\temp\\import\\archive", + "ConvertDir": "C:\\temp\\import\\convert", + "FileInPath": "C:\\temp\\import\\01.12.xlsx", + "FileOutPath": "01.12.json", + "IdxODL": 987654321, + "ProcessParamInt": { + "Product": 3, + "Variety": 9, + "Supplier": 8, + "ExtDoc": 2, + "DateRif": 14, + "QtyTot": 22, + "NumPack": 21, + "NumPed": 17, + "PackPed": 18, + "PesoPack": 20 + }, + "ProcessParamStr": {}, + "RedisDB": 0, + "RedisOut": "", + "Return": "File", + "TargetName": "DB Loco", + "Type": "Excel" +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlProc/testConfCsv.json b/EgwCApp/EgwCApp.XmlProc/testConfCsv.json new file mode 100644 index 00000000..5278eb08 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc/testConfCsv.json @@ -0,0 +1,6 @@ +{ + "FilePath": "C:\\Temp\\test.log", + "ProcessParams": {}, + "Return": "Console", + "Type": "Excel" +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlProc/testConfExcel.json b/EgwCApp/EgwCApp.XmlProc/testConfExcel.json new file mode 100644 index 00000000..a62fe2c3 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlProc/testConfExcel.json @@ -0,0 +1,25 @@ +{ + "ArchiveDir": "C:\\temp\\import\\archive", + "ConvertDir": "C:\\temp\\import\\convert", + "FileInPath": "C:\\temp\\import\\01.12.xlsx", + "FileOutPath": "01.12.json", + "IdxODL": 987654321, + "ProcessParamInt": { + "Product": 3, + "Variety": 9, + "Supplier": 8, + "ExtDoc": 2, + "DateRif": 14, + "QtyTot": 22, + "NumPack": 21, + "NumPed": 17, + "PackPed": 18, + "PesoPack": 20 + }, + "ProcessParamStr": {}, + "RedisDB": 0, + "RedisOut": "", + "Return": "File", + "TargetName": "DB Loco", + "Type": "Excel" +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlTesting/Appunti.txt b/EgwCApp/EgwCApp.XmlTesting/Appunti.txt new file mode 100644 index 00000000..6e57618e --- /dev/null +++ b/EgwCApp/EgwCApp.XmlTesting/Appunti.txt @@ -0,0 +1,9 @@ +echo ------------ Parametri compilazione ------------ +echo OutDir: $(OutDir) +echo Configuration: $(ConfigurationName) +echo ProjectDir: $(ProjectDir) +echo AssemblyName: $(AssemblyName) +echo TargetDir: $(TargetDir) +echo ------------ Parametri compilazione ------------ + +preBuild.bat $(SolutionDir)EgwCApp.ExcImport\EgwCApp.ExcImport.csproj $(SolutionDir)EgwCApp.ExcImport\bin\Release\net6.0\publish\win-x64\ $(ProjectDir)Utils \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlTesting/EgwCApp.XmlTesting.csproj b/EgwCApp/EgwCApp.XmlTesting/EgwCApp.XmlTesting.csproj new file mode 100644 index 00000000..436788fe --- /dev/null +++ b/EgwCApp/EgwCApp.XmlTesting/EgwCApp.XmlTesting.csproj @@ -0,0 +1,21 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + Always + + + + diff --git a/EgwCApp/EgwCApp.XmlTesting/FileProcMan.cs b/EgwCApp/EgwCApp.XmlTesting/FileProcMan.cs new file mode 100644 index 00000000..454f967d --- /dev/null +++ b/EgwCApp/EgwCApp.XmlTesting/FileProcMan.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using EgwCApp.Core; +using Newtonsoft.Json; +using System.Diagnostics; + +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwCApp.XmlTesting +{ + public class FileProcMan + { + #region Public Constructors + + public FileProcMan(string toolDir, string exeFileName) + { + this.confFileName = "conf.json"; + this.baseDir = toolDir; + this.exeName = exeFileName; + appPath = $"./{baseDir}/{exeName}"; + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Processa il singolo file e riporta tempo esecuzione + /// + /// + public TimeSpan doProcess(string fPath) + { + TimeSpan outVal = new TimeSpan(); + Stopwatch sw = new Stopwatch(); + // preparo file conf + createConfFile(fPath); + // avvio processing + Console.WriteLine("calling ext app with args:"); + Console.WriteLine($"{appPath} {confFileName}"); + Console.WriteLine(); + + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = appPath, + Arguments = $"{confFileName}", + WindowStyle = ProcessWindowStyle.Minimized, + //WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + //CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardInput = true, + }; + + sw.Start(); + + Process p = Process.Start(psi); + + string q = ""; + while (!p.HasExited) + { + q += p.StandardOutput.ReadToEnd(); + } + + sw.Stop(); + outVal = sw.Elapsed; + + return outVal; + } + + #endregion Public Methods + + #region Protected Fields + + protected string appPath = ""; + protected string baseDir = ""; + protected string confFileName = ""; + protected string exeName = ""; + + #endregion Protected Fields + + #region Private Methods + + private void createConfFile(string item) + { + Dictionary importParams = new Dictionary(); + importParams.Add("Product", 3); + importParams.Add("Variety", 9); + importParams.Add("Supplier", 8); + importParams.Add("ExtDoc", 2); + importParams.Add("DateRif", 14); + importParams.Add("QtyTot", 22); + importParams.Add("NumPack", 21); + importParams.Add("NumPed", 17); + importParams.Add("PackPed", 18); + importParams.Add("PesoPack", 20); + // calcolo nome file conf specifico + string outFileName = Path.GetFileName(item).Replace("xlsx", "json"); + confFileName = $"conf_{outFileName}"; + // calcolo outFIleName + var newConf = new ConfigFile() + { + ArchiveDir = @"C:\temp\import\archive\", + ConvertDir = @"C:\temp\import\convert\", + Type = ImportType.Excel, + FileInPath = item, + FileOutPath = outFileName, + Return = ReturnMode.File, + ProcessParamInt = importParams, + TargetName = "DB Loco" + }; + // serializzo e salvo! + var rawData = JsonConvert.SerializeObject(newConf, Formatting.Indented); + File.WriteAllText(confFileName, rawData); + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlTesting/Program.cs b/EgwCApp/EgwCApp.XmlTesting/Program.cs new file mode 100644 index 00000000..527c7c24 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlTesting/Program.cs @@ -0,0 +1,65 @@ +// See https://aka.ms/new-console-template for more information + +using EgwCApp.Core; +using System.Diagnostics; +using Newtonsoft.Json; +using EgwCApp.XmlTesting; + +Dictionary statsColl = new Dictionary(); +Stopwatch sw = new Stopwatch(); + +string separator = "--------------------------------------"; +Console.WriteLine(separator); +Console.WriteLine("Console Test Application"); +Console.WriteLine(separator); +Console.WriteLine(); + +// creo il file di configurazione... +string fileName = "conf.json"; +ConfigFile newConf = new ConfigFile(); +string rawData = ""; + +// test CSV +//newConf = new ConfigFile() +//{ +// Type = ImportType.CSV, +// FileInPath = @"C:\Temp\test.log", +// Return = ReturnMode.Console +//}; + + +// svuoto eventuali conf vecchi +var listaConf = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.json"); +if (listaConf != null && listaConf.Count() > 0) +{ + foreach (var file2del in listaConf) + { + File.Delete(file2del); + } +} +// cerco file xlsx e ciclo... +var listaFiles = Directory.GetFiles(@"C:\temp\import\", "*.xlsx"); +if (listaFiles != null && listaFiles.Count() > 0) +{ + FileProcMan fpm = new FileProcMan("Tools", "ExcImport.exe"); + foreach (var item in listaFiles) + { + TimeSpan timeElaps = fpm.doProcess(item); + + statsColl.Add($"Ext prog executed for {item}", timeElaps); + } +} + + +Console.WriteLine(separator); +Console.WriteLine("press enter to proceed..."); + +Console.ReadLine(); + +foreach (var item in statsColl) +{ + Console.WriteLine($"{item.Key} {item.Value.TotalMilliseconds} ms"); +} +//Console.WriteLine($"Display executed in {timeElaps.TotalMilliseconds} ms"); + +Console.ReadLine(); \ No newline at end of file diff --git a/EgwCApp/EgwCApp.XmlTesting/Tools/ExcImport.exe b/EgwCApp/EgwCApp.XmlTesting/Tools/ExcImport.exe new file mode 100644 index 00000000..b5f962e4 Binary files /dev/null and b/EgwCApp/EgwCApp.XmlTesting/Tools/ExcImport.exe differ diff --git a/EgwCApp/EgwCApp.XmlTesting/preBuild.bat b/EgwCApp/EgwCApp.XmlTesting/preBuild.bat new file mode 100644 index 00000000..2fe8abf9 --- /dev/null +++ b/EgwCApp/EgwCApp.XmlTesting/preBuild.bat @@ -0,0 +1,6 @@ +@echo off + +REM recupero versione compilata +ROBOCOPY %1 %2 *.exe /MIR + +echo Eseguito restore CApp! \ No newline at end of file diff --git a/EgwProxy.Icoel.Test/App.config b/EgwProxy.Icoel.Test/App.config index 400e6bbe..1b10acd2 100644 --- a/EgwProxy.Icoel.Test/App.config +++ b/EgwProxy.Icoel.Test/App.config @@ -1,25 +1,25 @@  - - -
- - - - - - - - - - - - - - - - - + + +
+ + + + + + + + + + + + + + + + + @@ -38,14 +38,14 @@ - + diff --git a/EgwProxy.SqlDb.Debug.nuspec b/EgwProxy.SqlDb.Debug.nuspec new file mode 100644 index 00000000..d6e91d60 --- /dev/null +++ b/EgwProxy.SqlDb.Debug.nuspec @@ -0,0 +1,24 @@ + + + + EgwProxy.SqlDb + #version# + EgwProxy.SqlDb + Samuele E. Locatelli, EgalWare + false + MIT + Libreria per comunicazione con generico DB SqlDb di frontiera x scambio dati (IOB-WIN-NEXT) - beta/unstable + #releaseNotes# + #copyright# + EgwProxy.SqlDb EgwProxy SqlDb + + + + + + + + + + + \ No newline at end of file diff --git a/EgwProxy.SqlDb.Release.nuspec b/EgwProxy.SqlDb.Release.nuspec new file mode 100644 index 00000000..f0bf521f --- /dev/null +++ b/EgwProxy.SqlDb.Release.nuspec @@ -0,0 +1,23 @@ + + + + EgwProxy.SqlDb + #version# + EgwProxy.SqlDb + Samuele E. Locatelli, EgalWare + false + MIT + Libreria per comunicazione con generico DB SqlDb di frontiera x scambio dati (IOB-WIN-NEXT) + #releaseNotes# + #copyright# + EgwProxy.SqlDb EgwProxy SqlDb + + + + + + + + + + \ No newline at end of file diff --git a/EgwProxy.SqlDb.Test/App.config b/EgwProxy.SqlDb.Test/App.config new file mode 100644 index 00000000..e63126cb --- /dev/null +++ b/EgwProxy.SqlDb.Test/App.config @@ -0,0 +1,25 @@ + + + + + +
+ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EgwProxy.SqlDb.Test/EgwProxy.SqlDb.Test.csproj b/EgwProxy.SqlDb.Test/EgwProxy.SqlDb.Test.csproj new file mode 100644 index 00000000..bf81c286 --- /dev/null +++ b/EgwProxy.SqlDb.Test/EgwProxy.SqlDb.Test.csproj @@ -0,0 +1,105 @@ + + + + + + Debug + AnyCPU + {A11CA446-AE97-413D-A567-45A081F003DB} + Exe + EgwProxy.SqlDb.Test + EgwProxy.SqlDb.Test + v4.6.2 + 512 + true + true + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\Remote_DEBUG\ + DEBUG;TRACE + full + AnyCPU + 7.3 + prompt + true + + + + ..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll + + + ..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll + + + ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + Always + + + + + + + + {a5f9e2c8-b866-4470-923c-11ba35270963} + EgwProxy.SqlDb + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + "$(ProjectDir)setupTgt.bat" "$(ConfigurationName)" "$(ProjectDir)" + + + "$(ProjectDir)postBuildTgt.bat" "$(ConfigurationName)" "$(TargetDir)" + + \ No newline at end of file diff --git a/EgwProxy.SqlDb.Test/Program.cs b/EgwProxy.SqlDb.Test/Program.cs new file mode 100644 index 00000000..8610e357 --- /dev/null +++ b/EgwProxy.SqlDb.Test/Program.cs @@ -0,0 +1,296 @@ +using EgwProxy.SqlDb.Controllers; +using EgwProxy.SqlDb.DbModels; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.IO; +using System.Linq; +using System.Text; +using static System.Net.Mime.MediaTypeNames; + +namespace EgwProxy.SqlDb.Test +{ + internal class Program + { + #region Protected Methods + + /// + /// legge conf in formato stringa + /// + /// + /// + protected static string ReadSetting(string key) + { + string answ = ""; + try + { + answ = $"{ConfigurationManager.AppSettings[key]}" ?? ""; + } + catch (Exception exc) + { + Console.Write("Eccezione in ReadSettings"); + Console.Write(exc.Message); + } + return answ; + } + + #endregion Protected Methods + + #region Private Fields + + /// + /// Helper separatore dash + /// + private const string separator = "------------------------"; + + #endregion Private Fields + + #region Private Methods + + /// + /// Programma principale + /// + /// + private static void Main(string[] args) + { + Console.WriteLine(separator); + Console.WriteLine("Test DB Client"); + Console.WriteLine(separator); + Console.WriteLine(); + string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; + string BaseDirectory = Path.GetDirectoryName(exePath); + string testFile = Path.Combine(BaseDirectory, ReadSetting("testFile")); + string connStr = ""; + DbController dbClient = new DbController(connStr); + if (!string.IsNullOrEmpty(testFile)) + { + Console.WriteLine(separator); + Console.WriteLine($"Mode json ({testFile})"); + Console.WriteLine(separator); + Console.WriteLine(); + if (File.Exists(testFile)) + { + var rawData = File.ReadAllText(testFile); + if (!string.IsNullOrEmpty(rawData)) + { + TestSetup testConf = new TestSetup(); + try + { + testConf = JsonConvert.DeserializeObject(rawData); + } + catch + { } + // setup server + connStr = $"data source={testConf.server};initial catalog={testConf.dbName};persist security info=True;user id={testConf.user};password={testConf.password};MultipleActiveResultSets=True;App={testConf.app}"; + dbClient = new DbController(connStr); + serverTest(dbClient); + + // eseguo per ogni step + foreach (var item in testConf.steps) + { + Console.WriteLine($"------ Step {item.id} | {item.description} ------"); + StringBuilder sb = new StringBuilder(); + sb.AppendLine(separator); + switch (item.action) + { + case stepType.GetSyncState: + var currTab = dbClient.SyncStateGetAll(); + if (currTab != null && currTab.Count > 0) + { + foreach (var syncRec in currTab) + { + sb.AppendLine($"{syncRec.TableName} | {syncRec.LastIdx} | {syncRec.Note} | {syncRec.LastUpdate}"); + } + } + else + { + sb.AppendLine("Error: Table empty/missing!"); + } + sb.AppendLine(separator); + + break; + + + case stepType.ResetPodl: + sb.AppendLine("Inizio reset PODL"); + + var dbRes = dbClient.ResetPODLMes(); + if (dbRes.Count == 0) + { + sb.AppendLine("Pulizia eseguita!"); + } + else + { + sb.AppendLine("Problemi con svuotamento tab PODL"); + } + + sb.AppendLine(separator); + + break; + case stepType.SetNewPodl: + sb.AppendLine($"Inizio inserimento {item.paramList.Count} rec"); + // creo una lista di PODL da processare... + List CurrPodlReq = new List(); + foreach (var podl in item.paramList) + { + int idxPodl = 0; + int.TryParse(podl, out idxPodl); + MesPODLReqModel newRec = new MesPODLReqModel() + { + Attivabile = true, + CodArticolo = "ART000000", + IdxMacchina = "SIMUL_01", + IdxODL = 0, + IdxPromessa = idxPodl, + NumPezzi = 1 + }; + CurrPodlReq.Add(newRec); + sb.AppendLine($"Aggiunto PODL{podl:0000000}"); + } + // chiamo procedura insert PODL + bool fatto = dbClient.MesPodlWriteReq(CurrPodlReq); + sb.AppendLine($"Records Aggiunti!"); + sb.AppendLine(separator); + break; + case stepType.DbMigrateAndSync: + try + { + var esitoMigrate = dbClient.DbForceMigrate(); + sb.Append($"Migration: {esitoMigrate}"); + } + catch (Exception exc) + { + sb.AppendLine($"eccezione in migrate:{Environment.NewLine}{exc}"); + } + break; + + case stepType.ExecExportAll: + try + { + var esitoExport = dbClient.SyncStateDoExportAll(); + sb.Append($"ExportAll: {esitoExport}"); + } + catch (Exception exc) + { + sb.AppendLine($"eccezione in ExportAll:{Environment.NewLine}{exc}"); + } + break; + case stepType.ExecImportAll: + try + { + var esitoImport = dbClient.SyncStateDoImportAll(); + sb.Append($"ImportAll: {esitoImport}"); + } + catch (Exception exc) + { + sb.AppendLine($"eccezione in ImportAll:{Environment.NewLine}{exc}"); + } + break; + case stepType.GetMachFluxLog: + try + { + var currFL = dbClient.MachFluxLogGetNew(0); + // mostro le righe + foreach (var fluxRow in currFL) + { + // aggiungo riga in out + sb.Append($"{fluxRow.Id:000} | {fluxRow.DtEvento} | {fluxRow.CodFlux} | {fluxRow.Valore}"); + } + // aggiorno syncstate... + int lastIdx = currFL.Max(x => x.Id); + SyncStateModel currSync = new SyncStateModel() + { + LastIdx = lastIdx, + LastUpdate = DateTime.Now, + Note = "Test update", + TableName = "FluxLog" + }; + dbClient.SyncStateUpsert(currSync); + } + catch (Exception exc) + { + sb.AppendLine($"eccezione in GetMachFluxLog:{Environment.NewLine}{exc}"); + } + break; + case stepType.GetMachProdData: + try + { + var currFL = dbClient.MachProdDataGetNew(0); + // mostro le righe + foreach (var fluxRow in currFL) + { + // aggiungo riga in out + sb.Append($"{fluxRow.Id:000} | {fluxRow.DtEve} | {fluxRow.CodComm} | {fluxRow.Action}"); + } + // aggiorno syncstate... + int lastIdx = currFL.Max(x => x.Id); + SyncStateModel currSync = new SyncStateModel() + { + LastIdx = lastIdx, + LastUpdate = DateTime.Now, + Note = "Test update", + TableName = "ProdData" + }; + dbClient.SyncStateUpsert(currSync); + } + catch (Exception exc) + { + sb.AppendLine($"eccezione in GetMachProdData:{Environment.NewLine}{exc}"); + } + break; + case stepType.GetMachSignLog: + try + { + var currFL = dbClient.MachSigLogGetNew(0); + // mostro le righe + foreach (var fluxRow in currFL) + { + // aggiungo riga in out + sb.Append($"{fluxRow.Id:000} | {fluxRow.DtEve} | {fluxRow.ValInt} | {fluxRow.Valore}"); + } + // aggiorno syncstate... + int lastIdx = currFL.Max(x => x.Id); + SyncStateModel currSync = new SyncStateModel() + { + LastIdx = lastIdx, + LastUpdate = DateTime.Now, + Note = "Test update", + TableName = "SignLog" + }; + dbClient.SyncStateUpsert(currSync); + } + catch (Exception exc) + { + sb.AppendLine($"eccezione in GetMachSignLog:{Environment.NewLine}{exc}"); + } + break; + + default: + break; + } + string esitoStep = sb.ToString(); + + Console.WriteLine(esitoStep); + Console.WriteLine($"------ Done Step {item.id} ------"); + Console.WriteLine(); + Console.WriteLine("Press a key to continue..."); + Console.ReadKey(); + } + } + } + } + } + + private static void serverTest(DbController dbClient) + { + Console.WriteLine(separator); + string testServer = dbClient.ServerOk(); + Console.WriteLine($"Test connessione: esito {testServer}"); + Console.WriteLine(separator); + Console.WriteLine(); + } + + #endregion Private Methods + } +} diff --git a/EgwProxy.SqlDb.Test/Properties/AssemblyInfo.cs b/EgwProxy.SqlDb.Test/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..f9eb4d26 --- /dev/null +++ b/EgwProxy.SqlDb.Test/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("EgwProxy.SqlDb.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("EgwProxy.SqlDb.Test")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a11ca446-ae97-413d-a567-45a081f003db")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/BackupDb.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/BackupDb.sql new file mode 100644 index 00000000..2d93c8f6 Binary files /dev/null and b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/BackupDb.sql differ diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ExportAll.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ExportAll.sql new file mode 100644 index 00000000..200b550b Binary files /dev/null and b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ExportAll.sql differ diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineEvList.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineEvList.sql new file mode 100644 index 00000000..0504d5c5 Binary files /dev/null and b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineEvList.sql differ diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineFluxLog.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineFluxLog.sql new file mode 100644 index 00000000..130518d6 --- /dev/null +++ b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineFluxLog.sql @@ -0,0 +1,107 @@ +ALTER PROCEDURE [dbo].[GetMachineFluxLog] +AS +BEGIN + + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT ON; + + BEGIN tran + + -- dichiarazioni variabili x recupero dati + DECLARE @LastIdx INT = 0 + DECLARE @NewIdx INT = 0 + + -- recupero valore ultima riga stato processata... + SELECT @LastIdx = ISNULL(LastIdx,0) + FROM SyncState + WHERE TableName = 'ToMachineFluxLog' + + -- recupero nuovo MAX idx + SELECT @NewIdx = ISNULL(MAX(ID),0) + FROM syn_M2ERP_MACHINE_STATE + + -- eseguo SOLO SE ho dati aggiuntivi... + IF(@NewIdx > @LastIdx) + BEGIN + /* -------------------------------------------------- + * Invierò solo VARIAZIONI dei valori + * - CurrentPP (Part Program) + * - ActiveProdOrder (Ordine in esecuzione) + * + * andando ad incrociare ogni record col precedente... + * -------------------------------------------------- */ + + -- processo dati ORDINI + ;WITH cteCurrOrd AS + ( + SELECT ID + ,ActiveProdOrder + ,Targa as IdxMacchina + ,[DateTime] AS DtEvento + FROM syn_M2ERP_MACHINE_STATE + WHERE ID > @LastIdx AND ID <= @NewIdx + ) + , ctePrevOrd AS + ( + SELECT ID + ,ActiveProdOrder + ,Targa as IdxMacchina + ,[DateTime] AS DtEvento + FROM syn_M2ERP_MACHINE_STATE + WHERE ID >= @LastIdx AND ID < @NewIdx + ) + + -- lego i valori col precedente x calcolare se siano variati x insert valori + INSERT INTO MachineFluxLog(DtEvento, IdxMacchina, CodFlux, Valore, Cnt) + SELECT curr.DtEvento, curr.IdxMacchina, 'ProdOrd' AS CodFlux, curr.ActiveProdOrder as Valore, 0 as Cnt + FROM cteCurrOrd curr + INNER JOIN ctePrevOrd prev + ON curr.ID = prev.ID+1 + WHERE curr.ActiveProdOrder <> prev.ActiveProdOrder + + -- processo dati Part Program + ;WITH cteCurrPP AS + ( + SELECT ID + ,CurrentPP + ,Targa as IdxMacchina + ,[DateTime] AS DtEvento + FROM syn_M2ERP_MACHINE_STATE + WHERE ID > @LastIdx AND ID <= @NewIdx + ) + , ctePrevPP AS + ( + SELECT ID + ,CurrentPP + ,Targa as IdxMacchina + ,[DateTime] AS DtEvento + FROM syn_M2ERP_MACHINE_STATE + WHERE ID >= @LastIdx AND ID < @NewIdx + ) + + -- lego i valori col precedente x calcolare se siano variati x insert valori + INSERT INTO MachineFluxLog(DtEvento, IdxMacchina, CodFlux, Valore, Cnt) + SELECT curr.DtEvento, curr.IdxMacchina, 'PartProg' as CodFlux, curr.CurrentPP as Valore, 0 as Cnt + FROM cteCurrPP curr + INNER JOIN ctePrevPP prev + ON curr.ID = prev.ID+1 + WHERE curr.CurrentPP <> prev.CurrentPP + + + -- aggiorno valore indice processato + MERGE SyncState AS tgt + USING (SELECT @NewIdx as LastIdx, 'ToMachineFluxLog' AS TableName) as src (LastIdx, TableName) + ON (tgt.TableName = src.TableName) + WHEN MATCHED THEN + UPDATE SET LastIdx = src.LastIdx + ,Note = 'UPDATED from ' + CAST(@LastIdx AS NVARCHAR(50)) + ,LastUpdate = GETDATE() + WHEN NOT MATCHED THEN + INSERT (LastIdx, TableName, Note, LastUpdate) + VALUES (src.LastIdx, src.TableName, 'CREATED', GETDATE()); + + END + + COMMIT tran +END \ No newline at end of file diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineProdData.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineProdData.sql new file mode 100644 index 00000000..dc114fb0 --- /dev/null +++ b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineProdData.sql @@ -0,0 +1,166 @@ +ALTER PROCEDURE [dbo].[stp_GetMachineProdData] +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT ON; + + BEGIN tran + + -- dichiarazioni variabili x recupero dati + DECLARE @LastIdx INT = 0 + DECLARE @NewIdx INT = 0 + + -- recupero valore ultima riga stato processata... + SELECT @LastIdx = ISNULL(LastIdx,0) + FROM SyncState + WHERE TableName = 'ToMachineProdData' + + -- recupero nuovo MAX idx + SELECT @NewIdx = ISNULL(MAX(ID),0) + FROM syn_M2ERP_PRODORDERS + + -- eseguo SOLO SE ho dati aggiuntivi... + IF(@NewIdx > @LastIdx) + BEGIN + /* -------------------------------------------------- + * Invierò solo VARIAZIONI dei valori + * - CurrentProdOrder (iniziato/concluso) + * - Quantità Produzione + * - dati FluxLog x ordini/quantità/tempi di produzione + * + * andando ad incrociare ogni record col precedente... + * -------------------------------------------------- */ + + -- processo dati ORDINI + ;WITH cteCurrOrd AS + ( + SELECT ID + ,ProdOrder + ,Targa as IdxMacchina + ,[DateTime] AS DtEvento + ,ProdOrderState + ,ProdQty + FROM syn_M2ERP_PRODORDERS + WHERE ID > @LastIdx AND ID <= @NewIdx + ) + , ctePrevOrd AS + ( + SELECT ID + ,ProdOrder + ,Targa as IdxMacchina + ,[DateTime] AS DtEvento + ,ProdOrderState + ,ProdQty + FROM syn_M2ERP_PRODORDERS + WHERE ID >= @LastIdx AND ID < @NewIdx + ) + , cteActDec AS + ( + SELECT curr.DtEvento as DtEve + ,curr.IdxMacchina + ,CASE + WHEN curr.ProdOrderState = 1 THEN 'StartOrd' + --WHEN curr.ProdOrderState = 2 THEN 'PauseOrd' + WHEN curr.ProdOrderState = 3 THEN 'EndOrd' + --WHEN curr.ProdOrderState = 6 THEN 'InsOrd' + ELSE 'NONE' + END AS OrdAction + ,CASE + WHEN LEFT(curr.ProdOrder, 4) = 'PODL' THEN REPLACE(curr.ProdOrder,'PODL','') + ELSE 0 END AS IdxPodl + ,CASE + WHEN LEFT(curr.ProdOrder, 3) = 'ODL' THEN REPLACE(curr.ProdOrder,'ODL','') + ELSE 0 END AS IdxOdl + ,curr.ProdOrder as CodComm + ,curr.ProdQty as PzCount + FROM cteCurrOrd curr + INNER JOIN ctePrevOrd prev + ON curr.ID = prev.ID+1 + WHERE (curr.ProdOrder <> prev.ProdOrder) + OR (curr.ProdOrderState <> prev.ProdOrderState) + OR (curr.ProdQty <> prev.ProdQty) + ) + -- lego i valori col precedente x calcolare se siano variati x insert valori + INSERT INTO MachineProdData(DtEve, IdxMacchina, Action, IdxPodl, IdxOdl, CodComm, PzCount) + SELECT DtEve, IdxMacchina, OrdAction, IdxPodl, IdxOdl, CodComm, PzCount + FROM cteActDec + WHERE OrdAction <> 'NONE' + + -- ora processo ANCHE come fluxLog i record dei degli ordini (cod ordine, tempi...) + ;WITH cteCurrOrd AS + ( + SELECT ID + ,ProdOrder + ,Targa as IdxMacchina + ,[DateTime] AS DtEvento + ,ProdOrderState + ,ProdQty + ,ElapsedTime + FROM syn_M2ERP_PRODORDERS + WHERE ID > @LastIdx AND ID <= @NewIdx + ) + , ctePrevOrd AS + ( + SELECT ID + ,ProdOrder + ,Targa as IdxMacchina + ,[DateTime] AS DtEvento + ,ProdOrderState + ,ProdQty + ,ElapsedTime + FROM syn_M2ERP_PRODORDERS + WHERE ID >= @LastIdx AND ID < @NewIdx + ) + , cteActDec AS + ( + SELECT curr.DtEvento as DtEve + ,curr.IdxMacchina + ,CASE + WHEN curr.ProdOrderState = 1 THEN 'StartOrd' + --WHEN curr.ProdOrderState = 2 THEN 'PauseOrd' + WHEN curr.ProdOrderState = 3 THEN 'EndOrd' + --WHEN curr.ProdOrderState = 6 THEN 'InsOrd' + ELSE 'NONE' + END AS OrdAction + ,CAST(CASE + WHEN LEFT(curr.ProdOrder, 4) = 'PODL' THEN REPLACE(curr.ProdOrder,'PODL','') + ELSE '0' END AS NVARCHAR(50)) AS IdxPodl + ,CAST(CASE + WHEN LEFT(curr.ProdOrder, 3) = 'ODL' THEN REPLACE(curr.ProdOrder,'ODL','') + ELSE '0' END AS NVARCHAR(50)) AS IdxOdl + ,CAST(curr.ProdOrder AS NVARCHAR(50)) as CodComm + ,curr.ProdQty as PzCount + ,CAST(curr.ElapsedTime AS NVARCHAR(50)) AS ElapsedTime + FROM cteCurrOrd curr + INNER JOIN ctePrevOrd prev + ON curr.ID = prev.ID+1 + WHERE (curr.ProdOrder <> prev.ProdOrder) + OR (curr.ProdOrderState <> prev.ProdOrderState) + OR (curr.ProdQty <> prev.ProdQty) + ) + -- lego i valori col precedente x calcolare se siano variati x insert valori + --INSERT INTO MachineFluxLog(DtEvento, IdxMacchina, CodFlux, Valore, Cnt) + SELECT DtEve as DtEvento, IdxMacchina, CodFlux, Valore,0 as Cnt + FROM cteActDec + UNPIVOT (Valore FOR CodFlux IN (CodComm, ElapsedTime, IdxOdl, IdxPOdl)) AS Unpvt + WHERE OrdAction <> 'NONE' + AND Valore <> '0' + + -- aggiorno valore indice processato + MERGE SyncState AS tgt + USING (SELECT @NewIdx as LastIdx, 'ToMachineProdData' AS TableName) as src (LastIdx, TableName) + ON (tgt.TableName = src.TableName) + WHEN MATCHED THEN + UPDATE SET LastIdx = src.LastIdx + ,Note = 'UPDATED from ' + CAST(@LastIdx AS NVARCHAR(50)) + ,LastUpdate = GETDATE() + WHEN NOT MATCHED THEN + INSERT (LastIdx, TableName, Note, LastUpdate) + VALUES (src.LastIdx, src.TableName, 'CREATED', GETDATE()); + + END + + COMMIT tran + +END diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineSigLog.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineSigLog.sql new file mode 100644 index 00000000..c5390638 Binary files /dev/null and b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/GetMachineSigLog.sql differ diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ImportAll.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ImportAll.sql new file mode 100644 index 00000000..dc44ae24 Binary files /dev/null and b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ImportAll.sql differ diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/MoonPro_IOB_ISF_Pama.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/MoonPro_IOB_ISF_Pama.sql new file mode 100644 index 00000000..6d8dfa7b --- /dev/null +++ b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/MoonPro_IOB_ISF_Pama.sql @@ -0,0 +1,36 @@ +/****** MoonPro_IOB-ISF_PAMA Script Date: 13/03/2023 19:03:53 ******/ + +-- creazione sinonimi +CREATE SYNONYM [dbo].[syn_ERP2M] FOR [P_HUB_PLD392].[dbo].[ERP2M] +CREATE SYNONYM [dbo].[syn_M2ERP_MACHINE_STATE] FOR [P_HUB_PLD392].[dbo].[M2ERP_MACHINE_STATE] +CREATE SYNONYM [dbo].[syn_M2ERP_PRODORDERS] FOR [P_HUB_PLD392].[dbo].[M2ERP_PRODORDERS] + +GO + +-- fix funzione +/*************************************** +* FUNCTION f_padLeft +* +* fornisce una stringa della lunghezza desiderata aggiungendo a sx il carattere richiesto alla @string originale +* +* Steamware, S.E.L. +* mod: 2010.03.19 +* +****************************************/ +create FUNCTION [dbo].[f_padLeft] (@string VARCHAR(255), @desired_length INTEGER, @pad_character CHAR(1)) +RETURNS VARCHAR(255) AS +BEGIN + + -- Prefix the required number of spaces to bulk up the string and then replace the spaces with the desired character + RETURN CASE + WHEN LEN(@string) < @desired_length + THEN REPLACE(SPACE(@desired_length - LEN(@string)), ' ', @pad_character) + @string + ELSE @string + END + +END +GO + + + +-- fix stored specifiche diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ResetPodlMes.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ResetPodlMes.sql new file mode 100644 index 00000000..bc49e38b Binary files /dev/null and b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ResetPodlMes.sql differ diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/SyncPodlToMachine.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/SyncPodlToMachine.sql new file mode 100644 index 00000000..6ac30097 Binary files /dev/null and b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/SyncPodlToMachine.sql differ diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/Test.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/Test.sql new file mode 100644 index 00000000..a0fae839 --- /dev/null +++ b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/Test.sql @@ -0,0 +1,98 @@ +select * from ActType +select * from ActList +select * from SyncState +select * from MesPODL_last +select * from MesPODL_req + +select * from MachineFluxLog +select * from MachineProdData +select * from MachineSignalLog + + +-- test scrittura PODL: OK! +exec dbo.SyncPodlToMachine + +exec dbo.GetMachineSigLog +select * from SyncState +select * from MachineSignalLog + +/* +truncate table MachineFluxLog +update SyncState +set lastidx=0 +where TableName='ToMachineFluxLog' +*/ + +select top 2 * from MachineFluxLog order by 1 desc +select top 2 * from MachineProdData order by 1 desc +select top 10 * from MachineSignalLog order by 1 desc +select * from SyncState + +exec dbo.GetMachineFluxLog +select * from MachineFluxLog + +select * from syn_ERP2M +select * from syn_M2ERP_MACHINE_STATE +select * from syn_M2ERP_PRODORDERS + + +select top 10 * from syn_M2ERP_PRODORDERS +where ProdOrder LIKE 'PODL000%' + + +select top 10 * from syn_M2ERP_PRODORDERS +where ProdOrder LIKE '%ODL%' +order by 1 desc + +EXEC GetMachineProdData +SELECT * FROM SyncState +SELECT * FROM MachineFluxLog +SELECT * FROM MachineProdData +SELECT * FROM MachineSignalLog + + +/* +truncate table MachineProdData +update SyncState +set lastidx=0 +where TableName='ToMachineProdData' +*/ + +select * from ActType + + + +/* + +drop table __MigrationHistory +drop table ActList +drop table ActType +drop table MachineEventList +drop table MachineFluxLog +drop table MachinePODL +drop table MesPODL_last +drop table MesPODL_req +drop table SyncState + +drop PROCEDURE dbo.BackupDb +drop PROCEDURE dbo.ExportAll +drop PROCEDURE dbo.GetMachineEvList +drop PROCEDURE dbo.GetMachineFluxLog +drop PROCEDURE dbo.ImportAll +drop PROCEDURE dbo.ResetPodlMes +drop PROCEDURE dbo.SyncPodlToMachine + +*/ + + + + + +select * from ERP2M + +select * from M2ERP_MACHINE_STATE where ActiveProdOrder = 'ODL0003743' +select * from M2ERP_PRODORDERS + +select * from M2ERP_PRODORDERS where ProdOrder = 'ODL0003743' + + diff --git a/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ext_stp_OrdState.sql b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ext_stp_OrdState.sql new file mode 100644 index 00000000..cac40ae8 --- /dev/null +++ b/EgwProxy.SqlDb.Test/SqlFromDebug/PAMA/ext_stp_OrdState.sql @@ -0,0 +1,49 @@ +-- ============================================= +-- Author: S.E.L. +-- Create date: 2023.03.17 +-- Description: Verifica ordini aperti - EXT schema/special +-- ============================================= +CREATE PROCEDURE ext.stp_OrdState +( + @onlyOpen INT = 0 -- 1 = solo ordini rimasti aperti/validi +) +AS +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT ON; + + + + IF (@onlyOpen = 0) + BEGIN + ;WITH cteOrd AS + ( + SELECT ProdOrder, MAX(id) as lastID + FROM syn_M2ERP_PRODORDERS + GROUP BY ProdOrder + ) + SELECT m2erp.* + FROM syn_M2ERP_PRODORDERS m2erp + INNER JOIN cteord cte ON m2erp.ID=cte.lastID + ORDER BY 1 DESC + END + ELSE + BEGIN + ;WITH cteOrd AS + ( + SELECT ProdOrder, MAX(id) as lastID + FROM syn_M2ERP_PRODORDERS + GROUP BY ProdOrder + ) + SELECT m2erp.* + FROM syn_M2ERP_PRODORDERS m2erp + INNER JOIN cteord cte ON m2erp.ID=cte.lastID + WHERE m2erp.ProdOrderState NOT IN (3,4) + ORDER BY 1 DESC + END + + + +END +GO diff --git a/EgwProxy.SqlDb.Test/TestSetup.cs b/EgwProxy.SqlDb.Test/TestSetup.cs new file mode 100644 index 00000000..ad358b13 --- /dev/null +++ b/EgwProxy.SqlDb.Test/TestSetup.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.Test +{ + public class TestSetup + { + public string app { get; set; } = "testApp"; + public string server { get; set; } = ""; + public string user { get; set; } = ""; + public string password { get; set; } = ""; + public string dbName { get; set; } = "MoonPro_IOB_ISF_PAMA"; + public List steps { get; set; } + } + + public class singleStep + { + public string id { get; set; } = "00"; + public string description { get; set; } = "00"; + public stepType action { get; set; } = stepType.None; + + public List paramList { get; set; } = new List(); + } + + public enum stepType + { + None, + DbMigrateAndSync, + ExecExportAll, + ExecImportAll, + GetMachSignLog, + GetMachProdData, + GetMachFluxLog, + GetSyncState, + ResetPodl, + SetNewPodl, + //procPodl + } +} diff --git a/EgwProxy.SqlDb.Test/conf/.placeholder b/EgwProxy.SqlDb.Test/conf/.placeholder new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/EgwProxy.SqlDb.Test/conf/.placeholder @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/EgwProxy.SqlDb.Test/conf/testSetup.json b/EgwProxy.SqlDb.Test/conf/testSetup.json new file mode 100644 index 00000000..95927294 --- /dev/null +++ b/EgwProxy.SqlDb.Test/conf/testSetup.json @@ -0,0 +1,71 @@ +{ + "server": "308SERVER60\\LANTEK", + "user": "steamware", + "password": "viadante16", + "steps": [ + { + "id": "00", + "description": "Db Migrate + SYNC", + "action": "DbMigrateAndSync", + "paramList": [] + }, + { + "id": "01", + "description": "Test SYNC", + "action": "GetSyncState", + "paramList": [] + }, + { + "id": "02", + "description": "Reset PODL MES", + "action": "ResetPodl", + "paramList": [] + }, + //{ + // "id": "03", + // "description": "upload Test PODL", + // "action": "SetNewPodl", + // "paramList": [ + // "1001", + // "1002", + // "1003" + // ] + //} + { + "id": "03", + "description": "Export All", + "action": "ExecExportAll", + "paramList": [] + }, + { + "id": "04", + "description": "Import All", + "action": "ExecImportAll", + "paramList": [] + }, + { + "id": "05", + "description": "Get SignLog", + "action": "GetMachSignLog", + "paramList": [] + }, + { + "id": "06", + "description": "Get ProdData", + "action": "GetMachProdData", + "paramList": [] + }, + { + "id": "07", + "description": "Get FluxLog", + "action": "GetMachFluxLog", + "paramList": [] + }, + { + "id": "08", + "description": "Test SYNC", + "action": "GetSyncState", + "paramList": [] + } + ] +} \ No newline at end of file diff --git a/EgwProxy.SqlDb.Test/packages.config b/EgwProxy.SqlDb.Test/packages.config new file mode 100644 index 00000000..c3ae258f --- /dev/null +++ b/EgwProxy.SqlDb.Test/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/EgwProxy.SqlDb.Test/postBuildTgt.bat b/EgwProxy.SqlDb.Test/postBuildTgt.bat new file mode 100644 index 00000000..7866f5c0 --- /dev/null +++ b/EgwProxy.SqlDb.Test/postBuildTgt.bat @@ -0,0 +1,74 @@ +@echo off +echo Effettua pulizia post build: configurazione %1. directory %2 + +RD /S /Q %2"\lib\da" +RD /S /Q %2"\lib\de" +RD /S /Q %2"\lib\es" +RD /S /Q %2"\lib\fr" +RD /S /Q %2"\lib\it" +RD /S /Q %2"\lib\ja-JP" +RD /S /Q %2"\lib\ko" +RD /S /Q %2"\lib\nl" +RD /S /Q %2"\lib\pl" +RD /S /Q %2"\lib\pt" +RD /S /Q %2"\lib\ru" +RD /S /Q %2"\lib\sv" +RD /S /Q %2"\lib\tr" +RD /S /Q %2"\lib\zh" + +MOVE /Y %2"da" %2"lib\" +MOVE /Y %2"de" %2"lib\" +MOVE /Y %2"es" %2"lib\" +MOVE /Y %2"fr" %2"lib\" +MOVE /Y %2"it" %2"lib\" +MOVE /Y %2"ja-JP" %2"lib\" +MOVE /Y %2"ko" %2"lib\" +MOVE /Y %2"nl" %2"lib\" +MOVE /Y %2"pl" %2"lib\" +MOVE /Y %2"pt" %2"lib\" +MOVE /Y %2"ru" %2"lib\" +MOVE /Y %2"sv" %2"lib\" +MOVE /Y %2"tr" %2"lib\" +MOVE /Y %2"zh" %2"lib\" + + +if %1 == "Release" goto Release +if %1 == "Debug" goto Debug +if %1 == "Remote_DEBUG" goto RemoteDebug + +:Release +REM INIZIO eliminando i files pdb +del /S %2"*.pdb"" +del /S %2"lib/*.pdb"" +echo Release: eliminato pdb!!! +goto END + +:Debug +echo Debug: nulla da eliminare + +REM copia script verso server remoto +REM ROBOCOPY . \\10.150.0.1\Steamware\SqlDbTest-DEB /MIR + +goto END + + +:RemoteDebug +REM copia script verso server remoto +REM echo Debug remoto: effettuo robocopy sync (verificare remote per cliente) + +REM FINASSI +REM ROBOCOPY . \\10.150.0.1\Steamware\SqlDbTest-DEB /MIR +REM Baglietto +REM ROBOCOPY . \\192.168.60.15\Steamware\SqlDbTest-DEB /MIR +REM GIACOVELLI LOCOROTONDO +REM ROBOCOPY . \\192.168.1.93\Steamware\SqlDbTest-DEB /MIR +REM IMI Remosa +ROBOCOPY . \\192.168.0.12\Steamware\SqlDbTest-DEB /MIR + +REM IOB-WIN-SIM +REM ROBOCOPY . \\IOB-WIN-SIMULA\Steamware\SqlDbTest-DEB /MIR + +goto END + +:END +echo Fatto! \ No newline at end of file diff --git a/EgwProxy.SqlDb.Test/setupTgt.bat b/EgwProxy.SqlDb.Test/setupTgt.bat new file mode 100644 index 00000000..ba685c02 --- /dev/null +++ b/EgwProxy.SqlDb.Test/setupTgt.bat @@ -0,0 +1,25 @@ +@echo off +echo Effettua setup dei file specifici per i vari ambienti pre build installer: verifica da nome configurazione %1 + + +if %1 == "Release" goto Release +if %1 == "Debug" goto Debug +if %1 == "Remote_DEBUG" goto RemoteDebug + +:Release +echo Release: nulla da copiare +goto END + +:Debug +echo Debug: copia file ini x simulazione Debug +REM del %2"DATA\CONF\EsaKvara.ini" +REM copy %2"Resources\SCM\EsaKvara_SIM.ini" %2"DATA\CONF\EsaKvara.ini" +goto END + + +:RemoteDebug +echo RemoteDebug: nulla da copiare +goto END + +:END +echo Fatto! \ No newline at end of file diff --git a/EgwProxy.SqlDb.sln b/EgwProxy.SqlDb.sln new file mode 100644 index 00000000..4528799c --- /dev/null +++ b/EgwProxy.SqlDb.sln @@ -0,0 +1,36 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33424.131 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EgwProxy.SqlDb", "EgwProxy.SqlDb\EgwProxy.SqlDb.csproj", "{A5F9E2C8-B866-4470-923C-11BA35270963}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EgwProxy.SqlDb.Test", "EgwProxy.SqlDb.Test\EgwProxy.SqlDb.Test.csproj", "{A11CA446-AE97-413D-A567-45A081F003DB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + Remote_DEBUG|Any CPU = Remote_DEBUG|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A5F9E2C8-B866-4470-923C-11BA35270963}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5F9E2C8-B866-4470-923C-11BA35270963}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5F9E2C8-B866-4470-923C-11BA35270963}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5F9E2C8-B866-4470-923C-11BA35270963}.Release|Any CPU.Build.0 = Release|Any CPU + {A5F9E2C8-B866-4470-923C-11BA35270963}.Remote_DEBUG|Any CPU.ActiveCfg = Debug|Any CPU + {A5F9E2C8-B866-4470-923C-11BA35270963}.Remote_DEBUG|Any CPU.Build.0 = Debug|Any CPU + {A11CA446-AE97-413D-A567-45A081F003DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A11CA446-AE97-413D-A567-45A081F003DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A11CA446-AE97-413D-A567-45A081F003DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A11CA446-AE97-413D-A567-45A081F003DB}.Release|Any CPU.Build.0 = Release|Any CPU + {A11CA446-AE97-413D-A567-45A081F003DB}.Remote_DEBUG|Any CPU.ActiveCfg = Remote_DEBUG|Any CPU + {A11CA446-AE97-413D-A567-45A081F003DB}.Remote_DEBUG|Any CPU.Build.0 = Remote_DEBUG|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E2472E21-58D3-4EAD-BC4A-BC3915B18BEF} + EndGlobalSection +EndGlobal diff --git a/EgwProxy.SqlDb/App.config b/EgwProxy.SqlDb/App.config new file mode 100644 index 00000000..0c73aaa1 --- /dev/null +++ b/EgwProxy.SqlDb/App.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/EgwProxy.SqlDb/Controllers/DbController.cs b/EgwProxy.SqlDb/Controllers/DbController.cs new file mode 100644 index 00000000..7200b7f4 --- /dev/null +++ b/EgwProxy.SqlDb/Controllers/DbController.cs @@ -0,0 +1,316 @@ +using EgwProxy.SqlDb.DbModels; +using NLog; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace EgwProxy.SqlDb.Controllers +{ + /// + /// Controller accesso dati DB IOB_ISF + /// + public class DbController : IDisposable + { + #region Public Constructors + + /// + /// Avvio dell'oggetto gestione DB con stringa di connessione specifica + /// + /// Connessione DB locale di SYNC + public DbController(string connSyncState) + { + connString = connSyncState; + Log.Info("Avviata classe DbController"); + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Recupera la tab di ActList corrente + /// + /// + public List ActListGetAll() + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .DbSetActions + .ToList(); + } + + return dbResult; + } + + /// + /// Recupera la tab di ActType corrente + /// + /// + public List ActTypeGetAll() + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .DbSetActListType + .ToList(); + } + return dbResult; + } + + public bool DbForceMigrate() + { + bool fatto = false; + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbSyncStateCtx.DbForceMigrate(); + fatto = true; + } + return fatto; + } + + /// + /// Dispose classe + /// + public void Dispose() + { + // Clear database context + connString = ""; + } + + /// + /// Recupera la tab FluxLog x i record successivi all'ID già processato + /// + /// + /// + public List MachFluxLogGetNew(long lastIdx) + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .DbSetMachFluxLog + .Where(x => x.Id > lastIdx) + .OrderBy(x => x.Id) + .ToList(); + } + return dbResult; + } + + /// + /// Recupera la tab PODL Macchina x i record successivi all'ID già processato + /// + /// + /// + public List MachPOdlGetNew(long lastIdx) + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .DbSetMachPODL + .Where(x => x.IdxPromessa > lastIdx) + .OrderBy(x => x.IdxPromessa) + .ToList(); + } + return dbResult; + } + + /// + /// Recupera la tab ProdData x i record successivi all'ID già processato + /// + /// + /// + public List MachProdDataGetNew(long lastIdx) + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .DbSetMachProdData + .Where(x => x.Id > lastIdx) + .OrderBy(x => x.Id) + .ToList(); + } + return dbResult; + } + + /// + /// Recupera la tab EvList x i record successivi all'ID già processato + /// + /// + /// + public List MachSigLogGetNew(long lastIdx) + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .DbSetMachEvList + .Where(x => x.Id > lastIdx) + .OrderBy(x => x.Id) + .ToList(); + } + return dbResult; + } + + /// + /// Scrive elenco PODL attivi al momento x processing successivo + /// + /// + /// + public bool MesPodlWriteReq(List CurrPodlReq) + { + bool fatto = false; + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + try + { + // in primis verifica SE sia vuota la tab req... + var oldData = dbSyncStateCtx + .DbSetMesPodlReq + .ToList(); + // se vuota scrive i record e salva + if (oldData.Count == 0) + { + // aggiungo i nuovi record + var dbResult = dbSyncStateCtx + .DbSetMesPodlReq + .AddRange(CurrPodlReq); + // salvo + dbSyncStateCtx.SaveChanges(); + fatto = true; + } + } + catch //(Exception exc) + { } + } + return fatto; + } + + /// + /// Esegue reset tabelle PODL MEs e restituisce elenco finale (vuoto) + /// + /// + public List ResetPODLMes() + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .Database + .SqlQuery("EXEC dbo.stp_ResetPodlMes") + .ToList(); + } + return dbResult; + } + + public string ServerOk() + { + return SyncStateGetAll().Count() > 0 ? "OK" : "NA"; + } + + /// + /// Esegue una volta la stored di ImportAll (x recupero dati da DB esterni) e poi + /// restitusice in output la tab di SyncState x verificare lo stato + /// + /// + public List SyncStateDoExportAll() + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .Database + .SqlQuery("EXEC dbo.stp_ExportAll") + .ToList(); + } + return dbResult; + } + + /// + /// Esegue una volta la stored di ImportAll (x recupero dati da DB esterni) e poi + /// restitusice in output la tab di SyncState x verificare lo stato + /// + /// + public List SyncStateDoImportAll() + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .Database + .SqlQuery("EXEC dbo.stp_ImportAll") + .ToList(); + } + return dbResult; + } + + /// + /// recupera la tab di SyncState corrente + /// + /// + public List SyncStateGetAll() + { + List dbResult = new List(); + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + dbResult = dbSyncStateCtx + .DbSetSyncState + .ToList(); + } + return dbResult; + } + + /// + /// Aggiorna record SyncState corrente + /// + /// + public bool SyncStateUpsert(SyncStateModel newVal) + { + bool fatto = false; + using (var dbSyncStateCtx = new SyncStateDbContext(connString)) + { + // cerco record + var dbResult = dbSyncStateCtx + .DbSetSyncState + .Where(x => x.TableName == newVal.TableName) + .FirstOrDefault(); + // se trovato aggiorno + if (dbResult != null) + { + dbResult.LastIdx = newVal.LastIdx; + dbResult.Note = newVal.Note; + dbResult.LastUpdate = newVal.LastUpdate; + //dbSyncStateCtx.Entry(dbResult).State = System.Data.Entity.EntityState.Modified; + } + // altrimenti aggiungo + else + { + dbSyncStateCtx.DbSetSyncState.Add(newVal); + } + + // salvo + dbSyncStateCtx.SaveChanges(); + fatto = true; + } + return fatto; + } + + #endregion Public Methods + + #region Protected Fields + + protected static string connString = ""; + + #endregion Protected Fields + + #region Private Fields + + private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); + + #endregion Private Fields + } +} \ No newline at end of file diff --git a/EgwProxy.SqlDb/DbModels/ActListModel.cs b/EgwProxy.SqlDb/DbModels/ActListModel.cs new file mode 100644 index 00000000..7c704a86 --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/ActListModel.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("ActList")] + public partial class ActListModel + { + [Key, Column("IdxAct"), DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } = 0; + + public DateTime DtRif { get; set; } = DateTime.Today; + + [StringLength(50)] + public string Source { get; set; } = "IN"; + + [StringLength(50)] + public string Dest { get; set; } = "OUT"; + + [StringLength(250)] + public string Action { get; set; } = ""; + + [StringLength(2500)] + public string Value { get; set; } = ""; + + } +} diff --git a/EgwProxy.SqlDb/DbModels/ActTypeModel.cs b/EgwProxy.SqlDb/DbModels/ActTypeModel.cs new file mode 100644 index 00000000..850af7ce --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/ActTypeModel.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("ActType")] + public partial class ActTypeModel + { + [Key, StringLength(250)] + public string Action { get; set; } = ""; + + [StringLength(500)] + public string Description { get; set; } = ""; + + } +} diff --git a/EgwProxy.SqlDb/DbModels/MachFluxLogModel.cs b/EgwProxy.SqlDb/DbModels/MachFluxLogModel.cs new file mode 100644 index 00000000..5b80c548 --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/MachFluxLogModel.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("MachineFluxLog")] + public partial class MachFluxLogModel + { + [Key, Column("IdxFL"), DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } = 0; + + public DateTime DtEvento { get; set; } = DateTime.Now; + + [StringLength(50)] + public string IdxMacchina { get; set; } = ""; + + [StringLength(50)] + public string CodFlux { get; set; } = ""; + + [StringLength(250)] + public string Valore { get; set; } = ""; + + public int Cnt { get; set; } = 0; + + } +} diff --git a/EgwProxy.SqlDb/DbModels/MachPODLModel.cs b/EgwProxy.SqlDb/DbModels/MachPODLModel.cs new file mode 100644 index 00000000..c8775d83 --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/MachPODLModel.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("MachinePODL")] + public partial class MachPODLModel + { + [Key] + public int IdxRec { get; set; } = 0; + + public int IdxPromessa { get; set; } = 0; + + [StringLength(50)] + public string KeyRichiesta { get; set; } = ""; + [StringLength(50)] + public string KeyBCode { get; set; } = ""; + + public bool Attivabile { get; set; } = false; + + public int IdxODL { get; set; } = 0; + + [StringLength(50)] + public string CodArticolo { get; set; } = ""; + + [StringLength(50)] + public string CodGruppo { get; set; } = ""; + + [StringLength(50)] + public string IdxMacchina { get; set; } = ""; + + public int NumPezzi { get; set; } = 0; + + public decimal TCAssegnato { get; set; } = 0; + + public DateTime DueDate { get; set; } = DateTime.Today; + + public int Priorita { get; set; } = 0; + public int PzPallet { get; set; } = 0; + + [StringLength(2500)] + public string Note { get; set; } = ""; + + [StringLength(50)] + public string CodCli { get; set; } = ""; + + public DateTime InsertDate { get; set; } = DateTime.Today; + } +} diff --git a/EgwProxy.SqlDb/DbModels/MachProdDataModel.cs b/EgwProxy.SqlDb/DbModels/MachProdDataModel.cs new file mode 100644 index 00000000..f5fb455f --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/MachProdDataModel.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("MachineProdData")] + public partial class MachProdDataModel + { + [Key, Column("IdxPD"), DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } = 0; + + public DateTime DtEve { get; set; } = DateTime.Now; + + [StringLength(50)] + public string IdxMacchina { get; set; } = ""; + + public string Action { get; set; } = ""; + + public string CodComm { get; set; } = ""; + + public int PzCount { get; set; } = 0; + + public int IdxPodl { get; set; } = 0; + + public int IdxOdl { get; set; } = 0; + + } +} diff --git a/EgwProxy.SqlDb/DbModels/MachSigLogModel.cs b/EgwProxy.SqlDb/DbModels/MachSigLogModel.cs new file mode 100644 index 00000000..9bdc7c5b --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/MachSigLogModel.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("MachineSignalLog")] + public partial class MachSigLogModel + { + [Key, Column("IdxEv"), DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } = 0; + + public DateTime DtEve { get; set; } = DateTime.Now; + + [StringLength(50)] + public string IdxMacchina { get; set; } = ""; + + public int ValInt { get; set; } = 0; + + public string Valore { get; set; } = ""; + + } +} diff --git a/EgwProxy.SqlDb/DbModels/MesPODLLastModel.cs b/EgwProxy.SqlDb/DbModels/MesPODLLastModel.cs new file mode 100644 index 00000000..17f55bee --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/MesPODLLastModel.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("MesPODL_last")] + public partial class MesPODLLastModel + { + [Key] + public int IdxRec { get; set; } = 0; + + public int IdxPromessa { get; set; } = 0; + + [StringLength(50)] + public string KeyRichiesta { get; set; } = ""; + [StringLength(50)] + public string KeyBCode { get; set; } = ""; + + public bool Attivabile { get; set; } = false; + + public int IdxODL { get; set; } = 0; + + [StringLength(50)] + public string CodArticolo { get; set; } = ""; + + [StringLength(50)] + public string CodGruppo { get; set; } = ""; + + [StringLength(50)] + public string IdxMacchina { get; set; } = ""; + + public int NumPezzi { get; set; } = 0; + + public decimal TCAssegnato { get; set; } = 0; + + public DateTime DueDate { get; set; } = DateTime.Today; + + public int Priorita { get; set; } = 0; + public int PzPallet { get; set; } = 0; + + [StringLength(2500)] + public string Note { get; set; } = ""; + + [StringLength(50)] + public string CodCli { get; set; } = ""; + + public DateTime InsertDate { get; set; } = DateTime.Today; + } +} diff --git a/EgwProxy.SqlDb/DbModels/MesPODLReqModel.cs b/EgwProxy.SqlDb/DbModels/MesPODLReqModel.cs new file mode 100644 index 00000000..bf63f044 --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/MesPODLReqModel.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("MesPODL_req")] + public partial class MesPODLReqModel + { + [Key] + public int IdxRec { get; set; } = 0; + + public int IdxPromessa { get; set; } = 0; + + [StringLength(50)] + public string KeyRichiesta { get; set; } = ""; + [StringLength(50)] + public string KeyBCode { get; set; } = ""; + + public bool Attivabile { get; set; } = false; + + public int IdxODL { get; set; } = 0; + + [StringLength(50)] + public string CodArticolo { get; set; } = ""; + + [StringLength(50)] + public string CodGruppo { get; set; } = ""; + + [StringLength(50)] + public string IdxMacchina { get; set; } = ""; + + public int NumPezzi { get; set; } = 0; + + public decimal TCAssegnato { get; set; } = 0; + + public DateTime DueDate { get; set; } = DateTime.Today; + + public int Priorita { get; set; } = 0; + public int PzPallet { get; set; } = 0; + + [StringLength(2500)] + public string Note { get; set; } = ""; + + [StringLength(50)] + public string CodCli { get; set; } = ""; + + public DateTime InsertDate { get; set; } = DateTime.Today; + } +} diff --git a/EgwProxy.SqlDb/DbModels/SyncStateModel.cs b/EgwProxy.SqlDb/DbModels/SyncStateModel.cs new file mode 100644 index 00000000..ecf559a7 --- /dev/null +++ b/EgwProxy.SqlDb/DbModels/SyncStateModel.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb.DbModels +{ + // + // This is here so CodeMaid doesn't reorganize this document + // + [Table("SyncState")] + public partial class SyncStateModel + { + [Key, StringLength(250)] + public string TableName { get; set; } = ""; + + public long LastIdx { get; set; } = 0; + + public string Note { get; set; } = ""; + + public DateTime LastUpdate { get; set; } = DateTime.Today; + } +} diff --git a/EgwProxy.SqlDb/EgwProxy.SqlDb.csproj b/EgwProxy.SqlDb/EgwProxy.SqlDb.csproj new file mode 100644 index 00000000..38d1d018 --- /dev/null +++ b/EgwProxy.SqlDb/EgwProxy.SqlDb.csproj @@ -0,0 +1,162 @@ + + + + + + Debug + AnyCPU + {A5F9E2C8-B866-4470-923C-11BA35270963} + Library + Properties + EgwProxy.SqlDb + EgwProxy.SqlDb + v4.6.2 + 512 + true + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\Remote_DEBUG\ + DEBUG;TRACE + full + AnyCPU + 7.3 + prompt + + + + ..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll + + + ..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll + + + ..\packages\NLog.5.1.2\lib\net46\NLog.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + 202303131052295_InitialDb.cs + + + + 202303131054149_AddStoredProc.cs + + + + 202303141853160_FixSigLogTable.cs + + + + 202303150807341_AddMacProdData.cs + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + + 202303131052295_InitialDb.cs + + + 202303131054149_AddStoredProc.cs + + + 202303141853160_FixSigLogTable.cs + + + 202303150807341_AddMacProdData.cs + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + \ No newline at end of file diff --git a/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.Designer.cs b/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.Designer.cs new file mode 100644 index 00000000..fbbceea8 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.Designer.cs @@ -0,0 +1,29 @@ +// +namespace EgwProxy.SqlDb.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class InitialDb : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(InitialDb)); + + string IMigrationMetadata.Id + { + get { return "202303131052295_InitialDb"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.cs b/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.cs new file mode 100644 index 00000000..e655f311 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.cs @@ -0,0 +1,157 @@ +namespace EgwProxy.SqlDb.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class InitialDb : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.ActList", + c => new + { + IdxAct = c.Int(nullable: false, identity: true), + DtRif = c.DateTime(nullable: false), + Source = c.String(maxLength: 50), + Dest = c.String(maxLength: 50), + Action = c.String(maxLength: 250), + Value = c.String(maxLength: 500), + }) + .PrimaryKey(t => t.IdxAct); + + CreateTable( + "dbo.ActType", + c => new + { + Action = c.String(nullable: false, maxLength: 250), + Description = c.String(maxLength: 500), + }) + .PrimaryKey(t => t.Action); + + CreateTable( + "dbo.MachineEventList", + c => new + { + IdxEv = c.Int(nullable: false, identity: true), + InizioStato = c.DateTime(nullable: false), + IdxMacchina = c.String(maxLength: 50), + IdxTipo = c.Int(nullable: false), + CodArticolo = c.String(maxLength: 50), + Value = c.String(maxLength: 250), + MatrOpr = c.Int(nullable: false), + Pallet = c.String(maxLength: 20), + }) + .PrimaryKey(t => t.IdxEv); + + CreateTable( + "dbo.MachineFluxLog", + c => new + { + IdxFL = c.Int(nullable: false, identity: true), + DtEvento = c.DateTime(nullable: false), + IdxMacchina = c.String(maxLength: 50), + CodFlux = c.String(maxLength: 50), + Valore = c.String(maxLength: 250), + Cnt = c.Int(nullable: false), + }) + .PrimaryKey(t => t.IdxFL); + + CreateTable( + "dbo.MachinePODL", + c => new + { + IdxRec = c.Int(nullable: false, identity: true), + IdxPromessa = c.Int(nullable: false), + KeyRichiesta = c.String(maxLength: 50), + KeyBCode = c.String(maxLength: 50), + Attivabile = c.Boolean(nullable: false), + IdxODL = c.Int(nullable: false), + CodArticolo = c.String(maxLength: 50), + CodGruppo = c.String(maxLength: 50), + IdxMacchina = c.String(maxLength: 50), + NumPezzi = c.Int(nullable: false), + TCAssegnato = c.Decimal(nullable: false, precision: 18, scale: 2), + DueDate = c.DateTime(nullable: false), + Priorita = c.Int(nullable: false), + PzPallet = c.Int(nullable: false), + Note = c.String(maxLength: 2500), + CodCli = c.String(maxLength: 50), + InsertDate = c.DateTime(nullable: false), + }) + .PrimaryKey(t => t.IdxRec); + + CreateTable( + "dbo.MesPODL_last", + c => new + { + IdxRec = c.Int(nullable: false, identity: true), + IdxPromessa = c.Int(nullable: false), + KeyRichiesta = c.String(maxLength: 50), + KeyBCode = c.String(maxLength: 50), + Attivabile = c.Boolean(nullable: false), + IdxODL = c.Int(nullable: false), + CodArticolo = c.String(maxLength: 50), + CodGruppo = c.String(maxLength: 50), + IdxMacchina = c.String(maxLength: 50), + NumPezzi = c.Int(nullable: false), + TCAssegnato = c.Decimal(nullable: false, precision: 18, scale: 2), + DueDate = c.DateTime(nullable: false), + Priorita = c.Int(nullable: false), + PzPallet = c.Int(nullable: false), + Note = c.String(maxLength: 2500), + CodCli = c.String(maxLength: 50), + InsertDate = c.DateTime(nullable: false), + }) + .PrimaryKey(t => t.IdxRec); + + CreateTable( + "dbo.MesPODL_req", + c => new + { + IdxRec = c.Int(nullable: false, identity: true), + IdxPromessa = c.Int(nullable: false), + KeyRichiesta = c.String(maxLength: 50), + KeyBCode = c.String(maxLength: 50), + Attivabile = c.Boolean(nullable: false), + IdxODL = c.Int(nullable: false), + CodArticolo = c.String(maxLength: 50), + CodGruppo = c.String(maxLength: 50), + IdxMacchina = c.String(maxLength: 50), + NumPezzi = c.Int(nullable: false), + TCAssegnato = c.Decimal(nullable: false, precision: 18, scale: 2), + DueDate = c.DateTime(nullable: false), + Priorita = c.Int(nullable: false), + PzPallet = c.Int(nullable: false), + Note = c.String(maxLength: 2500), + CodCli = c.String(maxLength: 50), + InsertDate = c.DateTime(nullable: false), + }) + .PrimaryKey(t => t.IdxRec); + + CreateTable( + "dbo.SyncState", + c => new + { + TableName = c.String(nullable: false, maxLength: 250), + LastIdx = c.Long(nullable: false), + Note = c.String(), + LastUpdate = c.DateTime(nullable: false), + }) + .PrimaryKey(t => t.TableName); + + } + + public override void Down() + { + DropTable("dbo.SyncState"); + DropTable("dbo.MesPODL_req"); + DropTable("dbo.MesPODL_last"); + DropTable("dbo.MachinePODL"); + DropTable("dbo.MachineFluxLog"); + DropTable("dbo.MachineEventList"); + DropTable("dbo.ActType"); + DropTable("dbo.ActList"); + } + } +} diff --git a/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.resx b/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.resx new file mode 100644 index 00000000..d5bb4744 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303131052295_InitialDb.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO1d227kNhJ9X2D/QdDTBphYtmezyA66E3i67cBYXxpuO68LtkS3hUhUR6K8bf9aHvaT9he2qCtJUS1RF9sTCPPiLpGnqGJdKLJY878//jv7ee97xjMOIzcgc/Pk6Ng0MLEDxyXbuRnTx+9/NH/+6a9/mZ07/t74NW/3mbWDniSam0+U7r5YVmQ/YR9FR75rh0EUPNIjO/At5ATW6fHxP62TEwsDhAlYhjG7iwl1fZz8gJ+LgNh4R2PkXQcO9qKMDk/WCapxg3wc7ZCN5+b59j+rMNi/HK1/95Yb0zjzXASjWGPv0TQQIQFFFMb45SHCaxoGZLveAQF59y87DO0ekRfhbOxfyuZtX+P4lL2GVXbMoew4ooGvCXjyOZOLJXfvJF2zkBtI7hwkTF/YWyfSm5tnNr1yI5pI2DRkhl8WXsgaywI+Wm7SOTni+38yxFafCtUADWL/PhmL2KNxiOcExzRE0GMVbzzX/hd+uQ9+w2ROYs/jBwxDhmcCAUjAY4dD+nKHH7PXuHRMwxL7WXLHohvXJ325S0I/n5rGDTBHGw8X+sAJYk2DEP+CCQ4Rxc4KUYpDwjBwItEKd4nXkt65jzm7JUDcg6IrOB5GWQdxaOMcBhQZ7NE0rtH+CpMtfZqbP4ABXrh77OSEDPaBuGC90IeGcSOXJY7o2DxAbRJ9ruVyOgibX5EXH5aXPpeZVRpRk2mxX31Mq+j/jqaVT5WueQ02xZpGAuprh+6ugfmoM3+N7KfzZ/AMvVxrFWVysPW8iPvqBmsAC3q72UtnD7K3n1yCxvaDwOre3QVNcjoMsgics5ACVy8Ye7xNDnUYt32NaHi7C/tJZYU8Dx8KZKcje4ALL95fBdte9s9jTNZfy2tJE0f5TZk+WC2b3TewWBDt6Ca7IFTHXLUMaXW7vOplRQXAu5rQ/g7bXcwo7fdmgdTZAwU+rCPUz//Ci925YEnwNTG6LQGvr2BPo38anVHqPqON6xWcvgaBhxHp4mhAKb+ZuA+sfgnj3W50Rm/ogG9if4VfX91+k3C/OIsivCX8whPbro/AW61C+CvbQ/vRNNY2YrD6PJYxZhGtd3RbhW4QurSnYa9exaVVN5SbgDZEpYH0duG5oystieBXhylqHwZxxILYFerzPSlhTMFwCoZTMJyC4RQMp2D4LQbDO/x731iYQ0yhcAqFUyicQuEUCqdQ+E2FwvULsdmhV/dTZhHhHQPhPZMG+1M/FnJd3/q0mX1Ng2/idP4ffx9a5+HPAZSRjfRh5wytjIuAUOTCqkLWyOWGPcJ7qtDKhwhnihllgxeHnkKvMc0d3Qb+ThMKItMoh5NmeB2JSUxWOyzWg2Go8bjMjTZ46Vk9g1TAqdIB2oJmB4A1qOIRY1vMVbLCUAJyRy2t0GAZHTgeUy0VYGXTSgMTlub1kOXSvw1ioZIKQNmBqhS/UPEyA9FKUxAzwsyqyVWcXaPdDsyZy13MKMY6TVxcfL/Wz+rzUwzLjhTJfcVoC06w8EdbLD1NYiC+cMOIBSi0QczsF45faaYw6BqZ5wwVNiu7/3Ie8k7s77SjFKkE45ZwSnlewCv6YGLJ2+JiSFKCY6W7wZJJkYdCxeH1IvBinxTLTwCS1e0QQpbxx4NkpPYYeb4fD5LTNEaS5PMJA0ko7RHyVC4eQ50Wdgglyx3hQTJSFWNmSfMqK5BV0SBpzSBrpZbOFrGhn96WQaST3h7oPu5MCSl0kuKUDz7WrHERuMekKUK1/tS1AdFwPOfPOnMnJMIJSPwDDTz+w1saWflACy/NeJOwUmJ7HGGTg8cSHozjneowirw1HqUgtsfJv6N5mJz28awuX6L2NDthLdvN6A5DaJjcxZVeqM+zz8Ron1Pfz9iKHDPJQFKilnEkSWSSdSQ0jdEQSacTwsdT6OT7qKc2lx9S3VT5QP8DypOcCEh6ozhdaEAp9/klqPJBezxxu58HFJ9oIWab+hJaRtVY13Lb9sKKiaNrSS75sJaEltDeL65xO/QSWk5+P/dU7rTzYCW1PZKw286DCQ80XHq+sy549JyoEcmLnXUhlhdUDaRX5argtX5dUCv1QH6xlKKlU8nuuaRQCU1npVrujosL1ZL+wYIDt93VJz7I+2IdQkQjxBQlpigxRYkpSkxR4p2iBDvA6B8kipOOzjGiHmEKEVOImELEFCKmEPHWIaI8ke4RIaSja/0A0QRQayNluo1gIXUJPIewivwZHqkgvqUu8vkx8mBy+htrUSUBQW5ScM8oxe8iASE7/G+uoFTJBkibsGTF4Nl10kyAiGL/iDVgKghWitkGbt7gGhH3EWJwmgZmnh6fnEqFmD5OUSQrihxPkTzBpdbVJw60TuxWpAy0SuxO+qVJKi6TcGPqtm7eKF+NiGk27V+NiDyj0H5CYSWLskTVLT40EKRYiEYJeqqPKlTCqBlpA2i3SkIdVHGYEj5tJNe1Qs/IAmw6kW9t0dWz+FYGzbqNaM+K4jedrVqRaD+QHUq1bhJJ9L/ZMNDgms25g4+Q6th0eWMxpV49sCGtpP4IvbWNVA/PW9nIxdXIMU8sEfMBDUSqCDOcZnMFYIZSba7eS7Nad6z20k39BrhNN46Trl6g6+IQVNfnBtIU+bbcUOuvyuW4jav/3uLFuI8VPCq34IaLmCO5GvmOWxd5Km64OSPfcOvstOUbbp1CsXS/rQsGf9OnzhV3UT/uMttQule5u9ZS+N1rmkz+XgEz+fvJ30/+fvL3fxp/rz6Pntz95O4ndz+5+8nd/1nc/aHT5bevCDHY4YVU8GHjbodSlL/5aP+d7jxWqzoMMo9yVYfqXXFxVPK9e7EiQ0PBhvSkGUa+YZ4mHXHWovL6Ckbl0VhTJYcaRslN3yZGqiIOrSo9qJiydiDdomkr7mKxhxb1IA5wLspKtODL1YRoqhlxgONKkb5WZVepGNGiqISSadrq3x5qI1y5qERz2YlDPENWuaKBpVx2orEuhYohV9dCZdktylZUs0NmFv+/cM2WOHK3JQT7P7kITk6FS9C8zSV5DHLvBG/KjyhvIp+PYYrAXSG2bntENoXHNiygk/o3yYHc3Dz3N9i5JLcx3cWULUj8jSfUqptZh/kntTnEMc9uk7PnaIhXgGG6zOPekq+x6znFuC8UHrcGgvnW7EMERrWm7INk+1Ig3QSkJVAmviXeYcI+Y+6xv/MALLola/SMu4ztIcJXeIvslzzJpx6keSJEsc+WLtqGyI8yjLI//AQddvz9T/8HEgs/ooxuAAA= + + + dbo + + \ No newline at end of file diff --git a/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.Designer.cs b/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.Designer.cs new file mode 100644 index 00000000..523b66d9 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.Designer.cs @@ -0,0 +1,29 @@ +// +namespace EgwProxy.SqlDb.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class AddStoredProc : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddStoredProc)); + + string IMigrationMetadata.Id + { + get { return "202303131054149_AddStoredProc"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.cs b/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.cs new file mode 100644 index 00000000..3f7f4794 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.cs @@ -0,0 +1,49 @@ +namespace EgwProxy.SqlDb.Migrations +{ + using System; + using System.Data.Entity.Migrations; + using System.IO; + + public partial class AddStoredProc : DbMigration + { + public override void Up() + { + AlterColumn("dbo.ActList", "Value", c => c.String(maxLength: 2500)); + + // aggiunta stored + addStoredProc("stp_SyncPodlToMachine"); + addStoredProc("stp_GetMachineEvList"); + addStoredProc("stp_GetMachineFluxLog"); + addStoredProc("stp_GetMachineProdData"); + addStoredProc("stp_GetMachineSigLog"); + addStoredProc("stp_BackupDb"); + addStoredProc("stp_ExportAll"); + addStoredProc("stp_ImportAll"); + addStoredProc("stp_ResetPodlMes"); + } + + public override void Down() + { + AlterColumn("dbo.ActList", "Value", c => c.String(maxLength: 500)); + + // drop delle stored + DropStoredProcedure("dbo.stp_SyncPodlToMachine"); + DropStoredProcedure("dbo.stp_GetMachineEvList"); + DropStoredProcedure("dbo.stp_GetMachineFluxLog"); + DropStoredProcedure("dbo.stp_GetMachineProdData"); + DropStoredProcedure("dbo.stp_GetMachineSigLog"); + DropStoredProcedure("dbo.stp_BackupDb"); + DropStoredProcedure("dbo.stp_ExportAll"); + DropStoredProcedure("dbo.stp_ImportAll"); + DropStoredProcedure("dbo.stp_ResetPodlMes"); + } + + + private void addStoredProc(string storedName) + { + string path = Path.Combine("StoredProc", $"{storedName}.sql"); + string storedBody = File.ReadAllText(path); + CreateStoredProcedure($"dbo.{storedName}", storedBody); + } + } +} diff --git a/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.resx b/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.resx new file mode 100644 index 00000000..317805c9 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303131054149_AddStoredProc.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO1d3W7jNha+X2DfQdDVFphGSWZbdAf2FBk7KYLNjxEnc7ugJdoRKlGuRGWdvFov+kh9hR7ql6QoS5TkJFMIcxMfkd+hDs8PRR6e+fP3PyY/73zPeMJh5AZkap4cHZsGJnbguGQzNWO6/v4n8+fP//zH5Nzxd8bXvN1H1g56kmhqPlK6/WRZkf2IfRQd+a4dBlGwpkd24FvICazT4+P/WCcnFgYIE7AMY3IXE+r6OPkBP2cBsfGWxsi7DhzsRRkdniwTVOMG+TjaIhtPzfPN/xdhsHs+Wv7mzVemcea5CEaxxN7aNBAhAUUUxvjpIcJLGgZks9wCAXn3z1sM7dbIi3A29k9l87avcXzKXsMqO+ZQdhzRwNcEPPmYycWSu3eSrlnIDSR3DhKmz+ytE+lNzTObXrkRTSRsGjLDTzMvZI1lAR/NV+mcHPH9Pxhiqw+FaoAGsX8fjFns0TjEU4JjGiLosYhXnmv/Fz/fB79iMiWx5/EDhiHDM4EAJOCxxSF9vsPr7DUuHdOwxH6W3LHoxvVJX+6S0I+npnEDzNHKw4U+cIJY0iDEv2CCQ0Sxs0CU4pAwDJxItMJd4jWnd+46ZzcHiHtQdAXH/SjLIA5tnMOAIoM9msY12l1hsqGPU/MHMMALd4ednJDBPhAXrBf60DBu5DLHET00D1CbRJ9ruZwOwuYr8uJ98gIu+mwmVmlFTbbFfvWxraL/G9pWPle69jXYHGtaCeivHbrbBuYHnflrZD+eP4Fr6OVbqyijh63nRdwXN1gCWNDbz146O5C9/egSdGhHCKzu3W3QJKf9ILPAOQspcPWCQ4+3hUcdgMs1ouHtNuwnlQXyPLwvkp0e2ANcePHuKtj0sn8eY7T+Wl5zmjjKb8r0wWrZ7L6CxYJoD26yM0J1zFXLkBa386teVlQAvKkJ7e6w3cWM0n6vFkidHVDgyzpC/fwvvNidC5YEnxMHtyXg9QXs6eDfRmeUuk9o5XoFpy9B4GFEujgaUMpvJu4Dq1/CeLs9OKNXdMA3sb/ALy9uv0m4n51FEd4QfuGJbddH4K0WIfyVbaL9ZBpLGzFYfR7zGLOI1ju6LUI3CF3a07AXL+LSqhvKTUAbotJAejvz3IMrLYngV4cpah8GccSC2BXq8z0pYYzBcAyGYzAcg+EYDMdg+C0Gwzv8W99YmEOMoXAMhWMoHEPhGArHUPhNhcLlM7HZoVf3U2YR4Q0D4T2TBvtTPxZyXV/7tJl9TYNv4nT+x38PrfPw5wDKyEb6sHWGVsZZQChyYVUha+R8xR7hHVVo5UOEM8WMssGLQ0+hl5jmjm4Ff6cJBZFplMNJU7yOxCwmqx0W68Ew1Hhc5kYbvPSsnkEq4FTpAG1BswPAGlTxiLEt5iJZYSgBuaOWVmiwjA4cj6mWCrCyaaWBCUvzeshy6d8GsVBJBaDsQFWKX6h4mYJopTmIGWFi1SQrTq7RdgvmzCUvZhRjmWYuzr5f6qf1+SmGZUeK7L5itAUnWPijDZaeJjEQX7hhxAIUWiFm9jPHrzRTGHSNzHOGCpuV3X85D3kn9nfaUYpUgnFLOKU8L+AVfTCx5G1xMSQpw7HS3WDZpMhDoeLwehZ4sU+K5ScAyeq2DyFL+eNBMlJ7jDzhjwfJaRojSRL6hIEklPYIeSoXj6FOC9uHkuWO8CAZqYoxsaR5lRXIqmiQtGaQtVJLZ4vY0E9vyyDSSW/3dD/sTAkpdJLilA/e16xxEbjHpClCtf7UtQHRcDznTzpzJyTCCUj8Aw08/sNbGln5QAsvzXiTsFJiexxhk4PHEh4cxjvVYRR5azxKQWyPk39H8zA57f1ZXb5E7Wl2wlq2m9Hth9AwuYsrvVCfZ5+J0T6nvp2xFTlmkoGkRC3jSJLIJOtIaBqjIZJOJ4T3p9DJ91FPbS4/pLqp8p7+e5QnORGQ9EZxutCAUu7zS1Dlg/Z44nY/Dyg+0ULMNvUltIyqsa7ltu2FFRNH15Jc8mEtCS2hvV1c43boJbSc/Hbuqdxp58FKanskYbedBxMeaLj0fGdd8Og5USOSFzvrQiwvqBpIL8pVwUv9uqBW6oH8YilFS6eS3XNJoRKazkq13B0XF6ol/Z0FB267q098kPfFOoSIRogxSoxRYowSY5QYo8QbRQl2gNE/SBQnHZ1jRD3CGCLGEDGGiDFEjCHitUNEeSLdI0JIR9f6AaIJoNZGynQbwULqEnj2YRX5MzxSQXxNXeTzY+TB5PRX1qJKAoLcpOCeUYrfRQJCdvjfXEKpkg2QNmHJisGT66SZABHF/hFrwFQQrBSzDdy8wTUi7hpicJoGZp4en5xKlZjeT1UkK4ocT5E8waXW1ScOtE7sVqQMtErsTvqlSSouk3Bj6rZu3ihfjohpNu1fjog8odB+RGEli7JE1a0+NBCkWIhGCXqqjypUwqgDbUDtVkqogy4OU8Onjei6luipmeuhBNh0JN/apKuH8a0smnU7oEErqt90NmtFpv1AhigVu0kk0f9qw0CDa2XPuqBSIZsubyzm1KsHNqSV1J+ht7aR6ul5Kxu5uDpw0BNrxLxDA5FKwgyn2VwFmKFUmyv40qzWHcu9dFO/Aa7THcZJV2/QdXEIqvtzA2mKfF1uqAVY5XbcytV/b/Fm3PsKHpVrcMNFzAO5GvmSWxd5Kq64OQe+4tbZactX3DqFYumCWxcM/qpPx68Gpfpxt9mG0r3K5bWWwu9e1GT09wqY0d+P/n7096O//9v4e/WB9OjuR3c/uvvR3Y/u/u/i7vcdL79+SYjBDi+kig8rdzOUovzLR7vvdOexWtZhkHmUyzpUL4uLo5Iv3oslGRoqNqRHzTDyFfM06YizFpXXVzAqj8aaSjnUMEqu+jYxUlVxaFXqQcWUtQPpFk1bcRerPbQoCLGHc1FXogVfrihEU9GIPRwXivy1KrtKyYgWVSWUTNNW//NQG+HKVSWa607s4xmy0hUNLOW6E42FKVQMucIWKstuUbeimh4ysfj/h2syx5G7KSHY/8pFcHIqXILmbS7JOsi9E7wpP6K8iXw+hikCd4XYum2NbAqPbVhAJwVwkgO5qXnur7BzSW5juo0pW5D4K08oVjex9vNPinOIY57cJmfP0RCvAMN0mce9JV9i13OKcV8oPG4NBPOt2YcIjGpJ2QfJ5rlAuglIS6BMfHO8xYR9xtxjf+sBWHRLlugJdxnbQ4Sv8AbZz3mWTz1I80SIYp/MXbQJkR9lGGV/+Ak67Pi7z38B+y8WII5uAAA= + + + dbo + + \ No newline at end of file diff --git a/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.Designer.cs b/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.Designer.cs new file mode 100644 index 00000000..17ca8c81 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.Designer.cs @@ -0,0 +1,29 @@ +// +namespace EgwProxy.SqlDb.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class FixSigLogTable : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(FixSigLogTable)); + + string IMigrationMetadata.Id + { + get { return "202303141853160_FixSigLogTable"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.cs b/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.cs new file mode 100644 index 00000000..18421d8e --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.cs @@ -0,0 +1,45 @@ +namespace EgwProxy.SqlDb.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class FixSigLogTable : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.MachineSignalLog", + c => new + { + IdxEv = c.Int(nullable: false, identity: true), + DtEve = c.DateTime(nullable: false), + IdxMacchina = c.String(maxLength: 50), + ValInt = c.Int(nullable: false), + Valore = c.String(), + }) + .PrimaryKey(t => t.IdxEv); + + DropTable("dbo.MachineEventList"); + } + + public override void Down() + { + CreateTable( + "dbo.MachineEventList", + c => new + { + IdxEv = c.Int(nullable: false, identity: true), + InizioStato = c.DateTime(nullable: false), + IdxMacchina = c.String(maxLength: 50), + IdxTipo = c.Int(nullable: false), + CodArticolo = c.String(maxLength: 50), + Value = c.String(maxLength: 250), + MatrOpr = c.Int(nullable: false), + Pallet = c.String(maxLength: 20), + }) + .PrimaryKey(t => t.IdxEv); + + DropTable("dbo.MachineSignalLog"); + } + } +} diff --git a/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.resx b/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.resx new file mode 100644 index 00000000..0dcaca9d --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303141853160_FixSigLogTable.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO1d3W7jNha+L7DvIOhqF5hGSaZbdAd2i4ydFEHzY8RJbxe0RDvCSpQrUakzr7YXfaS+Qg/1S1G0JEqykymIuXEo8jsU+Z1zKPLwzJ///2Py0873jBccRm5ApubZyalpYGIHjks2UzOm629/MH/68R/fTC4df2f8mtf7yOpBSxJNzWdKt58sK7KfsY+iE9+1wyAK1vTEDnwLOYF1fnr6H+vszMIAYQKWYUweYkJdHyd/wJ+zgNh4S2Pk3QYO9qKsHJ4sE1TjDvk42iIbT83Lze+LMNi9nix/8+Yr07jwXAS9WGJvbRqIkIAiCn389BThJQ0DslluoQB5j69bDPXWyItw1vdPZfWur3F6zl7DKhvmUHYc0cBXBDz7mI2LJTbvNbpmMW4wcpcwwvSVvXUyelPzwqY3bkSTETYNUeCnmReyyuIAn8xX6Zyc8O0/GNVaHwpqAIPYvw/GLPZoHOIpwTENEbRYxCvPtX/Br4/B/zCZktjz+A5Dl+FZpQCKQMYWh/T1Aa+z17h2TMOqtrPEhkUzrk36cteEfjw3jTsQjlYeLvjADcSSBiH+GRMcIoqdBaIUh4Rh4GREa9IFWXP64K5zcXOAeASiSyQ2oyyDOLRxDgNEBn00jVu0u8FkQ5+n5r9BAa/cHXbyggz2ibigvdCGhnGrlDmO6KFlAG0SPu+Vcj6KmF+RFzeNF0hRFzOxSi1q0y321xDdKtq/oW7lc6WqX6PNsaKWAH/t0N22CD/ozN8i+3npbm6CTe/JFyC0bd0/3/TyBQ+2rdfODobcfnYJOrTxA6sEo9I2QK0YMGgNPYWfh+X3lRfvhhKcx9AMb2Y4ocHXRPJZ4LDZPYIuNevBOAuJmZq+KinS4n5+M0iLCoA3VaHdA7b7qFHa7liqBPKgBL4bIzTMAMOLPbigSbBYPrgugazPoE8HX/lfUOq+oJXrFZI+B4GHEeljaICUw0YY3vgipNB9LziCsfo5jLfbgws6ogG+i/0F/vLFHTYJj7OLKMIbgjjvg23XR2CtFiH8yraIfjCNpY0YrLqMeYyZRxvs3RahG4QuHajYiy8L5Hl44PrsLqAtXmkk3s489+CkJRH81WOKurtBHDEndoMG7ESJGNoZameonaF2htoZamf4NTrDB/zbUF+YQ2hXqF2hdoXaFWpXqF3hV+UKl6/EXoKB73+GWkV4Q0f4yEaD/VT3hVzTY5+lsq9psE0c57//bmzO9zmpkvf0aeuMTcZZQChyYVUhMnK+Yo/wjkpY+RThjJhR1vlq11PoJaa5oVvB7/S4PDKNsjtpANNJNUbH6obFWjAMOR4Xl9AFj50yXL4wSAlc7bC7K2J2+rcHsnq+2BVzkSwvpIDcOUsnNFhDB47HeCUDrO1YKWDCunw/ZLnu74JY8FECKFpPGesLfpfRdVYaXpeH4Vl74vAmt2i7BV3m4vKyEmOZBuXNvl2qR6z5KYZlR5LAtaK3hSRY9aMNFp4mDhBfuWHEvBNaIabzM8evVZNo854xzwVKFFa0/eU85I3Y77Sh4KYqmi3glON5Ba/ow2dM8ra46JIQvFdrbrBASeShUHJyPQu82CfF2hOARLo1IWTRbDxIVtQdI49l40HyMoWeJLFqlY4kJd0R8iglHkMe8dSEkgWa8SBZUR1jYgnzKhLIqjFIWDCIrFTibOEYhvG29CC9eNvQ/LAzVYkOE4hTPnhfs8a53wGTJvpp9XlrRVAwOZcvahYnifGqWpykqDtG5Rtb6E35QEnnkzAuQemTMiWUJIBFQEnK3h8L8yXbQBpW1nb9eNgMoUDEqxtlIiahWDUuJqVvR8ci4IrHKgoPRci9vRE1YyZXi7cmdPK9MJDN5YdFPyo3tG8gT7I9LvBGstXeglJuegtQ5YPueNW9bx6w+kQJMdvhFtCyUoV1HreHXVlBcOVKI5d8aAqDlpQpqWy5ky2obflACS/frhbQ8uK3M0/ltjMPVpZ2R6psPfNglQcKJj3fZq5Y9LywO065zcwDlaUKSMVWcwWpKFUY9UB8sbREiVPJVrJAqKRMgU3cVnGFTFz5O3MO3PbPEP8g7hP1cBGtENpLaC+hvYT2EtpLvJGXYBv6w51EsfPf20fsR9AuQrsI7SK0i9Au4tguojyhHeAhhKNcdQfRBrBXR8rYk4qG7ItmacIqgkl4pKLwmFzkg0XEzuTlR2ZR7UBerFJILw7mhQP4SXYY3p4tp3Y6nlZhkXvBi+ukJ+MRxf4Jq8AoCFqK2QZuXuEWEXcNPjiNiTLPT8/OhaQ77ycBjhVFjicJJuDizPYfpHeOcpYcoXeKck7apUEbLhvh1jhm1SBKPvMMYzYdnnmGvKDQfkZhLaSwRFVNNDMSZDXniBT0XB21kkZmH2gLar+sMT24OE66li5D1zcby565HmsAG0+pO+tz/Xy6kzqzZgfVZi7XSW9tlkSbj6R/1dQmyRAMSmySd+ufPtr9a0R+7D897kyQ+rlxJ4Jc3RyeIFyqkHfIESEzyHjMk/BmqOWfqZC5Z9aPfvQb4VbVQQgouUjVxwzIrlGNxBTx1tRYS4/aJamVq/7e1QtSfUZOcj1qPMWt3oYaCfdwpka869RnPCU3nZwD33TqbbTFm0593le859QHg7/x0XO9LKUfd6lpLO7V7jB1HPz+uS20vZfAaHuv7b2299re/23svfwoVpt7be61udfmXpv7v4u5bzpYPX5mgNG27YWL/yt3MxZROmzlyrtTvd0/yjyKt/vr14arvRKvYFdv5rdc3E8PWaHnK2Zp0h5nNWqvLxHEXdlvudG/R1By6bNNUO0yf/t1f5k4VgnGFeoR5CV3/DvIrd7475AUoEFykVugg1wuMUBb4oAGiQtJzFZdXC1tQIfMAlKhaa3/eqgDe2qZBdpzDzTJDFn6ghaRYu6B1uQEMoFccgOZTnfIXVAPiZhY/H8zNJnjCDhaQLD/dIjg5CS0BM3rXJN1kNsleFO+R3kVwWzdYorAUCG2Ylsjm8JjG5bOSQaU5FB5al76K+xck/uYbmPKliL+yqtkK5tYzfKTBA3VPk/uk/PWaIxXgG66zNbek8+x6zlFv68ktnYPBLOq2ScI9GpJ2afI5rVAugtIR6Bs+OZ4iwn7gHnE/tYDsOieLBE7F1Xv21OEb/AG2a95ZMt+kPaJqA77ZO6iTYj8KMMo28OfwGHH3/34FyLuJIxtawAA + + + dbo + + \ No newline at end of file diff --git a/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.Designer.cs b/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.Designer.cs new file mode 100644 index 00000000..8b43da20 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.Designer.cs @@ -0,0 +1,29 @@ +// +namespace EgwProxy.SqlDb.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class AddMacProdData : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(AddMacProdData)); + + string IMigrationMetadata.Id + { + get { return "202303150807341_AddMacProdData"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.cs b/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.cs new file mode 100644 index 00000000..6d269482 --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.cs @@ -0,0 +1,32 @@ +namespace EgwProxy.SqlDb.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class AddMacProdData : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.MachineProdData", + c => new + { + IdxPD = c.Int(nullable: false, identity: true), + DtEve = c.DateTime(nullable: false), + IdxMacchina = c.String(maxLength: 50), + Action = c.String(), + CodComm = c.String(), + PzCount = c.Int(nullable: false), + IdxPodl = c.Int(nullable: false), + IdxOdl = c.Int(nullable: false), + }) + .PrimaryKey(t => t.IdxPD); + + } + + public override void Down() + { + DropTable("dbo.MachineProdData"); + } + } +} diff --git a/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.resx b/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.resx new file mode 100644 index 00000000..364cabea --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/202303150807341_AddMacProdData.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO1dW2/juBV+L9D/YOipBWajJNMutgN7Fxk7WQTNxYiTfS1oiXaE6uKVqKwzf60P/Un7F3pI3UiKulCSnWQrzEtMid+hyO9cRB2e+f0//53+tPfcyQsOIyfwZ8bZyakxwb4V2I6/nRkx2Xz3g/HTj3/+0/TS9vaTX7L7PtP7oKcfzYxnQnZfTDOynrGHohPPscIgCjbkxAo8E9mBeX56+g/z7MzEAGEA1mQyfYh94niY/YCf88C38I7EyL0NbOxGaTtcWTHUyR3ycLRDFp4Zl9vflmGwfz1Z/eou1sbkwnUQjGKF3Y0xQb4fEERgjF+eIrwiYeBvVztoQO7j6w7DfRvkRjgd+5fi9raPcXpOH8MsOmZQVhyRwNMEPPuczospd+80u0Y+bzBzlzDD5JU+NZu9mXFhkRsnImyGjYks8MvcDenN8gSfLNbJmpzw/T9NxLs+5dQABtF/nybz2CVxiGc+jkmIoMcyXruO9U/8+hj8G/szP3ZdfsAwZLgmNEATyNjhkLw+4E36GNe2MTHFfqbcMe/G9Uke7tonn8+NyR0IR2sX53zgJmJFghD/jH0cIoLtJSIEhz7FwGxGS9IlWQvy4GwycQuAeASiKyTWo6yCOLRwBgNEBn00Jrdof4P9LXmeGX8HBbxy9tjOGlLYJ98B7YU+JIwbpSxwRA4tA2jD+Fwp5XwQMb8gN66bL5CiL2ZqFlrUpFv0Vx/dyvu/oW5la6WrX4OtsaaWAH+t0Nk1CD/oyt8i63nlbG+CbefFlyBG21q93uTyBfe2rdf2HqbcenZ8dGjjB1YJZqVpghoxYNJqRgp/HpbfV26870twHmNkeD3DfRJ8JJLPA5uu7hF0qV4Phgkk5nr6qqVIy/vFTS8tygHeVIX2D9jqokZJv2OpEsiDFnhvjFA/AwwP9uCAJkGwfHBdAllfQZ8OHvlfEOK8oLXj5pK+BoGLkd/F0AAp+80wPPFFSGD4bnAEY/VzGO92Bxd0RAN8F3tL/O2b028RHucXUYS3PuK8D7YcD4G1WobwV7pF9IMxWVmIwurLWMSYerTe3m0ZOkHokJ6Kvfy2RK6Le8ZndwFp8EoD8XbuOgcnrR/Brw5LpOcGw8AGXNTPFfIgY0RZrXIf7Z2pcTOhy/uOWqECzzu4nOW3eRD3fQeksUxgu71B7vUw2ms1jmhoeoN67C/LGGOIO4a4Y4g7hrhjiDuGuB8rxE0c2QP+ta8vzCBGVzi6wtEVjq5wdIWjK/xQrnD16lsrMPDdMyNEhDd0hI90Nuif+r6Q63rsDAn6Ng22ieP8938bmvPD7JPQkT7t7KHJOA98ghyIKmRGLtb0Et4TBSufIpwSM0oHLw49gV5hkhm6Nfyd7FtFxqQYTpKWeCJm3pntsGgPiqHG47KN2uDRDdPLFwqpgCulsLRFTL/pV0CKWQNtMZcsvFACcl9PW6Olm8RViOJGdCtUiMwD26VsVYGW9sE0MCHar4Ys3ibaIOYsVwDKNlmlS7nW5NemZpKKmzZMzYqc3ekt2u3AQnA5vGnLZJUk8M6/W+lnt3oJhmlFiiTXfLS5JHiXQFssXWVuFV85YUR9Hlojaknmtle6TWEjKuY8E6gwA7JHKdYh60T/TjpKzk+wFxJOMZ9X8IgevByxp8X5kKRE31L3CU2qRi4KFd8k5oEbe34e0QKQTLc6hDTzlQdJm9pjZHmvPEjWpjESltcqDIS1tEfIPkLwGOrsyDqUNCmVB0mbyhhTU1pXmUBmiUFSGCKzUouzubvpx9vCL3XibU33w66UkEkqEae48L5WjXPqPRZN9v7669aIoGFyLl/0LA77tilaHNbUHkN4c5dGU1zQ0nmW8ikpPWvTQmHJbhIKa3t/LMwCwZ40FCLGbjysh9Ag4tWNNhFZ2maJi6z17eiYJ2fyWHnjoQhZORpZM+ZqtXhrQrO3kJ5sLl5XulG5pn8Nedimu8QbxQZ+A0qxlS5BFRfa44k76jygeEULMd03l9DSVo04j9sZFyIIrl1r5tjrqzRprE1LZYv9cUltiwtaeNkmuISWNb+deSo2s3mworU9krChzYMJFzRMerZ5LVj0rLE9TrF5zQMVrRpI+Qa2gJS3asx6ID9Y0qLFKbZBLRGKtWmwiduAFsjEtb9D55BtKvV1EMLuU0cnUY+hEfAsFx898h7mTTDPC5SpzRp1tDXN+xOVNW3U88Ys9U9eL9ao55sUMPdqlDfVMW6LtY+KyXuxHTSsEWKMxMZIbIzExkhsjMTeyEvQj2b9nUT+da2zj6hGGF3E6CJGFzG6iNFFHNtFFFkQPTyElC6h7yCaACp1pMgaEzSkKg+tDitPA+OR8sZjcpFP85IHk7UfmUWlpBf5llx62pL/zpNe0oST5up1pQyU5Baacxu8OHaSfRIR7J3QGygFQUsx3THIbrhFvrMBH5xkMxrnp2fnUhG891OQzowi21Uk7HAZotXJKq3PJyjSVFqdT2D9ksQoh85w4wkE3fRnvhIcZTbpXwnOf0Gh9YzCUjJwgapb+G0gSPHYrhL0XB9VKOtWBdqA2q2KWwcuDlM+rc3Uda2OVrHWQ01gbSZIa30u54C0Umfa7aDazJ2j76zNinMiA+mfWGqMTUGvQmPZsP7iof1fB+RHdYZGa4KUczNaEeTq5vAE4Up3vUOOSJW6hmOegjd9Lf9ch8wdq3B1o98A5yEPQkDFEcguZkB1AHIgpsjnHYcKPUrHG9eO/nOLRxu7zJziYONwiiueYxwI93CmRj6l2GU+FWcU7QOfUexstOUzil2eVz6h2AWDP6vVMV5W0o87jjgU90qnD1tOfo9aU90Mfjk1opW9p93+jwNS9VtNi3BSzT+uVlMvLKkeUxcdk6oxdYS410HoXolpjHEUMGOMM8Y4Y4wzxjh/gBinLv1gNPejuR/N/WjuR3P/RzH3dckEx69jM9inKqlMzdrZDkWUTu+I5Vo0g6yjXIumXI5CHJVc2kOsI9NQZiZJLICRr6mlSUac3lF6fIWg4kNoU/2ZCkH0jkZBpdIzzcVpVOLoTTCvcJ+PXFaRpoVcsT5NixI2NZLzSjgt5HJlbJrK3NRIXCryFNXixBo3berg1InNC+o0iS5VwmlRLEcpOLnrXy5qQdxSsZzmcjp1MkNakadBpFxOp7HejkogV69HZU5alOMpZyBNTf5/2ZwucATqkUPQ/3PTx2yLrgDN7rn2N0FmEuFJ+RFlt0gW8xYTBDYS0WBxgywCly2I2lmpMJbDMTMuvTW2r/37mOxiQqMgb+0KZT2nZr18VnNIHPP0nqU3REM8AgzToWb+3v8aO66dj/tKYeYrIKhBT99+YFQrQt+Ctq850l3gtwRKp2+Bd9in706P2Nu5ABbd+ytEd331x/YU4Ru8RdZrlkhWDdK8EOK0TxcO2obIi1KMoj/8BA7b3v7H/wEMa4xTbHYAAA== + + + dbo + + \ No newline at end of file diff --git a/EgwProxy.SqlDb/Migrations/ConfigurationInit.cs b/EgwProxy.SqlDb/Migrations/ConfigurationInit.cs new file mode 100644 index 00000000..36b93ced --- /dev/null +++ b/EgwProxy.SqlDb/Migrations/ConfigurationInit.cs @@ -0,0 +1,40 @@ +namespace EgwProxy.SqlDb.Migrations +{ + using EgwProxy.SqlDb.DbModels; + using System; + using System.Data.Entity; + using System.Data.Entity.Migrations; + using System.Linq; + + //public class ConfigurationInit : DropCreateDatabaseAlways + public class ConfigurationInit : DbMigrationsConfiguration + { + public ConfigurationInit() + { + AutomaticMigrationsEnabled = false; + } + + protected override void Seed(SyncStateDbContext context) + { + // aggiunta preliminare tipo attività sync ammessi + context.DbSetActListType.AddOrUpdate( + new ActTypeModel() { Action = "SetPodlData", Description = "Sincronizzazione dati PODL | MES --> MACH" }, + new ActTypeModel() { Action = "GetPodlData", Description = "Lettura stato macchina x avvio prod ODL da PODL e sync relativa | MACH --> MES" }, + new ActTypeModel() { Action = "GetEvList", Description = "Lettura info da impianto e decodifica come EvList | MACH --> MES" }, + new ActTypeModel() { Action = "GetFluxLog", Description = "Lettura info da impianto e decodifica come FluxLog | MACH --> MES" }, + new ActTypeModel() { Action = "GetSigLog", Description = "Lettura info da impianto e decodifica come SignalLog | MACH --> MES" }, + new ActTypeModel() { Action = "StartProd", Description = "Dichiarazione inizio lavorazione (commessa) | MACH --> MES" }, + new ActTypeModel() { Action = "EndProd", Description = "Dichiarazione fine lavorazione (commessa) | MACH --> MES" } + ); + + context.DbSetSyncState.AddOrUpdate( + new SyncStateModel() { TableName = "ActList", LastIdx = 0, Note = "NO EXEC", LastUpdate = DateTime.Today }, + new SyncStateModel() { TableName = "PODL_req", LastIdx = 0, Note = "NO EXEC", LastUpdate = DateTime.Today }, + new SyncStateModel() { TableName = "EvList", LastIdx = 0, Note = "NO EXEC", LastUpdate = DateTime.Today }, + new SyncStateModel() { TableName = "FluxLog", LastIdx = 0, Note = "NO EXEC", LastUpdate = DateTime.Today } + ); + + base.Seed(context); + } + } +} diff --git a/EgwProxy.SqlDb/MyDbInitializer.cs b/EgwProxy.SqlDb/MyDbInitializer.cs new file mode 100644 index 00000000..41037f32 --- /dev/null +++ b/EgwProxy.SqlDb/MyDbInitializer.cs @@ -0,0 +1,35 @@ +using EgwProxy.SqlDb.DbModels; +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Data.Entity.Migrations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb +{ + public class MyDbInitializer : IDatabaseInitializer + { + public void InitializeDatabase(SyncStateDbContext context) + { + // aggiunta preliminare tipo attività sync ammessi + context.DbSetActListType.AddOrUpdate( + new ActTypeModel() { Action = "SetPodlData", Description = "Sincronizzazione dati PODL | MES --> MACH" }, + new ActTypeModel() { Action = "GetPodlData", Description = "Lettura stato macchina x avvio prod ODL da PODL e sync relativa | MACH --> MES" }, + new ActTypeModel() { Action = "GetEvList", Description = "Lettura info da impianto e decodifica come EvList | MACH --> MES" }, + new ActTypeModel() { Action = "GetFluxLog", Description = "Lettura info da impianto e decodifica come FluxLog | MACH --> MES" } + ); + + context.DbSetSyncState.AddOrUpdate( + new SyncStateModel() { TableName = "ActList", LastIdx = 0, Note = "NO EXEC", LastUpdate = DateTime.Today }, + new SyncStateModel() { TableName = "PODL_req", LastIdx = 0, Note = "NO EXEC", LastUpdate = DateTime.Today }, + new SyncStateModel() { TableName = "EvList", LastIdx = 0, Note = "NO EXEC", LastUpdate = DateTime.Today }, + new SyncStateModel() { TableName = "FluxLog", LastIdx = 0, Note = "NO EXEC", LastUpdate = DateTime.Today } + ); + + context.SaveChanges(); + + } + } +} diff --git a/EgwProxy.SqlDb/Properties/AssemblyInfo.cs b/EgwProxy.SqlDb/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..020365fe --- /dev/null +++ b/EgwProxy.SqlDb/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("EgwProxy.SqlDb")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("EgwProxy.SqlDb")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a5f9e2c8-b866-4470-923c-11ba35270963")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/EgwProxy.SqlDb/SqlScript/AddFunc.sql b/EgwProxy.SqlDb/SqlScript/AddFunc.sql new file mode 100644 index 00000000..c4e98d26 --- /dev/null +++ b/EgwProxy.SqlDb/SqlScript/AddFunc.sql @@ -0,0 +1,24 @@ + +/*************************************** +* FUNCTION f_padLeft +* +* fornisce una stringa della lunghezza desiderata aggiungendo a sx il carattere richiesto alla @string originale +* +* Steamware, S.E.L. +* mod: 2010.03.19 +* +****************************************/ +CREATE FUNCTION [dbo].[f_padLeft] (@string VARCHAR(255), @desired_length INTEGER, @pad_character CHAR(1)) +RETURNS VARCHAR(255) AS +BEGIN + + -- Prefix the required number of spaces to bulk up the string and then replace the spaces with the desired character + RETURN CASE + WHEN LEN(@string) < @desired_length + THEN REPLACE(SPACE(@desired_length - LEN(@string)), ' ', @pad_character) + @string + ELSE @string + END + +END + +GO; \ No newline at end of file diff --git a/EgwProxy.SqlDb/StoredProc/stp_BackupDb.sql b/EgwProxy.SqlDb/StoredProc/stp_BackupDb.sql new file mode 100644 index 00000000..64fbee2b --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_BackupDb.sql @@ -0,0 +1,11 @@ + +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + +-- Effettua backjup del database nella cartella configurata (di default C:\DbBackup) per il DB di default --> modificare di conseguenza... +BACKUP DATABASE MoonPro_IOB_ISF +TO DISK = 'C:\Steamware\DbBackup\MoonPro_IOB_ISF.bak' + WITH FORMAT, + MEDIANAME = 'SQLServerBackups', + NAME = 'Full Backup of IOB ISF DB'; diff --git a/EgwProxy.SqlDb/StoredProc/stp_ExportAll.sql b/EgwProxy.SqlDb/StoredProc/stp_ExportAll.sql new file mode 100644 index 00000000..8b685819 --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_ExportAll.sql @@ -0,0 +1,7 @@ +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + +-- Effettua tutte le chiamate di export specifiche per il processo e poi restituisce lettura tabella SyncState +SELECT * +FROM SyncState diff --git a/EgwProxy.SqlDb/StoredProc/stp_GetMachineEvList.sql b/EgwProxy.SqlDb/StoredProc/stp_GetMachineEvList.sql new file mode 100644 index 00000000..9706d60f --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_GetMachineEvList.sql @@ -0,0 +1,21 @@ +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + +/* -------------------------------------------------- +* DECODIFICA STANDARD +* STATE MACHINE 60 +* bitmap MAPO +* B0: POWER_ON +* B1: RUN +* B2: pzCount +* B3: allarme +* B4: manuale +* B5: slowTC +* B6: WarmUpCoolDown +* B7: emergenza +* -------------------------------------------------- */ + +-- Effettua le verifiche necessarie sulle varie tabelle, leggendo dall'ultimo punto precedente e popolando MachineEventList +SELECT * +FROM MachineEventList diff --git a/EgwProxy.SqlDb/StoredProc/stp_GetMachineFluxLog.sql b/EgwProxy.SqlDb/StoredProc/stp_GetMachineFluxLog.sql new file mode 100644 index 00000000..5cbb8991 --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_GetMachineFluxLog.sql @@ -0,0 +1,11 @@ +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + +/* -------------------------------------------------- +* Popola le tabelle parametri secondo disponibilità per successivo sync/invio +* -------------------------------------------------- */ + +-- Effettua le verifiche necessarie sulle varie tabelle, leggendo dall'ultimo punto precedente e popolando MachineFluxLog +SELECT * +FROM MachineFluxLog diff --git a/EgwProxy.SqlDb/StoredProc/stp_GetMachineProdData.sql b/EgwProxy.SqlDb/StoredProc/stp_GetMachineProdData.sql new file mode 100644 index 00000000..17920baf --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_GetMachineProdData.sql @@ -0,0 +1,9 @@ +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + + + +-- Effettua le verifiche necessarie sulle varie tabelle, leggendo dall'ultimo punto precedente e popolando MachineEventList +SELECT * +FROM MachineProdData diff --git a/EgwProxy.SqlDb/StoredProc/stp_GetMachineSigLog.sql b/EgwProxy.SqlDb/StoredProc/stp_GetMachineSigLog.sql new file mode 100644 index 00000000..808d1ab5 --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_GetMachineSigLog.sql @@ -0,0 +1,81 @@ +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + +BEGIN tran + + -- dichiarazioni variabili x recupero dati + DECLARE @LastIdx INT = 0 + DECLARE @NewIdx INT = 0 + + -- recupero valore ultima riga stato processata... + SELECT @LastIdx = ISNULL(LastIdx,0) + FROM SyncState + WHERE TableName = 'ToMachineSigLog' + + -- recupero nuovo MAX idx + SELECT @NewIdx = ISNULL(MAX(ID),0) + FROM syn_M2ERP_MACHINE_STATE + + -- eseguo SOLO SE ho dati aggiuntivi... + IF(@NewIdx > @LastIdx) + BEGIN + /* -------------------------------------------------- + * DECODIFICA STANDARD + * STATE MACHINE 60 + * bitmap MAPO + * B0: POWER_ON + * B1: RUN + * B2: pzCount + * B3: allarme + * B4: manuale + * B5: slowTC + * B6: WarmUpCoolDown + * B7: emergenza + * -------------------------------------------------- */ + + -- decodifica colonne PAMA: + -- M_ON --> PowerON (B0) + -- Auto --> Lavora (B1) + -- AlarmMode --> Allarme (B3) + -- ManualMode/Mda/Jog --> Manuale (B4) + -- Mda/Jog --> Manuale (B4) + -- ManualMode --> Manuale (B4) + + -- recupero i nuovi record da processare... + ;WITH cteSigLog AS + ( + SELECT [DateTime] AS DtEve + ,Targa AS IdxMacchina + , 128 -- B7: emergenza armata (B7 --> 128) + + CASE WHEN M_ON = 1 THEN 1 ELSE 0 END -- B0: spenta + + CASE WHEN [Auto] = 1 THEN 2 ELSE 0 END -- B1: lavora + + CASE WHEN AlarmMode = 1 THEN 8 ELSE 0 END -- B3: allarme + + CASE WHEN (ManualMode = 1 OR Mda = 1 OR Jog = 1) THEN 16 ELSE 0 END -- B4: manuale + AS ValInt + FROM syn_M2ERP_MACHINE_STATE + WHERE ID > @LastIdx AND ID <= @NewIdx + ) + + --vero insert valori + INSERT INTO MachineSignalLog(DtEve, IdxMacchina, ValInt, Valore) + SELECT * + ,CONVERT(VARCHAR(1000),CONVERT(VARBINARY(2), ValInt), 2) AS Valore + --,CONVERT(VARBINARY(2), ValInt) AS Valore + FROM cteSigLog + + -- aggiorno valore indice processato + MERGE SyncState AS tgt + USING (SELECT @NewIdx as LastIdx, 'ToMachineSigLog' AS TableName) as src (LastIdx, TableName) + ON (tgt.TableName = src.TableName) + WHEN MATCHED THEN + UPDATE SET LastIdx = src.LastIdx + ,Note = 'UPDATED from ' + CAST(@LastIdx AS NVARCHAR(50)) + ,LastUpdate = GETDATE() + WHEN NOT MATCHED THEN + INSERT (LastIdx, TableName, Note, LastUpdate) + VALUES (src.LastIdx, src.TableName, 'CREATED', GETDATE()); + + END + +COMMIT tran \ No newline at end of file diff --git a/EgwProxy.SqlDb/StoredProc/stp_ImportAll.sql b/EgwProxy.SqlDb/StoredProc/stp_ImportAll.sql new file mode 100644 index 00000000..a8f55354 --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_ImportAll.sql @@ -0,0 +1,7 @@ +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + +-- Effettua tutti i task di import e poi restituisce lettura tabella SyncState +SELECT * +FROM SyncState diff --git a/EgwProxy.SqlDb/StoredProc/stp_ResetPodlMes.sql b/EgwProxy.SqlDb/StoredProc/stp_ResetPodlMes.sql new file mode 100644 index 00000000..07a04f4b --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_ResetPodlMes.sql @@ -0,0 +1,15 @@ + +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + +-- Effettua reset delle tabelle PODL (ATTENZIONE!!!), da decommentare +--TRUNCATE TABLE MesPODL_req; +--DBCC CHECKIDENT ('MesPODL_req', RESEED, 0); + +--TRUNCATE TABLE MesPODL_last; +--DBCC CHECKIDENT ('MesPODL_last', RESEED, 0); + +-- elenco righe finale +SELECT * +FROM MesPODL_req \ No newline at end of file diff --git a/EgwProxy.SqlDb/StoredProc/stp_SyncPodlToMachine.sql b/EgwProxy.SqlDb/StoredProc/stp_SyncPodlToMachine.sql new file mode 100644 index 00000000..0d1ed278 --- /dev/null +++ b/EgwProxy.SqlDb/StoredProc/stp_SyncPodlToMachine.sql @@ -0,0 +1,16 @@ + +-- SET NOCOUNT ON added to prevent extra result sets from +-- interfering with SELECT statements. +SET NOCOUNT ON; + +-- Calcola i NUOVI PODL e scrive ADD relativo +SELECT * +FROM MesPODL_last + +-- Calcola i VECCHI PODL e scrive DELETE relativo +SELECT * +FROM MesPODL_req + +-- Calcola i PODL modificati e scrive update relativo +SELECT * +FROM MesPODL_req diff --git a/EgwProxy.SqlDb/SyncStateDbContext.cs b/EgwProxy.SqlDb/SyncStateDbContext.cs new file mode 100644 index 00000000..eb775206 --- /dev/null +++ b/EgwProxy.SqlDb/SyncStateDbContext.cs @@ -0,0 +1,111 @@ +using EgwProxy.SqlDb.DbModels; +using EgwProxy.SqlDb.Migrations; +using NLog; +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwProxy.SqlDb +{ + /// + /// Classe per accesso dati SyncState del DB + /// + public partial class SyncStateDbContext : DbContext + { + private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); + + /// + /// Costruttore implicito + /// + public SyncStateDbContext() : base("name=SyncState") + { + Log.Info("Init 01 SyncStateDbContext - DONE"); + } + + protected string connString = ""; + + /// + /// Costruttore da connectionString + /// + /// + public SyncStateDbContext(string connectionString) : base(connectionString) + { + Log.Info("Init 02 SyncStateDbContext - DONE"); + connString = connectionString; +#if false + try + { + // se non ci fosse... crea o migra! + Database.CreateIfNotExists(); + Database.SetInitializer(new MyDbInitializer()); + Database.Initialize(false); + } + catch (Exception exc) + { + Log.Error(exc, "Exception during context initialization 02"); + } +#endif + } + + public void DbForceMigrate() + { + try + { + // se non ci fosse... crea o migra! + //Database.Migrate(); + Database.CreateIfNotExists(); + Database.SetInitializer(new MyDbInitializer()); + Database.Initialize(true); + Log.Info("DbForceMigrate: done!"); + } + catch (Exception exc) + { + Log.Error(exc, "DbForceMigrate: Exception during context initialization 01"); + } + } + + /// + /// DbSet Flux Log già decodificato + /// + public virtual DbSet DbSetActListType{ get; set; } + /// + /// DbSet dei dati stato sync DB esterni <--> locale + /// + public virtual DbSet DbSetSyncState { get; set; } + /// + /// DbSet ActionList da MES / MACCHINA + /// + public virtual DbSet DbSetActions { get; set; } + /// + /// DbSet PODL da Macchina + /// + public virtual DbSet DbSetMachPODL { get; set; } + /// + /// DbSet PODL Req da MES + /// + public virtual DbSet DbSetMesPodlReq { get; set; } + /// + /// DbSet PODL Last da MES + /// + public virtual DbSet DbSetMesPodlLast { get; set; } + /// + /// DbSet Flux Log già decodificato + /// + public virtual DbSet DbSetMachFluxLog { get; set; } + /// + /// DbSet Flux Log già decodificato + /// + public virtual DbSet DbSetMachEvList { get; set; } + /// + /// DbSet Prod Data da macchina + /// + public virtual DbSet DbSetMachProdData { get; set; } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + } + } +} diff --git a/EgwProxy.SqlDb/docfx.json b/EgwProxy.SqlDb/docfx.json new file mode 100644 index 00000000..435e3499 --- /dev/null +++ b/EgwProxy.SqlDb/docfx.json @@ -0,0 +1,69 @@ +{ + "metadata": [ + { + "src": [ + { + "files": [ + "*.csproj", + "*.vbproj" + ], + "cwd": ".", + "exclude": [ + "**/obj/**", + "**/bin/**", + "_site/**" + ] + } + ], + "dest": "obj/api" + } + ], + "build": { + "content": [ + { + "files": [ + "api/**.yml" + ], + "cwd": "obj" + }, + { + "files": [ + "api/*.md", + "articles/**.md", + "toc.yml", + "*.md" + ], + "exclude": [ + "obj/**", + "_site/**" + ] + } + ], + "resource": [ + { + "files": [ + "images/**" + ], + "exclude": [ + "obj/**", + "_site/**" + ] + } + ], + "overwrite": [ + { + "files": [ + "apidoc/**.md" + ], + "exclude": [ + "obj/**", + "_site/**" + ] + } + ], + "dest": "_site", + "template": [ + "default" + ] + } +} \ No newline at end of file diff --git a/EgwProxy.SqlDb/index.md b/EgwProxy.SqlDb/index.md new file mode 100644 index 00000000..972a639a --- /dev/null +++ b/EgwProxy.SqlDb/index.md @@ -0,0 +1,17 @@ +# EgwProxy.SqlDb Library + +Documentazione relativa alla libreria di interfaccia con un generico DB SQL di frontiera per le operazioni di R/W dei dati di produzione. + +Disponibile in forma di pacchetto nuget sul repo aziendale nexus.steamware.net: i pacchetti sono disponibili all'indirizzo + +https://nexus.steamware.net/#browse/browse:nuget-hosted + +Vedere la sezione Articles per maggiori informazioni sulle definizioni, l'impiego ed esempi. + +## Articles + +Per maggiori dettagli, definizioni e demo funzionamento si rimanda alla sezione Articles + +## Api + +Per ogni dettaglio e riferimento alla libreria si rimanda alla sezione Api Documentation \ No newline at end of file diff --git a/EgwProxy.SqlDb/packages.config b/EgwProxy.SqlDb/packages.config new file mode 100644 index 00000000..20df8ddc --- /dev/null +++ b/EgwProxy.SqlDb/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/EgwProxy.SqlDb/toc.yml b/EgwProxy.SqlDb/toc.yml new file mode 100644 index 00000000..7eee9ffb --- /dev/null +++ b/EgwProxy.SqlDb/toc.yml @@ -0,0 +1,6 @@ + +- name: Articles + href: articles/ +- name: API Documentation + href: obj/api/ + homepage: api/index.md diff --git a/IOB-MAN/App.config b/IOB-MAN/App.config index 1e32a95f..73c38842 100644 --- a/IOB-MAN/App.config +++ b/IOB-MAN/App.config @@ -1,116 +1,116 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOB-UT-NEXT/BitUtils.cs b/IOB-UT-NEXT/BitUtils.cs new file mode 100644 index 00000000..3193bdd5 --- /dev/null +++ b/IOB-UT-NEXT/BitUtils.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IOB_UT_NEXT +{ + public class BitUtils + { + /// + /// Test se il bit sia attivo + /// + /// valkore da verificare + /// bit da verificare (0 based, 00..31) + /// + public static bool isActive(int val2check, int bitNum) + { + bool answ = false; + // testa i-esimo bit (max 32 bit...) + if (bitNum <= 31) + { + answ = ((val2check & (1 << bitNum)) != 0); + } + return answ; + } + } +} diff --git a/IOB-UT-NEXT/CustomObj.cs b/IOB-UT-NEXT/CustomObj.cs index 206c00f3..9ed6adef 100644 --- a/IOB-UT-NEXT/CustomObj.cs +++ b/IOB-UT-NEXT/CustomObj.cs @@ -116,6 +116,7 @@ namespace IOB_UT_NEXT public string Note { get; set; } = ""; public string CodCli { get; set; } = ""; public DateTime InsertDate { get; set; } = DateTime.Now; + public string Recipe { get; set; } = ""; public string CodFase { diff --git a/IOB-UT-NEXT/DataModel/Fimat.cs b/IOB-UT-NEXT/DataModel/Fimat.cs new file mode 100644 index 00000000..b8293102 --- /dev/null +++ b/IOB-UT-NEXT/DataModel/Fimat.cs @@ -0,0 +1,329 @@ +using System; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace IOB_UT_NEXT.DataModel +{ + public class Fimat + { + #region Public Classes + + [XmlRoot(ElementName = "A_Recipe")] + public class ARecipe + { + #region Public Properties + + [XmlElement(ElementName = "ColRecipe")] + public List ColRecipe { get; set; } + + [XmlElement(ElementName = "DesRecipe")] + public DesRecipe DesRecipe { get; set; } + + [XmlAttribute(AttributeName = "noNamespaceSchemaLocation")] + public string NoNamespaceSchemaLocation { get; set; } + + [XmlText] + public string Text { get; set; } + + [XmlAttribute(AttributeName = "xsi")] + public string Xsi { get; set; } + + #endregion Public Properties + } + + [XmlRoot(ElementName = "ColData")] + public class ColData + { + #region Public Properties + + [XmlElement(ElementName = "ColourCode")] + public string ColourCode { get; set; } + + [XmlElement(ElementName = "CompNumber")] + public int CompNumber { get; set; } + + [XmlElement(ElementName = "Cost")] + public double Cost { get; set; } + + [XmlElement(ElementName = "Date")] + public string Date { get; set; } + + [XmlElement(ElementName = "Description")] + public string Description { get; set; } + + [XmlElement(ElementName = "DosDuration")] + public int DosDuration { get; set; } + + [XmlElement(ElementName = "DosError")] + public string DosError { get; set; } + + [XmlElement(ElementName = "DosNote")] + public string DosNote { get; set; } + + [XmlElement(ElementName = "Origin")] + public string Origin { get; set; } + + [XmlElement(ElementName = "PartsPerc")] + public double PartsPerc { get; set; } + + [XmlElement(ElementName = "PartsWeight")] + public double PartsWeight { get; set; } + + [XmlElement(ElementName = "TypComp")] + public string TypComp { get; set; } + + [XmlElement(ElementName = "Weight-gr")] + public double Weightgr { get; set; } + + [XmlElement(ElementName = "Weight-gr-dosed")] + public double Weightgrdosed { get; set; } + + [XmlElement(ElementName = "Weight-gr-prev")] + public double Weightgrprev { get; set; } + + [XmlElement(ElementName = "Weight-gr-total")] + public double Weightgrtotal { get; set; } + + #endregion Public Properties + } + + [XmlRoot(ElementName = "ColRecipe")] + public class ColRecipe + { + #region Public Properties + + [XmlElement(ElementName = "ColData")] + public ColData ColData { get; set; } + + #endregion Public Properties + } + + /// + /// Record consumo componente x rendiconto settimanale + /// + public class ConsRec + { + #region Public Properties + + public string FileRef { get; set; } = ""; + public string ColourCode { get; set; } = ""; + public string Description { get; set; } = ""; + public DateTime DtRif { get; set; } = DateTime.Now; + public double WeightGrTot { get; set; } = 0; + + #endregion Public Properties + } + + /// + /// Record consumo componente x rendiconto settimanale + /// + public class ConsOut + { + #region Public Properties + + public string CodMag { get; set; } = ""; + public string FileRef { get; set; } = ""; + public string ColourCode { get; set; } = ""; + public string Description { get; set; } = ""; + public DateTime DtRif { get; set; } = DateTime.Now; + public double WeightKgProc { get; set; } = 0; + + #endregion Public Properties + } + + /// + /// Record info sul periodo indicato + /// + public class PeriodInfo + { + #region Public Properties + + public int NumFilesReceived { get; set; } = 0; + public string CurrStatus { get; set; } = ""; + public Dictionary ActionList { get; set; } = new Dictionary(); + + #endregion Public Properties + } + /// + /// Configurazione x conversioni dati + /// + public class ConvSetup + { + /// + /// Inclusione o meno dell'header in file CSV + /// + public bool addHeader { get; set; } = false; + + /// + /// Numero cifre decimale x arrotondamento + /// + public int numDec { get; set; } = 3; + + /// + /// CodMagazzino + /// + public string codMag { get; set; } = ""; + + /// + /// Rapporti di conversione x gli item indicati + /// + public Dictionary convRatio { get; set; } = new Dictionary(); + } + + [XmlRoot(ElementName = "DesData")] + public class DesData + { + #region Public Properties + + [XmlElement(ElementName = "Article")] + public string Article { get; set; } + + [XmlElement(ElementName = "CustDrumCode")] + public string CustDrumCode { get; set; } + + [XmlElement(ElementName = "Customer")] + public string Customer { get; set; } + + [XmlElement(ElementName = "Date")] + public string Date { get; set; } + + [XmlElement(ElementName = "Design")] + public string Design { get; set; } + + [XmlElement(ElementName = "DosDuration")] + public int DosDuration { get; set; } + + [XmlElement(ElementName = "DosedLine")] + public int DosedLine { get; set; } + + [XmlElement(ElementName = "DosType")] + public string DosType { get; set; } + + [XmlElement(ElementName = "DrumCode")] + public string DrumCode { get; set; } + + [XmlElement(ElementName = "DrumInitialWeightKG")] + public double DrumInitialWeightKG { get; set; } + + [XmlElement(ElementName = "DrumTag")] + public int DrumTag { get; set; } + + [XmlElement(ElementName = "DrumType")] + public int DrumType { get; set; } + + [XmlElement(ElementName = "Info1")] + public string Info1 { get; set; } + + [XmlElement(ElementName = "Info2")] + public string Info2 { get; set; } + + [XmlElement(ElementName = "Info3")] + public string Info3 { get; set; } + + [XmlElement(ElementName = "Info4")] + public string Info4 { get; set; } + + [XmlElement(ElementName = "Info5")] + public string Info5 { get; set; } + + [XmlElement(ElementName = "Info6")] + public string Info6 { get; set; } + + [XmlElement(ElementName = "Info7")] + public string Info7 { get; set; } + + [XmlElement(ElementName = "Info8")] + public string Info8 { get; set; } + + [XmlElement(ElementName = "Info9")] + public string Info9 { get; set; } + + [XmlElement(ElementName = "LotID")] + public string LotID { get; set; } + + [XmlElement(ElementName = "Note1")] + public string Note1 { get; set; } + + [XmlElement(ElementName = "Note2")] + public string Note2 { get; set; } + + [XmlElement(ElementName = "OrderCode")] + public string OrderCode { get; set; } + + [XmlElement(ElementName = "Prio")] + public string Prio { get; set; } + + [XmlElement(ElementName = "Quantity-kg")] + public double Quantitykg { get; set; } + + [XmlElement(ElementName = "Quantity-kg-dosed")] + public double Quantitykgdosed { get; set; } + + [XmlElement(ElementName = "RecipeStatus")] + public string RecipeStatus { get; set; } + + [XmlElement(ElementName = "RecipeType")] + public string RecipeType { get; set; } + + [XmlElement(ElementName = "RecName")] + public string RecName { get; set; } + + [XmlElement(ElementName = "ReqType")] + public string ReqType { get; set; } + + [XmlElement(ElementName = "Screen")] + public string Screen { get; set; } + + [XmlElement(ElementName = "Sequence")] + public int Sequence { get; set; } + + [XmlElement(ElementName = "SequenceTot")] + public int SequenceTot { get; set; } + + [XmlElement(ElementName = "Series")] + public int Series { get; set; } + + [XmlElement(ElementName = "ServiceType")] + public string ServiceType { get; set; } + + [XmlElement(ElementName = "SplitCurrent")] + public int SplitCurrent { get; set; } + + [XmlElement(ElementName = "SplitTotal")] + public int SplitTotal { get; set; } + + [XmlElement(ElementName = "Taglio-D")] + public double TaglioD { get; set; } + + [XmlElement(ElementName = "Taglio-N")] + public double TaglioN { get; set; } + + [XmlElement(ElementName = "UM")] + public int UM { get; set; } + + [XmlElement(ElementName = "Variant")] + public string Variant { get; set; } + + [XmlElement(ElementName = "ViscoName")] + public string ViscoName { get; set; } + + [XmlElement(ElementName = "ViscoValue")] + public double ViscoValue { get; set; } + + #endregion Public Properties + } + + [XmlRoot(ElementName = "DesRecipe")] + public class DesRecipe + { + #region Public Properties + + [XmlElement(ElementName = "DesData")] + public DesData DesData { get; set; } + + #endregion Public Properties + } + + #endregion Public Classes + } +} \ No newline at end of file diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs index 4d80db55..49a0d7e7 100644 --- a/IOB-UT-NEXT/Enums.cs +++ b/IOB-UT-NEXT/Enums.cs @@ -347,6 +347,11 @@ namespace IOB_UT_NEXT ///
MODBUS_TCP_CENTERFRIGO, + /// + /// Adapter modbus (+ file) x FIMAT (Tenditalia) + /// + MODBUS_TCP_FIMAT, + /// /// Adapter ModBus TCP versione HAM (Pizzaferri) /// @@ -360,7 +365,12 @@ namespace IOB_UT_NEXT /// /// Adapter Modubus TCP versione IMAX Aeromacchine (Jetco) /// - MODBUS_TCP_IMAX_AEROMEC, + MODBUS_TCP_IMAS_AEROMEC, + + /// + /// Adapter Modubus TCP versione Rimor (IMI Remosa) + /// + MODBUS_TCP_RIMOR, /// /// Adapter Modubus TCP versione Saim (Giacovelli) @@ -412,6 +422,11 @@ namespace IOB_UT_NEXT /// OpcUaEwonMecolpress, + /// + /// Adapter OPC-UA per IMAS Aeromec / Jetco + /// + OpcUaImasAeromec, + /// /// Adapter MBH (es Cimolai) /// @@ -547,6 +562,16 @@ namespace IOB_UT_NEXT /// SIEMENS_TORRI, + /// + /// Adapter basato su DB scambio Microsoft SqlServer, macchine LANTEK + /// + SQLSERVER_LANTEK, + + /// + /// Adapter basato su DB scambio Microsoft SqlServer, macchine PAMA + /// + SQLSERVER_PAMA, + /// /// Metodi di WPS WebPageScraping (es x compressori Atlas Copco) /// diff --git a/IOB-UT-NEXT/FileProcMan.cs b/IOB-UT-NEXT/FileProcMan.cs new file mode 100644 index 00000000..eeb5ee84 --- /dev/null +++ b/IOB-UT-NEXT/FileProcMan.cs @@ -0,0 +1,114 @@ +using Newtonsoft.Json; +using System; +using System.Diagnostics; +using System.IO; + +namespace IOB_UT_NEXT +{ + public class FileProcMan + { + #region Public Constructors + + public FileProcMan(string archiveDir, string convertDir, string toolDir, string exeFileName, string refConfFileName, string sheetName) + { + this.archDir = archiveDir; + this.convDir = convertDir; + this.confFileNameOut = "conf.json"; + this.baseDir = toolDir; + this.exeName = exeFileName; + this.sheetName = sheetName; + appPath = Path.Combine(baseDir, exeName); + // leggo file di conf base + string refConfFile = Path.Combine(baseDir, refConfFileName); + this.refConf = File.ReadAllText(refConfFile); + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Processa il singolo file e riporta tempo esecuzione + /// + /// + public TimeSpan doProcess(string fPath, int idxODL) + { + TimeSpan outVal = new TimeSpan(); + Stopwatch sw = new Stopwatch(); + // preparo file conf + createConfFile(fPath, idxODL); + // avvio processing + Console.WriteLine("calling ext app with args:"); + Console.WriteLine($"{appPath} {confFileNameOut}"); + Console.WriteLine(); + + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = appPath, + Arguments = $"{confFileNameOut}", + WindowStyle = ProcessWindowStyle.Minimized, + //WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + //CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardInput = true, + }; + + sw.Start(); + + Process p = Process.Start(psi); + + string q = ""; + while (!p.HasExited) + { + q += p.StandardOutput.ReadToEnd(); + } + + sw.Stop(); + outVal = sw.Elapsed; + + return outVal; + } + + #endregion Public Methods + + #region Protected Fields + + protected string appPath = ""; + protected string archDir = ""; + protected string baseDir = ""; + protected string confFileNameOut = ""; + protected string convDir = ""; + protected string exeName = ""; + protected string refConf = ""; + protected string sheetName = ""; + + #endregion Protected Fields + + #region Private Methods + + private void createConfFile(string item, int idxOdl) + { + string outFileName = Path.GetFileName(item).Replace("xlsx", "json"); + string rawContent = String.Copy(refConf); + rawContent = rawContent.Replace("{{ArchiveDir}}", fixJsonDir(archDir)); + rawContent = rawContent.Replace("{{ConvertDir}}", fixJsonDir(convDir)); + rawContent = rawContent.Replace("{{FileInPath}}", fixJsonDir(item)); + rawContent = rawContent.Replace("{{FileOutPath}}", outFileName); + rawContent = rawContent.Replace("{{TargetSheetName}}", sheetName); + rawContent = rawContent.Replace("987654321", $"{idxOdl}"); + // calcolo nome file conf specifico + confFileNameOut = $"conf_{outFileName}"; + File.WriteAllText(confFileNameOut, rawContent); + } + + protected string fixJsonDir(string origPath) + { + string answ = JsonConvert.ToString(origPath); + answ = answ.Substring(1, answ.Length - 2); + return answ; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/IOB-UT-NEXT/IOB-UT-NEXT.csproj b/IOB-UT-NEXT/IOB-UT-NEXT.csproj index 61e934f4..2572969c 100644 --- a/IOB-UT-NEXT/IOB-UT-NEXT.csproj +++ b/IOB-UT-NEXT/IOB-UT-NEXT.csproj @@ -75,26 +75,20 @@ MinimumRecommendedRules.ruleset - - ..\packages\ExcelDataReader.3.6.0\lib\net45\ExcelDataReader.dll - - - ..\packages\ExcelDataReader.DataSet.3.6.0\lib\net35\ExcelDataReader.DataSet.dll - ..\packages\SharpZipLib.1.3.1\lib\net45\ICSharpCode.SharpZipLib.dll - - ..\packages\MapoSDK.6.14.2211.3016\lib\MapoSDK.dll + + ..\packages\MapoSDK.6.14.2304.1209\lib\MapoSDK.dll ..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll - ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll - - ..\packages\NLog.4.7.13\lib\net45\NLog.dll + + ..\packages\NLog.5.1.2\lib\net46\NLog.dll ..\packages\Pipelines.Sockets.Unofficial.2.2.2\lib\net461\Pipelines.Sockets.Unofficial.dll @@ -147,7 +141,9 @@ - + + + diff --git a/IOB-UT-NEXT/RedisMan.cs b/IOB-UT-NEXT/RedisMan.cs index d689f27f..c449f531 100644 --- a/IOB-UT-NEXT/RedisMan.cs +++ b/IOB-UT-NEXT/RedisMan.cs @@ -629,6 +629,29 @@ namespace IOB_UT_NEXT } return answ; } + /// + /// RIMUOVE un singolo valore (riga) dalla hash + /// + /// + /// + /// + public string redRemoveHashField(string hashKey, string hashField) + { + string answ = ""; + // cerco se ci sia valore in redis... + try + { + RedisKey chiave = hashKey; + RedisValue campo = hashField; + RedisValue valOut = cache.HashDelete(chiave, campo); + answ = valOut.ToString(); + } + catch (Exception exc) + { + Logging.Instance.Error($"redRemoveHashField{Environment.NewLine}{exc}"); + } + return answ; + } /// /// Nome della variabile HASH da utilizzare (dato CodModulo / Server / DB impiegato da diff --git a/IOB-UT-NEXT/baseUtils.cs b/IOB-UT-NEXT/baseUtils.cs index cf312fdd..c1bab73f 100644 --- a/IOB-UT-NEXT/baseUtils.cs +++ b/IOB-UT-NEXT/baseUtils.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Net; using System.Net.NetworkInformation; +using System.Security.Cryptography; using System.Threading.Tasks; namespace IOB_UT_NEXT @@ -66,27 +67,6 @@ namespace IOB_UT_NEXT #region Public Methods - /// - /// Restituisce la prima cifra (a sx) da un numero (es x decodere quale memoria modbus sia) - /// - /// Numero di cui trovare la priam cifra - /// - public static int getFirstInt(int num) - { - if (num >= 100000000) num /= 100000000; - if (num >= 10000) num /= 10000; - if (num >= 100) num /= 100; - if (num >= 10) num /= 10; - -#if false - // formulazione alternativa con ciclo... - while (num >= 10) - num /= 10; -#endif - - return num; - } - /// /// formatta un numero in forma binaria 0/1 /// @@ -271,6 +251,20 @@ namespace IOB_UT_NEXT return answ; } + /// + /// Test esistenza/creazione directory + /// + /// + public static void checkDir(string dirPath) + { + if (!Directory.Exists(dirPath)) + { + lg.Info($"Dir not found: {dirPath}"); + Directory.CreateDirectory(dirPath); + lg.Info($"reated local dir {dirPath}"); + } + } + /// /// Conteggio valori true in un array di boolean /// @@ -349,6 +343,46 @@ namespace IOB_UT_NEXT return answ; } + /// + /// Calcolo MD5 del fine indicato + /// + /// + /// + public static string GetFileMd5(string fileName) + { + string answ = ""; + using (var md5 = MD5.Create()) + { + using (var stream = File.OpenRead(fileName)) + { + var hash = md5.ComputeHash(stream); + answ = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); + } + } + return answ; + } + + /// + /// Restituisce la prima cifra (a sx) da un numero (es x decodere quale memoria modbus sia) + /// + /// Numero di cui trovare la priam cifra + /// + public static int getFirstInt(int num) + { + if (num >= 100000000) num /= 100000000; + if (num >= 10000) num /= 10000; + if (num >= 100) num /= 100; + if (num >= 10) num /= 10; + +#if false + // formulazione alternativa con ciclo... + while (num >= 10) + num /= 10; +#endif + + return num; + } + /// /// IP della macchina /// @@ -720,10 +754,7 @@ namespace IOB_UT_NEXT { string dirPath = file.Substring(0, file.LastIndexOf('\\')); // verifico directory - if (!Directory.Exists(dirPath)) - { - Directory.CreateDirectory(dirPath); - } + checkDir(dirPath); string[] lines = dictionary.OrderBy(i => i.Key).Select(kvp => kvp.Key + ":" + kvp.Value).ToArray(); try { diff --git a/IOB-UT-NEXT/fileMover.cs b/IOB-UT-NEXT/fileMover.cs index 4c02a6cc..7ffb16c9 100644 --- a/IOB-UT-NEXT/fileMover.cs +++ b/IOB-UT-NEXT/fileMover.cs @@ -240,10 +240,7 @@ namespace IOB_UT_NEXT else if (theEntry.IsDirectory) { string strNewDirectory = @"" + baseDirectory + @"\" + theEntry.Name; - if (!Directory.Exists(strNewDirectory)) - { - Directory.CreateDirectory(strNewDirectory); - } + baseUtils.checkDir(strNewDirectory); } } ZipStream.Close(); @@ -309,13 +306,8 @@ namespace IOB_UT_NEXT } else if (theEntry.IsDirectory) { - string strNewDirectory = @"" + baseDirectory + @"\" + - - theEntry.Name; - if (!Directory.Exists(strNewDirectory)) - { - Directory.CreateDirectory(strNewDirectory); - } + string strNewDirectory = @"" + baseDirectory + @"\" + theEntry.Name; + baseUtils.checkDir(strNewDirectory); } } ZipStream.Close(); @@ -911,6 +903,49 @@ namespace IOB_UT_NEXT return fatto; } + /// + /// Compressione zip x folder indicata + /// + /// + public static bool zippaDirectory(string dirPath, string nomeZip) + { + bool fatto = false; + try + { + using (ZipOutputStream s = new ZipOutputStream(File.Create(nomeZip))) + { + s.SetLevel(5); + byte[] buffer = new byte[4096]; + // processo x ogni file nella directory... + var file2zip = Directory.GetFiles(dirPath); + foreach (var currFile in file2zip) + { + ZipEntry entry = new ZipEntry(Path.GetFileName(currFile)); + // Could also use the last write time or similar for the file. + entry.DateTime = DateTime.Now; + s.PutNextEntry(entry); + using (FileStream fs = File.OpenRead(currFile)) + { + // Using a fixed size buffer here makes no noticeable difference for output + // but keeps a lid on memory usage. + int sourceBytes; + do + { + sourceBytes = fs.Read(buffer, 0, buffer.Length); + s.Write(buffer, 0, sourceBytes); + } while (sourceBytes > 0); + } + } + s.Finish(); + s.Close(); + } + fatto = true; + } + catch + { } + return fatto; + } + #endregion Public Methods #region Protected Fields diff --git a/IOB-UT-NEXT/packages.config b/IOB-UT-NEXT/packages.config index 6d534f73..81fe0a2c 100644 --- a/IOB-UT-NEXT/packages.config +++ b/IOB-UT-NEXT/packages.config @@ -1,11 +1,9 @@  - - - + - - + + diff --git a/IOB-UT-NEXT/plcMemMapExt.cs b/IOB-UT-NEXT/plcMemMapExt.cs index d6470918..c7247713 100644 --- a/IOB-UT-NEXT/plcMemMapExt.cs +++ b/IOB-UT-NEXT/plcMemMapExt.cs @@ -9,9 +9,18 @@ namespace IOB_UT_NEXT { public class plcMemMapExt : plcMemMap { + /// + /// Dizionario parametri opzionali + /// public Dictionary optMemPar { get; set; } = new Dictionary(); + /// + /// Dizionario x decodifica file + /// public Dictionary fileDecod { get; set; } = new Dictionary(); + /// + /// Lista ulteriori configurazioni KeyValuePair + /// + public Dictionary optKVP { get; set; } = new Dictionary(); } - } diff --git a/IOB-WIN-NEXT/AdapterForm.cs b/IOB-WIN-NEXT/AdapterForm.cs index 23c18622..0494d2eb 100644 --- a/IOB-WIN-NEXT/AdapterForm.cs +++ b/IOB-WIN-NEXT/AdapterForm.cs @@ -3,10 +3,12 @@ using MapoSDK; using Newtonsoft.Json; using NLog; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; +using System.Linq; using System.Threading; using System.Windows.Forms; @@ -127,13 +129,28 @@ namespace IOB_WIN_NEXT // check oggetto not null if (iobObj != null) { + //verifico sia da inviare, ovvero non ci sia veto redis (da 12h..) + bool needSend = false; + string redKey = redisMan.redHash($"IOB:SendReboot:{CurrIOB}"); + var rawVal = redisMan.getRSV(redKey); + // verifico uguaglianza MD5... + if (string.IsNullOrEmpty(rawVal)) + { + needSend = true; + // calcolo attesa con errore random -/+ 10% + int ttlSec = 60 * 60 * 6 * rndGen.Next(900, 1100) / 1000; + redisMan.setRSV(redKey, $"{DateTime.Now}", ttlSec); + } try { // verifico server online... if (iobObj.checkServerAlive) { - // segnalo reboot (programma)... - IobGeneric.callUrl(iobObj.urlReboot, true); + if (needSend) + { + // segnalo reboot (programma)... + IobGeneric.callUrl(iobObj.urlReboot, true); + } } else { @@ -257,19 +274,20 @@ namespace IOB_WIN_NEXT /// public string dataMonitor_0 { - get - { - return dMonValues[0]; - } set { DateTime adesso = DateTime.Now; - // salvo nell'array... - dMonValues[0] = value; + // salvo in cima alla lista... + dMonValues[0].Insert(0, value); + // se supero limite --> trim! + if (dMonValues[0].Count > nLine2show) + { + dMonValues[0] = dMonValues[0].Take(nLine2show).ToList(); + } if (dMonDisplVetoVeto[0] < adesso) { // se scaduto veto --> display! - lblRawData.Text = value; + lblRawData.Text = String.Join(Environment.NewLine, dMonValues[0]); // update veto! dMonDisplVetoVeto[0] = adesso.AddMilliseconds(delayShowLogMs); } @@ -281,19 +299,20 @@ namespace IOB_WIN_NEXT /// public string dataMonitor_1 { - get - { - return dMonValues[1]; - } set { DateTime adesso = DateTime.Now; // salvo nell'array... - dMonValues[1] = value; + dMonValues[1].Insert(0, value); + // se supero limite --> trim! + if (dMonValues[1].Count > nLine2show) + { + dMonValues[1] = dMonValues[1].Take(nLine2show).ToList(); + } if (dMonDisplVetoVeto[1] < adesso) { // se scaduto veto --> display! - lblOutMessage.Text = value; + lblOutMessage.Text = String.Join(Environment.NewLine, dMonValues[1]); // update veto! dMonDisplVetoVeto[1] = adesso.AddMilliseconds(delayShowLogMs); } @@ -305,19 +324,20 @@ namespace IOB_WIN_NEXT /// public string dataMonitor_2 { - get - { - return dMonValues[2]; - } set { DateTime adesso = DateTime.Now; // salvo nell'array... - dMonValues[2] = value; + dMonValues[2].Insert(0, value); + // se supero limite --> trim! + if (dMonValues[2].Count > nLine2show) + { + dMonValues[2] = dMonValues[2].Take(nLine2show).ToList(); + } if (dMonDisplVetoVeto[2] < adesso) { // se scaduto veto --> display! - lblOutMessage2.Text = value; + lblOutMessage2.Text = String.Join(Environment.NewLine, dMonValues[2]); // update veto! dMonDisplVetoVeto[2] = adesso.AddMilliseconds(delayShowLogMs); } @@ -329,19 +349,20 @@ namespace IOB_WIN_NEXT /// public string dataMonitor_3 { - get - { - return dMonValues[3]; - } set { DateTime adesso = DateTime.Now; // salvo nell'array... - dMonValues[3] = value; + dMonValues[3].Insert(0, value); + // se supero limite --> trim! + if (dMonValues[3].Count > nLine2show) + { + dMonValues[3] = dMonValues[3].Take(nLine2show).ToList(); + } if (dMonDisplVetoVeto[3] < adesso) { // se scaduto veto --> display! - lblOutMessage3.Text = value; + lblOutMessage3.Text = String.Join(Environment.NewLine, dMonValues[3]); // update veto! dMonDisplVetoVeto[3] = adesso.AddMilliseconds(delayShowLogMs); } @@ -444,13 +465,21 @@ namespace IOB_WIN_NEXT { try { - logWatchString = limitLine2show($"{value}{Environment.NewLine}{logWatchString}"); + // aggiungo in testa la NUOVA stringa (eventualmente multiline) + logWatchString.Enqueue(value); + // se supero limite --> trim! + string sTemp = ""; + while (logWatchString.Count > nLine2show) + { + logWatchString.TryDequeue(out sTemp); + //logWatchString = logWatchString.Take(nLine2show).ToList(); + } DateTime adesso = DateTime.Now; if (logWatchWriteVeto < adesso) { this.UIThread(delegate { - lblLogfile.Text = logWatchString; + lblLogfile.Text = string.Join(Environment.NewLine, logWatchString); lblLogfile.Refresh(); }); @@ -595,7 +624,13 @@ namespace IOB_WIN_NEXT { try { - lblTaskLog.Text = limitLine2show($"{value}{Environment.NewLine}{lblTaskLog.Text}"); + logTaskString.Insert(0, value); + // se supero limite --> trim! + if (logTaskString.Count > nLine2show) + { + logTaskString = logTaskString.Take(nLine2show).ToList(); + } + lblTaskLog.Text = string.Join(Environment.NewLine, logTaskString); lblTaskLog.Refresh(); } catch (Exception exc) @@ -725,7 +760,7 @@ namespace IOB_WIN_NEXT /// /// /// - public void displayTaskAndLog(string txt2show, bool forceDebug=false) + public void displayTaskAndLog(string txt2show, bool forceDebug = false) { lblStatus.Text = txt2show; lblStatus.Invalidate(); @@ -753,26 +788,6 @@ namespace IOB_WIN_NEXT fermaTutto(false, tryRestart, forceDequeue, updateForm); } - /// - /// Effettua un trim della stringa al numero max di linee da mostrare a video - /// - /// - /// - public string limitLine2show(string newString) - { - if (!string.IsNullOrEmpty(newString)) - { - // se num righe superiore a limite trimmo... - if (newString.Split('\n').Length > nLine2show) - { - //int idx = newString.LastIndexOf('\r'); - int idx = newString.LastIndexOf(Environment.NewLine); - newString = newString.Substring(0, idx); - } - } - return newString; - } - /// /// Salva su file l'oggetto di persistenza dati /// @@ -827,19 +842,23 @@ namespace IOB_WIN_NEXT // RealTime display if (!string.IsNullOrWhiteSpace(currDispData.newInData)) { - dataMonitor_0 = limitLine2show($"{currDispData.newInData}{Environment.NewLine}{dataMonitor_0}"); + //dataMonitor_0 = limitLine2show($"{currDispData.newInData}{Environment.NewLine}{dataMonitor_0}"); + dataMonitor_0 = currDispData.newInData; } if (!string.IsNullOrWhiteSpace(currDispData.newSignalData)) { - dataMonitor_1 = limitLine2show($"{currDispData.newSignalData}{Environment.NewLine}{dataMonitor_1}"); + //dataMonitor_1 = limitLine2show($"{currDispData.newSignalData}{Environment.NewLine}{dataMonitor_1}"); + dataMonitor_1 = currDispData.newSignalData; } if (!string.IsNullOrWhiteSpace(currDispData.newFLogData)) { - dataMonitor_3 = limitLine2show($"{currDispData.newFLogData}{Environment.NewLine}{dataMonitor_3}"); + //dataMonitor_3 = limitLine2show($"{currDispData.newFLogData}{Environment.NewLine}{dataMonitor_3}"); + dataMonitor_3 = currDispData.newFLogData; } if (!string.IsNullOrWhiteSpace(currDispData.newUrlCallData)) { - dataMonitor_2 = limitLine2show($"{currDispData.newUrlCallData}{Environment.NewLine}{dataMonitor_2}"); + //dataMonitor_2 = limitLine2show($"{currDispData.newUrlCallData}{Environment.NewLine}{dataMonitor_2}"); + dataMonitor_2 = currDispData.newUrlCallData; } // Bitmap lettura attuale @@ -887,17 +906,9 @@ namespace IOB_WIN_NEXT { this.UIThread(delegate { - lblOutMessage3.Text = text; + // accoda messaggio in gestione + dataMonitor_3 = text; }); - - //if (lblOutMessage3.InvokeRequired) - //{ - // var d = new SafeCallDelegate(WriteTextSafe); - // lblOutMessage3.Invoke(d, new object[] { text }); - //} - //else - //{ - //} } #endregion Public Methods @@ -934,6 +945,16 @@ namespace IOB_WIN_NEXT /// protected int normCount; + /// + /// Oggetto connessioen REDIS + /// + protected RedisIobCache redisMan = new RedisIobCache(); + + /// + /// Generatore numeri random + /// + protected Random rndGen = new Random(); + /// /// Contatore campionamento memoria /// @@ -998,7 +1019,7 @@ namespace IOB_WIN_NEXT /// /// array degli oggetti datamonitor da mostrare /// - protected Dictionary dMonValues { get; set; } = new Dictionary(); + protected Dictionary> dMonValues { get; set; } = new Dictionary>(); /// /// Veto a NUOVE scritture in COUNTER... @@ -1006,9 +1027,14 @@ namespace IOB_WIN_NEXT protected DateTime logCounterVeto { get; set; } = DateTime.Now; /// - /// Stringa corrente di log... + /// Lista String da mostrare quale TaskLog corrente... /// - protected string logWatchString { get; set; } = ""; + protected List logTaskString { get; set; } = new List(); + + /// + /// Lista String da mostrare quale WatchLog corrente... + /// + protected ConcurrentQueue logWatchString { get; set; } = new ConcurrentQueue(); /// /// Veto a NUOVE scritture in logWatch... @@ -1060,6 +1086,20 @@ namespace IOB_WIN_NEXT base.Dispose(disposing); } + /// + /// Effettua logging DEBUG corretto impostanto anche la variabile IOB prima di scrivere... + /// + /// + protected void lgDebug(string txt2log) + { + lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB; + lg.Debug(txt2log); + // salvo anche in logwatcher... + newDisplayData currDispData = new newDisplayData(); + currDispData.newLiveLogData = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} | INFO | {txt2log}"; + updateFormDisplay(currDispData); + } + /// /// Effettua logging ERROR corretto impostanto anche la variabile IOB prima di scrivere... /// @@ -1093,19 +1133,7 @@ namespace IOB_WIN_NEXT currDispData.newLiveLogData = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} | INFO | {txt2log}"; updateFormDisplay(currDispData); } - /// - /// Effettua logging DEBUG corretto impostanto anche la variabile IOB prima di scrivere... - /// - /// - protected void lgDebug(string txt2log) - { - lg.Factory.Configuration.Variables["codIOB"] = this.CurrIOB; - lg.Debug(txt2log); - // salvo anche in logwatcher... - newDisplayData currDispData = new newDisplayData(); - currDispData.newLiveLogData = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} | INFO | {txt2log}"; - updateFormDisplay(currDispData); - } + /// /// Effettua logging TRACE corretto impostanto anche la variabile IOB prima di scrivere... /// @@ -1478,7 +1506,7 @@ namespace IOB_WIN_NEXT for (int i = 0; i < 4; i++) { dMonDisplVetoVeto.Add(i, DateTime.Now); - dMonValues.Add(i, ""); + dMonValues.Add(i, new List()); } } @@ -1548,6 +1576,9 @@ namespace IOB_WIN_NEXT optPar = optParRead, versIOB = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), codIOB = fIni.ReadString("IOB", "IOB_NAME", CurrIOB), + disableExeTask = bool.Parse(fIni.ReadString("IOB", "DIS_EXE_TASK", "false")), + disableStateCh = bool.Parse(fIni.ReadString("IOB", "DIS_STATE_CH", "false")), + filenameIOB = CurrIOB, minDeltaSec = fIni.ReadInteger("IOB", "MinDeltaSec", 6), cncIpAddr = fIni.ReadString("CNC", "IP", "::1"), cncPort = fIni.ReadString("CNC", "PORT", "0"), @@ -1571,7 +1602,7 @@ namespace IOB_WIN_NEXT string dirPath = $"{path}\\DATA\\{IOBConf.serverData.ClientInstall}"; string fullPath = $"{dirPath}\\{fileName}"; // verifica directory - Directory.CreateDirectory(dirPath); + baseUtils.checkDir(dirPath); // salvataggio File.WriteAllText(fullPath, confJson); @@ -1651,6 +1682,11 @@ namespace IOB_WIN_NEXT start.Enabled = true; break; + case tipoAdapter.MODBUS_TCP_FIMAT: + iobObj = new IobModbusTCPFimat(this, IOBConf); + start.Enabled = true; + break; + case tipoAdapter.MODBUS_TCP_HAM: iobObj = new IobModbusTCPHam(this, IOBConf); start.Enabled = true; @@ -1661,11 +1697,16 @@ namespace IOB_WIN_NEXT start.Enabled = true; break; - case tipoAdapter.MODBUS_TCP_IMAX_AEROMEC: + case tipoAdapter.MODBUS_TCP_IMAS_AEROMEC: iobObj = new IobModbusTCPImaxAeromec(this, IOBConf); start.Enabled = true; break; + case tipoAdapter.MODBUS_TCP_RIMOR: + iobObj = new IobModbusTCPRimor(this, IOBConf); + start.Enabled = true; + break; + case tipoAdapter.MODBUS_TCP_SAIM: iobObj = new IobModbusTCPSaim(this, IOBConf); start.Enabled = true; @@ -1717,6 +1758,11 @@ namespace IOB_WIN_NEXT start.Enabled = true; break; + case tipoAdapter.OpcUaImasAeromec: + iobObj = new IobOpcUaImas(this, IOBConf); + start.Enabled = true; + break; + case tipoAdapter.OpcUaMBH: iobObj = new IobOpcUaMBH(this, IOBConf); start.Enabled = true; @@ -1840,6 +1886,16 @@ namespace IOB_WIN_NEXT start.Enabled = true; break; + case tipoAdapter.SQLSERVER_LANTEK: + iobObj = new IobSqlServLantek(this, IOBConf); + start.Enabled = true; + break; + + case tipoAdapter.SQLSERVER_PAMA: + iobObj = new IobSqlServPama(this, IOBConf); + start.Enabled = true; + break; + case tipoAdapter.WPS: iobObj = new IobWPS(this, IOBConf); start.Enabled = true; @@ -1960,11 +2016,12 @@ namespace IOB_WIN_NEXT Dictionary setPar = new Dictionary(); setPar.Add("IP", iobObj.cIobConf.cncIpAddr); setPar.Add("PORT", iobObj.cIobConf.cncPort); - string note = $"DT ultimo avvio: {iobObj.dtAvvioAdp}"; + string note = $"{iobObj.cIobConf.codIOB} | DT ultimo avvio: {iobObj.dtAvvioAdp}"; // verifico IOB status IobWinStatus currIobStatus = new IobWinStatus() { - CodIob = iobObj.cIobConf.codIOB, + //CodIob = iobObj.cIobConf.codIOB, + CodIob = iobObj.cIobConf.filenameIOB, IobType = iobObj.cIobConf.tipoIob.ToString(), queueAlLen = alQueueLen, queueEvLen = evQueueLen, diff --git a/IOB-WIN-NEXT/App.config b/IOB-WIN-NEXT/App.config index b9be1b5c..9f401684 100644 --- a/IOB-WIN-NEXT/App.config +++ b/IOB-WIN-NEXT/App.config @@ -95,6 +95,7 @@ + @@ -132,6 +133,10 @@ + + + + diff --git a/IOB-WIN-NEXT/DATA/CONF/3026-MBus.ini b/IOB-WIN-NEXT/DATA/CONF/3026-MBus.ini new file mode 100644 index 00000000..5eb3be65 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/3026-MBus.ini @@ -0,0 +1,78 @@ +;Configurazione IOB-WIN +[IOB] +;Impianto IMAX Aeromec - Jetco (non va, sostituito con OPC-UA) +CNCTYPE=MODBUS_TCP_IMAX_AEROMEC +PING_MS_TIMEOUT=1000 +MinDeltaSec=5 + +[MACHINE] +VENDOR=IMAX +MODEL=Filtro Aria + +[CNC] +IP=192.168.0.80 +PORT=502 + +[SERVER] +MPIP=http://192.168.1.7 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= + +[MEMORY] +ADDR_READ=40001 +ADDR_WRITE=40001 +SIZE_READ=30 +SIZE_WRITE=0 +HR_BASE_ADDR=40000 +DELTA_BASE=0 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice +PZCOUNT_MODE=STD.DB85.DBRE16 +DISABLE_PZCOUNT=TRUE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +; GEST DATI DYN +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +; gestione delta minimo accettabile tra min/MAX +DELTA_VAL=0.1 + +; clock base (da 10ms) +timerIntMs=10 + +; conf parametri memoria READ/WRITE +PARAM_CONF=3026.json + +NO_PING=FALSE +; conf blocchi memoria x READ +MEM_BLOCK=3026_MBlock.json +; conf aree allarme +ALARM_CONF=3026_alarm.json + +; rimozione check limiti min/max dynData +disDynDataRangeCheck=true + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/3026-MBus.json b/IOB-WIN-NEXT/DATA/CONF/3026-MBus.json new file mode 100644 index 00000000..2ecd5729 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/3026-MBus.json @@ -0,0 +1,110 @@ +{ + "mMapWrite": { + + }, + "mMapRead": { + //"StatusWord": { + // "name": "StatusWord", + // "description": "Word di Status", + // "memAddr": "40002", + // "tipoMem": "Int", + // "index": 2, + // "size": 1, + // "func": "POINT", + // "period": 90, + // "factor": 1, + // "minVal": 0, + // "maxVal": 65536, + // "unit": "BMap" + //}, + //"StatusDetWord": { + // "name": "StatusDetWord", + // "description": "Word di Status", + // "memAddr": "40005", + // "tipoMem": "Int", + // "index": 5, + // "size": 1, + // "func": "POINT", + // "period": 90, + // "factor": 1, + // "minVal": 0, + // "maxVal": 65536, + // "unit": "BMap" + //}, + "FreqInverter": { + "name": "FreqInverter", + "description": "Frequenza Inverter", + "memAddr": "40011", + "tipoMem": "Real", + "index": 11, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999999, + "unit": "Hz" + }, + "CDOreManuten": { + "name": "CDOreManuten", + "description": "Residuo ore a prossimo service", + "memAddr": "40013", + "tipoMem": "Int", + "index": 13, + "size": 1, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999999, + "unit": "h" + }, + "COreTAsp1": { + "name": "COreTAsp1", + "description": "Totale ore funzionamento impianto", + "memAddr": "40014", + "tipoMem": "Int", + "index": 14, + "size": 1, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999999, + "unit": "h" + }, + "COrePAsp1": { + "name": "COrePAsp1", + "description": "Parziale ore funzionamento impianto da ultimo service", + "memAddr": "40015", + "tipoMem": "Int", + "index": 15, + "size": 1, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999999, + "unit": "h" + }, + "AmpereReale": { + "name": "AmpereReale", + "description": "Assorbimento aspiratore 1", + "memAddr": "40016", + "tipoMem": "Real", + "index": 16, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999999, + "unit": "A" + } + }, + "optMemPar": { + "AutoBitCond": "40002.14=1", + "EStopBitCond": "40002.9=0", + "WorkBitCond": "40002.0=1" + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/3026_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/3026-MBus_MBlock.json similarity index 100% rename from IOB-WIN-NEXT/DATA/CONF/3026_MBlock.json rename to IOB-WIN-NEXT/DATA/CONF/3026-MBus_MBlock.json diff --git a/IOB-WIN-NEXT/DATA/CONF/3026_alarm.json b/IOB-WIN-NEXT/DATA/CONF/3026-MBus_alarm.json similarity index 100% rename from IOB-WIN-NEXT/DATA/CONF/3026_alarm.json rename to IOB-WIN-NEXT/DATA/CONF/3026-MBus_alarm.json diff --git a/IOB-WIN-NEXT/DATA/CONF/3026.ini b/IOB-WIN-NEXT/DATA/CONF/3026.ini index 93d60e70..958f8672 100644 --- a/IOB-WIN-NEXT/DATA/CONF/3026.ini +++ b/IOB-WIN-NEXT/DATA/CONF/3026.ini @@ -1,8 +1,8 @@ ;Configurazione IOB-WIN [IOB] -;Impianto Cedax di Turi (test) - Giacovelli -CNCTYPE=MODBUS_TCP_IMAX_AEROMEC -PING_MS_TIMEOUT=1000 +;Impianto IMAS AEROMEC Jetco +CNCTYPE=OpcUaImasAeromec +PING_MS_TIMEOUT=500 MinDeltaSec=5 [MACHINE] @@ -11,7 +11,8 @@ MODEL=Filtro Aria [CNC] IP=192.168.0.80 -PORT=502 +PORT=4840 +;GETPRGNAME=true [SERVER] MPIP=http://192.168.1.7 @@ -28,9 +29,6 @@ ADDR_READ=40001 ADDR_WRITE=40001 SIZE_READ=30 SIZE_WRITE=0 -HR_BASE_ADDR=40000 -DELTA_BASE=0 - [BLINK] ;MAX_COUNTER_BLINK = 30 @@ -47,8 +45,10 @@ BLINK_FILT=0 ;BLINK_FILT=28 [OPTPAR] +AUTO_CHANGE_ODL=TRUE +CHANGE_ODL_MODE=DAILY ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice -PZCOUNT_MODE=STD.DB85.DBRE16 +PZCOUNT_MODE=OPC DISABLE_PZCOUNT=TRUE ENABLE_SEND_PZC_BLOCK=TRUE MIN_SEND_PZC_BLOCK=0 @@ -56,23 +56,16 @@ MAX_SEND_PZC_BLOCK=100 ; GEST DATI DYN ENABLE_DYN_DATA=TRUE FORCE_DYN_DATA=TRUE +ENABLE_DATA_FILTER=TRUE +ENABLE_CLI_RESTART=TRUE ; gestione delta minimo accettabile tra min/MAX -DELTA_VAL=0.1 +DELTA_VAL=0 ; clock base (da 10ms) timerIntMs=10 ; conf parametri memoria READ/WRITE -PARAM_CONF=3026.json - -NO_PING=FALSE -; conf blocchi memoria x READ -MEM_BLOCK=3026_MBlock.json -; conf aree allarme -ALARM_CONF=3026_alarm.json - -; rimozione check limiti min/max dynData -disDynDataRangeCheck=true +OPC_PARAM_CONF=3026.json [BRANCH] NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/3026.json b/IOB-WIN-NEXT/DATA/CONF/3026.json index 2ecd5729..06048b2c 100644 --- a/IOB-WIN-NEXT/DATA/CONF/3026.json +++ b/IOB-WIN-NEXT/DATA/CONF/3026.json @@ -1,110 +1,154 @@ { + "BrowseFullVal": "i=85", + "BrowseNSIndex": 4, + "BrowseValue": 5001, + "keyPartCount": "", + "keyPartReq": "", + "keyPartId": "", + "keyProgName": "", + "keyExeMode": "", + "keyRunMode": "", + "runModeSend": true, + "pingAsPowerOn": true, + "forcePingOk": false, + "translRunMode": true, + "Identity": { + "UserName": "IMAS", + "Passwd": "iM@s_1975" + }, + "condWork": [], + "condWorkOpc": { + "checkMode": "OR", + "checkList": [ + { + "keyName": "ASPIRATORE 1 IN FUNZIONE", + "targetValue": "True" + } + ] + }, + "condPowerOn": { + "checkMode": "OR", + "negateValue": false, + "checkList": [] + }, + "condReady": { + "checkMode": "OR", + "checkList": [ + { + "keyName": "GENERICO RUN IMPIANTO", + "targetValue": "5" + } + ] + }, + "condManual": { + "checkMode": "OR", + "checkList": [ + { + "keyName": "SCARICO DIRETTO ABILITATO", + "targetValue": "True" + }, + { + "keyName": "SCARICO IN CALDAIA ABILITATO", + "targetValue": "True" + }, + { + "keyName": "SCARICO IN CONTAINER ABILITATO", + "targetValue": "True" + } + ] + }, + "condEStop": { + "checkMode": "AND", + "checkList": [ + { + "keyName": "PULSANTE DI EMERGENZA PREMUTO", + "targetValue": "False" + } + ] + }, + "condError": { + "checkMode": "OR", + "checkList": [ + { + "keyName": "CUMULATIVO ALLARMI BLOCCANTI SICUREZZE", + "targetValue": "True" + }, + { + "keyName": "CUMULATIVO ALLARMI IMPIANTO ASPIRAZIONE", + "targetValue": "True" + } + ] + }, + "condCountEnabled": { + "checkMode": "AND", + "checkList": [] + }, + "condWarmUpCoolDown": { + "checkMode": "OR", + "negateValue": true, + "checkList": [] + }, + "condWarning": { + "checkMode": "AND", + "checkList": [] + }, + "condSetup": { + "checkMode": "AND", + "checkList": [] + }, + "fluxLogVeto": [ + "Auditing", + "EnabledFlag", + "RedundancySupport", + "LocaleIdArray", + "MaxBrowseContinuationPoints", + "MaxHistoryContinuationPoints", + "MaxMonitoredItemsPerCall", + "MaxNodesPerBrowse", + "MaxNodesPerMethodCall", + "MaxNodesPerNodeManagement", + "MaxNodesPerRegisterNodes", + "MaxNodesPerRead", + "MaxNodesPerTranslateBrowsePathsToNodeIds", + "MaxNodesPerWrite", + "MaxQueryContinuationPoints", + "MinSupportedSampleRate", + "NamespaceArray", + "NamingRule", + "Server", + "ServerArray", + "ServerDiagnostics", + "ServerDiagnosticsSummary", + "ServerProfileArray", + "ServerStatus", + "ServiceLevel", + "SoftwareCertificates" + ], + "itemTranslation": { + "fdovrd": "PATH FEED OVERRIDE", + "rovrd": "PATH RAPID OVERRIDE", + "RunMode_0": "STOP", + "RunMode_1": "RUN", + "SCARICO DIRETTO ABILITATO": "SCARICO DIRETTO ABILITATO", + "rstat": "Execution Mode", + "mode": "Controller Mode", + "PartName(0)": "Program Name", + "PartDone(0)": "Pezzi Prodotti", + "PartToDo(0)": "Qta Richiesta", + "MachineStatus(0)": "Stato Macchina principale", + "MachineStatus(1)": "Stato Macchina secondario", + "EmergencyState": "Emergenza" + }, "mMapWrite": { - }, - "mMapRead": { - //"StatusWord": { - // "name": "StatusWord", - // "description": "Word di Status", - // "memAddr": "40002", - // "tipoMem": "Int", - // "index": 2, - // "size": 1, - // "func": "POINT", - // "period": 90, - // "factor": 1, - // "minVal": 0, - // "maxVal": 65536, - // "unit": "BMap" - //}, - //"StatusDetWord": { - // "name": "StatusDetWord", - // "description": "Word di Status", - // "memAddr": "40005", - // "tipoMem": "Int", - // "index": 5, - // "size": 1, - // "func": "POINT", - // "period": 90, - // "factor": 1, - // "minVal": 0, - // "maxVal": 65536, - // "unit": "BMap" - //}, - "FreqInverter": { - "name": "FreqInverter", - "description": "Frequenza Inverter", - "memAddr": "40011", - "tipoMem": "Real", - "index": 11, - "size": 2, - "func": "MEDIAN", - "period": 90, - "factor": 1, - "minVal": 0, - "maxVal": 999999999, - "unit": "Hz" - }, - "CDOreManuten": { - "name": "CDOreManuten", - "description": "Residuo ore a prossimo service", - "memAddr": "40013", - "tipoMem": "Int", - "index": 13, - "size": 1, - "func": "MEDIAN", - "period": 90, - "factor": 1, - "minVal": 0, - "maxVal": 999999999, - "unit": "h" - }, - "COreTAsp1": { - "name": "COreTAsp1", - "description": "Totale ore funzionamento impianto", - "memAddr": "40014", - "tipoMem": "Int", - "index": 14, - "size": 1, - "func": "MEDIAN", - "period": 90, - "factor": 1, - "minVal": 0, - "maxVal": 999999999, - "unit": "h" - }, - "COrePAsp1": { - "name": "COrePAsp1", - "description": "Parziale ore funzionamento impianto da ultimo service", - "memAddr": "40015", - "tipoMem": "Int", - "index": 15, - "size": 1, - "func": "MEDIAN", - "period": 90, - "factor": 1, - "minVal": 0, - "maxVal": 999999999, - "unit": "h" - }, - "AmpereReale": { - "name": "AmpereReale", - "description": "Assorbimento aspiratore 1", - "memAddr": "40016", - "tipoMem": "Real", - "index": 16, - "size": 2, - "func": "MEDIAN", - "period": 90, - "factor": 1, - "minVal": 0, - "maxVal": 999999999, - "unit": "A" - } + "subscribedItems": [ + ], + "WatchDog": { + "IsEnabled": false, + "MemConfRead": "ns=4;s=tomes_1_Watchdog", + "MemConfWrite": "ns=4;s=tomach_1_watchdog", + "MaxVal": 9999 }, - "optMemPar": { - "AutoBitCond": "40002.14=1", - "EStopBitCond": "40002.9=0", - "WorkBitCond": "40002.0=1" + "fluxLogKeyValVeto": { } } \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/BAGLIETTO_CIMOLAI_01.ini b/IOB-WIN-NEXT/DATA/CONF/BAGLIETTO_CIMOLAI_01.ini index 9cda4d7e..1686a423 100644 --- a/IOB-WIN-NEXT/DATA/CONF/BAGLIETTO_CIMOLAI_01.ini +++ b/IOB-WIN-NEXT/DATA/CONF/BAGLIETTO_CIMOLAI_01.ini @@ -58,6 +58,7 @@ ENABLE_DYN_DATA=FALSE FORCE_DYN_DATA=TRUE ENABLE_DATA_FILTER=TRUE ENABLE_CLI_RESTART=TRUE +MAX_ELAPSED_TIME_SEC=60 MAX_TRY_PING=3 DISABLE_SEND_WDST=TRUE FTP_SERVER=192.168.60.234 diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_001.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_001.json index 695de403..407b38d5 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_001.json +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_001.json @@ -7,7 +7,7 @@ "tipoMem": "Int", "index": 31, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -19,7 +19,127 @@ "tipoMem": "Int", "index": 32, "size": 1, - "factor": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C2": { + "name": "PPM_min_C2", + "description": "PPM min Camera 2", + "memAddr": "40033", + "tipoMem": "Int", + "index": 33, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C2": { + "name": "PPM_max_C2", + "description": "PPM MAX Camera 2", + "memAddr": "40034", + "tipoMem": "Int", + "index": 34, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C3": { + "name": "PPM_min_C3", + "description": "PPM min Camera 3", + "memAddr": "40035", + "tipoMem": "Int", + "index": 35, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C3": { + "name": "PPM_max_C3", + "description": "PPM MAX Camera 3", + "memAddr": "40036", + "tipoMem": "Int", + "index": 36, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C4": { + "name": "PPM_min_C4", + "description": "PPM min Camera 4", + "memAddr": "40037", + "tipoMem": "Int", + "index": 37, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C4": { + "name": "PPM_max_C4", + "description": "PPM MAX Camera 4", + "memAddr": "40038", + "tipoMem": "Int", + "index": 38, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C5": { + "name": "PPM_min_C5", + "description": "PPM min Camera 5", + "memAddr": "40039", + "tipoMem": "Int", + "index": 39, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C5": { + "name": "PPM_max_C5", + "description": "PPM MAX Camera 5", + "memAddr": "40040", + "tipoMem": "Int", + "index": 40, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C6": { + "name": "PPM_min_C6", + "description": "PPM min Camera 6", + "memAddr": "40041", + "tipoMem": "Int", + "index": 41, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C6": { + "name": "PPM_max_C6", + "description": "PPM MAX Camera 6", + "memAddr": "40042", + "tipoMem": "Int", + "index": 42, + "size": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -33,7 +153,7 @@ "tipoMem": "Int", "index": 31, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -45,7 +165,7 @@ "tipoMem": "Int", "index": 32, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -57,7 +177,7 @@ "tipoMem": "Int", "index": 33, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -69,7 +189,7 @@ "tipoMem": "Int", "index": 34, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -79,9 +199,9 @@ "description": "PPM min Camera 3", "memAddr": "40035", "tipoMem": "Int", - "index": 33, + "index": 35, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -91,9 +211,9 @@ "description": "PPM MAX Camera 3", "memAddr": "40036", "tipoMem": "Int", - "index": 34, + "index": 36, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -103,9 +223,9 @@ "description": "PPM min Camera 4", "memAddr": "40037", "tipoMem": "Int", - "index": 33, + "index": 37, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -115,9 +235,9 @@ "description": "PPM MAX Camera 4", "memAddr": "40038", "tipoMem": "Int", - "index": 34, + "index": 38, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -127,9 +247,9 @@ "description": "PPM min Camera 5", "memAddr": "40039", "tipoMem": "Int", - "index": 33, + "index": 39, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -139,9 +259,9 @@ "description": "PPM MAX Camera 5", "memAddr": "40040", "tipoMem": "Int", - "index": 34, + "index": 40, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -151,9 +271,9 @@ "description": "PPM min Camera 6", "memAddr": "40041", "tipoMem": "Int", - "index": 33, + "index": 41, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -163,9 +283,9 @@ "description": "PPM MAX Camera 6", "memAddr": "40042", "tipoMem": "Int", - "index": 34, + "index": 42, "size": 1, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 1000, "unit": "PPM" @@ -179,7 +299,7 @@ "size": 1, "func": "MAX", "period": 90, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 999999999, "unit": "#" @@ -193,7 +313,7 @@ "size": 1, "func": "MAX", "period": 90, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 999999999, "unit": "#" @@ -207,7 +327,7 @@ "size": 1, "func": "MAX", "period": 90, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 999999999, "unit": "#" @@ -221,7 +341,7 @@ "size": 1, "func": "MAX", "period": 90, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 999999999, "unit": "#" @@ -235,7 +355,7 @@ "size": 1, "func": "MAX", "period": 90, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 999999999, "unit": "#" @@ -249,7 +369,7 @@ "size": 1, "func": "MAX", "period": 90, - "factor": 1, + "factor": 0.01, "minVal": 0, "maxVal": 999999999, "unit": "#" @@ -452,7 +572,7 @@ } }, "optMemPar": { - "AlarmBitCond": "10002.0=0", + "AlarmBitCond": "10002.0=1", "WorkBitCond": "10001.0=1" }, "fileDecod": { diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_002.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_002.json index 4334e11e..ef941e5d 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_002.json +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_002.json @@ -23,6 +23,78 @@ "minVal": 0, "maxVal": 1000, "unit": "PPM" + }, + "PPM_min_C2": { + "name": "PPM_min_C2", + "description": "PPM min Camera 2", + "memAddr": "40033", + "tipoMem": "Int", + "index": 33, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C2": { + "name": "PPM_max_C2", + "description": "PPM MAX Camera 2", + "memAddr": "40034", + "tipoMem": "Int", + "index": 34, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C3": { + "name": "PPM_min_C3", + "description": "PPM min Camera 3", + "memAddr": "40035", + "tipoMem": "Int", + "index": 35, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C3": { + "name": "PPM_max_C3", + "description": "PPM MAX Camera 3", + "memAddr": "40036", + "tipoMem": "Int", + "index": 36, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C4": { + "name": "PPM_min_C4", + "description": "PPM min Camera 4", + "memAddr": "40037", + "tipoMem": "Int", + "index": 37, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C4": { + "name": "PPM_max_C4", + "description": "PPM MAX Camera 4", + "memAddr": "40038", + "tipoMem": "Int", + "index": 38, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" } }, "mMapRead": { @@ -79,7 +151,7 @@ "description": "PPM min Camera 3", "memAddr": "40035", "tipoMem": "Int", - "index": 33, + "index": 35, "size": 1, "factor": 0.01, "minVal": 0, @@ -91,7 +163,7 @@ "description": "PPM MAX Camera 3", "memAddr": "40036", "tipoMem": "Int", - "index": 34, + "index": 36, "size": 1, "factor": 0.01, "minVal": 0, @@ -103,7 +175,7 @@ "description": "PPM min Camera 4", "memAddr": "40037", "tipoMem": "Int", - "index": 33, + "index": 37, "size": 1, "factor": 0.01, "minVal": 0, @@ -115,7 +187,7 @@ "description": "PPM MAX Camera 4", "memAddr": "40038", "tipoMem": "Int", - "index": 34, + "index": 38, "size": 1, "factor": 0.01, "minVal": 0, @@ -178,7 +250,6 @@ "maxVal": 999999999, "unit": "#" }, - "Amper01": { "name": "Amper01", "description": "Amper 01", @@ -235,7 +306,6 @@ "maxVal": 999999999, "unit": "#" }, - "ContCam01": { "name": "ContCam01", "description": "Cont Camera 01", @@ -294,7 +364,7 @@ } }, "optMemPar": { - "AlarmBitCond": "10002.0=0", + "AlarmBitCond": "10002.0=1", "WorkBitCond": "10001.0=1" }, "fileDecod": { diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_002_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_002_MBlock.json index cb278e47..23840ac9 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_002_MBlock.json +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_002_MBlock.json @@ -1,9 +1,9 @@ { - "ReadBlocks": { - "10000": 10, - "10100": 10, - "30010": 20, - "30100": 50, - "40030": 10 - } + "ReadBlocks": { + "10000": 10, + "10100": 10, + "30000": 30, + "30100": 50, + "40030": 10 + } } \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_003.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_003.ini index 65f2c8dd..e33f8813 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_003.ini +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_003.ini @@ -10,8 +10,7 @@ VENDOR=SAIM MODEL=Trattamento Ozono [CNC] -IP=192.168.18.12 -;IP=192.168.18.10 +IP=192.168.18.10 PORT=502 [SERVER] @@ -83,7 +82,7 @@ disDynDataRangeCheck=true ; conf file import FILE_IMPORT_FOLDER=C:\GiacenzeLocorotondo FILE_IMPORT_TYPE=*.xlsx -FILE_ARCHIVE_FOLDER=C:\GiacenzeLocorotondo\archivio +FILE_ARCHIVE_FOLDER=C:\GiacenzeLocorotondo\SAIM002 [BRANCH] NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_003.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_003.json index 74acefa7..38e260fe 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_003.json +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_SAIM_003.json @@ -23,6 +23,126 @@ "minVal": 0, "maxVal": 1000, "unit": "PPM" + }, + "PPM_min_C2": { + "name": "PPM_min_C2", + "description": "PPM min Camera 2", + "memAddr": "40033", + "tipoMem": "Int", + "index": 33, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C2": { + "name": "PPM_max_C2", + "description": "PPM MAX Camera 2", + "memAddr": "40034", + "tipoMem": "Int", + "index": 34, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C3": { + "name": "PPM_min_C3", + "description": "PPM min Camera 3", + "memAddr": "40035", + "tipoMem": "Int", + "index": 35, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C3": { + "name": "PPM_max_C3", + "description": "PPM MAX Camera 3", + "memAddr": "40036", + "tipoMem": "Int", + "index": 36, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C4": { + "name": "PPM_min_C4", + "description": "PPM min Camera 4", + "memAddr": "40037", + "tipoMem": "Int", + "index": 37, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C4": { + "name": "PPM_max_C4", + "description": "PPM MAX Camera 4", + "memAddr": "40038", + "tipoMem": "Int", + "index": 38, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C5": { + "name": "PPM_min_C5", + "description": "PPM min Camera 5", + "memAddr": "40039", + "tipoMem": "Int", + "index": 39, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C5": { + "name": "PPM_max_C5", + "description": "PPM MAX Camera 5", + "memAddr": "40040", + "tipoMem": "Int", + "index": 40, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_min_C6": { + "name": "PPM_min_C6", + "description": "PPM min Camera 6", + "memAddr": "40041", + "tipoMem": "Int", + "index": 41, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" + }, + "PPM_max_C6": { + "name": "PPM_max_C6", + "description": "PPM MAX Camera 6", + "memAddr": "40042", + "tipoMem": "Int", + "index": 42, + "size": 1, + "factor": 0.01, + "minVal": 0, + "maxVal": 1000, + "unit": "PPM" } }, "mMapRead": { @@ -79,7 +199,7 @@ "description": "PPM min Camera 3", "memAddr": "40035", "tipoMem": "Int", - "index": 33, + "index": 35, "size": 1, "factor": 0.01, "minVal": 0, @@ -91,7 +211,7 @@ "description": "PPM MAX Camera 3", "memAddr": "40036", "tipoMem": "Int", - "index": 34, + "index": 36, "size": 1, "factor": 0.01, "minVal": 0, @@ -103,7 +223,7 @@ "description": "PPM min Camera 4", "memAddr": "40037", "tipoMem": "Int", - "index": 33, + "index": 37, "size": 1, "factor": 0.01, "minVal": 0, @@ -115,7 +235,7 @@ "description": "PPM MAX Camera 4", "memAddr": "40038", "tipoMem": "Int", - "index": 34, + "index": 38, "size": 1, "factor": 0.01, "minVal": 0, @@ -127,7 +247,7 @@ "description": "PPM min Camera 5", "memAddr": "40039", "tipoMem": "Int", - "index": 33, + "index": 39, "size": 1, "factor": 0.01, "minVal": 0, @@ -139,7 +259,7 @@ "description": "PPM MAX Camera 5", "memAddr": "40040", "tipoMem": "Int", - "index": 34, + "index": 40, "size": 1, "factor": 0.01, "minVal": 0, @@ -151,7 +271,7 @@ "description": "PPM min Camera 6", "memAddr": "40041", "tipoMem": "Int", - "index": 33, + "index": 41, "size": 1, "factor": 0.01, "minVal": 0, @@ -163,7 +283,7 @@ "description": "PPM MAX Camera 6", "memAddr": "40042", "tipoMem": "Int", - "index": 34, + "index": 42, "size": 1, "factor": 0.01, "minVal": 0, diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ULMA_001.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_ULMA_001.ini index 5c26dbb6..5b4032d1 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_ULMA_001.ini +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ULMA_001.ini @@ -1,6 +1,6 @@ ;Configurazione IOB-WIN [IOB] -;Centro di lavoro OpcUa +;impianto ULMA Giacovelli CNCTYPE=OpcUaUlma PING_MS_TIMEOUT=500 MinDeltaSec=5 @@ -29,12 +29,6 @@ ADDR_READ=DB9999.DBB0 ADDR_WRITE=DB9999.DBB0 SIZE_READ=0 SIZE_WRITE=0 -;BIT0=CONN -;BIT1=DB60.DBB1 -;BIT2=PZCOUNT.STD.DB700.DBW22 -;BIT3=DB60.DBB3 -;BIT4=DB60.DBB4 - [BLINK] ;MAX_COUNTER_BLINK = 30 diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_50.json b/IOB-WIN-NEXT/DATA/CONF/IMI_50.json index 1b7a7d44..bbd20cb9 100644 --- a/IOB-WIN-NEXT/DATA/CONF/IMI_50.json +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_50.json @@ -5,11 +5,11 @@ "keyProgName": "Path_01_CurrProg", "keyRunMode": "Path_01_RUN_MODE", "pingAsPowerOn": true, - "condPowerOn": - { - "keyName": "POWER", - "targetValue": "OK" - }, + "emergencyArmedTrue": false, + "condPowerOn": { + "keyName": "POWER", + "targetValue": "OK" + }, "condWork": [ { "keyName": "Path_01_EXE_MODE", diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_PAMA_392.ini b/IOB-WIN-NEXT/DATA/CONF/IMI_PAMA_392.ini new file mode 100644 index 00000000..a37620f4 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_PAMA_392.ini @@ -0,0 +1,84 @@ +;Configurazione IOB-WIN +[IOB] +;Accesso gestione sync DB x sync PAMA --> MoonPro_IOB_ISF --> Chiamate REST +CNCTYPE=SQLSERVER_PAMA +PING_MS_TIMEOUT=500 +MinDeltaSec=5 + +[MACHINE] +VENDOR=PAMA +MODEL=Alesatrice 392 + +[CNC] +IP=127.0.0.1 +PORT=1443 +GETPRGNAME=false + +[SERVER] +MPIP=http://192.168.0.110 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= +CMDRAWTRANSF=/IOB/rawTransfJson/ + +[MEMORY] +ADDR_READ=DB9999.DBB0 +ADDR_WRITE=DB9999.DBB0 +SIZE_READ=0 +SIZE_WRITE=0 +;BIT0=CONN +;BIT1=DB60.DBB1 +;BIT2=PZCOUNT.STD.DB700.DBW22 +;BIT3=DB60.DBB3 +;BIT4=DB60.DBB4 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +AUTO_CHANGE_ODL=false +CHANGE_ODL_MODE=TIME +CHANGE_ODL_HOURS=24 +CHANGE_ODL_IDLE_MIN=5 +PZCOUNT_MODE=PAMA +DISABLE_PZCOUNT=FALSE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +DEM_FACT_DYN_DATA=5 +ENABLE_DATA_FILTER=TRUE +ENABLE_CLI_RESTART=TRUE +SyncStateServer=308SERVER60\LANTEK +SyncStateDb=MoonPro_IOB_ISF_PAMA +SyncStateUser=steamware +SyncStatePwd=viadante16 +SyncStateCTout= +VetoReadSec=2 +VetoSyncSec=10 + +; clock base (da 10ms) +timerIntMs=20 + +; conf parametri memoria READ/WRITE +PARAM_CONF=IMI_PAMA_392.json + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_PAMA_392.json b/IOB-WIN-NEXT/DATA/CONF/IMI_PAMA_392.json new file mode 100644 index 00000000..898e2595 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_PAMA_392.json @@ -0,0 +1,29 @@ +{ + "mMapWrite": { + + }, + "mMapRead": { + //"TotMerceProcTonn": { + // "name": "TotMerceProcTonn", + // "description": "Totale merce processata oggi su impianto (Tonn)", + // "memAddr": "TotMerceProcTonn", + // "tipoMem": "Real", + // "index": 0, + // "size": 0, + // "func": "MAX", + // "period": 60, + // "factor": 1 + //}, + //"TotMerceCaricTonn": { + // "name": "TotMerceCaricTonn", + // "description": "Totale merce caricata oggi su impianto (Tonn)", + // "memAddr": "TotMerceCaricTonn", + // "tipoMem": "Real", + // "index": 0, + // "size": 0, + // "func": "MAX", + // "period": 60, + // "factor": 1 + //} + } +} diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01.ini b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01.ini new file mode 100644 index 00000000..7c050d85 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01.ini @@ -0,0 +1,82 @@ +;Configurazione IOB-WIN +[IOB] +;Impianto Rimor sabbiatura - IMI Remosa +CNCTYPE=MODBUS_TCP_RIMOR +PING_MS_TIMEOUT=1000 +MinDeltaSec=5 +IOB_NAME=IMI_RIMOR_SAB +DIS_EXE_TASK=FALSE +DIS_STATE_CH=FALSE + +[MACHINE] +VENDOR=RIMOR +MODEL=Sabbiatura - PLC + +[CNC] +IP=192.168.10.5 +PORT=502 + +[SERVER] +MPIP=http://192.168.0.110 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= + +[MEMORY] +ADDR_READ=400000 +ADDR_WRITE=400000 +SIZE_READ=10 +SIZE_WRITE=0 +HR_BASE_ADDR=400000 +DELTA_BASE=-1 +MODBUS_EXT_REG=1 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice +PZCOUNT_MODE=STD.DB85.DBRE16 +DISABLE_PZCOUNT=TRUE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +; GEST DATI DYN +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +; gestione delta minimo accettabile tra min/MAX +DELTA_VAL=0.1 + +; clock base (da 10ms) +timerIntMs=10 + +; conf parametri memoria READ/WRITE +PARAM_CONF=IMI_RIMOR_SAB_01.json + +NO_PING=FALSE +; conf blocchi memoria x READ +MEM_BLOCK=IMI_RIMOR_SAB_01_MBlock.json +; conf aree allarme +ALARM_CONF=IMI_RIMOR_SAB_01_alarm.json + +; rimozione check limiti min/max dynData +disDynDataRangeCheck=true + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01.json new file mode 100644 index 00000000..83205204 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01.json @@ -0,0 +1,217 @@ +{ + "mMapWrite": { + "setProg": { + "name": "setProg", + "description": "Qty", + "memAddr": "421006", + "tipoMem": "Int", + "index": 21006, + "size": 1 + } + }, + "mMapRead": { + "StatoLavorazione": { + "name": "01) StatoLavorazione", + "description": "Stato Lavorazione", + "memAddr": "421004", + "tipoMem": "Int", + "index": 21004, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "#" + }, + "DurataLavorazione": { + "name": "02) DurataLavorazione", + "description": "Durata Lavorazione", + "memAddr": "421002", + "tipoMem": "Int", + "index": 21002, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h/m" + }, + "OreFunzFiltro1": { + "name": "OreFunzFiltro1", + "description": "03) Filtro 1 Ore funzionamento", + "memAddr": "420201", + "tipoMem": "Int", + "index": 20201, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzFiltro1": { + "name": "MinFunzFiltro1", + "description": "04) Filtro 1 Minuti funzionamento", + "memAddr": "420205", + "tipoMem": "Int", + "index": 20205, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzFiltroPar1": { + "name": "OreFunzFiltroPar1", + "description": "Filtro 1 (c) Ore funzionamento (contatore parziale azzerabile)", + "memAddr": "420203", + "tipoMem": "Int", + "index": 20203, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzFiltroPar1": { + "name": "MinFunzFiltroPar1", + "description": "Filtro 1 (d) Minuti funzionamento (contatore parziale azzerabile)", + "memAddr": "420206", + "tipoMem": "Int", + "index": 20206, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzFiltro2": { + "name": "OreFunzFiltro2", + "description": "Filtro 2 (a) Ore funzionamento ", + "memAddr": "420301", + "tipoMem": "Int", + "index": 20301, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzFiltro2": { + "name": "MinFunzFiltro2", + "description": "Filtro 2 (b) Minuti funzionamento", + "memAddr": "420305", + "tipoMem": "Int", + "index": 20305, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzFiltroPar2": { + "name": "OreFunzFiltroPar2", + "description": "Filtro 2 (c) Ore funzionamento (contatore parziale azzerabile)", + "memAddr": "420303", + "tipoMem": "Int", + "index": 20303, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzFiltroPar2": { + "name": "MinFunzFiltroPar2", + "description": "Filtro 2 (d) Minuti funzionamento (contatore parziale azzerabile)", + "memAddr": "420306", + "tipoMem": "Int", + "index": 20306, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzAspiratore": { + "name": "OreFunzAspiratore", + "description": "Aspiratore (a) Ore funzionamento", + "memAddr": "420401", + "tipoMem": "Int", + "index": 20401, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzAspiratore": { + "name": "MinFunzAspiratore", + "description": "Aspiratore (b) Minuti funzionamento", + "memAddr": "420405", + "tipoMem": "Int", + "index": 20405, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzAspiratorePar": { + "name": "OreFunzAspiratorePar", + "description": "Aspiratore (c) Ore funzionamento (contatore parziale azzerabile)", + "memAddr": "420403", + "tipoMem": "Int", + "index": 20403, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzAspiratorePar": { + "name": "MinFunzAspiratorePar", + "description": "Aspiratore (d) Minuti funzionamento (contatore parziale azzerabile)", + "memAddr": "420406", + "tipoMem": "Int", + "index": 20406, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + } + }, + "optMemPar": { + "EndOrdIntCond": "421002|1=1", + //"AlarmIntCond": "421002|1=1", + "ManualIntCond": "421002|1=3", + //"EStopBitCond": "100040.0=1", + "WorkIntCond": "421002|1=2,4" + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01_MBlock.json new file mode 100644 index 00000000..b6d653ec --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01_MBlock.json @@ -0,0 +1,13 @@ +{ + "ReadBlocks": { + //"100040": 20, + //"332760": 20, + "400000": 10, + "400100": 60, + "400200": 20, + "420200": 20, + "420300": 20, + "420400": 20, + "421000": 20 + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01_alarm.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01_alarm.json new file mode 100644 index 00000000..7dd02384 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_01_alarm.json @@ -0,0 +1,52 @@ +[ + { + "description": "Allarmi Impianto", + "tipoMem": "DInt", + "memAddr": "40000", + "index": 0, + "size": 2, + "messages": [ + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##EMERGENZA GENERALE", + "##TERMICO SCATTATO", + "##FAULT INVERTER", + "##FAULT STEPPER", + "##CARTER APERTI", + "##PORTA SX APERTA", + "##PORTA DX APERTA", + "##CARTER APERTI" + ] + }, + { + "description": "Allarmi Impianto", + "tipoMem": "DInt", + "memAddr": "40002", + "index": 2, + "size": 2, + "messages": [ + "##TOUT BF NASTRO 1", + "##TOUT BF NASTRO 2", + "##TOUT BF NASTRO 3", + "##TOUT BF NASTRO 4", + "##TOUT BF NASTRO 5", + "##TOUT BF NASTRO 6", + "##ALL MOTORULLO 1", + "##ALL MOTORULLO 2", + "##ALL MOTORULLO 3", + "##ALL MOTORULLO 4", + "##ALL MOTORULLO 5", + "##ALL MOTORULLO 6", + "##", + "##", + "##", + "##" + ] + } +] \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02.ini b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02.ini new file mode 100644 index 00000000..4f730267 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02.ini @@ -0,0 +1,80 @@ +;Configurazione IOB-WIN +[IOB] +;Impianto Rimor sabbiatura - IMI Remosa +CNCTYPE=MODBUS_TCP_RIMOR +PING_MS_TIMEOUT=1000 +MinDeltaSec=5 +IOB_NAME=IMI_RIMOR_SAB +DIS_EXE_TASK=FALSE +DIS_STATE_CH=TRUE + +[MACHINE] +VENDOR=RIMOR +MODEL=Sabbiatura - HMI + +[CNC] +IP=192.168.10.6 +PORT=502 + +[SERVER] +MPIP=http://192.168.0.110 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= + +[MEMORY] +ADDR_READ=40000 +ADDR_WRITE=40000 +SIZE_READ=10 +SIZE_WRITE=0 +HR_BASE_ADDR=40000 +DELTA_BASE=-1 +MODBUS_EXT_REG=0 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice +PZCOUNT_MODE=STD.DB85.DBRE16 +DISABLE_PZCOUNT=TRUE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +; GEST DATI DYN +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +; gestione delta minimo accettabile tra min/MAX +DELTA_VAL=0.1 + +; clock base (da 10ms) +timerIntMs=10 + +; conf parametri memoria READ/WRITE +PARAM_CONF=IMI_RIMOR_SAB_02.json + +NO_PING=FALSE +; conf blocchi memoria x READ +MEM_BLOCK=IMI_RIMOR_SAB_02_MBlock.json + +; rimozione check limiti min/max dynData +disDynDataRangeCheck=true + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02.json new file mode 100644 index 00000000..afdbefe5 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02.json @@ -0,0 +1,74 @@ +{ + "mMapWrite": { + "setArt": { + "name": "setArt", + "description": "Articolo", + "memAddr": "40901", + "tipoMem": "String", + "index": 901, + "size": 12 + }, + "setComm": { + "name": "setComm", + "description": "Commessa", + "memAddr": "40921", + "tipoMem": "String", + "index": 921, + "size": 12 + }, + "setProg": { + "name": "setProg", + "description": "Qty", + "memAddr": "40941", + "tipoMem": "String", + "index": 941, + "size": 30 + } + }, + "mMapRead": { + "setArt": { + "name": "setArt", + "description": "Articolo", + "memAddr": "40901", + "tipoMem": "String", + "index": 901, + "size": 12, + "func": "POINT", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "" + }, + "setComm": { + "name": "setComm", + "description": "Commessa", + "memAddr": "40921", + "tipoMem": "String", + "index": 921, + "size": 12, + "func": "POINT", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 0, + "unit": "" + }, + "setProg": { + "name": "setProg", + "description": "Qty", + "memAddr": "40941", + "tipoMem": "String", + "index": 941, + "size": 30, + "func": "POINT", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 0, + "unit": "" + } + }, + "optMemPar": { + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02_MBlock.json new file mode 100644 index 00000000..ca6572f2 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_SAB_02_MBlock.json @@ -0,0 +1,5 @@ +{ + "ReadBlocks": { + "40900": 70 + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01.ini b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01.ini new file mode 100644 index 00000000..aa448b70 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01.ini @@ -0,0 +1,82 @@ +;Configurazione IOB-WIN +[IOB] +;Impianto Rimor verniciatura - IMI Remosa +CNCTYPE=MODBUS_TCP_RIMOR +PING_MS_TIMEOUT=1000 +MinDeltaSec=5 +IOB_NAME=IMI_RIMOR_VER +DIS_EXE_TASK=FALSE +DIS_STATE_CH=FALSE + +[MACHINE] +VENDOR=RIMOR +MODEL=Verniciatura - PLC + +[CNC] +IP=192.168.10.7 +PORT=502 + +[SERVER] +MPIP=http://192.168.0.110 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= + +[MEMORY] +ADDR_READ=400000 +ADDR_WRITE=400000 +SIZE_READ=10 +SIZE_WRITE=0 +HR_BASE_ADDR=400000 +DELTA_BASE=-1 +MODBUS_EXT_REG=1 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice +PZCOUNT_MODE=STD.DB85.DBRE16 +DISABLE_PZCOUNT=TRUE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +; GEST DATI DYN +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +; gestione delta minimo accettabile tra min/MAX +DELTA_VAL=0.1 + +; clock base (da 10ms) +timerIntMs=10 + +; conf parametri memoria READ/WRITE +PARAM_CONF=IMI_RIMOR_VER_01.json + +NO_PING=FALSE +; conf blocchi memoria x READ +MEM_BLOCK=IMI_RIMOR_VER_01_MBlock.json +; conf aree allarme +ALARM_CONF=IMI_RIMOR_VER_01_alarm.json + +; rimozione check limiti min/max dynData +disDynDataRangeCheck=true + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01.json new file mode 100644 index 00000000..f0085acb --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01.json @@ -0,0 +1,217 @@ +{ + "mMapWrite": { + "setProg": { + "name": "setProg", + "description": "Qty", + "memAddr": "406202", + "tipoMem": "Int", + "index": 6202, + "size": 1 + } + }, + "mMapRead": { + "OreFunzFiltro1": { + "name": "OreFunzFiltro1", + "description": "Ore funzionamento filtro 1", + "memAddr": "406297", + "tipoMem": "Int", + "index": 6297, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzFiltro1": { + "name": "MinFunzFiltro1", + "description": "Minuti funzionamento filtro 1", + "memAddr": "406301", + "tipoMem": "Int", + "index": 6301, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzFiltroPar1": { + "name": "OreFunzFiltroPar1", + "description": "Ore funzionamento filtro 1 (contatore parziale azzerabile)", + "memAddr": "406299", + "tipoMem": "Int", + "index": 6299, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzFiltroPar1": { + "name": "MinFunzFiltroPar1", + "description": "Minuti funzionamento filtro 1 (contatore parziale azzerabile)", + "memAddr": "406302", + "tipoMem": "Int", + "index": 6302, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzFiltro2": { + "name": "OreFunzFiltro2", + "description": "Ore funzionamento filtro 2", + "memAddr": "406303", + "tipoMem": "Int", + "index": 6303, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzFiltro2": { + "name": "MinFunzFiltro2", + "description": "Minuti funzionamento filtro 2", + "memAddr": "406307", + "tipoMem": "Int", + "index": 6307, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzFiltroPar2": { + "name": "OreFunzFiltroPar2", + "description": "Ore funzionamento filtro 1 (contatore parziale azzerabile)", + "memAddr": "406305", + "tipoMem": "Int", + "index": 6305, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzFiltroPar2": { + "name": "MinFunzFiltroPar2", + "description": "Minuti funzionamento filtro 1 (contatore parziale azzerabile)", + "memAddr": "406308", + "tipoMem": "Int", + "index": 6308, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzAgitatori": { + "name": "OreFunzAgitatori", + "description": "Ore funzionamento Agitatori", + "memAddr": "406309", + "tipoMem": "Int", + "index": 6309, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzAgitatori": { + "name": "MinFunzAgitatori", + "description": "Minuti funzionamento Agitatori", + "memAddr": "406313", + "tipoMem": "Int", + "index": 6313, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "OreFunzAgitatoriPar": { + "name": "OreFunzAgitatoriPar", + "description": "Ore funzionamento Agitatori (contatore parziale azzerabile)", + "memAddr": "406311", + "tipoMem": "Int", + "index": 6311, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h" + }, + "MinFunzAgitatoriPar": { + "name": "MinFunzAgitatoriPar", + "description": "Minuti funzionamento Agitatori (contatore parziale azzerabile)", + "memAddr": "406314", + "tipoMem": "Int", + "index": 6314, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "m" + }, + "DurataLavorazione": { + "name": "DurataLavorazione", + "description": "Durata Lavorazione", + "memAddr": "406198", + "tipoMem": "Int", + "index": 6198, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "h/m" + }, + "StatoLavorazione": { + "name": "StatoLavorazione", + "description": "Stato Lavorazione", + "memAddr": "406200", + "tipoMem": "Int", + "index": 6200, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "#" + } + }, + "optMemPar": { + "EndOrdIntCond": "406198|1=1", + //"AlarmIntCond": "406200|0=1", + "ManualIntCond": "406198|1=3", + //"EStopBitCond": "100040.0=1", + "WorkIntCond": "406198|1=2,4" + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01_MBlock.json new file mode 100644 index 00000000..5f6dfcf1 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01_MBlock.json @@ -0,0 +1,10 @@ +{ + "ReadBlocks": { + //"100040": 20, + //"332760": 20, + "406190": 20, + "406290": 30, + "404200": 60, + "404300": 10 + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01_alarm.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01_alarm.json new file mode 100644 index 00000000..7dd02384 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_01_alarm.json @@ -0,0 +1,52 @@ +[ + { + "description": "Allarmi Impianto", + "tipoMem": "DInt", + "memAddr": "40000", + "index": 0, + "size": 2, + "messages": [ + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##EMERGENZA GENERALE", + "##TERMICO SCATTATO", + "##FAULT INVERTER", + "##FAULT STEPPER", + "##CARTER APERTI", + "##PORTA SX APERTA", + "##PORTA DX APERTA", + "##CARTER APERTI" + ] + }, + { + "description": "Allarmi Impianto", + "tipoMem": "DInt", + "memAddr": "40002", + "index": 2, + "size": 2, + "messages": [ + "##TOUT BF NASTRO 1", + "##TOUT BF NASTRO 2", + "##TOUT BF NASTRO 3", + "##TOUT BF NASTRO 4", + "##TOUT BF NASTRO 5", + "##TOUT BF NASTRO 6", + "##ALL MOTORULLO 1", + "##ALL MOTORULLO 2", + "##ALL MOTORULLO 3", + "##ALL MOTORULLO 4", + "##ALL MOTORULLO 5", + "##ALL MOTORULLO 6", + "##", + "##", + "##", + "##" + ] + } +] \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02.ini b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02.ini new file mode 100644 index 00000000..7f3ebe1a --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02.ini @@ -0,0 +1,80 @@ +;Configurazione IOB-WIN +[IOB] +;Impianto Rimor verniciatura - IMI Remosa +CNCTYPE=MODBUS_TCP_RIMOR +PING_MS_TIMEOUT=1000 +MinDeltaSec=5 +IOB_NAME=IMI_RIMOR_VER +DIS_EXE_TASK=FALSE +DIS_STATE_CH=TRUE + +[MACHINE] +VENDOR=RIMOR +MODEL=Verniciatura - HMI + +[CNC] +IP=192.168.10.8 +PORT=502 + +[SERVER] +MPIP=http://192.168.0.110 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= + +[MEMORY] +ADDR_READ=40000 +ADDR_WRITE=40000 +SIZE_READ=10 +SIZE_WRITE=0 +HR_BASE_ADDR=40000 +DELTA_BASE=-1 +MODBUS_EXT_REG=0 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice +PZCOUNT_MODE=STD.DB85.DBRE16 +DISABLE_PZCOUNT=TRUE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +; GEST DATI DYN +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +; gestione delta minimo accettabile tra min/MAX +DELTA_VAL=0.1 + +; clock base (da 10ms) +timerIntMs=10 + +; conf parametri memoria READ/WRITE +PARAM_CONF=IMI_RIMOR_VER_02.json + +NO_PING=FALSE +; conf blocchi memoria x READ +MEM_BLOCK=IMI_RIMOR_VER_02_MBlock.json + +; rimozione check limiti min/max dynData +disDynDataRangeCheck=true + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02.json new file mode 100644 index 00000000..afdbefe5 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02.json @@ -0,0 +1,74 @@ +{ + "mMapWrite": { + "setArt": { + "name": "setArt", + "description": "Articolo", + "memAddr": "40901", + "tipoMem": "String", + "index": 901, + "size": 12 + }, + "setComm": { + "name": "setComm", + "description": "Commessa", + "memAddr": "40921", + "tipoMem": "String", + "index": 921, + "size": 12 + }, + "setProg": { + "name": "setProg", + "description": "Qty", + "memAddr": "40941", + "tipoMem": "String", + "index": 941, + "size": 30 + } + }, + "mMapRead": { + "setArt": { + "name": "setArt", + "description": "Articolo", + "memAddr": "40901", + "tipoMem": "String", + "index": 901, + "size": 12, + "func": "POINT", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 999999, + "unit": "" + }, + "setComm": { + "name": "setComm", + "description": "Commessa", + "memAddr": "40921", + "tipoMem": "String", + "index": 921, + "size": 12, + "func": "POINT", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 0, + "unit": "" + }, + "setProg": { + "name": "setProg", + "description": "Qty", + "memAddr": "40941", + "tipoMem": "String", + "index": 941, + "size": 30, + "func": "POINT", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 0, + "unit": "" + } + }, + "optMemPar": { + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02_MBlock.json new file mode 100644 index 00000000..ca6572f2 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_RIMOR_VER_02_MBlock.json @@ -0,0 +1,5 @@ +{ + "ReadBlocks": { + "40900": 70 + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_SOITAAB_Z2342.ini b/IOB-WIN-NEXT/DATA/CONF/IMI_SOITAAB_Z2342.ini new file mode 100644 index 00000000..8c78ae33 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_SOITAAB_Z2342.ini @@ -0,0 +1,83 @@ +;Configurazione IOB-WIN +[IOB] +;Accesso gestione sync DB x sync SOITAAB/LANTEK --> MoonPro_IOB_ISF --> Chiamate REST +CNCTYPE=SQLSERVER_LANTEK +PING_MS_TIMEOUT=500 +MinDeltaSec=5 + +[MACHINE] +VENDOR=SOITAAB +MODEL=Ossitaglio xxx / sw LANTEK + +[CNC] +IP=127.0.0.1 +PORT=1443 +GETPRGNAME=false + +[SERVER] +MPIP=http://192.168.0.110 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= +CMDRAWTRANSF=/IOB/rawTransfJson/ + +[MEMORY] +ADDR_READ=DB9999.DBB0 +ADDR_WRITE=DB9999.DBB0 +SIZE_READ=0 +SIZE_WRITE=0 +;BIT0=CONN +;BIT1=DB60.DBB1 +;BIT2=PZCOUNT.STD.DB700.DBW22 +;BIT3=DB60.DBB3 +;BIT4=DB60.DBB4 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +AUTO_CHANGE_ODL=false +CHANGE_ODL_MODE=TIME +CHANGE_ODL_HOURS=24 +CHANGE_ODL_IDLE_MIN=5 +PZCOUNT_MODE=PAMA +DISABLE_PZCOUNT=FALSE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +DEM_FACT_DYN_DATA=5 +ENABLE_DATA_FILTER=TRUE +ENABLE_CLI_RESTART=TRUE +SyncStateServer=308SERVER60\LANTEK +SyncStateDb=MoonPro_IOB_ISF_LANTEK +SyncStateUser=steamware +SyncStatePwd=viadante16 +SyncStateCTout= +VetoReadSec=2 + +; clock base (da 10ms) +timerIntMs=20 + +; conf parametri memoria READ/WRITE +PARAM_CONF=IMI_SOITAAB_Z2342.json + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/IMI_SOITAAB_Z2342.json b/IOB-WIN-NEXT/DATA/CONF/IMI_SOITAAB_Z2342.json new file mode 100644 index 00000000..898e2595 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/IMI_SOITAAB_Z2342.json @@ -0,0 +1,29 @@ +{ + "mMapWrite": { + + }, + "mMapRead": { + //"TotMerceProcTonn": { + // "name": "TotMerceProcTonn", + // "description": "Totale merce processata oggi su impianto (Tonn)", + // "memAddr": "TotMerceProcTonn", + // "tipoMem": "Real", + // "index": 0, + // "size": 0, + // "func": "MAX", + // "period": 60, + // "factor": 1 + //}, + //"TotMerceCaricTonn": { + // "name": "TotMerceCaricTonn", + // "description": "Totale merce caricata oggi su impianto (Tonn)", + // "memAddr": "TotMerceCaricTonn", + // "tipoMem": "Real", + // "index": 0, + // "size": 0, + // "func": "MAX", + // "period": 60, + // "factor": 1 + //} + } +} diff --git a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini index 794a370b..59bd4bd0 100644 --- a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini +++ b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini @@ -45,6 +45,17 @@ CLI_INST=SteamWareSim ;STARTLIST=BAGLIETTO_CIMOLAI_01 ;STARTLIST=SIMUL_01 ;STARTLIST=GIACO_SAIM_003 -STARTLIST=GIACO_SAIM_003 +;STARTLIST=PIZ09 +;STARTLIST=IMI_RIMOR_SAB_01 +;STARTLIST=IMI_RIMOR_SAB_02 +;STARTLIST=IMI_RIMOR_VER_01 +;STARTLIST=IMI_RIMOR_VER_02 +;STARTLIST=IMI_PAMA_392 +;STARTLIST=Tend_FIMAT_01 +;STARTLIST=PIZ10 + +;STARTLIST=SIMUL_02 +;NB: mettere copy always ai file di conf x fare test... +STARTLIST=IMI_SOITAAB_Z2342 MAXCNC=10 \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json index 96d8f415..0074e94e 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json @@ -1,7 +1,7 @@ { "ReadBlocks": { - "40001": 64, - "40421": 64, - "40901": 8 + "40000": 64, + "40420": 64, + "40900": 8 } } \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json index 96d8f415..0074e94e 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json @@ -1,7 +1,7 @@ { "ReadBlocks": { - "40001": 64, - "40421": 64, - "40901": 8 + "40000": 64, + "40420": 64, + "40900": 8 } } \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ10.ini b/IOB-WIN-NEXT/DATA/CONF/PIZ10.ini new file mode 100644 index 00000000..b66b6292 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ10.ini @@ -0,0 +1,88 @@ +;Configurazione IOB-WIN +[IOB] +;Impianto HAM Guardamiglio per Pizzaferri +CNCTYPE=MODBUS_TCP_HAM +PING_MS_TIMEOUT=1000 + +[MACHINE] +VENDOR=HAM +MODEL=HAM + +[CNC] +IP=192.168.10.100 +;IP=hamsantilario.dyndns.org +PORT=502 + +[SERVER] +;MPIP=https://localhost:44339 +MPIP=https://gwms.egalware.com +MPURL=/pizzaferri/api +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/IOB/sendReboot?idxMacchina= + +[MEMORY] +ADDR_READ=40000 +ADDR_WRITE=40400 +SIZE_READ=64 +SIZE_WRITE=358 + +HR_BASE_ADDR=40000 +;DELTA_BASE=1 +DELTA_BASE=0 +INDEX_LUT_CORR=-1 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice +PZCOUNT_MODE=STD.DB85.DBRE16 +DISABLE_PZCOUNT=TRUE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +; GEST DATI DYN +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +; gestione delta minimo accettabile tra min/MAX +DELTA_VAL=0.1 + +; clock base (da 10ms) +timerIntMs=50 + +MAX_ERROR_READ=10 + +; conf parametri memoria READ/WRITE +PARAM_CONF=PIZ10.json + +NO_PING=FALSE +; conf blocchi memoria x READ +MEM_BLOCK=PIZ10_MBlock.json +; conf aree allarme +ALARM_CONF=PIZ10_alarm.json + +[BRANCH] +NAME=master + +; Tags manuali +[TAGS] +Customer=Pizzaferri +HostOS=WIN +HostName=PIZZAFERRI-IOB-WIN-03 +HostAddr=192.168.10.50 diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ10.json b/IOB-WIN-NEXT/DATA/CONF/PIZ10.json new file mode 100644 index 00000000..b5584dee --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ10.json @@ -0,0 +1,176 @@ +{ + "mMapWrite": { + "SetLowTempAmb01": { + "name": "SetLowTempAmb01", + "description": "Set point di avviso per bassa temperatura ambiente nell'impianto 01", + "memAddr": "40421", + "tipoMem": "Real", + "index": 421, + "size": 2, + "minVal": -200, + "maxVal": 200, + "unit": "C" + }, + "SetHighTempAmb01": { + "name": "SetHighTempAmb01", + "description": "Set point di avviso per alta temperatura ambiente nell'impianto 01", + "memAddr": "40423", + "tipoMem": "Real", + "index": 423, + "size": 2, + "minVal": -200, + "maxVal": 200, + "unit": "C" + }, + "SetLowTempAmb02": { + "name": "SetLowTempAmb02", + "description": "Set point di avviso per bassa temperatura ambiente nell'impianto 02", + "memAddr": "40425", + "tipoMem": "Real", + "index": 425, + "size": 2, + "minVal": -200, + "maxVal": 200, + "unit": "C" + }, + "SetHighTempAmb02": { + "name": "SetHighTempAmb02", + "description": "Set point di avviso per alta temperatura ambiente nell'impianto 02", + "memAddr": "40427", + "tipoMem": "Real", + "index": 427, + "size": 2, + "minVal": -200, + "maxVal": 200, + "unit": "C" + } + }, + "mMapRead": { + "Level": { + "name": "Level", + "description": "Livello Serbatoio", + "memAddr": "40001", + "tipoMem": "Real", + "index": 1, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 360, + "minVal": 0, + "maxVal": 100, + "unit": "Kg" + }, + "MainPress": { + "name": "MainPress", + "description": "Pressione Serbatoio", + "memAddr": "40003", + "tipoMem": "Real", + "index": 3, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 400, + "unit": "bar" + }, + "TempSerb": { + "name": "TempSerb", + "description": "Temperatura prodotto all'interno del serbatoio", + "memAddr": "40049", + "tipoMem": "Real", + "index": 49, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": -200, + "maxVal": 200, + "unit": "C" + }, + "SetLowTempAmb01": { + "name": "SetLowTempAmb01", + "description": "Set point di avviso per bassa temperatura ambiente nell'impianto 01", + "memAddr": "40421", + "tipoMem": "Real", + "index": 421, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": -200, + "maxVal": 200, + "unit": "C" + }, + "SetHighTempAmb01": { + "name": "SetHighTempAmb01", + "description": "Set point di avviso per alta temperatura ambiente nell'impianto 01", + "memAddr": "40423", + "tipoMem": "Real", + "index": 423, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": -200, + "maxVal": 200, + "unit": "C" + }, + "SetLowTempAmb02": { + "name": "SetLowTempAmb02", + "description": "Set point di avviso per bassa temperatura ambiente nell'impianto 02", + "memAddr": "40425", + "tipoMem": "Real", + "index": 425, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": -200, + "maxVal": 200, + "unit": "C" + }, + "SetHighTempAmb02": { + "name": "SetHighTempAmb02", + "description": "Set point di avviso per alta temperatura ambiente nell'impianto 02", + "memAddr": "40427", + "tipoMem": "Real", + "index": 427, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": -200, + "maxVal": 200, + "unit": "C" + }, + "PressBH": { + "name": "PressBH", + "description": "Pressione media all'interno dell'accumulo GNC (pacco bombole) di alta pressione", + "memAddr": "40019", + "tipoMem": "Real", + "index": 19, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 400, + "unit": "bar" + }, + "PressBL": { + "name": "PressBL", + "description": "Pressione media all'interno dell'accumulo GNC (pacco bombole) di media pressione", + "memAddr": "40021", + "tipoMem": "Real", + "index": 21, + "size": 2, + "func": "MEDIAN", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 400, + "unit": "bar" + } + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ10_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/PIZ10_MBlock.json new file mode 100644 index 00000000..a259a433 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ10_MBlock.json @@ -0,0 +1,7 @@ +{ + "ReadBlocks": { + "40000": 64, + "40420": 64, + "40900": 8 + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ10_alarm.json b/IOB-WIN-NEXT/DATA/CONF/PIZ10_alarm.json new file mode 100644 index 00000000..e24aa3f0 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ10_alarm.json @@ -0,0 +1,54 @@ +[ + { + "blinkVal": 100, + "description": "Allarmi Impianto", + "tipoMem": "DInt", + "memAddr": "40901", + "index": 901, + "size": 2, + "messages": [ + "Basso livello serbatoio", + "Alto livello serbatoio", + "Errore trasmettitore livello", + "Bassa pressione serbatoio", + "Alta pressione serbatoio", + "##", + "##", + "Allarme rilevatore gas 1", + "##", + "##", + "Allarme rilevatore gas 2", + "##", + "##", + "Allarme rilevatore gas 3", + "##", + "##" + ] + }, + { + "blinkVal": 100, + "description": "Emergenza", + "tipoMem": "DInt", + "memAddr": "40907", + "index": 907, + "size": 2, + "messages": [ + "##", + "Pulsante di Emergenza Premuto", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##", + "##" + ] + } +] \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_01.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_01.ini index 12797485..34da0ae4 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_01.ini +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_01.ini @@ -33,6 +33,7 @@ BLINK_FILT=0 [OPTPAR] AUTO_CHANGE_ODL=true +AUTO_SNAPSHOT_DOSSIER=true CHANGE_ODL_HOURS=24 CHANGE_ODL_IDLE_MIN=0 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice @@ -93,7 +94,7 @@ CSV_ADD_HEADER=true ; conf file import FILE_IMPORT_FOLDER=c:\temp\import FILE_IMPORT_TYPE=*.xlsx -FILE_ARCHIVE_FOLDER=c:\temp\import\archived +FILE_ARCHIVE_FOLDER=c:\temp\import\archive [BRANCH] NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_02.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_02.ini index 3880cd26..8a671de6 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_02.ini +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_02.ini @@ -33,6 +33,7 @@ BLINK_FILT=0 [OPTPAR] AUTO_CHANGE_ODL=true +AUTO_SNAPSHOT_DOSSIER=true CHANGE_ODL_HOURS=24 CHANGE_ODL_IDLE_MIN=0 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice @@ -79,7 +80,6 @@ TC_MAX_INCR=5 MAX_PZ_INCR_PERC=1000 ; conf parametri memoria READ/WRITE PARAM_CONF=SIMUL_02.json - ;conf test FTP FTP_SERVER=ftp.steamware.net FTP_USER=testftpuser diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_02.json b/IOB-WIN-NEXT/DATA/CONF/SIMUL_02.json index 482f00ef..90281f1d 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_02.json +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_02.json @@ -95,5 +95,23 @@ "NumPed": 11, "PackPed": 12, "PesoPack": 13 + }, + "optKVP": { + "hasRecipe": true, + "maxPodlQty": 530, + "useLocalRecipe": true, + "path-locBase": "C:\\MesData\\Local", + "path-remBase": "C:\\MesData\\Remote", + "path-00-Arch": "ArchivioRicette\\FIMAT", + "path-01-Temp": "01-Temp\\FIMAT", + "path-02-Sent": "02-Inviate\\FIMAT", + "path-03-Recv": "03-Ricevute\\FIMAT", + "path-04-remReq": "C:\\MesData\\Remote\\Queue2", + "path-05-remExe": "C:\\MesData\\Remote\\Dosed", + "path-06-remRec": "C:\\MesData\\Remote\\Recipes", + "path-outReport": "C:\\MesData\\Report", + "path-confSetup": "C:\\MesData\\Setup\\setupConsumi.json", + "replace-": "{{PODL}}", + "replace-": "Kg{{Qty}} | {{Note}}" } } \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_03.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_03.ini index ba331a74..0765968a 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_03.ini +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_03.ini @@ -34,6 +34,7 @@ BLINK_FILT=0 [OPTPAR] AUTO_CHANGE_ODL=true +AUTO_SNAPSHOT_DOSSIER=true CHANGE_ODL_HOURS=24 CHANGE_ODL_IDLE_MIN=0 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_04.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_04.ini index ccedfad8..5d7221d0 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_04.ini +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_04.ini @@ -33,6 +33,7 @@ BLINK_FILT=0 [OPTPAR] AUTO_CHANGE_ODL=true +AUTO_SNAPSHOT_DOSSIER=true CHANGE_ODL_HOURS=24 CHANGE_ODL_IDLE_MIN=0 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_05.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_05.ini index bb74ffae..93377cfc 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_05.ini +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_05.ini @@ -33,6 +33,7 @@ BLINK_FILT=0 [OPTPAR] AUTO_CHANGE_ODL=true +AUTO_SNAPSHOT_DOSSIER=true CHANGE_ODL_HOURS=24 CHANGE_ODL_IDLE_MIN=0 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_06.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_06.ini index cd06d689..20df0ebb 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_06.ini +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_06.ini @@ -33,6 +33,7 @@ BLINK_FILT=0 [OPTPAR] AUTO_CHANGE_ODL=true +AUTO_SNAPSHOT_DOSSIER=true CHANGE_ODL_HOURS=24 CHANGE_ODL_IDLE_MIN=0 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_07.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_07.ini index b9e11496..fd7a8f3b 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_07.ini +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_07.ini @@ -33,6 +33,7 @@ BLINK_FILT=0 [OPTPAR] AUTO_CHANGE_ODL=true +AUTO_SNAPSHOT_DOSSIER=true CHANGE_ODL_HOURS=24 CHANGE_ODL_IDLE_MIN=0 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_08.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_08.ini index ae03e3ff..d5a25c56 100644 --- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_08.ini +++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_08.ini @@ -33,6 +33,7 @@ BLINK_FILT=0 [OPTPAR] AUTO_CHANGE_ODL=false +AUTO_SNAPSHOT_DOSSIER=true CHANGE_ODL_HOURS=48 CHANGE_ODL_IDLE_MIN=10 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice diff --git a/IOB-WIN-NEXT/DATA/CONF/Tend_250_53.ini b/IOB-WIN-NEXT/DATA/CONF/Tend_250_53.ini index 5ff35e93..00b7848c 100644 --- a/IOB-WIN-NEXT/DATA/CONF/Tend_250_53.ini +++ b/IOB-WIN-NEXT/DATA/CONF/Tend_250_53.ini @@ -13,7 +13,7 @@ IP=192.168.250.53 PORT=4840 GETPRGNAME=true -[SERVER] +[SERVER] MPIP=http://192.168.10.7 MPURL=/MP/IO CMDBASE=/IOB/input/ diff --git a/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01.ini b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01.ini new file mode 100644 index 00000000..f7bb0592 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01.ini @@ -0,0 +1,80 @@ +;Configurazione IOB-WIN +[IOB] +;Impianto Rimor verniciatura - IMI Remosa +CNCTYPE=MODBUS_TCP_FIMAT +PING_MS_TIMEOUT=1000 +MinDeltaSec=5 +;IOB_NAME=Tend_Fimat +DIS_EXE_TASK=FALSE +DIS_STATE_CH=FALSE + +[MACHINE] +VENDOR=FIMAT +MODEL=Impianto mix colori - PLC + +[CNC] +IP=192.168.10.49 +PORT=502 + +[SERVER] +MPIP=http://192.168.10.7 +MPURL=/MP/IO +CMDBASE=/IOB/input/ +CMDFLOG=/IOB/flog/ +CMDALIVE=/IOB +CMDENABLED=/IOB/enabled/ +CMDADV1=?valore= +CMDREBO=/sendReboot.aspx?idxMacchina= + +[MEMORY] +ADDR_READ=40000 +ADDR_WRITE=40000 +SIZE_READ=10 +SIZE_WRITE=0 +HR_BASE_ADDR=40000 +DELTA_BASE=0 +INDEX_LUT_CORR=0 +MODBUS_EXT_REG=0 + + +[BLINK] +;MAX_COUNTER_BLINK = 30 +MAX_COUNTER_BLINK = 15 +;bit0 = 0 +;bit1 = 0 +;bit2 = 1 +;bit3 = 1 +;bit4 = 1 +;bit5 = 0 +;bit6 = 0 +;bit7 = 0 +BLINK_FILT=0 +;BLINK_FILT=28 + +[OPTPAR] +;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice +PZCOUNT_MODE=STD.DB85.DBRE16 +DISABLE_PZCOUNT=TRUE +ENABLE_SEND_PZC_BLOCK=TRUE +MIN_SEND_PZC_BLOCK=0 +MAX_SEND_PZC_BLOCK=100 +; GEST DATI DYN +ENABLE_DYN_DATA=TRUE +FORCE_DYN_DATA=TRUE +; gestione delta minimo accettabile tra min/MAX +DELTA_VAL=0.1 +; clock base (da 10ms) +timerIntMs=10 +; conf parametri memoria READ/WRITE +PARAM_CONF=Tend_FIMAT_01.json +NO_PING=FALSE +; conf blocchi memoria x READ +MEM_BLOCK=Tend_FIMAT_01_MBlock.json +; conf aree allarme +ALARM_CONF=Tend_FIMAT_01_alarm.json +; rimozione check limiti min/max dynData +disDynDataRangeCheck=true + + +[BRANCH] +NAME=master \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01.json b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01.json new file mode 100644 index 00000000..fdf36e51 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01.json @@ -0,0 +1,342 @@ +{ + "mMapWrite": {}, + "mMapRead": { + "StatoMacchina": { + "name": "StatoMacchina", + "description": "Stato della Macchina", + "memAddr": "40001", + "tipoMem": "Int", + "index": 1, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "ElencoAnomalie": { + "name": "ElencoAnomalie", + "description": "Elenco Anomalie", + "memAddr": "40002", + "tipoMem": "Int", + "index": 2, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "ElencoAttivita": { + "name": "ElencoAttivita", + "description": "Elenco Attivita", + "memAddr": "40003", + "tipoMem": "Int", + "index": 3, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "StatoRicircolo": { + "name": "StatoRicircolo", + "description": "Stato Ricircolo Serbatoi", + "memAddr": "40004", + "tipoMem": "Int", + "index": 4, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "NumAllarmi": { + "name": "NumAllarmi", + "description": "NUmero Allarmi Presenti", + "memAddr": "40005", + "tipoMem": "Int", + "index": 5, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "NumAllarmiNR": { + "name": "NumAllarmiNR", + "description": "NUmero Allarmi Non Riconosciuti", + "memAddr": "40006", + "tipoMem": "Int", + "index": 6, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "ModoPreparazione": { + "name": "ModoPreparazione", + "description": "Modo Preparazione Ricetta", + "memAddr": "40007", + "tipoMem": "Int", + "index": 7, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "NumRicette": { + "name": "NumRicette", + "description": "Numero Ricette in coda", + "memAddr": "40008", + "tipoMem": "Int", + "index": 8, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "StatoImport": { + "name": "StatoImport", + "description": "Stato Importazione file ricette XML da esterno", + "memAddr": "40009", + "tipoMem": "Int", + "index": 9, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "LivSerb01": { + "name": "LivSerb01", + "description": "Livello Servatoio 01", + "memAddr": "40020", + "tipoMem": "Int", + "index": 20, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb02": { + "name": "LivSerb02", + "description": "Livello Servatoio 02", + "memAddr": "40021", + "tipoMem": "Int", + "index": 21, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb03": { + "name": "LivSerb03", + "description": "Livello Servatoio 03", + "memAddr": "40022", + "tipoMem": "Int", + "index": 22, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb04": { + "name": "LivSerb04", + "description": "Livello Servatoio 04", + "memAddr": "40023", + "tipoMem": "Int", + "index": 23, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb05": { + "name": "LivSerb05", + "description": "Livello Servatoio 05", + "memAddr": "40024", + "tipoMem": "Int", + "index": 24, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb06": { + "name": "LivSerb06", + "description": "Livello Servatoio 06", + "memAddr": "40025", + "tipoMem": "Int", + "index": 25, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb07": { + "name": "LivSerb07", + "description": "Livello Servatoio 07", + "memAddr": "40026", + "tipoMem": "Int", + "index": 26, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb08": { + "name": "LivSerb08", + "description": "Livello Servatoio 08", + "memAddr": "40027", + "tipoMem": "Int", + "index": 27, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb09": { + "name": "LivSerb09", + "description": "Livello Servatoio 09", + "memAddr": "40028", + "tipoMem": "Int", + "index": 28, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb10": { + "name": "LivSerb10", + "description": "Livello Servatoio 10", + "memAddr": "40029", + "tipoMem": "Int", + "index": 29, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb11": { + "name": "LivSerb11", + "description": "Livello Servatoio 11", + "memAddr": "40030", + "tipoMem": "Int", + "index": 30, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb12": { + "name": "LivSerb12", + "description": "Livello Servatoio 12", + "memAddr": "40031", + "tipoMem": "Int", + "index": 31, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + } + }, + "optMemPar": { + "AlarmIntCond": "40000|1=2", + "ManualBitCond": "40002.1=1", + "EStopBitCond": "40002.0=1", + "WorkIntCond": "40000|1=3", + //"VarInt2Translate": "40001,40007", + //"VarBit2Translate": "40003" + }, + "optKVP": { + "hasRecipe": true, + "maxPodlQty": 530, + "useLocalRecipe": true, + "path-locBase": "E:\\MesData\\", + "path-remBase": "C:\\MesData\\Remote", + "path-00-Arch": "ArchivioRicette\\FIMAT", + "path-01-Temp": "01-Temp\\FIMAT", + "path-02-Sent": "02-Inviate\\FIMAT", + "path-03-Recv": "03-Ricevute\\FIMAT", + "path-04-remReq": "Y:\\", + "path-05-remExe": "Z:\\", + "path-06-remRec": "R:\\", + "path-outReport": "C:\\MesData\\Report", + "path-confSetup": "E:\\MesData\\Setup\\setupConsumi.json", + "replace-": "{{PODL}}", + "replace-": "Kg{{Qty}} | {{Note}}" + }, + "itemTranslation": { + "40001_0": "Stato non aggiornato per mancanza comunicazione da computer", + "40001_1": "Stato non aggiornato per mancanza comunicazione da PLC", + "40001_2": "Presenza di anomalie od attivita che limitano il funzionamento", + "40001_3": "Macchina impegnata per attivita normale in corso", + "40001_4": "Macchina libera e pronta al funzionamento", + "40003.0": "Posizione di dosaggio impegnata", + "40003.1": "Bidone con ricetta terminata od annullata da rimuovere da posizione di dosaggio", + "40003.2": "Ricetta in preparazione", + "40003.3": "Lavaggio valvole in corso", + "40003.4": "Avvio caricamento nuova ricetta in corso", + "40007_0": "Nessuno", + "40007_1": "Singola ricetta", + "40007_2": "Coda (modo non ancora avviato)", + "40007_3": "Coda (modo avviato)", + "40007_4": "Correzione" + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01_MBlock.json new file mode 100644 index 00000000..45d868ce --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01_MBlock.json @@ -0,0 +1,5 @@ +{ + "ReadBlocks": { + "40000": 40 + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01__bck.json b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01__bck.json new file mode 100644 index 00000000..e2db329f --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01__bck.json @@ -0,0 +1,324 @@ +{ + "mMapWrite": { }, + "mMapRead": { + "StatoMacchina": { + "name": "StatoMacchina", + "description": "Stato della Macchina", + "memAddr": "40001", + "tipoMem": "Int", + "index": 1, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "ElencoAnomalie": { + "name": "ElencoAnomalie", + "description": "Elenco Anomalie", + "memAddr": "40002", + "tipoMem": "Int", + "index": 2, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "ElencoAttivita": { + "name": "ElencoAttivita", + "description": "Elenco Attivita", + "memAddr": "40003", + "tipoMem": "Int", + "index": 3, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "StatoRicircolo": { + "name": "StatoRicircolo", + "description": "Stato Ricircolo Serbatoi", + "memAddr": "40004", + "tipoMem": "Int", + "index": 4, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "NumAllarmi": { + "name": "NumAllarmi", + "description": "NUmero Allarmi Presenti", + "memAddr": "40005", + "tipoMem": "Int", + "index": 5, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "NumAllarmiNR": { + "name": "NumAllarmiNR", + "description": "NUmero Allarmi Non Riconosciuti", + "memAddr": "40006", + "tipoMem": "Int", + "index": 6, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "ModoPreparazione": { + "name": "ModoPreparazione", + "description": "Modo Preparazione Ricetta", + "memAddr": "40007", + "tipoMem": "Int", + "index": 7, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "NumRicette": { + "name": "NumRicette", + "description": "Numero Ricette in coda", + "memAddr": "40008", + "tipoMem": "Int", + "index": 8, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "StatoImport": { + "name": "StatoImport", + "description": "Stato Importazione file ricette XML da esterno", + "memAddr": "40009", + "tipoMem": "Int", + "index": 9, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 10, + "unit": "#" + }, + "LivSerb01": { + "name": "LivSerb01", + "description": "Livello Servatoio 01", + "memAddr": "40020", + "tipoMem": "Int", + "index": 20, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb02": { + "name": "LivSerb02", + "description": "Livello Servatoio 02", + "memAddr": "40021", + "tipoMem": "Int", + "index": 21, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb03": { + "name": "LivSerb03", + "description": "Livello Servatoio 03", + "memAddr": "40022", + "tipoMem": "Int", + "index": 22, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb04": { + "name": "LivSerb04", + "description": "Livello Servatoio 04", + "memAddr": "40023", + "tipoMem": "Int", + "index": 23, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb05": { + "name": "LivSerb05", + "description": "Livello Servatoio 05", + "memAddr": "40024", + "tipoMem": "Int", + "index": 24, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb06": { + "name": "LivSerb06", + "description": "Livello Servatoio 06", + "memAddr": "40025", + "tipoMem": "Int", + "index": 25, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb07": { + "name": "LivSerb07", + "description": "Livello Servatoio 07", + "memAddr": "40026", + "tipoMem": "Int", + "index": 26, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb08": { + "name": "LivSerb08", + "description": "Livello Servatoio 08", + "memAddr": "40027", + "tipoMem": "Int", + "index": 27, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb09": { + "name": "LivSerb09", + "description": "Livello Servatoio 09", + "memAddr": "40028", + "tipoMem": "Int", + "index": 28, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb10": { + "name": "LivSerb10", + "description": "Livello Servatoio 10", + "memAddr": "40029", + "tipoMem": "Int", + "index": 29, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb11": { + "name": "LivSerb11", + "description": "Livello Servatoio 11", + "memAddr": "40030", + "tipoMem": "Int", + "index": 30, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + }, + "LivSerb12": { + "name": "LivSerb12", + "description": "Livello Servatoio 12", + "memAddr": "40031", + "tipoMem": "Int", + "index": 31, + "size": 1, + "func": "MAX", + "period": 90, + "factor": 1, + "minVal": 0, + "maxVal": 1000, + "unit": "#" + } + }, + "optMemPar": { + "AlarmIntCond": "40000|1=2", + "ManualBitCond": "40002.1=1", + "EStopBitCond": "40002.0=1", + "WorkIntCond": "40000|1=3", + "VarInt2Translate": "40001,40007", + "VarBit2Translate": "40003" + }, + "itemTranslation": { + "40001_0": "Stato non aggiornato per mancanza comunicazione da computer", + "40001_1": "Stato non aggiornato per mancanza comunicazione da PLC", + "40001_2": "Presenza di anomalie od attività che limitano il funzionamento", + "40001_3": "Macchina impegnata per attività normale in corso", + "40001_4": "Macchina libera e pronta al funzionamento", + "40003.0": "Posizione di dosaggio impegnata", + "40003.1": "Bidone con ricetta terminata od annullata da rimuovere da posizione di dosaggio", + "40003.2": "Ricetta in preparazione", + "40003.3": "Lavaggio valvole in corso", + "40003.4": "Avvio caricamento nuova ricetta in corso", + "40007_0": "Nessuno", + "40007_1": "Singola ricetta", + "40007_2": "Coda (modo non ancora avviato)", + "40007_3": "Coda (modo avviato)", + "40007_4": "Correzione" + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01_alarm.json b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01_alarm.json new file mode 100644 index 00000000..17b29fa9 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/Tend_FIMAT_01_alarm.json @@ -0,0 +1,19 @@ +[ + { + "description": "Anomalie Macchina", + "tipoMem": "Int", + "memAddr": "40002", + "index": 2, + "size": 1, + "messages": [ + "Emergenza Premuta", + "##Macchina in Manuale", + "Azzeramento asse non ancora eseguito o anomalia al posizionamento valvole", + "Anomalia alla bilancia (errore, mancanza comunicazione o fuori scala)", + "Anomalia ad elemento di dosaggio", + "##Richiesta Sospensione attività", + "##Azzeramento peso in corso", + "##" + ] + } +] \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/PROC/setupConsumi.json b/IOB-WIN-NEXT/DATA/PROC/setupConsumi.json new file mode 100644 index 00000000..1a154408 --- /dev/null +++ b/IOB-WIN-NEXT/DATA/PROC/setupConsumi.json @@ -0,0 +1,11 @@ +{ + "addHeader": true, + "numDec": 2, + "convRatio": { + "C01": 0.100, + "C02": 0.100, + "C03": 0.100, + "C04": 0.100, + "C05": 0.100 + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj index a13ecd45..b7c4cadb 100644 --- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj +++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj @@ -124,6 +124,9 @@ ..\packages\EgwProxy.OsaiCncLib.3.6.2205.2015\lib\EgwProxy.OsaiCncLib.XmlSerializers.dll + + ..\packages\EgwProxy.SqlDb.3.6.2303.1515\lib\EgwProxy.SqlDb.dll + ..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll @@ -137,8 +140,8 @@ False ExtLib\krcc.dll - - ..\packages\MapoSDK.6.14.2211.3016\lib\MapoSDK.dll + + ..\packages\MapoSDK.6.14.2304.1209\lib\MapoSDK.dll ..\packages\MathNet.Numerics.4.15.0\lib\net461\MathNet.Numerics.dll @@ -150,10 +153,10 @@ ..\packages\MTConnect.NET.2.9.1.28314\lib\net40\MTConnect-NET.dll - ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll - - ..\packages\NLog.4.7.13\lib\net45\NLog.dll + + ..\packages\NLog.5.1.2\lib\net46\NLog.dll ..\packages\OmronFinsTCP.Net.3.0.0.0\lib\net40\OmronFinsTCP.Net.dll @@ -189,6 +192,7 @@ ..\packages\System.Formats.Asn1.6.0.0\lib\net461\System.Formats.Asn1.dll + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll @@ -230,14 +234,19 @@ VersGen.cs + + + + + @@ -312,17 +321,98 @@ + + + PreserveNewest + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + Always + + + - + - + @@ -337,17 +427,11 @@ - - Always - - - Always - + + - - Always - + @@ -396,12 +480,8 @@ - - Always - - - Always - + + Always @@ -514,33 +594,15 @@ Always - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - + + + + + + + + + @@ -555,18 +617,10 @@ Always - - Always - - - Always - - - Always - - - Always - + + + + @@ -577,18 +631,10 @@ - - Always - - - Always - - - Always - - - Always - + + + + @@ -606,30 +652,14 @@ - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - + + + + + + + + @@ -656,11 +686,9 @@ - - Always - + - Always + PreserveNewest @@ -763,6 +791,9 @@ + + Always + diff --git a/IOB-WIN-NEXT/IobConfiguration.cs b/IOB-WIN-NEXT/IobConfiguration.cs index af6eb8c3..e4f5e401 100644 --- a/IOB-WIN-NEXT/IobConfiguration.cs +++ b/IOB-WIN-NEXT/IobConfiguration.cs @@ -51,11 +51,30 @@ namespace IOB_WIN_NEXT /// public string cpuType { get; set; } = ""; + /// + /// Indica che sono disabilitati i Task2Exe (tipicamente gestione scrittura verso PLC) + /// + public bool disableExeTask { get; set; } = false; + + /// + /// Indica che sono disabilitate le fasi controllo stato/semafori (tipicamente x impianti + /// con PLC "suddivisi", PLC + HMI) + /// + public bool disableStateCh { get; set; } = false; + + /// Nome del file IOB di avvio (REDIS <--> MAN) + public string filenameIOB { get; set; } = "ND"; + /// /// Nome file di INI /// public string iniFileName { get; set; } = ""; + /// + /// Array degli elementi di traduzione item + /// + public Dictionary itemTranslation { get; set; } = new Dictionary(); + /// /// Valore MAX per countdown segnali blinking /// diff --git a/IOB-WIN-NEXT/IobGeneric.cs b/IOB-WIN-NEXT/IobGeneric.cs index 276a831d..c96550f5 100644 --- a/IOB-WIN-NEXT/IobGeneric.cs +++ b/IOB-WIN-NEXT/IobGeneric.cs @@ -19,7 +19,11 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using System.Windows.Shell; +using System.Xml.Serialization; using static IOB_UT_NEXT.CustomObj; +using static IOB_UT_NEXT.DataModel.Fimat; +using static MapoSDK.WharehouseData; namespace IOB_WIN_NEXT { @@ -106,6 +110,10 @@ namespace IOB_WIN_NEXT /// Indicazione VETO check status IOB x evitare loop troppo stretti... /// public DateTime dtVetoCheckIOB = DateTime.Now.AddDays(-1); + /// + /// Indicazione VETO check sync ricette x evitare loop troppo stretti... + /// + public DateTime dtVetoCheckSyncRecipe = DateTime.Now.AddHours(-1); /// /// Abilitazione lettura PrgName @@ -259,6 +267,16 @@ namespace IOB_WIN_NEXT /// public TCMan tcMan = new TCMan(0.5, 1.3, 5); + /// + /// Imposta veto lettura dati (es per DB a 2 sec) + /// + public DateTime vetoDataRead = DateTime.Now; + + /// + /// Imposta veto SYNC dati (es per DB 2 DB a 10 sec) + /// + public DateTime vetoDataSync = DateTime.Now; + /// /// Imposta veto chiamata split (durante chiamata, per 60 sec) /// @@ -283,7 +301,8 @@ namespace IOB_WIN_NEXT if (IOBConf != null) { // init oggetto redis... - redisMan = new RedisIobCache(IOBConf.serverData.MPIP, IOBConf.codIOB, IOBConf.tipoIob.ToString(), IOBConf.minDeltaSec); + redisMan = new RedisIobCache(IOBConf.serverData.MPIP, IOBConf.filenameIOB, $"{IOBConf.tipoIob}", IOBConf.minDeltaSec); + //redisMan = new RedisIobCache(IOBConf.serverData.MPIP, IOBConf.codIOB, $"{IOBConf.tipoIob}", IOBConf.minDeltaSec); // initi oggetto TCMan tcMan = new TCMan(IOBConf.TCLambda, IOBConf.TCMaxDelayFactor, IOBConf.TCMaxIncrPz); @@ -815,6 +834,26 @@ namespace IOB_WIN_NEXT } } + /// + /// URL per chiamata generazione Snapshot Dossier giornalieri alla data + /// + public string urlFixDailyDossier + { + get + { + string answ = ""; + try + { + answ = $@"{cIobConf.serverData.TRANSP}://{cIobConf.serverData.MPIP}{cIobConf.serverData.MPURL}{cIobConf.serverData.CMDALIVE}/fixDailyDossier/{cIobConf.codIOB}"; + } + catch (Exception exc) + { + lgError(exc, "Errore in composizione urlFixDailyDossier"); + } + return answ; + } + } + /// /// URL per chiamata generazione ODL giornalieri alla data /// @@ -1125,6 +1164,26 @@ namespace IOB_WIN_NEXT } } + /// + /// URL per chiusura PODL --> ODL corrente (metodo GET)... + /// + public string urlPODLClose + { + get + { + string answ = ""; + try + { + answ = $@"{cIobConf.serverData.TRANSP}://{cIobConf.serverData.MPIP}{cIobConf.serverData.MPURL}{cIobConf.serverData.CMDALIVE}/closePODL/{cIobConf.codIOB}?idxPOdl="; + } + catch (Exception exc) + { + lgError(exc, "Errore in composizione urlPODLClose"); + } + return answ; + } + } + /// /// URL per segnalazione reboot... /// @@ -1227,6 +1286,26 @@ namespace IOB_WIN_NEXT } } + /// + /// URL per chiusura PODL --> ODL corrente (metodo GET)... + /// + public string urlSetHashDict + { + get + { + string answ = ""; + try + { + answ = $@"{cIobConf.serverData.TRANSP}://{cIobConf.serverData.MPIP}{cIobConf.serverData.MPURL}{cIobConf.serverData.CMDALIVE}/setRedisHashDict/{cIobConf.codIOB}"; + } + catch (Exception exc) + { + lgError(exc, "Errore in composizione urlSetHashDict"); + } + return answ; + } + } + /// /// URL per salvataggio dati associazione Machine 2 IOB... /// @@ -1538,10 +1617,8 @@ namespace IOB_WIN_NEXT /// public void accodaOtherData(string newLine) { - // inserisco in cima allo stack, trimmo e aggiorno display - string strOtherData = limitLine2show(string.Format("{0}{1}{2}", newLine, Environment.NewLine, parentForm.dataMonitor_3)); - //parentForm.dataMonitor_3 = strOtherData; - parentForm.WriteTextSafe(strOtherData); + // inserisco in cima allo stack + parentForm.WriteTextSafe(newLine); } /// @@ -1787,6 +1864,11 @@ namespace IOB_WIN_NEXT processDataSync(); break; + case taskType.processOtherInfo: + bool okProc = processOtherInfo(item.Key, item.Value); + taskVal = okProc ? $"OK processOtherInfo | {item.Key} | {item.Value}" : $"ERROR processOtherInfo | {item.Key} | {item.Value}"; + break; + default: taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC"; lgInfo($"Chiamata senza processing: taskOk: {taskOk} | taskVal: {taskVal}"); @@ -1883,7 +1965,7 @@ namespace IOB_WIN_NEXT * - verifica che su DB sia abilitato AUTO ODL * - il server inserisce un evento fine prod HW 1 minuto prima e inizio setup HW * - viene duplicato e chiuso ODL corrente - * - viene fatto partire ODL nuovo ADESSO + * - viene okReport partire ODL nuovo ADESSO * - num pezzi come ODL precedente (o da media 3 ODL precedenti) * - conferme pezzi & co... gestione NULL (NON SERVONO si tratta di impianti SENZA gestione vera ODL) * - reset contapezzi PLC locale... @@ -1893,8 +1975,8 @@ namespace IOB_WIN_NEXT * DA VALUTARE (x macchine tipo linea con + impianti... es valvital) SE * - creare una gestione ALTERNATIVA sul server che preveda impianto LEADER e impianti follower (RIGIDAMENTE CONFIGURATI) * - ogni volta che si fa setup LEADER --> si ripete su impianti FOLLOWER (eventi!!!) - * - viene fatto reset contapezzi sui follower (+ altre operazioni opzionali, ES imposstazione nome commessa, quantità, articolo...) - * - viene fatto reset + nuovo ODL (con stessi articoli e quantità) su follower, SENZA avere gestione x ODL di un codice esterno (quindi registra TUTTO ma NON RITORNERA' dati non avendo link verso esterno) + * - viene okReport reset contapezzi sui follower (+ altre operazioni opzionali, ES imposstazione nome commessa, quantità, articolo...) + * - viene okReport reset + nuovo ODL (con stessi articoli e quantità) su follower, SENZA avere gestione x ODL di un codice esterno (quindi registra TUTTO ma NON RITORNERA' dati non avendo link verso esterno) * - serve NUOVA TABELLA delle macchine LEADER | FOLLOWER (1:n) e gestione da MP/IO * * ***************************************************/ @@ -1930,7 +2012,7 @@ namespace IOB_WIN_NEXT { lgError($"Eccezione in forceSplitOdl{Environment.NewLine}{exc}"); } - // se fatto --> resetto contapezzi!!! + // se okReport --> resetto contapezzi!!! if (fatto) { contapezziPLC = 0; @@ -2081,6 +2163,12 @@ namespace IOB_WIN_NEXT processProgram(); // verifico se devo gestire cambio ODL in modo automatico processAutoOdl(); + // verifico se devo gestire auto generazione dossier quotidiana + processAutoDossier(); + // effettua gestione import file se configurato... + processFileImport(); + // effettua process ritorno ricette + processRecipeFileRet(); } else if (ciclo == gatherCycle.VLF) { @@ -2109,6 +2197,7 @@ namespace IOB_WIN_NEXT catch { } } + processRecipeSyncArch(); } // mostra eventuali altri dati di processo... reportDataProc(); @@ -2155,8 +2244,16 @@ namespace IOB_WIN_NEXT { // verifico se devo gestire cambio ODL in modo automatico processAutoOdl(); + // verifico se devo gestire auto generazione dossier quotidiana + processAutoDossier(); // effettua gestione import file se configurato... processFileImport(); + // effettua process ritorno ricette + processRecipeFileRet(); + } + else if (ciclo == gatherCycle.VLF) + { + processRecipeSyncArch(); } // provo a riconnettere SE abilitato tryRestart... @@ -2226,6 +2323,22 @@ namespace IOB_WIN_NEXT return outVal; } + /// + /// Cerca se esiste il parametro opzionale nei KVP (JSON) e lo restituisce + /// + /// + /// + public string getOptJsonKVP(string key) + { + string answ = ""; + // controllo SE HO il parametro + if (memMap.optKVP.ContainsKey(key)) + { + answ = memMap.optKVP[key]; + } + return answ; + } + /// /// Cerca se esiste il parametro opzionale e lo restituisce /// @@ -2603,6 +2716,49 @@ namespace IOB_WIN_NEXT return answ; } + /// + /// Verifica e processing x gestione Dossier quotidiani automatica + /// + public void processAutoDossier() + { + bool fatto = false; + string callResp = ""; + if (!string.IsNullOrEmpty(getOptPar("AUTO_SNAPSHOT_DOSSIER"))) + { + lgTrace("Richiesta processAutoDossier"); + string IOB_MULTI_CNAME = ""; + string[] elencoMulti = null; + string fullUrl = ""; + if (isMulti) + { + // devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali... + IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME"); + elencoMulti = IOB_MULTI_CNAME.Split(','); + } + // controllo SIA abilitato... + bool doProc = false; + DateTime adesso = DateTime.Now; + bool.TryParse(getOptPar("AUTO_SNAPSHOT_DOSSIER"), out doProc); + if (doProc) + { + lgTrace("AUTO_SNAPSHOT_DOSSIER abilitato"); + // chiamo stored x creare Snapshot Dossier giornalieri fino alla data... + callResp = utils.callUrl(urlFixDailyDossier); + fatto = callResp == "OK"; + lgTrace($"Esecuzione processAutoOdl completata --> esito: {callResp}"); + } + else + { + lgTrace("AUTO_SNAPSHOT_DOSSIER DISABILITATO"); + } + } + // loggo se okReport + if (fatto) + { + lgTrace($"Effettuato processAutoDossier, esito positivo | {DateTime.Now:HH.mm.ss}"); + } + } + /// /// Verifica e processing x gestione ODL automatica /// @@ -2738,7 +2894,7 @@ namespace IOB_WIN_NEXT lgTrace("AUTO_CHANGE_ODL DISABILITATO"); } } - // loggo se fatto + // loggo se okReport if (fatto) { lgTrace("Effettuato processAutoOdl"); @@ -3008,27 +3164,31 @@ namespace IOB_WIN_NEXT public Dictionary processTask(Dictionary task2exe) { Dictionary taskDone = new Dictionary(); - if (task2exe != null) + // eseguo realmente solo se NON disabilitata questa gestione (caso doppio PLC/HMI)... + if (!cIobConf.disableExeTask) { - lgInfo($"Task2Exe S01: {task2exe.Count} task ricevuti:"); - int idTask = 0; - foreach (var item in task2exe) + if (task2exe != null) { - idTask++; - lgInfo($"[{idTask:00}] - {item.Key} --> {item.Value}"); - } - // chiamo procedura esecutiva (diversa x ogni IOB) - taskDone = executeTasks(task2exe); - lgInfo($"Task2Exe S02: eseguiti {taskDone.Count} task"); - // loggo tutti i task done... - foreach (var item in taskDone) - { - sendToTaskWatch(item.Key, item.Value); - } - // ora chiamo la cancellazione dei task eseguiti... - foreach (var item in taskDone) - { - remTask2exe(item.Key, item.Value); + lgInfo($"Task2Exe S01: {task2exe.Count} task ricevuti:"); + int idTask = 0; + foreach (var item in task2exe) + { + idTask++; + lgInfo($"[{idTask:00}] - {item.Key} --> {item.Value}"); + } + // chiamo procedura esecutiva (diversa x ogni IOB) + taskDone = executeTasks(task2exe); + lgInfo($"Task2Exe S02: eseguiti {taskDone.Count} task"); + // loggo tutti i task done... + foreach (var item in taskDone) + { + sendToTaskWatch(item.Key, item.Value); + } + // ora chiamo la cancellazione dei task eseguiti... + foreach (var item in taskDone) + { + remTask2exe(item.Key, item.Value); + } } } return taskDone; @@ -3145,7 +3305,7 @@ namespace IOB_WIN_NEXT /// /// Fornisce il valore di flusso e valore in formato valido x messa in coda nel formato - /// dtEve#flux#value#cont DataOra evento + /// dtEve#flux#valReq#cont DataOra evento /// registratoFlusso datiValore da salvare /// @@ -3163,7 +3323,7 @@ namespace IOB_WIN_NEXT /// /// Fornisce il valore di UserLog e valore in formato valido x messa in coda nel formato: - /// dtEve#flusso#value#cont#matrOpr#label#valNum Flusso dati + /// dtEve#flusso#valReq#cont#matrOpr#label#valNum Flusso dati /// (RC/RS/DI)Valore da inviare /// (valStringMatricola operatoreValore etichetta: causale scarto / tagCode protected DateTime forcePzResetUntil = DateTime.Now.AddMinutes(-1); + /// + /// Determina se siano gestite le ricette + /// + protected bool hasRecipe = false; + /// /// Array dei contatori x segnali blinking /// @@ -4228,6 +4401,11 @@ namespace IOB_WIN_NEXT /// protected int maxErroriCheck = utils.CRI("maxErroriCheck"); + /// + /// Quantità massima per singola ricetta (per determinare num ricette da inviare) + /// + protected int maxQtyPerFile = 0; + /// /// Num massimo di errori di rete read (dal PLC) /// @@ -4273,6 +4451,11 @@ namespace IOB_WIN_NEXT /// protected Dictionary TSVC_Data = new Dictionary(); + /// + /// Indica se usare archivio locale ricette vs scarico http/REST + /// + protected bool useLocalRecipe = true; + /// /// Dizionario di VARIABILI da trattare come eventi (da inviare quando cambiano oppure a /// scadenza periodo...) @@ -4312,7 +4495,7 @@ namespace IOB_WIN_NEXT } /// - /// Indica il counter della key richiesta attiva + /// Indica il counter della keyReq richiesta attiva /// - gestito tramite Redis /// - a scadenza 25h /// - incrementato ogni invio di auto ODL @@ -4321,13 +4504,13 @@ namespace IOB_WIN_NEXT { get { - // calcolo key odierna + // calcolo keyReq odierna int answ = redisMan.getKReqCount(dailyKey); return answ; } set { - // calcolo key odierna + // calcolo keyReq odierna redisMan.setKReqCount(dailyKey, value); } } @@ -4434,13 +4617,69 @@ namespace IOB_WIN_NEXT /// protected Dictionary OptCheckCondInt { get; set; } = new Dictionary(); + /// + /// Elenco di valori da tradurre da valori BIT (es ModBus TCP FIMAT) + /// NB: potrebbero essere contemporaneamente attivi + valori e + traduzioni + /// + protected Dictionary OptVar2TranslBit { get; set; } = new Dictionary(); + + /// + /// Elenco di valori da tradurre da valori INT esclusivi (es ModBus TCP FIMAT) + /// + protected Dictionary OptVar2TranslInt { get; set; } = new Dictionary(); + + /// + /// Elenco dei path utili x processing + /// + protected Dictionary pathList { get; set; } = new Dictionary(); + + /// + /// Gestione archivio serializzato PODL inviati (tramite file temp locale/REDIS) + /// + protected Dictionary POdlSentFileArch + { + get + { + Dictionary answ = new Dictionary(); + string redKey = redisMan.redHash($"IOB:Status:{cIobConf.codIOB}:POdlSent"); + string rawData = redisMan.getRSV(redKey); + if (!string.IsNullOrEmpty(rawData)) + { + try + { + answ = JsonConvert.DeserializeObject>(rawData); + lgInfo($"Rilettura status POdlSentFileArch: trovati {answ.Count} record"); + } + catch (Exception exc) + { + lgError($"Errore in deserializzazione POdlSentFileArch{Environment.NewLine}{exc}"); + } + } + return answ; + } + set + { + string rawVal = JsonConvert.SerializeObject(value); + string redKey = redisMan.redHash($"IOB:Status:{cIobConf.codIOB}:POdlSent"); + redisMan.setRSV(redKey, rawVal); + lgDebug($"Salvataggio status POdlSentFileArch | {value.Count} record"); + } + } + + /// + /// Elenco corrente (in memory) PODL inviati all'impianto + /// chiave: idxPODL + /// valore: record PODL + /// + protected Dictionary POdlSentList { get; set; } = new Dictionary(); + /// /// Indica se sia stato resettato un contapezzi /// protected bool pzCountResetted { get; set; } = false; /// - /// Fornisce il valore letto da BITMAP in formato valido x messa in coda nel formato dtEve#value#cont + /// Fornisce il valore letto da BITMAP in formato valido x messa in coda nel formato dtEve#valReq#cont /// protected string qEncodeIN { @@ -4458,7 +4697,12 @@ namespace IOB_WIN_NEXT } /// - /// Indica se vada inviata la key richiesta con lo split/autoODL + /// Definizioni x replace in file ricette + /// + protected Dictionary RecipeReplRules { get; set; } = new Dictionary(); + + /// + /// Indica se vada inviata la keyReq richiesta con lo split/autoODL /// protected bool sendKeyRichiesta { get; set; } = false; @@ -4512,6 +4756,7 @@ namespace IOB_WIN_NEXT /// Dizionario condizioni di veto log x ogni tipo di messaggio (periodo differente secondo livello) /// protected Dictionary VetoLog { get; set; } = new Dictionary(); + /// /// Dizionario conteggio numero volte che si fa veto log x ogni tipo di messaggio /// @@ -4591,7 +4836,7 @@ namespace IOB_WIN_NEXT /// /// Decodifica valore della coda IN nel formato answ[0]=dtEve answ[1]=valore answ[2]=counter /// - /// dtEve + '#' + value + '#' + cont + /// dtEve + '#' + valReq + '#' + cont /// protected static string[] qDecodeIN(string queueVal) { @@ -4608,6 +4853,27 @@ namespace IOB_WIN_NEXT return answ; } + /// + /// Classe di base implementazione traduzione di una LUT da memoria come valore BIT a valore + /// esplicito x FLog + /// + protected virtual void checkTranslateBit() + { + // verifico se devo processare decodifica di qualche valore... + if (OptVar2TranslBit != null && OptVar2TranslBit.Count > 0) + { } + } + + /// + /// Classe di base implementazione traduzione di una LUT da memoria come valore INT a valore + /// esplicito x FLog + /// + protected virtual void checkTranslateInt() + { + if (OptVar2TranslInt != null && OptVar2TranslInt.Count > 0) + { } + } + /// /// Restituisce stato allarmi in formato byte[] /// @@ -4621,30 +4887,6 @@ namespace IOB_WIN_NEXT // banchi in array Int16 --> scompongo for (int i = 0; i < item.size / 2; i++) { -#if false - // verifico se usare LUT - bool useLUT = memSetR != null && memSetR.Count > 0; - if (useLUT) - { - int lutAddress = 40000 + item.index; - if (HoldingRegisterLUT.ContainsKey(lutAddress)) - { - try - { - listInt = HoldingRegisterLUT[lutAddress]; - } - catch (Exception exc) - { - lgError($"Errore in lettura da HoldingRegisterLUT per indirizzo {lutAddress} | item {item.memAddr}{Environment.NewLine}{exc}"); - } - } - } - else - { - listInt = readInputReg(item.index, item.size); - } - currStatus = ModbusClient.ConvertRegistersToInt(listInt); -#endif currStatus = getAlarmStatus(item); // aggiornamento blink counters dato nuovo valore @@ -4661,6 +4903,42 @@ namespace IOB_WIN_NEXT return answ; } + /// + /// Imposta eventuali altri valori default + /// + protected void fixDefaultPar() + { + // parametro max tentativi PING... + string s_maxPingRetry = getOptPar("MAX_PING_RETRY"); + if (!string.IsNullOrEmpty(s_maxPingRetry)) + { + int numRetry = 5; + int.TryParse(s_maxPingRetry, out numRetry); + maxPingRetry = numRetry; + } + + string s_maxErrCheck = getOptPar("MAX_ERR_CHECK"); + if (!string.IsNullOrEmpty(s_maxErrCheck)) + { + int numErr = 50; + int.TryParse(s_maxErrCheck, out numErr); + maxErroriCheck = numErr; + } + + string s_watchDogPer = getOptPar("WATCHDOG_PERIOD"); + if (!string.IsNullOrEmpty(s_watchDogPer)) + { + int numPer = 3; + int.TryParse(s_watchDogPer, out numPer); + watchDogPeriod = numPer; + } + + // sistemo conf folder acquisizioen files + fileImportFolder = getOptPar("FILE_IMPORT_FOLDER"); + fileImportType = getOptPar("FILE_IMPORT_TYPE"); + fileArchiveFolder = getOptPar("FILE_ARCHIVE_FOLDER"); + } + /// /// Implementazione di riferimento della verifica stato allarmi /// @@ -4683,6 +4961,21 @@ namespace IOB_WIN_NEXT return answ; } + /// + /// Fornisce formato valido x messa in coda nel formato dtEve#valReq#cont + /// + protected string getEncodSigLog(DateTime DtEvent, int val2log, int counter) + { + string answ = ""; + try + { + answ = $"{DtEvent:yyyyMMddHHmmssfff}#{val2log:X2}#{counter}"; + } + catch + { } + return answ; + } + /// /// Recupero dati da FluxLog /// @@ -4863,15 +5156,6 @@ namespace IOB_WIN_NEXT return answ; } - /// - /// Procedura di import file... - /// - /// - protected virtual bool importFile(string fileItem) - { - return false; - } - /// /// Recupera da server set di dati specifici x IOB /// @@ -4943,15 +5227,9 @@ namespace IOB_WIN_NEXT // se ok --> sposto invio DateTime adesso = DateTime.Now; string archBasePath = Path.Combine(basePath, "DATA", "HIST", $"{adesso:yyyy}"); - if (!Directory.Exists(archBasePath)) - { - Directory.CreateDirectory(archBasePath); - } + baseUtils.checkDir(archBasePath); string archPath = Path.Combine(archBasePath, $"{adesso:MMddHHmmss}"); - if (!Directory.Exists(archPath)) - { - Directory.CreateDirectory(archPath); - } + baseUtils.checkDir(archPath); lgInfo($"Richiesta Dir Move | {localPath} | {archPath}"); foreach (var item in fileList) { @@ -4983,12 +5261,7 @@ namespace IOB_WIN_NEXT string basePath = Application.StartupPath; string tempDir = Path.Combine(basePath, locDir); lgInfo($"iobWriteLocalCSV | locDir: {locDir} | sAddHeader: {sAddHeader} | tempDir: {tempDir}"); - if (!Directory.Exists(tempDir)) - { - lgInfo("CSV: tempDir not found"); - Directory.CreateDirectory(tempDir); - lgInfo($"CSV: created local dir {tempDir}"); - } + baseUtils.checkDir(tempDir); string filePath = Path.Combine(tempDir, "articoli.csv"); answ = DataExport.SaveToCsv(ListaArticoli, filePath, addHeader); if (answ) @@ -5006,6 +5279,60 @@ namespace IOB_WIN_NEXT return answ; } + /// + /// Effettua traduzione ITEM da LUT parametrica (keyReq: tipo+id) del file di conf, se non + /// trovo uso keyReq + /// + /// + /// + /// + protected virtual string itemTranslation(string tipo, string id) + { + string answ = ""; + if (cIobConf.itemTranslation != null) + { + string lemma = id; + if (!string.IsNullOrEmpty(tipo)) + { + lemma = $"{tipo}_{id}"; + } + // cerco nel dizionario delle traduzioni SE esiste un valore e prendo quello, + // altrimenti uso il lemma... + if (cIobConf.itemTranslation.ContainsKey(lemma)) + { + answ = cIobConf.itemTranslation[lemma]; + } + else + { + answ = lemma; + } + } + return answ; + } + + /// + /// Effettua traduzione ITEM da LUT parametrica (keyReq: lemma) del file di conf, se non + /// trovo uso keyReq + /// + /// + /// + protected virtual string itemTranslation(string lemma) + { + string answ = ""; + if (cIobConf.itemTranslation != null) + { + if (cIobConf.itemTranslation.ContainsKey(lemma)) + { + answ = cIobConf.itemTranslation[lemma]; + } + else + { + answ = lemma; + } + } + return answ; + } + /// /// Effettua logging DEBUG corretto impostanto anche la variabile IOB prima di scrivere... /// @@ -5259,48 +5586,6 @@ namespace IOB_WIN_NEXT } } } - /// - /// Verifica se ci sia veto log attivo e gestisce casistiche - /// - /// - /// - /// - private bool checkLogVeto(int vetoSec, ref string message) - { - //verifico SE si debba fare log, altrimenti metto in coda... - bool doVeto = true; - DateTime adesso = DateTime.Now; - if (VetoLog.ContainsKey(message)) - { - // conteggio num veto a +1... - if (VetoLogCount.ContainsKey(message)) - { - VetoLogCount[message]++; - } - else - { - VetoLogCount.Add(message, 1); - } - // controllo scadenza, quando superata soglia aggiorno messaggio con {n} x {messaggio} - if (adesso.Subtract(VetoLog[message]).TotalSeconds > vetoSec) - { - doVeto = false; - string newMessage = $"{VetoLogCount[message]} x {message}"; - VetoLog.Remove(message); - VetoLogCount.Remove(message); - message = newMessage; - } - } - else - { - // primo --> loggo - doVeto = false; - VetoLog.Add(message, adesso.AddSeconds(vetoSec)); - VetoLogCount.Add(message, 0); - } - // restituisco esito! - return doVeto; - } /// /// Effettua logging INFO corretto impostanto anche la variabile IOB prima di scrivere... @@ -5451,6 +5736,7 @@ namespace IOB_WIN_NEXT setupMemMap(); setupOptMemPar(); setupFileDecod(); + setupSpecialParams(); } catch (Exception exc) { @@ -5523,57 +5809,108 @@ namespace IOB_WIN_NEXT /// /// Effettua eventuale file import, archiviando file importati + /// - es gestione file excel di Giacovelli + /// - es gestione ritorno ricette FIMAT /// /// protected virtual bool processFileImport() { bool answ = false; + + /* ------------------------------------------ + * esecuzione cablata, si potrebbe costruire una cosa più flessibile tramite conf: + * Oggetto MultiStepFileImport + * { + * StepName: Step01 + * ProcType: Excel2Json + * FolderIn: xxx + * FolderOut: xxx + * FolderErr: xxx + * },{ + * StepName: Step02 + * ProcType: Json2RegGiac + * FolderIn: xxx + * FolderOut: xxx + * FolderErr: xxx + * } + * ------------------------------------------*/ if (!string.IsNullOrEmpty(fileImportFolder)) { // verifico esistenza folders... if (Directory.Exists(fileImportFolder)) { + string errore = ""; // verifico archivio - string dirArchive = $"{fileImportFolder}/archive"; - if (!Directory.Exists(dirArchive)) - { - Directory.CreateDirectory(dirArchive); - } - // cerco files - var listFiles = Directory.GetFiles(fileImportFolder, fileImportType); + string dirArchive = Path.Combine(fileImportFolder, "archive"); + baseUtils.checkDir(dirArchive); + string dirConvert = Path.Combine(fileImportFolder, "converted"); + baseUtils.checkDir(dirConvert); + Dictionary statsColl = new Dictionary(); + // cerco files da convertire + var listFiles2Conv = Directory.GetFiles(fileImportFolder, fileImportType); // se li trovo --> chiamo import! - if (listFiles != null && listFiles.Length > 0) + if (listFiles2Conv != null && listFiles2Conv.Length > 0) { - foreach (var fileItem in listFiles) + // leggo file conf di riferimento + FileProcMan fpm = new FileProcMan(dirArchive, dirConvert, "Tools", "ExcImport.exe", "RefExcConv.json", "DB Loco"); + int idxODL = 0; + foreach (var fileItem in listFiles2Conv) { - string errore = ""; - answ = importFile(fileItem); + // calcolo ODL x il file... + string fileName = Path.GetFileNameWithoutExtension(fileItem); + DateTime dataDoc = DateTime.Today; + DateTime.TryParse(fileName, out dataDoc); + // cerco lotto x giornata... + string sIdxODL = utils.callUrl(urlGetOdlAtDate(dataDoc)); + int.TryParse(sIdxODL, out idxODL); + // chiamo conversione + TimeSpan timeElaps = fpm.doProcess(fileItem, idxODL); + statsColl.Add($"ExcImport conversion executed for {fileItem}", timeElaps); + lgTrace(($"ExcImport conversion executed for {fileItem} | {timeElaps.Milliseconds}ms")); + } + } + + // cerco i file json x invio + var listFiles2Upload = Directory.GetFiles(dirConvert, "*.json"); + // se li trovo --> chiamo import! + if (listFiles2Upload != null && listFiles2Upload.Length > 0) + { + foreach (var fileItem in listFiles2Upload) + { + // leggo il file json + Dictionary list2Send = new Dictionary(); + string rawData = File.ReadAllText(fileItem); + if (!string.IsNullOrEmpty(rawData)) + { + var convData = JsonConvert.DeserializeObject>(rawData); + if (convData != null) + { + list2Send = convData; + // ora accodo contenuto file json... + accodaRawData(rawTransfType.RegGiacenze, list2Send); + } + } + + // processo invio: provo forzare send... + answ = svuotaCodaRawTransf(true); if (!answ) { - errore = $"Errore in fase di importFile x {fileItem}"; + errore = $"Errore in fase di invio dati svuotaCodaRawTransf x {fileItem}"; } + // archivio il file else { - // provo forzare send... - answ = svuotaCodaRawTransf(true); - if (!answ) - { - errore = $"Errore in fase di invio dati svuotaCodaRawTransf x {fileItem}"; - } - else - { - // sposto file... - File.Move(fileItem, $"{dirArchive}/{Path.GetFileName(fileItem)}"); - } + // sposto file... + File.Move(fileItem, $"{dirArchive}/{Path.GetFileName(fileItem)}"); + + // fixme todo !!! eliminare json?!?!? } + // log eventuali errori if (!answ) { string dirError = $"{fileImportFolder}/errors"; - if (!Directory.Exists(dirError)) - { - Directory.CreateDirectory(dirError); - } + baseUtils.checkDir(dirError); // sposto file... File.Move(fileItem, $"{dirError}/{Path.GetFileName(fileItem)}"); // segno errore! @@ -5587,6 +5924,11 @@ namespace IOB_WIN_NEXT return answ; } + /// + /// Cerca di recuperare i file generati dall'impianto in merito al processing degli ordini + /// + /// + /// /// Processa le richieste di scrittura memoria /// @@ -5647,6 +5989,113 @@ namespace IOB_WIN_NEXT return answ; } + /// + /// Processing di dati "OtherInfo" da implementare caso x caso (qui riportato caso FIMAT ricette...) + /// + /// + /// + protected virtual bool processOtherInfo(string keyReq, string valReq) + { + bool answ = false; + // test file import da conf... se hasRecipe=true --> modalità Tenditalia/FIMAT... + if (hasRecipe) + { + string archBasePath = Path.Combine(pathList["path-locBase"], pathList["path-03-Recv"]); + string reportBasePath = pathList["path-outReport"]; + baseUtils.checkDir(reportBasePath); + // verifico x cosa è stato richiesto attività (che esista la folder...) + string folderPath = Path.Combine(archBasePath, keyReq); + if (Directory.Exists(folderPath)) + { + // calcolo il nome zip di destinazione finale + int anno = DateTime.Today.Year; + int.TryParse(keyReq.Substring(0, 4), out anno); + string zipDir = Path.Combine(archBasePath, $"{anno}"); + baseUtils.checkDir(zipDir); + string zipName = Path.Combine(zipDir, $"{keyReq}.zip"); + // gestione report OUT + string reportPath = Path.Combine(reportBasePath, $"{keyReq}.csv"); + // verifico il tipo di attività e procedo + switch (valReq) + { + case "Arch": + // solo archiviazione ZIP della folder... + answ = doZipArchiveFolder(folderPath, zipName); + // se fatto --> elimino record da REDIS (locale e remoto) + if (answ) + { + RecipeRemoveWeekStatus(keyReq); + } + break; + + case "SendArch": + // preparazione file di resoconto contumi + answ = RecipeDoConsumeReport(folderPath, reportPath); + if (answ) + { + // infine archiviazione ZIP della folder... + bool okArchive = doZipArchiveFolder(folderPath, zipName); + // se fatto --> elimino record da REDIS (locale e remoto) + if (okArchive) + { + RecipeRemoveWeekStatus(keyReq); + } + } + break; + + default: + break; + } + } + } + return answ; + } + + /// + /// Sync archivio ricette (Macchina <--> MES) + /// + /// + protected virtual bool processRecipeSyncArch() + { + bool answ = false; + // test file import da conf... se hasRecipe=true --> modalità Tenditalia/FIMAT... + if (hasRecipe) + { + DateTime adesso = DateTime.Now; + // verifico veto sync ricette (x non ripetere troppo spesso) + if (adesso > dtVetoCheckSyncRecipe) + { + // effettua sync eventuali NUOVI file ricette + bool okSync = RecipeDoSyncRecipe(); + // imposto veto a 1h... + dtVetoCheckSyncRecipe = adesso.AddHours(1); + } + } + return answ; + } + + protected virtual bool processRecipeFileRet() + { + bool answ = false; + // test file import da conf... se hasRecipe=true --> modalità Tenditalia/FIMAT... + if (hasRecipe) + { + // recupera i NUOVI file e li sposta in folder locale temp + string remoPath = Path.Combine(pathList["path-locBase"], pathList["path-05-remExe"]); + string archBasePath = Path.Combine(pathList["path-locBase"], pathList["path-03-Recv"]); + string tempPath = Path.Combine(archBasePath, "TEMP"); + baseUtils.checkDir(tempPath); + bool okRetrieve = RecipeTaskDoneRetrieve(remoPath, tempPath); + + // ora cerca nella folder locale e processa i files... + bool okCheck = RecipeDoCheckFileProc(tempPath, archBasePath); + + // verifica se sia da creare/inviare il record settimanale di consumo (dopo la mezzanotte del lunedì inizio settimana) + bool okSent = RecipeDoProcCons(); + } + return answ; + } + protected void raiseRefresh(newDisplayData currDispData) { if (currDispData != null) @@ -5662,6 +6111,482 @@ namespace IOB_WIN_NEXT } } + /// + /// Registra i file in directory suddivise x anno/settimana e restitusice elenco + /// + /// Percorso file XML + /// Percorso base archivi + /// + protected List RecipeDoArchiveWeek(string recipeFile, string archBasePath) + { + List weeksProc = new List(); + // init var + int week = 0; + string archPath = ""; + Calendar cal = new CultureInfo("it-IT").Calendar; + // leggo contenuto XML + string rawData = File.ReadAllText(recipeFile); + // deserializza file XML x recuperare righe consumo + XmlSerializer serializer = new XmlSerializer(typeof(ARecipe)); + using (StringReader reader = new StringReader(rawData)) + { + try + { + var currRecipe = (ARecipe)serializer.Deserialize(reader); + if (currRecipe != null) + { + // recupero data-ora ricetta da campo string + DateTime recExeDt = DateTime.Today; + DateTime.TryParse(currRecipe.DesRecipe.DesData.Date, out recExeDt); + // calcolo week da data-ora file... + week = cal.GetWeekOfYear(recExeDt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + // verifico se ci sia la settimana indicata in elenco... + string currWeek = $"{recExeDt:yyyy}-{week:00}"; + if (!weeksProc.Contains(currWeek)) + { + weeksProc.Add(currWeek); + } + // sposto file x in area week + string rName = Path.GetFileName(recipeFile); + archPath = Path.Combine(archBasePath, $"{recExeDt:yyyy}-{week:00}"); + baseUtils.checkDir(archPath); + string destPath = Path.Combine(archPath, rName); + // sposto files + File.Move(recipeFile, destPath); + } + } + catch (Exception exc) + { + lgError($"Eccezione in RecipeDoArchiveWeek{Environment.NewLine}{exc}"); + } + } + return weeksProc; + } + + /// + /// Verifica i file recuperati + /// - PODL da inviare a MAPO + /// - accumulo consumo materiali + /// + /// + /// + /// + protected virtual bool RecipeDoCheckFileProc(string localPath, string archBasePath) + { + bool answ = false; + List weekProcNew = new List(); + + // recupero elenco files... + var fileList = Directory.GetFiles(localPath); + if (fileList != null && fileList.Count() > 0) + { + foreach (var recipeFile in fileList) + { + // processo eventuale apertura/chiusura PODL + bool okPOdl = RecipeDoProcessPODL(recipeFile); + + // processa i file archiviando x settimana + var procWeeks = RecipeDoArchiveWeek(recipeFile, archBasePath); + + // aggiungo all'elenco settimane SE mancassero le sett inserite + foreach (var item in procWeeks) + { + if (!weekProcNew.Contains(item)) + { + weekProcNew.Add(item); + } + } + } + if (weekProcNew.Count > 0) + { + // predispongo azioni di base ammesse + Dictionary redHashWeek = new Dictionary(); + Dictionary stdActList = new Dictionary(); + stdActList.Add("Arch", "Archivia"); + stdActList.Add("SendArch", "Invia + Archivia"); + List weekHashUpdate = new List(); + // aggiorna in REDIS (hashList) status delle settimane coinvolte + foreach (var cWeek in weekProcNew) + { + string weekPath = Path.Combine(archBasePath, $"{cWeek}"); + var weekFileList = Directory.GetFiles(weekPath, "*.xml"); + PeriodInfo cPerInfo = new PeriodInfo() + { + NumFilesReceived = weekFileList.Count(), + CurrStatus = "Ricevute", + ActionList = stdActList + }; + string rawWeek = JsonConvert.SerializeObject(cPerInfo); + redHashWeek.Add(cWeek, rawWeek); + } + // salvo in redis... + string fullKey = redisMan.redHash($"IOB:Status:{cIobConf.codIOB}:WeekStats"); + var okHashDict = redisMan.redSaveHashDict(fullKey, redHashWeek); +#if false + // manda a MP-IO update delle settimane processate (+ azioni) + Dictionary currStats = redisMan.redGetHashDict(fullKey); +#endif + // invio ANCHE in MP-IO l'update delle info... + string remUrl = urlSetHashDict; + string dictPayload = JsonConvert.SerializeObject(redHashWeek); + callUrlWithPayload(remUrl, dictPayload, false); + } + } + + return answ; + } + + /// + /// Verifica se si debba registrare/inviare il report periodico di consumo indicato + /// + /// + protected bool RecipeDoProcCons() + { + bool answ = false; + // calcolo quale sia la settimana corrente... + int week = 0; + DateTime adesso = DateTime.Now; + Calendar cal = new CultureInfo("it-IT").Calendar; + // calcolo week da data-ora file... + week = cal.GetWeekOfYear(adesso, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + // verifico se ci sia la settimana indicata in elenco... + string currWeek = $"{adesso:yyyy}-{week:00}"; + // recupero elenco delle settimane da processare da redis/WeekStats + string fullKey = redisMan.redHash($"IOB:Status:{cIobConf.codIOB}:WeekStats"); + Dictionary currStats = redisMan.redGetHashDict(fullKey); + if (currStats != null && currStats.Count > 0) + { + // definisco il DICT delle settimane da processare (= settimane passate, NON la corrente...) + foreach (var weekData in currStats) + { + if (weekData.Key != currWeek) + { + // ...x ogni settimana PASSATA effettua SendArch... --> lancia un task! + processOtherInfo(weekData.Key, "SendArch"); + } + } + answ = true; + } + return answ; + } + + /// + /// Acquisisce eventuali nuove ricette + /// + /// + protected bool RecipeDoSyncRecipe() + { + bool answ = false; + DateTime asdesso = DateTime.Now; + try + { + string recLocalArchPath = Path.Combine(pathList["path-locBase"], pathList["path-00-Arch"]); + string recRemArchPath = pathList["path-06-remRec"]; + // leggo da redis (se disponibile) elenco hast file/MD5.... + string fullKey = redisMan.redHash($"IOB:Remote:{cIobConf.codIOB}:FileCheck"); + Dictionary dictRecMd5 = redisMan.redGetHashDict(fullKey); + // leggo la directory remota... + var remoteList = Directory.GetFiles(recRemArchPath); + string fileName = ""; + string newFilePath = ""; + bool doAcquire = false; + int recNum = 0; + int newNum = 0; + string currMd5; + foreach (var remoteFile in remoteList) + { + recNum = 0; + doAcquire = false; + // verifico MD5... + currMd5 = baseUtils.GetFileMd5(remoteFile); + fileName = Path.GetFileName(remoteFile); + // verifo se c'è il file... + if (!dictRecMd5.ContainsKey(fileName)) + { + dictRecMd5.Add(fileName, currMd5); + doAcquire = true; + } + else + { + //// verifico SE sia modificato da meno di 30 gg... + //DateTime lastMod = File.GetLastWriteTime(remoteFile); + if (dictRecMd5[fileName] != currMd5) + { + dictRecMd5[fileName] = currMd5; + doAcquire = true; + } + } + + // se devo aggiungere processo --> fix numRicetta + 10'000 + if (doAcquire) + { + answ = true; + // leggo contenuto... + string recContent = File.ReadAllText(remoteFile); + // calcolo nuovo nome + var namePart = fileName.Split('.'); + int.TryParse(namePart[0], out recNum); + newNum = recNum + 10000; + // modifico ricetta + recContent = recContent.Replace($"{namePart[0]}", $"{newNum}"); + // salvo ricetta modificata in archivio + newFilePath = Path.Combine(recLocalArchPath, $"{newNum}.xml"); + // elimino eventuale file precedente... + if (File.Exists(newFilePath)) + { + File.Delete(newFilePath); + } + File.WriteAllText(newFilePath, recContent); + } + } + // se ho importato qualcosa... + if (answ) + { + // salvo hash dei files... + redisMan.redSaveHashDict(fullKey, dictRecMd5); + } + } + catch (Exception exc) + { + lgError($"Eccezione durante RecipeDoSyncRecipe{Environment.NewLine}{exc}"); + } + return answ; + } + + /// + /// restitusice i record di consumo dei materiali associati al file: + /// + /// Percorso file XML + /// + protected List RecipeGetCons(string recipeFile) + { + List listConsumi = new List(); + // leggo contenuto XML + string rawData = File.ReadAllText(recipeFile); + // deserializza file XML x recuperare righe consumo + XmlSerializer serializer = new XmlSerializer(typeof(ARecipe)); + using (StringReader reader = new StringReader(rawData)) + { + try + { + var currRecipe = (ARecipe)serializer.Deserialize(reader); + if (currRecipe != null) + { + if (currRecipe.ColRecipe != null && currRecipe.ColRecipe.Count > 0) + { + List RigheConsumi = new List(); + foreach (var rigaComp in currRecipe.ColRecipe) + { + ColData datiComp = rigaComp.ColData; + RigheConsumi.Add(datiComp); + } + // recupero data-ora ricetta da campo string + DateTime recExeDt = DateTime.Today; + DateTime.TryParse(currRecipe.DesRecipe.DesData.Date, out recExeDt); + // converto le righe di consumo ColData in ConsRec + listConsumi = RigheConsumi.Select(x => new ConsRec() + { + FileRef = recipeFile, + DtRif = recExeDt, + ColourCode = x.ColourCode, + Description = x.Description, + WeightGrTot = x.Weightgrtotal + }).ToList(); + } + } + } + catch (Exception exc) + { + lgError($"Eccezione in RecipeGetCons{Environment.NewLine}{exc}"); + } + } + return listConsumi; + } + + /// + /// Prepara la ricetta indicata partendo dai dati della ricetta template + dati ODL di riferimento + /// + /// Path del file template della ricetta + /// Record del PODL da inviare + /// Path della ricetta da inviare + protected virtual bool RecipePrepare(string tempPath, string recFilePath, PODLModel podlReq) + { + bool fatto = false; + // leggo il file template ricetta + var rawData = File.ReadAllText(recFilePath); + string fixContent = rawData; + // eseguo sostituzioni + foreach (var rule in RecipeReplRules) + { + string replVal = rule.Value; + // calcolo la sostituzione per i valori SPECIFICI... + if (replVal.Contains("{{PODL}}")) + { + replVal = replVal.Replace("{{PODL}}", $"PODL{podlReq.IdxPromessa:00000000}"); + } + if (replVal.Contains("{{Qty}}")) + { + replVal = replVal.Replace("{{Qty}}", $"{podlReq.NumPezzi}"); + } + if (replVal.Contains("{{Note}}")) + { + replVal = replVal.Replace("{{Note}}", $"{podlReq.Note}"); + } + fixContent = fixContent.Replace(rule.Key, replVal); + } + // scrivo file (secondo quantità...)! + string destPath = Path.Combine(tempPath, $"PODL{podlReq.IdxPromessa:00000000}.xml"); + if (podlReq.NumPezzi <= maxQtyPerFile) + { + File.WriteAllText(destPath, fixContent); + fatto = true; + } + else + { + int numReq = (int)Math.Ceiling((double)podlReq.NumPezzi / maxQtyPerFile); + // splitto e scrivo... + for (int i = 1; i <= numReq; i++) + { + destPath = Path.Combine(tempPath, $"PODL{podlReq.IdxPromessa:00000000}-{i}.xml"); + File.WriteAllText(destPath, fixContent); + } + fatto = true; + } + return fatto; + } + + /// + /// Prepara le ricette dato path temp scaricando elenco PODL + /// + /// + /// Percorso temp di appoggio x preparare ricette (compreso nome macchina) + /// + /// + /// Indica se usare le copie locali delle ricette oppure richiedere da remoto (REST get) + /// + /// + protected virtual bool RecipeReqWriteLocal(string tempPath, bool useLocal) + { + bool fatto = false; + lgTrace($"RecipeReqWriteLocal start | tempPath {tempPath} | useLocal {useLocal}"); + + List reqPOdlList = new List(); + // per prima cosa recupero elenco PODL da gestire.... + var rawListPODL = callUrl(urlGetCurrPODL, false); + if (!string.IsNullOrEmpty(rawListPODL)) + { + try + { + reqPOdlList = JsonConvert.DeserializeObject>(rawListPODL); + } + catch (Exception exc) + { + lg.Error($"Errore: chiamata elenco PODL ha restituito errore{Environment.NewLine}{exc}"); + } + } + else + { + lg.Error($"Errore: chiamata elenco PODL ({urlGetCurrPODL}) ha restituito valore vuoto"); + } + // proseguo se ne ho trovati... + if (reqPOdlList.Count > 0) + { + // in questo elenco devo considerare solo PODL ATTIVI... + List actPOdlList = reqPOdlList.Where(x => x.Attivabile).ToList(); + // da questo elenco,se è rimasto qualcosa, ciclo x ricette da inviare + foreach (var actPodlReq in actPOdlList) + { + // devo escludere i PODL già gestiti + if (!POdlSentList.ContainsKey(actPodlReq.IdxPromessa)) + { + string recFilePath = ""; + try + { + // calcolo path ricetta... + recFilePath = Path.Combine(pathList["path-locBase"], pathList["path-00-Arch"], actPodlReq.Recipe); + // preparo file ricetta x PODL + bool fileOk = RecipePrepare(tempPath, recFilePath, actPodlReq); + if (fileOk) + { + // aggiungo PODL ad elenco dei processati + POdlSentList.Add(actPodlReq.IdxPromessa, actPodlReq); + // indico okReport (almeno per 1 è ok...) + fatto = true; + } + } + catch (Exception exc) + { + lgError($"recipeReqWriteLocal | Errore durante ciclo verifica ricetta | idxPODL {actPodlReq.IdxPromessa} | recFilePath {recFilePath}{Environment.NewLine}{exc}"); + } + } + } + // salvo su file elenco PODL gestiti/inviati + POdlSentFileArch = POdlSentList; + lgInfo($"RecipeReqWriteLocal | reqPOdlList: {reqPOdlList.Count} | actPOdlList: {actPOdlList.Count} | preparate: {POdlSentList.Count}"); + } + return fatto; + } + + /// + /// Effettua invio delle ricette alla macchina + /// + /// Area dove si trovano i fiel da trasmettere + /// Area archivio + /// Area remota dove inviare files + /// + protected bool RecipeSend(string localPath, string localArch, string remotePath) + { + bool fatto = false; + lgTrace($"RecipeSend start | localPath {localPath} | localArch {localArch} | remotePath {remotePath}"); + // recupero elenco files... + var fileList = Directory.GetFiles(localPath); + string archName = ""; + string destName = ""; + if (fileList != null && fileList.Count() > 0) + { + int nMove = 0; + foreach (var file in fileList) + { + string fileName = Path.GetFileName(file); + archName = Path.Combine(localArch, fileName); + destName = Path.Combine(remotePath, fileName); + lgInfo($"RecipeSend | fileName: {fileName} | archName: {archName} | destName: {destName} "); + File.Copy(file, destName, true); + File.Move(file, archName); + nMove++; + } + fatto = true; + lgInfo($"RecipeSend | trovate {fileList.Count()} file | {nMove} trasferiti"); + } + return fatto; + } + + /// + /// Effettua recupero in locale dei task eseguiti dalla macchina + /// + /// Area remota da dove recuperare files + /// Area dove parcheggiare temporaneamente i fiels x processing + /// + protected virtual bool RecipeTaskDoneRetrieve(string remotePath, string localPath) + { + bool fatto = false; + // recupero elenco files... + var fileList = Directory.GetFiles(remotePath); + string destName = ""; + if (fileList != null && fileList.Count() > 0) + { + foreach (var file in fileList) + { + string fileName = Path.GetFileName(file); + destName = Path.Combine(localPath, fileName); + lgInfo($"Recupero Task Eseguiti | fileName: {fileName} | destName: {destName} "); + File.Move(file, destName); + } + fatto = true; + } + return fatto; + } + /// /// Cancella dal server i task eseguiti /// @@ -5914,17 +6839,24 @@ namespace IOB_WIN_NEXT allParam.Add(currItem); } } - // invio su cloud parametri SE sono connesso all'OPC-ua... + // invio su cloud parametri SE sono connesso alla macchina... if (serverOk) { + string tipoCall = urlSaveAllParams; rawData = JsonConvert.SerializeObject(allParam, Formatting.Indented); if (serverOk) { - var resp = utils.callUrl($"{urlSaveAllParams}", rawData); + // verifica se sia un IOB "parziale") + if (cIobConf.disableExeTask || cIobConf.disableStateCh) + { + // versione upsert + tipoCall = urlUpdateWriteParams; + } + var resp = utils.callUrl($"{tipoCall}", rawData); } else { - lgInfo($"Mancata risposta ping server, non effettuata chiamata {urlSaveAllParams}"); + lgInfo($"Mancata risposta ping server, non effettuata chiamata {tipoCall}"); } } lgDebug($"setupMemMap | salvata conf memoria R/W"); @@ -5959,9 +6891,65 @@ namespace IOB_WIN_NEXT addCheckConditionInt(item.Key, item.Value); } } + // cerco valori *2Translate + var listVal2Translate = memMap.optMemPar.Where(x => x.Key.Contains("2Translate")).ToList(); + if (listVal2Translate != null && listVal2Translate.Count > 0) + { + // cerco solo valori BIT... + var listValBit = listVal2Translate.Where(x => x.Key.StartsWith("VarBit2Translate")).ToList(); + if (listValBit != null && listValBit.Count > 0) + { + foreach (var item in listValBit) + { + addVal2TranslBit(item.Value); + } + } + // ...e poi valori INT... + var listValInt = listVal2Translate.Where(x => x.Key.StartsWith("VarInt2Translate")).ToList(); + if (listValInt != null && listValInt.Count > 0) + { + foreach (var item in listValInt) + { + addVal2TranslInt(item.Value); + } + } + } } } + /// + /// Init parametri speciali, tipicamente KVP opzionali da json + /// + protected virtual void setupSpecialParams() + { + string sCond = ""; + // per prima cosa inizializzo lista PODL inviati + POdlSentList = POdlSentFileArch; + + // check modalità ricetta attiva + bool.TryParse(getOptJsonKVP("hasRecipe"), out hasRecipe); + + // verifico se usare ricette locali/http... + bool.TryParse(getOptJsonKVP("useLocalRecipe"), out useLocalRecipe); + + // recupero quantitativo massimo KG x PODL + int.TryParse(getOptJsonKVP("maxPodlQty"), out maxQtyPerFile); + + // recupero le folder specifiche x IN/OUT ricette filtrando direttamente l'area di memoria... + sCond = "path"; + var dirList = memMap.optKVP + .Where(x => x.Key.StartsWith(sCond)) + .ToList(); + pathList = dirList.ToDictionary(x => x.Key, x => x.Value); + + // gestione replace in file ricette... + sCond = "replace-"; + var ruleList = memMap.optKVP + .Where(x => x.Key.StartsWith(sCond)) + .ToList(); + RecipeReplRules = ruleList.ToDictionary(x => x.Key.Replace(sCond, ""), x => x.Value); + } + /// /// Cleanup stringa x impiego tipo ident da char dubbi /// @@ -5977,7 +6965,7 @@ namespace IOB_WIN_NEXT /// corrente della macchina /// /// - protected bool tryAskCloseODL() + protected bool tryAskCloseCurrODL() { bool fatto = false; string fullUrl = $"{urlODLAskClose}{currIdxODL}"; @@ -5989,7 +6977,7 @@ namespace IOB_WIN_NEXT } catch { } - lgInfo($"Eseguito tryAskCloseODL per {currIdxODL} | url: {fullUrl} | esito: {fatto}"); + lgInfo($"Eseguito tryAskCloseCurrODL per {currIdxODL} | url: {fullUrl} | esito: {fatto}"); return fatto; } @@ -5997,7 +6985,7 @@ namespace IOB_WIN_NEXT /// Effettua chiamata MP-IO per tentare chiusura ODL corrente della macchina /// /// - protected bool tryCloseODL() + protected bool tryCloseCurrODL() { bool fatto = false; string fullUrl = $"{urlODLClose}{currIdxODL}"; @@ -6009,7 +6997,49 @@ namespace IOB_WIN_NEXT } catch { } - lgInfo($"Eseguito tryCloseODL per {currIdxODL} | url: {fullUrl} | esito: {fatto}"); + lgInfo($"Eseguito tryCloseCurrODL per {currIdxODL} | url: {fullUrl} | esito: {fatto}"); + return fatto; + } + + /// + /// Effettua chiamata MP-IO per tentare chiusura ODL specifico + /// + /// + /// + protected bool tryCloseODL(int IdxODL) + { + bool fatto = false; + string fullUrl = $"{urlODLClose}{IdxODL}"; + try + { + // invio chiamata URL x chiusura ODL su macchina + string callResp = callUrl(fullUrl, false); + fatto = (callResp != "KO") ? true : false; + } + catch + { } + lgInfo($"Eseguito tryCloseODL per {IdxODL} | url: {fullUrl} | esito: {fatto}"); + return fatto; + } + + /// + /// Effettua chiamata MP-IO per tentare chiusura PODL --> ODL specifico + /// + /// + /// + protected bool tryClosePODL(int IdxPOdl) + { + bool fatto = false; + string fullUrl = $"{urlPODLClose}{IdxPOdl}"; + try + { + // invio chiamata URL x chiusura ODL su macchina + string callResp = callUrl(fullUrl, false); + fatto = (callResp != "KO") ? true : false; + } + catch + { } + lgInfo($"Eseguito tryClosePODL per {IdxPOdl} | url: {fullUrl} | esito: {fatto}"); return fatto; } @@ -6108,7 +7138,7 @@ namespace IOB_WIN_NEXT bool fatto = false; try { - // invio chiamata URL x reset ODL su macchina + // invio chiamata URL x avvio PODL su macchina string rawSplit = callUrl($"{urlOLDStartFromPODL}{idxPODL}", false); fatto = (rawSplit != "KO") ? true : false; } @@ -6357,6 +7387,85 @@ namespace IOB_WIN_NEXT } } + /// + /// Aggiunge in setup memoria l'oggetto tipo valore BIT (NON mutuamente esclusivo) da tradurre + /// + /// Elenco valori da aggiungere formato csv (es "a,b,c") + private void addVal2TranslBit(string csvList) + { + var list2add = csvList.Split(','); + foreach (var memKey in list2add) + { + // cerco x aggiungere... + if (!OptVar2TranslBit.ContainsKey(memKey)) + { + // init traduzione vuota + OptVar2TranslBit.Add(memKey, ""); + } + } + } + + /// + /// Aggiunge in setup memoria l'oggetto tipo valore INT (mutuamente esclusivo) da tradurre + /// + /// Elenco valori da aggiungere formato csv (es "a,b,c") + private void addVal2TranslInt(string csvList) + { + var list2add = csvList.Split(','); + foreach (var memKey in list2add) + { + // cerco x aggiungere... + if (!OptVar2TranslInt.ContainsKey(memKey)) + { + // init traduzione vuota + OptVar2TranslInt.Add(memKey, ""); + } + } + } + + /// + /// Verifica se ci sia veto log attivo e gestisce casistiche + /// + /// + /// + /// + private bool checkLogVeto(int vetoSec, ref string message) + { + //verifico SE si debba fare log, altrimenti metto in coda... + bool doVeto = true; + DateTime adesso = DateTime.Now; + if (VetoLog.ContainsKey(message)) + { + // conteggio num veto a +1... + if (VetoLogCount.ContainsKey(message)) + { + VetoLogCount[message]++; + } + else + { + VetoLogCount.Add(message, 1); + } + // controllo scadenza, quando superata soglia aggiorno messaggio con {n} x {messaggio} + if (adesso.Subtract(VetoLog[message]).TotalSeconds > vetoSec) + { + doVeto = false; + string newMessage = $"{VetoLogCount[message]} x {message}"; + VetoLog.Remove(message); + VetoLogCount.Remove(message); + message = newMessage; + } + } + else + { + // primo --> loggo + doVeto = false; + VetoLog.Add(message, adesso.AddSeconds(vetoSec)); + VetoLogCount.Add(message, 0); + } + // restituisco esito! + return doVeto; + } + /// /// Verifica e se necessario comprime directory log... /// @@ -6388,6 +7497,26 @@ namespace IOB_WIN_NEXT currDispData.newInData = newString; } + /// + /// Archivia una cartella in un file zip + /// + /// Cartelal da archiviare + /// Nome del file zip da produrre... + private bool doZipArchiveFolder(string folderPath, string zipName) + { + bool fatto = false; + if (Directory.Exists(folderPath)) + { + fatto = fileMover.zippaDirectory(folderPath, zipName); + // se fatto elimino vecchia directory... + if (fatto) + { + Directory.Delete(folderPath, true); + } + } + return fatto; + } + /// /// Esegue filtraggio dati x bit blinking!!! /// @@ -6457,42 +7586,6 @@ namespace IOB_WIN_NEXT } } - /// - /// Imposta eventuali altri valori default - /// - private void fixDefaultPar() - { - // parametro max tentativi PING... - string s_maxPingRetry = getOptPar("MAX_PING_RETRY"); - if (!string.IsNullOrEmpty(s_maxPingRetry)) - { - int numRetry = 5; - int.TryParse(s_maxPingRetry, out numRetry); - maxPingRetry = numRetry; - } - - string s_maxErrCheck = getOptPar("MAX_ERR_CHECK"); - if (!string.IsNullOrEmpty(s_maxErrCheck)) - { - int numErr = 50; - int.TryParse(s_maxErrCheck, out numErr); - maxErroriCheck = numErr; - } - - string s_watchDogPer = getOptPar("WATCHDOG_PERIOD"); - if (!string.IsNullOrEmpty(s_watchDogPer)) - { - int numPer = 3; - int.TryParse(s_watchDogPer, out numPer); - watchDogPeriod = numPer; - } - - // sistemo conf folder acquisizioen files - fileImportFolder = getOptPar("FILE_IMPORT_FOLDER"); - fileImportType = getOptPar("FILE_IMPORT_TYPE"); - fileArchiveFolder = getOptPar("FILE_ARCHIVE_FOLDER"); - } - /// /// Legge da conf il valore di demoltiplica lettura dynData (se presente) o ignora e pone a 1... /// @@ -6765,6 +7858,170 @@ namespace IOB_WIN_NEXT } } + /// + /// Effettua calcolo dei consumi + esportazione in file richiesto + /// + /// Folder dei file da processare + /// Percorso file out di export + private bool RecipeDoConsumeReport(string folderPath, string reportPath) + { + // var di base + bool fatto = false; + List ListConsDet = new List(); + List ListConsSum = new List(); + // file conf x conversioni... + string confSetupPath = pathList["path-confSetup"]; + ConvSetup currConf = new ConvSetup(); + bool addHeader = false; + int numDec = 4; + string codMag = "NA"; + if (!string.IsNullOrEmpty(confSetupPath)) + { + string rawConfFile = File.ReadAllText(confSetupPath); + if (!string.IsNullOrEmpty(rawConfFile)) + { + currConf = JsonConvert.DeserializeObject(rawConfFile); + if (currConf != null) + { + addHeader = currConf.addHeader; + numDec = currConf.numDec; + codMag = currConf.codMag; + } + } + } + // ciclo x ogni file ricevendone i consumi ed accumulandoli in lista... + var fileList = Directory.GetFiles(folderPath); + foreach (var cFile in fileList) + { + var consumiFile = RecipeGetCons(cFile); + ListConsDet.AddRange(consumiFile); + } + // se ho trovato dati + double ratioConv = 1; + if (ListConsDet.Count > 0) + { + var dirName = new DirectoryInfo(folderPath).Name; + // recupero elenco colori + var elencoColori = ListConsDet + .GroupBy(x => x.ColourCode) + .Select(grp => grp.Last()) + .ToList(); + + // faccio le somme x colore + foreach (var colore in elencoColori) + { + ratioConv = 1; + // ricerca in conf (% di consumo) + if (currConf != null && currConf.convRatio != null) + { + if (currConf.convRatio.ContainsKey(colore.ColourCode)) + { + ratioConv = currConf.convRatio[colore.ColourCode]; + } + } + // calcolo peso equivalente in kg con conversione ratio + var totWeightKg = ListConsDet + .Where(x => x.ColourCode == colore.ColourCode) + .Sum(x => x.WeightGrTot) / 1000 * ratioConv; + + // record finale trasformato in KG... + ConsOut colTotal = new ConsOut() + { + CodMag = codMag, + FileRef = dirName, + ColourCode = colore.ColourCode, + Description = colore.Description, + DtRif = colore.DtRif, + WeightKgProc = Math.Round(totWeightKg, numDec) + }; + ListConsSum.Add(colTotal); + } + + // infine serializzo x output + fatto = DataExport.SaveToCsv(ListConsSum, reportPath, addHeader); + } + return fatto; + } + + /// + /// Processa la ricetta alla ricerca dei dati PODL x inviare chiamate ad MP-IO + /// + /// Path RIcetta + private bool RecipeDoProcessPODL(string recipeFile) + { + bool answ = false; + // init var + int idxPOdl = 0; + string rawVal = ""; + // leggo righe file! + var recipeRows = File.ReadAllLines(recipeFile); + // per ogni file ricevuto controlla se viene dal MES (cerca PODL) + string tokenSearch = "PODL"; + // recupero riga PODL... + var rowPodl = recipeRows.Where(x => x.Contains(tokenSearch)).FirstOrDefault(); + if (rowPodl != null) + { + DateTime dtStartPOdl = DateTime.Today; + int duration = 0; + DateTime dtEndPOdl = DateTime.Today.AddMinutes(10); + string dtEve = ""; + string dtCurr = ""; + + // inizio ricerca PODL + rawVal = rowPodl.Trim().Replace(tokenSearch, "").Replace("", ""); + int.TryParse(rawVal, out idxPOdl); + if (idxPOdl > 0) + { + // leggo inizio commessa + tokenSearch = ""; + var rowStart = recipeRows.Where(x => x.Contains(tokenSearch)).FirstOrDefault(); + if (rowStart != null) + { + rawVal = rowStart.Trim().Replace(tokenSearch, "").Replace("", ""); + DateTime.TryParse(rawVal, out dtStartPOdl); + } + + // leggo durata commessa + tokenSearch = ""; + var rowDurSec = recipeRows.Where(x => x.Contains(tokenSearch)).FirstOrDefault(); + if (rowDurSec != null) + { + rawVal = rowDurSec.Trim().Replace(tokenSearch, "").Replace("", ""); + int.TryParse(rawVal, out duration); + dtEndPOdl = dtStartPOdl.AddSeconds(duration); + } + + // prova ad avviare/chiudere PODL relativo (eventualmente duplicandolo) + dtEve = $"{dtStartPOdl:yyyyMMddHHmmssfff}"; + dtCurr = $"{DateTime.Now:yyyyMMddHHmmssfff}"; + callUrl($"{urlOLDStartFromPODL}{idxPOdl}&dtEve={dtEve}&dtCurr={dtCurr}", false); + + // ora chiamo chiusura... + dtEve = $"{dtEndPOdl:yyyyMMddHHmmssfff}"; + dtCurr = $"{DateTime.Now:yyyyMMddHHmmssfff}"; + callUrl($"{urlPODLClose}{idxPOdl}&dtEve={dtEve}&dtCurr={dtCurr}", false); + } + answ = true; + } + return answ; + } + + /// + /// Elimino record da REDIS (locale e remoto) + /// + /// + private void RecipeRemoveWeekStatus(string keyReq) + { + string fullKey = redisMan.redHash($"IOB:Status:{cIobConf.codIOB}:WeekStats"); + var okHashDict = redisMan.redRemoveHashField(fullKey, keyReq); + // rileggo status hash + var currDict = redisMan.redGetHashDict(fullKey); + // invio ANCHE in MP-IO l'update delle info... + string remUrl = urlSetHashDict; + string dictPayload = JsonConvert.SerializeObject(currDict); + callUrlWithPayload(remUrl, dictPayload, false); + } + private void reportDataProc() { // update valori visualizzazione... @@ -6967,7 +8224,7 @@ namespace IOB_WIN_NEXT fatto = sendDataBlock(urlType.RawTransf, listaValori, force); if (fatto) { - // svuoto se ha fatto! + // svuoto se ha okReport! QueueRawTransf = new ConcurrentQueue(); } } diff --git a/IOB-WIN-NEXT/IobMTC.cs b/IOB-WIN-NEXT/IobMTC.cs index c7590dff..d7df36f6 100644 --- a/IOB-WIN-NEXT/IobMTC.cs +++ b/IOB-WIN-NEXT/IobMTC.cs @@ -659,7 +659,7 @@ namespace IOB_WIN_NEXT /// /// /// - protected string itemTranslation(string tipo, string id) + protected override string itemTranslation(string tipo, string id) { string answ = ""; string lemma = $"{tipo}_{id}"; diff --git a/IOB-WIN-NEXT/IobModbusTCP.cs b/IOB-WIN-NEXT/IobModbusTCP.cs index 837cdd45..bac0cfb9 100644 --- a/IOB-WIN-NEXT/IobModbusTCP.cs +++ b/IOB-WIN-NEXT/IobModbusTCP.cs @@ -21,76 +21,6 @@ namespace IOB_WIN_NEXT public class IobModbusTCP : IobGeneric { - #region Protected Fields - - /// - /// Copia locale dei valori in COIL (OUT) | 0.000/09.999, oppure 0.000/65.536 = 0xFFFF, come - /// array chiave (int) valori int[] letti tramite ModBus, da convertire secondo tipo - /// - protected Dictionary CoilLUT = new Dictionary(); - - protected ModbusClient currPLC; - - /// - /// Copia locale dei valori in Discrete Inputs (IN) | 10.000/19.999, oppure 100.000/165.536 - /// = 1xFFFF, come array chiave (int) valori int[] letti tramite ModBus, da convertire - /// secondo tipo - /// - protected Dictionary DiscreteInputLUT = new Dictionary(); - - /// - /// Copia locale dei valori in Holding Registers | 40.000/49.999, oppure 400.000/465.536 = - /// 4xFFFF, come array chiave (int) valori int[] letti tramite ModBus, da convertire secondo tipo - /// - protected Dictionary HoldingRegisterLUT = new Dictionary(); - - /// - /// Copia locale dei valori in Input Registers | 30.000/39.999, oppure 300.000/365.536 = - /// 3xFFFF, come array chiave (int) valori int[] letti tramite ModBus, da convertire secondo tipo - /// - protected Dictionary InputRegisterLUT = new Dictionary(); - - /// - /// Ultimo controllo ping x evitare ping flood... - /// - protected DateTime lastPingConn = DateTime.Now.AddMinutes(-10); - - /// - /// Esito ultimo ping - /// - protected bool lastPingOk = false; - - /// - /// num max di errori lettura permessi prima di disconnettere - /// - protected int maxErrorRead = 10; - - /// - /// Setup blocchi memorie read (indirizzo inizio, size) - /// - protected Dictionary memSetR = new Dictionary(); - - /// - /// parametri di connessione - /// - protected connParamModBusTCP parametri; - - /// - /// Oggetto cronometro x test vari... - /// - protected Stopwatch sw = new Stopwatch(); - - #endregion Protected Fields - - #region Private Fields - - /// - /// Valore delta x gestione min/MAX e valore rilevato - /// - private double deltaVal = 0; - - #endregion Private Fields - #region Public Constructors /// Classe base con i metodi x ModBusTCP @@ -138,36 +68,6 @@ namespace IOB_WIN_NEXT #endregion Public Constructors - #region Protected Properties - - /// - /// Dizionario delle ultime operazioni di scrittura per OGNI memoria (in modo che fa log - /// ogni x sec...) - /// - protected Dictionary lastMemWrite { get; set; } = new Dictionary(); - - #endregion Protected Properties - - #region Private Properties - - /// - /// Valore da gestire come delta degli indirizzi configurati - /// - private int deltaBase { get; set; } = 0; - - /// - /// Valore da gestire come delta degli index x lettura LUT - /// - private int indexLutCorr { get; set; } = 0; - - /// - /// Indica se usare gli indirizzi estesi per ogni blocco: false = 0...10'000 true = - /// 0...65'536 (= xFFFF) - /// - private bool modbusExtReg { get; set; } = false; - - #endregion Private Properties - #region Public Methods /// @@ -204,14 +104,40 @@ namespace IOB_WIN_NEXT case taskType.fixStopSetup: case taskType.forceResetPzCount: case taskType.forceSetPzCount: - case taskType.setProg: case taskType.sendWatchDogMes2Plc: case taskType.startSetup: case taskType.stopSetup: + taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC"; + break; + + case taskType.setProg: case taskType.setPzComm: case taskType.setArt: case taskType.setComm: - taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC"; + // cerco se ho configurato parametri x invio... + if (memMap.mMapWrite.ContainsKey(item.Key)) + { + memMap.mMapWrite[item.Key].value = item.Value; + // preparo obj oparametro da scrivere... + List updatedPar = new List(); + objItem newParam = new objItem() + { + uid = item.Key, + name = item.Key, + value = item.Value, + reqValue = "", + writable = true, + lastRequest = DateTime.Now + }; + updatedPar.Add(newParam); + // richiamo scrittura parametri su PLC + plcWriteParams(ref updatedPar); + taskVal = $"REQUEST SET val: {item.Key} --> {item.Value}"; + } + else + { + taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | NOT FOUND IN mMapWrite List | NO EXEC"; + } break; case taskType.setParameter: @@ -235,6 +161,14 @@ namespace IOB_WIN_NEXT } break; + case taskType.processOtherInfo: + bool okProc= processOtherInfo(item.Key, item.Value); + taskVal = okProc ? $"OK processOtherInfo | {item.Key} | {item.Value}": $"ERROR processOtherInfo | {item.Key} | {item.Value}"; + break; + + case taskType.syncDbData: + processDataSync(); + break; default: taskVal = "SKIPPED | NO EXEC"; @@ -485,33 +419,36 @@ namespace IOB_WIN_NEXT /// public override void readSemafori(ref newDisplayData currDispData) { - // NON eseguo x NON indicare data ora ultima lettura se NON fatta davvero - //base.readSemafori(ref currDispData); - byte[] MemBlock = new byte[2]; - try + if (!cIobConf.disableStateCh) { - currDispData.semIn = Semaforo.SV; - - if (verboseLog) + // NON eseguo x NON indicare data ora ultima lettura se NON fatta davvero + //base.readSemafori(ref currDispData); + byte[] MemBlock = new byte[2]; + try { - lgDebug("inizio read semafori"); - } + currDispData.semIn = Semaforo.SV; - if (verboseLog) + if (verboseLog) + { + lgDebug("inizio read semafori"); + } + + if (verboseLog) + { + lgTrace(string.Format("RawInput[0]: {0}", utils.binaryForm(RawInput[0]))); + } + + // salvo il solo BYTE dell'input decifrando il semaforo... + decodeToBaseBitmap(); + decodeOtherData(); + // riporto bitmap... + reportRawInput(ref currDispData); + } + catch (Exception exc) { - lgTrace(string.Format("RawInput[0]: {0}", utils.binaryForm(RawInput[0]))); + currDispData.semIn = Semaforo.SR; + lgError($"Eccezione in readSemafori{Environment.NewLine}{exc}"); } - - // salvo il solo BYTE dell'input decifrando il semaforo... - decodeToBaseBitmap(); - decodeOtherData(); - // riporto bitmap... - reportRawInput(ref currDispData); - } - catch (Exception exc) - { - currDispData.semIn = Semaforo.SR; - lgError($"Eccezione in readSemafori{Environment.NewLine}{exc}"); } } @@ -671,20 +608,19 @@ namespace IOB_WIN_NEXT } /// - /// Scrittura di un valore Input Register (4...) + /// Scrittura di un valore Holding Register (4...) /// /// /// Valore in formato INT da registri - /// Indirizzo di base dei registri /// - public bool writeInputReg(int startAddr, int[] currRegVal, int baseAddr) + public bool writeHoldingReg(int startAddr, int[] currRegVal) { bool answ = false; if (currPLC.Connected) { try { - currPLC.WriteMultipleRegisters(startAddr + deltaBase + (40000 - baseAddr), currRegVal); + currPLC.WriteMultipleRegisters(startAddr + deltaBase + indexLutCorr, currRegVal); answ = true; } catch @@ -695,8 +631,200 @@ namespace IOB_WIN_NEXT #endregion Public Methods + #region Protected Fields + + /// + /// Copia locale dei valori in COIL (OUT) | 0.000/09.999, oppure 0.000/65.536 = 0xFFFF, come + /// array chiave (int) valori int[] letti tramite ModBus, da convertire secondo tipo + /// + protected Dictionary CoilLUT = new Dictionary(); + + protected ModbusClient currPLC; + + /// + /// Copia locale dei valori in Discrete Inputs (IN) | 10.000/19.999, oppure 100.000/165.536 + /// = 1xFFFF, come array chiave (int) valori int[] letti tramite ModBus, da convertire + /// secondo tipo + /// + protected Dictionary DiscreteInputLUT = new Dictionary(); + + /// + /// Copia locale dei valori in Holding Registers | 40.000/49.999, oppure 400.000/465.536 = + /// 4xFFFF, come array chiave (int) valori int[] letti tramite ModBus, da convertire secondo tipo + /// + protected Dictionary HoldingRegisterLUT = new Dictionary(); + + /// + /// Copia locale dei valori in Input Registers | 30.000/39.999, oppure 300.000/365.536 = + /// 3xFFFF, come array chiave (int) valori int[] letti tramite ModBus, da convertire secondo tipo + /// + protected Dictionary InputRegisterLUT = new Dictionary(); + + /// + /// Ultimo controllo ping x evitare ping flood... + /// + protected DateTime lastPingConn = DateTime.Now.AddMinutes(-10); + + /// + /// Esito ultimo ping + /// + protected bool lastPingOk = false; + + /// + /// num max di errori lettura permessi prima di disconnettere + /// + protected int maxErrorRead = 10; + + /// + /// Setup blocchi memorie read (indirizzo inizio, size) + /// + protected Dictionary memSetR = new Dictionary(); + + /// + /// parametri di connessione + /// + protected connParamModBusTCP parametri; + + /// + /// Oggetto cronometro x test vari... + /// + protected Stopwatch sw = new Stopwatch(); + + #endregion Protected Fields + + #region Protected Properties + + /// + /// Dizionario delle ultime operazioni di scrittura per OGNI memoria (in modo che fa log + /// ogni x sec...) + /// + protected Dictionary lastMemWrite { get; set; } = new Dictionary(); + + #endregion Protected Properties + #region Protected Methods + /// + /// Classe di base implementazione traduzione di una LUT da memoria come valore BIT + /// (multipli) a valore esplicito x FLog + /// + protected override void checkTranslateBit() + { + // verifico se devo processare decodifica di qualche valore... + if (OptVar2TranslBit != null && OptVar2TranslBit.Count > 0) + { + Dictionary valUpdated = new Dictionary(); + // ciclo x ogni valore da tradurre + foreach (var item in OptVar2TranslBit) + { + int reqAddr = 0; + // traduco in int... + int.TryParse(item.Key, out reqAddr); + int lutAddr = reqAddr + indexLutCorr; + int valInt = 0; + int[] listInt = new int[2]; + // cerco valore nella LUT... se è pari cerco "direttamente" altrimenti dal pari + // inferiore e 2° INT[] + if (lutAddr % 2 == 0) + { + listInt = HoldingRegisterLUT[lutAddr]; + valInt = listInt[0]; + } + else + { + lutAddr--; + listInt = HoldingRegisterLUT[lutAddr]; + valInt = listInt[1]; + } + // gestisco a bitmap --> salvo valore INT x check.. + string sVal = $"{valInt}"; + // se è variato rispetto precedente --> calcolo valori string, accodo in FLog e salvo... + if (item.Value != sVal) + { + valUpdated.Add(item.Value, valInt); + } + } + // se ho valori aggiornati --> aggiorno dictionary e invio + if (valUpdated.Count > 0) + { + DateTime locTStamp = DateTime.Now; + foreach (var item in valUpdated) + { + // salvo il valore modificato + OptVar2TranslInt[item.Key] = $"{item.Value}"; + List listVal = new List(); + // si tratta di valori bit --> devo cercare OGNI bit attivo (0..8 --> 0.255) + for (int i = 0; i < 8; i++) + { + if (BitUtils.isActive(item.Value, i)) + { + // traduco ed accodo... + listVal.Add(itemTranslation($"{item.Key}.{i}")); + } + } + // costruisco stringa finale... + string trad = string.Join(",", listVal); + string sVal = $"Change {item.Key}: {locTStamp.ToString()} | Val: {item.Value} | trad: {trad}"; + accodaFLog(sVal, qEncodeFLog(item.Key, trad)); + } + } + } + } + + /// + /// Classe di base implementazione traduzione di una LUT da memoria come valore INT a valore + /// esplicito x FLog + /// + protected override void checkTranslateInt() + { + if (OptVar2TranslInt != null && OptVar2TranslInt.Count > 0) + { + Dictionary valUpdated = new Dictionary(); + // ciclo x ogni valore da tradurre + foreach (var item in OptVar2TranslInt) + { + int reqAddr = 0; + // traduco in int... + int.TryParse(item.Key, out reqAddr); + int lutAddr = reqAddr + indexLutCorr; + int valInt = 0; + int[] listInt = new int[2]; + // cerco valore nella LUT... se è pari cerco "direttamente" altrimenti dal pari + // inferiore e 2° INT[] + if (lutAddr % 2 == 0) + { + listInt = HoldingRegisterLUT[lutAddr]; + valInt = listInt[0]; + } + else + { + lutAddr--; + listInt = HoldingRegisterLUT[lutAddr]; + valInt = listInt[1]; + } + // cerco traduzione... + string trad = itemTranslation(item.Key, $"{valInt}"); + // se è variato rispetto precedente --> accodo in FLog e salvo... + if (item.Value != trad) + { + valUpdated.Add(item.Value, trad); + } + } + // se ho valori aggiornati --> aggiorno dictionary e invio + if (valUpdated.Count > 0) + { + string sVal = ""; + DateTime locTStamp = DateTime.Now; + foreach (var item in valUpdated) + { + OptVar2TranslInt[item.Key] = item.Value; + sVal = $"Change {item.Key}: {locTStamp.ToString()} | Val: {item.Value}"; + accodaFLog(sVal, qEncodeFLog(item.Key, item.Value)); + } + } + } + } + /// /// Decodifica il resto dell'area x i dati accessori (allarmi, ...) /// @@ -727,7 +855,7 @@ namespace IOB_WIN_NEXT bool useLUT = memSetR != null && memSetR.Count > 0; if (useLUT) { - int lutAddress = 40000 + item.index; + int lutAddress = parametri.holdRegBaseAddr + item.index + deltaBase + indexLutCorr; if (HoldingRegisterLUT.ContainsKey(lutAddress)) { try @@ -801,7 +929,7 @@ namespace IOB_WIN_NEXT CurrVal = ModbusClient.ConvertIntToRegisters(valInt); } - fatto = writeInputReg(currMem.index, CurrVal, parametri.holdRegBaseAddr); + fatto = writeHoldingReg(currMem.index, CurrVal); break; case plcDataType.IntLH: @@ -816,20 +944,20 @@ namespace IOB_WIN_NEXT Array.Reverse(CurrVal); } - fatto = writeInputReg(currMem.index, CurrVal, parametri.holdRegBaseAddr); + fatto = writeHoldingReg(currMem.index, CurrVal); break; case plcDataType.DInt: valUInt = getScaledUInt(currMem, true); CurrVal = ModbusClient.ConvertLongToRegisters(valInt); - fatto = writeInputReg(currMem.index, CurrVal, parametri.holdRegBaseAddr); + fatto = writeHoldingReg(currMem.index, CurrVal); break; case plcDataType.DIntLH: valUInt = getScaledUInt(currMem, true); CurrVal = ModbusClient.ConvertLongToRegisters(valInt); Array.Reverse(CurrVal); - fatto = writeInputReg(currMem.index, CurrVal, parametri.holdRegBaseAddr); + fatto = writeHoldingReg(currMem.index, CurrVal); break; //case plcDataType.Word: @@ -843,17 +971,17 @@ namespace IOB_WIN_NEXT // break; case plcDataType.Real: - case plcDataType.RealHL: - valDouble = getScaledDouble(currMem); - CurrVal = ModbusClient.ConvertFloatToRegisters((float)valDouble, ModbusClient.RegisterOrder.HighLow); - fatto = writeInputReg(currMem.index, CurrVal, parametri.holdRegBaseAddr); - break; - - case plcDataType.FloatBADC: case plcDataType.RealLH: valDouble = getScaledDouble(currMem); CurrVal = ModbusClient.ConvertFloatToRegisters((float)valDouble, ModbusClient.RegisterOrder.LowHigh); - fatto = writeInputReg(currMem.index, CurrVal, parametri.holdRegBaseAddr); + fatto = writeHoldingReg(currMem.index, CurrVal); + break; + + case plcDataType.FloatBADC: + case plcDataType.RealHL: + valDouble = getScaledDouble(currMem); + CurrVal = ModbusClient.ConvertFloatToRegisters((float)valDouble, ModbusClient.RegisterOrder.HighLow); + fatto = writeHoldingReg(currMem.index, CurrVal); break; case plcDataType.String: @@ -862,7 +990,7 @@ namespace IOB_WIN_NEXT Array.Copy(regLen, 0, CurrVal, CurrVal.Length - regLen.Length, regLen.Length); //CurrVal[CurrVal.Length - 2] = regLen[1]; //CurrVal[CurrVal.Length - 1] = regLen[0]; - fatto = writeInputReg(currMem.index, CurrVal, parametri.holdRegBaseAddr); + fatto = writeHoldingReg(currMem.index, CurrVal); break; default: @@ -945,6 +1073,7 @@ namespace IOB_WIN_NEXT // carico conf vettore memoria... loadMemConf(); + fixDefaultPar(); // avvio conf blocchi memoria setupMemBlocks(); // aggiungo DELTA x calcolo min/MAX... @@ -1104,27 +1233,6 @@ namespace IOB_WIN_NEXT return answ; } - - /// - /// Testa la condition modbus da LUT + configurazione, valori tipo BIT tramite DiscreteInput (0x02 - 10000+) - /// - /// - /// - protected bool testDisInBitCondition(string cKey) - { - bool answ = false; - if (OptCheckCondBit.ContainsKey(cKey)) - { - answ = DiscreteInputLUT[OptCheckCondBit[cKey].BaseAddr + indexLutCorr]; - lgTrace($"testDisInBitCondition for {cKey} | BaseAddr: {OptCheckCondBit[cKey].BaseAddr} | BitNum: {OptCheckCondBit[cKey].BitNum} | ValOk: {OptCheckCondBit[cKey].ValOk} | actual: {answ}"); - } - else - { - lgTrace($"testDiscrInputBitCondition error: {cKey} not found"); - } - return answ; - } - /// /// Effettua ciclo letture di ogni area configurata /// @@ -1191,6 +1299,8 @@ namespace IOB_WIN_NEXT Array.Copy(readTestInt, i * 2, thisSet, 0, 2); lgTrace($"{currMemType} | {baseAddr + i * 2:000} | Valori: {thisSet[0]} / {thisSet[1]} | Val Int: {ModbusClient.ConvertRegistersToInt(thisSet)} | Val Real: {ModbusClient.ConvertRegistersToFloat(thisSet):N6}"); } + // provo anche come stringa intera + lgTrace($"{currMemType} | {baseAddr:000} | Val string: {ModbusClient.ConvertRegistersToString(readTestInt, 0, readTestInt.Length)}"); break; case modbusMemType.NotDefined: @@ -1266,6 +1376,34 @@ namespace IOB_WIN_NEXT return answ; } + /// + /// Testa la condition modbus da LUT + configurazione, valori tipo BIT tramite DiscreteInput + /// (0x02 - 10000+) + /// + /// + /// + protected bool testDisInBitCondition(string cKey) + { + bool answ = false; + if (OptCheckCondBit.ContainsKey(cKey)) + { + if (DiscreteInputLUT.Count > 0) + { + int idxMem = OptCheckCondBit[cKey].BaseAddr + indexLutCorr; + if (DiscreteInputLUT.ContainsKey(idxMem)) + { + answ = DiscreteInputLUT[idxMem] == (OptCheckCondBit[cKey].ValOk != 0); + lgTrace($"testDisInBitCondition for {cKey} | BaseAddr: {OptCheckCondBit[cKey].BaseAddr} | BitNum: {OptCheckCondBit[cKey].BitNum} | ValOk: {OptCheckCondBit[cKey].ValOk} | actual: {answ}"); + } + } + } + else + { + lgTrace($"testDiscrInputBitCondition error: {cKey} not found"); + } + return answ; + } + /// /// Testa la condition modbus da LUT + configurazione, valori tipo INT /// @@ -1314,6 +1452,35 @@ namespace IOB_WIN_NEXT #endregion Protected Methods + #region Private Fields + + /// + /// Valore delta x gestione min/MAX e valore rilevato + /// + private double deltaVal = 0; + + #endregion Private Fields + + #region Private Properties + + /// + /// Valore da gestire come delta degli indirizzi configurati + /// + private int deltaBase { get; set; } = 0; + + /// + /// Valore da gestire come delta degli index x lettura LUT + /// + private int indexLutCorr { get; set; } = 0; + + /// + /// Indica se usare gli indirizzi estesi per ogni blocco: false = 0...10'000 true = + /// 0...65'536 (= xFFFF) + /// + private bool modbusExtReg { get; set; } = false; + + #endregion Private Properties + #region Private Methods /// @@ -1330,7 +1497,7 @@ namespace IOB_WIN_NEXT switch (tipoMem) { case plcDataType.Real: - case plcDataType.RealHL: + case plcDataType.RealLH: case plcDataType.FloatABCD: if (size == 4) { @@ -1338,23 +1505,25 @@ namespace IOB_WIN_NEXT } else if (size == 2) { - valore = ModbusClient.ConvertRegistersToFloat(listInt); + valore = ModbusClient.ConvertRegistersToFloat(listInt, ModbusClient.RegisterOrder.LowHigh); } break; - case plcDataType.RealLH: + case plcDataType.RealHL: case plcDataType.FloatCDAB: if (size == 4) { - // inverto array... - Array.Reverse(listInt); - valore = ModbusClient.ConvertRegistersToDouble(listInt); + //// inverto array... + //Array.Reverse(listInt); + //valore = ModbusClient.ConvertRegistersToDouble(listInt); + valore = ModbusClient.ConvertRegistersToDouble(listInt, ModbusClient.RegisterOrder.HighLow); } else if (size == 2) { - // inverto array... - Array.Reverse(listInt); - valore = ModbusClient.ConvertRegistersToFloat(listInt); + //// inverto array... + //Array.Reverse(listInt); + //valore = ModbusClient.ConvertRegistersToFloat(listInt); + valore = ModbusClient.ConvertRegistersToFloat(listInt, ModbusClient.RegisterOrder.HighLow); } break; @@ -1533,7 +1702,7 @@ namespace IOB_WIN_NEXT case modBusAddrType.InputRegister: if (useLUT) { - int lutAddress = 30000 + item.Value.index + deltaBase + indexLutCorr; + int lutAddress = (parametri.holdRegBaseAddr / 4 * 3) + item.Value.index + deltaBase + indexLutCorr; // se size = 1 --> devo cambiare modo recupero if (item.Value.size == 1) { @@ -1595,14 +1764,13 @@ namespace IOB_WIN_NEXT case modBusAddrType.HoldingRegister: if (useLUT) { - int lutAddress = 40000 + item.Value.index + deltaBase + indexLutCorr; + int lutAddress = parametri.holdRegBaseAddr + item.Value.index + deltaBase + indexLutCorr; // se size = 1 --> devo cambiare modo recupero if (item.Value.size == 1) { //if (item.Value.index % 2 == 0) if (lutAddress % 2 == 0) { - //Array.Copy(HoldingRegisterLUT[lutAddress], listInt, 1); Array.Copy(HoldingRegisterLUT[lutAddress], 0, listInt, 0, 1); } else @@ -1849,7 +2017,8 @@ namespace IOB_WIN_NEXT try { stopwatch.Restart(); - rawData = currPLC.ReadDiscreteInputs(startAddr - baseAddr, numReg); + int memAddr = startAddr - baseAddr; + rawData = currPLC.ReadDiscreteInputs(memAddr, numReg); stopwatch.Stop(); lgTrace($"Lettura in blocco DiscreteInput | startAddr: {startAddr} | numReg {numReg} | rawData.lenght: {rawData.Length} | {stopwatch.ElapsedMilliseconds}ms"); lastReadPLC = DateTime.Now; @@ -1917,7 +2086,8 @@ namespace IOB_WIN_NEXT try { stopwatch.Restart(); - rawData = currPLC.ReadHoldingRegisters(startAddr - baseAddr, numReg); + int memAddr = startAddr - baseAddr; + rawData = currPLC.ReadHoldingRegisters(memAddr, numReg); stopwatch.Stop(); lgTrace($"Lettura in blocco HoldingRegisters| startAddr: {startAddr} | numReg {numReg} | rawData.lenght: {rawData.Length} | {stopwatch.ElapsedMilliseconds}ms"); lastReadPLC = DateTime.Now; @@ -1987,7 +2157,8 @@ namespace IOB_WIN_NEXT try { stopwatch.Restart(); - rawData = currPLC.ReadInputRegisters(startAddr - baseAddr, numReg); + int memAddr = startAddr - baseAddr; + rawData = currPLC.ReadInputRegisters(memAddr, numReg); stopwatch.Stop(); lgTrace($"Lettura in blocco InputRegisters| startAddr: {startAddr} | numReg {numReg} | rawData.lenght: {rawData.Length} | {stopwatch.ElapsedMilliseconds}ms"); lastReadPLC = DateTime.Now; @@ -2043,7 +2214,6 @@ namespace IOB_WIN_NEXT private void readMemoryBlock(int startAddr, int numReg) { bool allOk = false; - int baseHold = deltaBase; modbusMemType currMemType = modbusMemType.NotDefined; // valori setup secondo conf memoria: memoria estesa... 0 ... xFFFF per ogni set da 100'000... int maxVal = modbusExtReg ? 65536 : 10000; @@ -2055,22 +2225,22 @@ namespace IOB_WIN_NEXT switch (currMemType) { case modbusMemType.Coil: - baseAddr = -baseHold; + baseAddr = 0 * baseMult; allOk = readMemBlockCoil(startAddr, numReg, baseAddr); break; case modbusMemType.DiscreteInput: - baseAddr = 1 * baseMult - baseHold; + baseAddr = 1 * baseMult; allOk = readMemBlockDiscreteIn(startAddr, numReg, baseAddr); break; case modbusMemType.InputRegister: - baseAddr = 3 * baseMult - baseHold; + baseAddr = 3 * baseMult; allOk = readMemBlockInputReg(startAddr, numReg, baseAddr); break; case modbusMemType.HoldingRegister: - baseAddr = 4 * baseMult - baseHold; + baseAddr = 4 * baseMult; allOk = readMemBlockHoldingReg(startAddr, numReg, baseAddr); break; diff --git a/IOB-WIN-NEXT/IobModbusTCPCenterfrigo.cs b/IOB-WIN-NEXT/IobModbusTCPCenterfrigo.cs index 659e7f8c..c6216d95 100644 --- a/IOB-WIN-NEXT/IobModbusTCPCenterfrigo.cs +++ b/IOB-WIN-NEXT/IobModbusTCPCenterfrigo.cs @@ -1,9 +1,4 @@ -using IOB_UT_NEXT; -using MapoSDK; -using System; -using System.Collections.Generic; -using System.IO; -using static MapoSDK.WharehouseData; +using System; namespace IOB_WIN_NEXT { @@ -102,128 +97,6 @@ namespace IOB_WIN_NEXT B_input = byteSignals; } - /// - /// Procedura di import file... formato excel Giacovelli - /// - /// - protected override bool importFile(string fileItem) - { - bool fatto = false; - int numErr = 0; - // test procedura di import files excel x Giacovelli... - var currExcel = new ExcelMan(fileItem); - // creo lista dati in formato RegGiacenze... - Dictionary listaGiac = new Dictionary(); - var dtSet = currExcel.getDataSet(); - if (dtSet != null && dtSet.Tables != null && dtSet.Tables.Count > 0) - { - string nomeFile = Path.GetFileName(fileItem); - nomeFile = nomeFile.Substring(0, nomeFile.LastIndexOf(".")); - var elSheet = dtSet.Tables; - int idxTab = 0; - //cerco lo sheet corretto se > 1 - if (dtSet.Tables.Count > 1) - { - for (int i = 0; i < dtSet.Tables.Count; i++) - { - if (nomeFile.Contains(dtSet.Tables[i].TableName)) - { - idxTab = i; - } - } - } - var tabella = dtSet.Tables[idxTab]; - int numRighe = tabella.Rows.Count; - int idxODL = 0; - DateTime dataDoc = DateTime.Today; - DateTime.TryParse(nomeFile, out dataDoc); - // cerco lotto x giornata... - string sIdxODL = utils.callUrl(urlGetOdlAtDate(dataDoc)); - int.TryParse(sIdxODL, out idxODL); - for (int i = 0; i < numRighe; i++) - { - if (numErr < 5) - { - try - { - // variabili di appoggio... - DateTime dtRif = DateTime.Today; - double qtyTot = 0; - int numPack = 0; - string ddt = tabella.Rows[i].ItemArray[FileDecod["ExtDoc"]].ToString().Trim(); - string prod = tabella.Rows[i].ItemArray[FileDecod["Product"]].ToString().Trim(); - string variety = tabella.Rows[i].ItemArray[FileDecod["Variety"]].ToString().Trim(); - string suppl = tabella.Rows[i].ItemArray[FileDecod["Supplier"]].ToString().Trim(); - string sDate = tabella.Rows[i].ItemArray[FileDecod["DateRif"]].ToString().Trim(); - string sQty = tabella.Rows[i].ItemArray[FileDecod["QtyTot"]].ToString().Trim(); - string sNum = tabella.Rows[i].ItemArray[FileDecod["NumPack"]].ToString().Trim(); - string numPed = tabella.Rows[i].ItemArray[FileDecod["NumPed"]].ToString().Trim(); - string packPed = tabella.Rows[i].ItemArray[FileDecod["PackPed"]].ToString().Trim(); - string pesoPack = tabella.Rows[i].ItemArray[FileDecod["PesoPack"]].ToString().Trim(); - DateTime.TryParse(sDate, out dtRif); - int.TryParse(sNum, out numPack); - double.TryParse(sQty, out qtyTot); - string identRG = ddt.Length > 2 ? $"{strFixId(ddt)}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}" : $"{dtRif:yyyyMMdd}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}"; - string notes = $"{numPed}x{packPed}x{pesoPack}"; - // verifico di avere dati per proseguire... - bool checkIdent = !string.IsNullOrEmpty($"{prod}{variety}{suppl}"); - bool checkHeaderKo = (ddt == "DDT" || prod == "PRODOTTO"); - if (checkIdent && !checkHeaderKo) - { - BatchRec newRow = new BatchRec() - { - IdxODL = idxODL, - IdentRG = identRG, - DateRif = dtRif, - ExtDoc = ddt, - Product = prod, - Variety = variety, - Supplier = suppl, - NumPack = numPack, - QtyTot = qtyTot, - Notes = notes - }; - // verifico: se manca aggiungo - if (!listaGiac.ContainsKey(identRG)) - { - listaGiac.Add(identRG, newRow); - } - else - { - // altrimenti aggiorno giacenza con valori numerici - listaGiac[identRG].NumPack += newRow.NumPack; - listaGiac[identRG].QtyTot += newRow.QtyTot; - } - } - else - { - numErr++; - } - } - catch (Exception exc) - { - numErr++; - } - } - } - } - if (listaGiac.Count > 0) - { - // converto in una nuova lista... - int rCounter = 1; - Dictionary list2Send = new Dictionary(); - foreach (var item in listaGiac) - { - list2Send.Add(rCounter, item.Value); - rCounter++; - } - // ora invio i file con json... - accodaRawData(rawTransfType.RegGiacenze, list2Send); - fatto = true; - } - return fatto; - } - /// /// Effettua sync dati /// @@ -231,6 +104,8 @@ namespace IOB_WIN_NEXT { // richiesta check autoODL processAutoOdl(); + // richiesta generazione quotidiana dossiers + processAutoDossier(); // effettua gestione import file... processFileImport(); } diff --git a/IOB-WIN-NEXT/IobModbusTCPFimat.cs b/IOB-WIN-NEXT/IobModbusTCPFimat.cs new file mode 100644 index 00000000..54b94ef8 --- /dev/null +++ b/IOB-WIN-NEXT/IobModbusTCPFimat.cs @@ -0,0 +1,221 @@ +using FluentFTP.Helpers; +using IOB_UT_NEXT; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using static IOB_UT_NEXT.CustomObj; + +namespace IOB_WIN_NEXT +{ + /* -------------------------------------------------------------------------------- + * Controlli ModBusTCP FIMAT + * - protocollo ModBus TCP + * - gestione stato via Modbus + * - resto gestioen via file + * + * G:\Drive condivisi\30_Clienti\Tenditalia\Macchina Fimat + * + * -------------------------------------------------------------------------------- */ + + public class IobModbusTCPFimat : IobModbusTCP + { + #region Public Constructors + + /// + /// Classe base con i metodi x ModBusTCP + /// + /// + /// + public IobModbusTCPFimat(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) + { + lgInfo("NEW IOB ModBus TCP FIMAT"); + + setupSpecialParams(); + // provo lettura una prima volta i dati DYN + if (currPLC != null && currPLC.Connected) + { + try + { + processDynData(); + if (EnableTest) + { + testReadExt(); + } + } + catch (Exception exc) + { + lgError($"Eccezione in processDynData iniziale x ModBus TCP FIMAT:{Environment.NewLine}{exc}"); + } + } + if (EnableTest) + { + processDataSync(); + } + } + + #endregion Public Constructors + + #region Protected Fields + + /// + /// Quantità massima PODL prima di fare split ordine (default 999'999) + /// + protected int maxPodlQty = 999999; + + #endregion Protected Fields + + #region Protected Properties + + /// + /// Restituisce controllo IN ALLARME + /// + protected bool AlarmState + { + get + { + return testIntCondition("AlarmIntCond"); + } + } + + /// + /// Restituisce status di ESTOP triggered (triggered = premuta, altrimenti armed) + /// + protected bool EStopTriggered + { + get + { + return testBitCondition("EStopBitCond"); + } + } + + /// + /// Restituisce status di Manuale, hard coded + /// + protected bool ManualState + { + get + { + return testBitCondition("ManualBitCond"); + } + } + + /// + /// Restituisce status di WORK (auto + lavora), hard coded + /// + protected bool WorkState + { + get + { + return testIntCondition("WorkIntCond"); + } + } + + #endregion Protected Properties + + #region Protected Methods + + /// + /// Effettua decodifica aree memoria alla bitmap usata x MAPO + /// + protected override void decodeToBaseBitmap() + { + // init a zero... + B_input = 0; + + /* ----------------------------------------------------- + * bitmap MAPO STANDARD 60 + * B0: POWER_ON + * B1: RUN + * B2: pzCount + * B3: allarme + * B4: manuale + * B5: slowTC + * B6: WarmUpCoolDown + * B7: EmergArmata + * + ----------------------------------------------------- */ + + var MemInt = new byte[2]; + + int byteSignals = 0; + // bit 0 (poweron) imposto a 1 SE connected... + if (currPLC.Connected) + { + byteSignals += (1 << 0); + } + // se ho qualcosa nella holding register... + if (HoldingRegisterLUT != null && HoldingRegisterLUT.Count > 0) + { + // se emergenza NON premuta (triggered) indico OK (armata...) FARE !!! togliere true + if (!EStopTriggered) + { + byteSignals += (1 << 7); + } + + // impiego controlli da setup IntConditions... processo dagli stati + gravi... + if (AlarmState || hasAlarms()) + { + byteSignals += (1 << 3); + } + else if (ManualState) + { + byteSignals += (1 << 4); + } + else if (WorkState) + { + byteSignals += (1 << 1); + } + + checkTranslateBit(); + checkTranslateInt(); + } + else + { + lgInfo("HoldingRegisterLUT vuoto!"); + } + + // salvo! + B_input = byteSignals; + } + + + /// + /// Effettua sync dati x PODL attivi + /// + protected override void processDataSync() + { + if (hasRecipe) + { + lgTrace("processDataSync: START"); + DateTime adesso = DateTime.Now; + Calendar cal = new CultureInfo("it-IT").Calendar; + int week = cal.GetWeekOfYear(adesso, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + string tempPath = Path.Combine(pathList["path-locBase"], pathList["path-01-Temp"]); + string archPath = Path.Combine(pathList["path-locBase"], pathList["path-02-Sent"], $"{adesso:yyyy}", $"{week:00}"); + string remoPath = Path.Combine(pathList["path-locBase"], pathList["path-04-remReq"]); + baseUtils.checkDir(tempPath); + baseUtils.checkDir(archPath); + try + { + // recupero elenco PODL da processare, check PODL già inviati, save locale + bool create = RecipeReqWriteLocal(tempPath, useLocalRecipe); + // invio ricette a impianto + bool trasmitted = RecipeSend(tempPath, archPath, remoPath); + } + catch (Exception exc) + { + lgError($"Eccezione in processDataSync{Environment.NewLine}{exc}"); + } + lgTrace("processDataSync: Completed"); + } + else + { + lgTrace("processDataSync: NO exec, hasRecipe=false"); + } + } + + #endregion Protected Methods + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/IobModbusTCPRimor.cs b/IOB-WIN-NEXT/IobModbusTCPRimor.cs new file mode 100644 index 00000000..3ab0f418 --- /dev/null +++ b/IOB-WIN-NEXT/IobModbusTCPRimor.cs @@ -0,0 +1,244 @@ +using System; + +namespace IOB_WIN_NEXT +{ + /* -------------------------------------------------------------------------------- + * Controlli ModBusTCP Rimor + * - protocollo ModBus TCP + * - specifico comportamento sabbiatura e ossitaglio x IMI Remosa + * - gestione stato + * - gestione allarmi + * - gestione parametri (ore/minuti funzionamento) + * + * G:\Drive condivisi\30_Clienti\IMI-Remosa\Richieste nuove integrazioni\RIMOR + * + * -------------------------------------------------------------------------------- */ + + public class IobModbusTCPRimor : IobModbusTCP + { + #region Public Constructors + + /// + /// Classe base con i metodi x ModBusTCP + /// + /// + /// + public IobModbusTCPRimor(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) + { + lgInfo("NEW IOB ModBus TCP Rimor"); + + // provo lettura una prima volta i dati DYN + if (currPLC != null && currPLC.Connected) + { + try + { + processDynData(); + if (EnableTest) + { + processDataSync(); + testReadExt(); + } + } + catch (Exception exc) + { + lgError($"Eccezione in processDynData iniziale x ModBus TCP Rimor:{Environment.NewLine}{exc}"); + } + } + } + + #endregion Public Constructors + + #region Protected Properties + + /// + /// Restituisce controllo IN ALLARME + /// + protected bool AlarmState + { + get + { + bool answ = false; + if (memMap.optMemPar.ContainsKey("AlarmBitCond")) + { + answ = testDisInBitCondition("AlarmBitCond"); + } + else if (memMap.optMemPar.ContainsKey("AlarmIntCond")) + { + answ = testIntCondition("AlarmIntCond"); + } + return answ; + } + } + + /// + /// Restituisce status di ESTOP triggered (triggered = premuta, altrimenti armed) + /// + protected bool EStopTriggered + { + get + { + bool answ = false; + if (memMap.optMemPar.ContainsKey("EStopBitCond")) + { + answ = testDisInBitCondition("EStopBitCond"); + } + else if (memMap.optMemPar.ContainsKey("EStopIntCond")) + { + answ = testIntCondition("EStopIntCond"); + } + return answ; + } + } + + /// + /// Restituisce status di Manuale, hard coded + /// + protected bool ManualState + { + get + { + bool answ = false; + if (memMap.optMemPar.ContainsKey("ManualBitCond")) + { + answ = testDisInBitCondition("ManualBitCond"); + } + else if (memMap.optMemPar.ContainsKey("ManualIntCond")) + { + answ = testIntCondition("ManualIntCond"); + } + return answ; + } + } + + /// + /// Restituisce status di WORK (auto + lavora), hard coded + /// + protected bool WorkState + { + get + { + bool answ = false; + if (memMap.optMemPar.ContainsKey("WorkBitCond")) + { + answ = testDisInBitCondition("WorkBitCond"); + } + else if (memMap.optMemPar.ContainsKey("WorkIntCond")) + { + answ = testIntCondition("WorkIntCond"); + } + return answ; + } + } + + /// + /// Restituisce status di END ORDINE (chiusura ODL se aperto) HARD coded + /// + protected bool EndOrderState + { + get + { + bool answ = false; + if (memMap.optMemPar.ContainsKey("EndOrdBitCond")) + { + answ = testDisInBitCondition("EndOrdBitCond"); + } + else if (memMap.optMemPar.ContainsKey("EndOrdIntCond")) + { + answ = testIntCondition("EndOrdIntCond"); + } + return answ; + } + } + + #endregion Protected Properties + + #region Protected Methods + + /// + /// Effettua decodifica aree memoria alla bitmap usata x MAPO + /// + protected override void decodeToBaseBitmap() + { + // init a zero... + B_input = 0; + + /* ----------------------------------------------------- + * bitmap MAPO STANDARD 60 + * B0: POWER_ON + * B1: RUN + * B2: pzCount + * B3: allarme + * B4: manuale + * B5: slowTC + * B6: WarmUpCoolDown + * B7: EmergArmata + * + ----------------------------------------------------- */ + + var MemInt = new byte[2]; + + int byteSignals = 0; + // bit 0 (poweron) imposto a 1 SE connected... + if (currPLC.Connected) + { + byteSignals += (1 << 0); + } + // se ho qualcosa nella holding register... + if (HoldingRegisterLUT != null && HoldingRegisterLUT.Count > 0) + { + // se emergenza NON premuta (triggered) indico OK (armata...) FARE !!! togliere true + //if (!EStopTriggered) + if (true) + { + byteSignals += (1 << 7); + } + + // impiego controlli da setup IntConditions... processo dagli stati + gravi... + if (AlarmState || hasAlarms()) + { + byteSignals += (1 << 3); + } + else if (ManualState) + { + byteSignals += (1 << 4); + } + else if (WorkState) + { + byteSignals += (1 << 1); + } + + // controllo SE avesse ODL attivo am foss ein condizione end ordine --> mando chiusura ODL + if (currIdxODL > 0) + { + if (EndOrderState) + { + // invio chiusura ODL + tryCloseCurrODL(); + } + } + } + else + { + lgInfo("HoldingRegisterLUT vuoto!"); + } + + // salvo! + B_input = byteSignals; + } + + /// + /// Effettua sync dati + /// + protected override void processDataSync() + { + // richiesta check autoODL + processAutoOdl(); + // richiesta generazione quotidiana dossiers + processAutoDossier(); + // effettua gestione import file... + processFileImport(); + } + + #endregion Protected Methods + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/IobModbusTCPSaim.cs b/IOB-WIN-NEXT/IobModbusTCPSaim.cs index cd94d356..e1194bec 100644 --- a/IOB-WIN-NEXT/IobModbusTCPSaim.cs +++ b/IOB-WIN-NEXT/IobModbusTCPSaim.cs @@ -1,9 +1,4 @@ -using IOB_UT_NEXT; -using MapoSDK; -using System; -using System.Collections.Generic; -using System.IO; -using static MapoSDK.WharehouseData; +using System; namespace IOB_WIN_NEXT { @@ -39,6 +34,7 @@ namespace IOB_WIN_NEXT processDynData(); if (EnableTest) { + processDataSync(); testReadExt(); } } @@ -174,143 +170,6 @@ namespace IOB_WIN_NEXT B_input = byteSignals; } - /// - /// Procedura di import file... formato excel Giacovelli - /// - /// - protected override bool importFile(string fileItem) - { - bool fatto = false; - int numErr = 0; - // test procedura di import files excel x Giacovelli... - var currExcel = new ExcelMan(fileItem); - // creo lista dati in formato RegGiacenze... - Dictionary listaGiac = new Dictionary(); - var dtSet = currExcel.getDataSet(); - if (dtSet != null && dtSet.Tables != null && dtSet.Tables.Count > 0) - { - string nomeFile = Path.GetFileName(fileItem); - nomeFile = nomeFile.Substring(0, nomeFile.LastIndexOf(".")); - var elSheet = dtSet.Tables; - int idxTab = 0; - //cerco lo sheet corretto se > 1 - if (dtSet.Tables.Count > 1) - { - for (int i = 0; i < dtSet.Tables.Count; i++) - { - if (nomeFile.Contains(dtSet.Tables[i].TableName)) - { - idxTab = i; - } - } - } - var tabella = dtSet.Tables[idxTab]; - int numRighe = tabella.Rows.Count; - int idxODL = 0; - DateTime dataDoc = DateTime.Today; - DateTime.TryParse(nomeFile, out dataDoc); - // cerco lotto x giornata... - string sIdxODL = utils.callUrl(urlGetOdlAtDate(dataDoc)); - int.TryParse(sIdxODL, out idxODL); - for (int i = 0; i < numRighe; i++) - { - if (numErr < 5) - { - try - { - // variabili di appoggio... - DateTime dtRif = DateTime.Today; - double qtyTot = 0; - int numPack = 0; - string ddt = tabella.Rows[i].ItemArray[FileDecod["ExtDoc"]].ToString().Trim(); - string sDate = tabella.Rows[i].ItemArray[FileDecod["DateRif"]].ToString().Trim(); - string prod = tabella.Rows[i].ItemArray[FileDecod["Product"]].ToString().Trim(); - // verifiche x import: header, data e DDT (vuoti o "-") --> SKIP! - bool checkHeaderKo = (ddt == "DDT" || prod == "PRODOTTO"); - bool checkEmptyDdt = (string.IsNullOrEmpty(ddt) || ddt == "-"); - bool checkEmptyDate = (string.IsNullOrEmpty(sDate) || sDate == "-"); - if (checkHeaderKo) - { - lgTrace($"SKIP header"); - } - else if (checkEmptyDdt || checkEmptyDate) - { - lgTrace($"SKIP linea vuota | i: {i} | ddt: {ddt} | date: {sDate} | prod: {prod}"); - } - else - { - string variety = tabella.Rows[i].ItemArray[FileDecod["Variety"]].ToString().Trim(); - string suppl = tabella.Rows[i].ItemArray[FileDecod["Supplier"]].ToString().Trim(); - string sQty = tabella.Rows[i].ItemArray[FileDecod["QtyTot"]].ToString().Trim(); - string sNum = tabella.Rows[i].ItemArray[FileDecod["NumPack"]].ToString().Trim(); - string numPed = tabella.Rows[i].ItemArray[FileDecod["NumPed"]].ToString().Trim(); - string packPed = tabella.Rows[i].ItemArray[FileDecod["PackPed"]].ToString().Trim(); - string pesoPack = tabella.Rows[i].ItemArray[FileDecod["PesoPack"]].ToString().Trim(); - DateTime.TryParse(sDate, out dtRif); - int.TryParse(sNum, out numPack); - double.TryParse(sQty, out qtyTot); - string identRG = ddt.Length > 2 ? $"{strFixId(ddt)}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}" : $"{dtRif:yyyyMMdd}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}"; - string notes = $"{numPed}x{packPed}x{pesoPack}"; - // verifico di avere dati per proseguire... - bool checkIdent = !string.IsNullOrEmpty($"{prod}{variety}{suppl}"); - if (checkIdent) - { - BatchRec newRow = new BatchRec() - { - IdxODL = idxODL, - IdentRG = identRG, - DateRif = dtRif, - ExtDoc = ddt, - Product = prod, - Variety = variety, - Supplier = suppl, - NumPack = numPack, - QtyTot = qtyTot, - Notes = notes - }; - // verifico: se manca aggiungo - if (!listaGiac.ContainsKey(identRG)) - { - listaGiac.Add(identRG, newRow); - } - else - { - // altrimenti aggiorno giacenza con valori numerici - listaGiac[identRG].NumPack += newRow.NumPack; - listaGiac[identRG].QtyTot += newRow.QtyTot; - } - } - else - { - lgError($"Errore verifica identità riga | prod: {prod} | variety: {variety} | suppl: {suppl}"); - numErr++; - } - } - } - catch (Exception exc) - { - numErr++; - } - } - } - } - if (listaGiac.Count > 0) - { - // converto in una nuova lista... - int rCounter = 1; - Dictionary list2Send = new Dictionary(); - foreach (var item in listaGiac) - { - list2Send.Add(rCounter, item.Value); - rCounter++; - } - // ora invio i file con json... - accodaRawData(rawTransfType.RegGiacenze, list2Send); - fatto = true; - } - return fatto; - } - /// /// Effettua sync dati /// @@ -318,6 +177,8 @@ namespace IOB_WIN_NEXT { // richiesta check autoODL processAutoOdl(); + // richiesta generazione quotidiana dossiers + processAutoDossier(); // effettua gestione import file... processFileImport(); } diff --git a/IOB-WIN-NEXT/IobOpcUa.cs b/IOB-WIN-NEXT/IobOpcUa.cs index 45bddd7e..71b5f083 100644 --- a/IOB-WIN-NEXT/IobOpcUa.cs +++ b/IOB-WIN-NEXT/IobOpcUa.cs @@ -17,6 +17,56 @@ namespace IOB_WIN_NEXT { public class IobOpcUa : IobGeneric { + #region Protected Fields + + /// + /// Struttura dove vengono memorizzati i dataitem ed i rispettivi valori x processing + /// + protected Dictionary dataItemMem = new Dictionary(); + + /// + /// Abilitazione restart (da opt par...) + /// + protected bool enableCliRestart = false; + + /// + /// Gestione filtraggio dati + /// + protected bool enableDataFilter = false; + + /// + /// Determina se ha effettuata lettura items in memoria x confronto... + /// + protected bool hasReadItems = false; + + /// + /// Ultimo current received x gestione update periodico... + /// + protected DateTime lastCurrent = DateTime.Now; + + /// + /// Oggetto MAIN x connessione OPC-UA + /// + protected UAClient UA_ref; + + /// + /// Veto controllo status x log... + /// + protected DateTime vetoCheckStatus = DateTime.Now; + + protected int WatchDog = 0; + + #endregion Protected Fields + + #region Private Fields + + /// + /// Elenco degli items da monitorare come risultato del browse iniziale + /// + private Dictionary selectedItemList = new Dictionary(); + + #endregion Private Fields + #region Public Constructors /// @@ -49,12 +99,17 @@ namespace IOB_WIN_NEXT { bool.TryParse(getOptPar("ENABLE_CLI_RESTART"), out enableCliRestart); } + // init lastCurrentMaxElapsed + if (!string.IsNullOrEmpty(getOptPar("MAX_ELAPSED_TIME_SEC"))) + { + int.TryParse(getOptPar("MAX_ELAPSED_TIME_SEC"), out lastCurrentMaxElapsed); + } // init datetime counters DateTime adesso = DateTime.Now; lastPzCountSend = adesso; lastWarnODL = adesso; lastCurrent = adesso; - lgTrace($"Aggiornato IobOpcUa.lastCurrent: {lastCurrent}"); + lgTrace($"Aggiornato IobOpcUa.lastCurrent: {lastCurrent}"); // ora leggo il file di conf specifico.... string jsonFileName = getOptPar("OPC_PARAM_CONF"); if (!string.IsNullOrEmpty(jsonFileName)) @@ -66,6 +121,176 @@ namespace IOB_WIN_NEXT #endregion Public Constructors + #region Protected Properties + + /// + /// Area dati raw per lettura encoded (SE presente) + /// + protected byte[] byteRawData { get; set; } = new byte[1]; + + /// + /// ProgName corrente + /// + protected string currProgName + { + get + { + string answ = ""; + if (!string.IsNullOrEmpty(opcUaParams.keyProgName)) + { + answ = getDataItemValue(opcUaParams.keyProgName); + } + return answ; + } + } + + /// + /// Indica se si debba leggere un area di tipo "encoded" (byte raw --> obj) + /// + protected bool doByteRead { get; set; } = false; + + /// + /// Verifico se abbia ALMENO un errore... + /// + protected bool hasError + { + get + { + return checkMultiCondition(opcUaParams.condError); + } + } + + /// + /// Indica se abbia emergenza ARMATA (cond normale) + /// + protected bool hasEStopArmed + { + get + { + return checkMultiCondition(opcUaParams.condEStop); + } + } + + /// + /// Indica se abbia stato POWER ON (multicondizione) + /// + protected virtual bool hasPowerOn + { + get + { + return checkMultiCondition(opcUaParams.condPowerOn); + } + } + + /// + /// Indica se abbia stato MANUAL (condizioni varie, es stopped) + /// + protected virtual bool isManual + { + get + { + return checkMultiCondition(opcUaParams.condManual); + } + } + + /// + /// Indica se abbia stato READY (condizioni varie, es ausiliari OK) + /// + protected virtual bool isReady + { + get + { + return checkMultiCondition(opcUaParams.condReady); + } + } + + /// + /// Indica se sia in stato Ssetup + /// + protected bool isSetup + { + get + { + return checkMultiCondition(opcUaParams.condSetup); + } + } + + /// + /// Indica se sia in stato WarmUp / CoolDown (riscaldamento/raffreddamento) + /// + protected bool isWarmUpCoolDown + { + get + { + return checkMultiCondition(opcUaParams.condWarmUpCoolDown); + } + } + + /// + /// Indica se sia in stato Warning + /// + protected bool isWarning + { + get + { + return checkMultiCondition(opcUaParams.condWarning); + } + } + + /// + /// Indica se abbia stato READY (condizioni varie, es ausiliari OK) + /// + protected bool isWorking + { + get + { + // cerco SE HO cond OPC Ua o classica... nel caso creo e salvo + if (opcUaParams.condWorkOpc.checkList == null || opcUaParams.condWorkOpc.checkList.Count == 0) + { + opcUaParams.condWorkOpc = new diCheckCondSetup() + { + checkList = opcUaParams.condWork, + checkMode = boolCheckMode.AND, + negateValue = false + }; + } + return checkMultiCondition(opcUaParams.condWorkOpc); + } + } + + /// + /// Periodo massimo (in sec) per letture dati RAW in mancanza di eventi + /// + protected int lastCurrentMaxElapsed = 120; + + /// + /// Parametri specifici MTC + /// + protected OpcUaParamConf opcUaParams { get; set; } + + /// + /// URL x salvataggio elenco dataItems OpcUa + /// + protected string urlSaveDataItems + { + get + { + string answ = ""; + try + { + string machineName = Environment.MachineName; + answ = $@"{cIobConf.serverData.TRANSP}://{cIobConf.serverData.MPIP}{cIobConf.serverData.MPURL}{cIobConf.serverData.CMDALIVE}/saveDataItems/{cIobConf.codIOB}"; + } + catch (Exception exc) + { + lgError(exc, "Errore in composizione urlSaveDataItems"); + } + return answ; + } + } + + #endregion Protected Properties + #region Public Methods /// @@ -190,25 +415,6 @@ namespace IOB_WIN_NEXT return outVal; } - - /// - /// Recupero allarmi specifico x OPC-UA - /// - /// - /// - protected override int getAlarmStatus(BaseAlarmConf item) - { - int answ = 0; - // recupero valore in formato stringa... - string currStatus = getDataItemValue(item.memAddr); - // se non nullo --> recupero int - if (!string.IsNullOrEmpty(currStatus)) - { - int.TryParse(currStatus, out answ); - } - return answ; - } - /// /// Effettua vero processing contapezzi /// @@ -437,7 +643,7 @@ namespace IOB_WIN_NEXT DateTime locTStamp = DateTime.Now; descr = itemTranslation("OPC", MonIt.DisplayName); sVal = $"Change 01: {locTStamp.ToString()} | descr: {descr} | Id: {MonIt.StartNodeId} | Val: {NotifyValue}"; - lgInfo(sVal); + lgDebug(sVal); // verifico se salvare changed = checkSaveValue(MonIt, NotifyValue, true); @@ -513,7 +719,7 @@ namespace IOB_WIN_NEXT DateTime locTStamp = DateTime.Now; descr = itemTranslation("OPC", MonIt.DisplayName); sVal = $"Change 02: {locTStamp.ToString()} | descr: {descr} | Id: {MonIt.StartNodeId} | Val: {currVal}"; - lgInfo(sVal); + lgDebug(sVal); // verifico se salvare changed = checkSaveValue(MonIt, currVal, true) || forceSend; @@ -547,52 +753,6 @@ namespace IOB_WIN_NEXT return changed; } - protected virtual void procRunMode(ref string currRun) - { - // variabili RUN... se richiesto invio runMode - if (opcUaParams.runModeSend) - { - bool hasVetoLK = false; - bool hasVetoLKV = false; - if (!string.IsNullOrEmpty(opcUaParams.keyRunMode)) - { - currRun = getDataItemValue(opcUaParams.keyRunMode); - if (!string.IsNullOrEmpty(currRun)) - { - // se ho valore --> invio - string sVal = ""; - string descr = $"RunModeVal"; - DateTime locTStamp = DateTime.Now; - sVal = $"Change 03: {locTStamp.ToString()} | descr: {descr} | Id: {opcUaParams.keyRunMode} | Val: {currRun}"; - // cerco se sia un dato/valore - hasVetoLK = opcUaParams.fluxLogKeyValVeto.ContainsKey(descr); - if (hasVetoLK) - { - // se c'è controllo il valore... - var valList = opcUaParams.fluxLogKeyValVeto[descr]; - hasVetoLKV = valList.Contains(currRun); - } - if (hasVetoLKV) - { - lgTrace($"NON ACCODATO sample: veto trovato per {descr}/{currRun} in fluxLogKeyValVeto ", false); - } - else - { - accodaFLog(sVal, qEncodeFLog(descr, currRun)); - - // se richiesto provo a tradurre - if (opcUaParams.runModeTrad) - { - string RunModeDescr = itemTranslation("RunMode", currRun); - descr = $"RunMode"; - accodaFLog(sVal, qEncodeFLog(descr, RunModeDescr)); - } - } - } - } - } - } - internal void sendDataItemListToServer(NodeId StartNodeId) { // converto gli attuali nell'elenco dataitem... @@ -645,217 +805,6 @@ namespace IOB_WIN_NEXT #endregion Internal Methods - #region Protected Fields - - /// - /// Struttura dove vengono memorizzati i dataitem ed i rispettivi valori x processing - /// - protected Dictionary dataItemMem = new Dictionary(); - - /// - /// Abilitazione restart (da opt par...) - /// - protected bool enableCliRestart = false; - - /// - /// Gestione filtraggio dati - /// - protected bool enableDataFilter = false; - - /// - /// Determina se ha effettuata lettura items in memoria x confronto... - /// - protected bool hasReadItems = false; - - /// - /// Ultimo current received x gestione update periodico... - /// - protected DateTime lastCurrent = DateTime.Now; - - /// - /// Oggetto MAIN x connessione OPC-UA - /// - protected UAClient UA_ref; - - /// - /// Veto controllo status x log... - /// - protected DateTime vetoCheckStatus = DateTime.Now; - - protected int WatchDog = 0; - - #endregion Protected Fields - - #region Protected Properties - - /// - /// Area dati raw per lettura encoded (SE presente) - /// - protected byte[] byteRawData { get; set; } = new byte[1]; - - /// - /// Indica se si debba leggere un area di tipo "encoded" (byte raw --> obj) - /// - protected bool doByteRead { get; set; } = false; - - /// - /// Verifico se abbia ALMENO un errore... - /// - protected bool hasError - { - get - { - return checkMultiCondition(opcUaParams.condError); - } - } - - /// - /// Indica se abbia emergenza ARMATA (cond normale) - /// - protected bool hasEStopArmed - { - get - { - return checkMultiCondition(opcUaParams.condEStop); - } - } - - /// - /// Indica se abbia stato POWER ON (multicondizione) - /// - protected virtual bool hasPowerOn - { - get - { - return checkMultiCondition(opcUaParams.condPowerOn); - } - } - - /// - /// Indica se abbia stato MANUAL (condizioni varie, es stopped) - /// - protected virtual bool isManual - { - get - { - return checkMultiCondition(opcUaParams.condManual); - } - } - - /// - /// Indica se abbia stato READY (condizioni varie, es ausiliari OK) - /// - protected virtual bool isReady - { - get - { - return checkMultiCondition(opcUaParams.condReady); - } - } - - /// - /// Indica se sia in stato Ssetup - /// - protected bool isSetup - { - get - { - return checkMultiCondition(opcUaParams.condSetup); - } - } - - /// - /// Indica se sia in stato WarmUp / CoolDown (riscaldamento/raffreddamento) - /// - protected bool isWarmUpCoolDown - { - get - { - return checkMultiCondition(opcUaParams.condWarmUpCoolDown); - } - } - - /// - /// Indica se sia in stato Warning - /// - protected bool isWarning - { - get - { - return checkMultiCondition(opcUaParams.condWarning); - } - } - - /// - /// Indica se abbia stato READY (condizioni varie, es ausiliari OK) - /// - protected bool isWorking - { - get - { - // cerco SE HO cond OPC Ua o classica... nel caso creo e salvo - if (opcUaParams.condWorkOpc.checkList == null || opcUaParams.condWorkOpc.checkList.Count == 0) - { - opcUaParams.condWorkOpc = new diCheckCondSetup() - { - checkList = opcUaParams.condWork, - checkMode = boolCheckMode.AND, - negateValue = false - }; - } - return checkMultiCondition(opcUaParams.condWorkOpc); - } - } - - /// - /// ProgName corrente - /// - protected string currProgName - { - get - { - string answ = ""; - if (!string.IsNullOrEmpty(opcUaParams.keyProgName)) - { - answ = getDataItemValue(opcUaParams.keyProgName); - } - return answ; - } - } - - /// - /// Periodo massimo (in sec) per letture dati RAW in mancanza di eventi - /// - protected int lastCurrentMaxElapsed { get; set; } = 120; - - /// - /// Parametri specifici MTC - /// - protected OpcUaParamConf opcUaParams { get; set; } - - /// - /// URL x salvataggio elenco dataItems OpcUa - /// - protected string urlSaveDataItems - { - get - { - string answ = ""; - try - { - string machineName = Environment.MachineName; - answ = $@"{cIobConf.serverData.TRANSP}://{cIobConf.serverData.MPIP}{cIobConf.serverData.MPURL}{cIobConf.serverData.CMDALIVE}/saveDataItems/{cIobConf.codIOB}"; - } - catch (Exception exc) - { - lgError(exc, "Errore in composizione urlSaveDataItems"); - } - return answ; - } - } - - #endregion Protected Properties - #region Protected Methods /// @@ -1076,10 +1025,12 @@ namespace IOB_WIN_NEXT // bit 0 (poweron) imposto a 1 SE pingo + PowerOn=="ON"... bool powerOnOk = checkPing && hasPowerOn; - // controllo se sono poweroff e se non ho dati buoni da > lastCurrentMaxElapsed --> disconnetto - if (!powerOnOk && (adesso.Subtract(lastCurrent).TotalSeconds > lastCurrentMaxElapsed)) + //// controllo se sono poweroff e se non ho dati buoni da > lastCurrentMaxElapsed --> disconnetto + //if (!powerOnOk && (adesso.Subtract(lastCurrent).TotalSeconds > lastCurrentMaxElapsed)) + // controllo se non ho dati buoni da > lastCurrentMaxElapsed sec --> disconnetto + if (adesso.Subtract(lastCurrent).TotalSeconds > lastCurrentMaxElapsed) { - lgInfo("Timeout per mancata comunicazione --> disconnessione adapter OpcUa!"); + lgInfo($"Timeout per mancata comunicazione da oltre {lastCurrentMaxElapsed} sec --> disconnessione adapter OpcUa!"); tryDisconnect(); } @@ -1134,6 +1085,24 @@ namespace IOB_WIN_NEXT } } + /// + /// Recupero allarmi specifico x OPC-UA + /// + /// + /// + protected override int getAlarmStatus(BaseAlarmConf item) + { + int answ = 0; + // recupero valore in formato stringa... + string currStatus = getDataItemValue(item.memAddr); + // se non nullo --> recupero int + if (!string.IsNullOrEmpty(currStatus)) + { + int.TryParse(currStatus, out answ); + } + return answ; + } + protected byte[] getByteRaw(DataValue obj) { if (obj == null) @@ -1162,7 +1131,7 @@ namespace IOB_WIN_NEXT /// /// /// - protected string itemTranslation(string tipo, string id) + protected override string itemTranslation(string tipo, string id) { string answ = ""; string lemma = id; @@ -1228,17 +1197,54 @@ namespace IOB_WIN_NEXT //reader.Dispose(); } + protected virtual void procRunMode(ref string currRun) + { + // variabili RUN... se richiesto invio runMode + if (opcUaParams.runModeSend) + { + bool hasVetoLK = false; + bool hasVetoLKV = false; + if (!string.IsNullOrEmpty(opcUaParams.keyRunMode)) + { + currRun = getDataItemValue(opcUaParams.keyRunMode); + if (!string.IsNullOrEmpty(currRun)) + { + // se ho valore --> invio + string sVal = ""; + string descr = $"RunModeVal"; + DateTime locTStamp = DateTime.Now; + sVal = $"Change 03: {locTStamp.ToString()} | descr: {descr} | Id: {opcUaParams.keyRunMode} | Val: {currRun}"; + // cerco se sia un dato/valore + hasVetoLK = opcUaParams.fluxLogKeyValVeto.ContainsKey(descr); + if (hasVetoLK) + { + // se c'è controllo il valore... + var valList = opcUaParams.fluxLogKeyValVeto[descr]; + hasVetoLKV = valList.Contains(currRun); + } + if (hasVetoLKV) + { + lgTrace($"NON ACCODATO sample: veto trovato per {descr}/{currRun} in fluxLogKeyValVeto ", false); + } + else + { + accodaFLog(sVal, qEncodeFLog(descr, currRun)); + + // se richiesto provo a tradurre + if (opcUaParams.runModeTrad) + { + string RunModeDescr = itemTranslation("RunMode", currRun); + descr = $"RunMode"; + accodaFLog(sVal, qEncodeFLog(descr, RunModeDescr)); + } + } + } + } + } + } + #endregion Protected Methods - #region Private Fields - - /// - /// Elenco degli items da monitorare come risultato del browse iniziale - /// - private Dictionary selectedItemList = new Dictionary(); - - #endregion Private Fields - #region Private Methods /// @@ -1287,17 +1293,19 @@ namespace IOB_WIN_NEXT Dictionary nodeIdNameList = new Dictionary(); if (!string.IsNullOrEmpty(opcUaParams.BrowseFullVal)) { + lgInfo($"Start browse da BrowseFullVal: {opcUaParams.BrowseFullVal}"); try { UA_ref.Browse(opcUaParams.BrowseFullVal, opcUaParams.filterItemsNodeId, ref nodeIdNameList); } - catch(Exception exc) + catch (Exception exc) { lgError($"Eccezione in browsing BrowseFullVal:{Environment.NewLine}{exc}"); } } else { + lgInfo($"Start browse | BrowseNSIndex: {opcUaParams.BrowseNSIndex} | BrowseValue: {opcUaParams.BrowseValue} | filterItemsNodeId: {opcUaParams.filterItemsNodeId} | "); UA_ref.Browse(opcUaParams.BrowseNSIndex, opcUaParams.BrowseValue, opcUaParams.filterItemsNodeId, ref nodeIdNameList); } // loggo elenco degli item sottocrivibili... diff --git a/IOB-WIN-NEXT/IobOpcUaImas.cs b/IOB-WIN-NEXT/IobOpcUaImas.cs new file mode 100644 index 00000000..99ef6622 --- /dev/null +++ b/IOB-WIN-NEXT/IobOpcUaImas.cs @@ -0,0 +1,369 @@ +using MapoSDK; +using Newtonsoft.Json; +using Opc.Ua; +using System; +using System.Collections.Generic; +using System.Net.NetworkInformation; + +namespace IOB_WIN_NEXT +{ + public class IobOpcUaImas : IobOpcUa + { + #region Protected Fields + + /// + /// Modalità cambio ODL + /// + protected string CHANGE_ODL_MODE = ""; + + protected bool testDone = false; + + #endregion Protected Fields + + #region Public Constructors + + /// + /// Estende l'init della classe base, impiegando il pacchetto Nuget OPC-UA foundation con la + /// gestione specifica per IMAS OPC-UA (es Jetco) https://github.com/OPCFoundation/UA-.NETStandard + /// + /// + /// + public IobOpcUaImas(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) + { + lgInfo("Init OpcUa IMAS"); + // inizializzo classe base... + if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE"))) + { + CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE"); + } + sendKeyRichiesta = true; + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Processo i task richiesti e li elimino dalla coda 1:1 + /// + /// + public override Dictionary executeTasks(Dictionary task2exe) + { + // uso metodo base x ora + return base.executeTasks(task2exe); + } + + /// + /// Effettua vero processing contapezzi + /// + public override void processContapezzi() + { + if ((enablePzCountByApp || enablePzCountByIob) && !(disablePzCounteByIob)) + { + // check condizione validazione + if (checkMultiCondition(opcUaParams.condCountEnabled) || opcUaParams.condCountEnabled.checkList.Count == 0) + { + // cerco parametro contapezzi... + string currPzCount = getDataItemValue(opcUaParams.keyPartCount); + + // se ho un contapezzi... processo... + if (!string.IsNullOrEmpty(currPzCount)) + { + int newVal = -1; + bool fatto = Int32.TryParse(currPzCount, out newVal); + + if (fatto) + { + // gestione decremento contapezzi: viene "messo via" solo SE c'è un + // effettivo decremento contapezzi... + if (newVal < contapezziPLC) + { + pzCountResetted = true; + // incremento contatore richiesta + countKeyRichiesta = countKeyRichiesta + 1; + // log + lgInfo("Contapezzi resettato (PLC) --> pzCountResetted = true"); + } + + // salvo nuovo valore contapezziPLC + contapezziPLC = newVal > -1 ? newVal : contapezziPLC; + } + else + { + lgError($"Errore in decodifica valore contapezzi, valore rilevato: {currPzCount}"); + } + } + else + { + lgError("Errore in decodifica valore contapezzi, valore vuoto!"); + } + } + + if (CHANGE_ODL_MODE == "PZCOUNT_RESET") + { + // controllo comunque, se è ZERO il contapezzi, e sul server è maggiore il + // valore x ODL e NON abilitato il trigger reset --> abilito trigger... + if (!pzCountResetted && contapezziPLC == 0 && contapezziIOB > 0) + { + pzCountResetted = true; + // incremento contatore richiesta + countKeyRichiesta = countKeyRichiesta + 1; + // log + lgInfo("Contapezzi resettato (PLC==0 e IOB>PLC) --> pzCountResetted = true"); + } + } + } + } + + /// + /// Effettua reset del contapezzi, NON POSSIBILE in questa versione + /// + /// + public override bool resetcontapezziPLC() + { + bool answ = false; + return answ; + } + + /// + /// Effettua IMPOSTAZIONE FORZATA del contapezzi, NON POSSIBILE in questa versione + /// + /// + public override bool setcontapezziPLC(int newPzCount) + { + bool answ = false; + return answ; + } + + #endregion Public Methods + + #region Protected Methods + + /// + /// Effettua decodifica aree memoria alla bitmap usata x MAPO + /// + protected override void decodeToBaseBitmap() + { + DateTime adesso = DateTime.Now; + // init a zero... + B_input = 0; + + /* ----------------------------------------------------- + * STATE MACHINE 60 STD / SIMULA + *------------------------------------------------------ + * bitmap MAPO + * B0: POWER_ON + * B1: RUN + * B2: pzCount + * B3: allarme + * B4: manuale + * B5: SlowTC (NON gestito qui) + * B6: warm-up / cool-down / setup + * B7: emergenza ARMATA (1=ok, 0 = premuta) + ---------------------------------------------------- */ + + // se valido il check ping lo eseguo... altrimenti lo do x buono + bool checkPing = !opcUaParams.pingAsPowerOn; + string currRun = "N.A."; + if (!checkPing) + { + checkPing = (testPingMachine == IPStatus.Success); + } + // bit 0 (poweron) imposto a 1 SE pingo + PowerOn=="ON"... + bool powerOnOk = checkPing && hasPowerOn; + // procedo SOLO SE mi da ping OK... + if (checkPing) + { + B_input = powerOnOk ? 1 : 0; + + procRunMode(ref currRun); + + // salvo running come = working... + isRunning = isWorking; + + // se ho emergenza premuta --> emergenza! + if (hasEStopArmed) + { + B_input += (1 << 7); + } + // se ho emergenza premuta --> emergenza! + if (isWarmUpCoolDown) + { + B_input += (1 << 6); + } + // se ho almeno 1 allarme E NON SONO IN AUTO --> ALARM! + if (hasError) + { + B_input += (1 << 3); + } + if (isWorking) + { + // RUN = LAVORA! + B_input += (1 << 1); + } + else if (powerOnOk && (!isReady || isManual)) + { + // se NON ready --> manual + B_input += (1 << 4); + } + } + + // se abilitata gestione ODL esegue eventuale chiusura + + // se abilitato watchdog... + if (opcUaParams.WatchDog.IsEnabled) + { + if (adesso.Subtract(lastWatchDogPLC).TotalSeconds > 2) + { + lastWatchDogPLC = adesso; + WatchDog++; + WatchDog = WatchDog > opcUaParams.WatchDog.MaxVal ? 0 : WatchDog; + + lgTrace($"WatchDog val: {WatchDog}"); + try + { + WriteValue commWriteVal = new WriteValue(); + commWriteVal.NodeId = new NodeId(opcUaParams.WatchDog.MemConfWrite); + commWriteVal.AttributeId = Attributes.Value; + commWriteVal.Value = new DataValue(); + commWriteVal.Value.Value = WatchDog; + + List nodes2Write = new List(); + nodes2Write.Add(commWriteVal); + + UA_ref.WriteNodes(nodes2Write); + } + catch (Exception exc) + { + lgError($"Eccezione in gestione WatchDog, valore attuale {WatchDog}{Environment.NewLine}{exc}"); + } + } + } + else + { + lgTrace("WatchDog disabilitato"); + } + + // controllo se sono poweroff e se non ho dati buoni da > 2 minuti --> disconnetto + if (!powerOnOk && adesso.Subtract(lastCurrent).TotalMinutes > 2) + { + tryDisconnect(); + } + + // solo se non ho veto check + int vFactor = 2; + if (vetoCheckStatus < adesso) + { + lgDebug($"Stato variabili checkPing: {testPingMachine}"); + // imposto veto per vetoSeconds... + vetoCheckStatus = adesso.AddSeconds(vetoSeconds * vFactor); + } + + // log opzionale! + if (verboseLog) + { + lgDebug($"Trasformazione checkPing: {checkPing} | hasPowerOn: {hasPowerOn} | B_input: {B_input} | currRun = {currRun}"); + } + } + + /// + /// Effettua vera scrittura parametri + /// + /// + protected override void plcWriteParams(ref List updatedPar) + { + dataConf currMem = null; + int byteSize = 0; + string memAddrWrite = ""; + string serObj = ""; + if (updatedPar != null) + { + List nodes2Write = new List(); + // controllo i parametri... ne gestisco 4... + foreach (var item in updatedPar) + { + try + { + memAddrWrite = ""; + int valInt = 0; + double valReal = 0; + // cerco in area memMapWrite... + if (memMap.mMapWrite.ContainsKey(item.uid)) + { + // recupero! + currMem = memMap.mMapWrite[item.uid]; + byteSize = currMem.size; + memAddrWrite = currMem.memAddr; + + WriteValue commWriteVal = new WriteValue(); + commWriteVal.NodeId = new NodeId(currMem.memAddr); + commWriteVal.AttributeId = Attributes.Value; + commWriteVal.Value = new DataValue(); + commWriteVal.Value.Value = item.reqValue; + + // faccio preliminarmente upsertKey... + upsertKey(currMem.name, currMem.value); + serObj = JsonConvert.SerializeObject(item); + lgInfo($"Inizio processing plcWriteParams per {currMem.name} | valore richiesto {currMem.value}"); + lgInfo($"---------------{Environment.NewLine}UPDATED PARAM:{Environment.NewLine}{serObj}{Environment.NewLine}---------------"); + serObj = JsonConvert.SerializeObject(currMem); + lgInfo($"---------------{Environment.NewLine}MEMORY CONTENT:{Environment.NewLine}{serObj}{Environment.NewLine}---------------"); + + switch (currMem.tipoMem) + { + case plcDataType.Boolean: + break; + + case plcDataType.Int: + case plcDataType.DInt: + case plcDataType.Word: + case plcDataType.DWord: + int.TryParse(item.reqValue, out valInt); + commWriteVal.Value.Value = valInt; + break; + + case plcDataType.Real: + double.TryParse(item.reqValue, out valReal); + commWriteVal.Value.Value = valReal; + break; + + case plcDataType.String: + commWriteVal.Value.Value = item.reqValue; + break; + + default: + break; + } + lgInfo($"---------------{Environment.NewLine}OPC-UA data:{Environment.NewLine}NodeId: {commWriteVal.NodeId}{Environment.NewLine}Value: {commWriteVal.Value.Value}{Environment.NewLine}---------------"); + + if (!string.IsNullOrEmpty(memAddrWrite)) + { + nodes2Write.Add(commWriteVal); + } + else + { + lgInfo($"Errore: memAddrWrite vuoto!"); + } + } + else + { + lgInfo($"Errore uid non trovato in area write memory: {item.uid}, ci sono {memMap.mMapWrite.Count} in area write"); + } + } + catch (Exception exc) + { + lgError($"Eccezione in fase di plcWriteParams per item {item.uid} con valore {item.value}{Environment.NewLine}{exc}"); + } + } + + if (nodes2Write.Count > 0) + { + lgInfo($"Richiesta scrittura {nodes2Write.Count} parametri"); + UA_ref.WriteNodes(nodes2Write); + } + } + } + + #endregion Protected Methods + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/IobOpcUaMBH.cs b/IOB-WIN-NEXT/IobOpcUaMBH.cs index 08acf7ff..7031f4c2 100644 --- a/IOB-WIN-NEXT/IobOpcUaMBH.cs +++ b/IOB-WIN-NEXT/IobOpcUaMBH.cs @@ -25,6 +25,16 @@ namespace IOB_WIN_NEXT { CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE"); } + // gestione restart OpcUa client... + if (!string.IsNullOrEmpty(getOptPar("ENABLE_CLI_RESTART"))) + { + bool.TryParse(getOptPar("ENABLE_CLI_RESTART"), out enableCliRestart); + } + // init lastCurrentMaxElapsed + if (!string.IsNullOrEmpty(getOptPar("MAX_ELAPSED_TIME_SEC"))) + { + int.TryParse(getOptPar("MAX_ELAPSED_TIME_SEC"), out lastCurrentMaxElapsed); + } sendKeyRichiesta = true; } @@ -245,9 +255,12 @@ namespace IOB_WIN_NEXT lgTrace("WatchDog disabilitato"); } - // controllo se sono poweroff e se non ho dati buoni da > 2 minuti --> disconnetto - if (!powerOnOk && adesso.Subtract(lastCurrent).TotalMinutes > 2) + //// controllo se sono poweroff e se non ho dati buoni da > 2 minuti --> disconnetto + //if (!powerOnOk && adesso.Subtract(lastCurrent).TotalMinutes > 2) + // controllo se non ho dati buoni da > lastCurrentMaxElapsed sec --> disconnetto + if (adesso.Subtract(lastCurrent).TotalSeconds > lastCurrentMaxElapsed) { + lgInfo($"Timeout per mancata comunicazione da oltre {lastCurrentMaxElapsed} sec --> disconnessione adapter OpcUa!"); tryDisconnect(); } diff --git a/IOB-WIN-NEXT/IobOpcUaMBHCimolai.cs b/IOB-WIN-NEXT/IobOpcUaMBHCimolai.cs index 04276a5d..8f41f1db 100644 --- a/IOB-WIN-NEXT/IobOpcUaMBHCimolai.cs +++ b/IOB-WIN-NEXT/IobOpcUaMBHCimolai.cs @@ -26,11 +26,23 @@ namespace IOB_WIN_NEXT if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE"))) { CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE"); + lgInfo($"CHANGE_ODL_MODE: {CHANGE_ODL_MODE}"); } if (!string.IsNullOrEmpty(getOptPar("VETO_SEND_SNAPSHOT"))) { string strVETO_SEND_SNAPSHOT = getOptPar("VETO_SEND_SNAPSHOT"); int.TryParse(strVETO_SEND_SNAPSHOT, out VETO_SEND_SNAPSHOT); + lgInfo($"VETO_SEND_SNAPSHOT: {VETO_SEND_SNAPSHOT}"); + } + // gestione restart OpcUa client... + if (!string.IsNullOrEmpty(getOptPar("ENABLE_CLI_RESTART"))) + { + bool.TryParse(getOptPar("ENABLE_CLI_RESTART"), out enableCliRestart); + } + // init lastCurrentMaxElapsed + if (!string.IsNullOrEmpty(getOptPar("MAX_ELAPSED_TIME_SEC"))) + { + int.TryParse(getOptPar("MAX_ELAPSED_TIME_SEC"), out lastCurrentMaxElapsed); } sendKeyRichiesta = true; @@ -39,12 +51,14 @@ namespace IOB_WIN_NEXT if (!string.IsNullOrEmpty(getOptPar("AUTO_CHANGE_ODL"))) { bool.TryParse(getOptPar("AUTO_CHANGE_ODL"), out doProcOdl); + lgInfo($"AUTO_CHANGE_ODL: {doProcOdl}"); } - + // controllo se disabilitare check exe mode if (!string.IsNullOrEmpty(getOptPar("EXEMODE_CHECK_BYPASS"))) { bool.TryParse(getOptPar("EXEMODE_CHECK_BYPASS"), out EXEMODE_CHECK_BYPASS); + lgInfo($"EXEMODE_CHECK_BYPASS: {EXEMODE_CHECK_BYPASS}"); } } @@ -179,7 +193,7 @@ namespace IOB_WIN_NEXT protected int lastAct = 0; - protected int lastExeMode = 0; + protected bool lastIsInCorso = false; protected int VETO_SEND_SNAPSHOT = 10; @@ -207,25 +221,30 @@ namespace IOB_WIN_NEXT #region Protected Properties /// - /// Attività corrente (INT) da keyExeMode valore di PLC/DB231/InCorso + /// Lavorazione in CORSO = da keyExeMode valore di PLC/DB231/InCorso /// - protected int currExeMode + protected bool isInCorso { get { - int answ = 0; + bool answ = false; if (!string.IsNullOrEmpty(opcUaParams.keyExeMode)) { string currExe = getDataItemValue(opcUaParams.keyExeMode); if (!string.IsNullOrEmpty(currExe)) { - int.TryParse(currExe, out answ); + bool.TryParse(currExe, out answ); } } return answ; } } + /// + /// Ultimo rum mode rilevato x decidere SE inviare variazione... + /// + protected int lastRunMode = -999; + /// /// Attività corrente (INT) da keyRunMode valore di PLC/DB231/Attivita /// @@ -385,12 +404,13 @@ namespace IOB_WIN_NEXT // Gestione ODL automatica: se abilitata --> qui con start/stop da impianto... if (doProcOdl) { + lgTrace($"inizio process verifica presa in carico PODL | isInCorso: {isInCorso} | lastIsInCorso: {lastIsInCorso} | currProgName {currProgName}"); // se rilevo variazione exe (curr/last) // --> registro richiesta attreazzaggio PODL da info commessa - if (lastExeMode != currExeMode) + if (lastIsInCorso != isInCorso) { - // se 0--> 1 --> registro - if (currExeMode == 1) + // se 0 --> 1 --> registro + if (isInCorso) { lgInfo("--------------------------------------------"); // prendo senza stringa PODL @@ -407,11 +427,11 @@ namespace IOB_WIN_NEXT lgInfo("--------------------------------------------"); lgInfo("Inizio tryCloseODL"); // registro chiusura ODL.. - tryCloseODL(); + tryCloseCurrODL(); lgInfo("--------------------------------------------"); } // registro exe mode - lastExeMode = currExeMode; + lastIsInCorso = isInCorso; } } @@ -428,7 +448,7 @@ namespace IOB_WIN_NEXT { B_input += (1 << 3); } - if (isWorkingCimolai || isWorking || currExeMode == 1) + if (isWorkingCimolai || isWorking || isInCorso) { // RUN = LAVORA! B_input += (1 << 1); @@ -443,9 +463,10 @@ namespace IOB_WIN_NEXT } } - // controllo se sono poweroff e se non ho dati buoni da > 2 minuti --> disconnetto - if (!powerOnOk && adesso.Subtract(lastCurrent).TotalMinutes > 2) + // controllo se non ho dati buoni da > lastCurrentMaxElapsed sec --> disconnetto + if (adesso.Subtract(lastCurrent).TotalSeconds > lastCurrentMaxElapsed) { + lgInfo($"Timeout per mancata comunicazione da oltre {lastCurrentMaxElapsed} sec --> disconnessione adapter OpcUa!"); tryDisconnect(); } @@ -527,7 +548,7 @@ namespace IOB_WIN_NEXT } catch (Exception exc) { - lg.Error($"Errore: chiamata elenco DOSSIER ha restituito errore{Environment.NewLine}{exc}"); + lg.Error($"Errore: chiamata elenco PODL ha restituito errore{Environment.NewLine}{exc}"); } } else @@ -631,39 +652,44 @@ namespace IOB_WIN_NEXT vetoSnapshot = DateTime.Now; } - // invio del valore RU MODE come FLog + // invio del valore RUN MODE come FLog, SE variato... if (!string.IsNullOrEmpty(currRun)) { - // se ho valore --> invio - string sVal = ""; - string descr = $"RunModeVal"; - DateTime locTStamp = DateTime.Now; - sVal = $"Change 04: {locTStamp.ToString()} | descr: {descr} | Id: {opcUaParams.keyExeMode} | Val: {currRun}"; + if (currReadErrors != lastRunMode) + { + // aggiorno last... + lastRunMode = currRunMode; + // se ho valore --> invio + string sVal = ""; + string descr = $"RunModeVal"; + DateTime locTStamp = DateTime.Now; + sVal = $"Change 04: {locTStamp.ToString()} | descr: {descr} | Id: {opcUaParams.keyExeMode} | Val: {currRun}"; - // cerco se sia un dato/valore in veto - bool hasVetoLK = false; - bool hasVetoLKV = false; - hasVetoLK = opcUaParams.fluxLogKeyValVeto.ContainsKey(descr); - if (hasVetoLK) - { - // se c'è controllo il valore... - var valList = opcUaParams.fluxLogKeyValVeto[descr]; - hasVetoLKV = valList.Contains(currRun); - } - if (hasVetoLKV) - { - lgTrace($"NON ACCODATO sample: veto trovato per {descr}/{currRun} in fluxLogKeyValVeto ", false); - } - else - { - accodaFLog(sVal, qEncodeFLog(descr, currRun)); - - // se richiesto provo a tradurre - if (opcUaParams.runModeTrad) + // cerco se sia un dato/valore in veto + bool hasVetoLK = false; + bool hasVetoLKV = false; + hasVetoLK = opcUaParams.fluxLogKeyValVeto.ContainsKey(descr); + if (hasVetoLK) { - string RunModeDescr = itemTranslation("RunMode", currRun); - descr = $"RunMode"; - accodaFLog(sVal, qEncodeFLog(descr, RunModeDescr)); + // se c'è controllo il valore... + var valList = opcUaParams.fluxLogKeyValVeto[descr]; + hasVetoLKV = valList.Contains(currRun); + } + if (hasVetoLKV) + { + lgTrace($"NON ACCODATO sample: veto trovato per {descr}/{currRun} in fluxLogKeyValVeto ", false); + } + else + { + accodaFLog(sVal, qEncodeFLog(descr, currRun)); + + // se richiesto provo a tradurre + if (opcUaParams.runModeTrad) + { + string RunModeDescr = itemTranslation("RunMode", currRun); + descr = $"RunMode"; + accodaFLog(sVal, qEncodeFLog(descr, RunModeDescr)); + } } } } @@ -673,7 +699,7 @@ namespace IOB_WIN_NEXT DateTime adesso = DateTime.Now; bool canChange = adesso.Subtract(currTravelStateStart).TotalSeconds > opcUaParams.minSecStatusDuration; // gestione dei macro-stati del travel... SOLO se in esecuzione da travel... BYPASS x ora!!! - if (currExeMode > 0 || EXEMODE_CHECK_BYPASS) + if (isInCorso || EXEMODE_CHECK_BYPASS) { double pesoTot = 0; // può cambiare stato se per ALMENO minSecStatus è rimasto nello status corrente... @@ -711,7 +737,7 @@ namespace IOB_WIN_NEXT pesoTot += getDataItemValueDouble("PLC/DB231/peso4"); } - lgTrace($"TState: Test 03 | pesoTot: {pesoTot}"); + lgTrace($"TState: Test 03 | pesoTot: {pesoTot}"); // STEP 2: verifico se sia iniziato caricamento... if (currTravelState == travelState.StartOdl) @@ -788,7 +814,7 @@ namespace IOB_WIN_NEXT else { // chiama richiesta chiusura x utente - tryAskCloseODL(); + tryAskCloseCurrODL(); // resetta contatore x nuova richeista finale eventuale... currTravelStateStart = adesso; } diff --git a/IOB-WIN-NEXT/IobOpcUaOmronIcoel.cs b/IOB-WIN-NEXT/IobOpcUaOmronIcoel.cs index 2dec916e..4bc4547f 100644 --- a/IOB-WIN-NEXT/IobOpcUaOmronIcoel.cs +++ b/IOB-WIN-NEXT/IobOpcUaOmronIcoel.cs @@ -507,7 +507,7 @@ namespace IOB_WIN_NEXT string descr = ""; descr = itemTranslation("OPC", MonIt.DisplayName); sVal = $"Change: {locTStamp.ToString()} | descr: {descr} | Id: {MonIt.StartNodeId} | Val: {NotifyValue}"; - lgInfo($"TSP | {sVal}"); + lgDebug($"TSP | {sVal}"); changed = checkSaveValue(MonIt, NotifyValue, false); // cerco se non sia un dato filtrato in FLUXLOG... diff --git a/IOB-WIN-NEXT/IobSiemensLasco.cs b/IOB-WIN-NEXT/IobSiemensLasco.cs index 127fe8c3..d186259b 100644 --- a/IOB-WIN-NEXT/IobSiemensLasco.cs +++ b/IOB-WIN-NEXT/IobSiemensLasco.cs @@ -244,6 +244,7 @@ namespace IOB_WIN_NEXT case taskType.startSetup: // salvo che SONO IN SETUP! inSetup = true; + lgInfo("!!! Richiesta startSetup - BLOCCO contapezzi LASCO !!!"); // forzo reset contapezzi forcePzReset = true; forcePzResetUntil = DateTime.Now.AddSeconds(3); @@ -252,6 +253,7 @@ namespace IOB_WIN_NEXT case taskType.stopSetup: // salvo che SONO FUORI DAL SETUP! inSetup = false; + lgInfo("!!! Richiesta stopSetup - SBLOCCO contapezzi LASCO!!!"); // forzo reset contapezzi forcePzReset = true; forcePzResetUntil = DateTime.Now.AddSeconds(3); @@ -499,8 +501,9 @@ namespace IOB_WIN_NEXT public override void processWhatchDog() { - // scrive nel primo byte, ultimo bit, il watchdog, mentre scrive nel primo 1 = setup, 0 - // = run scrivo 1 volta al secondo il contatore incrementale su area apposita + // scrivo 1 volta al secondo il contatore incrementale su area apposita + // scrive nel primo byte, ultimo bit, il watchdog, + // mentre scrive nel primo 1 = setup, 0 = run DateTime adesso = DateTime.Now; if (adesso.Subtract(lastPLCWatchDog).TotalSeconds > watchDogPeriod) { diff --git a/IOB-WIN-NEXT/IobSimula.cs b/IOB-WIN-NEXT/IobSimula.cs index 31575816..c3544c2b 100644 --- a/IOB-WIN-NEXT/IobSimula.cs +++ b/IOB-WIN-NEXT/IobSimula.cs @@ -3,10 +3,10 @@ using MapoSDK; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using static IOB_UT_NEXT.CustomObj; -using static MapoSDK.WharehouseData; namespace IOB_WIN_NEXT { @@ -26,122 +26,6 @@ namespace IOB_WIN_NEXT #endregion Public Fields - #region Protected Fields - - /// - /// Parametri simulazione oscillazione bit 2 - /// - protected simPar bit2; - - /// - /// Parametri simulazione oscillazione bit 3 - /// - protected simPar bit3; - - /// - /// Parametri simulazione oscillazione bit 4 - /// - protected simPar bit4; - - /// - /// Parametri simulazione oscillazione bit 5 - /// - protected simPar bit5; - - /// - /// Parametri simulazione oscillazione bit 6 - /// - protected simPar bit6; - - /// - /// Parametri simulazione oscillazione bit 7 - /// - protected simPar bit7; - - /// - /// pallet corrente - /// - protected int cP = 1; - - protected bool disableSimStatus = false; - - /// - /// ultimo controllo decremento eventi - /// - protected DateTime lastEvCheck; - - /// - /// Ultimo istante in cui sono stati ridotti dati simulazione duration - /// - protected DateTime lastRedDuration; - - /// - /// Ultimo istante in cui sono stati generati dati di simulazione - /// - protected DateTime lastSimData; - - /// - /// Matricola OPR simulato - /// - protected int matrOpr = 1; - - /// - /// Durata minima ODL x reset quando pezzi iob > pezzi macchina... - /// - protected int minDurataODL = 480; - - /// - /// pallet successivo (next) - /// - protected int nP = 1; - - /// - /// periodo base del simulatore (in millisecondi) - /// - protected int periodoMSec = 1000; - - /// - /// variabile di appoggio x stato segnale contapezzo - /// - protected bool sigPzCount = false; - - /// - /// Simulazione registrazione dichiarazioni utente - /// - protected simPar simDich; - - /// - /// BOOL: indica se simulare powerOn/Off (bit 0 e 1) compresi WarmUp e CoolDown - /// - protected bool simPowerOnOff; - - /// - /// Simulazione effettuazione controlli utente - /// - protected simPar simRC; - - /// - /// Simulazione registro scarti utente - /// - protected simPar simRS; - - /// - /// Tempo di MINIMO attesa x simulazione parametri - /// - protected int waitSimPar = utils.CRI("waitSimPar"); - - #endregion Protected Fields - - #region Private Fields - - private List alarmMessages = new List(); - - private int currSimAlarmCode = 0; - - private Random rnd = new Random(); - - #endregion Private Fields - #region Public Constructors /// @@ -197,6 +81,7 @@ namespace IOB_WIN_NEXT simDich = setupSimPar("SIM_DICH"); int.TryParse(getOptPar("SIM_MATR_OPR"), out matrOpr); } + // riesegue setup PLC setParamPlc(); // ricarico da server i dati dei pezzi fatti... lgInfo("Init contapezzi SIMULA: pzCntReload(true)"); @@ -211,17 +96,47 @@ namespace IOB_WIN_NEXT // parto processando dynData processDynData(); - // test gestione fileImport... - if (!string.IsNullOrEmpty(fileImportFolder)) - { - processFileImport(); - } if (!string.IsNullOrEmpty(getOptPar("FTP_AT_START"))) { // simulazione processo FTP (Cimolai) - FIXME TODO DeleteME processDataSync(); } + // test ricetta + if (hasRecipe) + { + Calendar cal = new CultureInfo("it-IT").Calendar; + int week = cal.GetWeekOfYear(adesso, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + string tempPath = Path.Combine(pathList["path-locBase"], pathList["path-01-Temp"]); + string archPath = Path.Combine(pathList["path-locBase"], pathList["path-02-Sent"], $"{adesso:yyyy}", $"{week:00}"); + string remoPath = Path.Combine(pathList["path-locBase"], pathList["path-04-remReq"]); + baseUtils.checkDir(tempPath); + baseUtils.checkDir(archPath); + try + { + // recupero elenco PODL da processare, check PODL già inviati, save locale + bool create = RecipeReqWriteLocal(tempPath, useLocalRecipe); + // invio ricette a impianto + bool trasmitted = RecipeSend(tempPath, archPath, remoPath); + } + catch (Exception exc) + { + lgError($"Eccezione in TEST processDataSync{Environment.NewLine}{exc}"); + } + } + + // test gestione fileImport... + if (!string.IsNullOrEmpty(fileImportFolder)) + { + processFileImport(); + } + if (hasRecipe) + { + // effettua process ritorno ricette + processRecipeFileRet(); + // eseguo verifica/lancio ricette + RecipeDoProcCons(); + } } #endregion Public Constructors @@ -524,144 +439,113 @@ namespace IOB_WIN_NEXT #endregion Public Methods - #region Protected Methods + #region Protected Fields /// - /// Procedura di import file... formato excel Giacovelli + /// Parametri simulazione oscillazione bit 2 /// - /// - protected override bool importFile(string fileItem) - { - bool fatto = false; - int numErr = 0; - // test procedura di import files excel x Giacovelli... - var currExcel = new ExcelMan(fileItem); - // creo lista dati in formato RegGiacenze... - Dictionary listaGiac = new Dictionary(); - var dtSet = currExcel.getDataSet(); - if (dtSet != null && dtSet.Tables != null && dtSet.Tables.Count > 0) - { - string nomeFile = Path.GetFileName(fileItem); - nomeFile = nomeFile.Substring(0, nomeFile.LastIndexOf(".")); - var elSheet = dtSet.Tables; - int idxTab = 0; - //cerco lo sheet corretto se > 1 - if (dtSet.Tables.Count > 1) - { - for (int i = 0; i < dtSet.Tables.Count; i++) - { - if (nomeFile.Contains(dtSet.Tables[i].TableName)) - { - idxTab = i; - } - } - } - var tabella = dtSet.Tables[idxTab]; - int numRighe = tabella.Rows.Count; - int idxODL = 0; - DateTime dataDoc = DateTime.Today; - DateTime.TryParse(nomeFile, out dataDoc); - // cerco lotto x giornata... - string sIdxODL = utils.callUrl(urlGetOdlAtDate(dataDoc)); - int.TryParse(sIdxODL, out idxODL); - for (int i = 0; i < numRighe; i++) - { - if (numErr < 5) - { - try - { - // variabili di appoggio... - DateTime dtRif = DateTime.Today; - double qtyTot = 0; - int numPack = 0; - string ddt = tabella.Rows[i].ItemArray[FileDecod["ExtDoc"]].ToString().Trim(); - string sDate = tabella.Rows[i].ItemArray[FileDecod["DateRif"]].ToString().Trim(); - string prod = tabella.Rows[i].ItemArray[FileDecod["Product"]].ToString().Trim(); - // verifiche x import: header, data e DDT (vuoti o "-") --> SKIP! - bool checkHeaderKo = (ddt == "DDT" || prod == "PRODOTTO"); - bool checkEmptyDdt = (string.IsNullOrEmpty(ddt) || ddt == "-"); - bool checkEmptyDate = (string.IsNullOrEmpty(sDate) || sDate == "-"); - if (checkHeaderKo) - { - lgTrace($"SKIP header"); - } - else if (checkEmptyDdt || checkEmptyDate) - { - lgTrace($"SKIP linea vuota | i: {i} | ddt: {ddt} | date: {sDate} | prod: {prod}"); - } - else - { - string variety = tabella.Rows[i].ItemArray[FileDecod["Variety"]].ToString().Trim(); - string suppl = tabella.Rows[i].ItemArray[FileDecod["Supplier"]].ToString().Trim(); - string sQty = tabella.Rows[i].ItemArray[FileDecod["QtyTot"]].ToString().Trim(); - string sNum = tabella.Rows[i].ItemArray[FileDecod["NumPack"]].ToString().Trim(); - string numPed = tabella.Rows[i].ItemArray[FileDecod["NumPed"]].ToString().Trim(); - string packPed = tabella.Rows[i].ItemArray[FileDecod["PackPed"]].ToString().Trim(); - string pesoPack = tabella.Rows[i].ItemArray[FileDecod["PesoPack"]].ToString().Trim(); - DateTime.TryParse(sDate, out dtRif); - int.TryParse(sNum, out numPack); - double.TryParse(sQty, out qtyTot); - string identRG = ddt.Length > 2 ? $"{strFixId(ddt)}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}" : $"{dtRif:yyyyMMdd}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}"; - string notes = $"{numPed}x{packPed}x{pesoPack}"; - // verifico di avere dati per proseguire... - bool checkIdent = !string.IsNullOrEmpty($"{prod}{variety}{suppl}"); - if (checkIdent) - { - BatchRec newRow = new BatchRec() - { - IdxODL = idxODL, - IdentRG = identRG, - DateRif = dtRif, - ExtDoc = ddt, - Product = prod, - Variety = variety, - Supplier = suppl, - NumPack = numPack, - QtyTot = qtyTot, - Notes = notes - }; - // verifico: se manca aggiungo - if (!listaGiac.ContainsKey(identRG)) - { - listaGiac.Add(identRG, newRow); - } - else - { - // altrimenti aggiorno giacenza con valori numerici - listaGiac[identRG].NumPack += newRow.NumPack; - listaGiac[identRG].QtyTot += newRow.QtyTot; - } - } - else - { - lgError($"Errore verifica identità riga | prod: {prod} | variety: {variety} | suppl: {suppl}"); - numErr++; - } - } - } - catch (Exception exc) - { - numErr++; - } - } - } - } - if (listaGiac.Count > 0) - { - // converto in una nuova lista... - int rCounter = 1; - Dictionary list2Send = new Dictionary(); - foreach (var item in listaGiac) - { - list2Send.Add(rCounter, item.Value); - rCounter++; - } - // ora invio i file con json... - accodaRawData(rawTransfType.RegGiacenze, list2Send); - fatto = true; - } - return fatto; - } + protected simPar bit2; + + /// + /// Parametri simulazione oscillazione bit 3 + /// + protected simPar bit3; + + /// + /// Parametri simulazione oscillazione bit 4 + /// + protected simPar bit4; + + /// + /// Parametri simulazione oscillazione bit 5 + /// + protected simPar bit5; + + /// + /// Parametri simulazione oscillazione bit 6 + /// + protected simPar bit6; + + /// + /// Parametri simulazione oscillazione bit 7 + /// + protected simPar bit7; + + /// + /// pallet corrente + /// + protected int cP = 1; + + protected bool disableSimStatus = false; + + /// + /// ultimo controllo decremento eventi + /// + protected DateTime lastEvCheck; + + /// + /// Ultimo istante in cui sono stati ridotti dati simulazione duration + /// + protected DateTime lastRedDuration; + + /// + /// Ultimo istante in cui sono stati generati dati di simulazione + /// + protected DateTime lastSimData; + + /// + /// Matricola OPR simulato + /// + protected int matrOpr = 1; + + /// + /// Durata minima ODL x reset quando pezzi iob > pezzi macchina... + /// + protected int minDurataODL = 480; + + /// + /// pallet successivo (next) + /// + protected int nP = 1; + + /// + /// periodo base del simulatore (in millisecondi) + /// + protected int periodoMSec = 1000; + + /// + /// variabile di appoggio x stato segnale contapezzo + /// + protected bool sigPzCount = false; + + /// + /// Simulazione registrazione dichiarazioni utente + /// + protected simPar simDich; + + /// + /// BOOL: indica se simulare powerOn/Off (bit 0 e 1) compresi WarmUp e CoolDown + /// + protected bool simPowerOnOff; + + /// + /// Simulazione effettuazione controlli utente + /// + protected simPar simRC; + + /// + /// Simulazione registro scarti utente + /// + protected simPar simRS; + + /// + /// Tempo di MINIMO attesa x simulazione parametri + /// + protected int waitSimPar = utils.CRI("waitSimPar"); + + #endregion Protected Fields + + #region Protected Methods /// /// Recupera da server set di dati specifici x IOB : qui per compilare files CSV @@ -845,11 +729,14 @@ namespace IOB_WIN_NEXT var taskGet = iobGetDataFromServer(); var taskWrite = iobWriteLocalCSV(); var taskSend = iobSendFTP(""); - // richiesta check autoODL processAutoOdl(); + // richiesta generazione quotidiana dossiers + processAutoDossier(); // effettua gestione import file... processFileImport(); + // effettua process ritorno ricette + processRecipeFileRet(); } catch (Exception exc) { @@ -900,6 +787,155 @@ namespace IOB_WIN_NEXT #endregion Protected Methods + #region Private Fields + + private List alarmMessages = new List(); + + private int currSimAlarmCode = 0; + + private Random rnd = new Random(); + + #endregion Private Fields + +#if false + /// + /// Procedura di import file... formato excel Giacovelli + /// + /// + protected override bool importFile(string fileItem) + { + bool fatto = false; + int numErr = 0; + // test procedura di import files excel x Giacovelli... + var currExcel = new ExcelMan(fileItem); + // creo lista dati in formato RegGiacenze... + Dictionary listaGiac = new Dictionary(); + var dtSet = currExcel.getDataSet(); + if (dtSet != null && dtSet.Tables != null && dtSet.Tables.Count > 0) + { + string nomeFile = Path.GetFileName(fileItem); + nomeFile = nomeFile.Substring(0, nomeFile.LastIndexOf(".")); + var elSheet = dtSet.Tables; + int idxTab = 0; + //cerco lo sheet corretto se > 1 + if (dtSet.Tables.Count > 1) + { + for (int i = 0; i < dtSet.Tables.Count; i++) + { + if (nomeFile.Contains(dtSet.Tables[i].TableName)) + { + idxTab = i; + } + } + } + var tabella = dtSet.Tables[idxTab]; + int numRighe = tabella.Rows.Count; + int idxODL = 0; + DateTime dataDoc = DateTime.Today; + DateTime.TryParse(nomeFile, out dataDoc); + // cerco lotto x giornata... + string sIdxODL = utils.callUrl(urlGetOdlAtDate(dataDoc)); + int.TryParse(sIdxODL, out idxODL); + for (int i = 0; i < numRighe; i++) + { + if (numErr < 5) + { + try + { + // variabili di appoggio... + DateTime dtRif = DateTime.Today; + double qtyTot = 0; + int numPack = 0; + string ddt = tabella.Rows[i].ItemArray[FileDecod["ExtDoc"]].ToString().Trim(); + string sDate = tabella.Rows[i].ItemArray[FileDecod["DateRif"]].ToString().Trim(); + string prod = tabella.Rows[i].ItemArray[FileDecod["Product"]].ToString().Trim(); + // verifiche x import: header, data e DDT (vuoti o "-") --> SKIP! + bool checkHeaderKo = (ddt == "DDT" || prod == "PRODOTTO"); + bool checkEmptyDdt = (string.IsNullOrEmpty(ddt) || ddt == "-"); + bool checkEmptyDate = (string.IsNullOrEmpty(sDate) || sDate == "-"); + if (checkHeaderKo) + { + lgTrace($"SKIP header"); + } + else if (checkEmptyDdt || checkEmptyDate) + { + lgTrace($"SKIP linea vuota | i: {i} | ddt: {ddt} | date: {sDate} | prod: {prod}"); + } + else + { + string variety = tabella.Rows[i].ItemArray[FileDecod["Variety"]].ToString().Trim(); + string suppl = tabella.Rows[i].ItemArray[FileDecod["Supplier"]].ToString().Trim(); + string sQty = tabella.Rows[i].ItemArray[FileDecod["QtyTot"]].ToString().Trim(); + string sNum = tabella.Rows[i].ItemArray[FileDecod["NumPack"]].ToString().Trim(); + string numPed = tabella.Rows[i].ItemArray[FileDecod["NumPed"]].ToString().Trim(); + string packPed = tabella.Rows[i].ItemArray[FileDecod["PackPed"]].ToString().Trim(); + string pesoPack = tabella.Rows[i].ItemArray[FileDecod["PesoPack"]].ToString().Trim(); + DateTime.TryParse(sDate, out dtRif); + int.TryParse(sNum, out numPack); + double.TryParse(sQty, out qtyTot); + string identRG = ddt.Length > 2 ? $"{strFixId(ddt)}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}" : $"{dtRif:yyyyMMdd}.{strFixId(prod)}.{strFixId(variety)}.{strFixId(suppl)}"; + string notes = $"{numPed}x{packPed}x{pesoPack}"; + // verifico di avere dati per proseguire... + bool checkIdent = !string.IsNullOrEmpty($"{prod}{variety}{suppl}"); + if (checkIdent) + { + BatchRec newRow = new BatchRec() + { + IdxODL = idxODL, + IdentRG = identRG, + DateRif = dtRif, + ExtDoc = ddt, + Product = prod, + Variety = variety, + Supplier = suppl, + NumPack = numPack, + QtyTot = qtyTot, + Notes = notes + }; + // verifico: se manca aggiungo + if (!listaGiac.ContainsKey(identRG)) + { + listaGiac.Add(identRG, newRow); + } + else + { + // altrimenti aggiorno giacenza con valori numerici + listaGiac[identRG].NumPack += newRow.NumPack; + listaGiac[identRG].QtyTot += newRow.QtyTot; + } + } + else + { + lgError($"Errore verifica identità riga | prod: {prod} | variety: {variety} | suppl: {suppl}"); + numErr++; + } + } + } + catch (Exception exc) + { + numErr++; + } + } + } + } + if (listaGiac.Count > 0) + { + // converto in una nuova lista... + int rCounter = 1; + Dictionary list2Send = new Dictionary(); + foreach (var item in listaGiac) + { + list2Send.Add(rCounter, item.Value); + rCounter++; + } + // ora invio i file con json... + accodaRawData(rawTransfType.RegGiacenze, list2Send); + fatto = true; + } + return fatto; + } +#endif + #region Private Methods /// diff --git a/IOB-WIN-NEXT/IobSqlServLantek.cs b/IOB-WIN-NEXT/IobSqlServLantek.cs new file mode 100644 index 00000000..de60e250 --- /dev/null +++ b/IOB-WIN-NEXT/IobSqlServLantek.cs @@ -0,0 +1,640 @@ +using EgwProxy.SqlDb.Controllers; +using EgwProxy.SqlDb.DbModels; +using IOB_UT_NEXT; +using MapoSDK; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.NetworkInformation; +using static IOB_UT_NEXT.CustomObj; + +namespace IOB_WIN_NEXT +{ + /// + /// Adapter specializzato per LANTEK e le chiamate tramite DB per i dati + /// - PODL (ordini MES --> MACCHINA) + /// - ProdLog (da FasiDaLantek) + /// + + public class IobSqlServLantek : IobGeneric + { + #region Public Constructors + + /// + /// Costruttore dell'IOB DB LANTEK + /// + /// AdapterForm chiamante + /// Configurazione IOB per avvio + public IobSqlServLantek(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) + { + string SyncStateServ = getOptPar("SyncStateServer"); + string SyncStateDb = getOptPar("SyncStateDb"); + string SyncStateUser = getOptPar("SyncStateUser"); + string SyncStatePwd = getOptPar("SyncStatePwd"); + string SyncStateCTout = getOptPar("SyncStateCTout"); + string VetoReadSec = getOptPar("VetoReadSec"); + string VetoSyncSec = getOptPar("VetoSyncSec"); + + string connSyncState = $"data source={SyncStateServ};initial catalog={SyncStateDb};persist security info=True;user id={SyncStateUser};password={SyncStatePwd};MultipleActiveResultSets=True;App=IOB-WIN-NEXT"; + + // gestione command timeout da https://erikej.github.io/sqlclient/2020/10/26/sqlclient-commandtimeout-preview.html + if (!string.IsNullOrEmpty(SyncStateCTout)) + { + connSyncState = $"{connSyncState};Command Timeout={SyncStateCTout}"; + } + if (!string.IsNullOrEmpty(VetoReadSec)) + { + int.TryParse(VetoReadSec, out vetoReadDbSec); + } + if (!string.IsNullOrEmpty(VetoSyncSec)) + { + int.TryParse(VetoSyncSec, out VetoSyncDbSec); + } + + // eccezione: NON TROVA EntityFramework 6.0.0 o successivo... why?!? + dbProxy = new DbController(connSyncState); + + lastPING = DateTime.Now.AddHours(-1); + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Implementazione custom esecuzione task specifici + /// + /// + /// + public override Dictionary executeTasks(Dictionary task2exe) + { + DateTime adesso = DateTime.Now; + // unico task ammissibile: fare un SYNC forzato... + Dictionary taskDone = new Dictionary(); + if (task2exe != null) + { + // controllo se memMap != null... + if (memMap != null) + { + bool taskOk = false; + string taskVal = ""; + // cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4 + foreach (var item in task2exe) + { + taskOk = false; + taskVal = ""; + // converto richiesta in enum... + taskType tName = taskType.nihil; + Enum.TryParse(item.Key, out tName); + // controllo sulla KEY... + switch (tName) + { + case taskType.setComm: + case taskType.syncDbData: + lgInfo($"executeTasks --> {tName}"); + // per prima cosa recupero elenco PODL attivi x la macchina + List listaPODL = new List(); + bool okPodl = false; + var rawListPODL = callUrl(urlGetCurrPODL, false); + if (!string.IsNullOrEmpty(rawListPODL)) + { + try + { + listaPODL = JsonConvert.DeserializeObject>(rawListPODL); + okPodl = listaPODL.Count > 0; + } + catch (Exception exc) + { + lg.Error($"Errore: chiamata elenco PODL ha restituito errore{Environment.NewLine}{exc}"); + } + } + else + { + lg.Error($"Errore: chiamata elenco PODL ({urlGetCurrPODL}) ha restituito valore vuoto"); + } + if (okPodl) + { + //mando elenco PODL... + List CurrPodlReq = listaPODL + .Select(x => new MesPODLReqModel() + { + Attivabile = x.Attivabile, + CodArticolo = x.CodArticolo, + CodCli = x.CodCli, + CodGruppo = x.CodGruppo, + DueDate = x.DueDate ?? DateTime.Now, + IdxMacchina = x.IdxMacchina, + IdxODL = x.IdxOdl, + IdxPromessa = x.IdxPromessa, + InsertDate = x.InsertDate, + KeyBCode = x.KeyBCode, + KeyRichiesta = x.KeyRichiesta, + Note = x.Note, + NumPezzi = x.NumPezzi, + Priorita = x.Priorita, + PzPallet = x.PzPallet, + TCAssegnato = x.Tcassegnato + }) + .ToList(); + // scrivo i record richiesti + bool fatto = dbProxy.MesPodlWriteReq(CurrPodlReq); + if (fatto) + { + taskVal = $"EXECUTED task: {item.Key} / {item.Value}"; + // registro evento chiamata scrittura in syncState... + string tabName = item.Key; + var currSyncState = elencoSyncState.FirstOrDefault(x => x.TableName == tabName); + // verifico x registrare azione + if (currSyncState == null) + { + currSyncState = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabName, + Note = "Init" + }; + } + else + { + var lastRec = CurrPodlReq.OrderBy(x => x.IdxPromessa).LastOrDefault(); + currSyncState.LastIdx = lastRec != null ? lastRec.IdxPromessa : -1; + currSyncState.Note = $"Esecuzione {tabName} per {CurrPodlReq.Count} rec | last code: {currSyncState.LastIdx}"; + currSyncState.LastUpdate = adesso; + } + // salvo sync... + dbProxy.SyncStateUpsert(currSyncState); + } + + // effettua sync scrivendo i dati in export (PODL) + execExportAll(); + } + + break; + + default: + taskVal = $"IobSqlServLantek | taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC"; + lgInfo($"IobSqlServLantek | chiamata senza processing: taskOk: {taskOk} | taskVal: {taskVal}"); + break; + } + // aggiungo task! + taskDone.Add(item.Key, taskVal); + } + } + } + lastReadPLC = DateTime.Now; + return taskDone; + } + + /// + /// Recupero dati dinamici... + /// + public override Dictionary getDynData() + { + DateTime adesso = DateTime.Now; + + // dizionario vuoto / faccio direttamente accodamento in FluxLog + Dictionary outVal = new Dictionary(); + + // processo ed accodo! + processFluxLogTable(adesso); + + lastReadPLC = DateTime.Now; + return outVal; + } + + /// + /// Effettua processing CUSTOM: + /// - esegue tutti gli import + /// + public override void processCustomTaskLF() + { + lgInfo($"Richiesto processCustomTaskLF"); + // effettua sync + execExportAll(); + execImportAll(); + lastReadPLC = DateTime.Now; + } + + /// + /// Effettua lettura semafori principale Parametri da + /// aggiornare x display in form + /// + public override void readSemafori(ref newDisplayData currDispData) + { + DateTime adesso = DateTime.Now; + if (connectionOk) + { + // controllo veto checkDB + if (adesso > vetoDataRead) + { + // predispongo prox veto... + vetoDataRead = adesso.AddSeconds(vetoReadDbSec); + if (adesso > vetoDataSync) + { + // effettua sync + execImportAll(); + vetoDataSync = adesso.AddSeconds(VetoSyncDbSec); + } + + // semaforo + currDispData.semIn = Semaforo.SV; + // recupero syncState + elencoSyncState = dbProxy.SyncStateGetAll(); + // verifico SignLog e processo + bool sentSignLog = processSignLogTable(adesso); + // verifico ProdData e processo + bool sentProdData = processProdDataTable(adesso); + } + } + else + { + B_input = 0; + currDispData.semIn = Semaforo.SR; + } + } + + /// + /// Override connessione + /// + public override void tryConnect() + { + if (!connectionOk) + { + // controllo che il ping sia stato tentato almeno pingTestSec fa... + if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec")) + { + if (verboseLog || periodicLog) + { + lgInfo("SqlDb LANTEK: ConnKO - tryConnect"); + } + // in primis salvo data ping... + lastPING = DateTime.Now; + // se passa il ping faccio il resto... + if (testPingMachine == IPStatus.Success) + { + string szStatusConnection = ""; + try + { + // ora provo connessione... + parentForm.commPlcActive = true; + if (dbProxy != null) + { + elencoSyncState = dbProxy.SyncStateDoImportAll(); + + if (elencoSyncState != null && elencoSyncState.Count > 0) + { + parentForm.commPlcActive = false; + connectionOk = true; + } + } + // refresh stato connessione!!! + if (connectionOk) + { + if (adpRunning) + { + lgInfo("Connessione OK"); + lastReadPLC = DateTime.Now; + } + } + else + { + lgError("Impossibile procedere, connessione mancante..."); + } + } + catch (Exception exc) + { + lgFatal($"Errore nella connessione all'adapter SqlDb LANTEK: {szStatusConnection}{Environment.NewLine}{exc}"); + connectionOk = false; + lgInfo($"Eccezione in TryConnect, Adapter SqlDb LANTEK NON running, pausa di {utils.CRI("waitRecMSec")} msec prima di ulteriori tentativi di riconnessione"); + } + } + else + { + // loggo no risposta ping ... + connectionOk = false; + if (verboseLog || periodicLog) + { + lgInfo($"Attenzione: SqlDb LANTEK controllo PING fallito per IP {cIobConf.cncIpAddr}"); + } + } + } + } + else + { + needRefresh = true; + } + } + + public override void tryDisconnect() + { + // registro solo che è disconnesso + connectionOk = false; + } + + #endregion Public Methods + + #region Protected Fields + + protected int vetoReadDbSec = 3; + + protected int VetoSyncDbSec = 20; + + #endregion Protected Fields + + #region Protected Properties + + protected DbController dbProxy { get; set; } = null; + + /// + /// Stato di sync delle tab gestite + /// + protected List elencoSyncState { get; set; } = new List(); + + #endregion Protected Properties + + #region Private Methods + + /// + /// Esegue task EXPORT (MES PODL to MACHINE) + /// + private void execExportAll() + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + elencoSyncState = dbProxy.SyncStateDoExportAll(); + sw.Stop(); + DateTime adesso = DateTime.Now; + lastReadPLC = adesso; + lgInfo($"DB: esecuzione task dbProxy.SyncStateDoExportAll() in {sw.ElapsedMilliseconds} ms"); + + if (elencoSyncState != null) + { + // registro evento chiamata scrittura in syncState... + string tabName = "ExportAll"; + var currSyncState = elencoSyncState.FirstOrDefault(x => x.TableName == tabName); + // verifico x registrare azione + if (currSyncState == null) + { + currSyncState = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabName, + Note = "Init" + }; + } + else + { + // calcolo lastIDX valore da datetime + int valInt = -1; + var nowString = $"{adesso:HHmmss}"; + int.TryParse(nowString, out valInt); + currSyncState.LastIdx = valInt; + currSyncState.Note = $"Esecuzione {tabName} | DT code: {currSyncState.LastIdx}"; + currSyncState.LastUpdate = adesso; + } + // salvo sync... + dbProxy.SyncStateUpsert(currSyncState); + foreach (var item in elencoSyncState) + { + lgTrace($"TAB {item.TableName} | LastIdx {item.LastIdx} | Note {item.Note} | Last Upd {item.LastUpdate}"); + } + } + } + + /// + /// Esegue task IMPORT (MES PODL to MACHINE) + /// + private void execImportAll() + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + elencoSyncState = dbProxy.SyncStateDoImportAll(); + sw.Stop(); + lastReadPLC = DateTime.Now; + lgInfo($"DB: esecuzione task dbProxy.SyncStateDoImportAll() in {sw.ElapsedMilliseconds} ms"); + + if (elencoSyncState != null) + { + foreach (var item in elencoSyncState) + { + lgTrace($"TAB {item.TableName} | LastIdx {item.LastIdx} | Note {item.Note} | Last Upd {item.LastUpdate}"); + } + } + } + + /// + /// Esegue processing + invio dati tab SignLog + /// + /// + /// + private bool processFluxLogTable(DateTime adesso) + { + bool fatto = false; + string tabNameIn = "FluxLog"; + string tabNameOut = "FluxLogToMes"; + // cerco info sui SignLog (ToMes e letti) + var currFluxLogRead = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameIn); + // se nullo inizializzo + if (currFluxLogRead == null) + { + currFluxLogRead = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameIn, + Note = "Init" + }; + } + var currFluxLogSent = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameOut); + // se nullo inizializzo + if (currFluxLogSent == null) + { + currFluxLogSent = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameOut, + Note = "Init" + }; + } + // verifica se ci siano dati da trasmettere (sui valori LastIdx) + if (currFluxLogRead.LastIdx > currFluxLogSent.LastIdx) + { + // recupero i dati dal DB... + var data2send = dbProxy.MachFluxLogGetNew(currFluxLogSent.LastIdx); + // se ho dati preparo invio + if (data2send != null && data2send.Count > 0) + { + string sVal = ""; + foreach (var fLog2send in data2send) + { + sVal = $"[DYNDATA] |{fLog2send.DtEvento:yyyy-MM-dd HH:mm:ss}|{fLog2send.CodFlux}|{fLog2send.Valore}"; + // chiamo accodamento con dataora corretta... + accodaFLog(sVal, qEncodeFLog(fLog2send.DtEvento, fLog2send.CodFlux, fLog2send.Valore)); + } + fatto = true; + } + + // aggiorno idx inviato... + currFluxLogSent.Note = $"Updated from {currFluxLogRead.LastIdx}"; + currFluxLogSent.LastUpdate = adesso; + currFluxLogSent.LastIdx = currFluxLogRead.LastIdx; + } + + // alla fine aggiorno i dati inviati! + dbProxy.SyncStateUpsert(currFluxLogSent); + + return fatto; + } + + /// + /// Esegue processing + invio dati tab ProdData + /// + /// + /// + private bool processProdDataTable(DateTime adesso) + { + bool fatto = false; + string tabNameIn = "ProdData"; + string tabNameOut = "ProdDataToMes"; + // cerco info sui SignLog (ToMes e letti) + var currSignLogRead = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameIn); + // se nullo inizializzo + if (currSignLogRead == null) + { + currSignLogRead = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameIn, + Note = "Init" + }; + } + var currSignLogSent = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameOut); + // se nullo inizializzo + if (currSignLogSent == null) + { + currSignLogSent = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameOut, + Note = "Init" + }; + } + // verifica se ci siano dati da trasmettere (sui valori LastIdx) + if (currSignLogRead.LastIdx > currSignLogSent.LastIdx) + { + // recupero i dati dal DB... + var data2send = dbProxy.MachProdDataGetNew(currSignLogSent.LastIdx); + // se ho dati preparo invio + if (data2send != null && data2send.Count > 0) + { + foreach (var sLog2send in data2send) + { + // se il record è apertura PODL chiamo apertura + + trySetupPODL(0); + + // se il record è chiusura PODL chiamo chiusura... DOPO aver cercato PODL --> ODL + tryClosePODL(0); + } + } + + // aggiorno idx inviato... + currSignLogSent.Note = $"Updated from {currSignLogRead.LastIdx}"; + currSignLogSent.LastUpdate = adesso; + currSignLogSent.LastIdx = currSignLogRead.LastIdx; + fatto = true; + } + + // alla fine aggiorno i dati inviati! + dbProxy.SyncStateUpsert(currSignLogSent); + + return fatto; + } + + /// + /// Esegue processing + invio dati tab SignLog + /// + /// + /// + private bool processSignLogTable(DateTime adesso) + { + bool fatto = false; + string tabNameIn = "SignLog"; + string tabNameOut = "SignLogToMes"; + // cerco info sui SignLog (ToMes e letti) + var currSignLogRead = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameIn); + // se nullo inizializzo + if (currSignLogRead == null) + { + currSignLogRead = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameIn, + Note = "Init" + }; + } + var currSignLogSent = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameOut); + // se nullo inizializzo + if (currSignLogSent == null) + { + currSignLogSent = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameOut, + Note = "Init" + }; + } + // verifica se ci siano dati da trasmettere (sui valori LastIdx) + if (currSignLogRead.LastIdx > currSignLogSent.LastIdx) + { + // recupero i dati dal DB... + var data2send = dbProxy.MachSigLogGetNew(currSignLogSent.LastIdx); + // se ho dati preparo invio + if (data2send != null && data2send.Count > 0) + { + foreach (var sLog2send in data2send) + { + string currVal = getEncodSigLog(sLog2send.DtEve, sLog2send.ValInt, counterSigIN); + // --> accodo (valore già formattato)! + QueueIN.Enqueue(currVal); + // loggo! + lgTrace(string.Format("[QUEUE-IN] {0}", currVal)); + counterSigIN++; + if (counterSigIN > 9999) + { + counterSigIN = 0; + } + } + } + + // aggiorno idx inviato... + currSignLogSent.Note = $"Updated from {currSignLogRead.LastIdx}"; + currSignLogSent.LastUpdate = adesso; + currSignLogSent.LastIdx = currSignLogRead.LastIdx; + var lastRec = data2send.LastOrDefault(); + if (lastRec != null) + { + // salvo in B_input ultimo valore letto... + B_input = lastRec.ValInt; + } + fatto = true; + } + + // alla fine aggiorno i dati inviati! + dbProxy.SyncStateUpsert(currSignLogSent); + + return fatto; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/IobSqlServPama.cs b/IOB-WIN-NEXT/IobSqlServPama.cs new file mode 100644 index 00000000..be23873a --- /dev/null +++ b/IOB-WIN-NEXT/IobSqlServPama.cs @@ -0,0 +1,660 @@ +using EgwProxy.SqlDb.Controllers; +using EgwProxy.SqlDb.DbModels; +using IOB_UT_NEXT; +using MapoSDK; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.NetworkInformation; +using static IOB_UT_NEXT.CustomObj; + +namespace IOB_WIN_NEXT +{ + /// + /// Adapter specializzato per PAMA e le chiamate tramite DB per i dati + /// - PODL (ordini MES --> MACCHINA) + /// - SignLog (da stato macchina) + /// - FluxLog (da stato macchina) + /// - ProdLog (da stato Prod) + /// + public class IobSqlServPama : IobGeneric + { + #region Public Constructors + + /// + /// Costruttore dell'IOB DB PAMA + /// + /// AdapterForm chiamante + /// Configurazione IOB per avvio + public IobSqlServPama(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) + { + string SyncStateServ = getOptPar("SyncStateServer"); + string SyncStateDb = getOptPar("SyncStateDb"); + string SyncStateUser = getOptPar("SyncStateUser"); + string SyncStatePwd = getOptPar("SyncStatePwd"); + string SyncStateCTout = getOptPar("SyncStateCTout"); + string VetoReadSec = getOptPar("VetoReadSec"); + string VetoSyncSec = getOptPar("VetoSyncSec"); + + string connSyncState = $"data source={SyncStateServ};initial catalog={SyncStateDb};persist security info=True;user id={SyncStateUser};password={SyncStatePwd};MultipleActiveResultSets=True;App=IOB-WIN-NEXT"; + + // gestione command timeout da https://erikej.github.io/sqlclient/2020/10/26/sqlclient-commandtimeout-preview.html + if (!string.IsNullOrEmpty(SyncStateCTout)) + { + connSyncState = $"{connSyncState};Command Timeout={SyncStateCTout}"; + } + if (!string.IsNullOrEmpty(VetoReadSec)) + { + int.TryParse(VetoReadSec, out vetoReadDbSec); + } + if (!string.IsNullOrEmpty(VetoSyncSec)) + { + int.TryParse(VetoSyncSec, out VetoSyncDbSec); + } + + // eccezione: NON TROVA EntityFramework 6.0.0 o successivo... why?!? + dbProxy = new DbController(connSyncState); + + lastPING = DateTime.Now.AddHours(-1); + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Implementazione custom esecuzione task specifici + /// + /// + /// + public override Dictionary executeTasks(Dictionary task2exe) + { + DateTime adesso = DateTime.Now; + // unico task ammissibile: fare un SYNC forzato... + Dictionary taskDone = new Dictionary(); + if (task2exe != null) + { + // controllo se memMap != null... + if (memMap != null) + { + bool taskOk = false; + string taskVal = ""; + // cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4 + foreach (var item in task2exe) + { + taskOk = false; + taskVal = ""; + // converto richiesta in enum... + taskType tName = taskType.nihil; + Enum.TryParse(item.Key, out tName); + // controllo sulla KEY... + switch (tName) + { + case taskType.setComm: + case taskType.syncDbData: + lgInfo($"executeTasks --> {tName}"); + // per prima cosa recupero elenco PODL attivi x la macchina + List listaPODL = new List(); + bool okPodl = false; + var rawListPODL = callUrl(urlGetCurrPODL, false); + if (!string.IsNullOrEmpty(rawListPODL)) + { + try + { + listaPODL = JsonConvert.DeserializeObject>(rawListPODL); + okPodl = listaPODL.Count > 0; + } + catch (Exception exc) + { + lg.Error($"Errore: chiamata elenco PODL ha restituito errore{Environment.NewLine}{exc}"); + } + } + else + { + lg.Error($"Errore: chiamata elenco PODL ({urlGetCurrPODL}) ha restituito valore vuoto"); + } + if (okPodl) + { + //mando elenco PODL... + List CurrPodlReq = listaPODL + .Select(x => new MesPODLReqModel() + { + Attivabile = x.Attivabile, + CodArticolo = x.CodArticolo, + CodCli = x.CodCli, + CodGruppo = x.CodGruppo, + DueDate = x.DueDate ?? DateTime.Now, + IdxMacchina = x.IdxMacchina, + IdxODL = x.IdxOdl, + IdxPromessa = x.IdxPromessa, + InsertDate = x.InsertDate, + KeyBCode = x.KeyBCode, + KeyRichiesta = x.KeyRichiesta, + Note = x.Note, + NumPezzi = x.NumPezzi, + Priorita = x.Priorita, + PzPallet = x.PzPallet, + TCAssegnato = x.Tcassegnato + }) + .ToList(); + // scrivo i record richiesti + bool fatto = dbProxy.MesPodlWriteReq(CurrPodlReq); + if (fatto) + { + taskVal = $"EXECUTED task: {item.Key} / {item.Value}"; + // registro evento chiamata scrittura in syncState... + string tabName = item.Key; + var currSyncState = elencoSyncState.FirstOrDefault(x => x.TableName == tabName); + // verifico x registrare azione + if (currSyncState == null) + { + currSyncState = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabName, + Note = "Init" + }; + } + else + { + var lastRec = CurrPodlReq.OrderBy(x => x.IdxPromessa).LastOrDefault(); + currSyncState.LastIdx = lastRec != null ? lastRec.IdxPromessa : -1; + currSyncState.Note = $"Esecuzione {tabName} per {CurrPodlReq.Count} rec | last code: {currSyncState.LastIdx}"; + currSyncState.LastUpdate = adesso; + } + // salvo sync... + dbProxy.SyncStateUpsert(currSyncState); + } + + // effettua sync scrivendo i dati in export (PODL) + execExportAll(); + } + + break; + + default: + taskVal = $"IobSqlServPama | taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC"; + lgInfo($"IobSqlServPama | chiamata senza processing: taskOk: {taskOk} | taskVal: {taskVal}"); + break; + } + // aggiungo task! + taskDone.Add(item.Key, taskVal); + } + } + } + lastReadPLC = DateTime.Now; + return taskDone; + } + + /// + /// Recupero dati dinamici... + /// + public override Dictionary getDynData() + { + DateTime adesso = DateTime.Now; + + // dizionario vuoto / faccio direttamente accodamento in FluxLog + Dictionary outVal = new Dictionary(); + + // processo ed accodo! + processFluxLogTable(adesso); + + lastReadPLC = DateTime.Now; + return outVal; + } + + /// + /// Effettua processing CUSTOM: + /// - esegue tutti gli import + /// + public override void processCustomTaskLF() + { + lgInfo($"Richiesto processCustomTaskLF"); + // effettua sync + execImportAll(); + lastReadPLC = DateTime.Now; + } + + /// + /// Effettua lettura semafori principale Parametri da + /// aggiornare x display in form + /// + public override void readSemafori(ref newDisplayData currDispData) + { + DateTime adesso = DateTime.Now; + if (connectionOk) + { + // controllo veto checkDB + if (adesso > vetoDataRead) + { + // predispongo prox veto... + vetoDataRead = adesso.AddSeconds(vetoReadDbSec); + if (adesso > vetoDataSync) + { + // effettua sync + execImportAll(); + vetoDataSync = adesso.AddSeconds(VetoSyncDbSec); + } + + // semaforo + currDispData.semIn = Semaforo.SV; + // recupero syncState + elencoSyncState = dbProxy.SyncStateGetAll(); + // verifico SignLog e processo + bool sentSignLog = processSignLogTable(adesso); + // verifico ProdData e processo + bool sentProdData = processProdDataTable(adesso); + } + } + else + { + B_input = 0; + currDispData.semIn = Semaforo.SR; + } + } + + /// + /// Override connessione + /// + public override void tryConnect() + { + if (!connectionOk) + { + // controllo che il ping sia stato tentato almeno pingTestSec fa... + if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec")) + { + if (verboseLog || periodicLog) + { + lgInfo("SqlDb PAMA: ConnKO - tryConnect"); + } + // in primis salvo data ping... + lastPING = DateTime.Now; + // se passa il ping faccio il resto... + if (testPingMachine == IPStatus.Success) + { + string szStatusConnection = ""; + try + { + // ora provo connessione... + parentForm.commPlcActive = true; + if (dbProxy != null) + { + elencoSyncState = dbProxy.SyncStateDoImportAll(); + + if (elencoSyncState != null && elencoSyncState.Count > 0) + { + parentForm.commPlcActive = false; + connectionOk = true; + } + } + // refresh stato connessione!!! + if (connectionOk) + { + if (adpRunning) + { + lgInfo("Connessione OK"); + lastReadPLC = DateTime.Now; + } + } + else + { + lgError("Impossibile procedere, connessione mancante..."); + } + } + catch (Exception exc) + { + lgFatal($"Errore nella connessione all'adapter SqlDb PAMA: {szStatusConnection}{Environment.NewLine}{exc}"); + connectionOk = false; + lgInfo($"Eccezione in TryConnect, Adapter SqlDb PAMA NON running, pausa di {utils.CRI("waitRecMSec")} msec prima di ulteriori tentativi di riconnessione"); + } + } + else + { + // loggo no risposta ping ... + connectionOk = false; + if (verboseLog || periodicLog) + { + lgInfo($"Attenzione: SqlDb PAMA controllo PING fallito per IP {cIobConf.cncIpAddr}"); + } + } + } + } + else + { + needRefresh = true; + } + } + + public override void tryDisconnect() + { + // registro solo che è disconnesso + connectionOk = false; + } + + #endregion Public Methods + + #region Protected Fields + + protected int vetoReadDbSec = 3; + + protected int VetoSyncDbSec = 20; + + #endregion Protected Fields + + #region Protected Properties + + protected DbController dbProxy { get; set; } = null; + + /// + /// Stato di sync delle tab gestite + /// + protected List elencoSyncState { get; set; } = new List(); + + #endregion Protected Properties + + #region Private Methods + + /// + /// Esegue task EXPORT (MES PODL to MACHINE) + /// + private void execExportAll() + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + elencoSyncState = dbProxy.SyncStateDoExportAll(); + sw.Stop(); + DateTime adesso= DateTime.Now; + lastReadPLC = adesso; + lgInfo($"DB: esecuzione task dbProxy.SyncStateDoExportAll() in {sw.ElapsedMilliseconds} ms"); + + if (elencoSyncState != null) + { + // registro evento chiamata scrittura in syncState... + string tabName = "ExportAll"; + var currSyncState = elencoSyncState.FirstOrDefault(x => x.TableName == tabName); + // verifico x registrare azione + if (currSyncState == null) + { + currSyncState = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabName, + Note = "Init" + }; + } + else + { + // calcolo lastIDX valore da datetime + int valInt = -1; + var nowString = $"{adesso:HHmmss}"; + int.TryParse(nowString, out valInt); + currSyncState.LastIdx = valInt; + currSyncState.Note = $"Esecuzione {tabName} | DT code: {currSyncState.LastIdx}"; + currSyncState.LastUpdate = adesso; + } + // salvo sync... + dbProxy.SyncStateUpsert(currSyncState); + foreach (var item in elencoSyncState) + { + lgTrace($"TAB {item.TableName} | LastIdx {item.LastIdx} | Note {item.Note} | Last Upd {item.LastUpdate}"); + } + } + } + + /// + /// Esegue task IMPORT (MES PODL to MACHINE) + /// + private void execImportAll() + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + elencoSyncState = dbProxy.SyncStateDoImportAll(); + sw.Stop(); + lastReadPLC = DateTime.Now; + lgInfo($"DB: esecuzione task dbProxy.SyncStateDoImportAll() in {sw.ElapsedMilliseconds} ms"); + + if (elencoSyncState != null) + { + foreach (var item in elencoSyncState) + { + lgTrace($"TAB {item.TableName} | LastIdx {item.LastIdx} | Note {item.Note} | Last Upd {item.LastUpdate}"); + } + } + } + + /// + /// Esegue processing + invio dati tab SignLog + /// + /// + /// + private bool processFluxLogTable(DateTime adesso) + { + bool fatto = false; + string tabNameIn = "FluxLog"; + string tabNameOut = "FluxLogToMes"; + // cerco info sui SignLog (ToMes e letti) + var currFluxLogRead = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameIn); + // se nullo inizializzo + if (currFluxLogRead == null) + { + currFluxLogRead = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameIn, + Note = "Init" + }; + } + var currFluxLogSent = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameOut); + // se nullo inizializzo + if (currFluxLogSent == null) + { + currFluxLogSent = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameOut, + Note = "Init" + }; + } + // verifica se ci siano dati da trasmettere (sui valori LastIdx) + if (currFluxLogRead.LastIdx > currFluxLogSent.LastIdx) + { + // recupero i dati dal DB... + var data2send = dbProxy.MachFluxLogGetNew(currFluxLogSent.LastIdx); + // se ho dati preparo invio + if (data2send != null && data2send.Count > 0) + { + string sVal = ""; + foreach (var fLog2send in data2send) + { + sVal = $"[DYNDATA] |{fLog2send.DtEvento:yyyy-MM-dd HH:mm:ss}|{fLog2send.CodFlux}|{fLog2send.Valore}"; + // chiamo accodamento con dataora corretta... + accodaFLog(sVal, qEncodeFLog(fLog2send.DtEvento, fLog2send.CodFlux, fLog2send.Valore)); + } + fatto = true; + } + + // aggiorno idx inviato... + currFluxLogSent.Note = $"Updated from {currFluxLogRead.LastIdx}"; + currFluxLogSent.LastUpdate = adesso; + currFluxLogSent.LastIdx = currFluxLogRead.LastIdx; + } + + // alla fine aggiorno i dati inviati! + dbProxy.SyncStateUpsert(currFluxLogSent); + + return fatto; + } + + /// + /// Esegue processing + invio dati tab ProdData + /// + /// + /// + private bool processProdDataTable(DateTime adesso) + { + bool fatto = false; + string tabNameIn = "ProdData"; + string tabNameOut = "ProdDataToMes"; + // cerco info sui SignLog (ToMes e letti) + var currSignLogRead = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameIn); + // se nullo inizializzo + if (currSignLogRead == null) + { + currSignLogRead = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameIn, + Note = "Init" + }; + } + var currSignLogSent = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameOut); + // se nullo inizializzo + if (currSignLogSent == null) + { + currSignLogSent = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameOut, + Note = "Init" + }; + } + // verifica se ci siano dati da trasmettere (sui valori LastIdx) + if (currSignLogRead.LastIdx > currSignLogSent.LastIdx) + { + // recupero i dati dal DB... + var data2send = dbProxy.MachProdDataGetNew(currSignLogSent.LastIdx); + // se ho dati preparo invio + if (data2send != null && data2send.Count > 0) + { + foreach (var sLog2send in data2send) + { + // se il record è apertura PODL chiamo apertura + + trySetupPODL(0); + + // se il record è chiusura PODL chiamo chiusura... DOPO aver cercato PODL --> ODL + tryClosePODL(0); +#if false + string currVal = getEncodSigLog(sLog2send.DtEve, sLog2send.ValInt, counterSigIN); + // --> accodo (valore già formattato)! + QueueIN.Enqueue(currVal); + // loggo! + lgTrace(string.Format("[QUEUE-IN] {0}", currVal)); + counterSigIN++; + if (counterSigIN > 9999) + { + counterSigIN = 0; + } +#endif + } + } + + // aggiorno idx inviato... + currSignLogSent.Note = $"Updated from {currSignLogRead.LastIdx}"; + currSignLogSent.LastUpdate = adesso; + currSignLogSent.LastIdx = currSignLogRead.LastIdx; +#if false + var lastRec = data2send.LastOrDefault(); + if (lastRec != null) + { + // salvo in B_input ultimo valore letto... + B_input = lastRec.ValInt; + } +#endif + fatto = true; + } + + // alla fine aggiorno i dati inviati! + dbProxy.SyncStateUpsert(currSignLogSent); + + return fatto; + } + + /// + /// Esegue processing + invio dati tab SignLog + /// + /// + /// + private bool processSignLogTable(DateTime adesso) + { + bool fatto = false; + string tabNameIn = "SignLog"; + string tabNameOut = "SignLogToMes"; + // cerco info sui SignLog (ToMes e letti) + var currSignLogRead = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameIn); + // se nullo inizializzo + if (currSignLogRead == null) + { + currSignLogRead = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameIn, + Note = "Init" + }; + } + var currSignLogSent = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameOut); + // se nullo inizializzo + if (currSignLogSent == null) + { + currSignLogSent = new SyncStateModel() + { + LastIdx = 0, + LastUpdate = adesso, + TableName = tabNameOut, + Note = "Init" + }; + } + // verifica se ci siano dati da trasmettere (sui valori LastIdx) + if (currSignLogRead.LastIdx > currSignLogSent.LastIdx) + { + // recupero i dati dal DB... + var data2send = dbProxy.MachSigLogGetNew(currSignLogSent.LastIdx); + // se ho dati preparo invio + if (data2send != null && data2send.Count > 0) + { + foreach (var sLog2send in data2send) + { + string currVal = getEncodSigLog(sLog2send.DtEve, sLog2send.ValInt, counterSigIN); + // --> accodo (valore già formattato)! + QueueIN.Enqueue(currVal); + // loggo! + lgTrace(string.Format("[QUEUE-IN] {0}", currVal)); + counterSigIN++; + if (counterSigIN > 9999) + { + counterSigIN = 0; + } + } + } + + // aggiorno idx inviato... + currSignLogSent.Note = $"Updated from {currSignLogRead.LastIdx}"; + currSignLogSent.LastUpdate = adesso; + currSignLogSent.LastIdx = currSignLogRead.LastIdx; + var lastRec = data2send.LastOrDefault(); + if (lastRec != null) + { + // salvo in B_input ultimo valore letto... + B_input = lastRec.ValInt; + } + fatto = true; + } + + // alla fine aggiorno i dati inviati! + dbProxy.SyncStateUpsert(currSignLogSent); + + return fatto; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/MainForm.cs b/IOB-WIN-NEXT/MainForm.cs index aed93b4c..6e867f05 100644 --- a/IOB-WIN-NEXT/MainForm.cs +++ b/IOB-WIN-NEXT/MainForm.cs @@ -3,16 +3,14 @@ using IOB_UT_NEXT; using MapoSDK; using Newtonsoft.Json; using NLog; -using NLog.Config; -using NLog.Targets; using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Drawing; -using System.Linq; using System.Net; using System.Net.NetworkInformation; +using System.Text; using System.Threading; using System.Windows.Forms; @@ -20,80 +18,6 @@ namespace IOB_WIN_NEXT { public partial class MainForm : Form { - #region Protected Fields - - /// - /// Ramo applicazione (x update) - /// - protected string branchName = "master"; - - /// - /// chiamata x check alive di base - /// - protected string CMDALIVE = ""; - - /// - /// chiamata x ricevere un codice IOB da gestire/acquisire - /// - protected string CMDIOB2CALL = ""; - - /// - /// chiamata x invio comunicazioen reboot dell'IOBMAN - /// - protected string CMDREBO = ""; - - /// - /// Data Avvio form - /// - protected DateTime formStartTime; - - /// - /// Lista delle IOB da avviare - /// - protected List IOB2START; - - /// - /// Num max di CNC da gestire - /// - protected int MAXCNC = 1; - - /// - /// Valore minimo x considerare variazione delta parametri IOB solo x dati DataOra esecuzione - /// - protected int MinDeltaSec = 2; - - /// - /// Modalità di avvio - /// - protected StartMode ModoAvvio = StartMode.STD; - - /// - /// Indirizzo server - /// - protected string MPIP = ""; - - /// - /// URL base applicazione - /// - protected string MPURL = ""; - - /// - /// Parametri (opzionali) di avvio - /// - protected string[] myArgs; - - /// - /// var x gestione reset progBar... arrivato a 3 faccio reset - /// - protected int resetProgBar = 0; - - /// - /// Dizionario dei parametri di avvio (da elenco args...) - /// - protected Dictionary startParams = new Dictionary(); - - #endregion Protected Fields - #region Public Fields /// @@ -107,7 +31,7 @@ namespace IOB_WIN_NEXT public DateTime lastComCheck; /// - /// Oggetto connessioen REDIS + /// Oggetto connessione REDIS /// public RedisIobCache redisMan; @@ -144,188 +68,6 @@ namespace IOB_WIN_NEXT #endregion Public Constructors - #region Private Properties - - /// - /// test ping all'indirizzo impostato nei parametri - /// - /// - private IPStatus testPingServer - { - get - { - IPStatus answ = IPStatus.Unknown; - // se disabilitato salto... - if (pingDisabled) - { - answ = IPStatus.Success; - } - else - { - IPAddress address; - PingReply reply; - using (Ping pingSender = new Ping()) - { - address = IPAddress.Loopback; - string ipAdrr = MPIP; - IPAddress.TryParse(ipAdrr, out address); - try - { - // se != null --> uso address... - if (address != null) - { - reply = pingSender.Send(address, 500); - } - else - { - reply = pingSender.Send(MPIP, 500); - } - } - catch - { - reply = pingSender.Send(IPAddress.Loopback, 100); - } - } - answ = reply.Status; - } - return answ; - } - } - - #endregion Private Properties - - #region Protected Properties - - /// - /// IP del PC - /// - protected static string currIP - { - get - { - string answ = "127.0.0.1"; - - return answ; - } - } - - /// - /// URL per recuperare i file dell'IOB su CLOUD (SENZA IOB) - /// - protected static string urlDownloadFileCloud - { - get - { - return @"http://seriate.steamware.net:8083/MP/IO/IOB/getFiles/"; - } - } - - /// - /// URL per salvare i file dell'IOB su CLOUD (SENZA IOB) - /// - protected static string urlUploadFileCloud - { - get - { - return @"http://seriate.steamware.net:8083/MP/IO/IOB/uploadFile/"; - } - } - - protected bool pingDisabled - { - get - { - return utils.CRB("serverPingDisabled"); - } - } - - /// - /// URL stringa di UPDATE... - /// - protected string updateUrl - { - get - { - return string.Format("http://seriate.steamware.net:8083/SWS/MAPO/IOB-WIN/{0}/manifest.xml", branchName); - } - } - - /// - /// URL per recuperare i file dell'IOB (SENZA IOB) - /// - protected string urlDownloadFile - { - get - { - string answ = ""; - try - { - answ = string.Format(@"http://{0}{1}/IOB/getFiles/", MPIP, MPURL); - } - catch - { } - return answ; - } - } - - /// - /// URL per chiedere quale sia la IOB da acquisire/gestire (se c'è...) - /// - protected string urlIob2call - { - get - { - string answ = ""; - try - { - answ = string.Format(@"http://{0}{1}{2}{3}", MPIP, MPURL, CMDIOB2CALL, utils.GetIP()); - } - catch - { } - return answ; - } - } - - /// - /// URL per segnalazione reboot... - /// - protected string urlReboot - { - get - { - string answ = ""; - try - { - answ = string.Format(@"http://{0}{1}{2}{3}&mac={4}", MPIP, MPURL, CMDREBO, utils.GetIP(), utils.GetMACAddress()); - } - catch - { - answ = string.Format(@"http://{0}{1}{2}{3}", MPIP, MPURL, CMDREBO, utils.GetIP()); - } - return answ; - } - } - - /// - /// URL per salvare i file dell'IOB (SENZA IOB) - /// - protected string urlUploadFile - { - get - { - string answ = ""; - try - { - answ = string.Format(@"http://{0}{1}/IOB/uploadFile/", MPIP, MPURL); - } - catch - { } - return answ; - } - } - - #endregion Protected Properties - #region Public Properties /// @@ -423,6 +165,542 @@ namespace IOB_WIN_NEXT #endregion Public Properties + #region Public Methods + + /// + /// Avanza la barra di stato... + /// + public void advProgBar() + { + try + { + // aggiorno runtime... + TimeSpan uptime = DateTime.Now.Subtract(formStartTime); + tslRunTime.Text = string.Format("Running: {0}gg {1:00}:{2:00}:{3:00}", uptime.Days, uptime.Hours, uptime.Minutes, uptime.Seconds); + if (MainProgrBar.Style != ProgressBarStyle.Marquee) + { + // se è arrivato a MAX resetto... + MainProgrBar.PerformStep(); + // verifico SE deve resettare progress bar + if (resetProgBar > 10) + { + MainProgrBar.Value = 0; + resetProgBar = 0; + } + // se arrivoa max imposto richiesta reset... + if (MainProgrBar.Value == MainProgrBar.Maximum) + { + resetProgBar++; + } + // invalido x ridisegnare... + MainProgrBar.Invalidate(); + } + } + catch (Exception exc) + { + lgError($"Eccezione in advProgBar:{Environment.NewLine}{exc}"); + } + } + + /// + /// mostra un testo sulla status bar + LOG + /// + /// + public void displayTaskAndLog(string txt2show) + { + lblStatus.Text = txt2show; + lblStatus.Invalidate(); + lgInfo(txt2show); + } + + /// + /// Mostra update delle statistiche di comunicazione (num plc connessi, indirizzo server) + /// con colore ad indicare anomalie... + /// + /// + /// + /// + public void updateComStats(int numPLC, int numAttivi, bool serverOk) + { + // testo + lblComStats.Text = $"{numAttivi}/{numPLC} PLC --> {MPIP} (MP/IO)"; + // colore secondo valori... server !="ND" è ok, PLC > 0 è OK + int score = 0; + if (serverOk) + { + score++; + } + + if (numPLC > 0 && numAttivi == numPLC) + { + score++; + } + + switch (score) + { + case 0: + lblComStats.ForeColor = Color.Red; + break; + + case 1: + lblComStats.ForeColor = Color.Orange; + break; + + case 2: + lblComStats.ForeColor = Color.Green; + break; + + default: + lblComStats.ForeColor = Color.Gray; + break; + } + } + + #endregion Public Methods + + #region Protected Fields + + /// + /// Ramo applicazione (x update) + /// + protected string branchName = "master"; + + /// + /// chiamata x check alive di base + /// + protected string CMDALIVE = ""; + + /// + /// chiamata x ricevere un codice IOB da gestire/acquisire + /// + protected string CMDIOB2CALL = ""; + + /// + /// chiamata x invio comunicazioen reboot dell'IOBMAN + /// + protected string CMDREBO = ""; + + /// + /// Data Avvio form + /// + protected DateTime formStartTime; + + /// + /// Lista delle IOB da avviare + /// + protected List IOB2START; + + /// + /// Num max di CNC da gestire + /// + protected int MAXCNC = 1; + + /// + /// Valore minimo x considerare variazione delta parametri IOB solo x dati DataOra esecuzione + /// + protected int MinDeltaSec = 2; + + /// + /// Modalità di avvio + /// + protected StartMode ModoAvvio = StartMode.STD; + + /// + /// Indirizzo server + /// + protected string MPIP = ""; + + /// + /// URL base applicazione + /// + protected string MPURL = ""; + + /// + /// Parametri (opzionali) di avvio + /// + protected string[] myArgs; + + /// + /// var x gestione reset progBar... arrivato a 3 faccio reset + /// + protected int resetProgBar = 0; + + /// + /// Generatore numeri random + /// + protected Random rndGen = new Random(); + + /// + /// Dizionario dei parametri di avvio (da elenco args...) + /// + protected Dictionary startParams = new Dictionary(); + + #endregion Protected Fields + + #region Protected Properties + + /// + /// IP del PC + /// + protected static string currIP + { + get + { + string answ = "127.0.0.1"; + + return answ; + } + } + + protected static string baseUrl = @"https://liman.egalware.com/MP/IO/"; + //protected static string baseUrl = @"https://seriate.steamware.net:8083/MP/IO/"; + + /// + /// URL per recuperare i file dell'IOB su CLOUD (SENZA IOB) + /// + protected static string urlDownloadFileCloud + { + get + { + return $"{baseUrl}IOB/getFiles/"; + //return @"http://seriate.steamware.net:8083/MP/IO/IOB/getFiles/"; + } + } + + /// + /// URL per salvare i file dell'IOB su CLOUD (SENZA IOB) + /// + protected static string urlUploadFileCloud + { + get + { + return $"{baseUrl}IOB/uploadFile/"; + //return @"http://seriate.steamware.net:8083/MP/IO/IOB/uploadFile/"; + + } + } + + protected bool pingDisabled + { + get + { + return utils.CRB("serverPingDisabled"); + } + } + + /// + /// URL stringa di UPDATE... + /// + protected string updateUrl + { + get + { + return string.Format("http://seriate.steamware.net:8083/SWS/MAPO/IOB-WIN/{0}/manifest.xml", branchName); + } + } + + /// + /// URL per recuperare i file dell'IOB (SENZA IOB) + /// + protected string urlDownloadFile + { + get + { + string answ = ""; + try + { + answ = string.Format(@"http://{0}{1}/IOB/getFiles/", MPIP, MPURL); + } + catch + { } + return answ; + } + } + + /// + /// URL per chiedere quale sia la IOB da acquisire/gestire (se c'è...) + /// + protected string urlIob2call + { + get + { + string answ = ""; + try + { + answ = string.Format(@"http://{0}{1}{2}{3}", MPIP, MPURL, CMDIOB2CALL, utils.GetIP()); + } + catch + { } + return answ; + } + } + + /// + /// URL per segnalazione reboot... + /// + protected string urlReboot + { + get + { + string answ = ""; + try + { + answ = string.Format(@"http://{0}{1}{2}{3}&mac={4}", MPIP, MPURL, CMDREBO, utils.GetIP(), utils.GetMACAddress()); + } + catch + { + answ = string.Format(@"http://{0}{1}{2}{3}", MPIP, MPURL, CMDREBO, utils.GetIP()); + } + return answ; + } + } + + /// + /// URL per salvare i file dell'IOB (SENZA IOB) + /// + protected string urlUploadFile + { + get + { + string answ = ""; + try + { + answ = string.Format(@"http://{0}{1}/IOB/uploadFile/", MPIP, MPURL); + } + catch + { } + return answ; + } + } + + #endregion Protected Properties + + #region Protected Methods + + /// + /// Effettua logging ERROR corretto impostanto anche la variabile IOB prima di scrivere... + /// + /// + protected static void lgError(string txt2log) + { + lg.Factory.Configuration.Variables["codIOB"] = "MAIN"; + lg.Error(txt2log); + } + + /// + /// Effettua logging INFO corretto impostando anche la variabile IOB prima di scrivere... + /// + /// + protected static void lgInfo(string txt2log) + { + lg.Factory.Configuration.Variables["codIOB"] = "MAIN"; + lg.Info(txt2log); + } + + /// + /// CHiude le finestre child attive + /// + protected void closeActiveChild() + { + if (this.HasChildren) + { + try + { + this.ActiveMdiChild.Close(); + this.LayoutMdi(MdiLayout.TileHorizontal); + } + catch + { } + } + } + + protected void myInit() + { + DateTime adesso = DateTime.Now; + resetProgBar = 0; + formStartTime = adesso; + lastComCheck = adesso.AddHours(-1); + lblStatus.Text = "Loading"; + + // fix icon! + notifyIcon1.Text = string.Format("IOB-WIN | {0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); + Icon = Icon.ExtractAssociatedIcon(utils.defIconFilePath); + notifyIcon1.Icon = Icon.ExtractAssociatedIcon(utils.defIconFilePath); + + // fix versione! + string nomeApp = $"{ConfigurationManager.AppSettings.Get("appName")} ({ModoAvvio})"; + string versione = $" v.{System.Reflection.Assembly.GetExecutingAssembly().GetName().Version}"; + lblApp.Text = nomeApp; + lblVers.Text = versione; + + LogManager.ReconfigExistingLoggers(); + + lg = LogManager.GetCurrentClassLogger(); + displayTaskAndLog("MainForm Starting"); + + // salvo versione SW! + lgInfo("------ STARTUP DATA ------"); + lgInfo($"App Mode : {nomeApp}"); + lgInfo($"Versione : {versione}"); + lgInfo("--------------------------"); + + // se abilitato autoload conf leggo file corretto... + if (utils.CRB("autoLoadConf")) + { + try + { + loadIniFile(utils.mainConfFilePath); + lgInfo("INI LOADED"); + // avvio child come richiesto! + startAdapters(); + } + catch (Exception exc) + { + displayTaskAndLog(string.Format("Eccezione in myInit: {0}", exc)); + } + } + else + { + displayTaskAndLog("Waiting for config file selection"); + } + + displayTaskAndLog("Program Running"); + createTrayMenu(); + displayTaskAndLog("Tray Menu OK"); + + // avvio minimizzato se richiesto + if (utils.CRB("startMinimized")) + { + // imposto minimized se necessario! + if (WindowState != FormWindowState.Minimized) + { + WindowState = FormWindowState.Minimized; + } + displayTaskAndLog("Minimized"); + } + try + { + IPStatus pingStatus = testPingServer; + // se passa il ping faccio il resto... + if (pingStatus == IPStatus.Success) + { + // segnalo reboot (programma)... + utils.callUrl(urlReboot); + } + else + { + displayTaskAndLog("Server unreachable, cannot send urlReboot for MAIN FORM"); + } + } + catch (Exception exc) + { + lgError(string.Format("MainForm myInit EXCEPTION in fase di chiamata URL di reboot:{0}{1}{2}", urlReboot, Environment.NewLine, exc)); + } + displayTaskAndLog("Main Form OK"); + } + + /// + /// Apre la finestra child con conf + /// + protected void openChild(string IOB) + { + if (IOB == null) + { + throw new ArgumentNullException(nameof(IOB)); + } + + AdapterForm child = new AdapterForm(IOB); + child.MdiParent = this; + child.Text = IOB; + child.Show(); + child.Shown += Child_Shown; + child.FormClosed += Child_FormClosed; + } + + /// + /// effettua salvataggio argomenti + /// + /// + protected void saveArgs(string[] args) + { + if (args != null) + { + // salvo args di avvio (sono parametri tipo param1=val1 param2=test1,test2,test3 + myArgs = args; + if (myArgs.Length > 0) + { + // salvo dictionary! + foreach (var item in myArgs) + { + var kvp = item.Split('='); + startParams.Add(kvp[0], kvp[1]); + } + } + // verifico gli args... + if (startParams.ContainsKey("MODE")) + { + try + { + ModoAvvio = (StartMode)Enum.Parse(typeof(StartMode), startParams["MODE"]); + } + catch + { } + } + } + } + + #endregion Protected Methods + + #region Private Properties + + /// + /// test ping all'indirizzo impostato nei parametri + /// + /// + private IPStatus testPingServer + { + get + { + IPStatus answ = IPStatus.Unknown; + // se disabilitato salto... + if (pingDisabled) + { + answ = IPStatus.Success; + } + else + { + IPAddress address; + PingReply reply; + using (Ping pingSender = new Ping()) + { + address = IPAddress.Loopback; + string ipAdrr = MPIP; + IPAddress.TryParse(ipAdrr, out address); + try + { + // se != null --> uso address... + if (address != null) + { + reply = pingSender.Send(address, 500); + } + else + { + reply = pingSender.Send(MPIP, 500); + } + } + catch + { + reply = pingSender.Send(IPAddress.Loopback, 100); + } + } + answ = reply.Status; + } + return answ; + } + } + + #endregion Private Properties + #region Private Methods private void arrangeWindowsToolStripMenuItem_Click(object sender, EventArgs e) @@ -463,7 +741,8 @@ namespace IOB_WIN_NEXT if (DateTime.Now.Subtract(lastComCheck).TotalSeconds > utils.CRI("comCheckTOut")) { lastComCheck = DateTime.Now; - // conta quanti child form di adapter verso PLC siano aperti !!!FARE!!! chiedere con un metodo che siano ATTIVI e contare quello... + // conta quanti child form di adapter verso PLC siano aperti !!!FARE!!! chiedere con + // un metodo che siano ATTIVI e contare quello... int numPLC = this.MdiChildren.Length; int numAttivi = 0; foreach (var item in this.MdiChildren) @@ -646,8 +925,8 @@ namespace IOB_WIN_NEXT private void getIOBAssignmentsToolStripMenuItem_Click(object sender, EventArgs e) { - // !!!FARE!!! - // fa un check su server di quali IOB siano assegnate al PC (e modifica il file MAIN di avvio ripartendo...) + // !!!FARE!!! fa un check su server di quali IOB siano assegnate al PC (e modifica il + // file MAIN di avvio ripartendo...) } /// @@ -835,8 +1114,7 @@ namespace IOB_WIN_NEXT private void sendIOBAssignmentsToolStripMenuItem_Click(object sender, EventArgs e) { - // !!!FARE!!! - // salva su server quali IOB siano gestite dal PC (da conf su MAIN...) + // !!!FARE!!! salva su server quali IOB siano gestite dal PC (da conf su MAIN...) } /// @@ -912,7 +1190,8 @@ namespace IOB_WIN_NEXT try { fileMover.obj.setDirectory(utils.confDir); - var fileList = fileMover.obj.elencoFiles_FI(currIob + ".*"); + var fileList = fileMover.obj.elencoFiles_FI(currIob + "*"); + //var fileList = fileMover.obj.elencoFiles_FI(currIob + ".*"); foreach (var item in fileList) { @@ -926,15 +1205,38 @@ namespace IOB_WIN_NEXT } // serializzo string rawData = JsonConvert.SerializeObject(objFiles); - if (utils.CRB("ConfToCloud")) + // mod 2022.12.30: verifico se diverso da copia redis ultimo MD5 del set + // salvato, nel caso NON invio... + bool needSend = false; + using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) { - // invio su cloud... - answ = utils.callUrl($"{urlUploadFileCloud}{currIob}", rawData); + var hash = md5.ComputeHash(Encoding.ASCII.GetBytes(rawData)); + string newMD5 = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); + string redKey = redisMan.redHash($"IOB:ConfFileMD5:{currIob}"); + var rawVal = redisMan.getRSV(redKey); + // verifico uguaglianza MD5... + if (string.IsNullOrEmpty(rawVal) || !newMD5.Equals(rawVal)) + { + needSend = true; + int CacheConfToCloudDuratHour = utils.CRI("CacheConfToCloudDuratHour"); + // calcolo attesa con errore random -/+ 10% + int ttlSec = 60 * 60 * CacheConfToCloudDuratHour * rndGen.Next(900, 1100) / 1000; + redisMan.setRSV(redKey, newMD5, ttlSec); + } } - else + // invio solo se encessario + if (needSend) { - // invio in locale! - answ = utils.callUrl($"{urlUploadFile}{currIob}", rawData); + if (utils.CRB("ConfToCloud")) + { + // invio su cloud... + answ = utils.callUrl($"{urlUploadFileCloud}{currIob}", rawData); + } + else + { + // invio in locale! + answ = utils.callUrl($"{urlUploadFile}{currIob}", rawData); + } } } catch (Exception exc) @@ -950,273 +1252,5 @@ namespace IOB_WIN_NEXT } #endregion Private Methods - - #region Protected Methods - - /// - /// Effettua logging ERROR corretto impostanto anche la variabile IOB prima di scrivere... - /// - /// - protected static void lgError(string txt2log) - { - lg.Factory.Configuration.Variables["codIOB"] = "MAIN"; - lg.Error(txt2log); - } - - /// - /// Effettua logging INFO corretto impostando anche la variabile IOB prima di scrivere... - /// - /// - protected static void lgInfo(string txt2log) - { - lg.Factory.Configuration.Variables["codIOB"] = "MAIN"; - lg.Info(txt2log); - } - - /// - /// CHiude le finestre child attive - /// - protected void closeActiveChild() - { - if (this.HasChildren) - { - try - { - this.ActiveMdiChild.Close(); - this.LayoutMdi(MdiLayout.TileHorizontal); - } - catch - { } - } - } - - protected void myInit() - { - DateTime adesso = DateTime.Now; - resetProgBar = 0; - formStartTime = adesso; - lastComCheck = adesso.AddHours(-1); - lblStatus.Text = "Loading"; - - // fix icon! - notifyIcon1.Text = string.Format("IOB-WIN | {0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); - Icon = Icon.ExtractAssociatedIcon(utils.defIconFilePath); - notifyIcon1.Icon = Icon.ExtractAssociatedIcon(utils.defIconFilePath); - - // fix versione! - string nomeApp = $"{ConfigurationManager.AppSettings.Get("appName")} ({ModoAvvio})"; - string versione = $" v.{System.Reflection.Assembly.GetExecutingAssembly().GetName().Version}"; - lblApp.Text = nomeApp; - lblVers.Text = versione; - - LogManager.ReconfigExistingLoggers(); - - lg = LogManager.GetCurrentClassLogger(); - displayTaskAndLog("MainForm Starting"); - - // salvo versione SW! - lgInfo("------ STARTUP DATA ------"); - lgInfo($"App Mode : {nomeApp}"); - lgInfo($"Versione : {versione}"); - lgInfo("--------------------------"); - - // se abilitato autoload conf leggo file corretto... - if (utils.CRB("autoLoadConf")) - { - try - { - loadIniFile(utils.mainConfFilePath); - lgInfo("INI LOADED"); - // avvio child come richiesto! - startAdapters(); - } - catch (Exception exc) - { - displayTaskAndLog(string.Format("Eccezione in myInit: {0}", exc)); - } - } - else - { - displayTaskAndLog("Waiting for config file selection"); - } - - displayTaskAndLog("Program Running"); - createTrayMenu(); - displayTaskAndLog("Tray Menu OK"); - - // avvio minimizzato se richiesto - if (utils.CRB("startMinimized")) - { - // imposto minimized se necessario! - if (WindowState != FormWindowState.Minimized) - { - WindowState = FormWindowState.Minimized; - } - displayTaskAndLog("Minimized"); - } - try - { - IPStatus pingStatus = testPingServer; - // se passa il ping faccio il resto... - if (pingStatus == IPStatus.Success) - { - // segnalo reboot (programma)... - utils.callUrl(urlReboot); - } - else - { - displayTaskAndLog("Server unreachable, cannot send urlReboot for MAIN FORM"); - } - } - catch (Exception exc) - { - lgError(string.Format("MainForm myInit EXCEPTION in fase di chiamata URL di reboot:{0}{1}{2}", urlReboot, Environment.NewLine, exc)); - } - displayTaskAndLog("Main Form OK"); - } - - /// - /// Apre la finestra child con conf - /// - protected void openChild(string IOB) - { - if (IOB == null) - { - throw new ArgumentNullException(nameof(IOB)); - } - - AdapterForm child = new AdapterForm(IOB); - child.MdiParent = this; - child.Text = IOB; - child.Show(); - child.Shown += Child_Shown; - child.FormClosed += Child_FormClosed; - } - - /// - /// effettua salvataggio argomenti - /// - /// - protected void saveArgs(string[] args) - { - if (args != null) - { - // salvo args di avvio (sono parametri tipo param1=val1 param2=test1,test2,test3 - myArgs = args; - if (myArgs.Length > 0) - { - // salvo dictionary! - foreach (var item in myArgs) - { - var kvp = item.Split('='); - startParams.Add(kvp[0], kvp[1]); - } - } - // verifico gli args... - if (startParams.ContainsKey("MODE")) - { - try - { - ModoAvvio = (StartMode)Enum.Parse(typeof(StartMode), startParams["MODE"]); - } - catch - { } - } - } - } - - #endregion Protected Methods - - #region Public Methods - - /// - /// Avanza la barra di stato... - /// - public void advProgBar() - { - try - { - // aggiorno runtime... - TimeSpan uptime = DateTime.Now.Subtract(formStartTime); - tslRunTime.Text = string.Format("Running: {0}gg {1:00}:{2:00}:{3:00}", uptime.Days, uptime.Hours, uptime.Minutes, uptime.Seconds); - if (MainProgrBar.Style != ProgressBarStyle.Marquee) - { - // se è arrivato a MAX resetto... - MainProgrBar.PerformStep(); - // verifico SE deve resettare progress bar - if (resetProgBar > 10) - { - MainProgrBar.Value = 0; - resetProgBar = 0; - } - // se arrivoa max imposto richiesta reset... - if (MainProgrBar.Value == MainProgrBar.Maximum) - { - resetProgBar++; - } - // invalido x ridisegnare... - MainProgrBar.Invalidate(); - } - } - catch (Exception exc) - { - lgError($"Eccezione in advProgBar:{Environment.NewLine}{exc}"); - } - } - - /// - /// mostra un testo sulla status bar + LOG - /// - /// - public void displayTaskAndLog(string txt2show) - { - lblStatus.Text = txt2show; - lblStatus.Invalidate(); - lgInfo(txt2show); - } - - /// - /// Mostra update delle statistiche di comunicazione (num plc connessi, indirizzo server) con colore ad indicare anomalie... - /// - /// - /// - /// - public void updateComStats(int numPLC, int numAttivi, bool serverOk) - { - // testo - lblComStats.Text = $"{numAttivi}/{numPLC} PLC --> {MPIP} (MP/IO)"; - // colore secondo valori... server !="ND" è ok, PLC > 0 è OK - int score = 0; - if (serverOk) - { - score++; - } - - if (numPLC > 0 && numAttivi == numPLC) - { - score++; - } - - switch (score) - { - case 0: - lblComStats.ForeColor = Color.Red; - break; - - case 1: - lblComStats.ForeColor = Color.Orange; - break; - - case 2: - lblComStats.ForeColor = Color.Green; - break; - - default: - lblComStats.ForeColor = Color.Gray; - break; - } - } - - #endregion Public Methods } } \ No newline at end of file diff --git a/IOB-WIN-NEXT/RemoteDebugInfo.txt b/IOB-WIN-NEXT/RemoteDebugInfo.txt index 276df6ab..5216ece9 100644 --- a/IOB-WIN-NEXT/RemoteDebugInfo.txt +++ b/IOB-WIN-NEXT/RemoteDebugInfo.txt @@ -20,3 +20,6 @@ Remote Machine conf: Giacovelli: - 192.168.1.93:4026 + + IMI Remosa: + - 192.168.0.12:4026 \ No newline at end of file diff --git a/IOB-WIN-NEXT/Tools/ExcImport.exe b/IOB-WIN-NEXT/Tools/ExcImport.exe new file mode 100644 index 00000000..b5f962e4 Binary files /dev/null and b/IOB-WIN-NEXT/Tools/ExcImport.exe differ diff --git a/IOB-WIN-NEXT/Tools/RefExcConv.json b/IOB-WIN-NEXT/Tools/RefExcConv.json new file mode 100644 index 00000000..40baa3cc --- /dev/null +++ b/IOB-WIN-NEXT/Tools/RefExcConv.json @@ -0,0 +1,25 @@ +{ + "ArchiveDir": "{{ArchiveDir}}", + "ConvertDir": "{{ConvertDir}}", + "FileInPath": "{{FileInPath}}", + "FileOutPath": "{{FileOutPath}}", + "IdxODL": 987654321, + "ProcessParamInt": { + "Product": 3, + "Variety": 9, + "Supplier": 8, + "ExtDoc": 2, + "DateRif": 14, + "QtyTot": 22, + "NumPack": 21, + "NumPed": 17, + "PackPed": 18, + "PesoPack": 20 + }, + "ProcessParamStr": {}, + "RedisDB": 0, + "RedisOut": "", + "Return": "File", + "TargetName": "{{TargetSheetName}}", + "Type": "Excel" +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/packages.config b/IOB-WIN-NEXT/packages.config index 94c44ac8..0b984b3f 100644 --- a/IOB-WIN-NEXT/packages.config +++ b/IOB-WIN-NEXT/packages.config @@ -6,16 +6,17 @@ + - + - - + + diff --git a/IOB-WIN-NEXT/postBuildTgt.bat b/IOB-WIN-NEXT/postBuildTgt.bat index 64a89fd7..a5eb488c 100644 --- a/IOB-WIN-NEXT/postBuildTgt.bat +++ b/IOB-WIN-NEXT/postBuildTgt.bat @@ -61,7 +61,9 @@ REM ROBOCOPY . \\10.150.0.1\Steamware\IOB-WIN-NEXT-DEB /MIR REM Baglietto REM ROBOCOPY . \\192.168.60.15\Steamware\IOB-WIN-NEXT-DEB /MIR REM GIACOVELLI LOCOROTONDO -ROBOCOPY . \\192.168.1.93\Steamware\IOB-WIN-NEXT-DEB /MIR +REM ROBOCOPY . \\192.168.1.93\Steamware\IOB-WIN-NEXT-DEB /MIR +REM IMI Remosa +ROBOCOPY . \\192.168.0.12\Steamware\IOB-WIN-NEXT-DEB /MIR REM IOB-WIN-SIM REM ROBOCOPY . \\IOB-WIN-SIMULA\Steamware\IOB-WIN-NEXT-DEB /MIR diff --git a/ZZZ_RECIPE/FIMAT/10001.xml b/ZZZ_RECIPE/FIMAT/10001.xml new file mode 100644 index 00000000..07d946be --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10001.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 000 + + + 10001 +
PATA-SHAN
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 000 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.295 + 100.000 + 2.950 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10002.xml b/ZZZ_RECIPE/FIMAT/10002.xml new file mode 100644 index 00000000..7e57bac2 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10002.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + A11 + + + 10002 +
PATA-SHAN
+ + + + + + + + + + + + 0.20 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG A11 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.110 + 53.922 + 1.100 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.066 + 32.353 + 0.660 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.027 + 13.235 + 0.270 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.001 + 0.490 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10003.xml b/ZZZ_RECIPE/FIMAT/10003.xml new file mode 100644 index 00000000..16585164 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10003.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 002 + + + 10003 +
PATA-SHAN
+ + + + + + + + + + + + 0.12 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 002 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.109 + 90.833 + 1.090 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.002 + 1.667 + 0.020 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.009 + 7.500 + 0.090 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10004.xml b/ZZZ_RECIPE/FIMAT/10004.xml new file mode 100644 index 00000000..0821c929 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10004.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 022 + + + 10004 +
PATA-SHAN
+ + + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 022 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.027 + 72.973 + 0.270 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.005 + 13.514 + 0.050 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 13.514 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10005.xml b/ZZZ_RECIPE/FIMAT/10005.xml new file mode 100644 index 00000000..f5606721 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10005.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 023 + + + 10005 +
PATA-SHAN
+ + + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 023 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.031 + 86.111 + 0.310 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.004 + 11.111 + 0.040 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.001 + 2.778 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10006.xml b/ZZZ_RECIPE/FIMAT/10006.xml new file mode 100644 index 00000000..76389d00 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10006.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 003 + + + 10006 +
PATA-SHAN
+ + + + + + + + + + + + 0.11 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 003 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.087 + 76.991 + 0.870 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.014 + 12.389 + 0.140 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.012 + 10.619 + 0.120 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10007.xml b/ZZZ_RECIPE/FIMAT/10007.xml new file mode 100644 index 00000000..95fced7d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10007.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 031 + + + 10007 +
PATA-SHAN
+ + + + + + + + + + + + 0.13 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 031 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.102 + 79.688 + 1.020 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.014 + 10.938 + 0.140 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.012 + 9.375 + 0.120 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10008.xml b/ZZZ_RECIPE/FIMAT/10008.xml new file mode 100644 index 00000000..30b4b653 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10008.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 004 + + + 10008 +
PATA-SHAN
+ + + + + + + + + + + + 0.12 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 004 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.082 + 68.333 + 0.820 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.025 + 20.833 + 0.250 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.013 + 10.833 + 0.130 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10009.xml b/ZZZ_RECIPE/FIMAT/10009.xml new file mode 100644 index 00000000..1bbfac2c --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10009.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 005 + + + 10009 +
PATA-SHAN
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 005 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.254 + 87.285 + 2.540 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.008 + 2.749 + 0.080 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.002 + 0.687 + 0.020 + 0.00 + + + + + 4 + ROSSO + FTL AC + C + 0.002 + 0.687 + 0.020 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.025 + 8.591 + 0.250 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10010.xml b/ZZZ_RECIPE/FIMAT/10010.xml new file mode 100644 index 00000000..f0dc4720 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10010.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 014 + + + 10010 +
PATA-SHAN
+ + come flash 141 + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come flash 141 PATAGONIA-SHANTUNG 014 + come flash 141 + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.021 + 51.220 + 0.210 + 0.00 + + + + + 2 + COLANVIO + RL132 + C + 0.020 + 48.780 + 0.200 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10011.xml b/ZZZ_RECIPE/FIMAT/10011.xml new file mode 100644 index 00000000..fb8e7524 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10011.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 006 + + + 10011 +
PATA-SHAN
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 006 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.227 + 78.547 + 2.270 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.023 + 7.958 + 0.230 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.006 + 2.076 + 0.060 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.033 + 11.419 + 0.330 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10012.xml b/ZZZ_RECIPE/FIMAT/10012.xml new file mode 100644 index 00000000..525df190 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10012.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 061 + + + 10012 +
PATA-SHAN
+ + + + + + + + + + + + 0.20 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 061 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.164 + 83.249 + 1.640 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.008 + 4.061 + 0.080 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.025 + 12.690 + 0.250 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10013.xml b/ZZZ_RECIPE/FIMAT/10013.xml new file mode 100644 index 00000000..97a7e7df --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10013.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 007 + + + 10013 +
PATA-SHAN
+ + + + + + + + + + + + 0.86 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 007 + + 0001-01-01 00:00:00 + 0 + 0.009 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.573 + 66.861 + 5.730 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.175 + 20.420 + 1.750 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.109 + 12.719 + 1.090 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10014.xml b/ZZZ_RECIPE/FIMAT/10014.xml new file mode 100644 index 00000000..d4bc9231 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10014.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 010 + + + 10014 +
PATA-SHAN
+ + + + + + + + + + + + 0.30 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 010 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.239 + 79.667 + 2.390 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.031 + 10.333 + 0.310 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.003 + 1.000 + 0.030 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.019 + 6.333 + 0.190 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.008 + 2.667 + 0.080 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10015.xml b/ZZZ_RECIPE/FIMAT/10015.xml new file mode 100644 index 00000000..b36edac9 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10015.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 011 + + + 10015 +
PATA-SHAN
+ + + + + + + + + + + + 0.28 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 011 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.253 + 91.007 + 2.530 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.020 + 7.194 + 0.200 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 1.799 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10016.xml b/ZZZ_RECIPE/FIMAT/10016.xml new file mode 100644 index 00000000..74a85c54 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10016.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 111 + + + 10016 +
PATA-SHAN
+ + + + + + + + + + + + 0.81 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 111 + + 0001-01-01 00:00:00 + 0 + 0.008 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.777 + 95.572 + 7.770 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.013 + 1.599 + 0.130 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.018 + 2.214 + 0.180 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.005 + 0.615 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10017.xml b/ZZZ_RECIPE/FIMAT/10017.xml new file mode 100644 index 00000000..0426a2fa --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10017.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN-FLASH + + 012 + + + 10017 +
PATA-SHAN
+ + come flash 132 + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come flash 132 PATAGONIA-SHANTUNG 012 + come flash 132 + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.253 + 88.153 + 2.530 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.028 + 9.756 + 0.280 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.006 + 2.091 + 0.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10018.xml b/ZZZ_RECIPE/FIMAT/10018.xml new file mode 100644 index 00000000..80da29a8 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10018.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 12B + + + 10018 +
PATA-SHAN
+ + + + + + + + + + + + 0.09 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 12B + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.066 + 72.527 + 0.660 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.020 + 21.978 + 0.200 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 5.495 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10019.xml b/ZZZ_RECIPE/FIMAT/10019.xml new file mode 100644 index 00000000..e9f3637e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10019.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 013 + + + 10019 +
PATA-SHAN
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 013 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.253 + 86.644 + 2.530 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.028 + 9.589 + 0.280 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.011 + 3.767 + 0.110 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10020.xml b/ZZZ_RECIPE/FIMAT/10020.xml new file mode 100644 index 00000000..61fe3677 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10020.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 015 + + + 10020 +
PATA-SHAN
+ + + + + + + + + + + + 0.14 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 015 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.023 + 16.429 + 0.230 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.108 + 77.143 + 1.080 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.009 + 6.429 + 0.090 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10021.xml b/ZZZ_RECIPE/FIMAT/10021.xml new file mode 100644 index 00000000..69c42853 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10021.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 152 + + + 10021 +
PATA-SHAN
+ + + + + + + + + + + + 0.35 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 152 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.187 + 53.736 + 1.870 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.112 + 32.184 + 1.120 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.047 + 13.506 + 0.470 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 0.575 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10022.xml b/ZZZ_RECIPE/FIMAT/10022.xml new file mode 100644 index 00000000..de45edc5 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10022.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 062 + + + 10022 +
PATA-SHAN
+ + + + + + + + + + + + 0.30 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 062 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.143 + 47.667 + 1.430 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.132 + 44.000 + 1.320 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.025 + 8.333 + 0.250 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10023.xml b/ZZZ_RECIPE/FIMAT/10023.xml new file mode 100644 index 00000000..a4a7f3e3 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10023.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN-FLASH + + 551 + + + 10023 +
PATA-SHAN
+ + come flash 053 + + + + + + + + + + 0.05 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come flash 053 PATAGONIA-SHANTUNG 551 + come flash 053 + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.031 + 67.391 + 0.310 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.015 + 32.609 + 0.150 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10024.xml b/ZZZ_RECIPE/FIMAT/10024.xml new file mode 100644 index 00000000..be9e54f1 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10024.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 063 + + + 10024 +
PATA-SHAN
+ + + + + + + + + + + + 0.07 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 063 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.068 + 93.151 + 0.680 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.005 + 6.849 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10025.xml b/ZZZ_RECIPE/FIMAT/10025.xml new file mode 100644 index 00000000..a2c0b8ab --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10025.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 051 + + + 10025 +
PATA-SHAN
+ + + + + + + + + + + + 0.19 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 051 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.171 + 87.692 + 1.710 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.005 + 2.564 + 0.050 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.001 + 0.513 + 0.010 + 0.00 + + + + + 4 + ROSSO + FTL AC + C + 0.001 + 0.513 + 0.010 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.017 + 8.718 + 0.170 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10026.xml b/ZZZ_RECIPE/FIMAT/10026.xml new file mode 100644 index 00000000..6f28b286 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10026.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 066 + + + 10026 +
PATA-SHAN
+ + + + + + + + + + + + 0.06 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 066 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.048 + 80.000 + 0.480 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.004 + 6.667 + 0.040 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.008 + 13.333 + 0.080 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10027.xml b/ZZZ_RECIPE/FIMAT/10027.xml new file mode 100644 index 00000000..032c36e4 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10027.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 055 + + + 10027 +
PATA-SHAN
+ + + + + + + + + + + + 0.40 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 055 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.349 + 88.354 + 3.490 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.009 + 2.278 + 0.090 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.002 + 0.506 + 0.020 + 0.00 + + + + + 4 + ROSSO + FTL AC + C + 0.002 + 0.506 + 0.020 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.033 + 8.354 + 0.330 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10028.xml b/ZZZ_RECIPE/FIMAT/10028.xml new file mode 100644 index 00000000..61dd6984 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10028.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 021 + + + 10028 +
PATA-SHAN
+ + + + + + + + + + + + 0.06 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 021 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.048 + 84.211 + 0.480 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.005 + 8.772 + 0.050 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.004 + 7.018 + 0.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10029.xml b/ZZZ_RECIPE/FIMAT/10029.xml new file mode 100644 index 00000000..e94d6862 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10029.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 026 + + + 10029 +
PATA-SHAN
+ + + + + + + + + + + + 0.17 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 026 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.090 + 54.545 + 0.900 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.065 + 39.394 + 0.650 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.004 + 2.424 + 0.040 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.006 + 3.636 + 0.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10030.xml b/ZZZ_RECIPE/FIMAT/10030.xml new file mode 100644 index 00000000..e1fc3366 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10030.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + A00 + + + 10030 +
PATA-SHAN
+ + + + + + + + + + + + 1.88 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG A00 + + 0001-01-01 00:00:00 + 0 + 0.019 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 1.190 + 63.433 + 11.900 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.001 + 0.053 + 0.010 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.001 + 0.053 + 0.010 + 0.00 + + + + + 4 + ULTRAPHO + ERE + C + 0.684 + 36.461 + 6.840 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10031.xml b/ZZZ_RECIPE/FIMAT/10031.xml new file mode 100644 index 00000000..340e388b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10031.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 118 + + + 10031 +
PATA-SHAN
+ + + + + + + + + + + + 0.24 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 118 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.178 + 74.167 + 1.780 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.004 + 1.667 + 0.040 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.020 + 8.333 + 0.200 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.034 + 14.167 + 0.340 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.004 + 1.667 + 0.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10032.xml b/ZZZ_RECIPE/FIMAT/10032.xml new file mode 100644 index 00000000..2117b509 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10032.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 121 + + + 10032 +
PATA-SHAN
+ + + + + + + + + + + + 0.12 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 121 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.119 + 98.347 + 1.190 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.002 + 1.653 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10033.xml b/ZZZ_RECIPE/FIMAT/10033.xml new file mode 100644 index 00000000..c8d4372b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10033.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 141 + + + 10033 +
PATA-SHAN
+ + + + + + + + + + + + 0.02 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 141 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + BLU + B A.C. + C + 0.009 + 47.368 + 0.090 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.001 + 5.263 + 0.010 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.009 + 47.368 + 0.090 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10034.xml b/ZZZ_RECIPE/FIMAT/10034.xml new file mode 100644 index 00000000..730de6d7 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10034.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 059 + + + 10034 +
PATA-SHAN
+ + + + + + + + + + + + 0.09 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 059 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.040 + 43.956 + 0.400 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.016 + 17.582 + 0.160 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.010 + 10.989 + 0.100 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.015 + 16.484 + 0.150 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.010 + 10.989 + 0.100 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10035.xml b/ZZZ_RECIPE/FIMAT/10035.xml new file mode 100644 index 00000000..f1813cd4 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10035.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 058 + + + 10035 +
PATA-SHAN
+ + + + + + + + + + + + 0.11 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 058 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.037 + 33.333 + 0.370 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.020 + 18.018 + 0.200 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.031 + 27.928 + 0.310 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.023 + 20.721 + 0.230 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10036.xml b/ZZZ_RECIPE/FIMAT/10036.xml new file mode 100644 index 00000000..4c4d4c48 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10036.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 151 + + + 10036 +
PATA-SHAN
+ + + + + + + + + + + + 0.45 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 151 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.149 + 33.333 + 1.490 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.289 + 64.653 + 2.890 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.004 + 0.895 + 0.040 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.005 + 1.119 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10037.xml b/ZZZ_RECIPE/FIMAT/10037.xml new file mode 100644 index 00000000..ea1b90c9 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10037.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 117 + + + 10037 +
PATA-SHAN
+ + + + + + + + + + + + 0.13 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 117 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.042 + 33.071 + 0.420 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.085 + 66.929 + 0.850 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10038.xml b/ZZZ_RECIPE/FIMAT/10038.xml new file mode 100644 index 00000000..d2881c8f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10038.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 119 + + + 10038 +
PATA-SHAN
+ + + + + + + + + + + + 0.28 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 119 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.104 + 37.818 + 1.040 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.022 + 8.000 + 0.220 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.119 + 43.273 + 1.190 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.030 + 10.909 + 0.300 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10039.xml b/ZZZ_RECIPE/FIMAT/10039.xml new file mode 100644 index 00000000..7e587250 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10039.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 064 + + + 10039 +
PATA-SHAN
+ + + + + + + + + + + + 0.22 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 064 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.071 + 32.719 + 0.710 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.047 + 21.659 + 0.470 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.051 + 23.502 + 0.510 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.012 + 5.530 + 0.120 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.036 + 16.590 + 0.360 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10040.xml b/ZZZ_RECIPE/FIMAT/10040.xml new file mode 100644 index 00000000..02e73ea1 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10040.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 065 + + + 10040 +
PATA-SHAN
+ + + + + + + + + + + + 0.65 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 065 + + 0001-01-01 00:00:00 + 0 + 0.007 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.119 + 18.224 + 1.190 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.459 + 70.291 + 4.590 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.046 + 7.044 + 0.460 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.029 + 4.441 + 0.290 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10041.xml b/ZZZ_RECIPE/FIMAT/10041.xml new file mode 100644 index 00000000..344bb8ed --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10041.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 115 + + + 10041 +
PATA-SHAN
+ + + + + + + + + + + + 0.25 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONNIA-SHANTUNG 115 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.197 + 78.175 + 1.970 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.006 + 2.381 + 0.060 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.021 + 8.333 + 0.210 + 0.00 + + + + + 4 + ULTRAPHO + ERE + C + 0.028 + 11.111 + 0.280 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10042.xml b/ZZZ_RECIPE/FIMAT/10042.xml new file mode 100644 index 00000000..057398a5 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10042.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PAT-SHA-FLA-PAN + + 028 + + + 10042 +
PATA-SHAN
+ + come panda 021 e fla + + + + + + + + + + 0.05 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come panda 021 e flash 021 PATAG-SHAN 028 + come panda 021 e flash 021 + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.009 + 16.981 + 0.090 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.041 + 77.359 + 0.410 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.003 + 5.660 + 0.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10043.xml b/ZZZ_RECIPE/FIMAT/10043.xml new file mode 100644 index 00000000..72c2f4ea --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10043.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 016 + + + 10043 +
PATA-SHAN
+ + + + + + + + + + + + 0.07 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 016 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.009 + 12.500 + 0.090 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.011 + 15.278 + 0.110 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.052 + 72.222 + 0.520 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10044.xml b/ZZZ_RECIPE/FIMAT/10044.xml new file mode 100644 index 00000000..16e72677 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10044.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 069 + + + 10044 +
PATA-SHAN
+ + + + + + + + + + + + 0.14 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 069 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.101 + 72.662 + 1.010 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.008 + 5.755 + 0.080 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.017 + 12.230 + 0.170 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.013 + 9.353 + 0.130 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10045.xml b/ZZZ_RECIPE/FIMAT/10045.xml new file mode 100644 index 00000000..74a68fc0 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10045.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 153 + + + 10045 +
PATA-SHAN
+ + + + + + + + + + + + 0.83 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 153 + + 0001-01-01 00:00:00 + 0 + 0.008 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.821 + 99.155 + 8.210 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.006 + 0.725 + 0.060 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.001 + 0.121 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10046.xml b/ZZZ_RECIPE/FIMAT/10046.xml new file mode 100644 index 00000000..c3904ad2 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10046.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 114 + + + 10046 +
PATA-SHAN
+ + + + + + + + + + + + 1.15 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 114 + + 0001-01-01 00:00:00 + 0 + 0.011 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.142 + 12.369 + 1.420 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.320 + 27.875 + 3.200 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.624 + 54.355 + 6.240 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.062 + 5.401 + 0.620 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10047.xml b/ZZZ_RECIPE/FIMAT/10047.xml new file mode 100644 index 00000000..b11e280d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10047.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 041 + + + 10047 +
PATA-SHAN
+ + + + + + + + + + + + 0.25 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 041 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.171 + 67.857 + 1.710 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.055 + 21.825 + 0.550 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.026 + 10.317 + 0.260 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10048.xml b/ZZZ_RECIPE/FIMAT/10048.xml new file mode 100644 index 00000000..7eba2c82 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10048.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 057 + + + 10048 +
PATA-SHAN
+ + + + + + + + + + + + 0.13 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 057 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.008 + 6.061 + 0.080 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.020 + 15.152 + 0.200 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.040 + 30.303 + 0.400 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.064 + 48.485 + 0.640 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10049.xml b/ZZZ_RECIPE/FIMAT/10049.xml new file mode 100644 index 00000000..f7af6444 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10049.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 029 + + + 10049 +
PATA-SHAN
+ + + + + + + + + + + + 0.06 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 029 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.054 + 87.097 + 0.540 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.007 + 11.290 + 0.070 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.001 + 1.613 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10050.xml b/ZZZ_RECIPE/FIMAT/10050.xml new file mode 100644 index 00000000..40b4598c --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10050.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 032 + + + 10050 +
PATA-SHAN
+ + + + + + + + + + + + 0.17 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 032 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.063 + 36.000 + 0.630 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.085 + 48.571 + 0.850 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.026 + 14.857 + 0.260 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.001 + 0.571 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10051.xml b/ZZZ_RECIPE/FIMAT/10051.xml new file mode 100644 index 00000000..a9e4c700 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10051.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 071 + + + 10051 +
PATA-SHAN
+ + + + + + + + + + + + 1.67 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 071 + + 0001-01-01 00:00:00 + 0 + 0.017 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.698 + 41.771 + 6.980 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.631 + 37.762 + 6.310 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.314 + 18.791 + 3.140 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.028 + 1.676 + 0.280 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10052.xml b/ZZZ_RECIPE/FIMAT/10052.xml new file mode 100644 index 00000000..f09b0a65 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10052.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 102 + + + 10052 +
PATA-SHAN
+ + + + + + + + + + + + 0.22 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 102 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.202 + 90.991 + 2.020 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.016 + 7.207 + 0.160 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.004 + 1.802 + 0.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10053.xml b/ZZZ_RECIPE/FIMAT/10053.xml new file mode 100644 index 00000000..8b8cb85b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10053.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 067 + + + 10053 +
PATA-SHAN
+ + + + + + + + + + + + 0.22 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 067 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.183 + 83.182 + 1.830 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.015 + 6.818 + 0.150 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.022 + 10.000 + 0.220 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10054.xml b/ZZZ_RECIPE/FIMAT/10054.xml new file mode 100644 index 00000000..bd93c314 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10054.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN-FLASH + + 034 + + + 10054 +
PATA-SHAN
+ + come flash 003 + + + + + + + + + + 0.19 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come flash 003 PATAGONIA-SHANTUNG 034 + come flash 003 + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.163 + 86.243 + 1.630 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.012 + 6.349 + 0.120 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.014 + 7.407 + 0.140 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10055.xml b/ZZZ_RECIPE/FIMAT/10055.xml new file mode 100644 index 00000000..4d1a6941 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10055.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 123 + + + 10055 +
PATA-SHAN
+ + + + + + + + + + + + 0.12 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 123 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.094 + 80.342 + 0.940 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.021 + 17.949 + 0.210 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.002 + 1.709 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10056.xml b/ZZZ_RECIPE/FIMAT/10056.xml new file mode 100644 index 00000000..91bfffa3 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10056.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 035 + + + 10056 +
PATA-SHAN
+ + + + + + + + + + + + 0.15 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA 035 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.126 + 82.895 + 1.260 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.015 + 9.868 + 0.150 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.011 + 7.237 + 0.110 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10057.xml b/ZZZ_RECIPE/FIMAT/10057.xml new file mode 100644 index 00000000..57ace4a5 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10057.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN-FLASH + + 072 + + + 10057 +
PATA-SHAN
+ + come flash 161 + + + + + + + + + + 1.11 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come flash 161 PATAGONIA-SHANTUNG 072 + come flash 161 + 0001-01-01 00:00:00 + 0 + 0.011 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.877 + 78.867 + 8.770 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.235 + 21.133 + 2.350 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10058.xml b/ZZZ_RECIPE/FIMAT/10058.xml new file mode 100644 index 00000000..ae7cd7b5 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10058.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 073 + + + 10058 +
PATA-SHAN
+ + + + + + + + + + + + 0.57 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 073 + + 0001-01-01 00:00:00 + 0 + 0.006 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.432 + 75.130 + 4.320 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.127 + 22.087 + 1.270 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.016 + 2.783 + 0.160 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10059.xml b/ZZZ_RECIPE/FIMAT/10059.xml new file mode 100644 index 00000000..021f4f7d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10059.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 068 + + + 10059 +
PATA-SHAN
+ + + + + + + + + + + + 0.09 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 068 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.069 + 80.233 + 0.690 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.008 + 9.302 + 0.080 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.009 + 10.465 + 0.090 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10060.xml b/ZZZ_RECIPE/FIMAT/10060.xml new file mode 100644 index 00000000..23eaa2ea --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10060.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 124 + + + 10060 +
PATA-SHAN
+ + + + + + + + + + + + 7.70 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 124 + + 0001-01-01 00:00:00 + 0 + 0.077 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 7.700 + 100.000 + 77.000 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10061.xml b/ZZZ_RECIPE/FIMAT/10061.xml new file mode 100644 index 00000000..ccd64f9d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10061.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 126 + + + 10061 +
PATA-SHAN
+ + + + + + + + + + + + 1.99 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 126 + + 0001-01-01 00:00:00 + 0 + 0.020 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 1.826 + 91.575 + 18.260 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.073 + 3.661 + 0.730 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.095 + 4.764 + 0.950 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10062.xml b/ZZZ_RECIPE/FIMAT/10062.xml new file mode 100644 index 00000000..2972f734 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10062.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 053 + + + 10062 +
PATA-SHAN
+ + + + + + + + + + + + 0.20 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATTAGONIA-SHANTUNG 053 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.043 + 20.976 + 0.430 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.029 + 14.146 + 0.290 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.063 + 30.732 + 0.630 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.070 + 34.146 + 0.700 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10063.xml b/ZZZ_RECIPE/FIMAT/10063.xml new file mode 100644 index 00000000..347a4a78 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10063.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 602 + + + 10063 +
PATA-SHAN
+ + + + + + + + + + + + 1.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 602 + + 0001-01-01 00:00:00 + 0 + 0.010 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.883 + 84.660 + 8.830 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.129 + 12.368 + 1.290 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.031 + 2.972 + 0.310 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10064.xml b/ZZZ_RECIPE/FIMAT/10064.xml new file mode 100644 index 00000000..9b198444 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10064.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 103 + + + 10064 +
PATA-SHAN
+ + + + + + + + + + + + 1.66 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 103 + + 0001-01-01 00:00:00 + 0 + 0.017 + 0.00 +
+
+ + + 1 + BLU + B A.C. + C + 1.665 + 100.000 + 16.650 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10065.xml b/ZZZ_RECIPE/FIMAT/10065.xml new file mode 100644 index 00000000..f3abd67b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10065.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 603 + + + 10065 +
PATA-SHAN
+ + + + + + + + + + + + 1.34 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 603 + + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.880 + 65.476 + 8.800 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.352 + 26.190 + 3.520 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.112 + 8.333 + 1.120 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10066.xml b/ZZZ_RECIPE/FIMAT/10066.xml new file mode 100644 index 00000000..89297241 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10066.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 125 + + + 10066 +
PATA-SHAN
+ + + + + + + + + + + + 2.38 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 125 + + 0001-01-01 00:00:00 + 0 + 0.024 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 2.270 + 95.218 + 22.700 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.018 + 0.755 + 0.180 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.096 + 4.027 + 0.960 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10067.xml b/ZZZ_RECIPE/FIMAT/10067.xml new file mode 100644 index 00000000..1cc9a767 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10067.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 142 + + + 10067 +
PATA-SHAN
+ + + + + + + + + + + + 0.16 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 142 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + NERO + CF A.C + C + 0.012 + 7.407 + 0.120 + 0.00 + + + + + 2 + COLANVIO + RL132 + C + 0.150 + 92.593 + 1.500 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10068.xml b/ZZZ_RECIPE/FIMAT/10068.xml new file mode 100644 index 00000000..eb2b4531 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10068.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 074 + + + 10068 +
PATA-SHAN
+ + + + + + + + + + + + 2.66 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 074 + + 0001-01-01 00:00:00 + 0 + 0.027 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.723 + 64.799 + 17.230 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.410 + 15.419 + 4.100 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.526 + 19.782 + 5.260 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10069.xml b/ZZZ_RECIPE/FIMAT/10069.xml new file mode 100644 index 00000000..5db84c9d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10069.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 143 + + + 10069 +
PATA-SHAN
+ + PRINTOFIX ROSA1,098% + + + + + + + + + + 1.28 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PRINTOFIX ROSA1.098% CONC PATAG-SHAN 143 + PRINTOFIX ROSA1,098% CONC + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.128 + 10.008 + 1.280 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.046 + 3.597 + 0.460 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.007 + 0.547 + 0.070 + 0.00 + + + + + 4 + COLANVIO + RL132 + C + 1.098 + 85.848 + 10.980 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10070.xml b/ZZZ_RECIPE/FIMAT/10070.xml new file mode 100644 index 00000000..70df6f68 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10070.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 144 + + + 10070 +
PATA-SHAN
+ + + + + + + + + + + + 1.96 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 144 + + 0001-01-01 00:00:00 + 0 + 0.020 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.644 + 32.924 + 6.440 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.736 + 37.628 + 7.360 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.576 + 29.448 + 5.760 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10071.xml b/ZZZ_RECIPE/FIMAT/10071.xml new file mode 100644 index 00000000..b229ef7f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10071.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 003 + + + 10071 +
CONTRACT
+ + + + + + + + + + + + 0.31 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRACT 003 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.163 + 52.412 + 1.630 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.115 + 36.977 + 1.150 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.001 + 0.322 + 0.010 + 0.00 + + + + + 4 + ROSSO + FTL AC + C + 0.017 + 5.466 + 0.170 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.015 + 4.823 + 0.150 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10072.xml b/ZZZ_RECIPE/FIMAT/10072.xml new file mode 100644 index 00000000..f8a68db3 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10072.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 004 + + + 10072 +
CONTRACT
+ + + + + + + + + + + + 0.20 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRACT 004 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.028 + 14.000 + 0.280 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.123 + 61.500 + 1.230 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.035 + 17.500 + 0.350 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.014 + 7.000 + 0.140 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10073.xml b/ZZZ_RECIPE/FIMAT/10073.xml new file mode 100644 index 00000000..c8f28620 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10073.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 005 + + + 10073 +
CONTRACT
+ + + + + + + + + + + + 0.52 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRACT 005 + + 0001-01-01 00:00:00 + 0 + 0.005 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.453 + 87.452 + 4.530 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.014 + 2.703 + 0.140 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.003 + 0.579 + 0.030 + 0.00 + + + + + 4 + ROSSO + FTL AC + C + 0.003 + 0.579 + 0.030 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.045 + 8.687 + 0.450 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10074.xml b/ZZZ_RECIPE/FIMAT/10074.xml new file mode 100644 index 00000000..8d40b0b6 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10074.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 051 + + + 10074 +
CONTRACT
+ + + + + + + + + + + + 0.67 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRACT 051 + + 0001-01-01 00:00:00 + 0 + 0.007 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.508 + 76.048 + 5.080 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.039 + 5.838 + 0.390 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.012 + 1.796 + 0.120 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.023 + 3.443 + 0.230 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.086 + 12.874 + 0.860 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10075.xml b/ZZZ_RECIPE/FIMAT/10075.xml new file mode 100644 index 00000000..2c665379 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10075.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 052 + + + 10075 +
CONTRACT
+ + + + + + + + + + + + 0.16 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRACT 052 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.070 + 42.945 + 0.700 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.012 + 7.362 + 0.120 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.021 + 12.883 + 0.210 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.017 + 10.429 + 0.170 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.043 + 26.380 + 0.430 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10076.xml b/ZZZ_RECIPE/FIMAT/10076.xml new file mode 100644 index 00000000..380d582e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10076.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 062 + + + 10076 +
CONTRACT
+ + + + + + + + + + + + 0.99 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRACT 062 + + 0001-01-01 00:00:00 + 0 + 0.010 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.703 + 70.938 + 7.030 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.075 + 7.568 + 0.750 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.100 + 10.091 + 1.000 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.113 + 11.403 + 1.130 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10077.xml b/ZZZ_RECIPE/FIMAT/10077.xml new file mode 100644 index 00000000..e93d0064 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10077.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 113 + + + 10077 +
CONTRACT
+ + + + + + + + + + + + 1.30 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRACT 113 + + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.568 + 43.625 + 5.680 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.252 + 19.355 + 2.520 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.482 + 37.020 + 4.820 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10078.xml b/ZZZ_RECIPE/FIMAT/10078.xml new file mode 100644 index 00000000..ca0c72c1 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10078.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 000 + + + 10078 +
CONTRACT
+ + + + + + + + + + + + 0.06 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRACT 000 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.064 + 100.000 + 0.640 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10079.xml b/ZZZ_RECIPE/FIMAT/10079.xml new file mode 100644 index 00000000..9daa4298 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10079.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + CONTRACT + + 002 + + + 10079 +
CONTRACT
+ + + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + CONTRAACT 002 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.007 + 17.949 + 0.070 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.027 + 69.231 + 0.270 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.003 + 7.692 + 0.030 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 5.128 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10080.xml b/ZZZ_RECIPE/FIMAT/10080.xml new file mode 100644 index 00000000..cb75729b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10080.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 000 + + + 10080 +
MIAMI
+ + + + + + + + + + + + 0.28 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 000 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.285 + 100.000 + 2.850 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10081.xml b/ZZZ_RECIPE/FIMAT/10081.xml new file mode 100644 index 00000000..8c549e40 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10081.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 002 + + + 10081 +
MIAMI
+ + + + + + + + + + + + 0.09 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 002 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.070 + 77.778 + 0.700 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.016 + 17.778 + 0.160 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.002 + 2.222 + 0.020 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 2.222 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10082.xml b/ZZZ_RECIPE/FIMAT/10082.xml new file mode 100644 index 00000000..11c94e88 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10082.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 021 + + + 10082 +
MIAMI
+ + + + + + + + + + + + 0.71 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 021 + + 0001-01-01 00:00:00 + 0 + 0.007 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.492 + 69.688 + 4.920 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.182 + 25.779 + 1.820 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.022 + 3.116 + 0.220 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.010 + 1.416 + 0.100 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10083.xml b/ZZZ_RECIPE/FIMAT/10083.xml new file mode 100644 index 00000000..d8aa8747 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10083.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 023 + + + 10083 +
MIAMI
+ + + + + + + + + + + + 1.25 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 023 + + 0001-01-01 00:00:00 + 0 + 0.012 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.479 + 38.412 + 4.790 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.564 + 45.229 + 5.640 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.175 + 14.034 + 1.750 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.029 + 2.326 + 0.290 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10084.xml b/ZZZ_RECIPE/FIMAT/10084.xml new file mode 100644 index 00000000..539d4f14 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10084.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 005 + + + 10084 +
MIAMI
+ + + + + + + + + + + + 0.03 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 005 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.013 + 44.828 + 0.130 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.011 + 37.931 + 0.110 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 17.241 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10085.xml b/ZZZ_RECIPE/FIMAT/10085.xml new file mode 100644 index 00000000..a8bb0856 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10085.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 051 + + + 10085 +
MIAMI
+ + + + + + + + + + + + 0.10 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 051 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.041 + 41.837 + 0.410 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.007 + 7.143 + 0.070 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.011 + 11.224 + 0.110 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.014 + 14.286 + 0.140 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.025 + 25.510 + 0.250 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10086.xml b/ZZZ_RECIPE/FIMAT/10086.xml new file mode 100644 index 00000000..ec90c9e6 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10086.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 006 + + + 10086 +
MIAMI
+ + + + + + + + + + + + 0.75 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 006 + + 0001-01-01 00:00:00 + 0 + 0.007 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.586 + 78.658 + 5.860 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.094 + 12.617 + 0.940 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.012 + 1.611 + 0.120 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.035 + 4.698 + 0.350 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.018 + 2.416 + 0.180 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10087.xml b/ZZZ_RECIPE/FIMAT/10087.xml new file mode 100644 index 00000000..f3551f07 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10087.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 011 + + + 10087 +
MIAMI
+ + + + + + + + + + + + 0.90 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 011 + + 0001-01-01 00:00:00 + 0 + 0.009 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.665 + 73.971 + 6.650 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.013 + 1.446 + 0.130 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.075 + 8.343 + 0.750 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.133 + 14.794 + 1.330 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.013 + 1.446 + 0.130 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10088.xml b/ZZZ_RECIPE/FIMAT/10088.xml new file mode 100644 index 00000000..acc31e3c --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10088.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 022 + + + 10088 +
MIAMI
+ + + + + + + + + + + + 0.02 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 022 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.006 + 31.579 + 0.060 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.007 + 36.842 + 0.070 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.006 + 31.579 + 0.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10089.xml b/ZZZ_RECIPE/FIMAT/10089.xml new file mode 100644 index 00000000..1300739d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10089.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 003 + + + 10089 +
MIAMI
+ + + + + + + + + + + + 0.60 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 003 + + 0001-01-01 00:00:00 + 0 + 0.006 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.479 + 79.305 + 4.790 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.085 + 14.073 + 0.850 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.040 + 6.623 + 0.400 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10090.xml b/ZZZ_RECIPE/FIMAT/10090.xml new file mode 100644 index 00000000..59582d88 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10090.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 031 + + + 10090 +
MIAMI
+ + + + + + + + + + + + 1.36 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 031 + + 0001-01-01 00:00:00 + 0 + 0.014 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.578 + 42.500 + 5.780 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.165 + 12.132 + 1.650 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.431 + 31.691 + 4.310 + 0.00 + + + + + 4 + ROSSO + FTL AC + C + 0.083 + 6.103 + 0.830 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.103 + 7.574 + 1.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10091.xml b/ZZZ_RECIPE/FIMAT/10091.xml new file mode 100644 index 00000000..ba7839ec --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10091.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 013 + + + 10091 +
MIAMI
+ + + + + + + + + + + + 0.08 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 013 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.005 + 6.098 + 0.050 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.060 + 73.171 + 0.600 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.005 + 6.098 + 0.050 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.012 + 14.634 + 0.120 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10092.xml b/ZZZ_RECIPE/FIMAT/10092.xml new file mode 100644 index 00000000..70a85358 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10092.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 131 + + + 10092 +
MIAMI
+ + + + + + + + + + + + 0.30 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 131 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.019 + 6.333 + 0.190 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.243 + 81.000 + 2.430 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.038 + 12.667 + 0.380 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10093.xml b/ZZZ_RECIPE/FIMAT/10093.xml new file mode 100644 index 00000000..6f5afacf --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10093.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 061 + + + 10093 +
MIAMI
+ + + + + + + + + + + + 0.18 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 061 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.107 + 59.777 + 1.070 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.019 + 10.615 + 0.190 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.048 + 26.816 + 0.480 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.005 + 2.793 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10094.xml b/ZZZ_RECIPE/FIMAT/10094.xml new file mode 100644 index 00000000..7d1aac46 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10094.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 062 + + + 10094 +
MIAMI
+ + + + + + + + + + + + 2.70 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIMAMI 062 + + 0001-01-01 00:00:00 + 0 + 0.027 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 2.540 + 94.004 + 25.400 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.154 + 5.699 + 1.540 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.008 + 0.296 + 0.080 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10095.xml b/ZZZ_RECIPE/FIMAT/10095.xml new file mode 100644 index 00000000..db518d62 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10095.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 063 + + + 10095 +
MIAMI
+ + + + + + + + + + + + 1.96 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 063 + + 0001-01-01 00:00:00 + 0 + 0.020 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.529 + 78.130 + 15.290 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.428 + 21.870 + 4.280 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10096.xml b/ZZZ_RECIPE/FIMAT/10096.xml new file mode 100644 index 00000000..52073337 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10096.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 015 + + + 10096 +
MIAMI
+ + + + + + + + + + + + 1.11 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 015 + + 0001-01-01 00:00:00 + 0 + 0.011 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.094 + 99.005 + 10.940 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.007 + 0.633 + 0.070 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.004 + 0.362 + 0.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10097.xml b/ZZZ_RECIPE/FIMAT/10097.xml new file mode 100644 index 00000000..663739ae --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10097.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 151 + + + 10097 +
MIAMI
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 151 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.095 + 32.759 + 0.950 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.190 + 65.517 + 1.900 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 1.724 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10098.xml b/ZZZ_RECIPE/FIMAT/10098.xml new file mode 100644 index 00000000..ca6d341f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10098.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 152 + + + 10098 +
MIAMI
+ + + + + + + + + + + + 0.90 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 152 + + 0001-01-01 00:00:00 + 0 + 0.009 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.285 + 31.596 + 2.850 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.570 + 63.193 + 5.700 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.036 + 3.991 + 0.360 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.011 + 1.220 + 0.110 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10099.xml b/ZZZ_RECIPE/FIMAT/10099.xml new file mode 100644 index 00000000..b237cc61 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10099.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 153 + + + 10099 +
MIAMI
+ + + + + + + + + + + + 0.30 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 153 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.095 + 31.667 + 0.950 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.190 + 63.333 + 1.900 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.010 + 3.333 + 0.100 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.005 + 1.667 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10100.xml b/ZZZ_RECIPE/FIMAT/10100.xml new file mode 100644 index 00000000..05b762eb --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10100.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 007 + + + 10100 +
MIAMI
+ + + + + + + + + + + + 2.32 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 007 + + 0001-01-01 00:00:00 + 0 + 0.023 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.410 + 60.907 + 14.100 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.691 + 29.849 + 6.910 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.214 + 9.244 + 2.140 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10101.xml b/ZZZ_RECIPE/FIMAT/10101.xml new file mode 100644 index 00000000..c24117d8 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10101.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 111 + + + 10101 +
MIAMI
+ + + + + + + + + + + + 0.26 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 111 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.200 + 77.220 + 2.000 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.025 + 9.653 + 0.250 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.031 + 11.969 + 0.310 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.003 + 1.158 + 0.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10102.xml b/ZZZ_RECIPE/FIMAT/10102.xml new file mode 100644 index 00000000..af724e29 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10102.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 112 + + + 10102 +
MIAMI
+ + + + + + + + + + + + 0.44 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 112 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.333 + 75.854 + 3.330 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.024 + 5.467 + 0.240 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.077 + 17.540 + 0.770 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.005 + 1.139 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10103.xml b/ZZZ_RECIPE/FIMAT/10103.xml new file mode 100644 index 00000000..8e0a29b2 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10103.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 113 + + + 10103 +
MIAMI
+ + + + + + + + + + + + 3.01 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 113 + + 0001-01-01 00:00:00 + 0 + 0.030 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 2.394 + 79.614 + 23.940 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.103 + 3.425 + 1.030 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.479 + 15.929 + 4.790 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.031 + 1.031 + 0.310 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10104.xml b/ZZZ_RECIPE/FIMAT/10104.xml new file mode 100644 index 00000000..3ac3c576 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10104.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 114 + + + 10104 +
MIAMI
+ + + + + + + + + + + + 1.32 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 114 + + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + BLU + B A.C. + C + 0.832 + 62.840 + 8.320 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.133 + 10.045 + 1.330 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.359 + 27.115 + 3.590 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10105.xml b/ZZZ_RECIPE/FIMAT/10105.xml new file mode 100644 index 00000000..d633d9cc --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10105.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 053 + + + 10105 +
MIAMI
+ + + + + + + + + + + + 0.19 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 053 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.095 + 48.718 + 0.950 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.083 + 42.564 + 0.830 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.017 + 8.718 + 0.170 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10106.xml b/ZZZ_RECIPE/FIMAT/10106.xml new file mode 100644 index 00000000..dee05cb5 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10106.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 052 + + + 10106 +
MIAMI
+ + + + + + + + + + + + 0.15 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 052 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.056 + 37.838 + 0.560 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.059 + 39.865 + 0.590 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.033 + 22.297 + 0.330 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10107.xml b/ZZZ_RECIPE/FIMAT/10107.xml new file mode 100644 index 00000000..3b49383c --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10107.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 024 + + + 10107 +
MIAMI
+ + + + + + + + + + + + 0.08 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 024 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.050 + 59.524 + 0.500 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.024 + 28.571 + 0.240 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.007 + 8.333 + 0.070 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.003 + 3.571 + 0.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10108.xml b/ZZZ_RECIPE/FIMAT/10108.xml new file mode 100644 index 00000000..dd9797d4 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10108.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 115 + + + 10108 +
MIAMI
+ + + + + + + + + + + + 0.20 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 115 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.062 + 30.846 + 0.620 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.139 + 69.154 + 1.390 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10109.xml b/ZZZ_RECIPE/FIMAT/10109.xml new file mode 100644 index 00000000..99e5e6c4 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10109.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 016 + + + 10109 +
MIAMI
+ + + + + + + + + + + + 0.47 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 016 + + 0001-01-01 00:00:00 + 0 + 0.005 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.413 + 88.060 + 4.130 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.055 + 11.727 + 0.550 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.001 + 0.213 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10110.xml b/ZZZ_RECIPE/FIMAT/10110.xml new file mode 100644 index 00000000..9fff6a74 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10110.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + MIMAMI + + 154 + + + 10110 +
MIAMI
+ + + + + + + + + + + + 0.45 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 154 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.170 + 37.778 + 1.700 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.280 + 62.222 + 2.800 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10111.xml b/ZZZ_RECIPE/FIMAT/10111.xml new file mode 100644 index 00000000..0133791f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10111.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 012 + + + 10111 +
MIAMI
+ + + + + + + + + + + + 0.25 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 012 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.142 + 57.028 + 1.420 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.090 + 36.145 + 0.900 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.015 + 6.024 + 0.150 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 0.803 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10112.xml b/ZZZ_RECIPE/FIMAT/10112.xml new file mode 100644 index 00000000..1798889e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10112.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 064 + + + 10112 +
MIAMI
+ + + + + + + + + + + + 0.42 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 064 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.394 + 93.587 + 3.940 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.020 + 4.751 + 0.200 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.007 + 1.663 + 0.070 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10113.xml b/ZZZ_RECIPE/FIMAT/10113.xml new file mode 100644 index 00000000..e92ca97a --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10113.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 025 + + + 10113 +
MIAMI
+ + + + + + + + + + + + 0.20 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 025 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.149 + 74.874 + 1.490 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.031 + 15.578 + 0.310 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.019 + 9.548 + 0.190 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10114.xml b/ZZZ_RECIPE/FIMAT/10114.xml new file mode 100644 index 00000000..c768eff3 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10114.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 121 + + + 10114 +
MIAMI
+ + + + + + + + + + + + 0.37 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 121 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.214 + 57.219 + 2.140 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.128 + 34.225 + 1.280 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.030 + 8.021 + 0.300 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 0.535 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10115.xml b/ZZZ_RECIPE/FIMAT/10115.xml new file mode 100644 index 00000000..856f882e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10115.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMAI + + 071 + + + 10115 +
MIAMI
+ + + + + + + + + + + + 1.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 071 + + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.578 + 44.771 + 5.780 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.344 + 26.646 + 3.440 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.369 + 28.582 + 3.690 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10116.xml b/ZZZ_RECIPE/FIMAT/10116.xml new file mode 100644 index 00000000..75e4c644 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10116.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 116 + + + 10116 +
MIAMI
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 116 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.173 + 58.844 + 1.730 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.057 + 19.388 + 0.570 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.064 + 21.769 + 0.640 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10117.xml b/ZZZ_RECIPE/FIMAT/10117.xml new file mode 100644 index 00000000..ed7a7a16 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10117.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 122 + + + 10117 +
MIAMI
+ + + + + + + + + + + + 2.58 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 122 + + 0001-01-01 00:00:00 + 0 + 0.026 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.054 + 2.093 + 0.540 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 2.526 + 97.907 + 25.260 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10118.xml b/ZZZ_RECIPE/FIMAT/10118.xml new file mode 100644 index 00000000..4757433f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10118.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 132 + + + 10118 +
MIAMI
+ + + + + + + + + + + + 2.75 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAAMI 132 + + 0001-01-01 00:00:00 + 0 + 0.028 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.472 + 53.450 + 14.720 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.692 + 25.127 + 6.920 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.590 + 21.423 + 5.900 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10119.xml b/ZZZ_RECIPE/FIMAT/10119.xml new file mode 100644 index 00000000..5fe6540d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10119.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 155 + + + 10119 +
MIAMI
+ + + + + + + + + + + + 2.10 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 155 + + 0001-01-01 00:00:00 + 0 + 0.021 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 2.063 + 98.145 + 20.630 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.039 + 1.855 + 0.390 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10120.xml b/ZZZ_RECIPE/FIMAT/10120.xml new file mode 100644 index 00000000..fe9a68f8 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10120.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 054 + + + 10120 +
MIAMI
+ + + + + + + + + + + + 0.02 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 054 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.004 + 22.222 + 0.040 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.006 + 33.333 + 0.060 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.006 + 33.333 + 0.060 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 11.111 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10121.xml b/ZZZ_RECIPE/FIMAT/10121.xml new file mode 100644 index 00000000..1f1a0231 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10121.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 055 + + + 10121 +
MIAMI
+ + + + + + + + + + + + 2.72 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 055 + + 0001-01-01 00:00:00 + 0 + 0.027 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.717 + 26.389 + 7.170 + 0.00 + + + + + 2 + NERO + CF A.C + C + 2.000 + 73.611 + 20.000 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10122.xml b/ZZZ_RECIPE/FIMAT/10122.xml new file mode 100644 index 00000000..8355ea04 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10122.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 072 + + + 10122 +
MIAMI
+ + + + + + + + + + + + 0.16 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 072 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.078 + 47.561 + 0.780 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.010 + 6.098 + 0.100 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.076 + 46.341 + 0.760 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10123.xml b/ZZZ_RECIPE/FIMAT/10123.xml new file mode 100644 index 00000000..0c153d01 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10123.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + MIAMI + + 133 + + + 10123 +
MIAMI
+ + + + + + + + + + + + 0.56 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 133 + + 0001-01-01 00:00:00 + 0 + 0.006 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.220 + 39.286 + 2.200 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.340 + 60.714 + 3.400 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10124.xml b/ZZZ_RECIPE/FIMAT/10124.xml new file mode 100644 index 00000000..dee4af57 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10124.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + MIMAMI + + 161 + + + 10124 +
MIAMI
+ + + + + + + + + + + + 4.35 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + MIAMI 161 + + 0001-01-01 00:00:00 + 0 + 0.044 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 3.200 + 73.496 + 32.000 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 1.154 + 26.504 + 11.540 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10125.xml b/ZZZ_RECIPE/FIMAT/10125.xml new file mode 100644 index 00000000..cc7641ff --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10125.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 001 + + + 10125 +
VENTO
+ + + + + + + + + + + + 0.21 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 001 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.206 + 100.000 + 2.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10126.xml b/ZZZ_RECIPE/FIMAT/10126.xml new file mode 100644 index 00000000..a3bedbea --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10126.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 002 + + + 10126 +
VENTO
+ + + + + + + + + + + + 0.31 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 002 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.274 + 88.387 + 2.740 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.020 + 6.452 + 0.200 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.016 + 5.161 + 0.160 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10127.xml b/ZZZ_RECIPE/FIMAT/10127.xml new file mode 100644 index 00000000..54f6c0a1 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10127.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 005 + + + 10127 +
VENTO
+ + + + + + + + + + + + 0.03 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 005 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.004 + 12.121 + 0.040 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.011 + 33.333 + 0.110 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.010 + 30.303 + 0.100 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.008 + 24.242 + 0.080 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10128.xml b/ZZZ_RECIPE/FIMAT/10128.xml new file mode 100644 index 00000000..87422c6d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10128.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 023 + + + 10128 +
VENTO
+ + + + + + + + + + + + 0.17 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 023 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.136 + 80.000 + 1.360 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.012 + 7.059 + 0.120 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.012 + 7.059 + 0.120 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.010 + 5.882 + 0.100 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10129.xml b/ZZZ_RECIPE/FIMAT/10129.xml new file mode 100644 index 00000000..90749e48 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10129.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 051 + + + 10129 +
VENTO
+ + + + + + + + + + + + 0.10 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 051 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.013 + 12.871 + 0.130 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.019 + 18.812 + 0.190 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.021 + 20.792 + 0.210 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.048 + 47.525 + 0.480 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10130.xml b/ZZZ_RECIPE/FIMAT/10130.xml new file mode 100644 index 00000000..9eab8994 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10130.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 011 + + + 10130 +
VENTO
+ + + + + + + + + + + + 0.05 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTO 011 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.004 + 7.547 + 0.040 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.016 + 30.189 + 0.160 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.029 + 54.717 + 0.290 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.004 + 7.547 + 0.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10131.xml b/ZZZ_RECIPE/FIMAT/10131.xml new file mode 100644 index 00000000..fa8aa4f8 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10131.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 111 + + + 10131 +
VENTO
+ + + + + + + + + + + + 0.16 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 111 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.060 + 37.267 + 0.600 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.063 + 39.130 + 0.630 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.038 + 23.602 + 0.380 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10132.xml b/ZZZ_RECIPE/FIMAT/10132.xml new file mode 100644 index 00000000..f1cc2462 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10132.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 006 + + + 10132 +
VENTO
+ + + + + + + + + + + + 0.21 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 006 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.124 + 57.944 + 1.240 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.076 + 35.514 + 0.760 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.014 + 6.542 + 0.140 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10133.xml b/ZZZ_RECIPE/FIMAT/10133.xml new file mode 100644 index 00000000..d19894f8 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10133.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 024 + + + 10133 +
VENTO
+ + + + + + + + + + + + 0.44 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 024 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.322 + 72.360 + 3.220 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.070 + 15.730 + 0.700 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.039 + 8.764 + 0.390 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.014 + 3.146 + 0.140 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10134.xml b/ZZZ_RECIPE/FIMAT/10134.xml new file mode 100644 index 00000000..940c053b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10134.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 112 + + + 10134 +
VENTO
+ + + + + + + + + + + + 0.39 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 112 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.102 + 26.020 + 1.020 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.290 + 73.980 + 2.900 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10135.xml b/ZZZ_RECIPE/FIMAT/10135.xml new file mode 100644 index 00000000..d805dd05 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10135.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 025 + + + 10135 +
VENTO
+ + + + + + + + + + + + 0.25 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 025 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.181 + 72.400 + 1.810 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.025 + 10.000 + 0.250 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.032 + 12.800 + 0.320 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.012 + 4.800 + 0.120 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10136.xml b/ZZZ_RECIPE/FIMAT/10136.xml new file mode 100644 index 00000000..4e78d160 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10136.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 026 + + + 10136 +
VENTO
+ + + + + + + + + + + + 0.27 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 026 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.200 + 75.188 + 2.000 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.038 + 14.286 + 0.380 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.017 + 6.391 + 0.170 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.011 + 4.135 + 0.110 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10137.xml b/ZZZ_RECIPE/FIMAT/10137.xml new file mode 100644 index 00000000..a0bfcec3 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10137.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 053 + + + 10137 +
VENTO
+ + + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 053 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.013 + 36.111 + 0.130 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.002 + 5.556 + 0.020 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.021 + 58.333 + 0.210 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10138.xml b/ZZZ_RECIPE/FIMAT/10138.xml new file mode 100644 index 00000000..5944729d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10138.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 062 + + + 10138 +
VENTO
+ + + + + + + + + + + + 3.54 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 062 + + 0001-01-01 00:00:00 + 0 + 0.035 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 3.117 + 87.951 + 31.170 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.368 + 10.384 + 3.680 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.059 + 1.665 + 0.590 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10139.xml b/ZZZ_RECIPE/FIMAT/10139.xml new file mode 100644 index 00000000..1705b989 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10139.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 052 + + + 10139 +
VENTO
+ + + + + + + + + + + + 0.33 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 052 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.040 + 12.232 + 0.400 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.023 + 7.034 + 0.230 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.053 + 16.208 + 0.530 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.211 + 64.526 + 2.110 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10140.xml b/ZZZ_RECIPE/FIMAT/10140.xml new file mode 100644 index 00000000..bee26c65 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10140.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 061 + + + 10140 +
VENTO
+ + + + + + + + + + + + 0.18 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 061 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.132 + 73.743 + 1.320 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.047 + 26.257 + 0.470 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10141.xml b/ZZZ_RECIPE/FIMAT/10141.xml new file mode 100644 index 00000000..5178ee18 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10141.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 113 + + + 10141 +
VENTO
+ + + + + + + + + + + + 1.41 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 113 + + 0001-01-01 00:00:00 + 0 + 0.014 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.450 + 31.960 + 4.500 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.958 + 68.040 + 9.580 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10142.xml b/ZZZ_RECIPE/FIMAT/10142.xml new file mode 100644 index 00000000..71f04833 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10142.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 015 + + + 10142 +
VENTO
+ + + + + + + + + + + + 1.30 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 015 + + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.397 + 30.562 + 3.970 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.877 + 67.513 + 8.770 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.025 + 1.925 + 0.250 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10143.xml b/ZZZ_RECIPE/FIMAT/10143.xml new file mode 100644 index 00000000..b4b3f318 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10143.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 027 + + + 10143 +
VENTO
+ + + + + + + + + + + + 0.09 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 027 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.071 + 81.609 + 0.710 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.006 + 6.897 + 0.060 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.006 + 6.897 + 0.060 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.004 + 4.598 + 0.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10144.xml b/ZZZ_RECIPE/FIMAT/10144.xml new file mode 100644 index 00000000..173f72c6 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10144.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 028 + + + 10144 +
VENTO
+ + Vedi Pirovano + + + + + + + + + + 0.06 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + Vedi Pirovano VENTOFR 028 + Vedi Pirovano + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.050 + 81.967 + 0.500 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.010 + 16.393 + 0.100 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.001 + 1.639 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10145.xml b/ZZZ_RECIPE/FIMAT/10145.xml new file mode 100644 index 00000000..7cad9f6f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10145.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 029 + + + 10145 +
VENTO
+ + + + + + + + + + + + 0.19 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 029 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.180 + 93.264 + 1.800 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.013 + 6.736 + 0.130 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10146.xml b/ZZZ_RECIPE/FIMAT/10146.xml new file mode 100644 index 00000000..665e3787 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10146.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 054 + + + 10146 +
VENTO
+ + + + + + + + + + + + 0.06 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTO FR 054 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.007 + 12.281 + 0.070 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.011 + 19.298 + 0.110 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.012 + 21.053 + 0.120 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.027 + 47.368 + 0.270 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10147.xml b/ZZZ_RECIPE/FIMAT/10147.xml new file mode 100644 index 00000000..1d9aa033 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10147.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 151 + + + 10147 +
VENTO
+ + + + + + + + + + + + 0.52 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 151 + + 0001-01-01 00:00:00 + 0 + 0.005 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.041 + 7.854 + 0.410 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.479 + 91.762 + 4.790 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.002 + 0.383 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10148.xml b/ZZZ_RECIPE/FIMAT/10148.xml new file mode 100644 index 00000000..6044b960 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10148.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 063 + + + 10148 +
VENTO
+ + + + + + + + + + + + 0.41 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 063 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.382 + 93.399 + 3.820 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.027 + 6.601 + 0.270 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10149.xml b/ZZZ_RECIPE/FIMAT/10149.xml new file mode 100644 index 00000000..b828a411 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10149.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 016 + + + 10149 +
VENTO
+ + + + + + + + + + + + 2.89 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 016 + + 0001-01-01 00:00:00 + 0 + 0.029 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 2.419 + 83.818 + 24.190 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.443 + 15.350 + 4.430 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.024 + 0.832 + 0.240 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10150.xml b/ZZZ_RECIPE/FIMAT/10150.xml new file mode 100644 index 00000000..c36fc9f1 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10150.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 012 + + + 10150 +
VENTO
+ + + + + + + + + + + + 9.50 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 012 + + 0001-01-01 00:00:00 + 0 + 0.095 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 9.500 + 100.000 + 95.000 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10151.xml b/ZZZ_RECIPE/FIMAT/10151.xml new file mode 100644 index 00000000..d0292624 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10151.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 161 + + + 10151 +
VENTO
+ + + + + + + + + + + + 1.78 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 161 + + 0001-01-01 00:00:00 + 0 + 0.018 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 1.673 + 94.042 + 16.730 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.106 + 5.958 + 1.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10152.xml b/ZZZ_RECIPE/FIMAT/10152.xml new file mode 100644 index 00000000..66395a3c --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10152.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 162 + + + 10152 +
VENTO
+ + + + + + + + + + + + 2.62 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 162 + + 0001-01-01 00:00:00 + 0 + 0.026 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 1.820 + 69.492 + 18.200 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.769 + 29.362 + 7.690 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.030 + 1.145 + 0.300 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10153.xml b/ZZZ_RECIPE/FIMAT/10153.xml new file mode 100644 index 00000000..c54fcc60 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10153.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 007 + + + 10153 +
VENTO
+ + + + + + + + + + + + 0.69 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 007 + + 0001-01-01 00:00:00 + 0 + 0.007 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.203 + 29.420 + 2.030 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.259 + 37.536 + 2.590 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.060 + 8.696 + 0.600 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.168 + 24.348 + 1.680 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10154.xml b/ZZZ_RECIPE/FIMAT/10154.xml new file mode 100644 index 00000000..cf26fe42 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10154.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 114 + + + 10154 +
VENTO
+ + + + + + + + + + + + 0.15 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 114 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.067 + 44.371 + 0.670 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.084 + 55.629 + 0.840 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10155.xml b/ZZZ_RECIPE/FIMAT/10155.xml new file mode 100644 index 00000000..eee0279f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10155.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 115 + + + 10155 +
VENTO
+ + + + + + + + + + + + 1.77 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 115 + + 0001-01-01 00:00:00 + 0 + 0.018 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.181 + 10.249 + 1.810 + 0.00 + + + + + 2 + BLU + B A.C. + C + 1.440 + 81.540 + 14.400 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.145 + 8.211 + 1.450 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10156.xml b/ZZZ_RECIPE/FIMAT/10156.xml new file mode 100644 index 00000000..3a5c136e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10156.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 013 + + + 10156 +
VENTO
+ + + + + + + + + + + + 1.17 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 013 + + 0001-01-01 00:00:00 + 0 + 0.012 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.495 + 42.128 + 4.950 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.680 + 57.872 + 6.800 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10157.xml b/ZZZ_RECIPE/FIMAT/10157.xml new file mode 100644 index 00000000..cb9d5f8f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10157.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VENTO + + 064 + + + 10157 +
VENTO
+ + + + + + + + + + + + 0.14 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VENTOFR 064 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.138 + 95.172 + 1.380 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.001 + 0.690 + 0.010 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.003 + 2.069 + 0.030 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.003 + 2.069 + 0.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10158.xml b/ZZZ_RECIPE/FIMAT/10158.xml new file mode 100644 index 00000000..a381c5da --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10158.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 000 + + + 10158 +
PATAGFR
+ + + + + + + + + + + + 0.25 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 000 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.254 + 100.000 + 2.540 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10159.xml b/ZZZ_RECIPE/FIMAT/10159.xml new file mode 100644 index 00000000..678ef193 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10159.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 002 + + + 10159 +
PATAGFR
+ + + + + + + + + + + + 0.08 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 002 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.074 + 92.500 + 0.740 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.001 + 1.250 + 0.010 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 6.250 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10160.xml b/ZZZ_RECIPE/FIMAT/10160.xml new file mode 100644 index 00000000..10a85c8d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10160.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 021 + + + 10160 +
PATAGFR
+ + + + + + + + + + + + 0.05 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 021 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.044 + 83.019 + 0.440 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.006 + 11.321 + 0.060 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.003 + 5.660 + 0.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10161.xml b/ZZZ_RECIPE/FIMAT/10161.xml new file mode 100644 index 00000000..4e3cdf87 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10161.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 022 + + + 10161 +
PATAGFR
+ + + + + + + + + + + + 0.05 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 022 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.046 + 95.833 + 0.460 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.002 + 4.167 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10162.xml b/ZZZ_RECIPE/FIMAT/10162.xml new file mode 100644 index 00000000..49126280 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10162.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 023 + + + 10162 +
PATAGFR
+ + + + + + + + + + + + 0.09 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 023 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.078 + 88.636 + 0.780 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.008 + 9.091 + 0.080 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.002 + 2.273 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10163.xml b/ZZZ_RECIPE/FIMAT/10163.xml new file mode 100644 index 00000000..1c13d78a --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10163.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 025 + + + 10163 +
PATAGFR
+ + + + + + + + + + + + 0.03 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 025 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.025 + 96.154 + 0.250 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.001 + 3.846 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10164.xml b/ZZZ_RECIPE/FIMAT/10164.xml new file mode 100644 index 00000000..f388025c --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10164.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 003 + + + 10164 +
PATAGFR
+ + + + + + + + + + + + 0.10 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 003 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.077 + 79.381 + 0.770 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.012 + 12.371 + 0.120 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.008 + 8.247 + 0.080 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10165.xml b/ZZZ_RECIPE/FIMAT/10165.xml new file mode 100644 index 00000000..d0ea4671 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10165.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 031 + + + 10165 +
PATAGFR
+ + + + + + + + + + + + 0.10 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 031 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.078 + 78.000 + 0.780 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.013 + 13.000 + 0.130 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.009 + 9.000 + 0.090 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10166.xml b/ZZZ_RECIPE/FIMAT/10166.xml new file mode 100644 index 00000000..cd23b5d2 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10166.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 005 + + + 10166 +
PATAGFR
+ + + + + + + + + + + + 0.06 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 005 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.046 + 71.875 + 0.460 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.002 + 3.125 + 0.020 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.001 + 1.563 + 0.010 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.015 + 23.437 + 0.150 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10167.xml b/ZZZ_RECIPE/FIMAT/10167.xml new file mode 100644 index 00000000..9a44561e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10167.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 052 + + + 10167 +
PATAGFR
+ + + + + + + + + + + + 0.01 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 052 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.003 + 21.429 + 0.030 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.005 + 35.714 + 0.050 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.004 + 28.571 + 0.040 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 14.286 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10168.xml b/ZZZ_RECIPE/FIMAT/10168.xml new file mode 100644 index 00000000..af6848b6 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10168.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 053 + + + 10168 +
PATAGFR
+ + + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 053 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.029 + 67.442 + 0.290 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.014 + 32.558 + 0.140 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10169.xml b/ZZZ_RECIPE/FIMAT/10169.xml new file mode 100644 index 00000000..a038d552 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10169.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 006 + + + 10169 +
PATAGFR
+ + + + + + + + + + + + 0.11 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 006 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.088 + 81.481 + 0.880 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.010 + 9.259 + 0.100 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.010 + 9.259 + 0.100 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10170.xml b/ZZZ_RECIPE/FIMAT/10170.xml new file mode 100644 index 00000000..c3766696 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10170.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 066 + + + 10170 +
PATAGFR
+ + + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 066 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.035 + 83.333 + 0.350 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.002 + 4.762 + 0.020 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 11.905 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10171.xml b/ZZZ_RECIPE/FIMAT/10171.xml new file mode 100644 index 00000000..bb7d20d0 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10171.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 011 + + + 10171 +
PATAGFR
+ + + + + + + + + + + + 0.13 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 011 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.085 + 63.433 + 0.850 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.021 + 15.672 + 0.210 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.025 + 18.657 + 0.250 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.003 + 2.239 + 0.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10172.xml b/ZZZ_RECIPE/FIMAT/10172.xml new file mode 100644 index 00000000..27a2925b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10172.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 111 + + + 10172 +
PATAGFR
+ + + + + + + + + + + + 0.12 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 111 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.093 + 77.500 + 0.930 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.010 + 8.333 + 0.100 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.013 + 10.833 + 0.130 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.004 + 3.333 + 0.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10173.xml b/ZZZ_RECIPE/FIMAT/10173.xml new file mode 100644 index 00000000..1e8b0b73 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10173.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 112 + + + 10173 +
PATAGFR
+ + + + + + + + + + + + 0.02 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 112 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + BLU + B A.C. + C + 0.016 + 80.000 + 0.160 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.004 + 20.000 + 0.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10174.xml b/ZZZ_RECIPE/FIMAT/10174.xml new file mode 100644 index 00000000..be86f672 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10174.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 012 + + + 10174 +
PATAGFR
+ + + + + + + + + + + + 0.07 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA FR 012 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.057 + 78.082 + 0.570 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.015 + 20.548 + 0.150 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.001 + 1.370 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10175.xml b/ZZZ_RECIPE/FIMAT/10175.xml new file mode 100644 index 00000000..188ed895 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10175.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PATAGFR + + 114 + + + 10175 +
PATAGFR
+ + + + + + + + + + + + 0.03 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIAFR 114 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + BLU + B A.C. + C + 0.023 + 79.310 + 0.230 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.006 + 20.690 + 0.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10176.xml b/ZZZ_RECIPE/FIMAT/10176.xml new file mode 100644 index 00000000..75028db4 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10176.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + SKY + + 006 + + + 10176 +
SKY
+ + + + + + + + + + + + 0.49 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 006 + + 0001-01-01 00:00:00 + 0 + 0.005 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.200 + 40.568 + 2.000 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.266 + 53.955 + 2.660 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.018 + 3.651 + 0.180 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.009 + 1.826 + 0.090 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10177.xml b/ZZZ_RECIPE/FIMAT/10177.xml new file mode 100644 index 00000000..0eb1512a --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10177.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 007 + + + 10177 +
SKY
+ + + + + + + + + + + + 1.03 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 007 + + 0001-01-01 00:00:00 + 0 + 0.010 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.716 + 69.515 + 7.160 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.293 + 28.447 + 2.930 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.021 + 2.039 + 0.210 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10178.xml b/ZZZ_RECIPE/FIMAT/10178.xml new file mode 100644 index 00000000..c98f974e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10178.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + SKY + + 111 + + + 10178 +
SKY
+ + + + + + + + + + + + 0.19 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 111 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.009 + 4.839 + 0.090 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.129 + 69.355 + 1.290 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.002 + 1.075 + 0.020 + 0.00 + + + + + 4 + COLANVIO + RL132 + C + 0.046 + 24.731 + 0.460 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10179.xml b/ZZZ_RECIPE/FIMAT/10179.xml new file mode 100644 index 00000000..64f0b1b0 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10179.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 013 + + + 10179 +
SKY
+ + come bambu' O13 e li + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bambu' O13 e life 013 e bobil 013 E SKY 013 + come bambu' O13 e life 013 e bobil 013 + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.036 + 87.805 + 0.360 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.004 + 9.756 + 0.040 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.001 + 2.439 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10180.xml b/ZZZ_RECIPE/FIMAT/10180.xml new file mode 100644 index 00000000..e9fa4245 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10180.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + SKY + + 015 + + + 10180 +
SKY
+ + come bambu 015 + + + + + + + + + + 1.01 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bambu 015 E SKY 015 + come bambu 015 + 0001-01-01 00:00:00 + 0 + 0.010 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.984 + 97.619 + 9.840 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.024 + 2.381 + 0.240 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10181.xml b/ZZZ_RECIPE/FIMAT/10181.xml new file mode 100644 index 00000000..8621726a --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10181.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + SKY + + 002 + + + 10181 +
SKY
+ + + + + + + + + + + + 0.32 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 002 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.295 + 92.476 + 2.950 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.024 + 7.524 + 0.240 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10182.xml b/ZZZ_RECIPE/FIMAT/10182.xml new file mode 100644 index 00000000..b8b3aaf1 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10182.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + SKY + + 051 + + + 10182 +
SKY
+ + come bambu' OO5 e li + + + + + + + + + + 0.21 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bambu' OO5 e life 051 e bobil ? E SKY 051 + come bambu' OO5 e life 051 e bobil ? + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.097 + 46.190 + 0.970 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.013 + 6.190 + 0.130 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.021 + 10.000 + 0.210 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.079 + 37.619 + 0.790 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10183.xml b/ZZZ_RECIPE/FIMAT/10183.xml new file mode 100644 index 00000000..15a8d3f4 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10183.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + SKY + + 011 + + + 10183 +
SKY
+ + come bobil 011 + + + + + + + + + + 3.15 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 011 E SKY 011 + come bobil 011 + 0001-01-01 00:00:00 + 0 + 0.032 + 0.00 +
+
+ + + 1 + BLU + B A.C. + C + 3.000 + 95.238 + 30.000 + 0.00 + + + + + 2 + COLANVIO + RL132 + C + 0.150 + 4.762 + 1.500 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10184.xml b/ZZZ_RECIPE/FIMAT/10184.xml new file mode 100644 index 00000000..681c0715 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10184.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 112 + + + 10184 +
SKY
+ + + + + + + + + + + + 0.03 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 112 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.003 + 9.677 + 0.030 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.025 + 80.645 + 0.250 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.003 + 9.677 + 0.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10185.xml b/ZZZ_RECIPE/FIMAT/10185.xml new file mode 100644 index 00000000..f113c78b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10185.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + SKY + + 113 + + + 10185 +
SKY
+ + + + + + + + + + + + 0.20 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 113 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.117 + 58.794 + 1.170 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.082 + 41.206 + 0.820 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10186.xml b/ZZZ_RECIPE/FIMAT/10186.xml new file mode 100644 index 00000000..119b4bfa --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10186.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + SKY + + 012 + + + 10186 +
SKY
+ + solo sky e non altri + + + + + + + + + + 2.93 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + solo sky e non altri SKY 012 + solo sky e non altri + 0001-01-01 00:00:00 + 0 + 0.029 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 2.876 + 98.124 + 28.760 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.055 + 1.876 + 0.550 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10187.xml b/ZZZ_RECIPE/FIMAT/10187.xml new file mode 100644 index 00000000..763359d6 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10187.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 121 + + + 10187 +
SKY
+ + come bobil 121 + + + + + + + + + + 2.12 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 121 E SKY 121 + come bobil 121 + 0001-01-01 00:00:00 + 0 + 0.021 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.091 + 51.584 + 10.910 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.551 + 26.052 + 5.510 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.473 + 22.364 + 4.730 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10188.xml b/ZZZ_RECIPE/FIMAT/10188.xml new file mode 100644 index 00000000..73cb575d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10188.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 071 + + + 10188 +
SKY
+ + + + + + + + + + + + 0.44 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 071 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.378 + 84.944 + 3.780 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.065 + 14.607 + 0.650 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.002 + 0.449 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10189.xml b/ZZZ_RECIPE/FIMAT/10189.xml new file mode 100644 index 00000000..cd2eca27 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10189.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + SKY + + 052 + + + 10189 +
SKY
+ + come bobil 052 + + + + + + + + + + 6.43 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 052 E SKY 052 + come bobil 052 + 0001-01-01 00:00:00 + 0 + 0.064 + 0.00 +
+
+ + + 1 + BLU + B A.C. + C + 0.434 + 6.745 + 4.340 + 0.00 + + + + + 2 + NERO + CF A.C + C + 6.000 + 93.255 + 60.000 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10190.xml b/ZZZ_RECIPE/FIMAT/10190.xml new file mode 100644 index 00000000..0bda26d0 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10190.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 072 + + + 10190 +
SKY
+ + + + + + + + + + + + 2.27 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 072 + + 0001-01-01 00:00:00 + 0 + 0.023 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.088 + 47.845 + 10.880 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.542 + 23.835 + 5.420 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.644 + 28.320 + 6.440 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10191.xml b/ZZZ_RECIPE/FIMAT/10191.xml new file mode 100644 index 00000000..9ab547bd --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10191.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 114 + + + 10191 +
SKY
+ + come bobil 114 + + + + + + + + + + 0.27 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 114 E SKY 114 + come bobil 114 + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.061 + 22.761 + 0.610 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.174 + 64.925 + 1.740 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.033 + 12.313 + 0.330 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10192.xml b/ZZZ_RECIPE/FIMAT/10192.xml new file mode 100644 index 00000000..1d1648e5 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10192.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + SKY + + 122 + + + 10192 +
SKY
+ + + + + + + + + + + + 0.16 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + SKY 122 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + COLANVIO + RL132 + C + 0.156 + 100.000 + 1.560 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10193.xml b/ZZZ_RECIPE/FIMAT/10193.xml new file mode 100644 index 00000000..65397d48 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10193.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + BAMBU + + 003 + + + 10193 +
BAMBU
+ + come life 003 e gard + + + + + + + + + + 0.28 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come life 003 e garden 003 E BAMBU 003 + come life 003 e garden 003 + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.073 + 25.887 + 0.730 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.111 + 39.362 + 1.110 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.026 + 9.220 + 0.260 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.072 + 25.532 + 0.720 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10194.xml b/ZZZ_RECIPE/FIMAT/10194.xml new file mode 100644 index 00000000..f2eae8c6 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10194.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + BAMBU + + 012 + + + 10194 +
BAMBU
+ + come life 012 e gard + + + + + + + + + + 2.09 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come life 012 e garden 012 E BAMBU 012 + come life 012 e garden 012 + 0001-01-01 00:00:00 + 0 + 0.021 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.098 + 52.662 + 10.980 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.883 + 42.350 + 8.830 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.104 + 4.988 + 1.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10195.xml b/ZZZ_RECIPE/FIMAT/10195.xml new file mode 100644 index 00000000..060c46e1 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10195.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 053 + + + 10195 +
SKY
+ + come bobil 053 + + + + + + + + + + 0.13 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 053 E SKY 053 + come bobil 053 + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.063 + 48.092 + 0.630 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.045 + 34.351 + 0.450 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.023 + 17.557 + 0.230 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10196.xml b/ZZZ_RECIPE/FIMAT/10196.xml new file mode 100644 index 00000000..62fb2559 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10196.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 151 + + + 10196 +
SKY
+ + come bobil 151 + + + + + + + + + + 3.11 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 151 E SKY 151 + come bobil 151 + 0001-01-01 00:00:00 + 0 + 0.031 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 3.024 + 97.360 + 30.240 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.077 + 2.479 + 0.770 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 0.161 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10197.xml b/ZZZ_RECIPE/FIMAT/10197.xml new file mode 100644 index 00000000..f8c825b0 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10197.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 054 + + + 10197 +
SKY
+ + come bobil 054 + + + + + + + + + + 0.71 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 054 E SKY 054 + come bobil 054 + 0001-01-01 00:00:00 + 0 + 0.007 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.070 + 9.901 + 0.700 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.133 + 18.812 + 1.330 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.504 + 71.287 + 5.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10198.xml b/ZZZ_RECIPE/FIMAT/10198.xml new file mode 100644 index 00000000..d9ec2f18 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10198.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + SKY + + 062 + + + 10198 +
SKY
+ + come bobil 062 + + + + + + + + + + 1.35 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 062 E SKY 062 + come bobil 062 + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.832 + 61.813 + 8.320 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.388 + 28.826 + 3.880 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.126 + 9.361 + 1.260 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10199.xml b/ZZZ_RECIPE/FIMAT/10199.xml new file mode 100644 index 00000000..82d20502 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10199.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + SKY + + 123 + + + 10199 +
SKY
+ + come bobil 123 + + + + + + + + + + 0.14 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 123 E SKY 123 + come bobil 123 + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.009 + 6.383 + 0.090 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.099 + 70.213 + 0.990 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.009 + 6.383 + 0.090 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.024 + 17.021 + 0.240 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10200.xml b/ZZZ_RECIPE/FIMAT/10200.xml new file mode 100644 index 00000000..a87fc08c --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10200.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + SKY + + 124 + + + 10200 +
SKY
+ + come bobil 124 + + + + + + + + + + 0.25 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 124 E SKY 124 + come bobil 124 + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.140 + 56.225 + 1.400 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.109 + 43.775 + 1.090 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10201.xml b/ZZZ_RECIPE/FIMAT/10201.xml new file mode 100644 index 00000000..2515efb4 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10201.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + SKY + + 125 + + + 10201 +
SKY
+ + come bobil 125 + + + + + + + + + + 1.45 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come bobil 125 E SKY 125 + come bobil 125 + 0001-01-01 00:00:00 + 0 + 0.015 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 1.400 + 96.286 + 14.000 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.054 + 3.714 + 0.540 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10202.xml b/ZZZ_RECIPE/FIMAT/10202.xml new file mode 100644 index 00000000..6773ca19 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10202.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 000 + + + 10202 +
NATURAFR
+ + + + + + + + + + + + 0.31 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 000 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.310 + 100.000 + 3.100 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10203.xml b/ZZZ_RECIPE/FIMAT/10203.xml new file mode 100644 index 00000000..5ccfb9d9 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10203.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 002 + + + 10203 +
NATURAFR
+ + + + + + + + + + + + 0.05 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 002 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.045 + 88.235 + 0.450 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.005 + 9.804 + 0.050 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.001 + 1.961 + 0.010 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10204.xml b/ZZZ_RECIPE/FIMAT/10204.xml new file mode 100644 index 00000000..15aef94f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10204.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 005 + + + 10204 +
NATURAFR
+ + + + + + + + + + + + 0.09 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 005 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.040 + 42.553 + 0.400 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.007 + 7.447 + 0.070 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.009 + 9.574 + 0.090 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.013 + 13.830 + 0.130 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.025 + 26.596 + 0.250 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10205.xml b/ZZZ_RECIPE/FIMAT/10205.xml new file mode 100644 index 00000000..d9527620 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10205.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 021 + + + 10205 +
NATURAFR
+ + + + + + + + + + + + 0.16 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 021 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.063 + 38.415 + 0.630 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.084 + 51.220 + 0.840 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.007 + 4.268 + 0.070 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.010 + 6.098 + 0.100 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10206.xml b/ZZZ_RECIPE/FIMAT/10206.xml new file mode 100644 index 00000000..682050f7 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10206.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 051 + + + 10206 +
NATURAFR
+ + + + + + + + + + + + 0.48 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 051 + + 0001-01-01 00:00:00 + 0 + 0.005 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.438 + 91.632 + 4.380 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.011 + 2.301 + 0.110 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.011 + 2.301 + 0.110 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.008 + 1.674 + 0.080 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.010 + 2.092 + 0.100 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10207.xml b/ZZZ_RECIPE/FIMAT/10207.xml new file mode 100644 index 00000000..3d9a9e9b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10207.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 011 + + + 10207 +
NATURAFR
+ + + + + + + + + + + + 0.28 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 011 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.204 + 73.646 + 2.040 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.006 + 2.166 + 0.060 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.021 + 7.581 + 0.210 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.040 + 14.440 + 0.400 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.006 + 2.166 + 0.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10208.xml b/ZZZ_RECIPE/FIMAT/10208.xml new file mode 100644 index 00000000..68c510d4 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10208.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 015 + + + 10208 +
NATURAFR
+ + + + + + + + + + + + 0.85 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 015 + + 0001-01-01 00:00:00 + 0 + 0.008 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.353 + 41.677 + 3.530 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.454 + 53.601 + 4.540 + 0.00 + + + + + 3 + GIALLORO + RWS + C + 0.019 + 2.243 + 0.190 + 0.00 + + + + + 4 + ROSSO + FTL AC + C + 0.021 + 2.479 + 0.210 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10209.xml b/ZZZ_RECIPE/FIMAT/10209.xml new file mode 100644 index 00000000..41d1ec42 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10209.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 061 + + + 10209 +
NATURAFR
+ + + + + + + + + + + + 0.18 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 061 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.167 + 92.778 + 1.670 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.013 + 7.222 + 0.130 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10210.xml b/ZZZ_RECIPE/FIMAT/10210.xml new file mode 100644 index 00000000..1a2dae4e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10210.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 016 + + + 10210 +
NATURAFR
+ + + + + + + + + + + + 0.69 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 016 + + 0001-01-01 00:00:00 + 0 + 0.007 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.640 + 92.619 + 6.400 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.051 + 7.381 + 0.510 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10211.xml b/ZZZ_RECIPE/FIMAT/10211.xml new file mode 100644 index 00000000..9301d435 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10211.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 022 + + + 10211 +
NATURAFR
+ + + + + + + + + + + + 0.07 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 022 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.049 + 74.242 + 0.490 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.012 + 18.182 + 0.120 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 7.576 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10212.xml b/ZZZ_RECIPE/FIMAT/10212.xml new file mode 100644 index 00000000..528ba5e1 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10212.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 003 + + + 10212 +
NATURAFR
+ + + + + + + + + + + + 0.07 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 003 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.022 + 31.429 + 0.220 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.022 + 31.429 + 0.220 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.005 + 7.143 + 0.050 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.021 + 30.000 + 0.210 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10213.xml b/ZZZ_RECIPE/FIMAT/10213.xml new file mode 100644 index 00000000..c1e23056 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10213.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NNATURAFR + + 062 + + + 10213 +
NATURAFR
+ + + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 062 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.038 + 90.476 + 0.380 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.002 + 4.762 + 0.020 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.002 + 4.762 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10214.xml b/ZZZ_RECIPE/FIMAT/10214.xml new file mode 100644 index 00000000..f6a89777 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10214.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 063 + + + 10214 +
NATURAFR
+ + + + + + + + + + + + 0.17 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 063 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.100 + 59.880 + 1.000 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.037 + 22.156 + 0.370 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.014 + 8.383 + 0.140 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.016 + 9.581 + 0.160 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10215.xml b/ZZZ_RECIPE/FIMAT/10215.xml new file mode 100644 index 00000000..91aa27ce --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10215.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 007 + + + 10215 +
NATURAFR
+ + + + + + + + + + + + 1.14 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 007 + + 0001-01-01 00:00:00 + 0 + 0.011 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.465 + 40.754 + 4.650 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.332 + 29.097 + 3.320 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.344 + 30.149 + 3.440 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10216.xml b/ZZZ_RECIPE/FIMAT/10216.xml new file mode 100644 index 00000000..96221183 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10216.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 111 + + + 10216 +
NATURAFR
+ + + + + + + + + + + + 0.37 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 111 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.311 + 83.827 + 3.110 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.005 + 1.348 + 0.050 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.022 + 5.930 + 0.220 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.030 + 8.086 + 0.300 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.003 + 0.809 + 0.030 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10217.xml b/ZZZ_RECIPE/FIMAT/10217.xml new file mode 100644 index 00000000..7270a275 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10217.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 013 + + + 10217 +
NATURAFR
+ + + + + + + + + + + + 0.46 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 013 + + 0001-01-01 00:00:00 + 0 + 0.005 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.265 + 57.734 + 2.650 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.173 + 37.691 + 1.730 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.021 + 4.575 + 0.210 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10218.xml b/ZZZ_RECIPE/FIMAT/10218.xml new file mode 100644 index 00000000..07472dfe --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10218.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 014 + + + 10218 +
NATURAFR
+ + + + + + + + + + + + 0.15 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 014 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.109 + 74.658 + 1.090 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.011 + 7.534 + 0.110 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.026 + 17.808 + 0.260 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10219.xml b/ZZZ_RECIPE/FIMAT/10219.xml new file mode 100644 index 00000000..112f617f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10219.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 052 + + + 10219 +
NATURAFR
+ + + + + + + + + + + + 0.02 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 052 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.005 + 29.412 + 0.050 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.005 + 29.412 + 0.050 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.005 + 29.412 + 0.050 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 11.765 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10220.xml b/ZZZ_RECIPE/FIMAT/10220.xml new file mode 100644 index 00000000..f22a2029 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10220.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 112 + + + 10220 +
NATURAFR
+ + + + + + + + + + + + 0.36 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 112 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.050 + 13.889 + 0.500 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.291 + 80.833 + 2.910 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.019 + 5.278 + 0.190 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10221.xml b/ZZZ_RECIPE/FIMAT/10221.xml new file mode 100644 index 00000000..e86c3b7f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10221.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 012 + + + 10221 +
NATURAFR
+ + + + + + + + + + + + 2.22 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + NATURAFR 012 + + 0001-01-01 00:00:00 + 0 + 0.022 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 2.180 + 98.066 + 21.800 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.007 + 0.315 + 0.070 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.036 + 1.619 + 0.360 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10222.xml b/ZZZ_RECIPE/FIMAT/10222.xml new file mode 100644 index 00000000..55b2763e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10222.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + NATURAFR + + 071 + + + 10222 +
NATURAFR
+ + Vedi Pirovano + + + + + + + + + + 0.54 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + Vedi Pirovano NATURAFR 071 + Vedi Pirovano + 0001-01-01 00:00:00 + 0 + 0.005 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.172 + 31.618 + 1.720 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.059 + 10.846 + 0.590 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.313 + 57.537 + 3.130 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10223.xml b/ZZZ_RECIPE/FIMAT/10223.xml new file mode 100644 index 00000000..16fd51aa --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10223.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VELA + + 021 + + + 10223 +
VELA
+ + + + + + + + + + + + 0.23 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 021 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.186 + 81.938 + 1.860 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.027 + 11.894 + 0.270 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.014 + 6.167 + 0.140 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10224.xml b/ZZZ_RECIPE/FIMAT/10224.xml new file mode 100644 index 00000000..acc26e29 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10224.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VELA + + 002 + + + 10224 +
VELA
+ + + + + + + + + + + + 0.19 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VALA 002 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.149 + 78.836 + 1.490 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.015 + 7.937 + 0.150 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.014 + 7.407 + 0.140 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.011 + 5.820 + 0.110 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10225.xml b/ZZZ_RECIPE/FIMAT/10225.xml new file mode 100644 index 00000000..4ce0a57b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10225.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VELA + + 003 + + + 10225 +
VELA
+ + + + + + + + + + + + 1.96 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 003 + + 0001-01-01 00:00:00 + 0 + 0.020 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.575 + 29.412 + 5.750 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 1.016 + 51.969 + 10.160 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.326 + 16.675 + 3.260 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.038 + 1.944 + 0.380 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10226.xml b/ZZZ_RECIPE/FIMAT/10226.xml new file mode 100644 index 00000000..9bf63c19 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10226.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VELA + + 005 + + + 10226 +
VELA
+ + + + + + + + + + + + 0.28 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 005 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.245 + 86.572 + 2.450 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.012 + 4.240 + 0.120 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.002 + 0.707 + 0.020 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.024 + 8.481 + 0.240 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10227.xml b/ZZZ_RECIPE/FIMAT/10227.xml new file mode 100644 index 00000000..95930c93 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10227.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VELA + + 006 + + + 10227 +
VELA
+ + + + + + + + + + + + 0.14 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 006 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.125 + 86.207 + 1.250 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.018 + 12.414 + 0.180 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.002 + 1.379 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10228.xml b/ZZZ_RECIPE/FIMAT/10228.xml new file mode 100644 index 00000000..e030fda9 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10228.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VELA + + 061 + + + 10228 +
VELA
+ + + + + + + + + + + + 1.65 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 061 + + 0001-01-01 00:00:00 + 0 + 0.017 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.222 + 13.446 + 2.220 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 1.160 + 70.260 + 11.600 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.229 + 13.870 + 2.290 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.040 + 2.423 + 0.400 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10229.xml b/ZZZ_RECIPE/FIMAT/10229.xml new file mode 100644 index 00000000..67b8922a --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10229.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VELA + + 011 + + + 10229 +
VELA
+ + + + + + + + + + + + 0.34 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 011 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.290 + 84.302 + 2.900 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.019 + 5.523 + 0.190 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.029 + 8.430 + 0.290 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.006 + 1.744 + 0.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10230.xml b/ZZZ_RECIPE/FIMAT/10230.xml new file mode 100644 index 00000000..7f3a0c35 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10230.xml @@ -0,0 +1,106 @@ + + + + + N + 6 + 000000000000 + + VELA + + 111 + + + 10230 +
VELA
+ + + + + + + + + + + + 0.57 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 111 + + 0001-01-01 00:00:00 + 0 + 0.006 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.411 + 72.359 + 4.110 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.011 + 1.937 + 0.110 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.045 + 7.923 + 0.450 + 0.00 + + + + + 4 + BLU + B A.C. + C + 0.090 + 15.845 + 0.900 + 0.00 + + + + + 5 + NERO + CF A.C + C + 0.011 + 1.937 + 0.110 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10231.xml b/ZZZ_RECIPE/FIMAT/10231.xml new file mode 100644 index 00000000..e734dd8b --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10231.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VELA + + 112 + + + 10231 +
VELA
+ + + + + + + + + + + + 1.10 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 112 + + 0001-01-01 00:00:00 + 0 + 0.011 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.322 + 29.299 + 3.220 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.753 + 68.517 + 7.530 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.024 + 2.184 + 0.240 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10232.xml b/ZZZ_RECIPE/FIMAT/10232.xml new file mode 100644 index 00000000..54904f2d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10232.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + VELA + + 013 + + + 10232 +
VELA
+ + + + + + + + + + + + 0.21 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 013 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.087 + 41.627 + 0.870 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.086 + 41.148 + 0.860 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.034 + 16.268 + 0.340 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 0.957 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10233.xml b/ZZZ_RECIPE/FIMAT/10233.xml new file mode 100644 index 00000000..6d9084b6 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10233.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + VELA + + 015 + + + 10233 +
VELA
+ + + + + + + + + + + + 0.96 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + VELA 015 + + 0001-01-01 00:00:00 + 0 + 0.010 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 0.279 + 28.912 + 2.790 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.651 + 67.461 + 6.510 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.035 + 3.627 + 0.350 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10234.xml b/ZZZ_RECIPE/FIMAT/10234.xml new file mode 100644 index 00000000..9744e50f --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10234.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 000 + + + 10234 +
FLASH
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 000 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.295 + 100.000 + 2.950 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10235.xml b/ZZZ_RECIPE/FIMAT/10235.xml new file mode 100644 index 00000000..a96d089d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10235.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 002 + + + 10235 +
FLASH
+ + + + + + + + + + + + 1.21 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 002 + + 0001-01-01 00:00:00 + 0 + 0.012 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 1.191 + 98.511 + 11.910 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.014 + 1.158 + 0.140 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.002 + 0.165 + 0.020 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.002 + 0.165 + 0.020 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10236.xml b/ZZZ_RECIPE/FIMAT/10236.xml new file mode 100644 index 00000000..d1e9b0e2 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10236.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 051 + + + 10236 +
FLASH
+ + + + + + + + + + + + 0.62 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 051 + + 0001-01-01 00:00:00 + 0 + 0.006 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.087 + 14.123 + 0.870 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.053 + 8.604 + 0.530 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.117 + 18.994 + 1.170 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.359 + 58.279 + 3.590 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10237.xml b/ZZZ_RECIPE/FIMAT/10237.xml new file mode 100644 index 00000000..69935f07 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10237.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 052 + + + 10237 +
FLASH
+ + + + + + + + + + + + 0.04 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 052 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.006 + 13.636 + 0.060 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.008 + 18.182 + 0.080 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.010 + 22.727 + 0.100 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.020 + 45.455 + 0.200 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10238.xml b/ZZZ_RECIPE/FIMAT/10238.xml new file mode 100644 index 00000000..db6e2c44 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10238.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 006 + + + 10238 +
FLASH
+ + + + + + + + + + + + 1.12 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 006 + + 0001-01-01 00:00:00 + 0 + 0.011 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.095 + 97.855 + 10.950 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.019 + 1.698 + 0.190 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 0.447 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10239.xml b/ZZZ_RECIPE/FIMAT/10239.xml new file mode 100644 index 00000000..af8b2e2e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10239.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 007 + + + 10239 +
FLASH
+ + + + + + + + + + + + 0.26 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 007 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.068 + 25.856 + 0.680 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.061 + 23.194 + 0.610 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.030 + 11.407 + 0.300 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.104 + 39.544 + 1.040 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10240.xml b/ZZZ_RECIPE/FIMAT/10240.xml new file mode 100644 index 00000000..60bb09c3 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10240.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 072 + + + 10240 +
FLASH
+ + + + + + + + + + + + 1.26 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 072 + + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.523 + 41.475 + 5.230 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.371 + 29.421 + 3.710 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.367 + 29.104 + 3.670 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10241.xml b/ZZZ_RECIPE/FIMAT/10241.xml new file mode 100644 index 00000000..9e05b417 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10241.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 011 + + + 10241 +
FLASH
+ + + + + + + + + + + + 1.55 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 011 + + 0001-01-01 00:00:00 + 0 + 0.016 + 0.00 +
+
+ + + 1 + PRINTWHI + RTN + C + 1.287 + 82.925 + 12.870 + 0.00 + + + + + 2 + PCW0215 + GIALLO + C + 0.147 + 9.472 + 1.470 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.118 + 7.603 + 1.180 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10242.xml b/ZZZ_RECIPE/FIMAT/10242.xml new file mode 100644 index 00000000..6f7784ad --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10242.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 112 + + + 10242 +
FLASH
+ + + + + + + + + + + + 2.90 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 112 + + 0001-01-01 00:00:00 + 0 + 0.029 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.581 + 20.048 + 5.810 + 0.00 + + + + + 2 + BLU + B A.C. + C + 2.270 + 78.330 + 22.700 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.047 + 1.622 + 0.470 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10243.xml b/ZZZ_RECIPE/FIMAT/10243.xml new file mode 100644 index 00000000..e99d5e7c --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10243.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 013 + + + 10243 +
FLASH
+ + + + + + + + + + + + 2.79 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 013 + + 0001-01-01 00:00:00 + 0 + 0.028 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.378 + 49.444 + 13.780 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.794 + 28.489 + 7.940 + 0.00 + + + + + 3 + COLANVIO + RL132 + C + 0.615 + 22.067 + 6.150 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10244.xml b/ZZZ_RECIPE/FIMAT/10244.xml new file mode 100644 index 00000000..6a37045e --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10244.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 131 + + + 10244 +
FLASH
+ + + + + + + + + + + + 0.94 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 131 + + 0001-01-01 00:00:00 + 0 + 0.009 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.540 + 57.143 + 5.400 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.226 + 23.915 + 2.260 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.034 + 3.598 + 0.340 + 0.00 + + + + + 4 + COLANVIO + RL132 + C + 0.145 + 15.344 + 1.450 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10246.xml b/ZZZ_RECIPE/FIMAT/10246.xml new file mode 100644 index 00000000..538dd584 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10246.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 014 + + + 10246 +
FLASH
+ + pigmento ROSA PRINTO + + + + + + + + + + 0.13 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + pigmento ROSA PRINTOFIX TE CLARIANT 1.869% FLASH 014 + pigmento ROSA PRINTOFIX TE CLARIANT 1,869% + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.126 + 100.000 + 1.260 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10247.xml b/ZZZ_RECIPE/FIMAT/10247.xml new file mode 100644 index 00000000..455a2c68 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10247.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 151 + + + 10247 +
FLASH
+ + + + + + + + + + + + 2.43 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + FLASH 151 + + 0001-01-01 00:00:00 + 0 + 0.024 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 2.000 + 82.136 + 20.000 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.380 + 15.606 + 3.800 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.055 + 2.259 + 0.550 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10248.xml b/ZZZ_RECIPE/FIMAT/10248.xml new file mode 100644 index 00000000..ebb86ced --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10248.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + FLASH + + 061 + + + 10248 +
FLASH
+ + come pat 601 non mem + + + + + + + + + + 0.06 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + come pat 601 non memo FLASH 061 + come pat 601 non memo + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.049 + 80.328 + 0.490 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.012 + 19.672 + 0.120 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10249.xml b/ZZZ_RECIPE/FIMAT/10249.xml new file mode 100644 index 00000000..b8a23047 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10249.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 000 + + + 10249 +
PANDA
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 000 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.295 + 100.000 + 2.950 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10250.xml b/ZZZ_RECIPE/FIMAT/10250.xml new file mode 100644 index 00000000..f84303a7 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10250.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 003 + + + 10250 +
PANDA
+ + + + + + + + + + + + 0.22 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 003 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.195 + 86.667 + 1.950 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.014 + 6.222 + 0.140 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.016 + 7.111 + 0.160 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10251.xml b/ZZZ_RECIPE/FIMAT/10251.xml new file mode 100644 index 00000000..bd903018 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10251.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 031 + + + 10251 +
PANDA
+ + + + + + + + + + + + 0.52 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 031 + + 0001-01-01 00:00:00 + 0 + 0.005 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.400 + 76.775 + 4.000 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.079 + 15.163 + 0.790 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.042 + 8.061 + 0.420 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10252.xml b/ZZZ_RECIPE/FIMAT/10252.xml new file mode 100644 index 00000000..c9d6be50 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10252.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 051 + + + 10252 +
PANDA
+ + + + + + + + + + + + 0.83 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 051 + + 0001-01-01 00:00:00 + 0 + 0.008 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.117 + 14.096 + 1.170 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.071 + 8.554 + 0.710 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.158 + 19.036 + 1.580 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.484 + 58.313 + 4.840 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10253.xml b/ZZZ_RECIPE/FIMAT/10253.xml new file mode 100644 index 00000000..ecdc1fed --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10253.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 052 + + + 10253 +
PANDA
+ + + + + + + + + + + + 0.05 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 052 + + 0001-01-01 00:00:00 + 0 + 0.001 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.007 + 13.208 + 0.070 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.010 + 18.868 + 0.100 + 0.00 + + + + + 3 + BLU + B A.C. + C + 0.012 + 22.642 + 0.120 + 0.00 + + + + + 4 + NERO + CF A.C + C + 0.024 + 45.283 + 0.240 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10254.xml b/ZZZ_RECIPE/FIMAT/10254.xml new file mode 100644 index 00000000..a076a2ce --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10254.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 006 + + + 10254 +
PANDA
+ + + + + + + + + + + + 1.34 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 006 + + 0001-01-01 00:00:00 + 0 + 0.013 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.314 + 97.841 + 13.140 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.023 + 1.713 + 0.230 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.006 + 0.447 + 0.060 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10255.xml b/ZZZ_RECIPE/FIMAT/10255.xml new file mode 100644 index 00000000..b0c9008d --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10255.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 072 + + + 10255 +
PANDA
+ + + + + + + + + + + + 1.70 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 072 + + 0001-01-01 00:00:00 + 0 + 0.017 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.706 + 41.481 + 7.060 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.501 + 29.436 + 5.010 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.495 + 29.083 + 4.950 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10256.xml b/ZZZ_RECIPE/FIMAT/10256.xml new file mode 100644 index 00000000..e91fd647 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10256.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 112 + + + 10256 +
PANDA
+ + + + + + + + + + + + 3.48 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 112 + + 0001-01-01 00:00:00 + 0 + 0.035 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.697 + 20.046 + 6.970 + 0.00 + + + + + 2 + BLU + B A.C. + C + 2.724 + 78.343 + 27.240 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.056 + 1.611 + 0.560 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10257.xml b/ZZZ_RECIPE/FIMAT/10257.xml new file mode 100644 index 00000000..a52f52a9 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10257.xml @@ -0,0 +1,94 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 131 + + + 10257 +
PANDA
+ + + + + + + + + + + + 1.13 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 131 + + 0001-01-01 00:00:00 + 0 + 0.011 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.648 + 57.143 + 6.480 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.271 + 23.898 + 2.710 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.041 + 3.616 + 0.410 + 0.00 + + + + + 4 + COLANVIO + RL132 + C + 0.174 + 15.344 + 1.740 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10258.xml b/ZZZ_RECIPE/FIMAT/10258.xml new file mode 100644 index 00000000..c8018492 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10258.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 151 + + + 10258 +
PANDA
+ + + + + + + + + + + + 2.92 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 151 + + 0001-01-01 00:00:00 + 0 + 0.029 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 2.400 + 82.136 + 24.000 + 0.00 + + + + + 2 + GIALLORO + RWS + C + 0.456 + 15.606 + 4.560 + 0.00 + + + + + 3 + ROSSO + FTL AC + C + 0.066 + 2.259 + 0.660 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10259.xml b/ZZZ_RECIPE/FIMAT/10259.xml new file mode 100644 index 00000000..d61977d5 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10259.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 161 + + + 10259 +
PANDA
+ + + + + + + + + + + + 1.35 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 161 + + 0001-01-01 00:00:00 + 0 + 0.014 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 1.052 + 77.811 + 10.520 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.300 + 22.189 + 3.000 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10260.xml b/ZZZ_RECIPE/FIMAT/10260.xml new file mode 100644 index 00000000..0df17126 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10260.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 007 + + + 10260 +
PANDA
+ + + + + + + + + + + + 3.97 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 007 + + 0001-01-01 00:00:00 + 0 + 0.040 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 2.803 + 70.516 + 28.030 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 1.038 + 26.113 + 10.380 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.134 + 3.371 + 1.340 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10261.xml b/ZZZ_RECIPE/FIMAT/10261.xml new file mode 100644 index 00000000..24ba3460 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10261.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 061 + + + 10261 +
PANDA
+ + + + + + + + + + + + 1.51 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 061 att modificata con +20% blu chiedere lab + + 0001-01-01 00:00:00 + 0 + 0.015 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 1.142 + 75.780 + 11.420 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.281 + 18.646 + 2.810 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.084 + 5.574 + 0.840 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10262.xml b/ZZZ_RECIPE/FIMAT/10262.xml new file mode 100644 index 00000000..f24f6335 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10262.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 016 + + + 10262 +
PANDA
+ + + + + + + + + + + + 0.32 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 016 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + GIALLORO + RWS + C + 0.252 + 78.019 + 2.520 + 0.00 + + + + + 2 + ROSSO + FTL AC + C + 0.066 + 20.433 + 0.660 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.005 + 1.548 + 0.050 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10263.xml b/ZZZ_RECIPE/FIMAT/10263.xml new file mode 100644 index 00000000..ce13cd35 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10263.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 011 + + + 10263 +
PANDA
+ + + + + + + + + + + + 0.43 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 011 + + 0001-01-01 00:00:00 + 0 + 0.004 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.100 + 23.095 + 1.000 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.302 + 69.746 + 3.020 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.031 + 7.159 + 0.310 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10264.xml b/ZZZ_RECIPE/FIMAT/10264.xml new file mode 100644 index 00000000..9c5d13a8 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10264.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + PANDA + + 111 + + + 10264 +
PANDA
+ + + + + + + + + + + + 5.18 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PANDA 111 + + 0001-01-01 00:00:00 + 0 + 0.052 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 2.116 + 40.881 + 21.160 + 0.00 + + + + + 2 + BLU + B A.C. + C + 2.810 + 54.289 + 28.100 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.250 + 4.830 + 2.500 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10265.xml b/ZZZ_RECIPE/FIMAT/10265.xml new file mode 100644 index 00000000..1ade1cac --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10265.xml @@ -0,0 +1,70 @@ + + + + + N + 6 + 000000000000 + + LIFE + + 062 + + + 10265 +
LIFE
+ + + + + + + + + + + + 0.25 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + LIFE 062 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.205 + 83.333 + 2.050 + 0.00 + + + + + 2 + NERO + CF A.C + C + 0.041 + 16.667 + 0.410 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10266.xml b/ZZZ_RECIPE/FIMAT/10266.xml new file mode 100644 index 00000000..8c8e3a28 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10266.xml @@ -0,0 +1,82 @@ + + + + + N + 6 + 000000000000 + + LIFE + + 116 + + + 10266 +
LIFE
+ + + + + + + + + + + + 0.22 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + LIFE 116 + + 0001-01-01 00:00:00 + 0 + 0.002 + 0.00 +
+
+ + + 1 + PCW0215 + GIALLO + C + 0.030 + 13.333 + 0.300 + 0.00 + + + + + 2 + BLU + B A.C. + C + 0.170 + 75.556 + 1.700 + 0.00 + + + + + 3 + NERO + CF A.C + C + 0.025 + 11.111 + 0.250 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/10267.xml b/ZZZ_RECIPE/FIMAT/10267.xml new file mode 100644 index 00000000..efb33ed9 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/10267.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + LIFE + + 131 + + + 10267 +
LIFE
+ + + + + + + + + + + + 0.02 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + LIFE 131 + + 0001-01-01 00:00:00 + 0 + 0.000 + 0.00 +
+
+ + + 1 + ROSSO + FTL AC + C + 0.019 + 100.000 + 0.190 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FIMAT/99999.xml b/ZZZ_RECIPE/FIMAT/99999.xml new file mode 100644 index 00000000..cf09bda5 --- /dev/null +++ b/ZZZ_RECIPE/FIMAT/99999.xml @@ -0,0 +1,58 @@ + + + + + N + 6 + 000000000000 + + PATA-SHAN + + 000 + + + 99999 +
PATA-SHAN
+ + + + + + + + + + + + 0.29 + 1.00 + 0 + 0 + 1 + 0 + 7 + S + N + C + L + PATAGONIA-SHANTUNG 000 + + 0001-01-01 00:00:00 + 0 + 0.003 + 0.00 +
+
+ + + 1 + ULTRAPHO + ERE + C + 0.295 + 100.000 + 2.950 + 0.00 + + +
diff --git a/ZZZ_RECIPE/FixRecipeContent.ps1 b/ZZZ_RECIPE/FixRecipeContent.ps1 new file mode 100644 index 00000000..895a0f9e --- /dev/null +++ b/ZZZ_RECIPE/FixRecipeContent.ps1 @@ -0,0 +1,20 @@ +## cambio DIR +#cd "C:\Users\samuele.steamw\source\Mapo-IOB-WIN\IOB-WIN-NEXT\DATA\RECIPE\FIMAT" + +# leggo ogni file +$fileList = Get-Childitem *.xml #99999.xml + +foreach($file in $fileList) +{ + # nome ricetta (senza xml... + $fileName=$file | Select-Object Name + $recName = $fileName.Name.Replace('.xml','') + #$recName + $contenuto = Get-Content $file -Raw + $find = "(.|\n)*?" + $replace = ''+$recName+'' + $newContenuto = $contenuto -replace $find,$replace + $newContenuto = $newContenuto.Trim() + #$newContenuto + Set-Content -Path $file -Value $newContenuto +}