Update SIEMENS xComeca

- controllo DynData validi
- controllo update grafico su thread indipendente in lettura memoria
- refresh
This commit is contained in:
Samuele Locatelli
2026-01-20 11:19:11 +01:00
parent 85b51a47fe
commit 0fe998a908
11 changed files with 204 additions and 464 deletions
-39
View File
@@ -424,26 +424,6 @@ namespace IOB_UT_NEXT.Iob
await Task.Delay(rnd.Next(urlRandWait / 10, urlRandWait));
}
return answ;
#if false
// Chiamata ASINCRONA
if (doAsync)
{
//Task<string> resp = utils.callUrlAsync(URL);
//answ = resp.Result;
answ = utils.callUrlAsync(URL);
}
// chiamata SOLO NORMALE SINCRONA...
else
{
answ = utils.callUrl(URL);
}
if (urlRandWait > 0)
{
Thread.Sleep(rnd.Next(urlRandWait / 10, urlRandWait));
}
return answ;
#endif
}
/// <summary>
@@ -471,25 +451,6 @@ namespace IOB_UT_NEXT.Iob
await Task.Delay(rnd.Next(urlRandWait / 10, urlRandWait));
}
return answ;
#if false
// Chiamata ASINCRONA
if (doAsync)
{
answ = utils.callUrlAsync(URL, payload);
}
// chiamata SOLO NORMALE SINCRONA...
else
{
answ = utils.callUrl(URL, payload);
}
if (urlRandWait > 0)
{
Thread.Sleep(rnd.Next(urlRandWait / 10, urlRandWait));
}
return answ;
#endif
}
/// <summary>
+10 -6
View File
@@ -132,13 +132,17 @@ namespace IOB_WIN_FORM
}
set
{
_commPlcActive = value;
// se true --> comunica/verde, altrimenti grigio
lblCNC.ForeColor = value ? Color.SeaGreen : Color.Black;
this.UIThread(delegate
if (_commPlcActive != value)
{
statusStrip1.Refresh();
});
_commPlcActive = value;
// se true --> comunica/verde, altrimenti grigio
this.UIThread(delegate
{
lblCNC.ForeColor = value ? Color.SeaGreen : Color.Black;
//statusStrip1.Refresh();
statusStrip1.Invalidate();
});
}
}
}
+29 -171
View File
@@ -1139,6 +1139,31 @@ namespace IOB_WIN_FORM.Iob
#region Protected Methods
/// <summary>
/// Verifico i dynData x validità:
/// - siano almeno 1
/// - NON siano tutti identici
/// </summary>
/// <param name="currDynData"></param>
/// <returns></returns>
protected bool checkValidDynData(Dictionary<string, string> currDynData)
{
bool answ = false;
// conto num valori
int numVal = currDynData.Count;
bool dataPresent = numVal > 0;
if (dataPresent)
{
// prendo il primo valore..
string firstVal = currDynData.FirstOrDefault().Value;
// conto val uguali al primo
int numEq = currDynData.Where(x => x.Value==firstVal).Count();
// se solo 1 o almeno 1 è diverso è ok
answ = numVal == 1 || (numVal > numEq);
}
return answ;
}
/// <summary>
/// Decodifica file MAP (caso <paramref name="ByteNum" />.bit)
/// </summary>
@@ -3605,12 +3630,14 @@ namespace IOB_WIN_FORM.Iob
Funzione = funz,
Period = periodo,
UM = item.Value.unit,
DTStart = DateTime.Now.AddHours(-1),
// imposto a NOW per forzare accumulo dati prima di inviare troppo presto (es COMECA Pizzaferri valori 0)
DTStart = DateTime.Now,
//DTStart = DateTime.Now.AddHours(-1),
dataArray = new List<double>()
};
TSVC_Data.Add(item.Key, currConf);
}
// documento...
// log avvio + setup lastVal...
foreach (var item in TSVC_Data)
{
lgTrace($"TSVC: {item.Key} | periodo: {item.Value.Period} | funz: {item.Value.Funzione}");
@@ -4703,95 +4730,6 @@ namespace IOB_WIN_FORM.Iob
/// </summary>
public bool CheckIobEnabled()
{
#if false
bool answ = false;
// controllo se ho veto al check...
if (dtVetoCheckIOB < DateTime.Now)
{
if (DemoOut)
{
answ = (QueueIN.Count + QueueFLog.Count >= nMaxSend);
IobOnline = answ;
}
else
{
try
{
// chiamo URL, se restituisce "OK" è enabled!
string callResp = await callUrl(urlIobEnabled, true);
answ = (callResp == "OK");
// attesa casuale se necessario
var rand = new Random();
// primi 2 test
int maxTry = 2;
while (maxTry > 0 && !answ)
{
Thread.Sleep(rand.Next(250, 500));
callResp = await callUrl(urlIobEnabled, true);
answ = (callResp == "OK");
maxTry--;
}
// se NON OK riprovo ANCORA 1 volta...
if (!answ)
{
resetWebClients();
Thread.Sleep(rand.Next(250, 1000));
callResp = await callUrl(urlIobEnabled, false);
answ = (callResp == "OK");
}
// altri 2
maxTry = 2;
while (maxTry > 0 && !answ)
{
Thread.Sleep(rand.Next(250, 500));
callResp = await callUrl(urlIobEnabled, false);
answ = (callResp == "OK");
maxTry--;
}
// salvo status...
IobOnline = answ;
// se online imposto veto check a 5 x tempo reinvio...
if (answ)
{
lastIobOnline = DateTime.Now;
}
dtVetoCheckIOB = DateTime.Now.AddMilliseconds(baseUtils.nextPauseSendMSec * 5);
}
catch
{ }
}
// verifico SE è variato stato online/offline...
if (IobOnline != answ)
{
// se ORA sono online riporto...
if (answ)
{
lgInfo("IOB ONLINE for server MP/IO");
}
else
{
lgInfo("IOB OFFLINE for server MP/IO");
}
}
// fix colore
if (answ)
{
parentForm.commSrvActive = 2;
}
else
{
parentForm.commSrvActive = 1;
}
}
else
{
// altrimenti passo ultimo valore noto
answ = IobOnline;
}
return answ;
#endif
// 1. Controllo Veto (Sincrono)
if (dtVetoCheckIOB >= DateTime.Now)
return IobOnline;
@@ -4899,86 +4837,6 @@ namespace IOB_WIN_FORM.Iob
/// <returns></returns>
private async Task<IPStatus> GetPingStatusAsync(int maxAttempts)
{
#if false
IPStatus answ = IPStatus.Unknown;
// se disabilitato salto...
if (IOBConfFull.MapoMes.DisabPing)
{
answ = IPStatus.Success;
}
else
{
IPAddress address;
PingReply reply;
var rand = new Random();
int pingTOut = 500;
using (Ping pingSender = new Ping())
{
address = IPAddress.Loopback;
int numRetry = 1;
string ipAddr = IOBConfFull.MapoMes.IpAddr.Replace($"{IOBConfFull.MapoMes.Transport}://", "");
// fix se fosse ip + porta...
if (ipAddr.IndexOf(":") >= 0)
{
ipAddr = ipAddr.Substring(0, ipAddr.IndexOf(":"));
}
IPAddress.TryParse(ipAddr, out address);
// se null --> provo DNS...
if (address == null)
{
var rawAddresses = Dns.GetHostAddresses(ipAddr);
if (rawAddresses.Length > 0)
{
address = rawAddresses[0];
}
}
try
{
// se != null --> uso address...
if (address != null)
{
pingTOut = rand.Next(200, 400);
reply = pingSender.Send(address, pingTOut);
}
else
{
pingTOut = rand.Next(300, 600);
//reply = pingSender.Send(cIobConf.cncIpAddr, pingTOut);
reply = pingSender.Send(IPAddress.Loopback, pingTOut);
lgError($"ping to loopback addres per mancanza address server");
}
}
catch (Exception exc)
{
pingTOut = rand.Next(100, 200);
reply = pingSender.Send(IPAddress.Loopback, pingTOut);
lgError($"ping to loopback addres per eccezione:{Environment.NewLine}{exc}");
}
// se ho timeout riprovo...
while (reply.Status != IPStatus.Success && numRetry < maxRetry)
{
await Task.Delay(rand.Next(50, 200));
//Thread.Sleep(rand.Next(50, 200));
pingTOut = pingServerMsTimeout * numRetry / 2;
reply = pingSender.Send(address, pingTOut);
numRetry++;
if (reply.Status == IPStatus.Success)
{
lgInfo("Server PING OK!");
break;
}
else
{
lgInfo($"Server Ping KO | reply: {reply.Status} --> retry | TimeOut: {pingTOut}");
}
}
}
answ = reply.Status;
}
return answ;
#endif
// 1. Check disabilitazione
if (IOBConfFull.MapoMes.DisabPing) return IPStatus.Success;
+108 -199
View File
@@ -704,116 +704,6 @@ namespace IOB_WIN_FORM.Iob
}
}
#if false
public async Task<bool> checkServerAlive()
{
bool answ = false;
// controllo se ho un VETO all'invio...
if (dtVetoPing < DateTime.Now)
{
if (DemoOut)
{
answ = true;
}
else
{
IPStatus pingStatus = GetPingStatus();
// se passa il ping faccio il resto...
if (pingStatus == IPStatus.Success)
{
string callResp = "";
try
{
// chiamo URL, se restituisce "OK" è alive! provo con chiamata http
callResp = await callUrl(urlAlive, false);
answ = (callResp == "OK");
}
catch (Exception exc)
{
lgError($"Errore in checkServerAlive:{Environment.NewLine}{exc}");
}
// attesa casuale se necessario
var rand = new Random();
// primi 3 test
int maxTry = 3;
while (maxTry > 0 && !answ)
{
try
{
Thread.Sleep(rand.Next(150, 500));
callResp = await callUrl(urlAlive, false);
answ = (callResp == "OK");
maxTry--;
}
catch
{ }
}
// se NON OK riprovo ANCORA 1 volta...
if (!answ)
{
resetWebClients();
Thread.Sleep(rand.Next(500, 1000));
callResp = await callUrl(urlAlive, false);
answ = (callResp == "OK");
}
// altri 3
maxTry = 3;
while (maxTry > 0 && !answ)
{
try
{
Thread.Sleep(rand.Next(150, 500));
callResp = await callUrl(urlAlive, false);
answ = (callResp == "OK");
maxTry--;
}
catch
{ }
}
// verifico SE è variato stato online/offline...
if (MPOnline != answ)
{
// se ORA sono online riporto...
if (answ)
{
lgInfo("SERVER ONLINE in checkServerAlive");
parentForm.commSrvActive = 1;
dtVetoPing = DateTime.Now.AddMilliseconds(baseUtils.nextPauseSendMSec * 5);
}
else
{
lgError("SERVER OFFLINE in checkServerAlive");
parentForm.commSrvActive = 0;
}
// salvo nuovo status...
MPOnline = answ;
}
else
{
// allungo periodo controllo...
dtVetoPing = DateTime.Now.AddMilliseconds(baseUtils.nextPauseSendMSec * 20);
}
}
else
{
lgError($"SERVER NOT RESPONDING (PING at {IOBConfFull.MapoMes.IpAddr})");
MPOnline = false;
// imposto veto a 10 volte reinvio dati standard...
dtVetoPing = DateTime.Now.AddMilliseconds(baseUtils.nextPauseSendMSec * 10);
utils.dtVetoSend = dtVetoPing;
}
}
}
else
{
// altrimenti passo ultimo valore noto...
answ = MPOnline;
}
return answ;
}
#endif
/// <summary>
/// Update visualizzaizone BIT in ingresso <paramref name="currDispData">Parametri da
/// aggiornare x display in form</paramref>
@@ -2374,118 +2264,135 @@ namespace IOB_WIN_FORM.Iob
if (connectionOk)
{
currDynData = getDynData();
bool hasDynDataVal = currDynData.Count > 0;
var currAlarmData = getAlarmData();
lgTrace($"currDynData: {currDynData.Count} rec | currAlarmData: {currAlarmData.Count} rec");
// se ho allarmi
if (currAlarmData != null && currAlarmData.Count > 0)
if (!hasDynDataVal)
{
foreach (var item in currAlarmData)
lgInfo($"Errore processDynData.getDynData: nessun valori DynData ricevuto");
}
else
{
// verifico DynData siano validi: se tutti uguali NON li considero validi...
bool isValidSet = checkValidDynData(currDynData);
// se non valido loggo e NON proseguo..
if (!isValidSet)
{
if (!currDynData.ContainsKey(item.Key))
{
// aggiungo!
currDynData.Add(item.Key, item.Value);
}
lgInfo($"Errore processDynData.getDynData: Valori ricevuti NON validi | # dynData{currDynData.Count}");
}
}
// verifico parametro sintesi... che ricalcolo ogni volta
if (!currDynData.ContainsKey("DYNDATA") && hasDynDataVal)
{
currDynData.Add("DYNDATA", $"{currDynData.Count}xVal");
}
// verifico se DynData sia abilitato IN GENERALE
if (!IOBConfFull.FluxLog.DisDynData)
{
try
else
{
string sVal = "";
// se richiesto send diretto...
if (IOBConfFull.FluxLog.ForceDynData)
var currAlarmData = getAlarmData();
lgTrace($"currDynData: {currDynData.Count} | currAlarmData: {currAlarmData.Count}");
// se ho allarmi
if (currAlarmData != null && currAlarmData.Count > 0)
{
// per ogni valore del dizionario mostro ed accodo!
foreach (var item in currDynData)
foreach (var item in currAlarmData)
{
// controllo se vietato dynData
if (IOBConfFull.FluxLog.SendDynDataRec || item.Key != "DYNDATA")
if (!currDynData.ContainsKey(item.Key))
{
// verifico NON sia un ND...
if (item.Key == "ND" || string.IsNullOrEmpty(item.Key))
{
// log anomalia...
lgTrace($"Errore in processDynData.01: item.key risulta ND! | item.key: {item.Key} | item.Value: {item.Value}");
}
else
{
sVal = string.Format("[DYNDATA]{0}|{1}", item.Key, item.Value);
// chiamo accodamento...
bool sent = accodaFLog(item.Key, sVal, qEncodeFLog(item.Key, item.Value));
if (sent)
{
// traccio valore DynData x analisi
trackDynData(item.Key, item.Value);
}
}
// aggiungo!
currDynData.Add(item.Key, item.Value);
}
}
}
// altrimenti verifico SE sia cambiato il valore dei DynData...
else if (hasDynDataVal && (lastDynDataCtrlVal == null || lastDynDataCtrlVal != currDynData["DYNDATA"]))
// verifico parametro sintesi... che ricalcolo ogni volta
if (!currDynData.ContainsKey("DYNDATA") && hasDynDataVal)
{
// salvo!
lastDynDataCtrlVal = currDynData["DYNDATA"];
// per ogni valore del dizionario mostro ed accodo!
foreach (var item in currDynData)
currDynData.Add("DYNDATA", $"{currDynData.Count}xVal");
}
// verifico se DynData sia abilitato IN GENERALE
if (!IOBConfFull.FluxLog.DisDynData)
{
try
{
// controllo se vietato dynData
if (IOBConfFull.FluxLog.SendDynDataRec || item.Key != "DYNDATA")
string sVal = "";
// se richiesto send diretto...
if (IOBConfFull.FluxLog.ForceDynData)
{
// verifico NON sia un ND...
if (item.Key == "ND" || string.IsNullOrEmpty(item.Key))
// per ogni valore del dizionario mostro ed accodo!
foreach (var item in currDynData)
{
// log anomalia...
lgTrace($"Errore in processDynData.02: item.key risulta ND! | item.key: {item.Key} | item.Value: {item.Value}");
}
else
{
sVal = string.Format("[DYNDATA]{0}|{1}", item.Key, item.Value);
// chiamo accodamento...
bool sent = accodaFLog(item.Key, sVal, qEncodeFLog(item.Key, item.Value));
if (sent)
// controllo se vietato dynData
if (IOBConfFull.FluxLog.SendDynDataRec || item.Key != "DYNDATA")
{
// traccio valore DynData x analisi
trackDynData(item.Key, item.Value);
// verifico NON sia un ND...
if (item.Key == "ND" || string.IsNullOrEmpty(item.Key))
{
// log anomalia...
lgTrace($"Errore in processDynData.01: item.key risulta ND! | item.key: {item.Key} | item.Value: {item.Value}");
}
else
{
sVal = string.Format("[DYNDATA]{0}|{1}", item.Key, item.Value);
// chiamo accodamento...
bool sent = accodaFLog(item.Key, sVal, qEncodeFLog(item.Key, item.Value));
if (sent)
{
// traccio valore DynData x analisi
trackDynData(item.Key, item.Value);
}
}
}
}
}
// altrimenti verifico SE sia cambiato il valore dei DynData...
else if (hasDynDataVal && (lastDynDataCtrlVal == null || lastDynDataCtrlVal != currDynData["DYNDATA"]))
{
// salvo!
lastDynDataCtrlVal = currDynData["DYNDATA"];
// per ogni valore del dizionario mostro ed accodo!
foreach (var item in currDynData)
{
// controllo se vietato dynData
if (IOBConfFull.FluxLog.SendDynDataRec || item.Key != "DYNDATA")
{
// verifico NON sia un ND...
if (item.Key == "ND" || string.IsNullOrEmpty(item.Key))
{
// log anomalia...
lgTrace($"Errore in processDynData.02: item.key risulta ND! | item.key: {item.Key} | item.Value: {item.Value}");
}
else
{
sVal = string.Format("[DYNDATA]{0}|{1}", item.Key, item.Value);
// chiamo accodamento...
bool sent = accodaFLog(item.Key, sVal, qEncodeFLog(item.Key, item.Value));
if (sent)
{
// traccio valore DynData x analisi
trackDynData(item.Key, item.Value);
}
}
}
}
}
// salvo array...
lastDynData = currDynData;
}
catch (Exception exc)
{
lgError(exc, "Eccezione in processDynData");
}
}
// salvo array...
lastDynData = currDynData;
}
catch (Exception exc)
{
lgError(exc, "Eccezione in processDynData");
}
}
// ora popolo prod data dai dynData...
foreach (var item in currDynData)
{
// se configurato x scrivere valori in WRITE PROD
if (IOBConfFull.FluxLog.CopyDyn2MemWrite)
{
// se presente nelle memorie write/read --> metto in curr data...
if (memMap != null && memMap.mMapWrite.ContainsKey(item.Key) && !string.IsNullOrEmpty(item.Value))
// ora popolo prod data dai dynData...
foreach (var item in currDynData)
{
upsertKey(item.Key, item.Value);
// se configurato x scrivere valori in WRITE PROD
if (IOBConfFull.FluxLog.CopyDyn2MemWrite)
{
// se presente nelle memorie write/read --> metto in curr data...
if (memMap != null && memMap.mMapWrite.ContainsKey(item.Key) && !string.IsNullOrEmpty(item.Value))
{
upsertKey(item.Key, item.Value);
}
}
// verifico area read x i lastProd...
if (memMap != null && memMap.mMapRead.ContainsKey(item.Key) && !string.IsNullOrEmpty(item.Value))
{
upsertKeyLP(item.Key, item.Value);
}
}
}
// verifico area read x i lastProd...
if (memMap != null && memMap.mMapRead.ContainsKey(item.Key) && !string.IsNullOrEmpty(item.Value))
{
upsertKeyLP(item.Key, item.Value);
}
}
}
else
@@ -3406,7 +3313,9 @@ namespace IOB_WIN_FORM.Iob
// ora verifico scadenza...
if (TSVC_Data[VCName].DTStart.AddSeconds(TSVC_Data[VCName].Period) < dtLimit)
{
answ = true;
// 2026.01.20: solo se ho almeno 3 valori altrimenti rischio zeri...
answ = TSVC_Data[VCName].dataArray.Count > 2;
//answ = true;
}
lgTrace($"stackVal_TSVC | {VCName} | {VCVal} | scaduta: {answ}");
}
+31 -26
View File
@@ -14,6 +14,7 @@ using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
@@ -751,21 +752,6 @@ namespace IOB_WIN_FORM
this.LayoutMdi(MdiLayout.TileHorizontal);
}
#if false
private void AutoUpdater_ApplicationExitEvent()
{
displayTaskAndLog("Chiusura Adapters");
Thread.Sleep(100);
// chiudo tutto
closeAllChild();
displayTaskAndLog("Chiusura Applicazione");
// attendo 1 sec...
Thread.Sleep(1000);
// ESCO!
Application.Exit();
}
#endif
/// <summary>
/// Effettua verifiche varie comunicazione verso PLC e verso server
/// </summary>
@@ -921,16 +907,22 @@ namespace IOB_WIN_FORM
{
try
{
displayTaskAndLog("Attesa chiusura Adapters");
Thread.Sleep(100);
// fermo gli IOB
closeAllChild();
Thread.Sleep(100);
// download da su server di TUTTI i file CONF delle IOB
doConfDownload();
// riavvio gli IOB
Thread.Sleep(100);
startAdapters();
// PONTE SYNC/ASYNC: Ora sw.Stop() aspetterà la fine reale dell'operazione
Task.Run(async () =>
{
displayTaskAndLog("Attesa chiusura Adapters");
await Task.Delay(100);
// fermo gli IOB
closeAllChild();
await Task.Delay(100);
// download da su server di TUTTI i file CONF delle IOB
doConfDownload();
// riavvio gli IOB
await Task.Delay(100);
startAdapters();
})
.GetAwaiter()
.GetResult();
}
catch (Exception exc)
{
@@ -1109,7 +1101,20 @@ namespace IOB_WIN_FORM
{
// chiudo
closeAllChild();
Thread.Sleep(1000);
try
{
// PONTE SYNC/ASYNC: Ora sw.Stop() aspetterà la fine reale dell'operazione
Task.Run(async () =>
{
await Task.Delay(1000);
})
.GetAwaiter()
.GetResult();
}
catch (Exception ex)
{
lgError($"Errore in restartALLAdaptersToolStripMenuItem_Click{Environment.NewLine}{ex.Message}");
}
// riapro
startAdapters();
}
+11 -14
View File
@@ -83,26 +83,23 @@ namespace IOB_WIN_OPC_UA.IobOpc
bool checkPing = !opcUaParams.pingAsPowerOn;
string currRun = "N.A.";
#if false
if (!checkPing)
{
checkPing = (testPingMachine == IPStatus.Success);
}
#endif
// test ping come base + volte prima di dire che non risponde...
int currTryPing = maxTryPing;
while (currTryPing > 0 && !checkPing)
{
// Esegui il test una volta sola per iterazione
checkPing = (testPingMachine == IPStatus.Success);
if (!checkPing)
{
checkPing = (testPingMachine == IPStatus.Success);
}
currTryPing--;
// se ping KO --> aspetto prima di ripetere test
if (!checkPing)
{
Random rand = new Random();
Thread.Sleep(rand.Next(pingServerMsTimeout * 2));
currTryPing--;
if (currTryPing > 0)
{
// Aumenta leggermente il tempo di attesa minimo.
// Sotto i 15-30ms, Windows non è preciso e consuma molta CPU per il timer hardware.
int waitTime = new Random().Next(pingServerMsTimeout, pingServerMsTimeout * 2);
Thread.Sleep(waitTime);
}
}
}
// bit 0 (poweron) imposto a 1 SE pingo + PowerOn=="ON"...
+2 -1
View File
@@ -35,7 +35,8 @@ CLI_INST=SteamWareSim
;STARTLIST=VL25
;STARTLIST=GT554
;STARTLIST=PIZ08
STARTLIST=iBTB1P
STARTLIST=PIZ03
;STARTLIST=iBTB1P
MAXCNC=10
+2 -3
View File
@@ -1,15 +1,14 @@
;Configurazione IOB-WIN
[IOB]
;Impianto COMECA Collecchio per Pizzaferri
;Impianto COMECA per Pizzaferri
CNCTYPE=SIEMENS_COMECA
PING_MS_TIMEOUT=500
[MACHINE]
[MACHINE]
VENDOR=COMECA
MODEL=01
[CNC]
;IP=192.168.0.102
IP=192.168.1.3
CPUTYPE=S71500
RACK=0
+9 -3
View File
@@ -219,9 +219,15 @@
<None Include="DATA\CONF\MAIN.ini">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\PIZ03.ini" />
<None Include="DATA\CONF\PIZ03.json" />
<None Include="DATA\CONF\PIZ03_alarm.json" />
<None Include="DATA\CONF\PIZ03.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\PIZ03.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\PIZ03_alarm.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\PIZ08.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@@ -43,7 +43,6 @@ namespace IOB_WIN_SIEMENS.IobSiemens
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller">Form chiamante</param>
/// <param name="IOBConf">Configurazione (legacy)</param>
/// <param name="IobConfFull">Configurazione (v 4.x)</param>
public SiemensComeca(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull)
{
+2 -1
View File
@@ -47,7 +47,8 @@ REM ROBOCOPY %2 Z:\IOB-WIN-SIEMENS-DEB /MIR
REM ROBOCOPY %2 \\10.51.90.9\Steamware\IOB-WIN-SIEMENS-DEB /MIR
REM ROBOCOPY %2 \\10.51.90.10\Steamware\IOB-WIN-SIEMENS-DEB /MIR
REM ROBOCOPY %2 \\10.51.90.11\Steamware\IOB-WIN-SIEMENS-DEB /MIR
ROBOCOPY %2 \\10.51.90.13\Steamware\IOB-WIN-SIEMENS-DEB /MIR
ROBOCOPY %2 \\10.51.90.11\Steamware\IOB-WIN-SIEMENS-DEB /MIR
REM ROBOCOPY %2 \\10.51.90.13\Steamware\IOB-WIN-SIEMENS-DEB /MIR
goto END