diff --git a/IOB-UT-NEXT/Config/Base/OdlDto.cs b/IOB-UT-NEXT/Config/Base/OdlDto.cs
index 15d52058..88925f50 100644
--- a/IOB-UT-NEXT/Config/Base/OdlDto.cs
+++ b/IOB-UT-NEXT/Config/Base/OdlDto.cs
@@ -21,22 +21,23 @@ namespace IOB_UT_NEXT.Config.Base
///
/// Modalità di esecuzione del cambio ODL automatico (tipicamente a tempo/simulazione su qty)
+ /// - TIME (default)
/// - SIMUL
/// - DAILY
/// - ...
///
- public string ChangeOdlMode { get; set; } = "";
+ public string ChangeOdlMode { get; set; } = "TIME";
///
- /// Numero di ore di durata minima (ODL corrente) prima di eseguire una richiesta di cambio ODL automatico
+ /// Durata minima ODL in Ore (ODL corrente) prima di eseguire una richiesta di cambio ODL automatico
///
- public int ChangeOdlHours { get; set; } = 24;
+ public int OdlDurationHours { get; set; } = 24;
///
/// Durata minima in minuti dello stato idle prima di eseguire una richiesta di cambio ODL
/// Serve ad evitare un cambio ODL mentre la amcchina è in RUN
///
- public int ChangeOdlIdleMin { get; set; } = 0;
+ public int IdleStateMin { get; set; } = 0;
///
/// Abilitazione cambio ODL in caso di Reset Contapezzi guardando parametri ResetCount Min/Max...
@@ -56,8 +57,8 @@ namespace IOB_UT_NEXT.Config.Base
#if false
///
/// Parametri opzionali di configurazione cambio ODL, ad esempio
- /// - ChangeOdlHours
- /// - ChangeOdlIdleMin
+ /// - OdlDurationHours
+ /// - IdleStateMin
/// - ResetMinCountPre
/// - ResetMaxCountPost
///
diff --git a/IOB-UT-NEXT/Config/IobConfTree.cs b/IOB-UT-NEXT/Config/IobConfTree.cs
index dc5e018c..7a544b33 100644
--- a/IOB-UT-NEXT/Config/IobConfTree.cs
+++ b/IOB-UT-NEXT/Config/IobConfTree.cs
@@ -158,12 +158,14 @@ namespace IOB_UT_NEXT.Config
{
AutoChangeOdl = bool.Parse(fIni.ReadString("OPTPAR", "AUTO_CHANGE_ODL", "false")),
ChangeOdlMode = fIni.ReadString("OPTPAR", "CHANGE_ODL_MODE", ""),
- ChangeOdlHours = fIni.ReadInteger("OPTPAR", "CHANGE_ODL_HOURS", 24),
- ChangeOdlIdleMin = fIni.ReadInteger("OPTPAR", "CHANGE_ODL_IDLE_MIN", 0),
+ OdlDurationHours = fIni.ReadInteger("OPTPAR", "CHANGE_ODL_HOURS", 24),
+ IdleStateMin = fIni.ReadInteger("OPTPAR", "CHANGE_ODL_IDLE_MIN", 0),
// il change ODL al reset contapezzi può essere configurato in 2 modi: con chiave esplicita oppure con il CHANGE_ODL_MODE specifico...
ChangeOnResetCount = bool.Parse(fIni.ReadString("OPTPAR", "CHANGE_PZCOUNT_RESET", "false")) || (fIni.ReadString("OPTPAR", "CHANGE_ODL_MODE", "") == "PZCOUNT_RESET"),
- ResetCountMinPre = fIni.ReadInteger("OPTPAR", "RESET_COUNT_PRE", 100),
- ResetCountMaxPost = fIni.ReadInteger("OPTPAR", "RESET_COUNT_POST", 1),
+ // gestione precedente: bastava 1 solo pezzo pre...
+ ResetCountMinPre = fIni.ReadInteger("OPTPAR", "RESET_COUNT_PRE", 1),
+ // e reset a zero...
+ ResetCountMaxPost = fIni.ReadInteger("OPTPAR", "RESET_COUNT_POST", 0),
};
exclOptPar.Add("AUTO_CHANGE_ODL");
diff --git a/IOB-WIN-FORM/Iob/Generic.cs b/IOB-WIN-FORM/Iob/Generic.cs
index 4ef4f559..bc53ec88 100644
--- a/IOB-WIN-FORM/Iob/Generic.cs
+++ b/IOB-WIN-FORM/Iob/Generic.cs
@@ -1890,9 +1890,10 @@ namespace IOB_WIN_FORM.Iob
public void processAutoOdl()
{
bool fatto = false;
- if (!string.IsNullOrEmpty(getOptPar("AUTO_CHANGE_ODL")))
+ //if (!string.IsNullOrEmpty(getOptPar("AUTO_CHANGE_ODL")))
+ if (IOBConfFull.Odl.AutoChangeOdl)
{
- lgTrace("Richiesta processAutoOdl");
+ lgTrace("processAutoOdl | AutoChangeOdl abilitato");
// imposto il veto lettura contapezzi a 1 minuto x iniziare...
dtVetoReadPzCount = DateTime.Now.AddMinutes(delayMinReadPzCount);
string IOB_MULTI_CNAME = "";
@@ -1904,8 +1905,6 @@ namespace IOB_WIN_FORM.Iob
IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME");
elencoMulti = IOB_MULTI_CNAME.Split(',');
}
- // controllo SIA abilitato...
- bool doProc = false;
DateTime adesso = DateTime.Now;
DateTime inizioOdl = adesso;
string rawDataInizio = "";
@@ -1915,18 +1914,14 @@ namespace IOB_WIN_FORM.Iob
}
else
{
- bool.TryParse(getOptPar("AUTO_CHANGE_ODL"), out doProc);
- if (doProc)
+ bool callChangeODL = false;
+ switch (IOBConfFull.Odl.ChangeOdlMode)
{
- lgTrace("AUTO_CHANGE_ODL abilitato");
- bool callChangeODL = false;
-
- if (CHANGE_ODL_MODE == "PZCOUNT_RESET")
- {
+ case "PZCOUNT_RESET":
/* verifico se sia "armato" il reset cambio ODL, DEVO essere :
- * - NON in produzione
- * - contapezzi ACT < contapezzi LAST
- * */
+ * - NON in produzione
+ * - contapezzi ACT < contapezzi LAST
+ * */
lgTrace("processAutoOdl: caso PZCOUNT_RESET");
if ((!isRunning || forceResetInRun) && pzCountResetted)
{
@@ -1937,9 +1932,8 @@ namespace IOB_WIN_FORM.Iob
{
lgInfo($"isRunning: {isRunning} | pzCountResetted: {pzCountResetted} | forceResetInRun: {forceResetInRun} | contapezziIOB: {contapezziIOB} | contapezziPLC: {contapezziPLC}");
}
- }
- else if (CHANGE_ODL_MODE == "DAILY")
- {
+ break;
+ case "DAILY":
// verifico inizio ODL, se è data di oggi NON eseguo...
if (currOdlStart().Date < adesso.Date)
{
@@ -1949,9 +1943,8 @@ namespace IOB_WIN_FORM.Iob
string autoOdlRes = utils.callUrl(urlFixDailyOdl);
fatto = autoOdlRes == "OK";
}
- }
- else if (CHANGE_ODL_MODE == "DAILY_CONF_PZ")
- {
+ break;
+ case "DAILY_CONF_PZ":
// verifico inizio ODL, se è data di oggi NON eseguo...
if (currOdlStart().Date < adesso.Date)
{
@@ -1961,106 +1954,221 @@ namespace IOB_WIN_FORM.Iob
string autoOdlRes = utils.callUrl(urlFixDailyOdlConfPzCount);
fatto = autoOdlRes == "OK";
}
- }
- else if (CHANGE_ODL_MODE == "TIME" || CHANGE_ODL_MODE == "SIMUL")
- {
+ break;
+ case "SIMUL":
+ case "TIME":
// imposto x prox controllo veto a 1 min
VetoProcessAutoOdl = adesso.AddMinutes(1);
- // carico i parametri di configurazione x reset ODL...
- string CHANGE_ODL_HOURS = getOptPar("CHANGE_ODL_HOURS");
- string CHANGE_ODL_IDLE_MIN = getOptPar("CHANGE_ODL_IDLE_MIN");
- if (!string.IsNullOrEmpty(CHANGE_ODL_HOURS) && !string.IsNullOrEmpty(CHANGE_ODL_IDLE_MIN))
+ // controllo parametri validi
+ if (IOBConfFull.Odl.OdlDurationHours > 0 && IOBConfFull.Odl.IdleStateMin >= 0)
{
- 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...
+ inizioOdl = DateTime.Now;
+ rawDataInizio = "";
+ if (!isMulti)
{
- // leggo da server inizio ODL... se non multi 1 solo...
- inizioOdl = DateTime.Now;
- rawDataInizio = "";
+ rawDataInizio = callUrl(urlInizioOdlIob, false);
+ DateTime.TryParse(rawDataInizio, out inizioOdl);
+ }
+ else
+ {
+ DateTime tmpData = DateTime.Now;
+ // prendo il + vecchio...
+ foreach (var item in elencoMulti)
+ {
+ fullUrl = $"{urlInizioOdlIob}|{item}";
+ rawDataInizio = callUrl(fullUrl, false);
+ DateTime.TryParse(rawDataInizio, out tmpData);
+ inizioOdl = (tmpData < inizioOdl) ? tmpData : inizioOdl;
+ }
+ }
+ // verifico se sia scaduto...
+ if (inizioOdl.AddHours(IOBConfFull.Odl.OdlDurationHours) < adesso)
+ {
+ string rawIdle = "";
+ int idlePeriod = 0;
if (!isMulti)
{
- rawDataInizio = callUrl(urlInizioOdlIob, false);
- DateTime.TryParse(rawDataInizio, out inizioOdl);
+ // controllo SE sono fermo (spento o in manuale) per il
+ // periodo minimo richiesto...
+ rawIdle = callUrl(urlIdleTime, false);
+ int.TryParse(rawIdle, out idlePeriod);
}
else
{
- DateTime tmpData = DateTime.Now;
- // prendo il + vecchio...
+ int tmpIdle = 0;
+ // prendo il + grande...
foreach (var item in elencoMulti)
{
- fullUrl = $"{urlInizioOdlIob}|{item}";
- rawDataInizio = callUrl(fullUrl, false);
- DateTime.TryParse(rawDataInizio, out tmpData);
- inizioOdl = (tmpData < inizioOdl) ? tmpData : inizioOdl;
+ fullUrl = $"{urlIdleTime}|{item}";
+ rawIdle = callUrl(fullUrl, false);
+ int.TryParse(rawIdle, out tmpIdle);
+ idlePeriod = tmpIdle > idlePeriod ? tmpIdle : idlePeriod;
}
}
- // verifico se sia scaduto...
- if (inizioOdl.AddHours(minOdlDurHours) < adesso)
+ if (idlePeriod >= IOBConfFull.Odl.IdleStateMin)
{
- string rawIdle = "";
- int idlePeriod = 0;
- if (!isMulti)
- {
- // controllo SE sono fermo (spento o in manuale) per il
- // periodo minimo richiesto...
- rawIdle = callUrl(urlIdleTime, false);
- int.TryParse(rawIdle, out idlePeriod);
- }
- else
- {
- int tmpIdle = 0;
- // prendo il + grande...
- foreach (var item in elencoMulti)
- {
- fullUrl = $"{urlIdleTime}|{item}";
- rawIdle = callUrl(fullUrl, false);
- int.TryParse(rawIdle, out tmpIdle);
- idlePeriod = tmpIdle > idlePeriod ? tmpIdle : idlePeriod;
- }
- }
- if (idlePeriod >= minPlcIdelMin)
- {
- callChangeODL = true;
- }
- }
- }
- // se NON fosse scaduto MA è simulato esegue controllo sul num pezzi da
- // fare, se sfora (RANDOM) > +(50...110)% --> cambia!
- if (!callChangeODL && CHANGE_ODL_MODE == "SIMUL")
- {
- var rawCount = callUrl(urlGetNumPzCurrODL, false);
- if (int.TryParse(rawCount, out var numPzReqOdl))
- {
- int limitQty = (numPzReqOdl * rndGen.Next(150, 210)) / 100;
- callChangeODL = contapezziPLC > limitQty;
+ callChangeODL = true;
}
}
}
- }
+ // se NON fosse scaduto MA è simulato esegue controllo sul num pezzi da
+ // fare, se sfora (RANDOM) > +(50...110)% --> cambia!
+ if (!callChangeODL && IOBConfFull.Odl.ChangeOdlMode == "SIMUL")
+ {
+ var rawCount = callUrl(urlGetNumPzCurrODL, false);
+ if (int.TryParse(rawCount, out var numPzReqOdl))
+ {
+ int limitQty = (numPzReqOdl * rndGen.Next(150, 210)) / 100;
+ callChangeODL = contapezziPLC > limitQty;
+ }
+ }
+ break;
+ default:
+ break;
+ }
- // vero processing...
- if (callChangeODL)
+#if false
+ if (IOBConfFull.Odl.ChangeOdlMode == "PZCOUNT_RESET")
+ {
+ /* verifico se sia "armato" il reset cambio ODL, DEVO essere :
+ * - NON in produzione
+ * - contapezzi ACT < contapezzi LAST
+ * */
+ lgTrace("processAutoOdl: caso PZCOUNT_RESET");
+ if ((!isRunning || forceResetInRun) && pzCountResetted)
{
- lgTrace("Chiamata: processAutoOdl --> forceSplitODL");
- fatto = forceSplitOdl();
- pzCountResetted = false;
- lgInfo("Esecuzione processAutoOdl completata --> pzCountResetted = false");
+ callChangeODL = true;
+ lgInfo("Attivato cambio ODL da PZCOUNT_RESET");
+ }
+ else
+ {
+ lgInfo($"isRunning: {isRunning} | pzCountResetted: {pzCountResetted} | forceResetInRun: {forceResetInRun} | contapezziIOB: {contapezziIOB} | contapezziPLC: {contapezziPLC}");
}
}
- else
+ else if (IOBConfFull.Odl.ChangeOdlMode == "DAILY")
{
- lgTrace("AUTO_CHANGE_ODL DISABILITATO");
+ // verifico inizio ODL, se è data di oggi NON eseguo...
+ if (currOdlStart().Date < adesso.Date)
+ {
+ // imposto x prox controllo veto a 10 min
+ VetoProcessAutoOdl = adesso.AddMinutes(10);
+ // chiamo stored x creare ODL giornalieri alla data...
+ string autoOdlRes = utils.callUrl(urlFixDailyOdl);
+ fatto = autoOdlRes == "OK";
+ }
+ }
+ else if (IOBConfFull.Odl.ChangeOdlMode == "DAILY_CONF_PZ")
+ {
+ // verifico inizio ODL, se è data di oggi NON eseguo...
+ if (currOdlStart().Date < adesso.Date)
+ {
+ // imposto x prox controllo veto a 10 min
+ VetoProcessAutoOdl = adesso.AddMinutes(10);
+ // chiamo stored x creare ODL giornalieri alla data + conferma pezzi...
+ string autoOdlRes = utils.callUrl(urlFixDailyOdlConfPzCount);
+ fatto = autoOdlRes == "OK";
+ }
+ }
+ else if (IOBConfFull.Odl.ChangeOdlMode == "TIME" || IOBConfFull.Odl.ChangeOdlMode == "SIMUL")
+ {
+ // imposto x prox controllo veto a 1 min
+ VetoProcessAutoOdl = adesso.AddMinutes(1);
+ // carico i parametri di configurazione x reset ODL...
+ string CHANGE_ODL_HOURS = getOptPar("CHANGE_ODL_HOURS");
+ 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...
+ inizioOdl = DateTime.Now;
+ rawDataInizio = "";
+ if (!isMulti)
+ {
+ rawDataInizio = callUrl(urlInizioOdlIob, false);
+ DateTime.TryParse(rawDataInizio, out inizioOdl);
+ }
+ else
+ {
+ DateTime tmpData = DateTime.Now;
+ // prendo il + vecchio...
+ foreach (var item in elencoMulti)
+ {
+ fullUrl = $"{urlInizioOdlIob}|{item}";
+ rawDataInizio = callUrl(fullUrl, false);
+ 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, false);
+ int.TryParse(rawIdle, out idlePeriod);
+ }
+ else
+ {
+ int tmpIdle = 0;
+ // prendo il + grande...
+ foreach (var item in elencoMulti)
+ {
+ fullUrl = $"{urlIdleTime}|{item}";
+ rawIdle = callUrl(fullUrl, false);
+ int.TryParse(rawIdle, out tmpIdle);
+ idlePeriod = tmpIdle > idlePeriod ? tmpIdle : idlePeriod;
+ }
+ }
+ if (idlePeriod >= minPlcIdelMin)
+ {
+ callChangeODL = true;
+ }
+ }
+ }
+ // se NON fosse scaduto MA è simulato esegue controllo sul num pezzi da
+ // fare, se sfora (RANDOM) > +(50...110)% --> cambia!
+ if (!callChangeODL && IOBConfFull.Odl.ChangeOdlMode == "SIMUL")
+ {
+ var rawCount = callUrl(urlGetNumPzCurrODL, false);
+ if (int.TryParse(rawCount, out var numPzReqOdl))
+ {
+ int limitQty = (numPzReqOdl * rndGen.Next(150, 210)) / 100;
+ callChangeODL = contapezziPLC > limitQty;
+ }
+ }
+ }
+ }
+#endif
+
+ // vero processing...
+ if (callChangeODL)
+ {
+ lgTrace("Chiamata: processAutoOdl --> forceSplitODL");
+ fatto = forceSplitOdl();
+ pzCountResetted = false;
+ lgInfo("Esecuzione processAutoOdl completata --> pzCountResetted = false");
}
}
}
+ else
+ {
+ lgTrace("processAutoOdl | AutoChangeOdl DISABILITATO");
+ }
// loggo se ok + processing post opzionali
if (fatto)
{
- lgInfo($"Effettuato processAutoOdl | mode: {CHANGE_ODL_MODE}");
+ lgInfo($"Effettuato processAutoOdl | mode: {IOBConfFull.Odl.ChangeOdlMode}");
processAutoOdlExtraStep();
}
}
@@ -3546,10 +3654,12 @@ namespace IOB_WIN_FORM.Iob
///
protected int B_previous = -1;
+#if false
///
/// Modalità cambio ODL
///
- protected string CHANGE_ODL_MODE = "";
+ protected string CHANGE_ODL_MODE = "";
+#endif
///
/// Cod grupo IOB x creazione PODL al volo
@@ -8264,12 +8374,14 @@ namespace IOB_WIN_FORM.Iob
{
bool.TryParse(getOptPar("ENABLE_SLOW_DATA"), out enableSlowData);
}
+#if false
// modalità change ODL
CHANGE_ODL_MODE = "TIME";
if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
{
CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
+ }
+#endif
if (!string.IsNullOrEmpty(getOptPar("ENABLE_MEM_REWRITE")))
{
bool.TryParse(getOptPar("ENABLE_MEM_REWRITE"), out ENABLE_MEM_REWRITE);
diff --git a/IOB-WIN-OPC-UA/DATA/CONF/TFT_RAMA_001.ini b/IOB-WIN-OPC-UA/DATA/CONF/TFT_RAMA_001.ini
index 5da8bfa5..e84e5afc 100644
--- a/IOB-WIN-OPC-UA/DATA/CONF/TFT_RAMA_001.ini
+++ b/IOB-WIN-OPC-UA/DATA/CONF/TFT_RAMA_001.ini
@@ -50,6 +50,9 @@ BLINK_FILT=0
AUTO_CHANGE_ODL=TRUE
;CHANGE_ODL_MODE=PZCOUNT_RESET
CHANGE_ODL_MODE=DAILY_CONF_PZ
+CHANGE_PZCOUNT_RESET=TRUE
+RESET_COUNT_PRE=100
+RESET_COUNT_POST=20
PZCOUNT_MODE=OPC
DISABLE_PZCOUNT=FALSE
ENABLE_SEND_PZC_BLOCK=TRUE
diff --git a/IOB-WIN-OPC-UA/IOB-WIN-OPC-UA.csproj b/IOB-WIN-OPC-UA/IOB-WIN-OPC-UA.csproj
index 4d0e12ee..d2a001d9 100644
--- a/IOB-WIN-OPC-UA/IOB-WIN-OPC-UA.csproj
+++ b/IOB-WIN-OPC-UA/IOB-WIN-OPC-UA.csproj
@@ -245,9 +245,15 @@
Always
-
-
-
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
Always
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUa.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUa.cs
index 4cc2da3e..545db797 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUa.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUa.cs
@@ -48,10 +48,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
int.TryParse(getOptPar("MAX_TRY_PING"), out maxTryPing);
}
-
-
-
-
// gestione data filtering...
if (!string.IsNullOrEmpty(getOptPar("ENABLE_DATA_FILTER")))
{
@@ -472,15 +468,30 @@ namespace IOB_WIN_OPC_UA.IobOpc
{
if (enablePzCountByApp)
{
- if (string.IsNullOrEmpty(opcUaParams.keyPartCount))
+ bool hasReset = false;
+ string currPzCount = "";
+ // modalità 1: verifico se ho condizioni di abilitazione del contapezzi
+ if (checkMultiCondition(opcUaParams.condCountEnabled) || opcUaParams.condCountEnabled.checkList.Count == 0)
{
- lgTrace("Gestione contapezzi: manca parametro per keyPartCount");
+ lgTrace($"processContapezzi | check 01 | opcUaParams.keyPartCount: {opcUaParams.keyPartCount}");
+ // cerco parametro contapezzi...
+ currPzCount = getDataItemValue(opcUaParams.keyPartCount);
}
else
{
+ lgTrace("processContapezzi | check 01 | manca parametro per keyPartCount");
+ }
+
+ // modalità 2: verifico conf di keyPartCount
+ if (string.IsNullOrEmpty(opcUaParams.keyPartCount))
+ {
+ lgTrace("processContapezzi | check 02 | check 022 | manca parametro per keyPartCount");
+ }
+ else
+ {
+ lgTrace($"processContapezzi | check 02 | opcUaParams.keyPartCount: {opcUaParams.keyPartCount}");
// cerco parametro contapezzi... gest alternativa se è un parametro SPECIALE
// (con "#")
- string currPzCount = "";
if (opcUaParams.keyPartCount.Contains(opcUaParams.kvDelim))
{
int iPos = opcUaParams.keyPartCount.IndexOf(opcUaParams.kvDelim);
@@ -495,38 +506,58 @@ namespace IOB_WIN_OPC_UA.IobOpc
currPzCount = getDataItemValue(opcUaParams.keyPartCount);
}
- // se ho un contapezzi... processo...
- if (!string.IsNullOrEmpty(currPzCount))
+ }
+
+ // se ho un contapezzi... processo...
+ if (!string.IsNullOrEmpty(currPzCount))
+ {
+ int newVal = -1;
+ bool fatto = Int32.TryParse(currPzCount, out newVal);
+
+ if (fatto)
{
- int newVal = -1;
- bool fatto = Int32.TryParse(currPzCount, out newVal);
-
- if (fatto)
+ // gestione decremento contapezzi: viene "messo via" solo SE c'è un
+ // effettivo decremento contapezzi...
+ if (newVal < contapezziPLC)
{
- // gestione decremento contapezzi: viene "messo via" solo SE c'è un
- // effettivo decremento contapezzi...
- if (newVal < contapezziPLC)
- {
- pzCountResetted = true;
- // incremento contatore richiesta
- countKeyRichiesta = countKeyRichiesta + 1;
- // log
- lgInfo("Contapezzi resettato (PLC) --> pzCountResetted = true");
- }
+ hasReset = true;
+ // incremento contatore richiesta
+ countKeyRichiesta = countKeyRichiesta + 1;
+ // log
+ lgInfo("Rilevato Reset Contapezzi PLC 01");
+ }
- // salvo nuovo valore contapezziPLC
- contapezziPLC = newVal > -1 ? newVal : contapezziPLC;
- }
- else
- {
- lgError($"Errore in decodifica valore contapezzi, valore rilevato: {currPzCount}");
- }
+ // salvo nuovo valore contapezziPLC
+ contapezziPLC = newVal > -1 ? newVal : contapezziPLC;
}
else
{
- lgError("Errore in decodifica valore contapezzi, valore vuoto!");
+ lgError($"Errore in decodifica valore contapezzi, valore rilevato: {currPzCount}");
}
}
+ else
+ {
+ lgError($"Errore in decodifica valore contapezzi da {opcUaParams.keyPartCount} | valore vuoto!");
+ }
+
+
+ // controllo comunque, se è ZERO il contapezzi, e sul server è maggiore il
+ // valore x ODL e NON abilitato il trigger reset --> abilito trigger...
+ if (!pzCountResetted && contapezziPLC <= IOBConfFull.Odl.ResetCountMaxPost && contapezziIOB >= IOBConfFull.Odl.ResetCountMinPre)
+ {
+ hasReset = true;
+ // incremento contatore richiesta
+ countKeyRichiesta = countKeyRichiesta + 1;
+ // log
+ lgInfo($"Rilevato Reset Contapezzi PLC 02 | PLC = {contapezziPLC} <= {IOBConfFull.Odl.ResetCountMaxPost} | IOB = {contapezziIOB} >= {IOBConfFull.Odl.ResetCountMinPre}) | pzCountResetted = true");
+ }
+
+ // 2025.03.05 calcolo condizione contapezzi con NUOVO CONF
+ if (IOBConfFull.Odl.ChangeOnResetCount)
+ {
+ pzCountResetted = hasReset;
+ lgInfo("Registrato trigger pzCountResetted");
+ }
}
}
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaCMS.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaCMS.cs
index 05c5a427..366b4189 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaCMS.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaCMS.cs
@@ -23,13 +23,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
/// Configurazione (v 4.x)
public OpcUaCMS(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
-
- // impostazioni specifiche OpcUA SCM
+ // impostazioni specifiche OpcUA CMS/SCM
+ lgInfo("Start adapter OpcUaCMS");
}
#endregion Public Constructors
@@ -46,6 +41,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
return base.executeTasks(task2exe);
}
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -92,7 +88,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
- if (CHANGE_ODL_MODE == "PZCOUNT_RESET")
+ if (IOBConfFull.Odl.ChangeOdlMode == "PZCOUNT_RESET")
{
// controllo comunque, se è ZERO il contapezzi, e sul server è maggiore il
// valore x ODL e NON abilitato il trigger reset --> abilito trigger...
@@ -103,10 +99,11 @@ namespace IOB_WIN_OPC_UA.IobOpc
countKeyRichiesta = countKeyRichiesta + 1;
// log
lgInfo("Contapezzi resettato (PLC==0 e IOB>PLC) --> pzCountResetted = true");
- }
+ }
}
}
}
+#endif
///
/// Effettua reset del contapezzi, NON POSSIBILE in questa versione
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwon.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwon.cs
index 02328008..8cd30820 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwon.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwon.cs
@@ -23,11 +23,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
/// Configurazione (v 4.x)
public OpcUaEwon(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
+ lgInfo("Start adapter OpcUaEwon");
sendKeyRichiesta = true;
}
@@ -45,6 +41,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
return base.executeTasks(task2exe);
}
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -105,7 +102,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
}
- }
+ }
+#endif
///
/// Effettua reset del contapezzi, NON POSSIBILE in questa versione
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonAdige.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonAdige.cs
index 7d7477b1..e6a4f870 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonAdige.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonAdige.cs
@@ -22,12 +22,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaEwonAdige(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init Ewon versione Adige/BLM");
-
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
sendKeyRichiesta = true;
}
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonBLM.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonBLM.cs
index 51f50499..59e37952 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonBLM.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonBLM.cs
@@ -20,12 +20,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaEwonBLM(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init Ewon versione BLM (Mecart)");
-
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
sendKeyRichiesta = true;
}
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonMecolpress.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonMecolpress.cs
index 26ff9056..88f782c8 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonMecolpress.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonMecolpress.cs
@@ -22,12 +22,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaEwonMecolpress(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init Ewon versione Mecolpress (STEL)");
-
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
sendKeyRichiesta = true;
}
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonMonti.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonMonti.cs
index 63270e0e..0ca973b5 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonMonti.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaEwonMonti.cs
@@ -23,11 +23,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaEwonMonti(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init Ewon versione Monti (Tenditalia)");
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
// impostazioni specifiche Ewon di Monti
forceResetInRun = true;
sendKeyRichiesta = true;
@@ -37,6 +32,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
#region Public Methods
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -97,7 +93,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
}
- }
+ }
+#endif
#endregion Public Methods
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaImas.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaImas.cs
index e4ee2740..03f32d90 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaImas.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaImas.cs
@@ -24,11 +24,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaImas(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init OpcUa IMAS");
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
sendKeyRichiesta = true;
}
@@ -46,6 +41,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
return base.executeTasks(task2exe);
}
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -106,7 +102,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
}
- }
+ }
+#endif
///
/// Effettua reset del contapezzi, NON POSSIBILE in questa versione
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaKpw.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaKpw.cs
index b367d4a8..09493a44 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaKpw.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaKpw.cs
@@ -24,11 +24,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaKpw(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init OpcUa Kepware");
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
// gestione restart OpcUa client...
if (!string.IsNullOrEmpty(getOptPar("ENABLE_CLI_RESTART")))
{
@@ -48,6 +43,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -108,7 +104,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
}
- }
+ }
+#endif
///
/// Effettua reset del contapezzi, NON POSSIBILE in questa versione
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaKpwRama.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaKpwRama.cs
index 0e1ac77e..eea60b6f 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaKpwRama.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaKpwRama.cs
@@ -27,11 +27,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaKpwRama(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init OpcUa Kepware x RAMA");
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
// gestione restart OpcUa client...
if (!string.IsNullOrEmpty(getOptPar("ENABLE_CLI_RESTART")))
{
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaMBH.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaMBH.cs
index f3b0b27d..0e6bb48b 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaMBH.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaMBH.cs
@@ -24,11 +24,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaMBH(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init OpcUa MBH");
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
// gestione restart OpcUa client...
if (!string.IsNullOrEmpty(getOptPar("ENABLE_CLI_RESTART")))
{
@@ -56,6 +51,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
return base.executeTasks(task2exe);
}
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -116,7 +112,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
}
- }
+ }
+#endif
///
/// Effettua reset del contapezzi, NON POSSIBILE in questa versione
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaMBHCimolai.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaMBHCimolai.cs
index b67f7758..e02eb0b1 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaMBHCimolai.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaMBHCimolai.cs
@@ -27,11 +27,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
lgInfo("Init OpcUa MBH versione Cimolai (Baglietto)");
// inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- lgInfo($"CHANGE_ODL_MODE: {CHANGE_ODL_MODE}");
- }
if (!string.IsNullOrEmpty(getOptPar("VETO_SEND_SNAPSHOT")))
{
string strVETO_SEND_SNAPSHOT = getOptPar("VETO_SEND_SNAPSHOT");
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs
index c3604dd4..88be07ad 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaOmron.cs
@@ -23,12 +23,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
/// Configurazione (v 4.x)
public OpcUaOmron(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
sendKeyRichiesta = true;
+ lgInfo("Avvio OpcUaOmron");
}
#endregion Public Constructors
@@ -45,6 +41,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
return base.executeTasks(task2exe);
}
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -105,7 +102,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
}
- }
+ }
+#endif
///
/// Effettua reset del contapezzi, NON POSSIBILE in questa versione
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaOmronIcoel.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaOmronIcoel.cs
index 050d75df..1ce90fa3 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaOmronIcoel.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaOmronIcoel.cs
@@ -213,10 +213,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaOmronIcoel(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
// inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
sendKeyRichiesta = true;
doByteRead = true;
lgInfo($"Avviato IobOpcUaOmronIcoel | encodeReadData: {doByteRead}");
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaSiemens.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaSiemens.cs
index 71213c58..24ab10d0 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaSiemens.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaSiemens.cs
@@ -28,11 +28,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaSiemens(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init OpcUa Siemens");
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
// gestione restart OpcUa client...
if (!string.IsNullOrEmpty(getOptPar("ENABLE_CLI_RESTART")))
{
@@ -114,6 +109,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
return base.executeTasks(task2exe);
}
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -188,7 +184,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
}
- }
+ }
+#endif
///
/// Effettua reset del contapezzi, NON POSSIBILE in questa versione
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaSiemensOMP.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaSiemensOMP.cs
index a764be2a..245b4b97 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaSiemensOMP.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaSiemensOMP.cs
@@ -21,14 +21,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
/// Configurazione (v 4.x)
public OpcUaSiemensOMP(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
- lgInfo("Init OpcUa Siemens versione OMP (Cereria Finassi)");
-
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
sendKeyRichiesta = true;
+ lgInfo("Init OpcUa Siemens versione OMP (Cereria Finassi)");
}
#endregion Public Constructors
diff --git a/IOB-WIN-OPC-UA/IobOpc/OpcUaUlma.cs b/IOB-WIN-OPC-UA/IobOpc/OpcUaUlma.cs
index a11f1305..61986ea3 100644
--- a/IOB-WIN-OPC-UA/IobOpc/OpcUaUlma.cs
+++ b/IOB-WIN-OPC-UA/IobOpc/OpcUaUlma.cs
@@ -24,11 +24,6 @@ namespace IOB_WIN_OPC_UA.IobOpc
public OpcUaUlma(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
lgInfo("Init OpcUa ULMA");
- // inizializzo classe base...
- if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
- {
- CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
- }
sendKeyRichiesta = true;
}
@@ -46,6 +41,7 @@ namespace IOB_WIN_OPC_UA.IobOpc
return base.executeTasks(task2exe);
}
+#if false
///
/// Effettua vero processing contapezzi
///
@@ -106,7 +102,8 @@ namespace IOB_WIN_OPC_UA.IobOpc
}
}
}
- }
+ }
+#endif
///
/// Effettua reset del contapezzi, NON POSSIBILE in questa versione
diff --git a/IOB-WIN-OPC-UA/postBuildTgt.bat b/IOB-WIN-OPC-UA/postBuildTgt.bat
index 4b94843d..ec8d4bd3 100644
--- a/IOB-WIN-OPC-UA/postBuildTgt.bat
+++ b/IOB-WIN-OPC-UA/postBuildTgt.bat
@@ -43,8 +43,9 @@ REM IOBVPN4MACHINE
REM ROBOCOPY %2 \\10.51.90.5\Steamware\IOB-WIN-OPC-UA-DEB /MIR
REM ROBOCOPY %2 \\10.51.90.5\Steamware\IOB-WIN-OPC-UA-DEB /MIR /log:RobocopyTransfer.log
REM ROBOCOPY %2 Z:\IOB-WIN-OPC-UA-DEB /MIR
-ROBOCOPY %2 \\10.51.90.9\Steamware\IOB-WIN-OPC-UA-DEB /MIR
+REM ROBOCOPY %2 \\10.51.90.9\Steamware\IOB-WIN-OPC-UA-DEB /MIR
REM ROBOCOPY %2 \\10.51.90.10\Steamware\IOB-WIN-OPC-UA-DEB /MIR
+ROBOCOPY %2 \\10.51.90.15\Steamware\IOB-WIN-OPC-UA-DEB /MIR
goto END