Merge branch 'develop'

This commit is contained in:
Samuele E. Locatelli
2019-12-03 16:06:24 +01:00
17 changed files with 257 additions and 209 deletions
+1
View File
@@ -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
+5 -17
View File
@@ -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
+3 -17
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+3 -3
View File
@@ -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
+3 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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>
-151
View File
@@ -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()
{
+7
View File
@@ -6,6 +6,13 @@
<br />
Note di rilascio:
<ul>
<li>
<b>v.2.5.* &rarr; 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.* &rarr; v.2.5.*</b>
<ul>
Vendored
+3 -3
View File
@@ -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'
}
}