diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs
index 55daad1c..c33da41b 100644
--- a/IOB-UT-NEXT/Enums.cs
+++ b/IOB-UT-NEXT/Enums.cs
@@ -328,6 +328,11 @@ namespace IOB_UT_NEXT
///
MODBUS_TCP_IMAX_AEROMEC,
+ ///
+ /// Adapter Modubus TCP versione Zetapack (Giacovelli)
+ ///
+ MODBUS_TCP_ZETAPACK,
+
///
/// Adapter MTConnect
///
diff --git a/IOB-WIN-NEXT/AdapterForm.cs b/IOB-WIN-NEXT/AdapterForm.cs
index 06a3cb01..329c3844 100644
--- a/IOB-WIN-NEXT/AdapterForm.cs
+++ b/IOB-WIN-NEXT/AdapterForm.cs
@@ -1646,6 +1646,11 @@ namespace IOB_WIN_NEXT
start.Enabled = true;
break;
+ case tipoAdapter.MODBUS_TCP_ZETAPACK:
+ iobObj = new IobModbusTCPZetapack(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
index 78ede1d6..93d60e70 100644
--- a/IOB-WIN-NEXT/DATA/CONF/3026.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/3026.ini
@@ -24,11 +24,12 @@ CMDADV1=?valore=
CMDREBO=/sendReboot.aspx?idxMacchina=
[MEMORY]
-ADDR_READ=40000
-ADDR_WRITE=40000
+ADDR_READ=40001
+ADDR_WRITE=40001
SIZE_READ=30
SIZE_WRITE=0
HR_BASE_ADDR=40000
+DELTA_BASE=0
[BLINK]
diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1.ini
new file mode 100644
index 00000000..09d2eaaf
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1.ini
@@ -0,0 +1,78 @@
+;Configurazione IOB-WIN
+[IOB]
+;Impianto Zetapack di Locorotondo (test) - Giacovelli
+CNCTYPE=MODBUS_TCP_ZETAPACK
+PING_MS_TIMEOUT=1000
+MinDeltaSec=5
+
+[MACHINE]
+VENDOR=Zetapack
+MODEL=Linea imballo
+
+[CNC]
+IP=192.168.16.11
+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=40001
+ADDR_WRITE=40001
+SIZE_READ=10
+SIZE_WRITE=0
+HR_BASE_ADDR=40000
+DELTA_BASE=0
+
+
+[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=GIACO_ZPACK_1.json
+
+NO_PING=FALSE
+; conf blocchi memoria x READ
+MEM_BLOCK=GIACO_ZPACK_1_MBlock.json
+; conf aree allarme
+ALARM_CONF=GIACO_ZPACK_1_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/GIACO_ZPACK_1.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1.json
new file mode 100644
index 00000000..2ecd5729
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1.json
@@ -0,0 +1,110 @@
+{
+ "mMapWrite": {
+
+ },
+ "mMapRead": {
+ //"StatusWord": {
+ // "name": "StatusWord",
+ // "description": "Word di Status",
+ // "memAddr": "40002",
+ // "tipoMem": "Int",
+ // "index": 2,
+ // "size": 1,
+ // "func": "POINT",
+ // "period": 90,
+ // "factor": 1,
+ // "minVal": 0,
+ // "maxVal": 65536,
+ // "unit": "BMap"
+ //},
+ //"StatusDetWord": {
+ // "name": "StatusDetWord",
+ // "description": "Word di Status",
+ // "memAddr": "40005",
+ // "tipoMem": "Int",
+ // "index": 5,
+ // "size": 1,
+ // "func": "POINT",
+ // "period": 90,
+ // "factor": 1,
+ // "minVal": 0,
+ // "maxVal": 65536,
+ // "unit": "BMap"
+ //},
+ "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"
+ }
+ },
+ "optMemPar": {
+ "AutoBitCond": "40002.14=1",
+ "EStopBitCond": "40002.9=0",
+ "WorkBitCond": "40002.0=1"
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1_MBlock.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1_MBlock.json
new file mode 100644
index 00000000..1b6d6a80
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1_MBlock.json
@@ -0,0 +1,5 @@
+{
+ "ReadBlocks": {
+ "40000": 30
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1_alarm.json b/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1_alarm.json
new file mode 100644
index 00000000..e7822f36
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ZPACK_1_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/IobModbusTCPZetapack.cs b/IOB-WIN-NEXT/IobModbusTCPZetapack.cs
index 754ca2ac..6bd369b7 100644
--- a/IOB-WIN-NEXT/IobModbusTCPZetapack.cs
+++ b/IOB-WIN-NEXT/IobModbusTCPZetapack.cs
@@ -25,7 +25,7 @@ namespace IOB_WIN_NEXT
///
public IobModbusTCPZetapack(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
- lgInfo("NEW IOB ModBus TCP IMAS Aeromec");
+ lgInfo("NEW IOB ModBus TCP Zetapack");
// provo lettura una prima volta i dati DYN
if (currPLC != null && currPLC.Connected)
@@ -43,51 +43,8 @@ namespace IOB_WIN_NEXT
#endregion Public Constructors
- #region Protected Methods
+ #region Protected Properties
- ///
- /// Restituisce status di emergenza, hard coded dall'area di allarmi
- ///
- protected bool EStop
- {
- get
- {
- bool answ = false;
- int currStatus = 0;
- // hard coded
- int statusReg = 40002;
- // 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 = 40002;
- 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
///
@@ -95,6 +52,8 @@ namespace IOB_WIN_NEXT
{
get
{
+ return testCondition("WorkBitCond");
+#if false
bool answ = false;
int currStatus = 0;
// hard coded
@@ -105,9 +64,49 @@ namespace IOB_WIN_NEXT
// hard coded il 5° bit
answ = ((currStatus & (1 << 14)) > 0);
return answ;
+#endif
}
}
+ ///
+ /// Restituisce status di ESTOP triggered (triggered = premuta, altrimenti armed)
+ ///
+ protected bool EStopTriggered
+ {
+ get
+ {
+ return testCondition("EStopBitCond");
+ }
+ }
+
+ ///
+ /// Restituisce status di LAVORA, hard coded
+ ///
+ protected bool Work
+ {
+ get
+ {
+ return testCondition("WorkBitCond");
+#if false
+
+ bool answ = false;
+ int currStatus = 0;
+ // hard coded
+ int statusReg = 40002;
+ int[] listInt = new int[2];
+ listInt = HoldingRegisterLUT[statusReg];
+ currStatus = ModbusClient.ConvertRegistersToInt(listInt);
+ // hard coded il 5° bit
+ answ = ((currStatus & (1 << 0)) > 0);
+ return answ;
+#endif
+ }
+ }
+
+ #endregion Protected Properties
+
+ #region Protected Methods
+
///
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
///
@@ -139,8 +138,8 @@ namespace IOB_WIN_NEXT
}
if (HoldingRegisterLUT != null && HoldingRegisterLUT.Count > 0)
{
- // processo dagli stati + gravi...
- if (!EStop)
+ // se emergenza NON premuta (triggered) indico OK (armata...)
+ if (!EStopTriggered)
{
byteSignals += (1 << 7);
}
@@ -196,6 +195,31 @@ namespace IOB_WIN_NEXT
lgTrace("-------------------- Completato test lettura {baseAddr} --------------------");
}
+ ///
+ /// Testa la condition modbus da LUT + configurazione
+ ///
+ ///
+ ///
+ private bool testCondition(string cKey)
+ {
+ bool answ = false;
+ if (OptCheckConditions.ContainsKey(cKey))
+ {
+ int currStatus = 0;
+ int[] listInt = new int[2];
+ listInt = HoldingRegisterLUT[OptCheckConditions[cKey].BaseAddr];
+ currStatus = ModbusClient.ConvertRegistersToInt(listInt);
+ // hard coded il 9° bit a zero
+ answ = ((currStatus & (1 << OptCheckConditions[cKey].BitNum)) == OptCheckConditions[cKey].ValOk);
+ lgTrace($"testCondition for {cKey} | BaseAddr: {OptCheckConditions[cKey].BaseAddr} | BitNum: {OptCheckConditions[cKey].BitNum} | ValOk: {OptCheckConditions[cKey].ValOk}");
+ }
+ else
+ {
+ lgTrace($"testCondition error: {cKey} not found");
+ }
+ return answ;
+ }
+
private void testRead()
{
foreach (var item in memSetR)