From cd4a9d2bb6acd4b389cc02d06c9bd2d52e541bc5 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Tue, 4 Feb 2020 12:43:31 +0100 Subject: [PATCH] Update IOB-WIN x split ODL + verifica parametri x invio pzcount > 1 --- IOB-WIN/DATA/CONF/SIMUL_01.ini | 15 ++-- IOB-WIN/IobGeneric.cs | 138 ++++++++++++++++++--------------- IOB-WIN/IobSimula.cs | 5 +- 3 files changed, 88 insertions(+), 70 deletions(-) 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);