U:修改PLC监听数据不会更新BUG
This commit is contained in:
1 parent
d9e5a5483c
commit
6ed0d3f1c2
2 files changed
+28
-15
No files matched your search
@@ -50,7 +50,7 @@ public class PlcViewModel : ViewModelBase
|
||||
ReadCommand = new AsyncCommand(ReadAsync);
|
||||
WriteCommand = new AsyncCommand(WriteAsync);
|
||||
AddMonitorCommand = new RelayCommand(AddMonitor);
|
||||
RemoveMonitorCommand = new RelayCommand<PlcTag>(RemoveMonitor, tag => tag != null);
|
||||
RemoveMonitorCommand = new RelayCommand<PlcTagViewModel>(RemoveMonitor, tag => tag != null);
|
||||
}
|
||||
|
||||
#region Properties
|
||||
@@ -120,7 +120,7 @@ public class PlcViewModel : ViewModelBase
|
||||
// 数据源
|
||||
public ObservableCollection<PlcBrand> Brands { get; } = new(Enum.GetValues<PlcBrand>());
|
||||
public ObservableCollection<CpuType> CpuTypes { get; } = new(Enum.GetValues<CpuType>());
|
||||
public ObservableCollection<PlcTag> MonitoredTags { get; } = new();
|
||||
public ObservableCollection<PlcTagViewModel> MonitoredTags { get; } = new();
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -206,15 +206,18 @@ public class PlcViewModel : ViewModelBase
|
||||
var tag = new PlcTag
|
||||
{
|
||||
Address = MonitorAddress,
|
||||
DataType = typeof(short),
|
||||
OnChanged = (t, v) =>
|
||||
DataType = typeof(short)
|
||||
};
|
||||
|
||||
var vm = new PlcTagViewModel(tag);
|
||||
|
||||
tag.OnChanged = (t, v) =>
|
||||
{
|
||||
// 使用Dispatcher在UI线程更新值,避免跨线程访问异常
|
||||
_dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
// 使用Dispatcher在UI线程更新值,避免跨线程访问异常
|
||||
_dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
t.Value = v;
|
||||
});
|
||||
}
|
||||
vm.UpdateValue();
|
||||
});
|
||||
};
|
||||
|
||||
_plcService.Subscribe(tag);
|
||||
@@ -222,21 +225,21 @@ public class PlcViewModel : ViewModelBase
|
||||
// 在UI线程添加到集合
|
||||
_dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
MonitoredTags.Add(tag);
|
||||
MonitoredTags.Add(vm);
|
||||
});
|
||||
}
|
||||
|
||||
private void RemoveMonitor(PlcTag? tag)
|
||||
private void RemoveMonitor(PlcTagViewModel? tagVm)
|
||||
{
|
||||
if (tag == null) return;
|
||||
if (tagVm == null) return;
|
||||
|
||||
// 从PLC服务取消订阅
|
||||
_plcService.Unsubscribe(tag.Id);
|
||||
_plcService.Unsubscribe(tagVm.Id);
|
||||
|
||||
// 从UI集合移除
|
||||
_dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
MonitoredTags.Remove(tag);
|
||||
MonitoredTags.Remove(tagVm);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -73,6 +73,16 @@ public class PlcMonitorService : IPlcService, IDisposable
|
||||
{
|
||||
_logger?.LogDebug("Monitor task cancelled successfully");
|
||||
}
|
||||
finally
|
||||
{
|
||||
_monitorTask = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (_cts != null)
|
||||
{
|
||||
_cts.Dispose();
|
||||
_cts = null;
|
||||
}
|
||||
|
||||
await _driver.DisconnectAsync();
|
||||
|
||||
Reference in new issue
Block a user