Merge branch 'develop'
This commit is contained in:
@@ -58,6 +58,7 @@ PZCOUNT_MODE=STD.DM20.2
|
||||
DISABLE_PZCOUNT=TRUE
|
||||
ENABLE_DYN_DATA=FALSE
|
||||
FORCE_DYN_DATA=TRUE
|
||||
ENABLE_DATA_FILTER=FALSE
|
||||
|
||||
; conf parametri memoria READ/WRITE
|
||||
PARAM_CONF=IMI_50.json
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -51,7 +51,7 @@ T_OFF=22
|
||||
; gestione DynData simulati
|
||||
ENABLE_DYN_DATA=TRUE
|
||||
FORCE_DYN_DATA=TRUE
|
||||
|
||||
NEW_DYN_DATA=TRUE
|
||||
; conf parametri memoria READ/WRITE
|
||||
PARAM_CONF=SIMUL_02.json
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ T_OFF=22
|
||||
; gestione DynData simulati
|
||||
ENABLE_DYN_DATA=TRUE
|
||||
FORCE_DYN_DATA=TRUE
|
||||
|
||||
NEW_DYN_DATA=TRUE
|
||||
; conf parametri memoria READ/WRITE
|
||||
PARAM_CONF=SIMUL_03.json
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ T_OFF=22
|
||||
; gestione DynData simulati
|
||||
ENABLE_DYN_DATA=TRUE
|
||||
FORCE_DYN_DATA=TRUE
|
||||
|
||||
NEW_DYN_DATA=TRUE
|
||||
; conf parametri memoria READ/WRITE
|
||||
PARAM_CONF=SIMUL_04.json
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ T_OFF=22
|
||||
; gestione DynData simulati
|
||||
ENABLE_DYN_DATA=TRUE
|
||||
FORCE_DYN_DATA=TRUE
|
||||
|
||||
NEW_DYN_DATA=TRUE
|
||||
; conf parametri memoria READ/WRITE
|
||||
PARAM_CONF=SIMUL_05.json
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ T_OFF=22
|
||||
; gestione DynData simulati
|
||||
ENABLE_DYN_DATA=TRUE
|
||||
FORCE_DYN_DATA=TRUE
|
||||
|
||||
NEW_DYN_DATA=TRUE
|
||||
; conf parametri memoria READ/WRITE
|
||||
PARAM_CONF=SIMUL_05.json
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ T_OFF=22
|
||||
; gestione DynData simulati
|
||||
ENABLE_DYN_DATA=TRUE
|
||||
FORCE_DYN_DATA=TRUE
|
||||
|
||||
NEW_DYN_DATA=TRUE
|
||||
; conf parametri memoria READ/WRITE
|
||||
PARAM_CONF=SIMUL_07.json
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ T_OFF=22
|
||||
; gestione DynData simulati
|
||||
ENABLE_DYN_DATA=TRUE
|
||||
FORCE_DYN_DATA=TRUE
|
||||
|
||||
NEW_DYN_DATA=TRUE
|
||||
; conf parametri memoria READ/WRITE
|
||||
PARAM_CONF=SIMUL_08.json
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
;Configurazione IOB-WIN
|
||||
;Configurazione IOB-WIN
|
||||
[IOB]
|
||||
CNCTYPE=SIMULA
|
||||
PING_MS_TIMEOUT=500
|
||||
@@ -44,11 +44,11 @@ PER_BASE=800
|
||||
SIM_PZCNT=10|3
|
||||
SIM_ALARM=1000|20
|
||||
SIM_MANU=50|6
|
||||
; 1 = indica che la macchina è multi --> allo scadere del contapezzo gestisce ANCHE il giro tavola sui bit relativi
|
||||
; 1 = indica che la macchina � multi --> allo scadere del contapezzo gestisce ANCHE il giro tavola sui bit relativi
|
||||
SIM_MULTI=1
|
||||
; indica gestione e simulazione bit 5 --> slow/emergenza
|
||||
SIM_SLOW=3500|20
|
||||
; indica simulazione delle funzionalità power ON/ OFF
|
||||
; indica simulazione delle funzionalit� power ON/ OFF
|
||||
SIM_POW_ON_OFF=true
|
||||
T_ON=6
|
||||
T_OFF=22
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
;Configurazione IOB-WIN
|
||||
;Configurazione IOB-WIN
|
||||
[IOB]
|
||||
CNCTYPE=SIMULA
|
||||
PING_MS_TIMEOUT=500
|
||||
@@ -44,11 +44,11 @@ PER_BASE=800
|
||||
SIM_PZCNT=10|2
|
||||
SIM_ALARM=1000|20
|
||||
SIM_MANU=50|6
|
||||
; 1 = indica che la macchina è multi --> allo scadere del contapezzo gestisce ANCHE il giro tavola sui bit relativi
|
||||
; 1 = indica che la macchina � multi --> allo scadere del contapezzo gestisce ANCHE il giro tavola sui bit relativi
|
||||
SIM_MULTI=1
|
||||
; indica gestione e simulazione bit 5 --> slow/emergenza
|
||||
SIM_SLOW=6500|20
|
||||
; indica simulazione delle funzionalità power ON/ OFF
|
||||
; indica simulazione delle funzionalit� power ON/ OFF
|
||||
SIM_POW_ON_OFF=false
|
||||
T_ON=6
|
||||
T_OFF=22
|
||||
|
||||
+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
|
||||
|
||||
+65
-5
@@ -26,6 +26,10 @@ namespace IOB_WIN
|
||||
/// </summary>
|
||||
protected MTConnectClient MTC_ref;
|
||||
/// <summary>
|
||||
/// Gestione filtraggio dati
|
||||
/// </summary>
|
||||
protected bool enableDataFilter = false;
|
||||
/// <summary>
|
||||
/// URL x salvataggio elenco dataItems MTC
|
||||
/// </summary>
|
||||
protected string urlSaveDataItems
|
||||
@@ -56,6 +60,11 @@ namespace IOB_WIN
|
||||
{
|
||||
// gestione invio ritardato contapezzi
|
||||
pzCountDelay = utils.CRI("pzCountDelay");
|
||||
// gestione data filtering...
|
||||
if (!string.IsNullOrEmpty(getOptPar("ENABLE_DATA_FILTER")))
|
||||
{
|
||||
bool.TryParse(getOptPar("ENABLE_DATA_FILTER"), out enableDataFilter);
|
||||
}
|
||||
lastPzCountSend = DateTime.Now;
|
||||
lastWarnODL = DateTime.Now;
|
||||
}
|
||||
@@ -233,10 +242,18 @@ namespace IOB_WIN
|
||||
break;
|
||||
case MTConnect.DataItemCategory.SAMPLE:
|
||||
uuid = $"S_{dataItem.Id}";
|
||||
threshDBand = 1;
|
||||
if (dataItem.Id.EndsWith("PosAct") || dataItem.Id.EndsWith("PosTgt"))
|
||||
// SOLOS E è abilitato il datafiltering...
|
||||
if (enableDataFilter)
|
||||
{
|
||||
threshDBand = 5;
|
||||
threshDBand = 1;
|
||||
if (dataItem.Id.EndsWith("PosAct") || dataItem.Id.EndsWith("PosTgt"))
|
||||
{
|
||||
threshDBand = 5;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
threshDBand = 0;
|
||||
}
|
||||
dSamplePeriod = 60;
|
||||
break;
|
||||
@@ -321,9 +338,14 @@ namespace IOB_WIN
|
||||
/// <returns></returns>
|
||||
protected bool checkSaveItem(MTConnectStreams.DataItem newValue)
|
||||
{
|
||||
bool answ = false;
|
||||
bool answ = !enableDataFilter;
|
||||
|
||||
if (newValue != null)
|
||||
{
|
||||
if (utils.CRB("verbose"))
|
||||
{
|
||||
lgInfo($"Richiesta checkSaveItem per {newValue} | id: {newValue.DataItemId} | CDATA: {newValue.CDATA}");
|
||||
}
|
||||
// verifico in memoria se ho l'oggetto condition ed il suo valore..
|
||||
if (dataItemMem.ContainsKey(newValue.DataItemId))
|
||||
{
|
||||
@@ -333,6 +355,10 @@ namespace IOB_WIN
|
||||
answ = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lgError("Attenzione: checkSaveItem con newValue null!");
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
/// <summary>
|
||||
@@ -342,11 +368,15 @@ namespace IOB_WIN
|
||||
/// <returns></returns>
|
||||
protected bool checkSaveSample(MTConnectStreams.Sample newValue)
|
||||
{
|
||||
bool answ = false;
|
||||
bool answ = !enableDataFilter;
|
||||
double oldVal = 0;
|
||||
double newVal = 0;
|
||||
if (newValue != null)
|
||||
{
|
||||
if (utils.CRB("verbose"))
|
||||
{
|
||||
lgInfo($"Richiesta checkSaveSample per {newValue} | id: {newValue.DataItemId} | CDATA: {newValue.CDATA}");
|
||||
}
|
||||
// verifico in memoria se ho l'oggetto condition ed il suo valore..
|
||||
if (dataItemMem.ContainsKey(newValue.DataItemId))
|
||||
{
|
||||
@@ -365,6 +395,10 @@ namespace IOB_WIN
|
||||
// controllo SE ho DeadBand...
|
||||
if (dataItemMem[newValue.DataItemId].thresholdDeadBand > 0)
|
||||
{
|
||||
if (utils.CRB("verbose"))
|
||||
{
|
||||
lgInfo($"Test deadband: oldVal: {oldVal} | newVal: {newVal}");
|
||||
}
|
||||
// recupero i valori e testo DeadBand...
|
||||
double.TryParse(dataItemMem[newValue.DataItemId].value.Replace(".", ","), out oldVal);
|
||||
double.TryParse(newValue.CDATA.Replace(".", ","), out newVal);
|
||||
@@ -385,6 +419,10 @@ namespace IOB_WIN
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lgError("Attenzione: checkSaveItem con newValue null!");
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
@@ -457,6 +495,13 @@ namespace IOB_WIN
|
||||
{
|
||||
accodaFLog(sVal, qEncodeFLog(locTStamp, descr, dataItem.CDATA));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (utils.CRB("verbose"))
|
||||
{
|
||||
lgInfo($"NON ACCODATO sample poiché verifica variazioen ha dato esito negativo");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
@@ -752,6 +797,8 @@ namespace IOB_WIN
|
||||
string currExe = "";
|
||||
string currRun = "";
|
||||
string currUnOpStatus = "";
|
||||
string currGettoOn = "";
|
||||
string currAbilAbras = "";
|
||||
try
|
||||
{
|
||||
var exeMode = dataItemMem["Path_01_EXE_MODE"];
|
||||
@@ -840,6 +887,19 @@ namespace IOB_WIN
|
||||
lgInfo(string.Format("Trasformazione B_input: {0}", B_input));
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Verifica un DataItem e se il valore corrisponde a quello indicato come "true value" restituisce true
|
||||
/// </summary>
|
||||
/// <param name="itemName"></param>
|
||||
/// <param name="trueVal"></param>
|
||||
/// <returns></returns>
|
||||
protected bool checkDataItem(string itemName, string trueVal)
|
||||
{
|
||||
bool answ = false;
|
||||
|
||||
return answ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupero dati dinamici...
|
||||
/// </summary>
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -6,6 +6,13 @@
|
||||
<br />
|
||||
Note di rilascio:
|
||||
<ul>
|
||||
<li>
|
||||
<b>v.2.5.* → v.2.6.*</b>
|
||||
<ul>
|
||||
<li>revisione sistema timeout Ping</li>
|
||||
<li>Gestione AutoODL in prod generale (non solo SIM)</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<b>v.2.4.* → v.2.5.*</b>
|
||||
<ul>
|
||||
|
||||
Vendored
+3
-3
@@ -16,9 +16,9 @@ pipeline {
|
||||
|
||||
/* calcolo numero versione... diverso x branch MASTER/DEVELOP */
|
||||
script {
|
||||
withEnv(['NEXT_BUILD_NUMBER=547']) {
|
||||
// env.versionNumber = VersionNumber(versionNumberString : '2.5.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true)
|
||||
env.versionNumber = VersionNumber(versionNumberString : '2.5.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}')
|
||||
withEnv(['NEXT_BUILD_NUMBER=551']) {
|
||||
// env.versionNumber = VersionNumber(versionNumberString : '2.6.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true)
|
||||
env.versionNumber = VersionNumber(versionNumberString : '2.6.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}')
|
||||
env.APP_NAME = 'MAPO-IOB-WIN'
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user