From 607059698eedb0a5c33277cf240c90d96b255562 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 14 Dec 2021 19:07:21 +0100 Subject: [PATCH 1/8] Update conf STEL x nuovo adapter specifico --- IOB-WIN-NEXT/DATA/CONF/STEL_200.ini | 2 +- IOB-WIN-NEXT/DATA/CONF/STEL_200.json | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/IOB-WIN-NEXT/DATA/CONF/STEL_200.ini b/IOB-WIN-NEXT/DATA/CONF/STEL_200.ini index a79c8aa7..6f24dbcc 100644 --- a/IOB-WIN-NEXT/DATA/CONF/STEL_200.ini +++ b/IOB-WIN-NEXT/DATA/CONF/STEL_200.ini @@ -1,7 +1,7 @@ ;Configurazione IOB-WIN [IOB] ;Centro di lavoro OpcUa -CNCTYPE=OpcUaEwon +CNCTYPE=OpcUaEwonMecolpress PING_MS_TIMEOUT=500 [MACHINE] diff --git a/IOB-WIN-NEXT/DATA/CONF/STEL_200.json b/IOB-WIN-NEXT/DATA/CONF/STEL_200.json index c126a403..1361d00f 100644 --- a/IOB-WIN-NEXT/DATA/CONF/STEL_200.json +++ b/IOB-WIN-NEXT/DATA/CONF/STEL_200.json @@ -98,7 +98,7 @@ "tipoMem": "Int", "memAddr": "ns=4;s=tomach_6_quantity", "index": 0, - "size": -1 + "size": 4 }, "setComm": { "name": "setComm", @@ -144,8 +144,22 @@ ], "WatchDog": { "IsEnabled": true, - "MemConfRead": "tomes_ 1_Watchdog", - "MemConfWrite": "tomach_1_watchdog", + "MemConfRead": "ns=4;s=tomes_1_Watchdog", + "MemConfWrite": "ns=4;s=tomach_1_watchdog", "MaxVal": 9999 + }, + "SetupConf": { + "SetupMode": "MECOLPRESS", + "checkParList": { + "tomach_3_code_die": "tomes_20_code_die", + "tomach_4_prod_order": "tomes_21_order" + }, + "writeParAction": [ + { + "TargetParam": "tomach_2_new_prod", + "TargetValEqual": 0, + "TargetValNotEqual": 1 + } + ] } } \ No newline at end of file From d3bf6af503396808217998a4a4be6c36bb913047 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 14 Dec 2021 19:07:47 +0100 Subject: [PATCH 2/8] Aggiunta preliminare struttura dati adapter specifico Mecolpress --- IOB-UT-NEXT/Enums.cs | 16 ++++++++ IOB-UT-NEXT/ToMapo.cs | 52 +++++++++++++++++++++++++- IOB-WIN-NEXT/AdapterForm.cs | 5 +++ IOB-WIN-NEXT/IobOpcUaEwon.cs | 5 +-- IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs | 43 +++++++++++++++++++++ IOB-WIN-NEXT/IobOpcUaEwonMonti.cs | 2 +- 6 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs index 090da652..1826da71 100644 --- a/IOB-UT-NEXT/Enums.cs +++ b/IOB-UT-NEXT/Enums.cs @@ -21,6 +21,17 @@ namespace IOB_UT_NEXT OR } + /// + /// Modalità gestione setup macchina + /// + public enum MachineSetupMode + { + ND=0, + + // Modalità Mecolpress (3 parametri IN, se variati --> porto a 1 la variabile di controllo) + Mecolpress = 1 + } + /// /// Elenco MODI CNC /// @@ -324,6 +335,11 @@ namespace IOB_UT_NEXT /// OpcUaEwonMonti, + /// + /// Adapter OPC-UA per Ewon x Mecolpress / Stil + /// + OpcUaEwonMecolpress, + /// /// Adapter OSAI CNDEX (Cndex) /// diff --git a/IOB-UT-NEXT/ToMapo.cs b/IOB-UT-NEXT/ToMapo.cs index 6ee75528..88d913ef 100644 --- a/IOB-UT-NEXT/ToMapo.cs +++ b/IOB-UT-NEXT/ToMapo.cs @@ -351,6 +351,51 @@ namespace IOB_UT_NEXT public int MaxVal { get; set; } = 9999; } + /// + /// Definizione parametri di setup incrociato... + /// + public class MachineSetupConf + { + /// + /// Modalità gestione setup + /// + public MachineSetupMode SetupMode { get; set; } = MachineSetupMode.ND; + + /// + /// Dizionario dei parametri di corrispondenza tra variabili MES e variabili Macchina + /// MES = scritte dal MES + /// Macchina = scritte da macchina + /// + public Dictionary paramMes2Mac { get; set; } = new Dictionary(); + + /// + /// Dizionario dei parametri da scrivere quando si rilevano differenze tra i parametri MES/Macchina + /// string (key) --> memoria da scrivere + /// tuple --> valori da scrivere quando uguali o diversi + /// + public List writeParAction { get; set; } = new List(); + } + + /// + /// Classe x definizione delle azioni in fase di setup macchina + /// + public class MachineSetupAction + { + /// + /// Parametro target dell'azione + /// + public string TargetParam { get; set; } = ""; + + /// + /// parametro da impostare SE il check da esito EQUAL + /// + public int TargetValEqual { get; set; } = 0; + /// + /// parametro da impostare SE il check da esito NOT EQUAL + /// + public int TargetValNotEqual { get; set; } = 1; + } + /// /// Classe gestione configurazione parametri specifici OPC-UA da BaseParamConf /// @@ -440,7 +485,12 @@ namespace IOB_UT_NEXT /// /// Conf Gestione WatchDog /// - public WatchDogConf WatchDog{get;set;} = new WatchDogConf(); + public WatchDogConf WatchDog {get;set;} = new WatchDogConf(); + + /// + /// Conf gestione setup macchina + /// + public MachineSetupConf SetupConf { get; set; } = new MachineSetupConf(); #endregion Public Properties } diff --git a/IOB-WIN-NEXT/AdapterForm.cs b/IOB-WIN-NEXT/AdapterForm.cs index 090879df..fd9b98a1 100644 --- a/IOB-WIN-NEXT/AdapterForm.cs +++ b/IOB-WIN-NEXT/AdapterForm.cs @@ -1223,6 +1223,11 @@ namespace IOB_WIN_NEXT start.Enabled = true; break; + case tipoAdapter.OpcUaEwonMecolpress: + iobObj = new IobOpcUaEwonMecolpress(this, IOBConf); + start.Enabled = true; + break; + case tipoAdapter.PingWatchdog: iobObj = new IobPing(this, IOBConf); start.Enabled = true; diff --git a/IOB-WIN-NEXT/IobOpcUaEwon.cs b/IOB-WIN-NEXT/IobOpcUaEwon.cs index 9fb677f4..ff91d289 100644 --- a/IOB-WIN-NEXT/IobOpcUaEwon.cs +++ b/IOB-WIN-NEXT/IobOpcUaEwon.cs @@ -53,7 +53,6 @@ namespace IOB_WIN_NEXT DateTime adesso = DateTime.Now; // init a zero... B_input = 0; - lgInfo("decodeToBaseBitmap 01"); /* ----------------------------------------------------- * STATE MACHINE 60 STD / SIMULA @@ -121,7 +120,6 @@ namespace IOB_WIN_NEXT // se abilitato watchdog... if (opcUaParams.WatchDog.IsEnabled) { - lgInfo("WatchDog 01"); if (adesso.Subtract(lastWatchDogPLC).TotalSeconds > 2) { lastWatchDogPLC = adesso; @@ -131,7 +129,6 @@ namespace IOB_WIN_NEXT lgInfo($"WatchDog val: {WatchDog}"); try { - WriteValue commWriteVal = new WriteValue(); commWriteVal.NodeId = new NodeId(opcUaParams.WatchDog.MemConfWrite); commWriteVal.AttributeId = Attributes.Value; @@ -140,8 +137,8 @@ namespace IOB_WIN_NEXT List nodes2Write = new List(); nodes2Write.Add(commWriteVal); + UA_ref.WriteNodes(nodes2Write); - lgInfo("Effettuata scrittura WatchDog"); } catch (Exception exc) { diff --git a/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs b/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs new file mode 100644 index 00000000..8c0a4ab9 --- /dev/null +++ b/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs @@ -0,0 +1,43 @@ +using MapoSDK; +using Newtonsoft.Json; +using Opc.Ua; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading.Tasks; + +namespace IOB_WIN_NEXT +{ + public class IobOpcUaEwonMecolpress: IobOpcUaEwon + { + #region Protected Fields + + + #endregion Protected Fields + + #region Public Constructors + + /// + /// Estende l'init della classe base, impiegando il pacchetto Nuget OPC-UA foundation con la gestione specifica per EWON (es Monti, Tenditalia) + /// https://github.com/OPCFoundation/UA-.NETStandard + /// + /// + /// + public IobOpcUaEwonMecolpress(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) + { + lgInfo("Init Ewon versione Mecolpress (STEL)"); + + // inizializzo classe base... + if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE"))) + { + CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE"); + } + sendKeyRichiesta = true; + } + + #endregion Public Constructors + + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs b/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs index d59d53fb..f6a1af7f 100644 --- a/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs +++ b/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs @@ -18,7 +18,7 @@ namespace IOB_WIN_NEXT /// public IobOpcUaEwonMonti(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) { - lgInfo("Init Ewon versione Monti (tenditalia)"); + lgInfo("Init Ewon versione Monti (Tenditalia)"); // inizializzo classe base... if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE"))) { From 728f393af7118488bc0762f90fad9961afadf185 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 14 Dec 2021 19:17:35 +0100 Subject: [PATCH 3/8] Update conf x gestioen setup Mecolpress --- IOB-UT-NEXT/Enums.cs | 2 +- IOB-UT-NEXT/ToMapo.cs | 7 ++++++- IOB-WIN-NEXT/DATA/CONF/STEL_200.json | 3 ++- IOB-WIN-NEXT/IOB-WIN-NEXT.csproj | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs index 1826da71..cf69d0fa 100644 --- a/IOB-UT-NEXT/Enums.cs +++ b/IOB-UT-NEXT/Enums.cs @@ -29,7 +29,7 @@ namespace IOB_UT_NEXT ND=0, // Modalità Mecolpress (3 parametri IN, se variati --> porto a 1 la variabile di controllo) - Mecolpress = 1 + MECOLPRESS = 1 } /// diff --git a/IOB-UT-NEXT/ToMapo.cs b/IOB-UT-NEXT/ToMapo.cs index 88d913ef..07881d41 100644 --- a/IOB-UT-NEXT/ToMapo.cs +++ b/IOB-UT-NEXT/ToMapo.cs @@ -366,7 +366,7 @@ namespace IOB_UT_NEXT /// MES = scritte dal MES /// Macchina = scritte da macchina /// - public Dictionary paramMes2Mac { get; set; } = new Dictionary(); + public Dictionary checkParList { get; set; } = new Dictionary(); /// /// Dizionario dei parametri da scrivere quando si rilevano differenze tra i parametri MES/Macchina @@ -394,6 +394,11 @@ namespace IOB_UT_NEXT /// parametro da impostare SE il check da esito NOT EQUAL /// public int TargetValNotEqual { get; set; } = 1; + + /// + /// Indica se vada disabilitato il contapezzi quando la condizione NotEqual sia soddisfatta + /// + public bool DisablePzCountNotEqual { get; set; } = false; } /// diff --git a/IOB-WIN-NEXT/DATA/CONF/STEL_200.json b/IOB-WIN-NEXT/DATA/CONF/STEL_200.json index 1361d00f..0ac42626 100644 --- a/IOB-WIN-NEXT/DATA/CONF/STEL_200.json +++ b/IOB-WIN-NEXT/DATA/CONF/STEL_200.json @@ -158,7 +158,8 @@ { "TargetParam": "tomach_2_new_prod", "TargetValEqual": 0, - "TargetValNotEqual": 1 + "TargetValNotEqual": 1, + "DisablePzCountNotEqual": true } ] } diff --git a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj index 72f719e0..7dbd5c67 100644 --- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj +++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj @@ -182,6 +182,7 @@ VersGen.cs + From a7a375733c87a4962fb48d60ba06409b7e47eaf6 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 14 Dec 2021 19:25:13 +0100 Subject: [PATCH 4/8] update conf json --- IOB-WIN-NEXT/DATA/CONF/STEL_200.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IOB-WIN-NEXT/DATA/CONF/STEL_200.json b/IOB-WIN-NEXT/DATA/CONF/STEL_200.json index 0ac42626..378bd0b6 100644 --- a/IOB-WIN-NEXT/DATA/CONF/STEL_200.json +++ b/IOB-WIN-NEXT/DATA/CONF/STEL_200.json @@ -156,7 +156,7 @@ }, "writeParAction": [ { - "TargetParam": "tomach_2_new_prod", + "TargetParam": "ns=4;s=tomach_2_new_prod", "TargetValEqual": 0, "TargetValNotEqual": 1, "DisablePzCountNotEqual": true From ba5770f32b7f55bdf711d1541e3f475e9506d3dd Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 14 Dec 2021 19:25:39 +0100 Subject: [PATCH 5/8] Inizio gestione setup x Mecolpress --- IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs | 30 +++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs b/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs index 8c0a4ab9..356841be 100644 --- a/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs +++ b/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace IOB_WIN_NEXT { - public class IobOpcUaEwonMecolpress: IobOpcUaEwon + public class IobOpcUaEwonMecolpress : IobOpcUaEwon { #region Protected Fields @@ -37,6 +37,34 @@ namespace IOB_WIN_NEXT sendKeyRichiesta = true; } + /// + /// Effettua vera scrittura parametri + /// + /// + protected override void plcWriteParams(ref List updatedPar) + { + base.plcWriteParams(ref updatedPar); + + // ora controllo la specifica condizione Mecolpress x il setup SE i parametri FOSSERO quelli di setup... + + dataConf currMem = null; + // controllo i parametri... ne gestisco 4... + foreach (var item in updatedPar) + { + // cerco in area memMapWrite... + if (memMap.mMapWrite.ContainsKey(item.uid)) + { + // recupero! + currMem = memMap.mMapWrite[item.uid]; + + // verifico SE fa parte dell'elenco dei valori da inviare... + } + } + + // faccio un check tra i valori in memoria che devono corrispondere e se NON corrispondono --> metto valore in scrittura... + + } + #endregion Public Constructors } From a8e745d4005c36542a5d861b3495cb926760d75d Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 15 Dec 2021 09:53:56 +0100 Subject: [PATCH 6/8] gestione OPC-UA client verbosa --- IOB-WIN-NEXT/UAClient.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/IOB-WIN-NEXT/UAClient.cs b/IOB-WIN-NEXT/UAClient.cs index 40dfce56..433b457c 100644 --- a/IOB-WIN-NEXT/UAClient.cs +++ b/IOB-WIN-NEXT/UAClient.cs @@ -81,6 +81,7 @@ namespace IOB_WIN_NEXT #region Protected Fields protected static Logger lg; + protected static bool isLogVerbose = false; #endregion Protected Fields @@ -89,11 +90,12 @@ namespace IOB_WIN_NEXT /// /// Initializes a new instance of the UAClient class. /// - public UAClient(ApplicationConfiguration configuration, string codIOB, Action validateResponse) + public UAClient(ApplicationConfiguration configuration, string codIOB, bool verboseLog, Action validateResponse) { m_validateResponse = validateResponse; currIob = codIOB; lg = LogManager.GetCurrentClassLogger(); + isLogVerbose = verboseLog; m_configuration = configuration; m_configuration.CertificateValidator.CertificateValidation += CertificateValidation; } @@ -198,7 +200,10 @@ namespace IOB_WIN_NEXT protected void lgInfo(string message) { lg.Factory.Configuration.Variables["codIOB"] = currIob; - lg.Info(message); + if (isLogVerbose) + { + lg.Info(message); + } } #endregion Protected Methods From 2d0026c15689e50551f32ebd5df5f5c665ca6e1a Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 15 Dec 2021 09:54:22 +0100 Subject: [PATCH 7/8] gestione conf parametri x setup Mecolpress specifico --- IOB-WIN-NEXT/IobOpcUaEwonMonti.cs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs b/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs index f6a1af7f..75fd353b 100644 --- a/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs +++ b/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs @@ -39,24 +39,6 @@ namespace IOB_WIN_NEXT /// protected override void plcWriteParams(ref List updatedPar) { -#if false - if (!testDone) - { - try - { - if (UA_ref != null) - { - UA_ref.WriteTestNodes(); - testDone = true; - } - } - catch (Exception exc) - { - lgError($"Eccezione in WriteTestNodes{Environment.NewLine}{exc}"); - } - } -#endif - dataConf currMem = null; int byteSize = 0; string memAddrWrite = ""; From e23133db9cbc1e807a999307ac1bb86156ab1d79 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 15 Dec 2021 09:54:32 +0100 Subject: [PATCH 8/8] completo modifica setup Mecolpress da testare --- IOB-WIN-NEXT/IobOpcUa.cs | 4 +- IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs | 65 ++++++++++++++++++++------ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/IOB-WIN-NEXT/IobOpcUa.cs b/IOB-WIN-NEXT/IobOpcUa.cs index 803e77d2..0a7fd6b5 100644 --- a/IOB-WIN-NEXT/IobOpcUa.cs +++ b/IOB-WIN-NEXT/IobOpcUa.cs @@ -22,7 +22,7 @@ namespace IOB_WIN_NEXT /// /// Struttura dove vengono memorizzati i dataitem ed i rispettivi valori x processing /// - private Dictionary dataItemMem = new Dictionary(); + protected Dictionary dataItemMem = new Dictionary(); /// /// Elenco degli items da monitorare come risultato del browse iniziale @@ -325,7 +325,7 @@ namespace IOB_WIN_NEXT await application.CheckApplicationInstanceCertificate(silent: false, minimumKeySize: 0).ConfigureAwait(false); lgInfo($"Chiamata UAClient con configurazione standard: {application.ApplicationConfiguration.ApplicationName}"); - UA_ref = new UAClient(application.ApplicationConfiguration, cIobConf.codIOB, ClientBase.ValidateResponse); + UA_ref = new UAClient(application.ApplicationConfiguration, cIobConf.codIOB, isVerboseLog, ClientBase.ValidateResponse); lgInfo($"Chiamata apertura OpcUa Client: {cIobConf.cncIpAddr}:{port}"); UA_ref.ServerUrl = $"opc.tcp://{cIobConf.cncIpAddr}:{port}"; diff --git a/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs b/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs index 356841be..4262d63b 100644 --- a/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs +++ b/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs @@ -45,24 +45,63 @@ namespace IOB_WIN_NEXT { base.plcWriteParams(ref updatedPar); - // ora controllo la specifica condizione Mecolpress x il setup SE i parametri FOSSERO quelli di setup... - - dataConf currMem = null; - // controllo i parametri... ne gestisco 4... - foreach (var item in updatedPar) + // se DEVO gestire setup Mecolpress... + if (opcUaParams.SetupConf.SetupMode == IOB_UT_NEXT.MachineSetupMode.MECOLPRESS) { - // cerco in area memMapWrite... - if (memMap.mMapWrite.ContainsKey(item.uid)) + List nodes2Write = new List(); + // ora controllo la specifica condizione Mecolpress x il setup SE i parametri FOSSERO quelli di setup... + dataConf currMem = null; + // faccio un check tra i valori in memoria che devono corrispondere e se NON corrispondono --> metto valore in scrittura... + bool needWrite = false; + int numDiff = 0; + foreach (var item in opcUaParams.SetupConf.checkParList) { - // recupero! - currMem = memMap.mMapWrite[item.uid]; + // cerco la memoria corrispondente... + var memorieMes = dataItemMem.Where(x => x.Key.Contains(item.Key)).ToList(); + var memorieMac = dataItemMem.Where(x => x.Key.Contains(item.Value)).ToList(); + // se ho trovato qualcosa verifico se corrispondono... + if (memorieMes.Count > 0 && memorieMes.Count > 0) + { + // controllo primo record con primo record + if (memorieMes.FirstOrDefault().Value.value != memorieMac.FirstOrDefault().Value.value) + { + numDiff++; + } + } + } - // verifico SE fa parte dell'elenco dei valori da inviare... + // ciclo le condizioni di uscita + foreach (var item in opcUaParams.SetupConf.writeParAction) + { + WriteValue commWriteVal = new WriteValue(); + commWriteVal.NodeId = new NodeId(item.TargetParam); + commWriteVal.AttributeId = Attributes.Value; + commWriteVal.Value = new DataValue(); + // se ho differenze --> scrivo richiesta attrezzaggio... + if (numDiff > 0) + { + commWriteVal.Value.Value = item.TargetValNotEqual; + } + else + { + commWriteVal.Value.Value = item.TargetValEqual; + } + + // accodo x scrittura + nodes2Write.Add(commWriteVal); + lgInfo($"richiesta scrittura valore | nodeId: {commWriteVal.NodeId } | targetPar: {item.TargetParam} | val {commWriteVal.Value.Value}"); + } + + // x ora NON eseguo + if (false) + { + // ora scrivo! + if (nodes2Write.Count > 0) + { + UA_ref.WriteNodes(nodes2Write); + } } } - - // faccio un check tra i valori in memoria che devono corrispondere e se NON corrispondono --> metto valore in scrittura... - } #endregion Public Constructors