From 1d36cab4da4cda2c67f956573eaa593fd24dadd3 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 10 Nov 2025 11:44:58 +0100 Subject: [PATCH] update x versione OMRON Ghidini tav02 --- IOB-WIN-OPC-UA/DATA/CONF/1042.json | 2 +- IOB-WIN-OPC-UA/DATA/CONF/MAIN.ini | 4 +- IOB-WIN-OPC-UA/IobOpc/OpcUa.cs | 2 +- IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs | 147 +++++++++++---------- IOB-WIN-OPC-UA/IobOpc/OpcUaOmronGhidini.cs | 46 ++++++- IOB-WIN-OPC-UA/UAClient.cs | 30 +++-- 6 files changed, 145 insertions(+), 86 deletions(-) diff --git a/IOB-WIN-OPC-UA/DATA/CONF/1042.json b/IOB-WIN-OPC-UA/DATA/CONF/1042.json index cb7188a7..d8acc108 100644 --- a/IOB-WIN-OPC-UA/DATA/CONF/1042.json +++ b/IOB-WIN-OPC-UA/DATA/CONF/1042.json @@ -207,7 +207,7 @@ "setPzComm": { "name": "setPzComm", "description": "Qty", - "tipoMem": "Int", + "tipoMem": "String", "memAddr": "ns=4;s=ext_stringa3_popup", "index": 0, "size": 4 diff --git a/IOB-WIN-OPC-UA/DATA/CONF/MAIN.ini b/IOB-WIN-OPC-UA/DATA/CONF/MAIN.ini index 37955f66..60f333fd 100644 --- a/IOB-WIN-OPC-UA/DATA/CONF/MAIN.ini +++ b/IOB-WIN-OPC-UA/DATA/CONF/MAIN.ini @@ -28,7 +28,7 @@ CLI_INST=SteamWareSim ;STARTLIST=3026 ;STARTLIST=TFT_RAMA_001 ;STARTLIST=SIM_DP_01 -;STARTLIST=1042 -STARTLIST=2016 +STARTLIST=1042 +;STARTLIST=2016 MAXCNC=10 \ No newline at end of file diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUa.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUa.cs index 9586d048..2594ae31 100644 --- a/IOB-WIN-OPC-UA/IobOpc/OpcUa.cs +++ b/IOB-WIN-OPC-UA/IobOpc/OpcUa.cs @@ -2099,7 +2099,7 @@ namespace IOB_WIN_OPC_UA.IobOpc string nodeId = memAddrWrite.Substring(0, iPos); string varName = memAddrWrite.Substring(iPos + 1); - //cerco se ci sia già un record Uds... + // cerco se ci sia già un record Uds... if (nodesUdt2Write.ContainsKey(nodeId)) { currUdsDict = nodesUdt2Write[nodeId]; diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs index 77512991..3bb07b93 100644 --- a/IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs +++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs @@ -202,97 +202,106 @@ namespace IOB_WIN_OPC_UA.IobOpc /// protected override void plcWriteParams(ref List updatedPar) { - dataConf currMem = null; - int byteSize = 0; - string memAddrWrite = ""; - string serObj = ""; - if (updatedPar != null) +#if false + bool doLegacy = false; + if (doLegacy) { - List nodes2Write = new List(); - // controllo i parametri... ne gestisco 4... - foreach (var item in updatedPar) + dataConf currMem = null; + int byteSize = 0; + string memAddrWrite = ""; + string serObj = ""; + if (updatedPar != null) { - try + List nodes2Write = new List(); + // controllo i parametri... ne gestisco 4... + foreach (var item in updatedPar) { - memAddrWrite = ""; - int valInt = 0; - double valReal = 0; - // cerco in area memMapWrite... - if (memMap.mMapWrite.ContainsKey(item.uid)) + try { - // 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) + memAddrWrite = ""; + int valInt = 0; + double valReal = 0; + // cerco in area memMapWrite... + if (memMap.mMapWrite.ContainsKey(item.uid)) { - case plcDataType.Boolean: - break; + // recupero! + currMem = memMap.mMapWrite[item.uid]; + byteSize = currMem.size; + memAddrWrite = currMem.memAddr; - case plcDataType.Int: - case plcDataType.DInt: - case plcDataType.Word: - case plcDataType.DWord: - int.TryParse(item.reqValue, out valInt); - commWriteVal.Value.Value = valInt; - break; + WriteValue commWriteVal = new WriteValue(); + commWriteVal.NodeId = new NodeId(currMem.memAddr); + commWriteVal.AttributeId = Attributes.Value; + commWriteVal.Value = new DataValue(); + commWriteVal.Value.Value = item.reqValue; - case plcDataType.Real: - double.TryParse(item.reqValue, out valReal); - commWriteVal.Value.Value = valReal; - break; + // 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}---------------"); - case plcDataType.String: - commWriteVal.Value.Value = item.reqValue; - break; + switch (currMem.tipoMem) + { + case plcDataType.Boolean: + break; - default: - break; - } - lgInfo($"---------------{Environment.NewLine}OPC-UA data:{Environment.NewLine}NodeId: {commWriteVal.NodeId}{Environment.NewLine}Value: {commWriteVal.Value.Value}{Environment.NewLine}---------------"); + case plcDataType.Int: + case plcDataType.DInt: + case plcDataType.Word: + case plcDataType.DWord: + int.TryParse(item.reqValue, out valInt); + commWriteVal.Value.Value = valInt; + break; - if (!string.IsNullOrEmpty(memAddrWrite)) - { - nodes2Write.Add(commWriteVal); - // 2023.09.19 resetto richiesta - item.reqValue = ""; + 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); + // 2023.09.19 resetto richiesta + item.reqValue = ""; + } + else + { + lgInfo($"Errore: memAddrWrite vuoto!"); + } } else { - lgInfo($"Errore: memAddrWrite vuoto!"); + lgInfo($"Errore uid non trovato in area write memory: {item.uid}, ci sono {memMap.mMapWrite.Count} in area write"); } } - else + catch (Exception exc) { - lgInfo($"Errore uid non trovato in area write memory: {item.uid}, ci sono {memMap.mMapWrite.Count} in area write"); + lgError($"Eccezione in fase di plcWriteParams per item {item.uid} con valore {item.value}{Environment.NewLine}{exc}"); } } - catch (Exception exc) + + if (nodes2Write.Count > 0) { - lgError($"Eccezione in fase di plcWriteParams per item {item.uid} con valore {item.value}{Environment.NewLine}{exc}"); + UA_ref.WriteNodes(nodes2Write); } } + } +#endif - if (nodes2Write.Count > 0) - { - UA_ref.WriteNodes(nodes2Write); - } - } + // uso versione nuova con parametri "dotted" + base.plcWriteParams(ref updatedPar); } #endregion Protected Methods diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaOmronGhidini.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaOmronGhidini.cs index a1bdaa58..33e19ea7 100644 --- a/IOB-WIN-OPC-UA/IobOpc/OpcUaOmronGhidini.cs +++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaOmronGhidini.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Net.NetworkInformation; using System.Threading; +using System.Threading.Tasks; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace IOB_WIN_OPC_UA.IobOpc @@ -35,6 +36,39 @@ namespace IOB_WIN_OPC_UA.IobOpc #region Public Methods + /// + /// Override processing x gestione custom forceReset tramite bit... + /// + /// + public override Dictionary executeTasks(Dictionary task2exe, string codTav) + { + lgInfo($"OpcUaOmronGhidini: call executeTasks | {task2exe.Count} task"); + // SOLO SE si tratta di reset... + foreach (var item in task2exe) + { + // converto richiesta in enum... + taskType tName = taskType.nihil; + Enum.TryParse(item.Key, out tName); + string iKey = item.Key; + // se è DP aggiungo in chiave il valore della TAV richiesta... ad es setComm --> setComm#TAV_1 + if (!string.IsNullOrEmpty(codTav)) + { + iKey += $"#{codTav}"; + } + // controllo sulla KEY... + switch (tName) + { + case taskType.forceResetPzCount: + resetContapezziPLC(codTav); + break; + } + } + + // uso metodo base x completare gestione + return base.executeTasks(task2exe, codTav); + } + + /// /// Effettua reset del contapezzi /// @@ -51,14 +85,14 @@ namespace IOB_WIN_OPC_UA.IobOpc dataConf currMem = memMap.mMapWrite[pKey]; string addr = currMem.memAddr; // imposto il valore e forzo la scrittura ... - memMap.mMapWrite[pKey].value = "True"; + memMap.mMapWrite[pKey].value = "true"; // preparo elenco parametri da inviare... list2Write = new List(); // aggiungo bit reset objItem currData = new objItem() { uid = pKey, - reqValue = "True", + reqValue = "true", name = pKey }; list2Write.Add(currData); @@ -71,12 +105,14 @@ namespace IOB_WIN_OPC_UA.IobOpc currData = new objItem() { uid = pKey, - reqValue = "False", + reqValue = "false", name = pKey }; list2Write.Add(currData); // scrivo! plcWriteParams(ref list2Write); + + // scriivo anche il reset del contapezzi forzato (SE configurato) } } return answ; @@ -129,7 +165,7 @@ namespace IOB_WIN_OPC_UA.IobOpc currData = new objItem() { uid = "showPopup", - reqValue = "True", + reqValue = "true", name = "showPopup" }; list2Write.Add(currData); @@ -142,7 +178,7 @@ namespace IOB_WIN_OPC_UA.IobOpc currData = new objItem() { uid = "showPopup", - reqValue = "False", + reqValue = "false", name = "showPopup" }; list2Write.Add(currData); diff --git a/IOB-WIN-OPC-UA/UAClient.cs b/IOB-WIN-OPC-UA/UAClient.cs index 1a9e7560..0830b392 100644 --- a/IOB-WIN-OPC-UA/UAClient.cs +++ b/IOB-WIN-OPC-UA/UAClient.cs @@ -786,9 +786,15 @@ namespace IOB_WIN_OPC_UA // Display the results. lgDebug("Write Results :"); + int idx = 0; foreach (StatusCode writeResult in results) { lgDebug($" {writeResult}"); + if (!StatusCode.IsGood(writeResult)) + { + lgError($"Error | {nodesToWrite[idx].NodeId} | {nodesToWrite[idx].Value} | {writeResult}"); + } + idx++; } } catch (Exception ex) @@ -976,16 +982,24 @@ namespace IOB_WIN_OPC_UA StatusCodeCollection result; //Write the collection to the server m_session.Write(null, valuesToWrite, out result, out _); - foreach (StatusCode code in result) - { - lgDebug($" {code}"); -#if false - if (code != 0) + // Validate the response + m_validateResponse(result, valuesToWrite); + + // Display the results. + lgDebug("OPC-UA: Write Results :"); + int idx = 0; + foreach (StatusCode writeResult in result) + { + if (!StatusCode.IsGood(writeResult)) { - throw new Exception(code.ToString()); - } -#endif + lgError($"Error | {valuesToWrite[idx].NodeId} | {valuesToWrite[idx].Value} | {writeResult}"); + } + else + { + lgDebug($"{valuesToWrite[idx].NodeId} | {valuesToWrite[idx].Value} | {writeResult}"); + } + idx++; } }