Migliorata gestione ambiti adapter ModBus e modbus HAM x connect/disconnect
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user