From 435b13d58cd8fc83f4d9d9a6b350a3bd5d7fcb02 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 1 Jun 2022 16:51:45 +0200 Subject: [PATCH 1/7] Aggiunta un altra metrica da SOAP client --- EgwProxy.Icoel/Compac/ComClient.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/EgwProxy.Icoel/Compac/ComClient.cs b/EgwProxy.Icoel/Compac/ComClient.cs index 587f5dd6..3f5ee6e6 100644 --- a/EgwProxy.Icoel/Compac/ComClient.cs +++ b/EgwProxy.Icoel/Compac/ComClient.cs @@ -182,18 +182,20 @@ namespace EgwProxy.Icoel.Compac internal Dictionary GetPerfMeters() { Dictionary answ = new Dictionary(); - // indicata in tonnOra + // velocità processo indicata in tonnellate /oOra double velTonnOra = SSClient.GetMachineTonnesPH(); // velocità espressa in frutti/minuto double velFruttiMinuto = SSClient.GetMachineTotalFPM(); // percentuale riempimento carrellini double percRiemp = SSClient.GetMachineCupfill(); - //// indicata in carrelli/minuto - //int[] velCarrMinuto = SSClient.GetMachineRodsPM(); + // Numero confezioni/ora + double numPackOra = SSClient.GetMachinePacksPH(); + // accodo i valori ricavati - answ.Add("VelTonnOra", velTonnOra); - answ.Add("VelFruttiMinuto", velFruttiMinuto); + answ.Add("NumPacksOra", numPackOra); answ.Add("PercRiemp", percRiemp); + answ.Add("VelFruttiMinuto", velFruttiMinuto); + answ.Add("VelTonnOra", velTonnOra); return answ; } From 5adee48d512aa5a3a73a60dd69138f3dd4b36690 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 1 Jun 2022 16:52:10 +0200 Subject: [PATCH 2/7] Aggiunto recupero CurrData da DB + update SyncStateModel --- .../Controllers/DbController.cs | 208 ++++-------------- .../DatabaseModels/CurrDataModel.cs | 19 ++ .../DatabaseModels/SyncStateModel.cs | 2 + .../EgwProxy.Icoel.DataLayer.csproj | 1 + .../SyncStateDbContext.cs | 7 +- 5 files changed, 72 insertions(+), 165 deletions(-) create mode 100644 EgwProxy.Icoel.DataLayer/DatabaseModels/CurrDataModel.cs diff --git a/EgwProxy.Icoel.DataLayer/Controllers/DbController.cs b/EgwProxy.Icoel.DataLayer/Controllers/DbController.cs index 0727fdb5..98ab5ffd 100644 --- a/EgwProxy.Icoel.DataLayer/Controllers/DbController.cs +++ b/EgwProxy.Icoel.DataLayer/Controllers/DbController.cs @@ -2,8 +2,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; /*------------------------------------------------ * Aggiunto fix come da link seguente: @@ -14,6 +12,7 @@ using System.Threading.Tasks; * using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices; * */ + namespace EgwProxy.Icoel.DataLayer.Controllers { /// @@ -26,29 +25,9 @@ namespace EgwProxy.Icoel.DataLayer.Controllers private static ExportDbContext dbExportCtx; private static TrackerDbContext dbTrackerCtx; #endif - private static SyncStateDbContext dbSyncStateCtx; - private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); -#if false - /// - /// Avvio dell'oggetto gestione DB con le 3 stringhe di connessione specifiche - /// - /// Connesisone Db frontiera Entrata Merce - /// Connessione DB Tracker - /// Connessione DB IcoelExport - /// Connessione DB locale di SYNC - public DbController(string connEntrata, string connTracker, string connExport, string connSyncState) - { - dbEntrataCtx = new EntrataDbContext(connEntrata); - Log.Info("Avviata classe EntrataDbContext"); - dbExportCtx = new ExportDbContext(connExport); - Log.Info("Avviata classe ExportDbContext"); - dbTrackerCtx = new TrackerDbContext(connTracker); - Log.Info("Avviata classe dbTrackerCtx"); - dbSyncStateCtx = new SyncStateDbContext(connSyncState); - Log.Info("Avviata classe dbSyncStateCtx"); - } -#endif + #region Public Constructors + /// /// Avvio dell'oggetto gestione DB con stringa di connessione specifica /// @@ -59,6 +38,25 @@ namespace EgwProxy.Icoel.DataLayer.Controllers Log.Info("Avviata classe dbSyncStateCtx"); } + #endregion Public Constructors + + #region Public Methods + + /// + /// Recupera la tab di CurrData corrente + /// + /// + public List CurrDataGetAll() + { + List dbResult = new List(); + + dbResult = dbSyncStateCtx + .DbSetCurrData + .ToList(); + + return dbResult; + } + /// /// Dispose classe /// @@ -73,94 +71,6 @@ namespace EgwProxy.Icoel.DataLayer.Controllers dbSyncStateCtx.Dispose(); } -#if false - /// - /// Elenco record Entrata Merce (Frontiera) - /// - /// idx da cui partire a recuperare - /// - public List EntrateGetFromIdx(int minIdx = 0) - { - List dbResult = new List(); - dbResult = dbEntrataCtx - .DbSetEntrataMerce - .Where(x => (x.ID_CHIAVE >= minIdx)) - .OrderBy(x => x.ID_CHIAVE) - .ToList(); - - return dbResult; - } - - /// - /// Elenco ultimi record Entrata Merce (Frontiera) - /// - /// numero records da recuperare - /// - public List EntrateGetLast(int numRec = 100) - { - List dbResult = new List(); - dbResult = dbEntrataCtx - .DbSetEntrataMerce - .OrderByDescending(x => x.ID_CHIAVE) - .Take(numRec) - .ToList(); - - return dbResult; - } - - /// - /// Elenco record ProductsTotal (da Icoel Export Products) - /// - /// idx da cui partire a recuperare - /// - public List ExportProductsGetFromIdx(int minIdx = 0) - { - List dbResult = new List(); - dbResult = dbExportCtx - .DbSetProductsTotals - .Where(x => (x.SizerBatchId >= minIdx)) - .OrderBy(x => x.SizerBatchId) - .ToList(); - - return dbResult; - } - - /// - /// Elenco ultimi record ProductsTotal (da Icoel Export Products) - /// - /// numero records da recuperare - /// - public List ExportProductsGetLast(int numRec = 0) - { - List dbResult = new List(); - dbResult = dbExportCtx - .DbSetProductsTotals - .OrderByDescending(x => x.SizerBatchId) - .ThenByDescending(x => x.Index) - .Take(numRec) - .ToList(); - - return dbResult; - } -#endif - - /// - /// Esegue una volta la stored di ImportAll (x recupero dati da DB esterni) e poi - /// restitusice in output la tab di SyncState x verificare lo stato - /// - /// - public List SyncStateDoImportAll() - { - List dbResult = new List(); - - dbResult = dbSyncStateCtx - .Database - .SqlQuery("EXEC stp_ImportAll") - .ToList(); - - return dbResult; - } - /// /// Esegue una volta la stored di ImportAll (x recupero dati da DB esterni) e poi /// restitusice in output la tab di SyncState x verificare lo stato @@ -178,6 +88,23 @@ namespace EgwProxy.Icoel.DataLayer.Controllers return dbResult; } + /// + /// Esegue una volta la stored di ImportAll (x recupero dati da DB esterni) e poi + /// restitusice in output la tab di SyncState x verificare lo stato + /// + /// + public List SyncStateDoImportAll() + { + List dbResult = new List(); + + dbResult = dbSyncStateCtx + .Database + .SqlQuery("EXEC stp_ImportAll") + .ToList(); + + return dbResult; + } + /// /// recupera la tab di SyncState corrente /// @@ -193,60 +120,13 @@ namespace EgwProxy.Icoel.DataLayer.Controllers return dbResult; } -#if false - /// - /// Elenco record DettConfezioni (da Icoel TrackerLotti) - /// - /// idx da cui partire a recuperare - /// - public List TrackConfezioniGetFromIdx(int minIdx = 0) - { - List dbResult = new List(); - dbResult = dbTrackerCtx - .DbSetConfezioni - .Where(x => (x.Pack_Id >= minIdx)) - .OrderBy(x => x.Pack_Id) - .ToList(); + #endregion Public Methods - return dbResult; - } + #region Private Fields - /// - /// Elenco ultimi record DettaglioConfezioni (da Icoel TrackerLotti) - /// - /// numero records da recuperare - /// - public List TrackConfezioniGetLast(int numRec = 0) - { - List dbResult = new List(); - dbResult = dbTrackerCtx - .DbSetConfezioni - .OrderByDescending(x => x.Pack_Id) - .Take(numRec) - .ToList(); + private static SyncStateDbContext dbSyncStateCtx; + private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); - return dbResult; - } - - /// - /// Elenco dettaglio conferimento x PackId (da Icoel TrackerLotti) - /// ATTENZIONE: in caso di mancata associazione lotto ingresso con lavorazione corrente la - /// vista restituisce nuovo (possibile lavorare senza lotto ingresso e senza tracking) - /// - /// idx da cui partire a recuperare - /// - public List TrackPackConfDetailByIdx(long packId = 0) - { - List dbResult = new List(); - dbResult = dbTrackerCtx - .DbSetConferimento - .Where(x => (x.PackId == packId)) - .OrderBy(x => x.NUMERO_LOTTO) - .ThenByDescending(x => x.QUANTITA_ENTRATA) - .ToList(); - - return dbResult; - } -#endif + #endregion Private Fields } } \ No newline at end of file diff --git a/EgwProxy.Icoel.DataLayer/DatabaseModels/CurrDataModel.cs b/EgwProxy.Icoel.DataLayer/DatabaseModels/CurrDataModel.cs new file mode 100644 index 00000000..f6fb6573 --- /dev/null +++ b/EgwProxy.Icoel.DataLayer/DatabaseModels/CurrDataModel.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Data.Entity.Spatial; + +namespace EgwProxy.Icoel.DataLayer.DatabaseModels +{ + + [Table("CurrData")] + public partial class CurrDataModel + { + [Key] + [StringLength(50)] + public string Topic { get; set; } + + public decimal CurrVal { get; set; } = 0; + } +} diff --git a/EgwProxy.Icoel.DataLayer/DatabaseModels/SyncStateModel.cs b/EgwProxy.Icoel.DataLayer/DatabaseModels/SyncStateModel.cs index 477c3fc5..b37fa326 100644 --- a/EgwProxy.Icoel.DataLayer/DatabaseModels/SyncStateModel.cs +++ b/EgwProxy.Icoel.DataLayer/DatabaseModels/SyncStateModel.cs @@ -25,5 +25,7 @@ namespace EgwProxy.Icoel.DataLayer.DatabaseModels public long NumRecIn { get; set; } public long NumRecOut { get; set; } + + public DateTime LastUpdate { get; set; } = DateTime.Today; } } diff --git a/EgwProxy.Icoel.DataLayer/EgwProxy.Icoel.DataLayer.csproj b/EgwProxy.Icoel.DataLayer/EgwProxy.Icoel.DataLayer.csproj index c1aaa5c3..ffb54d76 100644 --- a/EgwProxy.Icoel.DataLayer/EgwProxy.Icoel.DataLayer.csproj +++ b/EgwProxy.Icoel.DataLayer/EgwProxy.Icoel.DataLayer.csproj @@ -65,6 +65,7 @@ + diff --git a/EgwProxy.Icoel.DataLayer/SyncStateDbContext.cs b/EgwProxy.Icoel.DataLayer/SyncStateDbContext.cs index 1e811380..fd401841 100644 --- a/EgwProxy.Icoel.DataLayer/SyncStateDbContext.cs +++ b/EgwProxy.Icoel.DataLayer/SyncStateDbContext.cs @@ -32,10 +32,15 @@ namespace EgwProxy.Icoel.DataLayer } /// - /// DbSet dai dati stato sync DB esterni <--> locale + /// DbSet dei dati stato sync DB esterni <--> locale /// public virtual DbSet DbSetSyncState { get; set; } + /// + /// DbSet CurrData + /// + public virtual DbSet DbSetCurrData { get; set; } + protected override void OnModelCreating(DbModelBuilder modelBuilder) { } From f2559b759e704df9014fa8ed6968c3af6e3bb4c4 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 1 Jun 2022 16:52:23 +0200 Subject: [PATCH 3/7] refresh ini conf ICOEL --- IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini | 1 - IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini | 1 - 2 files changed, 2 deletions(-) diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini index 5e6b3216..5f2471f1 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini @@ -66,7 +66,6 @@ FORCE_DYN_DATA=TRUE DEM_FACT_DYN_DATA=3 ENABLE_DATA_FILTER=TRUE ENABLE_CLI_RESTART=TRUE -VETO_SIG_IN=TRUE ; clock base (da 10ms) timerIntMs=50 diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini index 1e4925d1..470b6385 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini @@ -66,7 +66,6 @@ FORCE_DYN_DATA=TRUE DEM_FACT_DYN_DATA=5 ENABLE_DATA_FILTER=TRUE ENABLE_CLI_RESTART=TRUE -VETO_SIG_IN=TRUE SyncStateDb=localhost\sqlexpress SyncStateUser=egalware SyncStatePwd=egalware2022 From 3fac2275326e387ebd244be9653a8d5c267450d5 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 1 Jun 2022 16:55:03 +0200 Subject: [PATCH 4/7] Fix num Vers x date inizio mese (0) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1a266bc4..a743d5b1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -36,7 +36,7 @@ variables: .version-fix: &version-fix - | $env:NEW_REL = $env:VERS_MAIN+"."+(get-date –format yyMM)+"."+(get-date –format ddHH) - $env:NUM_REL = $env:VERS_MAIN+"."+(get-date –format yyMM)+"."+(get-date –format ddHH) + $env:NUM_REL = $env:VERS_MAIN+"."+(get-date –format yyMM)+"."+(get-date –format dHH) $env:NUM_DEB = $env:VERS_MAIN+"."+(get-date –format yyMM)+"-beta."+(get-date –format dHH) $env:NEW_COPYRIGHT = "EgalWare @ 2006-" + (get-date -format yyyy) $contenuto = Get-Content -path 'VersGen\VersGen.cs' -Raw From bfad961b1e0ec481e5a81cfe5015732ec9c92e8b Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 1 Jun 2022 17:29:04 +0200 Subject: [PATCH 5/7] Update conf Icoel x caricare nuovi dati Soap e DB --- IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini | 4 +-- IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.json | 23 +++++++++++---- IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini | 2 +- IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.json | 31 +++++++-------------- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini index 5f2471f1..3cf5fb6e 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini @@ -63,12 +63,12 @@ MIN_SEND_PZC_BLOCK=0 MAX_SEND_PZC_BLOCK=100 ENABLE_DYN_DATA=TRUE FORCE_DYN_DATA=TRUE -DEM_FACT_DYN_DATA=3 +DEM_FACT_DYN_DATA=2 ENABLE_DATA_FILTER=TRUE ENABLE_CLI_RESTART=TRUE ; clock base (da 10ms) -timerIntMs=50 +timerIntMs=40 ; conf parametri memoria READ/WRITE PARAM_CONF=GIACO_ICOEL_002.json diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.json index 0a64c117..766e5bcb 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.json +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.json @@ -10,8 +10,8 @@ "tipoMem": "Real", "index": 0, "size": 0, - "func": "MEDIAN", - "period": 60, + "func": "AVG", + "period": 50, "factor": 1 }, "VelFruttiMinuto": { @@ -21,8 +21,19 @@ "tipoMem": "Real", "index": 0, "size": 0, - "func": "MEDIAN", - "period": 60, + "func": "AVG", + "period": 50, + "factor": 1 + }, + "NumPacksOra": { + "name": "NumPacksOra", + "description": "Numero confezioni / Ora", + "memAddr": "NumPacksOra", + "tipoMem": "Real", + "index": 0, + "size": 0, + "func": "AVG", + "period": 50, "factor": 1 }, "PercRiemp": { @@ -32,8 +43,8 @@ "tipoMem": "Real", "index": 0, "size": 0, - "func": "MEDIAN", - "period": 60, + "func": "AVG", + "period": 50, "factor": 1 } } diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini index 470b6385..28be2133 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.ini @@ -71,7 +71,7 @@ SyncStateUser=egalware SyncStatePwd=egalware2022 ; clock base (da 10ms) -timerIntMs=10 +timerIntMs=20 ; conf parametri memoria READ/WRITE PARAM_CONF=GIACO_ICOEL_003.json diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.json index 0a64c117..96401b9a 100644 --- a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.json +++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_003.json @@ -3,36 +3,25 @@ }, "mMapRead": { - "VelTonnOra": { - "name": "VelTonnOra", - "description": "Velocità Impianto Tonnellate / Ora", - "memAddr": "VelTonnOra", + "TotMerceProcTonn": { + "name": "TotMerceProcTonn", + "description": "Totale merce processata oggi su impianto (Tonn)", + "memAddr": "TotMerceProcTonn", "tipoMem": "Real", "index": 0, "size": 0, - "func": "MEDIAN", + "func": "MAX", "period": 60, "factor": 1 }, - "VelFruttiMinuto": { - "name": "VelFruttiMinuto", - "description": "Velocità Impianto Frutti / Minuto", - "memAddr": "VelFruttiMinuto", + "TotMerceCaricTonn": { + "name": "TotMerceCaricTonn", + "description": "Totale merce caricata oggi su impianto (Tonn)", + "memAddr": "TotMerceCaricTonn", "tipoMem": "Real", "index": 0, "size": 0, - "func": "MEDIAN", - "period": 60, - "factor": 1 - }, - "PercRiemp": { - "name": "PercRiemp", - "description": "Percentuale riempimento carrelli", - "memAddr": "PercRiemp", - "tipoMem": "Real", - "index": 0, - "size": 0, - "func": "MEDIAN", + "func": "MAX", "period": 60, "factor": 1 } From 3384eb2a823e61adc252b6c5e97a2f38b6211263 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 1 Jun 2022 17:29:16 +0200 Subject: [PATCH 6/7] update dll proxy Icoel --- IOB-WIN-NEXT/IOB-WIN-NEXT.csproj | 4 ++-- IOB-WIN-NEXT/packages.config | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj index 1be1e006..2a05ddb2 100644 --- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj +++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj @@ -88,10 +88,10 @@ ..\packages\EasyModbusTCP.5.6.0\lib\net40\EasyModbus.dll - ..\packages\EgwProxy.Icoel.3.6.2205.2812\lib\EgwProxy.Icoel.dll + ..\packages\EgwProxy.Icoel.3.6.2206.116\lib\EgwProxy.Icoel.dll - ..\packages\EgwProxy.Icoel.3.6.2205.2812\lib\EgwProxy.Icoel.DataLayer.dll + ..\packages\EgwProxy.Icoel.3.6.2206.116\lib\EgwProxy.Icoel.DataLayer.dll ..\packages\EgwProxy.MultiCncLib.3.6.2205.2319\lib\EgwProxy.MultiCncLib.dll diff --git a/IOB-WIN-NEXT/packages.config b/IOB-WIN-NEXT/packages.config index 43bf02c1..a81b056b 100644 --- a/IOB-WIN-NEXT/packages.config +++ b/IOB-WIN-NEXT/packages.config @@ -2,11 +2,11 @@ - + - + From 2a2a389d710cf5ccdcfc027a8db05795506aacfd Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 1 Jun 2022 17:41:07 +0200 Subject: [PATCH 7/7] Accodato info currData da DB --- IOB-WIN-NEXT/IobIcoelDb.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/IOB-WIN-NEXT/IobIcoelDb.cs b/IOB-WIN-NEXT/IobIcoelDb.cs index 3bb11b86..f4a9ebb4 100644 --- a/IOB-WIN-NEXT/IobIcoelDb.cs +++ b/IOB-WIN-NEXT/IobIcoelDb.cs @@ -111,6 +111,14 @@ namespace IOB_WIN_NEXT saveValue(ref outVal, item.LastIdx, $"{item.TableName}_LastIdx"); saveValue(ref outVal, item.LastIdxIn, $"{item.TableName}_LastIdxIn"); } + + // aggiungo anche i campi currData + var currData = dbProxy.DataController.CurrDataGetAll(); + foreach (var item in currData) + { + saveValue(ref outVal, (double)item.CurrVal, item.Topic); + } + lastReadPLC = DateTime.Now; return outVal; }