Merge branch 'release/FixModBusTCPDisconnect'

This commit is contained in:
Samuele Locatelli
2022-02-17 11:50:55 +01:00
6 changed files with 27 additions and 294 deletions
-223
View File
@@ -143,17 +143,6 @@ namespace IOB_UT_NEXT
}
}
#if false
/// <summary>
/// Effettua decremento blicnk counters
/// </summary>
/// <param name="num"></param>
/// <param name="newStatus"></param>
public void updateBlinkCounter()
{
}
#endif
/// <summary>
/// Confronta un valore di stato allarme con lo stato precedentemente salvato considerando blink/veto
/// </summary>
@@ -220,22 +209,6 @@ namespace IOB_UT_NEXT
/// <param name="newStatus"></param>
public void updStatusVal(int num, uint newStatus)
{
#if false
if (resetBlink)
{
// calcola la maschera di variazione da valore precedente
var variations = newStatus ^ alarmsState[num];
// ciclo sui 16 bit...
for (int i = 0; i < 16; i++)
{
if ((variations & (1 << i)) == (1 << i))
{
alarmsBlinkCounter[num * 16 + i] = blinkDownVal;
}
}
}
#endif
// salvo nuovo valore
alarmsState[num] = newStatus;
}
@@ -243,202 +216,6 @@ namespace IOB_UT_NEXT
#endregion Public Methods
}
#if false
/// <summary>
/// Classe gestione configurazione parametri di base x allarmi
/// </summary>
public class BaseAlarmConf
{
#region Public Fields
/// <summary>
/// valore di partenza x un segnale di blink in caso di fine variazione (fronte discesa)
/// </summary>
public int blinkDownVal { get; set; } = 10;
/// <summary>
/// valore di partenza x un segnale di blink in caso di inizio variazione (fronte salita)
/// </summary>
public int blinkUpVal { get; set; } = 3;
#endregion Public Fields
#region Public Properties
/// <summary>
/// Elenco dei contatori blink x gestione caso fronte discesa segnale che blinka
/// </summary>
public int[] alarmsBlinkDownCounter { get; set; }
/// <summary>
/// Elenco dei contatori blink x gestione caso fronte salita segnale che blinka
/// </summary>
public int[] alarmsBlinkUpCounter { get; set; }
/// <summary>
/// BitMask 16bit (1 = valido, 0 = filtro) degli allarmi silenziati/disabilitati (se iniziano per ##) come valore da sottrarre x check
/// </summary>
public uint[] alarmsMask { get; set; }
/// <summary>
/// Array dei valori allarme correnti
/// </summary>
public uint[] alarmsState { get; set; }
/// <summary>
/// Descrizione area allarmi
/// </summary>
public string description { get; set; } = "";
/// <summary>
/// Indice nell'area di memoria (da valore iniziale = 0)
/// </summary>
public int index { get; set; } = 0;
/// <summary>
/// Nome "assoluto" della posizione nell'area di memoria (anche diverso da indice)
/// </summary>
public string memAddr { get; set; } = "";
/// <summary>
/// Elenco allarmi configurati x la bitmap
/// </summary>
public List<string> messages { get; set; } = new List<string>();
/// <summary>
/// Size in byte
/// </summary>
public int size { get; set; } = 0;
/// <summary>
/// Tipo di dato
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public plcDataType tipoMem { get; set; } = plcDataType.Boolean;
#endregion Public Properties
#region Public Methods
/// <summary>
/// Calcola il filtro da condizione blink (ovvero maschera per valori indicati blinking)
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public uint blinkFilter(int num)
{
uint answ = 0;
int idx = 16 * num;
for (int i = 0; i < 16; i++)
{
if (alarmsBlinkDownCounter[idx + i] > 0)
{
answ += (uint)1 << i;
}
}
return answ;
}
/// <summary>
/// Effettua update dei contatori blink per gestire i segnali alternati sul fronte di salita/discesa
/// </summary>
public void updateBlinkCounter()
{
// decremento contatori discesa
int idx = 0;
foreach (var item in alarmsBlinkDownCounter)
{
alarmsBlinkDownCounter[idx] = item > 0 ? item - 1 : item;
idx++;
}
}
/// <summary>
/// Confronta un valore di stato allarme con lo stato precedentemente salvato considerando blink/veto
/// </summary>
/// <param name="num">Numero/indice del banco di allarme (uint16)</param>
/// <param name="newValue">Valore (bitmap) allarmi come uint16</param>
/// <returns></returns>
public bool isChanged(int num, uint newValue)
{
// per prima cosa controllo valori RAW
bool answ = !alarmsState[num].Equals(newValue);
if (answ)
{
// controllo valori filtrati con ## (sottraendo BITMASK dai valori di filtro)
answ = ((alarmsState[num] & alarmsMask[num]) != (newValue & alarmsMask[num]));
// se fossero ancora differenti controllo ulteriore mask dato il counter dei blink:
if (answ)
{
var blinkFilt = blinkFilter(num);
answ = ((alarmsState[num] & (alarmsMask[num] | blinkFilt)) != (newValue & (alarmsMask[num] | blinkFilt)));
}
}
return answ;
}
/// <summary>
/// Inizializzazione classe con valori calcolati: attenzione si aspetta banchi da 32 bit...
/// </summary>
public void setupData()
{
// inizializzo vettore valore allarmi x banco int16
alarmsState = new uint[size / 2];
alarmsMask = new uint[size / 2];
// una volta inizializzata la classe di base sistemo vettori allarmi disabilitati ed il contatore blink dei fronti di discesa
alarmsBlinkDownCounter = new int[messages.Count];
int idx = 0;
int bank = 0;
foreach (var item in messages)
{
if (item.StartsWith("##"))
{
alarmsBlinkDownCounter[idx] = -999;
alarmsBlinkUpCounter[idx] = -999;
}
else
{
//alarmsBlinkDownCounter[idx] = blinkDownVal;
alarmsBlinkDownCounter[idx] = 1;
alarmsBlinkUpCounter[idx] = blinkUpVal;
alarmsMask[bank] += (uint)1 << idx;
}
idx++;
// sistemo bank/indice
if (idx > 15)
{
bank++;
idx = 0;
}
}
}
/// <summary>
/// Imposta il valore dello status attuale allarme impostando eventuale valore blink x le variazioni
/// </summary>
/// <param name="num"></param>
/// <param name="newStatus"></param>
public void updStatusVal(int num, uint newStatus)
{
// calcola la maschera di variazione da valore precedente
var variations = newStatus ^ alarmsState[num];
// ciclo sui 16 bit...
for (int i = 0; i < 16; i++)
{
if ((variations & (1 << i)) == (1 << i))
{
alarmsBlinkDownCounter[num * 16 + i] = blinkDownVal;
}
}
// salvo nuovo valore
alarmsState[num] = newStatus;
}
#endregion Public Methods
}
#endif
/// <summary>
/// Classe gestione configurazione parametri di base x configuraizone estesa (es MTConnect, OPC-UA, ...)
/// </summary>
+1 -1
View File
@@ -73,6 +73,6 @@ CLI_INST=SteamWareSim
;STARTLIST=MECART_80
;STARTLIST=PING
;STARTLIST=PIZ09
STARTLIST=PIZ04
STARTLIST=PIZ05
MAXCNC=10
+2 -2
View File
@@ -100,8 +100,8 @@
"func": "MEDIAN",
"period": 90,
"factor": 270,
"minVal": 0,
"maxVal": 100,
"minVal": -1,
"maxVal": 101,
"unit": "Kg"
},
"MainPress": {
+4
View File
@@ -254,6 +254,10 @@
<None Include="DATA\CONF\1033.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\1034.ini" />
<None Include="DATA\CONF\1034.json" />
<None Include="DATA\CONF\1035.ini" />
<None Include="DATA\CONF\1035.json" />
<None Include="DATA\CONF\3023.ini">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
+20 -67
View File
@@ -131,55 +131,6 @@ namespace IOB_WIN_NEXT
// leggo a ciclo le aree degli allarmi CONFIGURATI, se ne trovo --> segnalo allarme...
foreach (var item in alarmMaps)
{
#if false
// in primis decremento eventuali blink...
item.updateBlinkCounter();
// banchi in array Int16 --> scompongo
for (int i = 0; i < item.size / 2; i++)
{
// verifico se usare LUT
bool useLUT = memSetR != null && memSetR.Count > 0;
if (useLUT)
{
int lutAddress = 40000 + item.index;
if (HoldingRegisterLUT.ContainsKey(lutAddress))
{
try
{
listInt = HoldingRegisterLUT[lutAddress];
}
catch (Exception exc)
{
lgError($"Errore in lettura da HoldingRegisterLUT per indirizzo {lutAddress} | item {item.memAddr}{Environment.NewLine}{exc}");
}
}
}
else
{
listInt = readInputReg(item.index, item.size);
}
currStatus = ModbusClient.ConvertRegistersToInt(listInt);
// verifico SE sia variato... confronto allarmi filtrato stile blink per bit status:
// - allarmi che iniziano per # IGNORATI
// - altri allarmi con un countdown da MAX_COUNTER_BLINK a 0 per il fronte di discesa
if (item.isChanged(i, (uint)currStatus))
{
answ = currStatus > 0;
if (answ)
{
numErrors++;
}
// registro gli allarmi attivi e trasmetto...
if (sendAlarmVariations(item.memAddr, i, item.alarmsState[i], (uint)(item.alarmsMask[i] & currStatus), item.messages))
{
// se inviato --> salvo stato da current...
item.updStatusVal(i, (uint)(item.alarmsMask[i] & currStatus));
}
}
}
#endif
// banchi in array Int16 --> scompongo
for (int i = 0; i < item.size / 2; i++)
{
@@ -208,19 +159,17 @@ namespace IOB_WIN_NEXT
// aggiornamento blink counters dato nuovo valore
item.checkBlinkCounter(i, (uint)currStatus);
#if false
item.updateBlinkCounter();
#endif
// calcolo indice errori
if ((uint)(item.alarmsMask[i] & currStatus) > 0)
{
numErrors++;
}
// verifico SE sia variato... confronto allarmi filtrato stile blink per bit status:
// - allarmi che iniziano per # IGNORATI
// - altri allarmi con un countdown da MAX_COUNTER_BLINK a 0 per il fronte di discesa
if (item.isChanged(i, (uint)currStatus))
{
if (currStatus > 0)
{
numErrors++;
}
// registro gli allarmi attivi e trasmetto...
if (sendAlarmVariations(item.memAddr, i, item.alarmsState[i], (uint)(item.alarmsMask[i] & currStatus), item.messages))
{
@@ -725,7 +674,7 @@ namespace IOB_WIN_NEXT
string deltaValStr = getOptPar("DELTA_VAL");
if (!string.IsNullOrEmpty(deltaValStr))
{
double.TryParse(deltaValStr, out deltaVal);
double.TryParse(deltaValStr.Replace(".",","), out deltaVal);
}
bool enableByApp = utils.CRB("enableContapezzi");
bool enableByIob = (getOptPar("ENABLE_PZCOUNT") == "TRUE");
@@ -1272,9 +1221,10 @@ namespace IOB_WIN_NEXT
// refresh stato allarmi!!!
if (connectionOk)
{
lgInfo($"Connessione OK: {connectionOk}");
if (adpRunning)
{
lgInfo($"Connessione OK: {connectionOk} | adpRunning: {adpRunning}");
lgInfo($"AdpRunning: {adpRunning}");
}
}
else
@@ -1313,18 +1263,21 @@ namespace IOB_WIN_NEXT
/// </summary>
public override void tryDisconnect()
{
lgInfo("Richiesta disconnessione adapter ModBusTCP!");
try
if (currPLC != null && currPLC.Connected)
{
if (currPLC.Connected)
lgInfo("Richiesta disconnessione adapter ModBusTCP!");
try
{
currPLC.Disconnect();
if (currPLC.Connected)
{
currPLC.Disconnect();
}
lgInfo("Effettuata disconnessione adapter ModBusTCP!");
}
catch (Exception exc)
{
lgFatal($"Errore nella disconnessione dall'adapter ModBusTCP{Environment.NewLine}{exc}");
}
lgInfo("Effettuata disconnessione adapter ModBusTCP!");
}
catch (Exception exc)
{
lgFatal($"Errore nella disconnessione dall'adapter ModBusTCP{Environment.NewLine}{exc}");
}
connectionOk = false;
}
-1
View File
@@ -75,7 +75,6 @@ namespace IOB_WIN_NEXT
currStatus = S7.Net.Types.Counter.FromByteArray(RawInput.Skip(item.index + 2 * i).Take(2).ToArray());
// verifica e decremento blink...
item.checkBlinkCounter(i, (uint)currStatus);
//item.updateBlinkCounter();
// verifico SE sia variato... confronto allarmi filtrato stile blink per bit status:
// - allarmi che iniziano per # IGNORATI