diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs
index b37e6631..55daad1c 100644
--- a/IOB-UT-NEXT/Enums.cs
+++ b/IOB-UT-NEXT/Enums.cs
@@ -323,6 +323,11 @@ namespace IOB_UT_NEXT
///
MODBUS_TCP_HELPI,
+ ///
+ /// Adapter Modubus TCP versione IMAX Aeromacchine (Jetco)
+ ///
+ MODBUS_TCP_IMAX_AEROMEC,
+
///
/// Adapter MTConnect
///
diff --git a/IOB-WIN-NEXT/AdapterForm.cs b/IOB-WIN-NEXT/AdapterForm.cs
index bc6bc41b..06a3cb01 100644
--- a/IOB-WIN-NEXT/AdapterForm.cs
+++ b/IOB-WIN-NEXT/AdapterForm.cs
@@ -1641,6 +1641,11 @@ namespace IOB_WIN_NEXT
start.Enabled = true;
break;
+ case tipoAdapter.MODBUS_TCP_IMAX_AEROMEC:
+ iobObj = new IobModbusTCPImaxAeromec(this, IOBConf);
+ start.Enabled = true;
+ break;
+
case tipoAdapter.MTConnect:
iobObj = new IobMTC(this, IOBConf);
start.Enabled = true;
diff --git a/IOB-WIN-NEXT/DATA/CONF/3026.ini b/IOB-WIN-NEXT/DATA/CONF/3026.ini
new file mode 100644
index 00000000..78ede1d6
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/3026.ini
@@ -0,0 +1,77 @@
+;Configurazione IOB-WIN
+[IOB]
+;Impianto Cedax di Turi (test) - Giacovelli
+CNCTYPE=MODBUS_TCP_IMAX_AEROMEC
+PING_MS_TIMEOUT=1000
+MinDeltaSec=5
+
+[MACHINE]
+VENDOR=IMAX
+MODEL=Filtro Aria
+
+[CNC]
+IP=192.168.0.80
+PORT=502
+
+[SERVER]
+MPIP=http://192.168.1.7
+MPURL=/MP/IO
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/sendReboot.aspx?idxMacchina=
+
+[MEMORY]
+ADDR_READ=40000
+ADDR_WRITE=40000
+SIZE_READ=30
+SIZE_WRITE=0
+HR_BASE_ADDR=40000
+
+
+[BLINK]
+;MAX_COUNTER_BLINK = 30
+MAX_COUNTER_BLINK = 15
+;bit0 = 0
+;bit1 = 0
+;bit2 = 1
+;bit3 = 1
+;bit4 = 1
+;bit5 = 0
+;bit6 = 0
+;bit7 = 0
+BLINK_FILT=0
+;BLINK_FILT=28
+
+[OPTPAR]
+;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
+PZCOUNT_MODE=STD.DB85.DBRE16
+DISABLE_PZCOUNT=TRUE
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=0
+MAX_SEND_PZC_BLOCK=100
+; GEST DATI DYN
+ENABLE_DYN_DATA=TRUE
+FORCE_DYN_DATA=TRUE
+; gestione delta minimo accettabile tra min/MAX
+DELTA_VAL=0.1
+
+; clock base (da 10ms)
+timerIntMs=10
+
+; conf parametri memoria READ/WRITE
+PARAM_CONF=3026.json
+
+NO_PING=FALSE
+; conf blocchi memoria x READ
+MEM_BLOCK=3026_MBlock.json
+; conf aree allarme
+ALARM_CONF=3026_alarm.json
+
+; rimozione check limiti min/max dynData
+disDynDataRangeCheck=true
+
+[BRANCH]
+NAME=master
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/3026.json b/IOB-WIN-NEXT/DATA/CONF/3026.json
new file mode 100644
index 00000000..79e2c6c8
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/3026.json
@@ -0,0 +1,77 @@
+{
+ "mMapWrite": {
+
+ },
+ "mMapRead": {
+ "FreqInverter": {
+ "name": "FreqInverter",
+ "description": "Frequenza Inverter",
+ "memAddr": "40011",
+ "tipoMem": "Real",
+ "index": 11,
+ "size": 2,
+ "func": "MEDIAN",
+ "period": 90,
+ "factor": 1,
+ "minVal": 0,
+ "maxVal": 999999999,
+ "unit": "Hz"
+ },
+ "CDOreManuten": {
+ "name": "CDOreManuten",
+ "description": "Residuo ore a prossimo service",
+ "memAddr": "40013",
+ "tipoMem": "Int",
+ "index": 13,
+ "size": 1,
+ "func": "MEDIAN",
+ "period": 90,
+ "factor": 1,
+ "minVal": 0,
+ "maxVal": 999999999,
+ "unit": "h"
+ },
+ "COreTAsp1": {
+ "name": "COreTAsp1",
+ "description": "Totale ore funzionamento impianto",
+ "memAddr": "40014",
+ "tipoMem": "Int",
+ "index": 14,
+ "size": 1,
+ "func": "MEDIAN",
+ "period": 90,
+ "factor": 1,
+ "minVal": 0,
+ "maxVal": 999999999,
+ "unit": "h"
+ },
+ "COrePAsp1": {
+ "name": "COrePAsp1",
+ "description": "Parziale ore funzionamento impianto da ultimo service",
+ "memAddr": "40015",
+ "tipoMem": "Int",
+ "index": 15,
+ "size": 1,
+ "func": "MEDIAN",
+ "period": 90,
+ "factor": 1,
+ "minVal": 0,
+ "maxVal": 999999999,
+ "unit": "h"
+ },
+ "AmpereReale": {
+ "name": "AmpereReale",
+ "description": "Assorbimento aspiratore 1",
+ "memAddr": "40016",
+ "tipoMem": "Real",
+ "index": 16,
+ "size": 2,
+ "func": "MEDIAN",
+ "period": 90,
+ "factor": 1,
+ "minVal": 0,
+ "maxVal": 999999999,
+ "unit": "A"
+ }
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/3026_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/3026_MBlock.json
new file mode 100644
index 00000000..1b6d6a80
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/3026_MBlock.json
@@ -0,0 +1,5 @@
+{
+ "ReadBlocks": {
+ "40000": 30
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/3026_alarm.json b/IOB-WIN-NEXT/DATA/CONF/3026_alarm.json
new file mode 100644
index 00000000..e7822f36
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/3026_alarm.json
@@ -0,0 +1,52 @@
+[
+ {
+ "description": "Allarmi Impianto",
+ "tipoMem": "DInt",
+ "memAddr": "40003",
+ "index": 3,
+ "size": 2,
+ "messages": [
+ "ALLARME VENTILATORE 1",
+ "ALLARME VENTILATORE 2",
+ "WARNING FILTRI INTASATI",
+ "WARNING LIVELLO FILTRO",
+ "ALLARME LIVELLO FILTRO",
+ "ALLARME TAGLIAFUOCO 1 ASPIRAZIONE ",
+ "ALLARME TAGLIAFUOCO 2 ASPIRAZIONE ",
+ "CUMULATIVO ALLARMI ALIMENTAZIONI (24V AC-DC)",
+ "ALLARME FUORIUSCITA IQUINANTE ",
+ "ALLARME TERMOVELOCIMETRICO",
+ "ALLARME RILEVATORE SCINTILLE",
+ "ALLARME SPORTELLO APERTO",
+ "ALLARME MOTORE VALVOLA STELLARE FILTRO",
+ "ALLARME MOTORE COCLEA ",
+ "ALLARME MOTORE VALVOLA STELLARE CALDAIA",
+ "ALLARME MOTORE ESTRATTORE FILTRO"
+ ]
+ },
+ {
+ "description": "Allarmi Impianto",
+ "tipoMem": "DInt",
+ "memAddr": "40004",
+ "index": 4,
+ "size": 2,
+ "messages": [
+ "ALLARME MOTORE ASPIRATORE TRAVASO",
+ "WARNING BY-PASS 1 ASPIRAZIONE",
+ "WARNING BY-PASS 2 ASPIRAZIONE",
+ "WARNING BY-PASS 3 ASPIRAZIONE",
+ "WARNING BY-PASS 4 ASPIRAZIONE",
+ "ALLARME TERMICO VIBRATORI",
+ "ALLARME INTASAMENTO ESTRATTORE",
+ "WARNING FILTRI INTASATI PLENUM",
+ "CUMULATIVO ALLARMI RECUPERATORE",
+ "WARNING SERRANDA 1 PARTENZA ASPIRAZIONE",
+ "WARNING SERRANDA 2 PARTENZA ASPIRAZIONE",
+ "WARNING SERRANDA 3 PARTENZA ASPIRAZIONE",
+ "ALLARME IMPLOSIONE TUBAZIONI",
+ "WARNING IMPLOSIONE TUBAZIONI",
+ "ALLARME VENTILATORE 3",
+ "ALLARME INTASAMENTO TASCHE"
+ ]
+ }
+]
\ 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 cfc8290f..676a6185 100644
--- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
+++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
@@ -235,6 +235,7 @@
+
@@ -315,9 +316,13 @@
+
+
+
+
diff --git a/IOB-WIN-NEXT/IobModbusTCPImaxAeromec.cs b/IOB-WIN-NEXT/IobModbusTCPImaxAeromec.cs
new file mode 100644
index 00000000..1108ffa3
--- /dev/null
+++ b/IOB-WIN-NEXT/IobModbusTCPImaxAeromec.cs
@@ -0,0 +1,203 @@
+using EasyModbus;
+using System;
+
+namespace IOB_WIN_NEXT
+{
+ /* --------------------------------------------------------------------------------
+ * Controlli ModBusTCP IMAS Aeromeccanica
+ * - protocollo ModBus TCP
+ * - specifico comportamento impianti filtrazione IMAS Aeromeccanica
+ * - gestione allarmi
+ *
+ * STRUTTURA MEMORIA a banchi di UInt16, convertiti successivamente in int EVENTUALMENTE divisi per 10/100/1000
+ * G:\Drive condivisi\30_Clienti\Jetco\Manuali CNC-PLC\Aspiratori
+ *
+ * -------------------------------------------------------------------------------- */
+
+ public class IobModbusTCPImaxAeromec : IobModbusTCP
+ {
+ #region Public Constructors
+
+ ///
+ /// Classe base con i metodi x ModBusTCP
+ ///
+ ///
+ ///
+ public IobModbusTCPImaxAeromec(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
+ {
+ lgInfo("NEW IOB ModBus TCP IMAS Aeromec");
+
+ // provo lettura una prima volta i dati DYN
+ if (currPLC != null && currPLC.Connected)
+ {
+ try
+ {
+ processDynData();
+ }
+ catch (Exception exc)
+ {
+ lgError($"Eccezione in processDynData iniziale x ModBus TCP IMAS Aeromec:{Environment.NewLine}{exc}");
+ }
+ }
+ }
+
+ #endregion Public Constructors
+
+ #region Protected Methods
+
+ ///
+ /// Restituisce status di emergenza, hard coded dall'area di allarmi
+ ///
+ protected bool EStop
+ {
+ get
+ {
+ bool answ = false;
+ int currStatus = 0;
+ // hard coded
+ int statusReg = 40003;
+ // deve avere allarmi (è un allarme EStop)
+ if (hasAlarms())
+ {
+ int[] listInt = new int[2];
+ listInt = HoldingRegisterLUT[statusReg];
+ currStatus = ModbusClient.ConvertRegistersToInt(listInt);
+ // hard coded il 5° bit
+ answ = ((currStatus & (1 << 9)) > 0);
+ }
+ return answ;
+ }
+ }
+
+ ///
+ /// Restituisce status di LAVORA, hard coded
+ ///
+ protected bool Work
+ {
+ get
+ {
+ bool answ = false;
+ int currStatus = 0;
+ // hard coded
+ int statusReg = 40003;
+ int[] listInt = new int[2];
+ listInt = HoldingRegisterLUT[statusReg];
+ currStatus = ModbusClient.ConvertRegistersToInt(listInt);
+ // hard coded il 5° bit
+ answ = ((currStatus & (1 << 0)) > 0);
+ return answ;
+ }
+ }
+ ///
+ /// Restituisce status di AUTOmatico, hard coded
+ ///
+ protected bool Auto
+ {
+ get
+ {
+ bool answ = false;
+ int currStatus = 0;
+ // hard coded
+ int statusReg = 40003;
+ int[] listInt = new int[2];
+ listInt = HoldingRegisterLUT[statusReg];
+ currStatus = ModbusClient.ConvertRegistersToInt(listInt);
+ // hard coded il 5° bit
+ answ = ((currStatus & (1 << 14)) > 0);
+ return answ;
+ }
+ }
+
+ ///
+ /// Effettua decodifica aree memoria alla bitmap usata x MAPO
+ ///
+ protected override void decodeToBaseBitmap()
+ {
+ // init a zero...
+ B_input = 0;
+
+ /* -----------------------------------------------------
+ * bitmap MAPO STANDARD 60
+ * B0: POWER_ON
+ * B1: RUN
+ * B2: pzCount
+ * B3: allarme
+ * B4: manuale
+ * B5: slowTC
+ * B6: WarmUpCoolDown
+ * B7: EmergArmata
+ *
+ ----------------------------------------------------- */
+
+ var MemInt = new byte[2];
+
+ int byteSignals = 0;
+ // bit 0 (poweron) imposto a 1 SE connected...
+ if (currPLC.Connected)
+ {
+ byteSignals += (1 << 0);
+ }
+ // processo dagli stati + gravi...
+ if (!EStop)
+ {
+ byteSignals += (1 << 7);
+ }
+
+ // processo dagli stati + gravi...
+ if (hasAlarms())
+ {
+ byteSignals += (1 << 3);
+ }
+ if (Work)
+ {
+ byteSignals += (1 << 1);
+ }
+ if (!Auto)
+ {
+ byteSignals += (1 << 4);
+ }
+
+
+ // salvo!
+ B_input = byteSignals;
+ }
+
+ #endregion Protected Methods
+
+ #region Private Methods
+
+ private void testBlockRead(int baseAddr, int numByte)
+ {
+ int baseHold = 40001;
+ int[] readTestFull = new int[2];
+ lgTrace($"-------------------- Inizio test lettura {baseAddr} --------------------");
+ try
+ {
+ stopwatch.Restart();
+ readTestFull = currPLC.ReadHoldingRegisters(baseAddr - baseHold, numByte);
+ stopwatch.Stop();
+ lgTrace($"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);
+ lgTrace($"{baseAddr + i * 2:000} | HoldingRegisters: {thisSet[0]} / {thisSet[1]} | Val Real: {ModbusClient.ConvertRegistersToFloat(thisSet):N6}");
+ }
+ lgTrace("-------------------- Completato test lettura {baseAddr} --------------------");
+ }
+
+ private void testRead()
+ {
+ foreach (var item in memSetR)
+ {
+ testBlockRead(item.Key, item.Value);
+ }
+ }
+
+ #endregion Private Methods
+ }
+}
\ No newline at end of file
diff --git a/TestClientMan/TestClientMan.sln b/TestClientMan/TestClientMan.sln
index 2544c6ae..d1837c14 100644
--- a/TestClientMan/TestClientMan.sln
+++ b/TestClientMan/TestClientMan.sln
@@ -1,12 +1,14 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.3.32922.545
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32901.82
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestClientMan", "TestClientMan\TestClientMan.csproj", "{533B1F01-3061-4105-BA7F-ADAA72A74C2C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IobManComm", "IobManComm\IobManComm.csproj", "{FEC10BD2-65A7-4FD3-B59C-8200BF80AB51}"
EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TestClientVB", "TestClientVB\TestClientVB.vbproj", "{F8C3D948-DADA-49EE-9697-54A4B63FD5DE}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -21,6 +23,10 @@ Global
{FEC10BD2-65A7-4FD3-B59C-8200BF80AB51}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FEC10BD2-65A7-4FD3-B59C-8200BF80AB51}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FEC10BD2-65A7-4FD3-B59C-8200BF80AB51}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F8C3D948-DADA-49EE-9697-54A4B63FD5DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F8C3D948-DADA-49EE-9697-54A4B63FD5DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F8C3D948-DADA-49EE-9697-54A4B63FD5DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F8C3D948-DADA-49EE-9697-54A4B63FD5DE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/TestClientMan/TestClientVB/App.config b/TestClientMan/TestClientVB/App.config
new file mode 100644
index 00000000..dd73f870
--- /dev/null
+++ b/TestClientMan/TestClientVB/App.config
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TestClientMan/TestClientVB/Form1.Designer.vb b/TestClientMan/TestClientVB/Form1.Designer.vb
new file mode 100644
index 00000000..21cce9b8
--- /dev/null
+++ b/TestClientMan/TestClientVB/Form1.Designer.vb
@@ -0,0 +1,82 @@
+ _
+Partial Class Form1
+ Inherits System.Windows.Forms.Form
+
+ 'Form overrides dispose to clean up the component list.
+ _
+ Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+ Try
+ If disposing AndAlso components IsNot Nothing Then
+ components.Dispose()
+ End If
+ Finally
+ MyBase.Dispose(disposing)
+ End Try
+ End Sub
+
+ 'Required by the Windows Form Designer
+ Private components As System.ComponentModel.IContainer
+
+ 'NOTE: The following procedure is required by the Windows Form Designer
+ 'It can be modified using the Windows Form Designer.
+ 'Do not modify it using the code editor.
+ _
+ Private Sub InitializeComponent()
+ Me.components = New System.ComponentModel.Container()
+ Me.chkOnline = New System.Windows.Forms.CheckBox()
+ Me.Timer1 = New System.Windows.Forms.Timer(Me.components)
+ Me.txtConf = New System.Windows.Forms.TextBox()
+ Me.Label1 = New System.Windows.Forms.Label()
+ Me.SuspendLayout()
+ '
+ 'chkOnline
+ '
+ Me.chkOnline.AutoSize = True
+ Me.chkOnline.Location = New System.Drawing.Point(67, 72)
+ Me.chkOnline.Name = "chkOnline"
+ Me.chkOnline.Size = New System.Drawing.Size(54, 17)
+ Me.chkOnline.TabIndex = 0
+ Me.chkOnline.Text = "online"
+ Me.chkOnline.UseVisualStyleBackColor = True
+ '
+ 'Timer1
+ '
+ Me.Timer1.Interval = 1000
+ '
+ 'txtConf
+ '
+ Me.txtConf.Location = New System.Drawing.Point(67, 38)
+ Me.txtConf.Name = "txtConf"
+ Me.txtConf.Size = New System.Drawing.Size(100, 20)
+ Me.txtConf.TabIndex = 1
+ Me.txtConf.Text = "demo_file.ini"
+ '
+ 'Label1
+ '
+ Me.Label1.AutoSize = True
+ Me.Label1.Location = New System.Drawing.Point(17, 41)
+ Me.Label1.Name = "Label1"
+ Me.Label1.Size = New System.Drawing.Size(44, 13)
+ Me.Label1.TabIndex = 2
+ Me.Label1.Text = "conf file"
+ '
+ 'Form1
+ '
+ Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
+ Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+ Me.ClientSize = New System.Drawing.Size(800, 450)
+ Me.Controls.Add(Me.Label1)
+ Me.Controls.Add(Me.txtConf)
+ Me.Controls.Add(Me.chkOnline)
+ Me.Name = "Form1"
+ Me.Text = "Form1"
+ Me.ResumeLayout(False)
+ Me.PerformLayout()
+
+ End Sub
+
+ Friend WithEvents chkOnline As CheckBox
+ Friend WithEvents Timer1 As Timer
+ Friend WithEvents txtConf As TextBox
+ Friend WithEvents Label1 As Label
+End Class
diff --git a/TestClientMan/TestClientVB/Form1.resx b/TestClientMan/TestClientVB/Form1.resx
new file mode 100644
index 00000000..d0d99f42
--- /dev/null
+++ b/TestClientMan/TestClientVB/Form1.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/TestClientMan/TestClientVB/Form1.vb b/TestClientMan/TestClientVB/Form1.vb
new file mode 100644
index 00000000..d9649329
--- /dev/null
+++ b/TestClientMan/TestClientVB/Form1.vb
@@ -0,0 +1,63 @@
+Imports IobManComm
+
+Public Class Form1
+
+ Protected rwd As RedisWatchDog
+ Protected count As Integer
+
+
+ Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
+
+ ' preparo update sul canale di comunicazione
+ Dim adesso As Date = Date.Now
+ Dim currStatus As New IobWinStatus
+ currStatus = rwd.iobStatus
+ ' aggiorno valori, ad esempio IN da macchina, OUT verso macchina? last update = ultima comunicazione?
+ currStatus.lastDataIn = adesso.AddSeconds(-3)
+ currStatus.lastDataOut = adesso.AddSeconds(-2)
+ currStatus.lastUpdate = adesso
+ currStatus.online = chkOnline.Checked
+
+ ' note libere x indicare ultimo task?
+ currStatus.freeNotes = $"Conteggio: {count}"
+
+ ' salvo e invio
+ rwd.iobStatus = currStatus
+
+ count = count + 1
+
+ End Sub
+
+ Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+ ' avvio i componenti...
+
+ ' tipicamente è il primo arg con cui sia vvia il sw
+ Dim codIob As String = "demo_conf"
+ txtConf.Text = codIob + ".ini"
+
+ ' valori da recuperare da ini... che dovranno corrispondere nel programma che fa partire il sw
+ Dim tipoIob As String = "SERIAL"
+ Dim appName As String = "CVSER"
+ ' 14 è normalmente libero... valori ammessi 0..15)
+ Dim redisDb As Integer = 14
+ ' periodo minimo x considerare il dato variato da parte del server
+ Dim minSecDelta As Integer = 1
+
+ Dim adesso As Date = Date.Now
+
+ '' preparo oggetto x gestione WathDog
+ rwd = New RedisWatchDog(codIob, tipoIob, appName, redisDb, minSecDelta)
+
+ Dim currStatus As New IobWinStatus
+ currStatus = rwd.iobStatus
+ currStatus.freeNotes = "starting"
+ currStatus.online = False
+
+ ' salvo e invio
+ rwd.iobStatus = currStatus
+
+ ' avvio il timer
+ Timer1.Start()
+
+ End Sub
+End Class
diff --git a/TestClientMan/TestClientVB/My Project/Application.Designer.vb b/TestClientMan/TestClientVB/My Project/Application.Designer.vb
new file mode 100644
index 00000000..d34e80d1
--- /dev/null
+++ b/TestClientMan/TestClientVB/My Project/Application.Designer.vb
@@ -0,0 +1,38 @@
+'------------------------------------------------------------------------------
+'
+' This code was generated by a tool.
+' Runtime Version:4.0.30319.42000
+'
+' Changes to this file may cause incorrect behavior and will be lost if
+' the code is regenerated.
+'
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+ 'NOTE: This file is auto-generated; do not modify it directly. To make changes,
+ ' or if you encounter build errors in this file, go to the Project Designer
+ ' (go to Project Properties or double-click the My Project node in
+ ' Solution Explorer), and make changes on the Application tab.
+ '
+ Partial Friend Class MyApplication
+
+ _
+ Public Sub New()
+ MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
+ Me.IsSingleInstance = false
+ Me.EnableVisualStyles = true
+ Me.SaveMySettingsOnExit = true
+ Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses
+ End Sub
+
+ _
+ Protected Overrides Sub OnCreateMainForm()
+ Me.MainForm = Global.TestClientVB.Form1
+ End Sub
+ End Class
+End Namespace
diff --git a/TestClientMan/TestClientVB/My Project/Application.myapp b/TestClientMan/TestClientVB/My Project/Application.myapp
new file mode 100644
index 00000000..1243847f
--- /dev/null
+++ b/TestClientMan/TestClientVB/My Project/Application.myapp
@@ -0,0 +1,11 @@
+
+
+ true
+ Form1
+ false
+ 0
+ true
+ 0
+ 0
+ true
+
diff --git a/TestClientMan/TestClientVB/My Project/AssemblyInfo.vb b/TestClientMan/TestClientVB/My Project/AssemblyInfo.vb
new file mode 100644
index 00000000..37d77867
--- /dev/null
+++ b/TestClientMan/TestClientVB/My Project/AssemblyInfo.vb
@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+
+
+
+
+
+
+
+
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+
+
+' Version information for an assembly consists of the following four values:
+'
+' Major Version
+' Minor Version
+' Build Number
+' Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers
+' by using the '*' as shown below:
+'
+
+
+
diff --git a/TestClientMan/TestClientVB/My Project/Resources.Designer.vb b/TestClientMan/TestClientVB/My Project/Resources.Designer.vb
new file mode 100644
index 00000000..a77a595e
--- /dev/null
+++ b/TestClientMan/TestClientVB/My Project/Resources.Designer.vb
@@ -0,0 +1,62 @@
+'------------------------------------------------------------------------------
+'
+' This code was generated by a tool.
+' Runtime Version:4.0.30319.42000
+'
+' Changes to this file may cause incorrect behavior and will be lost if
+' the code is regenerated.
+'
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My.Resources
+
+ 'This class was auto-generated by the StronglyTypedResourceBuilder
+ 'class via a tool like ResGen or Visual Studio.
+ 'To add or remove a member, edit your .ResX file then rerun ResGen
+ 'with the /str option, or rebuild your VS project.
+ '''
+ ''' A strongly-typed resource class, for looking up localized strings, etc.
+ '''
+ _
+ Friend Module Resources
+
+ Private resourceMan As Global.System.Resources.ResourceManager
+
+ Private resourceCulture As Global.System.Globalization.CultureInfo
+
+ '''
+ ''' Returns the cached ResourceManager instance used by this class.
+ '''
+ _
+ Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+ Get
+ If Object.ReferenceEquals(resourceMan, Nothing) Then
+ Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("TestClientVB.Resources", GetType(Resources).Assembly)
+ resourceMan = temp
+ End If
+ Return resourceMan
+ End Get
+ End Property
+
+ '''
+ ''' Overrides the current thread's CurrentUICulture property for all
+ ''' resource lookups using this strongly typed resource class.
+ '''
+ _
+ Friend Property Culture() As Global.System.Globalization.CultureInfo
+ Get
+ Return resourceCulture
+ End Get
+ Set(ByVal value As Global.System.Globalization.CultureInfo)
+ resourceCulture = value
+ End Set
+ End Property
+ End Module
+End Namespace
diff --git a/TestClientMan/TestClientVB/My Project/Resources.resx b/TestClientMan/TestClientVB/My Project/Resources.resx
new file mode 100644
index 00000000..af7dbebb
--- /dev/null
+++ b/TestClientMan/TestClientVB/My Project/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/TestClientMan/TestClientVB/My Project/Settings.Designer.vb b/TestClientMan/TestClientVB/My Project/Settings.Designer.vb
new file mode 100644
index 00000000..571fc605
--- /dev/null
+++ b/TestClientMan/TestClientVB/My Project/Settings.Designer.vb
@@ -0,0 +1,73 @@
+'------------------------------------------------------------------------------
+'
+' This code was generated by a tool.
+' Runtime Version:4.0.30319.42000
+'
+' Changes to this file may cause incorrect behavior and will be lost if
+' the code is regenerated.
+'
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+ _
+ Partial Friend NotInheritable Class MySettings
+ Inherits Global.System.Configuration.ApplicationSettingsBase
+
+ Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
+
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+ Private Shared addedHandler As Boolean
+
+ Private Shared addedHandlerLockObject As New Object
+
+ _
+ Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+ If My.Application.SaveMySettingsOnExit Then
+ My.Settings.Save()
+ End If
+ End Sub
+#End If
+#End Region
+
+ Public Shared ReadOnly Property [Default]() As MySettings
+ Get
+
+#If _MyType = "WindowsForms" Then
+ If Not addedHandler Then
+ SyncLock addedHandlerLockObject
+ If Not addedHandler Then
+ AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+ addedHandler = True
+ End If
+ End SyncLock
+ End If
+#End If
+ Return defaultInstance
+ End Get
+ End Property
+ End Class
+End Namespace
+
+Namespace My
+
+ _
+ Friend Module MySettingsProperty
+
+ _
+ Friend ReadOnly Property Settings() As Global.TestClientVB.My.MySettings
+ Get
+ Return Global.TestClientVB.My.MySettings.Default
+ End Get
+ End Property
+ End Module
+End Namespace
diff --git a/TestClientMan/TestClientVB/My Project/Settings.settings b/TestClientMan/TestClientVB/My Project/Settings.settings
new file mode 100644
index 00000000..85b890b3
--- /dev/null
+++ b/TestClientMan/TestClientVB/My Project/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/TestClientMan/TestClientVB/TestClientVB.vbproj b/TestClientMan/TestClientVB/TestClientVB.vbproj
new file mode 100644
index 00000000..e4a654e3
--- /dev/null
+++ b/TestClientMan/TestClientVB/TestClientVB.vbproj
@@ -0,0 +1,172 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {F8C3D948-DADA-49EE-9697-54A4B63FD5DE}
+ WinExe
+ TestClientVB.My.MyApplication
+ TestClientVB
+ TestClientVB
+ 512
+ WindowsForms
+ v4.6.2
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ true
+ true
+ bin\Debug\
+ TestClientVB.xml
+ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022
+
+
+ AnyCPU
+ pdbonly
+ false
+ true
+ true
+ bin\Release\
+ TestClientVB.xml
+ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022
+
+
+ On
+
+
+ Binary
+
+
+ Off
+
+
+ On
+
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\IobManComm.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\Microsoft.Bcl.AsyncInterfaces.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\Newtonsoft.Json.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\NLog.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\Pipelines.Sockets.Unofficial.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\StackExchange.Redis.dll
+
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.Buffers.dll
+
+
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.Diagnostics.PerformanceCounter.dll
+
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.IO.Compression.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.IO.Pipelines.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.Memory.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.Numerics.Vectors.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.Runtime.CompilerServices.Unsafe.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.Runtime.InteropServices.RuntimeInformation.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.Threading.Channels.dll
+
+
+ ..\packages\IobManComm.0.9.2210.2716\lib\System.Threading.Tasks.Extensions.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ Form1.vb
+ Form
+
+
+
+ True
+ Application.myapp
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+ Form1.vb
+
+
+ VbMyResourcesResXFileCodeGenerator
+ Resources.Designer.vb
+ My.Resources
+ Designer
+
+
+
+
+ MyApplicationCodeGenerator
+ Application.Designer.vb
+
+
+ SettingsSingleFileGenerator
+ My
+ Settings.Designer.vb
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TestClientMan/TestClientVB/packages.config b/TestClientMan/TestClientVB/packages.config
new file mode 100644
index 00000000..b0d4b874
--- /dev/null
+++ b/TestClientMan/TestClientVB/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file