Update IOB-WIN x split ODL + verifica parametri x invio pzcount > 1
This commit is contained in:
@@ -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
|
||||
+77
-61
@@ -135,6 +135,10 @@ namespace IOB_WIN
|
||||
utils.dtVetoSend = value;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Imposta veto chiamata split (durante chiamata, per 60 sec)
|
||||
/// </summary>
|
||||
public DateTime vetoSplit = DateTime.Now.AddMinutes(1);
|
||||
/// <summary>
|
||||
/// Indicazione VETO check status IOB x evitare loop troppo stretti...
|
||||
/// </summary>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user