From ca00e3be997c8ad478d66958942d1bbbe84f7a93 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 3 Nov 2021 18:42:03 +0100 Subject: [PATCH 1/8] update conf x ModBus --- IOB-WIN-NEXT/DATA/CONF/PIZ04.ini | 2 +- IOB-WIN-NEXT/DATA/CONF/PIZ04.json | 84 ++++++++-------- IOB-WIN-NEXT/DATA/CONF/PIZ05.ini | 3 +- IOB-WIN-NEXT/DATA/CONF/PIZ05.json | 102 ++++++++++---------- IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json | 36 +------ IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json.bak | 52 ---------- 6 files changed, 97 insertions(+), 182 deletions(-) delete mode 100644 IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json.bak diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ04.ini b/IOB-WIN-NEXT/DATA/CONF/PIZ04.ini index 0f90a0d0..360b0f55 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ04.ini +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ04.ini @@ -58,7 +58,7 @@ FORCE_DYN_DATA=TRUE DELTA_VAL=0.1 ; clock base (da 10ms) -timerIntMs=150 +timerIntMs=125 ; conf parametri memoria READ/WRITE PARAM_CONF=PIZ04.json diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ04.json b/IOB-WIN-NEXT/DATA/CONF/PIZ04.json index 44bf0e8b..d7e8b895 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ04.json +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ04.json @@ -8,20 +8,20 @@ "index": 489, "size": 2, "minVal": -200, - "maxVal": 200, - "unit": "C" - }, - "SetHighTempGNC": { - "name": "SetHighTempGNC", - "description": "Set point di avviso per alta temperatura all'uscita del vaporizzatore GNC", - "memAddr": "40491", - "tipoMem": "Real", - "index": 491, - "size": 2, - "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, + //"SetHighTempGNC": { + // "name": "SetHighTempGNC", + // "description": "Set point di avviso per alta temperatura all'uscita del vaporizzatore GNC", + // "memAddr": "40491", + // "tipoMem": "Real", + // "index": 491, + // "size": 2, + // "minVal": -200, + // "maxVal": 301, + // "unit": "C" + //}, "SetLowTempAmb": { "name": "SetLowTempAmb", "description": "Set point di avviso per bassa temperatura ambiente nell'impianto", @@ -30,7 +30,7 @@ "index": 421, "size": 2, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, "SetHighTempAmb": { @@ -41,7 +41,7 @@ "index": 423, "size": 2, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" } }, @@ -54,7 +54,7 @@ "index": 1, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 360, "minVal": 0, "maxVal": 100, @@ -68,7 +68,7 @@ "index": 3, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 1, "minVal": 0, "maxVal": 400, @@ -82,7 +82,7 @@ "index": 19, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 1, "minVal": 0, "maxVal": 400, @@ -96,7 +96,7 @@ "index": 21, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 1, "minVal": 0, "maxVal": 400, @@ -110,10 +110,10 @@ "index": 27, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, "TempAmb": { @@ -124,10 +124,10 @@ "index": 11, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, "SetLowTempGNC": { @@ -138,26 +138,26 @@ "index": 489, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, - "unit": "C" - }, - "SetHighTempGNC": { - "name": "SetHighTempGNC", - "description": "Set point di avviso per alta temperatura all'uscita del vaporizzatore GNC", - "memAddr": "40491", - "tipoMem": "Real", - "index": 491, - "size": 2, - "func": "MEDIAN", - "period": 120, - "factor": 1, - "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, + //"SetHighTempGNC": { + // "name": "SetHighTempGNC", + // "description": "Set point di avviso per alta temperatura all'uscita del vaporizzatore GNC", + // "memAddr": "40491", + // "tipoMem": "Real", + // "index": 491, + // "size": 2, + // "func": "MEDIAN", + // "period": 90, + // "factor": 1, + // "minVal": -200, + // "maxVal": 301, + // "unit": "C" + //}, "SetLowTempAmb": { "name": "SetLowTempAmb", "description": "Set point di avviso per bassa temperatura ambiente nell'impianto", @@ -166,10 +166,10 @@ "index": 421, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, "SetHighTempAmb": { @@ -180,10 +180,10 @@ "index": 423, "size": 2, "func": "MEDIAN", - "period": 120, + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" } } diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini b/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini index 6a5cddd4..61d336ca 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini @@ -27,7 +27,6 @@ CMDREBO=/IOB/sendReboot?idxMacchina= ADDR_READ=40001 ADDR_WRITE=40401 SIZE_READ=34 -;SIZE_READ=5046 SIZE_WRITE=358 @@ -59,7 +58,7 @@ FORCE_DYN_DATA=TRUE DELTA_VAL=0.1 ; clock base (da 10ms) -timerIntMs=150 +timerIntMs=125 ; conf parametri memoria READ/WRITE PARAM_CONF=PIZ05.json diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05.json b/IOB-WIN-NEXT/DATA/CONF/PIZ05.json index 994c5db7..45da7ad0 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ05.json +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ05.json @@ -8,20 +8,20 @@ "index": 489, "size": 2, "minVal": -200, - "maxVal": 200, - "unit": "C" - }, - "SetHighTempGNC": { - "name": "SetHighTempGNC", - "description": "Set point di avviso per alta temperatura all'uscita del vaporizzatore GNC", - "memAddr": "40491", - "tipoMem": "Real", - "index": 491, - "size": 2, - "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, + //"SetHighTempGNC": { + // "name": "SetHighTempGNC", + // "description": "Set point di avviso per alta temperatura all'uscita del vaporizzatore GNC", + // "memAddr": "40491", + // "tipoMem": "Real", + // "index": 491, + // "size": 2, + // "minVal": -200, + // "maxVal": 301, + // "unit": "C" + //}, "SetLowTempAmb": { "name": "SetLowTempAmb", "description": "Set point di avviso per bassa temperatura ambiente nell'impianto", @@ -30,7 +30,7 @@ "index": 421, "size": 2, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, "SetHighTempAmb": { @@ -41,7 +41,7 @@ "index": 423, "size": 2, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" } }, @@ -53,8 +53,8 @@ "tipoMem": "Real", "index": 1, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 270, "minVal": 0, "maxVal": 100, @@ -67,8 +67,8 @@ "tipoMem": "Real", "index": 3, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 1, "minVal": 0, "maxVal": 400, @@ -81,8 +81,8 @@ "tipoMem": "Real", "index": 19, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 1, "minVal": 0, "maxVal": 400, @@ -95,8 +95,8 @@ "tipoMem": "Real", "index": 21, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 1, "minVal": 0, "maxVal": 400, @@ -109,11 +109,11 @@ "tipoMem": "Real", "index": 27, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, "TempAmb": { @@ -123,11 +123,11 @@ "tipoMem": "Real", "index": 11, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, "SetLowTempGNC": { @@ -137,27 +137,27 @@ "tipoMem": "Real", "index": 489, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, - "unit": "C" - }, - "SetHighTempGNC": { - "name": "SetHighTempGNC", - "description": "Set point di avviso per alta temperatura all'uscita del vaporizzatore GNC", - "memAddr": "40491", - "tipoMem": "Real", - "index": 491, - "size": 2, - "func": "MAX", - "period": 120, - "factor": 1, - "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, + //"SetHighTempGNC": { + // "name": "SetHighTempGNC", + // "description": "Set point di avviso per alta temperatura all'uscita del vaporizzatore GNC", + // "memAddr": "40491", + // "tipoMem": "Real", + // "index": 491, + // "size": 2, + // "func": "MEDIAN", + // "period": 90, + // "factor": 1, + // "minVal": -200, + // "maxVal": 301, + // "unit": "C" + //}, "SetLowTempAmb": { "name": "SetLowTempAmb", "description": "Set point di avviso per bassa temperatura ambiente nell'impianto", @@ -165,11 +165,11 @@ "tipoMem": "Real", "index": 421, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" }, "SetHighTempAmb": { @@ -179,11 +179,11 @@ "tipoMem": "Real", "index": 423, "size": 2, - "func": "MAX", - "period": 120, + "func": "MEDIAN", + "period": 90, "factor": 1, "minVal": -200, - "maxVal": 200, + "maxVal": 301, "unit": "C" } } diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json b/IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json index 8be1bfee..bcb583bc 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json @@ -4,7 +4,7 @@ "tipoMem": "DInt", "memAddr": "40901", "index": 901, - "size": 4, + "size": 2, "messages": [ "Basso livello serbatoio", "Alto livello serbatoio", @@ -21,22 +21,6 @@ "##", "Allarme rilevatore gas 3", "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", "##" ] }, @@ -45,7 +29,7 @@ "tipoMem": "DInt", "memAddr": "40907", "index": 907, - "size": 4, + "size": 2, "messages": [ "##", "Pulsante di Emergenza Premuto", @@ -62,22 +46,6 @@ "##", "##", "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", "##" ] } diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json.bak b/IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json.bak deleted file mode 100644 index bcb583bc..00000000 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ05_alarm.json.bak +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "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", - "##", - "##" - ] - }, - { - "description": "Emergenza", - "tipoMem": "DInt", - "memAddr": "40907", - "index": 907, - "size": 2, - "messages": [ - "##", - "Pulsante di Emergenza Premuto", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##", - "##" - ] - } -] \ No newline at end of file From b278c29a859813799d26f086d5777c83f36f0f0b Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 3 Nov 2021 18:42:20 +0100 Subject: [PATCH 2/8] Aggiunta attese rilettura --- IOB-WIN-NEXT/IobModbusTCP.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/IOB-WIN-NEXT/IobModbusTCP.cs b/IOB-WIN-NEXT/IobModbusTCP.cs index 7d798664..a66a6167 100644 --- a/IOB-WIN-NEXT/IobModbusTCP.cs +++ b/IOB-WIN-NEXT/IobModbusTCP.cs @@ -221,6 +221,8 @@ namespace IOB_WIN_NEXT // procedo x ogni valore configurato... foreach (var item in memItemList) { + // attesa 50 ms prima di procedere x evitare burst dati + Thread.Sleep(50); double valore = 0; double valoreScal = 0; bool dataOk = false; @@ -781,6 +783,9 @@ namespace IOB_WIN_NEXT // se qualcosa è andato storto riprovo a caricare SOLO gli errori... 1 sola volta if (readErrorList.Count > 0) { + lgInfo("Attesa prima di rilettura"); + // attendo 3 sec + Thread.Sleep(3000); lgInfo($"Effettuo rilettura per {readErrorList.Count} variabili"); readErrorListRepeat = getDataDictionary(readErrorList, ref outVal); } @@ -880,9 +885,16 @@ namespace IOB_WIN_NEXT public int[] readInputReg(int startAddr, int qty) { int[] answ = new int[2]; - if (currPLC.Connected) + try { - answ = currPLC.ReadInputRegisters(startAddr, qty); + if (currPLC.Connected) + { + answ = currPLC.ReadInputRegisters(startAddr, qty); + } + } + catch (Exception exc) + { + lgError($"Errore in readInputReg{Environment.NewLine}{exc}"); } return answ; } From d9a648296189f71eef857f605dd0c2791f9a7b8d Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 3 Nov 2021 19:10:08 +0100 Subject: [PATCH 3/8] test secondo impianto modbus --- IOB-WIN-NEXT/DATA/CONF/MAIN.ini | 2 +- IOB-WIN-NEXT/DATA/CONF/PIZ05.ini | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini index 45436e05..4528af4b 100644 --- a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini +++ b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini @@ -72,6 +72,6 @@ CLI_INST=SteamWareSim ;STARTLIST=FP_TR2 ;STARTLIST=PING ;STARTLIST=SIM_PIZ03 -STARTLIST=PIZ04 +STARTLIST=PIZ05 MAXCNC=10 \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini b/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini index 61d336ca..2cd480d9 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini @@ -13,8 +13,8 @@ IP=hambaganzola.dyndns.org PORT=502 [SERVER] -;MPIP=https://localhost:44339 -MPIP=https://gwms.egalware.com +MPIP=https://localhost:44339 +;MPIP=https://gwms.egalware.com MPURL=/api CMDBASE=/IOB/input/ CMDFLOG=/IOB/flog/ From b8f352696a14c3149d9622b571546608f9cd6b22 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 3 Nov 2021 19:10:14 +0100 Subject: [PATCH 4/8] cleanup + check resp --- IOB-UT-NEXT/ToMapo.cs | 76 -------------------------------------- IOB-WIN-NEXT/IobGeneric.cs | 2 +- 2 files changed, 1 insertion(+), 77 deletions(-) diff --git a/IOB-UT-NEXT/ToMapo.cs b/IOB-UT-NEXT/ToMapo.cs index 090ffaf6..f673e0f0 100644 --- a/IOB-UT-NEXT/ToMapo.cs +++ b/IOB-UT-NEXT/ToMapo.cs @@ -189,82 +189,6 @@ namespace IOB_UT_NEXT #endregion Public Methods } -#if false - /// - /// Struttura della conf memoria ModBus - /// - public class BaseModbusConf - { - public enum DataType - { - ND = 0, - BIT, - INT, - REAL - } - - public enum MemType - { - ND = 0, - DiscreteInput = 1, - Coil = 2, - InputRegister = 3, - HoldingRegister = 4 - } - - /// - /// Elenco aree memoria ModBus in lettura - /// - public List mMapRead { get; set; } = new List(); - - /// - /// Elenco aree memoria ModBus in scrittura - /// - public List mMapWrite { get; set; } = new List(); - - /// - /// struttura di base memoria ModBus - /// - public class ModbusMemArea - { - public ushort BaseAddr { get; set; } = 0; - public string RawAddr { get; set; } = ""; - public ushort Size { get; set; } = 0; - - [JsonConverter(typeof(StringEnumConverter))] - public MemType Type { get; set; } = MemType.ND; - - public List VarList { get; set; } = new List(); - } - - public class VarConf - { - public string description { get; set; } = ""; - public int factor { get; set; } = 1; - - public bool hasRange - { - get - { - return !this.minVal.Equals(this.maxVal); - } - } - - public ushort index { get; set; } = 0; - public int maxVal { get; set; } = 0; - public string memAddr { get; set; } = ""; - public int minVal { get; set; } = 0; - public string name { get; set; } = "none"; - public ushort size { get; set; } = 0; - - [JsonConverter(typeof(StringEnumConverter))] - public DataType tipoMem { get; set; } = DataType.ND; - - public string value { get; set; } = ""; - } - } -#endif - /// /// Classe gestione configurazione parametri di base x configuraizone estesa (es MTConnect, OPC-UA, ...) /// diff --git a/IOB-WIN-NEXT/IobGeneric.cs b/IOB-WIN-NEXT/IobGeneric.cs index c38ea12b..57f284f0 100644 --- a/IOB-WIN-NEXT/IobGeneric.cs +++ b/IOB-WIN-NEXT/IobGeneric.cs @@ -2964,7 +2964,7 @@ namespace IOB_WIN_NEXT { // invio su cloud conf memoria... string rawData = JsonConvert.SerializeObject(memMap); - utils.callUrlNow($"{urlSaveMemMap}", rawData); + var resp = utils.callUrlNow($"{urlSaveMemMap}", rawData); // salvo ANCHE come parametri i valori... objItem currItem = new objItem(); List allParam = new List(); From 3772165a29d3a4a4456168b83bd71b9ec424b389 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 Nov 2021 15:22:15 +0100 Subject: [PATCH 5/8] Aggiuntas conf memoria OUT --- IOB-UT-NEXT/ToMapo.cs | 12 ++++++++++++ IOB-WIN-NEXT/DATA/CONF/PIZ05.ini | 3 +++ IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json | 6 ++++++ 3 files changed, 21 insertions(+) create mode 100644 IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json diff --git a/IOB-UT-NEXT/ToMapo.cs b/IOB-UT-NEXT/ToMapo.cs index f673e0f0..3208a847 100644 --- a/IOB-UT-NEXT/ToMapo.cs +++ b/IOB-UT-NEXT/ToMapo.cs @@ -301,6 +301,18 @@ namespace IOB_UT_NEXT #endregion Public Properties } + /// + /// COnfigurazione blocchi x accesso memoria ottimizzato + /// + public class MemBlockConf + { + #region Public Properties + + public Dictionary ReadBlocks { get; set; } = new Dictionary(); + + #endregion Public Properties + } + /// /// Classe gestione configurazione parametri specifici MTC da BaseParamConf /// diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini b/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini index 2cd480d9..1b5487dd 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini @@ -64,6 +64,9 @@ timerIntMs=125 PARAM_CONF=PIZ05.json NO_PING=TRUE +; conf blocchi memoria x READ +MEM_BLOCK=PIZ05_MBlock.json + ; conf aree allarme ALARM_CONF=PIZ05_alarm.json diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json new file mode 100644 index 00000000..e6c4623d --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ05_MBlock.json @@ -0,0 +1,6 @@ +{ + "ReadBlocks": { + "40001": 64, + "40421": 72 + } +} \ No newline at end of file From 5f2dc03c592c6578ad2ebcc388935f3cad30f95e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 Nov 2021 15:22:28 +0100 Subject: [PATCH 6/8] Modifica test lettura ModBus con blocchi (test) --- IOB-WIN-NEXT/IOB-WIN-NEXT.csproj | 3 + IOB-WIN-NEXT/IobModbusTCP.cs | 113 +++++++++++++++++++------------ IOB-WIN-NEXT/IobModbusTCPHam.cs | 55 ++++++++------- 3 files changed, 104 insertions(+), 67 deletions(-) diff --git a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj index 57662873..020e0aad 100644 --- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj +++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj @@ -391,6 +391,9 @@ Always + + Always + Always diff --git a/IOB-WIN-NEXT/IobModbusTCP.cs b/IOB-WIN-NEXT/IobModbusTCP.cs index a66a6167..19dc0886 100644 --- a/IOB-WIN-NEXT/IobModbusTCP.cs +++ b/IOB-WIN-NEXT/IobModbusTCP.cs @@ -5,11 +5,13 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Linq; using System.Net.NetworkInformation; using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Windows.Forms; namespace IOB_WIN_NEXT { @@ -49,11 +51,6 @@ namespace IOB_WIN_NEXT /// protected Dictionary memSetR = new Dictionary(); - /// - /// Setup blocchi memorie write (indirizzo inizio, size) - /// - protected Dictionary memSetW = new Dictionary(); - /// /// parametri di connessione /// @@ -75,7 +72,6 @@ namespace IOB_WIN_NEXT public IobModbusTCP(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) { lgInfo("NEW IOB ModBus TCP"); - setupMemBlocks(); memMap = new plcMemMap(); if (IOBConf != null) { @@ -492,45 +488,11 @@ namespace IOB_WIN_NEXT { lgError(exc, "Errore in parse parametri da IOBConf"); } - // ora tento avvio PLC... SE PING OK... - IPStatus esitoPing = testPingMachine; - if (esitoPing == IPStatus.Success) - { - needRefresh = false; - try - { - //Ip-Address and Port of Modbus-TCP-Server - currPLC = new ModbusClient(parametri.ipAdrr, parametri.port); - // disconnetto e connetto... - if (isVerboseLog) - { - lgInfo("ModBus TCP: tryDisconnect"); - } - tryDisconnect(); - - // lo ripeto x evitare che ci sia un loop... e tryConnect richiami la procedura corrente... - needRefresh = false; - lgInfo("ModBus TCP: tryConnect"); - tryConnect(); - lgInfo("End init Adapter ModBusTCP"); - if (isVerboseLog) - { - lgInfo("ModBus TCP CONNESSIONE AVVENUTA"); - } - } - catch (Exception exc) - { - lgError(exc, "Errore in INIT ModBusTCP"); - } - } - else - { - lgError($"Errore in ping: esito {esitoPing}"); - } - parentForm.commPlcActive = false; // carico conf vettore memoria... loadMemConf(); + // avvio conf blocchi memoria + setupMemBlocks(); // aggiungo DELTA x calcolo min/MAX... string deltaValStr = getOptPar("DELTA_VAL"); if (!string.IsNullOrEmpty(deltaValStr)) @@ -574,6 +536,44 @@ namespace IOB_WIN_NEXT lgError(exc, "Errore in contapezzi ModBusTCP"); } } + + // ora tento avvio PLC... SE PING OK... + IPStatus esitoPing = testPingMachine; + if (esitoPing == IPStatus.Success) + { + needRefresh = false; + try + { + //Ip-Address and Port of Modbus-TCP-Server + currPLC = new ModbusClient(parametri.ipAdrr, parametri.port); + + // disconnetto e connetto... + if (isVerboseLog) + { + lgInfo("ModBus TCP: tryDisconnect"); + } + tryDisconnect(); + + // lo ripeto x evitare che ci sia un loop... e tryConnect richiami la procedura corrente... + needRefresh = false; + lgInfo("ModBus TCP: tryConnect"); + tryConnect(); + lgInfo("End init Adapter ModBusTCP"); + if (isVerboseLog) + { + lgInfo("ModBus TCP CONNESSIONE AVVENUTA"); + } + } + catch (Exception exc) + { + lgError(exc, "Errore in INIT ModBusTCP"); + } + } + else + { + lgError($"Errore in ping: esito {esitoPing}"); + } + parentForm.commPlcActive = false; } else { @@ -585,8 +585,33 @@ namespace IOB_WIN_NEXT /// /// effettua il setup dei memblock da gestire (NON leggo intera memoria ma tanti blocchi...) /// - protected virtual void setupMemBlocks() - { } + protected void setupMemBlocks() + { + // se configurato -_> deserializzo + string confFile = getOptPar("MEM_BLOCK"); + if (!string.IsNullOrEmpty(confFile)) + { + string jsonFileName = $"{Application.StartupPath}/DATA/CONF/{confFile}"; + lgInfo($"Apertura file {jsonFileName}"); + using (StreamReader reader = new StreamReader(jsonFileName)) + { + string jsonData = reader.ReadToEnd(); + if (!string.IsNullOrEmpty(jsonData)) + { + lgInfo($"File json MemBlock composto da {jsonData.Length} caratteri"); + try + { + var currMem = JsonConvert.DeserializeObject(jsonData); + memSetR = currMem.ReadBlocks; + } + catch (Exception exc) + { + lgError($"Errore in setupMemBlock{Environment.NewLine}{exc}"); + } + } + } + } + } /// /// Test connessione CNC diff --git a/IOB-WIN-NEXT/IobModbusTCPHam.cs b/IOB-WIN-NEXT/IobModbusTCPHam.cs index 83148ecb..ae55af71 100644 --- a/IOB-WIN-NEXT/IobModbusTCPHam.cs +++ b/IOB-WIN-NEXT/IobModbusTCPHam.cs @@ -34,12 +34,15 @@ namespace IOB_WIN_NEXT public IobModbusTCPHam(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) { lgInfo("NEW IOB ModBus TCP HAM"); + // provo lettura una prima volta i dati DYN if (currPLC != null && currPLC.Connected) { try { processDynData(); + + testRead(); } catch (Exception exc) { @@ -102,6 +105,30 @@ namespace IOB_WIN_NEXT #region Private Methods + private void testBlockRead(int baseAddr, int numByte) + { + int baseHold = 40001; + int[] readTestFull = new int[2]; + lgInfo($"-------------------- Inizio test lettura {baseAddr} --------------------"); + try + { + stopwatch.Restart(); + readTestFull = currPLC.ReadHoldingRegisters(baseAddr - baseHold, numByte); + stopwatch.Stop(); + lgInfo($"Stats lettura | {readTestFull.Length} val | {stopwatch.ElapsedMilliseconds}ms"); + } + catch + { } + + for (int i = 0; i < readTestFull.Length / 2; i++) + { + int[] thisSet = new int[2]; + Array.Copy(readTestFull, i * 2, thisSet, 0, 2); + lgInfo($"{baseAddr + i * 2:000} | HoldingRegisters: {thisSet[0]} / {thisSet[1]} | Val Real: {ModbusClient.ConvertRegistersToFloat(thisSet):N6}"); + } + lgInfo("-------------------- Completato test lettura {baseAddr} --------------------"); + } + private void testRead() { //Ip-Address and Port of Modbus-TCP-Server @@ -112,21 +139,12 @@ namespace IOB_WIN_NEXT //bool[] readCoils = modbusClient.ReadCoils(9, 10); //Read 10 Coils from Server, starting with address 10 //int[] readHoldingRegisters = currPLC.ReadHoldingRegisters(0, 34); //Read 10 Holding Registers from Server, starting with Address 1 - int[] readHR1000 = currPLC.ReadHoldingRegisters(0, 100); //Read 10 Holding Registers from Server, starting with Address 1 + //testBlockRead(40001, 32); + testBlockRead(40001, 64); + //testBlockRead(40001, 120); - //// Console Output - //for (int i = 0; i < readCoils.Length; i++) - // Console.WriteLine("Value of Coil " + (9 + i + 1) + " " + readCoils[i].ToString()); - - for (int i = 0; i < readHR1000.Length / 2; i++) - { - Console.WriteLine($"Value of HoldingRegister {(i)} | {readHR1000[i]} / {readHR1000[i + 1]}"); - int[] thisSet = new int[2]; - Array.Copy(readHR1000, i, thisSet, 0, 2); - Console.WriteLine($"Convert val HoldingRegister {(i)} | {ModbusClient.ConvertRegistersToFloat(thisSet)}"); - } - //Console.Write("Press any key to continue . . . "); - //Console.ReadKey(true); + testBlockRead(40421, 72); + //testBlockRead(40401, 100); } #endregion Private Methods @@ -174,15 +192,6 @@ namespace IOB_WIN_NEXT B_input = byteSignals; } - /// - /// effettua il setup dei memblock da gestire (NON leggo intera memoria ma tanti blocchi...) - /// - protected override void setupMemBlocks() - { - // da calcolare... ora setup cablato... - memSetR.Add(1, 34); - } - #endregion Protected Methods #region Public Methods From ac7d7d763b088abfabe3f404116656d1785fa665 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 Nov 2021 16:10:23 +0100 Subject: [PATCH 7/8] Update conf x PIZ --- IOB-WIN-NEXT/DATA/CONF/PIZ04.ini | 2 ++ IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json | 6 ++++++ IOB-WIN-NEXT/DATA/CONF/PIZ05.ini | 1 - 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ04.ini b/IOB-WIN-NEXT/DATA/CONF/PIZ04.ini index 360b0f55..2ca54e21 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ04.ini +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ04.ini @@ -64,6 +64,8 @@ timerIntMs=125 PARAM_CONF=PIZ04.json NO_PING=FALSE +; conf blocchi memoria x READ +MEM_BLOCK=PIZ04_MBlock.json ; conf aree allarme ALARM_CONF=PIZ04_alarm.json diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json new file mode 100644 index 00000000..e6c4623d --- /dev/null +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ04_MBlock.json @@ -0,0 +1,6 @@ +{ + "ReadBlocks": { + "40001": 64, + "40421": 72 + } +} \ No newline at end of file diff --git a/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini b/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini index 1b5487dd..6a2d8c6c 100644 --- a/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini +++ b/IOB-WIN-NEXT/DATA/CONF/PIZ05.ini @@ -66,7 +66,6 @@ PARAM_CONF=PIZ05.json NO_PING=TRUE ; conf blocchi memoria x READ MEM_BLOCK=PIZ05_MBlock.json - ; conf aree allarme ALARM_CONF=PIZ05_alarm.json From 7a0dbe288e0864def1e9fc794aabe37bb35769fa Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 4 Nov 2021 16:10:39 +0100 Subject: [PATCH 8/8] Update gestione lettura da LUT --- IOB-WIN-NEXT/App.config | 304 +++++++++++++++---------------- IOB-WIN-NEXT/IOB-WIN-NEXT.csproj | 3 + IOB-WIN-NEXT/IobModbusTCP.cs | 107 +++++++++-- IOB-WIN-NEXT/IobModbusTCPHam.cs | 13 +- 4 files changed, 254 insertions(+), 173 deletions(-) diff --git a/IOB-WIN-NEXT/App.config b/IOB-WIN-NEXT/App.config index 8ce1851f..0e3ca8f3 100644 --- a/IOB-WIN-NEXT/App.config +++ b/IOB-WIN-NEXT/App.config @@ -1,155 +1,155 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 020e0aad..ffeb02eb 100644 --- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj +++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj @@ -391,6 +391,9 @@ Always + + Always + Always diff --git a/IOB-WIN-NEXT/IobModbusTCP.cs b/IOB-WIN-NEXT/IobModbusTCP.cs index 19dc0886..5d23e960 100644 --- a/IOB-WIN-NEXT/IobModbusTCP.cs +++ b/IOB-WIN-NEXT/IobModbusTCP.cs @@ -36,6 +36,11 @@ namespace IOB_WIN_NEXT protected ModbusClient currPLC; + /// + /// Copia locale dei valori in Holding Registry, come array chiave (int) valori int[] letti tramite ModBus, da convertire secondo tipo + /// + protected Dictionary HoldingRegisterLUT = new Dictionary(); + /// /// Ultimo controllo ping x evitare ping flood... /// @@ -208,7 +213,13 @@ namespace IOB_WIN_NEXT return valUInt; } - private Dictionary getDataDictionary(Dictionary memItemList, ref Dictionary outVal) + /// + /// Recupero dati da singole letture + /// + /// Valori da processare + /// Dizionario valori in uscita + /// Errori di lettura + private Dictionary getDataDictionary(Dictionary memItemList, bool useLUT, ref Dictionary outVal) { Dictionary readErrorList = new Dictionary(); // inizializzo i valori @@ -218,7 +229,10 @@ namespace IOB_WIN_NEXT foreach (var item in memItemList) { // attesa 50 ms prima di procedere x evitare burst dati - Thread.Sleep(50); + if (useLUT) + { + Thread.Sleep(50); + } double valore = 0; double valoreScal = 0; bool dataOk = false; @@ -244,7 +258,18 @@ namespace IOB_WIN_NEXT break; case modBusAddrType.HoldingRegister: - listInt = readHoldReg(item.Value.index - 1, item.Value.size); + if (useLUT) + { + int lutAddress = 40000 + item.Value.index; + if (HoldingRegisterLUT.ContainsKey(lutAddress)) + { + listInt = HoldingRegisterLUT[lutAddress]; + } + } + else + { + listInt = readHoldReg(item.Value.index - 1, item.Value.size); + } valore = convertFromReg(listInt, item.Value.size, item.Value.tipoMem); break; @@ -301,6 +326,54 @@ namespace IOB_WIN_NEXT } } + /// + /// Effettua lettura blocco memoria indicato e lo salva in copia locale HoldingRegisterLUT + /// + /// Indirizzo di aprtenza + /// NUm registri da leggere (max 120) + private void readBlockHoldingReg(int startAddr, int numReg) + { + // fix massima lunghezza pacchetto + if (numReg > 120) + { + lgError($"Attenzione richiesta lettura blocco troppo grande: numReg {numReg} --> 120"); + numReg = 120; + } + // si lavora rispetto all'indirizzo base 40001 + int baseAddr = 40001; + int[] rawData = new int[2]; + try + { + stopwatch.Restart(); + rawData = currPLC.ReadHoldingRegisters(startAddr - baseAddr, numReg); + stopwatch.Stop(); + lgInfo($"Lettura in blocco HoldingRegisters| startAddr: {startAddr} | numReg {numReg} | {stopwatch.ElapsedMilliseconds}ms"); + // salvo in LUT la versione ESPLOSA 2 byte alla volta... + if (rawData.Length > 0) + { + for (int i = 0; i < rawData.Length / 2; i++) + { + int[] thisSet = new int[2]; + Array.Copy(rawData, i * 2, thisSet, 0, 2); + // salvo nel registro... + int currAddr = startAddr + i * 2; + if (HoldingRegisterLUT.ContainsKey(currAddr)) + { + HoldingRegisterLUT[currAddr] = thisSet; + } + else + { + HoldingRegisterLUT.Add(currAddr, thisSet); + } + } + } + } + catch (Exception exc) + { + lgError($"Eccezione in readBlockHoldingReg{Environment.NewLine}{exc}"); + } + } + #endregion Private Methods #region Protected Methods @@ -795,29 +868,39 @@ namespace IOB_WIN_NEXT } else { + Dictionary readErrorList = new Dictionary(); + Dictionary readErrorListRepeat = new Dictionary(); + bool useLUT = memSetR != null && memSetR.Count > 0; + // se configurato leggo IN BLOCCHI da memoria... + if (useLUT) + { + foreach (var item in memSetR) + { + readBlockHoldingReg(item.Key, item.Value); + } + } + // procedo ... try { // processo x ogni valore configurato... if (memMap.mMapRead.Count > 0) { - Dictionary readErrorList = new Dictionary(); - Dictionary readErrorListRepeat = new Dictionary(); var memItemList = memMap.mMapRead; - readErrorList = getDataDictionary(memItemList, ref outVal); + readErrorList = getDataDictionary(memItemList, useLUT, ref outVal); // se qualcosa è andato storto riprovo a caricare SOLO gli errori... 1 sola volta if (readErrorList.Count > 0) { - lgInfo("Attesa prima di rilettura"); + lgInfo($"Attesa prima di rilettura | LUT: {useLUT}"); // attendo 3 sec Thread.Sleep(3000); - lgInfo($"Effettuo rilettura per {readErrorList.Count} variabili"); - readErrorListRepeat = getDataDictionary(readErrorList, ref outVal); + lgInfo($"Effettuo rilettura per {readErrorList.Count} variabili | LUT: {useLUT}"); + readErrorListRepeat = getDataDictionary(readErrorList, useLUT, ref outVal); } // se avessi ancora errori --> disconnetto if (readErrorListRepeat.Count > 0) { - lgInfo("Trovati valori non validi al secondo tentativo --> invalido valori letti e resetto adapter con tryDisconnect!"); + lgInfo($"Trovati valori non validi al secondo tentativo | LUT: {useLUT} --> invalido valori letti e resetto adapter con tryDisconnect!"); tryDisconnect(); // invalido output outVal = new Dictionary(); @@ -830,12 +913,12 @@ namespace IOB_WIN_NEXT } else { - lgInfo($"getDynData: {memMap.mMapRead.Count} record in mMapRead"); + lgInfo($"getDynData: {memMap.mMapRead.Count} record in mMapRead | LUT: {useLUT}"); } } catch (Exception exc) { - lgError(exc, "Errore in getDynData x ModBus TCP PLC --> ciclo disconnect/reconnect"); + lgError(exc, "Errore in getDynData x ModBus TCP PLC --> ciclo disconnect/reconnect | LUT: {useLUT}"); tryDisconnect(); outVal = new Dictionary(); tryConnect(); diff --git a/IOB-WIN-NEXT/IobModbusTCPHam.cs b/IOB-WIN-NEXT/IobModbusTCPHam.cs index ae55af71..12accd6a 100644 --- a/IOB-WIN-NEXT/IobModbusTCPHam.cs +++ b/IOB-WIN-NEXT/IobModbusTCPHam.cs @@ -41,8 +41,6 @@ namespace IOB_WIN_NEXT try { processDynData(); - - testRead(); } catch (Exception exc) { @@ -138,13 +136,10 @@ namespace IOB_WIN_NEXT //modbusClient.WriteMultipleCoils(4, new bool[] { true, true, true, true, true, true, true, true, true, true }); //Write Coils starting with Address 5 //bool[] readCoils = modbusClient.ReadCoils(9, 10); //Read 10 Coils from Server, starting with address 10 //int[] readHoldingRegisters = currPLC.ReadHoldingRegisters(0, 34); //Read 10 Holding Registers from Server, starting with Address 1 - - //testBlockRead(40001, 32); - testBlockRead(40001, 64); - //testBlockRead(40001, 120); - - testBlockRead(40421, 72); - //testBlockRead(40401, 100); + foreach (var item in memSetR) + { + testBlockRead(item.Key, item.Value); + } } #endregion Private Methods