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()
{