From 34a91557fbbbc24fa987ea8f33fafb94ef8bf113 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Wed, 27 Nov 2019 16:57:22 +0100 Subject: [PATCH] AutoODL ad 1 gg, spostamento funzione da simula a iobGenerico --- IOB-WIN/DATA/CONF/INTERCL_01.ini | 22 +---- IOB-WIN/DATA/CONF/INTERCL_02.ini | 20 +--- IOB-WIN/IobGeneric.cs | 163 ++++++++++++++++++++++++++++++- IOB-WIN/IobSimula.cs | 151 ---------------------------- 4 files changed, 168 insertions(+), 188 deletions(-) diff --git a/IOB-WIN/DATA/CONF/INTERCL_01.ini b/IOB-WIN/DATA/CONF/INTERCL_01.ini index 8fe462df..2a2bd67e 100644 --- a/IOB-WIN/DATA/CONF/INTERCL_01.ini +++ b/IOB-WIN/DATA/CONF/INTERCL_01.ini @@ -1,4 +1,4 @@ -;Configurazione IOB-WIN +;Configurazione IOB-WIN [IOB] ;Macchina preriscaldo barre per Valvital CNCTYPE=SIEMENS_AT2001 @@ -29,30 +29,17 @@ ADDR_READ=DB1000.DBB0 ADDR_WRITE=DB1001.DBB0 SIZE_READ=64 SIZE_WRITE=90 -;BIT0=CONN -;BIT1=DB60.DBB1 -;BIT2=PZCOUNT.STD.DB700.DBW22 -;BIT3=DB60.DBB3 -;BIT4=DB60.DBB4 [BLINK] -;MAX_COUNTER_BLINK = 30 MAX_COUNTER_BLINK = 15 -;bit0 = 0 -;bit1 = 0 -;bit2 = 1 -;bit3 = 1 -;bit4 = 1 -;bit5 = 0 -;bit6 = 0 -;bit7 = 0 BLINK_FILT=0 -;BLINK_FILT=28 [OPTPAR] +AUTO_CHANGE_ODL=true +CHANGE_ODL_HOURS=24 +CHANGE_ODL_IDLE_MIN=1 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice -; attenzione memoria sempre base BYTE (1604 DW --> 6416...) PZCOUNT_MODE=STD.DB1275.DBDW4 DISABLE_PZCOUNT=TRUE ENABLE_DYN_DATA=TRUE @@ -61,6 +48,7 @@ FORCE_DYN_DATA=TRUE ; conf parametri memoria READ/WRITE PARAM_CONF=INTERCL_01.json WRITE_CHECK=TRUE +TEST_MODE=TRUE [BRANCH] NAME=master \ No newline at end of file diff --git a/IOB-WIN/DATA/CONF/INTERCL_02.ini b/IOB-WIN/DATA/CONF/INTERCL_02.ini index 25ef319b..b91763ae 100644 --- a/IOB-WIN/DATA/CONF/INTERCL_02.ini +++ b/IOB-WIN/DATA/CONF/INTERCL_02.ini @@ -28,30 +28,16 @@ ADDR_READ=DB9999.DBB0 ADDR_WRITE=DB9999.DBB0 SIZE_READ=0 SIZE_WRITE=0 -;BIT0=CONN -;BIT1=DB60.DBB1 -;BIT2=PZCOUNT.STD.DB700.DBW22 -;BIT3=DB60.DBB3 -;BIT4=DB60.DBB4 - [BLINK] -;MAX_COUNTER_BLINK = 30 MAX_COUNTER_BLINK = 15 -;bit0 = 0 -;bit1 = 0 -;bit2 = 1 -;bit3 = 1 -;bit4 = 1 -;bit5 = 0 -;bit6 = 0 -;bit7 = 0 BLINK_FILT=0 -;BLINK_FILT=28 [OPTPAR] +AUTO_CHANGE_ODL=true +CHANGE_ODL_HOURS=24 +CHANGE_ODL_IDLE_MIN=1 ;PZCOUNT_MODE=STD.[PAR/MEM].info|BIT.indice -; attenzione memoria sempre base BYTE (1604 DW --> 6416...) PZCOUNT_MODE=STD.DM20.2 DISABLE_PZCOUNT=TRUE ENABLE_DYN_DATA=TRUE diff --git a/IOB-WIN/IobGeneric.cs b/IOB-WIN/IobGeneric.cs index 854726f3..d8c41ad0 100644 --- a/IOB-WIN/IobGeneric.cs +++ b/IOB-WIN/IobGeneric.cs @@ -2992,12 +2992,169 @@ namespace IOB_WIN // chiamo accodamento... accodaFLog(sVal, qEncodeFLog("PROG", currPrgName)); } - } + } + + /// + /// Verifica se sia machcina multi = DoppioPallet da CONF + /// + public bool isMulti + { + get + { + bool answ = false; + if (cIobConf.optPar.Count > 0) + { + // cerco con chaive reale IS_MULTI + string keyName = "IS_MULTI"; + if (!cIobConf.optPar.ContainsKey(keyName)) + { + // legacy: accetto anche SIM_MULTI... + keyName = "SIM_MULTI"; + } + // vera verifica su chaive... + if (cIobConf.optPar.ContainsKey(keyName)) + { + string SIM_MULTI = getOptPar(keyName); + answ = SIM_MULTI == "1"; + } + } + return answ; + } + } /// /// Verifica e processing x gestione ODL automatica /// - public virtual void processAutoOdl() - { + + public void processAutoOdl() + { + bool fatto = false; + if (!string.IsNullOrEmpty(getOptPar("AUTO_CHANGE_ODL"))) + { + string IOB_MULTI_CNAME = ""; + string[] elencoMulti = null; + string fullUrl = ""; + if (isMulti) + { + // devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali... + IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME"); + elencoMulti = IOB_MULTI_CNAME.Split(','); + } + // controllo SIA abilitato... + bool doProc = false; + DateTime adesso = DateTime.Now; + bool.TryParse(getOptPar("AUTO_CHANGE_ODL"), out doProc); + if (doProc) + { + // carico i parametri di configurazione x reset ODL... + string CHANGE_ODL_HOURS = getOptPar("CHANGE_ODL_IDLE_MIN"); + string CHANGE_ODL_IDLE_MIN = getOptPar("CHANGE_ODL_IDLE_MIN"); + if (!string.IsNullOrEmpty(CHANGE_ODL_HOURS) && !string.IsNullOrEmpty(CHANGE_ODL_IDLE_MIN)) + { + int minOdlDurHours = -1; + int minPlcIdelMin = -1; + int.TryParse(CHANGE_ODL_HOURS, out minOdlDurHours); + int.TryParse(CHANGE_ODL_IDLE_MIN, out minPlcIdelMin); + // controllo parametri validi + if (minOdlDurHours > 0 && minPlcIdelMin > 0) + { + // leggo da server inizio ODL... se non multi 1 solo... + DateTime inizioOdl = DateTime.Now; + string rawDataInizio = ""; + if (!isMulti) + { + rawDataInizio = callUrl(urlInizioOdlIob, true); + DateTime.TryParse(rawDataInizio, out inizioOdl); + } + else + { + DateTime tmpData = DateTime.Now; + // prendo il + vecchio... + foreach (var item in elencoMulti) + { + fullUrl = $"{urlInizioOdlIob}|{item}"; + rawDataInizio = callUrl(fullUrl, true); + DateTime.TryParse(rawDataInizio, out tmpData); + inizioOdl = (tmpData < inizioOdl) ? tmpData : inizioOdl; + } + } + //verifico se sia scaduto... + if (inizioOdl.AddHours(minOdlDurHours) < adesso) + { + string rawIdle = ""; + int idlePeriod = 0; + if (!isMulti) + { + // controllo SE sono fermo (spento o in manuale) per il periodo minimo richiesto... + rawIdle = callUrl(urlIdleTime, true); + int.TryParse(rawIdle, out idlePeriod); + } + else + { + int tmpIdle = 0; + // prendo il + grande... + foreach (var item in elencoMulti) + { + fullUrl = $"{urlIdleTime}|{item}"; + rawIdle = callUrl(fullUrl, true); + int.TryParse(rawIdle, out tmpIdle); + idlePeriod = tmpIdle > idlePeriod ? tmpIdle : idlePeriod; + } + } + if (idlePeriod >= minPlcIdelMin) + { + /*************************************************** + * 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 rawSplit = ""; + // se multi gestisco il bit delle tavole... + if (!isMulti) + { + // invio chiamata URL x reset ODL su macchina + rawSplit = callUrl(urlForceSplit, false); + fatto = (rawSplit == "OK") ? true : false; + } + 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, true); + } + fatto = (rawSplit == "OK") ? true : false; + } + + } + } + } + } + } + } + // loggo se fatto + if (fatto) + { + lg.Info($"Effettuato processAutoOdl"); + } } /// /// Processo lettura dati sysinfo diff --git a/IOB-WIN/IobSimula.cs b/IOB-WIN/IobSimula.cs index 37751b69..5ec73fd4 100644 --- a/IOB-WIN/IobSimula.cs +++ b/IOB-WIN/IobSimula.cs @@ -103,137 +103,6 @@ namespace IOB_WIN } setParamPlc(); } - public override void processAutoOdl() - { - bool fatto = false; - if (getOptPar("AUTO_CHANGE_ODL") != "") - { - string IOB_MULTI_CNAME = ""; - string[] elencoMulti = null; - string fullUrl = ""; - if (isMulti) - { - // devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali... - IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME"); - elencoMulti = IOB_MULTI_CNAME.Split(','); - } - // controllo SIA abilitato... - bool doProc = false; - DateTime adesso = DateTime.Now; - bool.TryParse(getOptPar("AUTO_CHANGE_ODL"), out doProc); - if (doProc) - { - // carico i parametri di configurazione x reset ODL... - string CHANGE_ODL_HOURS = getOptPar("CHANGE_ODL_IDLE_MIN"); - string CHANGE_ODL_IDLE_MIN = getOptPar("CHANGE_ODL_IDLE_MIN"); - if (CHANGE_ODL_HOURS != "" && CHANGE_ODL_IDLE_MIN != "") - { - int minOdlDurHours = -1; - int minPlcIdelMin = -1; - int.TryParse(CHANGE_ODL_HOURS, out minOdlDurHours); - int.TryParse(CHANGE_ODL_IDLE_MIN, out minPlcIdelMin); - // controllo parametri validi - if (minOdlDurHours > 0 && minPlcIdelMin > 0) - { - // leggo da server inizio ODL... se non multi 1 solo... - DateTime inizioOdl = DateTime.Now; - string rawDataInizio = ""; - if (!isMulti) - { - rawDataInizio = callUrl(urlInizioOdlIob, true); - DateTime.TryParse(rawDataInizio, out inizioOdl); - } - else - { - DateTime tmpData = DateTime.Now; - // prendo il + vecchio... - foreach (var item in elencoMulti) - { - fullUrl = $"{urlInizioOdlIob}|{item}"; - rawDataInizio = callUrl(fullUrl, true); - DateTime.TryParse(rawDataInizio, out tmpData); - inizioOdl = (tmpData < inizioOdl) ? tmpData : inizioOdl; - } - } - //verifico se sia scaduto... - if (inizioOdl.AddHours(minOdlDurHours) < adesso) - { - string rawIdle = ""; - int idlePeriod = 0; - if (!isMulti) - { - // controllo SE sono fermo (spento o in manuale) per il periodo minimo richiesto... - rawIdle = callUrl(urlIdleTime, true); - int.TryParse(rawIdle, out idlePeriod); - } - else - { - int tmpIdle = 0; - // prendo il + grande... - foreach (var item in elencoMulti) - { - fullUrl = $"{urlIdleTime}|{item}"; - rawIdle = callUrl(fullUrl, true); - int.TryParse(rawIdle, out tmpIdle); - idlePeriod = tmpIdle > idlePeriod ? tmpIdle : idlePeriod; - } - } - if (idlePeriod >= minPlcIdelMin) - { - /*************************************************** - * 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 rawSplit = ""; - // se multi gestisco il bit delle tavole... - if (!isMulti) - { - // invio chiamata URL x reset ODL su macchina - rawSplit = callUrl(urlForceSplit, false); - fatto = (rawSplit == "OK") ? true : false; - } - 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, true); - } - fatto = (rawSplit == "OK") ? true : false; - } - - } - } - } - } - } - } - // loggo se fatto - if (fatto) - { - lg.Info($"Effettuato processAutoOdl"); - } - } /// /// Effettua reset del contapezzi /// @@ -290,26 +159,6 @@ namespace IOB_WIN answ += noise - (answ / 10); return answ; } - /// - /// Verifica se sia machcina multi = DoppioPallet da CONF - /// - public bool isMulti - { - get - { - bool answ = false; - string keyName = "SIM_MULTI"; - if (cIobConf.optPar.Count > 0) - { - if (cIobConf.optPar.ContainsKey(keyName)) - { - string SIM_MULTI = getOptPar(keyName); - answ = SIM_MULTI == "1"; - } - } - return answ; - } - } public override void tryConnect() {