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
+}