Merge branch 'release/FixModBusTCPDisconnect'
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -73,6 +73,6 @@ CLI_INST=SteamWareSim
|
||||
;STARTLIST=MECART_80
|
||||
;STARTLIST=PING
|
||||
;STARTLIST=PIZ09
|
||||
STARTLIST=PIZ04
|
||||
STARTLIST=PIZ05
|
||||
|
||||
MAXCNC=10
|
||||
@@ -100,8 +100,8 @@
|
||||
"func": "MEDIAN",
|
||||
"period": 90,
|
||||
"factor": 270,
|
||||
"minVal": 0,
|
||||
"maxVal": 100,
|
||||
"minVal": -1,
|
||||
"maxVal": 101,
|
||||
"unit": "Kg"
|
||||
},
|
||||
"MainPress": {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user