diff --git a/IOB-WIN-NEXT/DATA/CONF/SIMUL_03.ini b/IOB-WIN-NEXT/DATA/CONF/SIMUL_03.ini
index 1eebacfd..985d0380 100644
--- a/IOB-WIN-NEXT/DATA/CONF/SIMUL_03.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/SIMUL_03.ini
@@ -58,6 +58,8 @@ SIM_RC=100|1
SIM_RS=200|1
; indica simulazione dichiarazioni (note) utente
SIM_DICH=300|1
+; indica matricola opr simulata
+SIM_MATR_OPR=1
; gestione DynData simulati
ENABLE_DYN_DATA=TRUE
diff --git a/IOB-WIN-NEXT/IobGeneric.cs b/IOB-WIN-NEXT/IobGeneric.cs
index 679c8046..74b3a0d9 100644
--- a/IOB-WIN-NEXT/IobGeneric.cs
+++ b/IOB-WIN-NEXT/IobGeneric.cs
@@ -1069,6 +1069,11 @@ namespace IOB_WIN_NEXT
///
public int counterFLog { get; set; }
+ ///
+ /// Contatore x invio dati UserLog
+ ///
+ public int counterULog { get; set; }
+
///
/// Contatore x invio dati SignalIN
///
@@ -3284,6 +3289,28 @@ namespace IOB_WIN_NEXT
}
}
+
+
+ ///
+ /// Accumula in coda i valori USER LOG e logga...
+ ///
+ /// VALORE RAW (x display)
+ /// VALORE già processato con qEncodeULog(...)
+ public void accodaUserLog(string val, string encodedVal)
+ {
+ // mostro dati variati letti...
+ displayOtherData(val);
+ // accodo IN PRIMIS al FluxLog --> accodo (valore già formattato)!
+ QueueULog.Enqueue(encodedVal);
+
+ // loggo!
+ lgInfo(string.Format("[QUEUE-USER-LOG] {0}", encodedVal));
+ counterULog++;
+ if (counterULog > 9999)
+ {
+ counterFLog = 0;
+ }
+ }
///
/// Accumula in coda i valori Flux Log e logga...
///
@@ -4602,6 +4629,22 @@ namespace IOB_WIN_NEXT
{ }
return answ;
}
+ ///
+ /// Fornisce il valore di UserLog e valore in formato valido x messa in coda nel formato dtEve#flux#value#cont
+ /// Flusso dati (RC/RS/DI)
+ /// Valore da inviare
+ ///
+ public string qEncodeULog(string flusso, string valore)
+ {
+ string answ = "";
+ try
+ {
+ answ = $"{DateTime.Now:yyyyMMddHHmmssfff}#{flusso}#{valore}#{counterULog}";
+ }
+ catch
+ { }
+ return answ;
+ }
///
/// Fornisce il valore di flusso e valore in formato valido x messa in coda nel formato dtEve#flux#value#cont
@@ -5095,6 +5138,33 @@ namespace IOB_WIN_NEXT
sendToMoonPro(urlType.FLog, currVal);
}
}
+
+ // svuoto coda ULog
+ while (QueueULog.Count > 0)
+ {
+ List listaValori = new List();
+ // se ho + di maxJsonData elementi --> invio un set di dati alla volta
+ if (QueueULog.Count > maxJsonData)
+ {
+ string currVal = "";
+ // prendoi primi maxJsonDataValori
+ for (int i = 0; i < maxJsonData; i++)
+ {
+ QueueULog.TryDequeue(out currVal);
+ listaValori.Add(currVal);
+ }
+ sendDataBlock(urlType.ULog, listaValori);
+ }
+ else
+ {
+ // invio in blocco
+ listaValori = QueueULog.ToList();
+ // invio
+ sendDataBlock(urlType.ULog, listaValori);
+ // svuoto!
+ QueueULog = new ConcurrentQueue();
+ }
+ }
}
parentForm.displayTaskAndLog("[STOP] Stopping adapter...");
adpTryRestart = false;
diff --git a/IOB-WIN-NEXT/IobSimula.cs b/IOB-WIN-NEXT/IobSimula.cs
index 5323dc17..f00aa48e 100644
--- a/IOB-WIN-NEXT/IobSimula.cs
+++ b/IOB-WIN-NEXT/IobSimula.cs
@@ -60,7 +60,10 @@ namespace IOB_WIN_NEXT
///
protected simPar simDich;
-
+ ///
+ /// Matricola OPR simulato
+ ///
+ protected int matrOpr = 1;
protected bool disableSimStatus = false;
@@ -167,6 +170,7 @@ namespace IOB_WIN_NEXT
simRC = setupSimPar("SIM_RC");
simRS = setupSimPar("SIM_RS");
simDich = setupSimPar("SIM_DICH");
+ int.TryParse(getOptPar("SIM_MATR_OPR"), out matrOpr);
}
setParamPlc();
// ricarico da server i dati dei pezzi fatti...
@@ -500,7 +504,10 @@ namespace IOB_WIN_NEXT
// preparo record controlli... guasto se mi esce un secondo divisibile x 25
DateTime adesso = DateTime.Now;
bool esitoOk = adesso.Second % 25 == 0 ? false : true;
-
+ string note = esitoOk ? "" : $"SIM Controllo fallito alle {DateTime.Now:yyyy-MM-dd HH:mm:ss}";
+ string sVal = $"MatrOpr: {matrOpr} | Esito: {esitoOk} | note: {note}";
+ // accodo x invio
+ accodaUserLog(sVal, qEncodeULog("RC", $"{esitoOk}|{note}"));
// decremento duration
simRC.duration--;
// controllo se sia scaduta la duration... in quel caso reset...
@@ -509,6 +516,39 @@ namespace IOB_WIN_NEXT
simRC = setupSimPar("SIM_RC");
}
}
+ if (simRS.wait <= 0)
+ {
+ // preparo record controlli... guasto se mi esce un secondo divisibile x 25
+ DateTime adesso = DateTime.Now;
+ int causale = adesso.Second % 5;
+ string note = $"SIM Scarto alle {DateTime.Now:yyyy-MM-dd HH:mm:ss} | causale: {causale}";
+ string sVal = $"MatrOpr: {matrOpr} | Causale: {causale} | note: {note}";
+ // accodo x invio
+ accodaUserLog(sVal, qEncodeULog("RS", $"{causale:00}|{note}"));
+ // decremento duration
+ simRS.duration--;
+ // controllo se sia scaduta la duration... in quel caso reset...
+ if (simRS.duration <= 0)
+ {
+ simRS = setupSimPar("SIM_RS");
+ }
+ }
+ if (simDich.wait <= 0)
+ {
+ // preparo record controlli... guasto se mi esce un secondo divisibile x 25
+ DateTime adesso = DateTime.Now;
+ string note = $"SIM Nota automatica alle {DateTime.Now:yyyy-MM-dd HH:mm:ss}";
+ string sVal = $"MatrOpr: {matrOpr} | nota: {note}";
+ // accodo x invio
+ accodaUserLog(sVal, qEncodeULog("DI", $"{note}"));
+ // decremento duration
+ simDich.duration--;
+ // controllo se sia scaduta la duration... in quel caso reset...
+ if (simDich.duration <= 0)
+ {
+ simDich = setupSimPar("SIM_DICH");
+ }
+ }
// init obj display