diff --git a/IOB-WIN/DATA/CONF/SIMUL_01.ini b/IOB-WIN/DATA/CONF/SIMUL_01.ini
index 9513b6cd..2697886d 100644
--- a/IOB-WIN/DATA/CONF/SIMUL_01.ini
+++ b/IOB-WIN/DATA/CONF/SIMUL_01.ini
@@ -37,6 +37,14 @@ CHANGE_ODL_IDLE_MIN=1
;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice
PZCOUNT_MODE=BIT
ENABLE_PZ_RESET=TRUE
+;gestione invio pezzi in blocco
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=5
+MAX_SEND_PZC_BLOCK=100
+; conf parametri memoria READ/WRITE
+PARAM_CONF=SIMUL_01.json
+; gestione cambio ODL automatico (minuti minimi durata)
+MIN_DURATA_ODL=240
; per il simulatore: 50|1 = WAIT 50, DURATION 1 con riferimento al PERIODO base (PER_BASE in ms, default 1 secondo)
PER_BASE=1200
SIM_PZCNT=5|1
@@ -52,13 +60,6 @@ T_OFF=22
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=5
-MAX_SEND_PZC_BLOCK=100
-MIN_DURATA_ODL=240
-; conf parametri memoria READ/WRITE
-PARAM_CONF=SIMUL_01.json
[BRANCH]
NAME=master
\ No newline at end of file
diff --git a/IOB-WIN/IobGeneric.cs b/IOB-WIN/IobGeneric.cs
index 9d041e0c..6b7b7e36 100644
--- a/IOB-WIN/IobGeneric.cs
+++ b/IOB-WIN/IobGeneric.cs
@@ -135,6 +135,10 @@ namespace IOB_WIN
utils.dtVetoSend = value;
}
}
+ ///
+ /// Imposta veto chiamata split (durante chiamata, per 60 sec)
+ ///
+ public DateTime vetoSplit = DateTime.Now.AddMinutes(1);
///
/// Indicazione VETO check status IOB x evitare loop troppo stretti...
///
@@ -685,6 +689,10 @@ namespace IOB_WIN
int.TryParse(getOptPar("MIN_SEND_PZC_BLOCK"), out minSendPzCountBlock);
}
}
+ else
+ {
+ lgError("loadMemConf: parametro ENABLE_SEND_PZC_BLOCK non trovato, verificare anche MAX_SEND_PZC_BLOCK e MIN_SEND_PZC_BLOCK");
+ }
// inizializzo LUT decodifica
string jsonConf = getOptPar("PARAM_CONF");
if (!string.IsNullOrEmpty(jsonConf))
@@ -3522,80 +3530,88 @@ namespace IOB_WIN
public bool forceSplitOdl()
{
bool fatto = false;
-
- // eseguo SOLO SE sono online...
- if (MPOnline && IobOnline)
+ if (vetoSplit < DateTime.Now)
{
- string fullUrl = "";
- string rawSplit = "";
- string IOB_MULTI_CNAME = "";
- string[] elencoMulti = null;
-
- try
+ // imposto veto x 1 minuto ad altre chiamate...
+ vetoSplit = DateTime.Now.AddMinutes(1);
+ // eseguo SOLO SE sono online...
+ if (MPOnline && IobOnline)
{
- /***************************************************
- * Descrizione procedura (OK X SIMULATORI...)
- *
- * - chiamata su MP/IO
- * - verifica che su DB sia abilitato AUTO ODL
- * - il server inserisce un evento fine prod HW 1 minuto prima e inizio setup HW
- * - viene duplicato e chiuso ODL corrente
- * - viene fatto partire ODL nuovo ADESSO
- * - num pezzi come ODL precedente (o da media 3 ODL precedenti)
- * - conferme pezzi & co... gestione NULL (NON SERVONO si tratta di impianti SENZA gestione vera ODL)
- * - reset contapezzi PLC locale...
- *
- *
- *
- * DA VALUTARE (x macchine tipo linea con + impianti... es valvital) SE
- * - creare una gestione ALTERNATIVA sul server che preveda impianto LEADER e impianti follower (RIGIDAMENTE CONFIGURATI)
- * - ogni volta che si fa setup LEADER --> si ripete su impianti FOLLOWER (eventi!!!)
- * - viene fatto reset contapezzi sui follower (+ altre operazioni opzionali, ES imposstazione nome commessa, quantità, articolo...)
- * - viene fatto reset + nuovo ODL (con stessi articoli e quantità) su follower, SENZA avere gestione x ODL di un codice esterno (quindi registra TUTTO ma NON RITORNERA' dati non avendo link verso esterno)
- * - serve NUOVA TABELLA delle macchine LEADER | FOLLOWER (1:n) e gestione da MP/IO
- *
- * ***************************************************/
+ string fullUrl = "";
+ string rawSplit = "";
+ string IOB_MULTI_CNAME = "";
+ string[] elencoMulti = null;
- if (isMulti)
+ try
{
- // devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali...
- IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME");
- elencoMulti = IOB_MULTI_CNAME.Split(',');
- }
- // se normale splitto!
- if (!isMulti)
- {
- // invio chiamata URL x reset ODL su macchina
- rawSplit = callUrl(urlForceSplit, false);
- fatto = (rawSplit == "OK") ? true : false;
- }
- // se multi gestisco il bit delle tavole...
- else
- {
- foreach (string item in elencoMulti)
+ /***************************************************
+ * Descrizione procedura (OK X SIMULATORI...)
+ *
+ * - chiamata su MP/IO
+ * - verifica che su DB sia abilitato AUTO ODL
+ * - il server inserisce un evento fine prod HW 1 minuto prima e inizio setup HW
+ * - viene duplicato e chiuso ODL corrente
+ * - viene fatto partire ODL nuovo ADESSO
+ * - num pezzi come ODL precedente (o da media 3 ODL precedenti)
+ * - conferme pezzi & co... gestione NULL (NON SERVONO si tratta di impianti SENZA gestione vera ODL)
+ * - reset contapezzi PLC locale...
+ *
+ *
+ *
+ * DA VALUTARE (x macchine tipo linea con + impianti... es valvital) SE
+ * - creare una gestione ALTERNATIVA sul server che preveda impianto LEADER e impianti follower (RIGIDAMENTE CONFIGURATI)
+ * - ogni volta che si fa setup LEADER --> si ripete su impianti FOLLOWER (eventi!!!)
+ * - viene fatto reset contapezzi sui follower (+ altre operazioni opzionali, ES imposstazione nome commessa, quantità, articolo...)
+ * - viene fatto reset + nuovo ODL (con stessi articoli e quantità) su follower, SENZA avere gestione x ODL di un codice esterno (quindi registra TUTTO ma NON RITORNERA' dati non avendo link verso esterno)
+ * - serve NUOVA TABELLA delle macchine LEADER | FOLLOWER (1:n) e gestione da MP/IO
+ *
+ * ***************************************************/
+
+ if (isMulti)
{
- // invio chiamata URL x reset ODL su macchina, ATTENZIONE scriviamo | al posto di "#" che in URL sarebbe filtrato...
- fullUrl = $"{urlForceSplit}|{item}";
- rawSplit = callUrl(fullUrl, false);
+ // devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali...
+ IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME");
+ elencoMulti = IOB_MULTI_CNAME.Split(',');
+ }
+ // se normale splitto!
+ if (!isMulti)
+ {
+ // invio chiamata URL x reset ODL su macchina
+ rawSplit = callUrl(urlForceSplit, false);
+ fatto = (rawSplit == "OK") ? true : false;
+ }
+ // se multi gestisco il bit delle tavole...
+ else
+ {
+ foreach (string item in elencoMulti)
+ {
+ // invio chiamata URL x reset ODL su macchina, ATTENZIONE scriviamo | al posto di "#" che in URL sarebbe filtrato...
+ fullUrl = $"{urlForceSplit}|{item}";
+ rawSplit = callUrl(fullUrl, false);
+ }
+ fatto = (rawSplit == "OK") ? true : false;
}
- fatto = (rawSplit == "OK") ? true : false;
- }
+ }
+ catch (Exception exc)
+ {
+ lgError($"Eccezione in forceSplitOdl{Environment.NewLine}{exc}");
+ }
+ // se fatto --> resetto contapezzi!!!
+ if (fatto)
+ {
+ lastCountCNC = 0;
+ contapezzi = 0;
+ }
}
- catch (Exception exc)
+ else
{
- lgError($"Eccezione in forceSplitOdl{Environment.NewLine}{exc}");
- }
- // se fatto --> resetto contapezzi!!!
- if (fatto)
- {
- lastCountCNC = 0;
- contapezzi = 0;
+ lgError("Richiesto forceSplitOdl ma MP/IOB offline --> NON eseguito");
}
}
else
{
- lgError("Richeisto forceSplitOdl ma MP/IOB offline --> NON eseguito");
+ lgError("Richiesto forceSplitOdl ma veto attivo --> NON eseguito");
}
return fatto;
}
diff --git a/IOB-WIN/IobSimula.cs b/IOB-WIN/IobSimula.cs
index bfa756f7..06dda05d 100644
--- a/IOB-WIN/IobSimula.cs
+++ b/IOB-WIN/IobSimula.cs
@@ -123,7 +123,7 @@ namespace IOB_WIN
}
setParamPlc();
// ricarico da server i dati dei pezzi fatti...
- lgInfo("Init contapezzi SIMULA: pzCntReload(true)");
+ lgInfo("Init contapezzi SIMULA: pzCntReload(true)");
pzCntReload(true);
// imposto pezzi CNC ai pezzi contati da server...
lastCountCNC = contapezzi;
@@ -426,7 +426,8 @@ namespace IOB_WIN
}
}
// se il contapezzi macchina è "andato troppo avanti" --> forced split ODL SE NON E' multi....
- if (contapezzi > lastCountCNC && !isMulti)
+ //if (contapezzi > lastCountCNC && !isMulti)
+ if (!isMulti)
{
// solo se ODL è in lavorazione da ALMENO minDurataODL minuti...
DateTime inizioOdl = DateTime.Now.AddDays(-1);