diff --git a/IOB-UT-NEXT/baseUtils.cs b/IOB-UT-NEXT/baseUtils.cs
index 84363305..84df371c 100644
--- a/IOB-UT-NEXT/baseUtils.cs
+++ b/IOB-UT-NEXT/baseUtils.cs
@@ -122,6 +122,22 @@ namespace IOB_UT_NEXT
{ }
return answ;
}
+ ///
+ /// formatta un numero in forma binaria 0/1
+ ///
+ ///
+ ///
+ public static string binaryForm(uint valore)
+ {
+ string answ = "";
+ try
+ {
+ answ = string.Format(new BinaryFormatter(), "{0:B}", valore);
+ }
+ catch
+ { }
+ return answ;
+ }
///
/// Effettua chiamata URL e restituisce risultato, SE NON E' in veto send (x mmitigare chiamate...)
@@ -151,7 +167,7 @@ namespace IOB_UT_NEXT
// controllo se ho un VETO all'invio...
if (dtVetoSend < DateTime.Now)
{
- callUrlNow(URL, payload);
+ answ = callUrlNow(URL, payload);
}
// restituisco valore!
return answ;
@@ -197,6 +213,13 @@ namespace IOB_UT_NEXT
client.Headers.Add("user-agent", $"{CRS("appName")}");
try
{
+ // problema certificati locali...
+ // https://living-sun.com/it/c/226351-webexception-could-not-establish-trust-relationship-for-the-ssl-tls-secure-channel-c-aspnet-web-services-ssl-webexception.html
+ // hack x certificati locali in 10.74.82.*
+ if (URL.Contains("10.74.82."))
+ {
+ System.Net.ServicePointManager.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => { return true; };
+ }
answ = client.DownloadString(URL);
}
catch (Exception exc)
@@ -235,7 +258,23 @@ namespace IOB_UT_NEXT
clientPayload.Headers.Add("Content-Type", "application/json");
try
{
+ // problema certificati locali...
+ // https://living-sun.com/it/c/226351-webexception-could-not-establish-trust-relationship-for-the-ssl-tls-secure-channel-c-aspnet-web-services-ssl-webexception.html
+ // hack x certificati locali in 10.74.82.*
+ if (URL.Contains("10.74.82."))
+ {
+ System.Net.ServicePointManager.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => { return true; };
+ }
answ = clientPayload.UploadString(URL, payload);
+ if (answ != "OK")
+ {
+ logReduxFactor--;
+ if (logReduxFactor <= 0)
+ {
+ lg.Error($"Invio dati fallito:{Environment.NewLine}- URL{Environment.NewLine}{URL}{Environment.NewLine}- payload{Environment.NewLine}{payload}");
+ logReduxFactor = 5;
+ }
+ }
}
catch (Exception exc)
{
diff --git a/IOB-WIN-NEXT/App.config b/IOB-WIN-NEXT/App.config
index 1c941d10..e98ffce7 100644
--- a/IOB-WIN-NEXT/App.config
+++ b/IOB-WIN-NEXT/App.config
@@ -39,7 +39,8 @@
-
+
+
diff --git a/IOB-WIN-NEXT/DATA/CONF/1033.ini b/IOB-WIN-NEXT/DATA/CONF/1033.ini
index dc69397a..4a3dadb6 100644
--- a/IOB-WIN-NEXT/DATA/CONF/1033.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/1033.ini
@@ -59,6 +59,8 @@ ENABLE_DYN_DATA=TRUE
FORCE_DYN_DATA=TRUE
; gestione scrittura string/char[]: true = string / false = char[]
WRITE_PRE=TRUE
+; gestione emergenza forzata (ignora valore letto, mette sempre ARMED)
+EMERGENCY_BYPASS=true
; conf parametri memoria READ/WRITE
PARAM_CONF=1033.json
diff --git a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
index 86d8995d..5370415f 100644
--- a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
@@ -68,7 +68,9 @@ CLI_INST=SteamWareSim
;STARTLIST=PIZ08
;STARTLIST=PIZ04
;STARTLIST=PIZ05
-STARTLIST=FOV062
;STARTLIST=OPC_UA
+;STARTLIST=SIM_PIZ03
+;STARTLIST=FOV062
+STARTLIST=3013
MAXCNC=10
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ00.json b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ00.json
new file mode 100644
index 00000000..c929fe76
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ00.json
@@ -0,0 +1,70 @@
+{
+ //"mMapWrite": {
+ // "setArt": {
+ // "name": "setArt",
+ // "description": "Articolo",
+ // "memAddr": "DB150.DBB12",
+ // "tipoMem": "String",
+ // "index": 12,
+ // "size": 20
+ // },
+ // "setComm": {
+ // "name": "setComm",
+ // "description": "Commessa",
+ // "memAddr": "DB150.DBB32",
+ // "tipoMem": "String",
+ // "index": 32,
+ // "size": 20
+ // },
+ // "setPzComm": {
+ // "name": "setPzComm",
+ // "description": "Qty",
+ // "memAddr": "DB150.DBB8",
+ // "tipoMem": "Int",
+ // "index": 8,
+ // "size": 4
+ // },
+ // "forceSetPzCount": {
+ // "name": "forceSetPzCount",
+ // "description": "Qty",
+ // "memAddr": "DB150.DBB8",
+ // "tipoMem": "Int",
+ // "index": 8,
+ // "size": 4
+ // }
+ //},
+ "mMapRead": {
+ "Level": {
+ "name": "SIM_LEVEL",
+ "description": "Livello Serbatoio",
+ "tipoMem": "Real",
+ "minVal": 5000,
+ "maxVal": 25000,
+ "factor": 5
+ },
+ "PressBH": {
+ "name": "SIM_PressBH",
+ "description": "Pressione ALTA Bolbole",
+ "tipoMem": "Real",
+ "minVal": 2000,
+ "maxVal": 2300,
+ "factor": 10
+ },
+ "PressBL": {
+ "name": "SIM_PressBL",
+ "description": "Pressione Media Bolbole",
+ "tipoMem": "Real",
+ "minVal": 2100,
+ "maxVal": 2500,
+ "factor": 10
+ },
+ "MainPress": {
+ "name": "SIM_MainPress",
+ "description": "Pressione principale",
+ "tipoMem": "Real",
+ "minVal": 30,
+ "maxVal": 150,
+ "factor": 10
+ }
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ03.ini b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ03.ini
new file mode 100644
index 00000000..9f996f7e
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ03.ini
@@ -0,0 +1,74 @@
+;Configurazione IOB-WIN
+[IOB]
+CNCTYPE=SIMULA
+PING_MS_TIMEOUT=500
+
+[MACHINE]
+VENDOR=STEAMWARE
+MODEL=DEMO_SIMULATOR_GWMS
+
+[CNC]
+IP=127.0.0.1
+PORT=0000
+
+[SERVER]
+MPIP=https://10.74.82.240
+MPURL=/api
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/IOB/sendReboot?idxMacchina=
+
+CMD_ODL_STARTED=/IOB/getCurrOdlStart/
+CMD_FORCLE_SPLIT_ODL=/IOB/forceSplitOdlFull/
+CMD_IDLE_TIME=/IOB/getIdlePeriod/
+
+[MEMORY]
+
+[BLINK]
+MAX_COUNTER_BLINK = 15
+BLINK_FILT=0
+
+[OPTPAR]
+AUTO_CHANGE_ODL=false
+DISABLE_SIM_STATUS=true
+;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
+PZCOUNT_MODE=BIT
+ENABLE_PZ_RESET=TRUE
+; per il simulatore: 50|1 = WAIT 50, DURATION 1 con riferimento al PERIODO base (PER_BASE, default 1 secondo)
+PER_BASE=9800
+SIM_PZCNT=13|1
+SIM_ALARM=200|10
+SIM_MANU=130|3
+; indica gestione e simulazione bit 5 --> slow
+SIM_SLOW=2500|20
+; indica gestione e simulazione bit 6 --> warmup/cooldown
+SIM_WUCD=8000|20
+; indica gestione e simulazione bit 7 --> emergenza
+SIM_EMRG=4000|10
+; indica simulazione delle funzionalita power ON/ OFF
+SIM_POW_ON_OFF=false
+T_ON=6
+T_OFF=22
+; gestione DynData simulati
+ENABLE_DYN_DATA=TRUE
+FORCE_DYN_DATA=TRUE
+NEW_DYN_DATA=TRUE
+;gestione invio pezzi in blocco
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=0
+MAX_SEND_PZC_BLOCK=100
+MIN_DURATA_ODL=240
+; indica parametri gestione TcMan
+TC_MAX_TC_FACTOR=3.9
+TC_LAMBDA=0.4
+TC_MAX_INCR=5
+MAX_PZ_INCR_PERC=1000
+
+; conf parametri memoria READ/WRITE
+PARAM_CONF=SIM_PIZ00.json
+
+[BRANCH]
+NAME=master
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ04.ini b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ04.ini
new file mode 100644
index 00000000..9f996f7e
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ04.ini
@@ -0,0 +1,74 @@
+;Configurazione IOB-WIN
+[IOB]
+CNCTYPE=SIMULA
+PING_MS_TIMEOUT=500
+
+[MACHINE]
+VENDOR=STEAMWARE
+MODEL=DEMO_SIMULATOR_GWMS
+
+[CNC]
+IP=127.0.0.1
+PORT=0000
+
+[SERVER]
+MPIP=https://10.74.82.240
+MPURL=/api
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/IOB/sendReboot?idxMacchina=
+
+CMD_ODL_STARTED=/IOB/getCurrOdlStart/
+CMD_FORCLE_SPLIT_ODL=/IOB/forceSplitOdlFull/
+CMD_IDLE_TIME=/IOB/getIdlePeriod/
+
+[MEMORY]
+
+[BLINK]
+MAX_COUNTER_BLINK = 15
+BLINK_FILT=0
+
+[OPTPAR]
+AUTO_CHANGE_ODL=false
+DISABLE_SIM_STATUS=true
+;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
+PZCOUNT_MODE=BIT
+ENABLE_PZ_RESET=TRUE
+; per il simulatore: 50|1 = WAIT 50, DURATION 1 con riferimento al PERIODO base (PER_BASE, default 1 secondo)
+PER_BASE=9800
+SIM_PZCNT=13|1
+SIM_ALARM=200|10
+SIM_MANU=130|3
+; indica gestione e simulazione bit 5 --> slow
+SIM_SLOW=2500|20
+; indica gestione e simulazione bit 6 --> warmup/cooldown
+SIM_WUCD=8000|20
+; indica gestione e simulazione bit 7 --> emergenza
+SIM_EMRG=4000|10
+; indica simulazione delle funzionalita power ON/ OFF
+SIM_POW_ON_OFF=false
+T_ON=6
+T_OFF=22
+; gestione DynData simulati
+ENABLE_DYN_DATA=TRUE
+FORCE_DYN_DATA=TRUE
+NEW_DYN_DATA=TRUE
+;gestione invio pezzi in blocco
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=0
+MAX_SEND_PZC_BLOCK=100
+MIN_DURATA_ODL=240
+; indica parametri gestione TcMan
+TC_MAX_TC_FACTOR=3.9
+TC_LAMBDA=0.4
+TC_MAX_INCR=5
+MAX_PZ_INCR_PERC=1000
+
+; conf parametri memoria READ/WRITE
+PARAM_CONF=SIM_PIZ00.json
+
+[BRANCH]
+NAME=master
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ05.ini b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ05.ini
new file mode 100644
index 00000000..9f996f7e
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ05.ini
@@ -0,0 +1,74 @@
+;Configurazione IOB-WIN
+[IOB]
+CNCTYPE=SIMULA
+PING_MS_TIMEOUT=500
+
+[MACHINE]
+VENDOR=STEAMWARE
+MODEL=DEMO_SIMULATOR_GWMS
+
+[CNC]
+IP=127.0.0.1
+PORT=0000
+
+[SERVER]
+MPIP=https://10.74.82.240
+MPURL=/api
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/IOB/sendReboot?idxMacchina=
+
+CMD_ODL_STARTED=/IOB/getCurrOdlStart/
+CMD_FORCLE_SPLIT_ODL=/IOB/forceSplitOdlFull/
+CMD_IDLE_TIME=/IOB/getIdlePeriod/
+
+[MEMORY]
+
+[BLINK]
+MAX_COUNTER_BLINK = 15
+BLINK_FILT=0
+
+[OPTPAR]
+AUTO_CHANGE_ODL=false
+DISABLE_SIM_STATUS=true
+;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
+PZCOUNT_MODE=BIT
+ENABLE_PZ_RESET=TRUE
+; per il simulatore: 50|1 = WAIT 50, DURATION 1 con riferimento al PERIODO base (PER_BASE, default 1 secondo)
+PER_BASE=9800
+SIM_PZCNT=13|1
+SIM_ALARM=200|10
+SIM_MANU=130|3
+; indica gestione e simulazione bit 5 --> slow
+SIM_SLOW=2500|20
+; indica gestione e simulazione bit 6 --> warmup/cooldown
+SIM_WUCD=8000|20
+; indica gestione e simulazione bit 7 --> emergenza
+SIM_EMRG=4000|10
+; indica simulazione delle funzionalita power ON/ OFF
+SIM_POW_ON_OFF=false
+T_ON=6
+T_OFF=22
+; gestione DynData simulati
+ENABLE_DYN_DATA=TRUE
+FORCE_DYN_DATA=TRUE
+NEW_DYN_DATA=TRUE
+;gestione invio pezzi in blocco
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=0
+MAX_SEND_PZC_BLOCK=100
+MIN_DURATA_ODL=240
+; indica parametri gestione TcMan
+TC_MAX_TC_FACTOR=3.9
+TC_LAMBDA=0.4
+TC_MAX_INCR=5
+MAX_PZ_INCR_PERC=1000
+
+; conf parametri memoria READ/WRITE
+PARAM_CONF=SIM_PIZ00.json
+
+[BRANCH]
+NAME=master
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ08.ini b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ08.ini
new file mode 100644
index 00000000..9f996f7e
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/SIM_PIZ08.ini
@@ -0,0 +1,74 @@
+;Configurazione IOB-WIN
+[IOB]
+CNCTYPE=SIMULA
+PING_MS_TIMEOUT=500
+
+[MACHINE]
+VENDOR=STEAMWARE
+MODEL=DEMO_SIMULATOR_GWMS
+
+[CNC]
+IP=127.0.0.1
+PORT=0000
+
+[SERVER]
+MPIP=https://10.74.82.240
+MPURL=/api
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/IOB/sendReboot?idxMacchina=
+
+CMD_ODL_STARTED=/IOB/getCurrOdlStart/
+CMD_FORCLE_SPLIT_ODL=/IOB/forceSplitOdlFull/
+CMD_IDLE_TIME=/IOB/getIdlePeriod/
+
+[MEMORY]
+
+[BLINK]
+MAX_COUNTER_BLINK = 15
+BLINK_FILT=0
+
+[OPTPAR]
+AUTO_CHANGE_ODL=false
+DISABLE_SIM_STATUS=true
+;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
+PZCOUNT_MODE=BIT
+ENABLE_PZ_RESET=TRUE
+; per il simulatore: 50|1 = WAIT 50, DURATION 1 con riferimento al PERIODO base (PER_BASE, default 1 secondo)
+PER_BASE=9800
+SIM_PZCNT=13|1
+SIM_ALARM=200|10
+SIM_MANU=130|3
+; indica gestione e simulazione bit 5 --> slow
+SIM_SLOW=2500|20
+; indica gestione e simulazione bit 6 --> warmup/cooldown
+SIM_WUCD=8000|20
+; indica gestione e simulazione bit 7 --> emergenza
+SIM_EMRG=4000|10
+; indica simulazione delle funzionalita power ON/ OFF
+SIM_POW_ON_OFF=false
+T_ON=6
+T_OFF=22
+; gestione DynData simulati
+ENABLE_DYN_DATA=TRUE
+FORCE_DYN_DATA=TRUE
+NEW_DYN_DATA=TRUE
+;gestione invio pezzi in blocco
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=0
+MAX_SEND_PZC_BLOCK=100
+MIN_DURATA_ODL=240
+; indica parametri gestione TcMan
+TC_MAX_TC_FACTOR=3.9
+TC_LAMBDA=0.4
+TC_MAX_INCR=5
+MAX_PZ_INCR_PERC=1000
+
+; conf parametri memoria READ/WRITE
+PARAM_CONF=SIM_PIZ00.json
+
+[BRANCH]
+NAME=master
\ 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 9c04d0e4..6a0cb6b6 100644
--- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
+++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
@@ -396,6 +396,21 @@
Always
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
Always
diff --git a/IOB-WIN-NEXT/IobGeneric.cs b/IOB-WIN-NEXT/IobGeneric.cs
index 2a71d2ec..782b7f78 100644
--- a/IOB-WIN-NEXT/IobGeneric.cs
+++ b/IOB-WIN-NEXT/IobGeneric.cs
@@ -870,7 +870,7 @@ namespace IOB_WIN_NEXT
{
if (DemoOut)
{
- answ = false;
+ answ = true;
}
else
{
@@ -881,7 +881,7 @@ namespace IOB_WIN_NEXT
string callResp = "";
try
{
- // chiamo URL, se restituisce "OK" è alive!
+ // chiamo URL, se restituisce "OK" è alive! provo con chiamata http
callResp = callUrl(urlAlive, false);
answ = (callResp == "OK");
}
@@ -3304,7 +3304,7 @@ namespace IOB_WIN_NEXT
else
{
lgError($"Attenzione! memMap è nullo, non posso eseguire task2exe!");
- }
+ }
}
return taskDone;
@@ -4071,12 +4071,12 @@ namespace IOB_WIN_NEXT
{
try
{
+ string sVal = "";
if (lastAlarm != currAlarms["CNC_ALARM"])
{
// salvo!
lastAlarm = currAlarms["CNC_ALARM"];
// per ogni valore del dizionario mostro ed accodo!
- string sVal = "";
foreach (var item in currAlarms)
{
sVal = string.Format("[CNC_ALARM]{0}|{1}", item.Key, item.Value);
@@ -4084,6 +4084,12 @@ namespace IOB_WIN_NEXT
accodaFLog(sVal, qEncodeFLog(item.Key, item.Value));
}
}
+ // accodo ALTRI allarmi NON CNC...
+ foreach (var item in currAlarms.Where(X => X.Key != "CNC_ALARM"))
+ {
+ sVal = $"{item.Key} | {item.Value}";
+ accodaFLog(sVal, qEncodeFLog(item.Key, item.Value));
+ }
}
catch (Exception exc)
{
diff --git a/IOB-WIN-NEXT/IobSiemensRobotService.cs b/IOB-WIN-NEXT/IobSiemensRobotService.cs
index 069979c5..f3124f9f 100644
--- a/IOB-WIN-NEXT/IobSiemensRobotService.cs
+++ b/IOB-WIN-NEXT/IobSiemensRobotService.cs
@@ -29,6 +29,7 @@ namespace IOB_WIN_NEXT
* B0.4 Bit Manuale
* B0.5 Bit MagOutPieno
* B0.6 Bit MagInVuoto
+ * B0.7 Bit EmergenzaArmata (0=triggered,premuta)
* Contapezzi DInt 2
* PezziRiman DInt 6
*
@@ -45,6 +46,12 @@ namespace IOB_WIN_NEXT
*
* -------------------------------------------------------------------------------- */
+ #region Protected Fields
+
+ protected bool EmergencyBypass = false;
+
+ #endregion Protected Fields
+
#region Public Constructors
///
@@ -55,6 +62,12 @@ namespace IOB_WIN_NEXT
public IobSiemensRobotService(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione RobotService");
+
+ if (IOBConf.optPar.ContainsKey("EMERGENCY_BYPASS"))
+ {
+ bool.TryParse(IOBConf.optPar["EMERGENCY_BYPASS"], out EmergencyBypass);
+ lgInfo($"Override EmergencyBypass da conf: {IOBConf.optPar["EMERGENCY_BYPASS"]} --> {EmergencyBypass}");
+ }
}
#endregion Public Constructors
@@ -95,6 +108,12 @@ namespace IOB_WIN_NEXT
byteSignals &= ~(1 << 0);
}
+ // se bypass emergenza attivo --> forzo a ARMED...
+ if (EmergencyBypass)
+ {
+ byteSignals |= (1 << 7);
+ }
+
// salvo!
B_input = byteSignals;
diff --git a/IOB-WIN-NEXT/IobSiemensTorri.cs b/IOB-WIN-NEXT/IobSiemensTorri.cs
index 0abcf29c..c0b8cc75 100644
--- a/IOB-WIN-NEXT/IobSiemensTorri.cs
+++ b/IOB-WIN-NEXT/IobSiemensTorri.cs
@@ -75,6 +75,12 @@ namespace IOB_WIN_NEXT
// salvo infine variabile bit x invio
B_input = byteSem;
+ // se ho il bit di allarme
+ if ((RawInput[0] & (1 << 3)) != 0)
+ {
+ checkAlarms();
+ }
+
// procedo SOLO SE è enabled IOB
if (IobOnline)
{
@@ -202,6 +208,48 @@ namespace IOB_WIN_NEXT
}
}
+ private void checkAlarms()
+ {
+ // leggo i banchi allarmi : cablato D700.DBDW2 --> D700 DBDW14, sono 4 banchi a 32 bit da verificare
+
+ int trovati = 0;
+ // ciclo nei 4 banchi...
+ trovati += checkAlarmBank("DB700.DBDW2");
+ trovati += checkAlarmBank("DB700.DBDW6");
+ trovati += checkAlarmBank("DB700.DBDW10");
+ trovati += checkAlarmBank("DB700.DBDW14");
+ }
+
+ private int checkAlarmBank(string memAddrAlarms)
+ {
+ int trovato = 0;
+ uint valDW = 0;
+ var MemBlockPZ = new byte[4];
+ bool fatto = S7ReadBB(ref MemBlockPZ, memAddrAlarms, 4);
+ //if (fatto)
+ //{
+ valDW = S7.Net.Types.DWord.FromByteArray(MemBlockPZ.ToArray());
+ // se <> 0 --> log e accodo a dynData
+ if (valDW != 0)
+ {
+ string key = $"MTH_ALARM_{memAddrAlarms}_{valDW}";
+ var biteVal = baseUtils.binaryForm(valDW);
+ lgInfo($"Stato allarmi rilevati: {key} | {valDW} | {biteVal}");
+ // accodo a dictionary
+ string almMsg = $"{DateTime.Now} | val {valDW} | {biteVal}";
+ // se non ci fosse aggiungo
+ if (!lastReadAlarms.ContainsKey(key))
+ {
+ lastReadAlarms.Add(key, almMsg);
+ }
+ trovato++;
+ }
+ //}
+ return trovato;
+ }
+
+ protected Dictionary lastReadAlarms = new Dictionary();
+
#endregion Protected Methods
#region Public Methods
@@ -277,7 +325,9 @@ namespace IOB_WIN_NEXT
///
public override Dictionary getCncAlarms()
{
- Dictionary outVal = new Dictionary();
+ // parto da ultimo vettore allarmi rilevato
+ Dictionary outVal = lastReadAlarms;
+ // se ho altro --> accodo
try
{
string almMsg = string.Format("{0} | {1}", currPLC.LastErrorCode.ToString(), currPLC.LastErrorString);
@@ -287,6 +337,8 @@ namespace IOB_WIN_NEXT
{
lgError(exc, "Errore in getCncAlarms");
}
+ // resetto vettore allarmi
+ lastReadAlarms = new Dictionary();
return outVal;
}
diff --git a/IOB-WIN-NEXT/IobSimula.cs b/IOB-WIN-NEXT/IobSimula.cs
index 685c346b..41968dad 100644
--- a/IOB-WIN-NEXT/IobSimula.cs
+++ b/IOB-WIN-NEXT/IobSimula.cs
@@ -44,6 +44,8 @@ namespace IOB_WIN_NEXT
///
protected int cP = 1;
+ protected bool disableSimStatus = false;
+
///
/// ultimo controllo decremento eventi
///
@@ -138,6 +140,11 @@ namespace IOB_WIN_NEXT
bit6 = setupSimPar("SIM_WUCD");
bit7 = setupSimPar("SIM_EMRG");
int.TryParse(getOptPar("MIN_DURATA_ODL"), out minDurataODL);
+ var strDisableSim = getOptPar("DISABLE_SIM_STATUS");
+ if (!string.IsNullOrEmpty(strDisableSim))
+ {
+ bool.TryParse(strDisableSim, out disableSimStatus);
+ }
}
setParamPlc();
// ricarico da server i dati dei pezzi fatti...
@@ -149,6 +156,9 @@ namespace IOB_WIN_NEXT
// imposto pezzi CNC ai pezzi contati da server...
contapezziPLC = contapezziIOB;
lgInfo($"Impostazione iniziale contatori: contapezzi macchina contapezziPLC: {contapezziPLC} | contapezziIOB: {contapezziIOB}");
+
+ // parto processando dynData
+ processDynData();
}
#endregion Public Constructors
@@ -540,88 +550,91 @@ namespace IOB_WIN_NEXT
{
// Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti...
Dictionary taskDone = new Dictionary();
- string taskVal = "";
- // verifico non sia null
- if (task2exe != null)
+ // controlo SE sia disabilitata simulazione principale
+ if (!disableSimStatus)
{
- // cerco task specifici
- foreach (var item in task2exe)
+ string taskVal = "";
+ // verifico non sia null
+ if (task2exe != null)
{
- taskVal = "";
- // converto richiesta in enum...
- taskType tName = taskType.nihil;
- Enum.TryParse(item.Key, out tName);
- // controllo sulla KEY
- switch (tName)
+ // cerco task specifici
+ foreach (var item in task2exe)
{
- case taskType.setArt:
- case taskType.setComm:
- case taskType.setProg:
- case taskType.setPzComm:
- memMap.mMapWrite[item.Key].value = item.Value;
- taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | UPDATED memMap.mMapWrite";
- break;
+ taskVal = "";
+ // converto richiesta in enum...
+ taskType tName = taskType.nihil;
+ Enum.TryParse(item.Key, out tName);
+ // controllo sulla KEY
+ switch (tName)
+ {
+ case taskType.setArt:
+ case taskType.setComm:
+ case taskType.setProg:
+ case taskType.setPzComm:
+ memMap.mMapWrite[item.Key].value = item.Value;
+ taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | UPDATED memMap.mMapWrite";
+ break;
- case taskType.setParameter:
- // richiedo da URL i parametri WRITE da popolare
- lgInfo("Chiamata processMemWriteRequests");
- taskVal = processMemWriteRequests();
- // se restituiscce "" faccio altra prova...
- if (string.IsNullOrEmpty(taskVal))
- {
- // i parametri me li aspetto come stringa composta paramName|paramvalue
- if (item.Value.Contains("|"))
+ case taskType.setParameter:
+ // richiedo da URL i parametri WRITE da popolare
+ lgInfo("Chiamata processMemWriteRequests");
+ taskVal = processMemWriteRequests();
+ // se restituiscce "" faccio altra prova...
+ if (string.IsNullOrEmpty(taskVal))
{
- string[] paramsJob = item.Value.Split('|');
- taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
+ // i parametri me li aspetto come stringa composta paramName|paramvalue
+ if (item.Value.Contains("|"))
+ {
+ string[] paramsJob = item.Value.Split('|');
+ taskVal = $"REQUEST SET PARAMETERS: {paramsJob[0]} --> {paramsJob[1]}";
+ }
+ else
+ {
+ taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
+ }
}
- else
- {
- taskVal = $"WRONG REQUEST FOR SET PARAMETERS: {item.Value} doesnt contain pipe for splitting key/value";
- }
- }
- break;
+ break;
- case taskType.nihil:
- case taskType.fixStopSetup:
- case taskType.forceResetPzCount:
- case taskType.sendWatchDogMes2Plc:
- case taskType.startSetup:
- case taskType.stopSetup:
- taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
- break;
+ case taskType.nihil:
+ case taskType.fixStopSetup:
+ case taskType.forceResetPzCount:
+ case taskType.sendWatchDogMes2Plc:
+ case taskType.startSetup:
+ case taskType.stopSetup:
+ taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
+ break;
- case taskType.forceSetPzCount:
- // forzo sul SIM il valore pzCount dell'IOB...
- int newPzCount = contapezziPLC;
- bool fatto = int.TryParse(item.Value, out newPzCount);
- if (fatto)
- {
- // verifico SE sia ammesso il cambio ...
- int deltaPzCount = newPzCount - contapezziPLC;
- double maxDelta = DateTime.Now.Subtract(plcLastPzRead).TotalMinutes / (plcAvgTc / 60);
- // se incremento superiore del doppio atteso --> segnalo errore e NON accetto
- if (deltaPzCount > (maxDelta * maxPzDeltaPerc) / 100)
+ case taskType.forceSetPzCount:
+ // forzo sul SIM il valore pzCount dell'IOB...
+ int newPzCount = contapezziPLC;
+ bool fatto = int.TryParse(item.Value, out newPzCount);
+ if (fatto)
{
- lgError($"[DELTA CHECK]: intremento contapezziPLC troppo elevato: lettura {newPzCount} | contapezzi attuale: {contapezziPLC} | ultima lettura PLC: {plcLastPzRead} | TCiclo medio: {plcAvgTc}s | incremento accettato ");
+ // verifico SE sia ammesso il cambio ...
+ int deltaPzCount = newPzCount - contapezziPLC;
+ double maxDelta = DateTime.Now.Subtract(plcLastPzRead).TotalMinutes / (plcAvgTc / 60);
+ // se incremento superiore del doppio atteso --> segnalo errore e NON accetto
+ if (deltaPzCount > (maxDelta * maxPzDeltaPerc) / 100)
+ {
+ lgError($"[DELTA CHECK]: intremento contapezziPLC troppo elevato: lettura {newPzCount} | contapezzi attuale: {contapezziPLC} | ultima lettura PLC: {plcLastPzRead} | TCiclo medio: {plcAvgTc}s | incremento accettato ");
+ }
+ else
+ {
+ contapezziPLC = newPzCount;
+ taskVal = $"Set new contapezziPLC: {contapezziPLC}";
+ }
}
- else
- {
- contapezziPLC = newPzCount;
- taskVal = $"Set new contapezziPLC: {contapezziPLC}";
- }
- }
- break;
+ break;
- default:
- taskVal = "SKIPPED | NO EXEC";
- break;
+ default:
+ taskVal = "SKIPPED | NO EXEC";
+ break;
+ }
+ // aggiungo task!
+ taskDone.Add(item.Key, taskVal);
}
- // aggiungo task!
- taskDone.Add(item.Key, taskVal);
}
}
-
return taskDone;
}
@@ -659,9 +672,43 @@ namespace IOB_WIN_NEXT
{
foreach (var item in memMap.mMapRead)
{
- // uso factor come valore MAX ammesso
- int randVal = rnd.Next(item.Value.minVal, item.Value.maxVal);
- outVal.Add(item.Key, randVal.ToString());
+ // se il TIPO di valore è livello --> simulo variazione da MAX --> min, con un delta in CALO pari a factor * (80-120)%
+ if (item.Value.name == "SIM_LEVEL")
+ {
+ // verifico last value
+ float lastVal = 0;
+ float.TryParse(item.Value.value, out lastVal);
+ if (lastVal == 0)
+ {
+ lastVal = item.Value.maxVal - item.Value.factor;
+ }
+ // decremento casuale...
+ float newVal = lastVal - ((float)item.Value.factor * rnd.Next(80, 120) / 100);
+ // se inferiore a minimo --> massimo!
+ if (newVal < item.Value.minVal)
+ {
+ newVal = item.Value.maxVal;
+ }
+ // salvo il suo VALUE...
+ item.Value.value = $"{newVal}";
+ outVal.Add(item.Key, $"{newVal}");
+ }
+ // altrimenti siulazione random walk...
+ else
+ {
+ if (item.Value.factor == 1)
+ {
+ // uso factor come valore MAX ammesso
+ int randVal = rnd.Next(item.Value.minVal, item.Value.maxVal);
+ outVal.Add(item.Key, randVal.ToString());
+ }
+ else
+ {
+ // uso factor come fattore di divisione x simulare decimali
+ float randVal = ((float)rnd.Next(item.Value.minVal, item.Value.maxVal)) / item.Value.factor;
+ outVal.Add(item.Key, randVal.ToString());
+ }
+ }
}
}
}
@@ -678,8 +725,8 @@ namespace IOB_WIN_NEXT
///
public override string getPrgName()
{
- // valore non presente in vers default... se gestito fare override
- string prgName = string.Format("DEMO_{0:00}", DateTime.Now.Minute);
+ // NOME DEL SIM!
+ string prgName = $"PROG_{cIobConf.codIOB}";
return prgName;
}
@@ -724,10 +771,15 @@ namespace IOB_WIN_NEXT
public override void readSemafori(ref newDisplayData currDispData)
{
base.readSemafori(ref currDispData);
- // decodifica e gestione
- decodeToBaseBitmap();
- decodeOtherData();
- reportRawInput(ref currDispData);
+
+ // controlo SE sia disabilitata simulazione principale
+ if (!disableSimStatus)
+ {
+ // decodifica e gestione
+ decodeToBaseBitmap();
+ decodeOtherData();
+ reportRawInput(ref currDispData);
+ }
}
///