diff --git a/IOB-WIN-NEXT/DATA/CONF/Tend_RAMA_100_47.json b/IOB-WIN-NEXT/DATA/CONF/Tend_RAMA_100_47.json index c0934eae..a4ff689b 100644 --- a/IOB-WIN-NEXT/DATA/CONF/Tend_RAMA_100_47.json +++ b/IOB-WIN-NEXT/DATA/CONF/Tend_RAMA_100_47.json @@ -4,7 +4,7 @@ "BrowseValue": 0, "kvDelim": "#", "memDelim": ".", - "keyPartCount": "Production#GEN.Float.0", + "keyPartCount": "PV_Exchange_DB_R.Production#GEN.Float.0", "keyPartReq": "", "keyPartId": "", "keyProgName": "", @@ -14,22 +14,22 @@ "maxNullRead": 500, "condWork": [ { - "keyName": "Fabric Run", + "keyName": "PV_Exchange_DB_R.Fabric Run", "bitNum": 0, "targetValue": "1" }, { - "keyName": "Enabled", + "keyName": "PV_Exchange_DB_R.Enabled", "bitNum": 0, "targetValue": "1" }, { - "keyName": "Enabled", + "keyName": "PV_Exchange_DB_R.Enabled", "bitNum": 4, "targetValue": "1" }, { - "keyName": "Enabled", + "keyName": "PV_Exchange_DB_R.Enabled", "bitNum": 5, "targetValue": "1" } @@ -38,12 +38,12 @@ "checkMode": "OR", "checkList": [ { - "keyName": "Enabled", + "keyName": "PV_Exchange_DB_R.Enabled", "bitNum": 4, "targetValue": "1" }, { - "keyName": "Enabled", + "keyName": "PV_Exchange_DB_R.Enabled", "bitNum": 5, "targetValue": "1" } @@ -53,7 +53,7 @@ "checkMode": "AND", "checkList": [ { - "keyName": "Enabled", + "keyName": "PV_Exchange_DB_R.Enabled", "bitNum": 5, "targetValue": "1" } @@ -63,7 +63,7 @@ "checkMode": "OR", "checkList": [ { - "keyName": "Fabric Run", + "keyName": "PV_Exchange_DB_R.Fabric Run", "bitNum": 0, "targetValue": "0" } @@ -77,7 +77,7 @@ "checkMode": "AND", "checkList": [ { - "keyName": "\"Alarms\"", + "keyName": "PV_Exchange_DB_R.Alarms", "bitNum": 0, "targetValue": "1" } @@ -96,7 +96,10 @@ "ns=3;s=\"PV_Exchange_DB_R\".\"Enabled\"", "ns=3;s=\"PV_Exchange_DB_R\".\"Fabric Run\"", "ns=3;s=\"PV_Exchange_DB_R\".\"Production\"", - "ns=3;s=\"PV_Exchange_DB_R\".\"Alarms\"" + "ns=3;s=\"PV_Exchange_DB_R\".\"Alarms\"", + "ns=3;s=\"SP_Exchange_DB_R\".\"Enabling\"", + "ns=3;s=\"SP_Exchange_DB_R\".\"Fabric Enabling\"", + "ns=3;s=\"SP_Exchange_DB_R\".\"Fabric Speed\"" ], "filterItemsNodeId": [ "ns=2;s=RamosaETN21.RamosaCJ2._Hints", @@ -226,7 +229,7 @@ "OPC_Prod_PartMetCount": { "name": "OPC_Prod_PartMetCount", "description": "Contatore Metri Parziale", - "memAddr": "\"Production\"#GEN.Float.0", + "memAddr": "PV_Exchange_DB_R.Production#GEN.Float.0", "tipoMem": "FloatABCD", "index": 1, "size": 1, @@ -240,7 +243,7 @@ "OPC_Prod_TotMetCount": { "name": "OPC_Prod_TotMetCount", "description": "Contatore Metri Totale", - "memAddr": "\"Production\"#GEN.Float.4", + "memAddr": "PV_Exchange_DB_R.Production#GEN.Float.4", "tipoMem": "FloatABCD", "index": 1, "size": 1, @@ -254,7 +257,7 @@ "OPC_Prod_TotHourCount": { "name": "OPC_Prod_TotHourCount", "description": "Contatore Ore Totale", - "memAddr": "\"Production\"#GEN.Float.8", + "memAddr": "PV_Exchange_DB_R.Production#GEN.Float.8", "tipoMem": "FloatABCD", "index": 1, "size": 1, @@ -274,7 +277,7 @@ "MemConfWrite": "", "MaxVal": 9999 }, - "BaseIdMask": "\"PV_Exchange_DB_R\".", + "BaseIdMask": "", "DictOpcNameReplace": { "\"": "" } diff --git a/IOB-WIN-NEXT/IobOpc/OpcUa.cs b/IOB-WIN-NEXT/IobOpc/OpcUa.cs index 4b30a141..d73a7009 100644 --- a/IOB-WIN-NEXT/IobOpc/OpcUa.cs +++ b/IOB-WIN-NEXT/IobOpc/OpcUa.cs @@ -891,6 +891,40 @@ namespace IOB_WIN_NEXT.IobOpc return changed; } + /// + /// Fix stringa da versione "raw " a "bonificata" + /// + /// + /// + internal string stringFixOpcUaName(string origName) + { + string answ = origName; + // se ho dizionari di sostituzione caratteri sistemo! + if (opcUaParams.DictOpcNameReplace.Count > 0) + { + // cerco nel dizionario LUT di traduzione + if (DictOpcFixKeys.ContainsKey(origName)) + { + answ = DictOpcFixKeys[origName]; + } + else + { + // altrimenti sitemo e metto in dizionario + foreach (var item in opcUaParams.DictOpcNameReplace) + { + answ = answ.Replace(item.Key, item.Value); + } + DictOpcFixKeys.Add(origName, answ); + } + } + return answ; + } + + /// + /// Dizionario chiavi OpcUa bonificate da char non standard + /// + internal Dictionary DictOpcFixKeys { get; set; } = new Dictionary(); + /// /// Verifica ed invia variazioni DAL FORMATO RAW data (byte[]) /// @@ -923,7 +957,10 @@ namespace IOB_WIN_NEXT.IobOpc string descr = ""; DateTime locTStamp = DateTime.Now; descr = itemTranslation("OPC", uuid); - sVal = $"Change 02: {locTStamp.ToString()} | descr: {descr} | Id: {MonIt.StartNodeId} | Val: {currVal}"; + // calcolo nomi "bonificati" + string startNodeId = stringFixOpcUaName($"{MonIt.StartNodeId}"); + string displayName = stringFixOpcUaName($"{MonIt.DisplayName}"); + sVal = $"Change 02: {locTStamp.ToString()} | descr: {descr} | Id: {startNodeId} | Val: {currVal}"; lgDebug(sVal); // verifico se salvare @@ -933,7 +970,7 @@ namespace IOB_WIN_NEXT.IobOpc // cerco filtro ANCHE PER solo display name x contains... if (!isFiltered) { - isFiltered = opcUaParams.fluxLogVetoContains.Contains(uuid) || opcUaParams.fluxLogVetoContains.Contains(MonIt.DisplayName); + isFiltered = opcUaParams.fluxLogVetoContains.Contains(uuid) || opcUaParams.fluxLogVetoContains.Contains(displayName); } if (isFiltered) { @@ -950,22 +987,40 @@ namespace IOB_WIN_NEXT.IobOpc if (memMap.mMapRead != null && memMap.mMapRead.Count > 0) { // elenco aree collegate... - var listRelated = memMap.mMapRead.Where(x => x.Value.memAddr.Contains(uuid)); + var listRelated = memMap.mMapRead.Where(x => x.Value.memAddr.Contains(uuid)).ToList(); if (listRelated != null && listRelated.Count() > 0) { foreach (var item in listRelated) { // ciclo e calcolo valore - var rByte= dataItemMem[uuid].rawByte; - string convVal = ConvBArr(rByte, item.Value.memAddr, opcUaParams.memDelim); + var rByte = dataItemMem[uuid].rawByte; + int iPos = item.Value.memAddr.IndexOf(opcUaParams.kvDelim); + string varDef = item.Value.memAddr.Substring(iPos + 1); + string convVal = ConvBArr(rByte, varDef, opcUaParams.memDelim); // metto in array currData... upsertKey(item.Key, convVal); + accodaFLog($"mMapRead | {item.Key} | {convVal}", qEncodeFLog(item.Key, convVal)); } } } if (memMap.mMapWrite != null && memMap.mMapWrite.Count > 0) { - + // elenco aree collegate... + var listRelated = memMap.mMapWrite.Where(x => x.Value.memAddr.Contains(uuid)).ToList(); + if (listRelated != null && listRelated.Count() > 0) + { + foreach (var item in listRelated) + { + // ciclo e calcolo valore + var rByte = dataItemMem[uuid].rawByte; + int iPos = item.Value.memAddr.IndexOf(opcUaParams.kvDelim); + string varDef = item.Value.memAddr.Substring(iPos + 1); + string convVal = ConvBArr(rByte, varDef, opcUaParams.memDelim); + // metto in array currData... + upsertKey(item.Key, convVal); + accodaFLog($"mMapRead | {item.Key} | {convVal}", qEncodeFLog(item.Key, convVal)); + } + } } } else @@ -1357,15 +1412,7 @@ namespace IOB_WIN_NEXT.IobOpc { answ = fullCode.Replace(opcUaParams.BaseIdMask, ""); } - // tolgo eventuali caratteri speciali mappati... - // se c'รจ gestione fix nomi sistemo... - if (opcUaParams.DictOpcNameReplace.Count > 0) - { - foreach (var item in opcUaParams.DictOpcNameReplace) - { - answ = answ.Replace(item.Key, item.Value); - } - } + answ = stringFixOpcUaName(answ); // trimmo spazi x ridurre dimensione se > 50... if (answ.Length > 50) {