Compare commits
No commits in common. "4aa1e8ec27dbba197e89426eb091983f4cc7f34f" and "c0ff14a5ae8c413c6708cddd06c61e59270a1ea7" have entirely different histories.
4aa1e8ec27
...
c0ff14a5ae
138
PLCViewModel.cs
138
PLCViewModel.cs
|
@ -57,13 +57,6 @@ namespace LibS7Adv
|
|||
private DateTime _lastUpdateStartTime = DateTime.MinValue;
|
||||
private TimeSpan _updateTimeout = TimeSpan.FromSeconds(10); // Timeout para reintentar después de un tiempo
|
||||
|
||||
// Añadir protección contra loops infinitos
|
||||
private readonly object _updateLock = new object();
|
||||
private int _concurrentUpdateCount = 0;
|
||||
private const int MAX_CONCURRENT_UPDATES = 1;
|
||||
private DateTime _lastUpdateAttempt = DateTime.MinValue;
|
||||
private readonly TimeSpan _minUpdateInterval = TimeSpan.FromSeconds(2);
|
||||
|
||||
[ObservableProperty]
|
||||
PlcData plcData = new PlcData();
|
||||
|
||||
|
@ -129,14 +122,6 @@ namespace LibS7Adv
|
|||
{
|
||||
IsConnected = false;
|
||||
PlcData.ConnectionStatus = "offline";
|
||||
|
||||
// Limpiar estado al desconectar
|
||||
lock (_updateLock)
|
||||
{
|
||||
_isUpdating = false;
|
||||
_concurrentUpdateCount = 0;
|
||||
}
|
||||
|
||||
Instance = null;
|
||||
}
|
||||
|
||||
|
@ -147,7 +132,7 @@ namespace LibS7Adv
|
|||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Actualizar cuando recibimos el evento
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
|
||||
// Cuando la actualización se completa exitosamente, desactivar la bandera
|
||||
if (IsConfigured)
|
||||
|
@ -156,45 +141,8 @@ namespace LibS7Adv
|
|||
}
|
||||
else
|
||||
{
|
||||
// Si no se pudo configurar, programar UN SOLO reintento después de un tiempo
|
||||
// Solo si no hay otra actualización en curso
|
||||
lock (_updateLock)
|
||||
{
|
||||
if (_concurrentUpdateCount == 0)
|
||||
{
|
||||
Task.Delay(2000).ContinueWith(_ => SafeUpdateTagList());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SafeUpdateTagList()
|
||||
{
|
||||
// Verificar si podemos hacer la actualización
|
||||
lock (_updateLock)
|
||||
{
|
||||
// No permitir más de una actualización concurrente
|
||||
if (_concurrentUpdateCount >= MAX_CONCURRENT_UPDATES)
|
||||
return;
|
||||
|
||||
// No actualizar muy frecuentemente
|
||||
if (DateTime.Now - _lastUpdateAttempt < _minUpdateInterval)
|
||||
return;
|
||||
|
||||
_concurrentUpdateCount++;
|
||||
_lastUpdateAttempt = DateTime.Now;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
UpdateTagList();
|
||||
}
|
||||
finally
|
||||
{
|
||||
lock (_updateLock)
|
||||
{
|
||||
_concurrentUpdateCount--;
|
||||
}
|
||||
// Si no se pudo configurar, programar un reintento después de un tiempo
|
||||
Task.Delay(1000).ContinueWith(_ => UpdateTagList());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -205,7 +153,7 @@ namespace LibS7Adv
|
|||
|
||||
try
|
||||
{
|
||||
Instance?.UpdateTagList(ETagListDetails.IO | ETagListDetails.DB | ETagListDetails.M, true); //
|
||||
Instance?.UpdateTagList(ETagListDetails.IO | ETagListDetails.DB | ETagListDetails.M, true);
|
||||
IsConfigured = true;
|
||||
_isUpdating = false; // Éxito en la actualización
|
||||
}
|
||||
|
@ -234,7 +182,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar leer durante la actualización
|
||||
|
@ -266,8 +214,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = sTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -297,7 +245,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar escribir durante la actualización
|
||||
|
@ -330,8 +278,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = sTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -360,7 +308,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar leer durante la actualización
|
||||
|
@ -430,8 +378,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = sTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -456,7 +404,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar leer durante la actualización
|
||||
|
@ -473,8 +421,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = "Byte " + pByte + ", Bit " + pBit + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -497,7 +445,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar escribir durante la actualización
|
||||
|
@ -514,8 +462,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = "Byte " + pByte + ", Bit " + pBit + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -543,7 +491,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar escribir durante la actualización
|
||||
|
@ -560,8 +508,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = pTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -589,7 +537,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar leer durante la actualización
|
||||
|
@ -606,8 +554,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = pTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -636,7 +584,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar escribir durante la actualización
|
||||
|
@ -653,8 +601,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = pTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -681,7 +629,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar escribir durante la actualización
|
||||
|
@ -698,8 +646,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = pTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -727,7 +675,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar leer durante la actualización
|
||||
|
@ -745,8 +693,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = pTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -775,7 +723,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar leer durante la actualización
|
||||
|
@ -793,8 +741,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = pTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -823,7 +771,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar leer durante la actualización
|
||||
|
@ -841,8 +789,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = pTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
@ -871,7 +819,7 @@ namespace LibS7Adv
|
|||
if (DateTime.Now - _lastUpdateStartTime > _updateTimeout)
|
||||
{
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
SafeUpdateTagList();
|
||||
UpdateTagList();
|
||||
}
|
||||
|
||||
// No intentar escribir durante la actualización
|
||||
|
@ -888,8 +836,8 @@ namespace LibS7Adv
|
|||
_isUpdating = true;
|
||||
_lastUpdateStartTime = DateTime.Now;
|
||||
|
||||
// Iniciar actualización de tags de forma segura
|
||||
SafeUpdateTagList();
|
||||
// Iniciar actualización de tags
|
||||
Task.Run(() => UpdateTagList());
|
||||
|
||||
PlcData.LastError = pTag + ": Tags no actualizados, reintentando...";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue