Merge branch 'release/OpcSiemensRama04'

This commit is contained in:
Samuele Locatelli
2024-11-25 09:35:33 +01:00
8 changed files with 136 additions and 46 deletions
+2 -2
View File
@@ -36,14 +36,14 @@ namespace IOB_UT_NEXT
int bId = 0;
if (int.TryParse(sList[3], out bId))
{
this.Bit = bId;
this.Num = bId;
}
}
}
public string Product { get; set; } = "ND";
public string Type { get; set; } = "ND";
public int Idx { get; set; } = 0;
public int Bit { get; set; } = 0;
public int Num { get; set; } = 0;
}
}
}
+11
View File
@@ -331,6 +331,17 @@ namespace IOB_UT_NEXT
/// </summary>
public Dictionary<string, string> itemTranslation { get; set; } = new Dictionary<string, string>();
/// <summary>
/// Separatore configurazione area OPC e subObj in caso di memorie struct speciali
/// </summary>
public char kvDelim { get; set; } = '#';
/// <summary>
/// Separatore definizione aree memoria speciali
/// </summary>
public char memDelim { get; set; } = '.';
/// <summary>
/// Nome variabile x EmergencyStop
/// </summary>
+20 -15
View File
@@ -2,7 +2,9 @@
"BrowseFullVal": "ns=3;s=\"PV_Exchange_DB_R\"",
"BrowseNSIndex": 0,
"BrowseValue": 0,
"keyPartCount": "\"Production\"#GEN.Float.0",
"kvDelim": "#",
"memDelim": ".",
"keyPartCount": "PV_Exchange_DB_R.Production#GEN.Float.0",
"keyPartReq": "",
"keyPartId": "",
"keyProgName": "",
@@ -12,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"
}
@@ -36,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"
}
@@ -51,7 +53,7 @@
"checkMode": "AND",
"checkList": [
{
"keyName": "\"Enabled\"",
"keyName": "PV_Exchange_DB_R.Enabled",
"bitNum": 5,
"targetValue": "1"
}
@@ -61,7 +63,7 @@
"checkMode": "OR",
"checkList": [
{
"keyName": "\"Fabric Run\"",
"keyName": "PV_Exchange_DB_R.Fabric Run",
"bitNum": 0,
"targetValue": "0"
}
@@ -75,7 +77,7 @@
"checkMode": "AND",
"checkList": [
{
"keyName": "\"Alarms\"",
"keyName": "PV_Exchange_DB_R.Alarms",
"bitNum": 0,
"targetValue": "1"
}
@@ -94,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",
@@ -224,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,
@@ -238,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,
@@ -252,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,
@@ -272,7 +277,7 @@
"MemConfWrite": "",
"MaxVal": 9999
},
"BaseIdMask": "\"PV_Exchange_DB_R\".",
"BaseIdMask": "",
"DictOpcNameReplace": {
"\"": ""
}
+1 -1
View File
@@ -3547,7 +3547,7 @@ namespace IOB_WIN_NEXT.Iob
}
//else
//{
// ActiveAlarmList.Add($"Unknown Bit.{i}");
// ActiveAlarmList.Add($"Unknown Num.{i}");
//}
}
}
+89 -15
View File
@@ -143,14 +143,14 @@ namespace IOB_WIN_NEXT.IobOpc
}
else
{
if (diKey.Contains(kvDelim))
if (diKey.Contains(opcUaParams.kvDelim))
{
int iPos = opcUaParams.keyPartCount.IndexOf(kvDelim);
int iPos = opcUaParams.keyPartCount.IndexOf(opcUaParams.kvDelim);
string kRef = opcUaParams.keyPartCount.Substring(0, iPos);
string varDef = opcUaParams.keyPartCount.Substring(iPos + 1);
// recupero byte
byte[] bArray = getDataItemValueBytes(kRef);
answ = ConvBArr(bArray, varDef, kvSet);
answ = ConvBArr(bArray, varDef, opcUaParams.memDelim);
}
else
{
@@ -438,11 +438,7 @@ namespace IOB_WIN_NEXT.IobOpc
Dictionary<string, string> outVal = new Dictionary<string, string>();
return outVal;
}
/// <summary>
/// Delimitatore nei key x indicare la parte di configurazione della variabile
/// </summary>
private char kvDelim = '#';
private char kvSet = '.';
/// <summary>
/// Effettua vero processing contapezzi
/// </summary>
@@ -458,14 +454,14 @@ namespace IOB_WIN_NEXT.IobOpc
{
// cerco parametro contapezzi... gest alternativa se è un parametro SPECIALE (con "#")
string currPzCount = "";
if (opcUaParams.keyPartCount.Contains(kvDelim))
if (opcUaParams.keyPartCount.Contains(opcUaParams.kvDelim))
{
int iPos = opcUaParams.keyPartCount.IndexOf(kvDelim);
int iPos = opcUaParams.keyPartCount.IndexOf(opcUaParams.kvDelim);
string kRef = opcUaParams.keyPartCount.Substring(0, iPos);
string varDef = opcUaParams.keyPartCount.Substring(iPos + 1);
// recupero byte
byte[] bArray = getDataItemValueBytes(kRef);
currPzCount = ConvBArr(bArray, varDef, kvSet);
currPzCount = ConvBArr(bArray, varDef, opcUaParams.memDelim);
}
else
{
@@ -533,7 +529,7 @@ namespace IOB_WIN_NEXT.IobOpc
switch (tVal)
{
case plcDataType.Boolean:
var boolVal = S7.Net.Types.Boolean.GetValue(bArray[currMem.Idx], currMem.Bit);
var boolVal = S7.Net.Types.Boolean.GetValue(bArray[currMem.Idx], currMem.Num);
answ = $"{boolVal}";
break;
case plcDataType.Int:
@@ -565,7 +561,7 @@ namespace IOB_WIN_NEXT.IobOpc
//case plcDataType.RealLH:
// break;
case plcDataType.String:
answ = S7.Net.Types.String.FromByteArray(bArray.Skip(currMem.Idx).Take(currMem.Bit).ToArray());
answ = S7.Net.Types.String.FromByteArray(bArray.Skip(currMem.Idx).Take(currMem.Num).ToArray());
break;
//case plcDataType.HLPInt:
// break;
@@ -895,6 +891,40 @@ namespace IOB_WIN_NEXT.IobOpc
return changed;
}
/// <summary>
/// Fix stringa da versione "raw " a "bonificata"
/// </summary>
/// <param name="origName"></param>
/// <returns></returns>
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;
}
/// <summary>
/// Dizionario chiavi OpcUa bonificate da char non standard
/// </summary>
internal Dictionary<string, string> DictOpcFixKeys { get; set; } = new Dictionary<string, string>();
/// <summary>
/// Verifica ed invia variazioni DAL FORMATO RAW data (byte[])
/// </summary>
@@ -927,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
@@ -937,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)
{
@@ -949,6 +982,46 @@ namespace IOB_WIN_NEXT.IobOpc
{
accodaFLog(sVal, qEncodeFLog(descr, currVal));
//accodaFLog(sVal, qEncodeFLog(descr, $"{NotifyValue}"));
// calcolo eventuali variazioni dati "collegati" in memRead/memWrite...
if (memMap.mMapRead != null && memMap.mMapRead.Count > 0)
{
// elenco aree collegate...
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;
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
{
@@ -1339,6 +1412,7 @@ namespace IOB_WIN_NEXT.IobOpc
{
answ = fullCode.Replace(opcUaParams.BaseIdMask, "");
}
answ = stringFixOpcUaName(answ);
// trimmo spazi x ridurre dimensione se > 50...
if (answ.Length > 50)
{
+3 -3
View File
@@ -29,10 +29,10 @@ namespace IOB_WIN_NEXT.IobSiemens
* STRUTTURA MEMORIA DB101: (scrittura) 14byte, solo 2 impiegati x ora
* NB: segnali da tenere attivi ALMENO 3 secondi x farli recepire
*
* B0.0 Bit Azzeramento volume acqua OSMOSI
* B0.1 Bit Azzeramento volume acqua DEPURAZIONE
* B0.0 Num Azzeramento volume acqua OSMOSI
* B0.1 Num Azzeramento volume acqua DEPURAZIONE
*
* B1.7 Bit Attivazione modo DEMO (0 = disattivato)
* B1.7 Num Attivazione modo DEMO (0 = disattivato)
*
* -------------------------------------------------------------------------------- */
@@ -20,14 +20,14 @@ namespace IOB_WIN_NEXT.IobSiemens
*
*
* DB15
* B0.0 Bit PowerOn
* B0.1 Bit Run
* B0.2 Bit Contapezzi
* B0.3 Bit Allarme
* B0.4 Bit Manuale
* B0.5 Bit MagOutPieno
* B0.6 Bit MagInVuoto
* B0.7 Bit EmergenzaArmata (0=triggered,premuta)
* B0.0 Num PowerOn
* B0.1 Num Run
* B0.2 Num Contapezzi
* B0.3 Num Allarme
* B0.4 Num Manuale
* B0.5 Num MagOutPieno
* B0.6 Num MagInVuoto
* B0.7 Num EmergenzaArmata (0=triggered,premuta)
* Contapezzi DInt 2
* PezziRiman DInt 6
*
+2 -2
View File
@@ -24,7 +24,7 @@ namespace IOB_WIN_NEXT.IobSiemens
* CodComm Array[0..9] of Char DBB20..29
* CodProgr Array[0..9] of Char DBB30..39
*
* DB29 blocco dati letto dal MES Byte Bit
* DB29 blocco dati letto dal MES Byte Num
* CicloOn Bool 0 0
* MacchOn Bool 0 1
* ManualeOn Bool 0 2
@@ -210,7 +210,7 @@ namespace IOB_WIN_NEXT.IobSiemens
* B5: emergenza (1=attiva/premuta, 0=armed)
*
* - BIT di stato
* DB29 blocco dati letto dal MES Byte Bit
* DB29 blocco dati letto dal MES Byte Num
* CicloOn Bool 0 0
* MacchOn Bool 0 1
* ManualeOn Bool 0 2