AutoODL ad 1 gg, spostamento funzione da simula a iobGenerico
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
|
||||
+160
-3
@@ -2992,12 +2992,169 @@ namespace IOB_WIN
|
||||
// chiamo accodamento...
|
||||
accodaFLog(sVal, qEncodeFLog("PROG", currPrgName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifica se sia machcina multi = DoppioPallet da CONF
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica e processing x gestione ODL automatica
|
||||
/// </summary>
|
||||
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");
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Processo lettura dati sysinfo
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Effettua reset del contapezzi
|
||||
/// </summary>
|
||||
@@ -290,26 +159,6 @@ namespace IOB_WIN
|
||||
answ += noise - (answ / 10);
|
||||
return answ;
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica se sia machcina multi = DoppioPallet da CONF
|
||||
/// </summary>
|
||||
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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user