Update SIEMENS xComeca
- controllo DynData validi - controllo update grafico su thread indipendente in lettura memoria - refresh
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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"...
|
||||
|
||||
@@ -35,7 +35,8 @@ CLI_INST=SteamWareSim
|
||||
;STARTLIST=VL25
|
||||
;STARTLIST=GT554
|
||||
;STARTLIST=PIZ08
|
||||
STARTLIST=iBTB1P
|
||||
STARTLIST=PIZ03
|
||||
;STARTLIST=iBTB1P
|
||||
|
||||
MAXCNC=10
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user