Merge branch 'release/ModBusFixConnDisconn'

This commit is contained in:
Samuele Locatelli
2021-11-04 17:08:59 +01:00
2 changed files with 56 additions and 143 deletions
+56 -31
View File
@@ -264,6 +264,18 @@ namespace IOB_WIN_NEXT
return valUInt;
}
/// <summary>
/// se si disconnette --> processo tentativo riconnessione..
/// </summary>
/// <param name="sender"></param>
private void CurrPLC_ConnectedChanged(object sender)
{
if (!currPLC.Connected)
{
tryDisconnect();
}
}
/// <summary>
/// Recupero dati da singole letture
/// </summary>
@@ -384,44 +396,52 @@ namespace IOB_WIN_NEXT
/// <param name="numReg">NUm registri da leggere (max 120)</param>
private void readBlockHoldingReg(int startAddr, int numReg)
{
// fix massima lunghezza pacchetto
if (numReg > 120)
if (currPLC.Connected)
{
lgError($"Attenzione richiesta lettura blocco troppo grande: numReg {numReg} --> 120");
numReg = 120;
}
// si lavora rispetto all'indirizzo base 40001
int baseAddr = 40001;
int[] rawData = new int[2];
try
{
stopwatch.Restart();
rawData = currPLC.ReadHoldingRegisters(startAddr - baseAddr, numReg);
stopwatch.Stop();
lgInfo($"Lettura in blocco HoldingRegisters| startAddr: {startAddr} | numReg {numReg} | {stopwatch.ElapsedMilliseconds}ms");
// salvo in LUT la versione ESPLOSA 2 byte alla volta...
if (rawData.Length > 0)
// fix massima lunghezza pacchetto
if (numReg > 120)
{
for (int i = 0; i < rawData.Length / 2; i++)
lgError($"Attenzione richiesta lettura blocco troppo grande: numReg {numReg} --> 120");
numReg = 120;
}
// si lavora rispetto all'indirizzo base 40001
int baseAddr = 40001;
int[] rawData = new int[2];
try
{
stopwatch.Restart();
rawData = currPLC.ReadHoldingRegisters(startAddr - baseAddr, numReg);
stopwatch.Stop();
lgInfo($"Lettura in blocco HoldingRegisters| startAddr: {startAddr} | numReg {numReg} | {stopwatch.ElapsedMilliseconds}ms");
// salvo in LUT la versione ESPLOSA 2 byte alla volta...
if (rawData.Length > 0)
{
int[] thisSet = new int[2];
Array.Copy(rawData, i * 2, thisSet, 0, 2);
// salvo nel registro...
int currAddr = startAddr + i * 2;
if (HoldingRegisterLUT.ContainsKey(currAddr))
for (int i = 0; i < rawData.Length / 2; i++)
{
HoldingRegisterLUT[currAddr] = thisSet;
}
else
{
HoldingRegisterLUT.Add(currAddr, thisSet);
int[] thisSet = new int[2];
Array.Copy(rawData, i * 2, thisSet, 0, 2);
// salvo nel registro...
int currAddr = startAddr + i * 2;
if (HoldingRegisterLUT.ContainsKey(currAddr))
{
HoldingRegisterLUT[currAddr] = thisSet;
}
else
{
HoldingRegisterLUT.Add(currAddr, thisSet);
}
}
}
}
catch (Exception exc)
{
lgError($"Eccezione in readBlockHoldingReg{Environment.NewLine}{exc}");
}
}
catch (Exception exc)
else
{
lgError($"Eccezione in readBlockHoldingReg{Environment.NewLine}{exc}");
lgError("Attenzione, plc disconnesso...");
tryDisconnect();
}
}
@@ -671,6 +691,8 @@ namespace IOB_WIN_NEXT
//Ip-Address and Port of Modbus-TCP-Server
currPLC = new ModbusClient(parametri.ipAdrr, parametri.port);
currPLC.ConnectedChanged += CurrPLC_ConnectedChanged;
// disconnetto e connetto...
if (isVerboseLog)
{
@@ -1208,14 +1230,17 @@ namespace IOB_WIN_NEXT
lgInfo("Richiesta disconnessione adapter ModBusTCP!");
try
{
currPLC.Disconnect();
connectionOk = false;
if (currPLC.Connected)
{
currPLC.Disconnect();
}
lgInfo("Effettuata disconnessione adapter ModBusTCP!");
}
catch (Exception exc)
{
lgFatal($"Errore nella disconnessione dall'adapter ModBusTCP{Environment.NewLine}{exc}");
}
connectionOk = false;
}
/// <summary>
-112
View File
@@ -138,117 +138,5 @@ namespace IOB_WIN_NEXT
}
#endregion Protected Methods
#region Public Methods
/// <summary>
/// Override connessione
/// </summary>
public override void tryConnect()
{
bool doLog = (verboseLog || periodicLog);
lgInfo("ModBus TCP HAM: tryConnect step 01");
if (!connectionOk)
{
// SE è necessario refresh...
if (needRefresh)
{
lgInfo("ModBus TCP HAM: tryConnect step 02");
// reimporto parametri PLC se necessario...
setParamPlc();
}
lgInfo("ModBus TCP HAM: tryConnect step 03");
// controllo che il ping sia stato tentato almeno pingTestSec fa...
if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec"))
{
if (doLog)
{
lgInfo("ModBus TCP HAM: ConnKO - tryConnect");
}
lgInfo("ModBus TCP HAM: tryConnect step 04");
// in primis salvo data ping...
lastPING = DateTime.Now;
// se passa il ping faccio il resto...
if (testPingMachine == IPStatus.Success)
{
string szStatusConnection = "ND";
try
{
// ora provo connessione...
parentForm.commPlcActive = true;
currPLC.Connect();
szStatusConnection = "OPEN";
parentForm.commPlcActive = false;
connectionOk = currPLC.Connected;
lgInfo($"StatusConnection: {szStatusConnection}");
// refresh stato allarmi!!!
if (connectionOk)
{
if (adpRunning)
{
lgInfo($"Connessione OK: {connectionOk} | adpRunning: {adpRunning}");
}
}
else
{
lgError("Impossibile procedere, connessione mancante...");
}
}
catch (Exception exc)
{
lgFatal($"Errore in TryConnect adapter ModBusTCP | szStatusConnection {szStatusConnection}{Environment.NewLine}{exc}");
connectionOk = false;
needRefresh = true;
}
}
else
{
// loggo no risposta ping ...
connectionOk = false;
if (doLog)
{
lgInfo($"Attenzione: ModBusTCP controllo PING fallito per IP {cIobConf.cncIpAddr}");
}
}
}
}
// se non è ancora connesso faccio procesisng memoria caso disconnesso...
if (!connectionOk)
{
// processo semafori ed invio...
processMemoryDiscon();
}
}
/// <summary>
/// Override disconnessione
/// </summary>
public override void tryDisconnect()
{
if (connectionOk)
{
string szStatusConnection = "";
try
{
currPLC.Disconnect();
connectionOk = false;
lgInfo(szStatusConnection);
lgInfo("Effettuata disconnessione adapter ModBusTCP!");
}
catch (Exception exc)
{
lgFatal(exc, "Errore nella disconnessione dall'adapter ModBusTCP");
}
}
else
{
lgError("IMPOSSIBILE effettuare disconnessione ModBusTCP: Connessione non disponibile...");
}
}
#endregion Public Methods
}
}