重构了Mqtt后台服务。
This commit is contained in:
@@ -30,6 +30,7 @@ public class MenuRepository
|
|||||||
|
|
||||||
public async Task<int> DeleteMenu(MenuBean menu, SqlSugarClient db)
|
public async Task<int> DeleteMenu(MenuBean menu, SqlSugarClient db)
|
||||||
{
|
{
|
||||||
|
|
||||||
Stopwatch stopwatch = new Stopwatch();
|
Stopwatch stopwatch = new Stopwatch();
|
||||||
stopwatch.Start();
|
stopwatch.Start();
|
||||||
var childList = await db.Queryable<DbMenu>()
|
var childList = await db.Queryable<DbMenu>()
|
||||||
|
|||||||
@@ -158,7 +158,11 @@ public class MqttRepository
|
|||||||
.ExecuteCommandAsync();
|
.ExecuteCommandAsync();
|
||||||
// Delete menu entry
|
// Delete menu entry
|
||||||
var menu = await _menuRepository.GetMenuByDataId(mqtt.Id, MenuType.MqttMenu);
|
var menu = await _menuRepository.GetMenuByDataId(mqtt.Id, MenuType.MqttMenu);
|
||||||
await _menuRepository.DeleteMenu(menu, db);
|
if (menu!=null )
|
||||||
|
{
|
||||||
|
await _menuRepository.DeleteMenu(menu, db);
|
||||||
|
}
|
||||||
|
|
||||||
await db.CommitTranAsync();
|
await db.CommitTranAsync();
|
||||||
stopwatch.Stop();
|
stopwatch.Stop();
|
||||||
NlogHelper.Info($"删除Mqtt配置ID '{mqtt.Id}' 耗时:{stopwatch.ElapsedMilliseconds}ms");
|
NlogHelper.Info($"删除Mqtt配置ID '{mqtt.Id}' 耗时:{stopwatch.ElapsedMilliseconds}ms");
|
||||||
|
|||||||
@@ -154,4 +154,19 @@ public static class NotificationHelper
|
|||||||
{
|
{
|
||||||
SendNotificationInternal(msg, NotificationType.Info, throttle, null, callerFilePath, callerMember, callerLineNumber);
|
SendNotificationInternal(msg, NotificationType.Info, throttle, null, callerFilePath, callerMember, callerLineNumber);
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 显示一个信息通知消息,并记录信息日志。支持节流。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="msg">信息消息内容。</param>
|
||||||
|
/// <param name="throttle">是否启用通知和日志节流。</param>
|
||||||
|
/// <param name="callerFilePath">自动捕获:调用此方法的源文件完整路径。</param>
|
||||||
|
/// <param name="callerMember">自动捕获:调用此方法的成员或属性名称。</param>
|
||||||
|
/// <param name="callerLineNumber">自动捕获:调用此方法的行号。</param>
|
||||||
|
public static void ShowWarn(string msg, bool throttle = true,
|
||||||
|
[CallerFilePath] string callerFilePath = "",
|
||||||
|
[CallerMemberName] string callerMember = "",
|
||||||
|
[CallerLineNumber] int callerLineNumber = 0)
|
||||||
|
{
|
||||||
|
SendNotificationInternal(msg, NotificationType.Warning, throttle, null, callerFilePath, callerMember, callerLineNumber);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,13 +26,15 @@ namespace PMSWPF.Services
|
|||||||
private readonly Dictionary<int, IMqttClient> _mqttClients;
|
private readonly Dictionary<int, IMqttClient> _mqttClients;
|
||||||
|
|
||||||
// 存储MQTT配置的字典,键为MQTT配置ID,值为Mqtt模型对象。
|
// 存储MQTT配置的字典,键为MQTT配置ID,值为Mqtt模型对象。
|
||||||
private readonly Dictionary<int, Mqtt> _mqttConfigurations;
|
private readonly Dictionary<int, Mqtt> _mqttConfigDic;
|
||||||
|
|
||||||
// 存储与MQTT配置关联的变量数据的字典,键为MQTT配置ID,值为VariableData列表。
|
|
||||||
private readonly Dictionary<int, List<VariableData>> _mqttVariableData;
|
|
||||||
|
|
||||||
// 定时器,用于周期性地执行数据发布任务。
|
// 定时器,用于周期性地执行数据发布任务。
|
||||||
private Timer _timer;
|
private Timer _timer;
|
||||||
|
private Thread _serviceMainThread;
|
||||||
|
|
||||||
|
private ManualResetEvent _reloadEvent = new ManualResetEvent(false);
|
||||||
|
private ManualResetEvent _stopEvent = new ManualResetEvent(false);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构造函数,注入DataServices。
|
/// 构造函数,注入DataServices。
|
||||||
@@ -42,8 +44,7 @@ namespace PMSWPF.Services
|
|||||||
{
|
{
|
||||||
_dataServices = dataServices;
|
_dataServices = dataServices;
|
||||||
_mqttClients = new Dictionary<int, IMqttClient>();
|
_mqttClients = new Dictionary<int, IMqttClient>();
|
||||||
_mqttConfigurations = new Dictionary<int, Mqtt>();
|
_mqttConfigDic = new Dictionary<int, Mqtt>();
|
||||||
_mqttVariableData = new Dictionary<int, List<VariableData>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -51,151 +52,83 @@ namespace PMSWPF.Services
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public async void StartService()
|
public async void StartService()
|
||||||
{
|
{
|
||||||
NlogHelper.Info("MqttBackgroundService started."); // 记录服务启动信息
|
|
||||||
|
|
||||||
// 订阅MQTT列表和变量数据变化的事件,以便在数据更新时重新加载配置和数据。
|
// 订阅MQTT列表和变量数据变化的事件,以便在数据更新时重新加载配置和数据。
|
||||||
_dataServices.OnMqttListChanged += HandleMqttListChanged;
|
_dataServices.OnMqttListChanged += HandleMqttListChanged;
|
||||||
_dataServices.OnDeviceListChanged += HandleDeviceListChanged;
|
NlogHelper.Info("Mqtt后台服务启动"); // 记录服务启动信息
|
||||||
|
_reloadEvent.Set();
|
||||||
// 初始加载MQTT配置和变量数据。
|
_stopEvent.Reset();
|
||||||
await LoadMqttConfigurations();
|
_serviceMainThread = new Thread(Execute);
|
||||||
await LoadVariableData();
|
_serviceMainThread.IsBackground = true;
|
||||||
|
_serviceMainThread.Name = "MqttServiceMainThread";
|
||||||
// 初始化定时器,每5秒执行一次DoWork方法,用于周期性地发布数据。
|
_serviceMainThread.Start();
|
||||||
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); // 每5秒轮询一次
|
|
||||||
|
|
||||||
// 使服务保持运行,直到收到停止请求。
|
|
||||||
// await Task.Delay(Timeout.Infinite, stoppingToken);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void HandleDeviceListChanged( List<Device> devices)
|
private void Execute()
|
||||||
{
|
{
|
||||||
NlogHelper.Info("Variable data changed. Reloading variable associations."); // 记录变量数据变化信息
|
while (!_stopEvent.WaitOne(0))
|
||||||
// 重新加载变量数据。
|
{
|
||||||
await LoadVariableData();
|
if (_dataServices.Mqtts==null || _dataServices.Mqtts.Count==0)
|
||||||
|
{
|
||||||
|
_reloadEvent.Reset();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_reloadEvent.WaitOne();
|
||||||
|
// 初始加载MQTT配置和变量数据。
|
||||||
|
LoadMqttConfigurations();
|
||||||
|
ConnectMqttClient();
|
||||||
|
|
||||||
|
_reloadEvent.Reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 停止MQTT后台服务。
|
/// 停止MQTT后台服务。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public async void StopService()
|
public void StopService()
|
||||||
{
|
{
|
||||||
NlogHelper.Info("MqttBackgroundService stopping."); // 记录服务停止信息
|
NlogHelper.Info("Mqtt后台服务开始停止...."); // 记录服务停止信息
|
||||||
|
|
||||||
// 停止定时器。
|
|
||||||
_timer?.Change(Timeout.Infinite, 0);
|
|
||||||
|
|
||||||
|
_stopEvent.Set();
|
||||||
// 取消订阅事件。
|
// 取消订阅事件。
|
||||||
_dataServices.OnMqttListChanged -= HandleMqttListChanged;
|
_dataServices.OnMqttListChanged -= HandleMqttListChanged;
|
||||||
_dataServices.OnDeviceListChanged -= HandleDeviceListChanged;
|
|
||||||
|
|
||||||
// 断开所有已连接的MQTT客户端。
|
// 断开所有已连接的MQTT客户端。
|
||||||
foreach (var client in _mqttClients.Values)
|
foreach (var mqttId in _mqttClients.Keys.ToList())
|
||||||
{
|
{
|
||||||
|
var client=_mqttClients[mqttId];
|
||||||
|
var mqtt=_mqttConfigDic[mqttId];
|
||||||
|
mqtt.IsConnected = false;
|
||||||
if (client.IsConnected)
|
if (client.IsConnected)
|
||||||
{
|
{
|
||||||
await client.DisconnectAsync();
|
client.DisconnectAsync().GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 清空所有字典。
|
// 清空所有字典。
|
||||||
_mqttClients.Clear();
|
_mqttClients.Clear();
|
||||||
_mqttConfigurations.Clear();
|
_mqttConfigDic.Clear();
|
||||||
_mqttVariableData.Clear();
|
NlogHelper.Info("Mqtt后台服务已停止。"); // 记录服务停止信息
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 定时器回调方法,用于周期性地检查并发布已修改的变量数据。
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="state">定时器状态对象(此处未使用)。</param>
|
|
||||||
private async void DoWork(object state)
|
|
||||||
{
|
|
||||||
// 遍历所有MQTT配置关联的变量数据。
|
|
||||||
foreach (var mqttConfigId in _mqttVariableData.Keys)
|
|
||||||
{
|
|
||||||
// 检查MQTT客户端是否连接。
|
|
||||||
if (_mqttClients.TryGetValue(mqttConfigId, out var client) && client.IsConnected)
|
|
||||||
{
|
|
||||||
var variables = _mqttVariableData[mqttConfigId];
|
|
||||||
// 遍历与当前MQTT配置关联的变量。
|
|
||||||
foreach (var variable in variables)
|
|
||||||
{
|
|
||||||
// 如果变量已被修改(IsModified标志为true)。
|
|
||||||
if (variable.IsModified)
|
|
||||||
{
|
|
||||||
// 获取发布主题。
|
|
||||||
var topic = _mqttConfigurations[mqttConfigId].PublishTopic;
|
|
||||||
if (!string.IsNullOrEmpty(topic))
|
|
||||||
{
|
|
||||||
// 构建MQTT消息。
|
|
||||||
var message = new MqttApplicationMessageBuilder()
|
|
||||||
.WithTopic($"{topic}/{variable.Name}") // 主题格式:PublishTopic/VariableName
|
|
||||||
.WithPayload(variable.DataValue) // 消息载荷为变量的值
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
// 发布MQTT消息。
|
|
||||||
await client.PublishAsync(message);
|
|
||||||
NlogHelper.Info(
|
|
||||||
$"Published {variable.Name} = {variable.DataValue} to {topic}/{variable.Name}",
|
|
||||||
throttle: true); // 记录发布信息
|
|
||||||
variable.IsModified = false; // 发布后重置修改标志。
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 加载并连接MQTT配置。
|
/// 加载并连接MQTT配置。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>表示异步操作的任务。</returns>
|
/// <returns>表示异步操作的任务。</returns>
|
||||||
private async Task LoadMqttConfigurations()
|
private void LoadMqttConfigurations()
|
||||||
{
|
{
|
||||||
|
NlogHelper.Info("开始加载Mqtt配置文件...");
|
||||||
// 从数据服务获取所有MQTT配置。
|
// 从数据服务获取所有MQTT配置。
|
||||||
var allMqtts = await _dataServices.GetMqttsAsync();
|
var _mqttConfigList = _dataServices.Mqtts.Where(m => m.IsActive)
|
||||||
var activeMqtts = allMqtts.Where(m => m.IsActive)
|
.ToList();
|
||||||
.ToList();
|
foreach (var mqtt in _mqttConfigList)
|
||||||
var activeMqttIds = activeMqtts.Select(m => m.Id)
|
|
||||||
.ToHashSet();
|
|
||||||
|
|
||||||
// 断开并移除不再活跃或已删除的MQTT客户端。
|
|
||||||
var clientsToDisconnect = _mqttClients.Keys.Except(activeMqttIds)
|
|
||||||
.ToList();
|
|
||||||
foreach (var id in clientsToDisconnect)
|
|
||||||
{
|
{
|
||||||
if (_mqttClients.TryGetValue(id, out var client))
|
_mqttConfigDic[mqtt.Id] = mqtt;
|
||||||
{
|
|
||||||
if (client.IsConnected)
|
|
||||||
{
|
|
||||||
await client.DisconnectAsync();
|
|
||||||
// 更新模型中的连接状态
|
|
||||||
if (_mqttConfigurations.TryGetValue(id, out var mqttConfig))
|
|
||||||
{
|
|
||||||
mqttConfig.IsConnected = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_mqttClients.Remove(id);
|
|
||||||
NlogHelper.Info(
|
|
||||||
$"Disconnected and removed MQTT client for ID: {id} (no longer active or removed).");
|
|
||||||
}
|
|
||||||
|
|
||||||
_mqttConfigurations.Remove(id);
|
|
||||||
_mqttVariableData.Remove(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 连接或更新活跃的客户端。
|
|
||||||
foreach (var mqtt in activeMqtts)
|
|
||||||
{
|
|
||||||
if (!_mqttClients.ContainsKey(mqtt.Id))
|
|
||||||
{
|
|
||||||
await ConnectMqttClient(mqtt);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 始终更新或添加MQTT配置到字典。
|
|
||||||
_mqttConfigurations[mqtt.Id] = mqtt;
|
|
||||||
}
|
}
|
||||||
|
NlogHelper.Info($"Mqtt配置文件加载成功,开启的Mqtt客户端:{_mqttConfigList.Count}个。");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -203,103 +136,78 @@ namespace PMSWPF.Services
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="mqtt">MQTT配置对象。</param>
|
/// <param name="mqtt">MQTT配置对象。</param>
|
||||||
/// <returns>表示异步操作的任务。</returns>
|
/// <returns>表示异步操作的任务。</returns>
|
||||||
private async Task ConnectMqttClient(Mqtt mqtt)
|
private void ConnectMqttClient()
|
||||||
{
|
{
|
||||||
try
|
foreach (Mqtt mqtt in _mqttConfigDic.Values.ToList())
|
||||||
{
|
{
|
||||||
// 创建MQTT客户端工厂和客户端实例。
|
try
|
||||||
var factory = new MqttFactory();
|
|
||||||
var client = factory.CreateMqttClient();
|
|
||||||
// 构建MQTT客户端连接选项。
|
|
||||||
var options = new MqttClientOptionsBuilder()
|
|
||||||
.WithClientId(mqtt.ClientID)
|
|
||||||
.WithTcpServer(mqtt.Host, mqtt.Port)
|
|
||||||
.WithCredentials(mqtt.UserName, mqtt.PassWord)
|
|
||||||
.WithCleanSession() // 清理会话,每次连接都是新会话
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
// 设置连接成功事件处理程序。
|
|
||||||
client.UseConnectedHandler(e =>
|
|
||||||
{
|
{
|
||||||
NlogHelper.Info($"Connected to MQTT broker: {mqtt.Name}");
|
NlogHelper.Info($"开始连接:{mqtt.Name}的服务器...");
|
||||||
NotificationHelper.ShowSuccess($"已连接到MQTT服务器: {mqtt.Name}");
|
// 创建MQTT客户端工厂和客户端实例。
|
||||||
mqtt.IsConnected = true;
|
var factory = new MqttFactory();
|
||||||
});
|
var client = factory.CreateMqttClient();
|
||||||
|
// 构建MQTT客户端连接选项。
|
||||||
|
var options = new MqttClientOptionsBuilder()
|
||||||
|
.WithClientId(mqtt.ClientID)
|
||||||
|
.WithTcpServer(mqtt.Host, mqtt.Port)
|
||||||
|
.WithCredentials(mqtt.UserName, mqtt.PassWord)
|
||||||
|
.WithCleanSession() // 清理会话,每次连接都是新会话
|
||||||
|
.Build();
|
||||||
|
|
||||||
// 设置断开连接事件处理程序。
|
// 设置连接成功事件处理程序。
|
||||||
client.UseDisconnectedHandler(async e =>
|
client.UseConnectedHandler(e =>
|
||||||
{
|
|
||||||
NlogHelper.Warn($"Disconnected from MQTT broker: {mqtt.Name}. Reason: {e.Reason}");
|
|
||||||
NotificationHelper.ShowInfo($"与MQTT服务器断开连接: {mqtt.Name}");
|
|
||||||
mqtt.IsConnected = false;
|
|
||||||
// 尝试重新连接。
|
|
||||||
await Task.Delay(TimeSpan.FromSeconds(5)); // 等待5秒后重连
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
await client.ConnectAsync(options, CancellationToken.None);
|
NotificationHelper.ShowSuccess($"已连接到MQTT服务器: {mqtt.Name}");
|
||||||
}
|
mqtt.IsConnected = true;
|
||||||
catch (Exception ex)
|
});
|
||||||
|
|
||||||
|
// 设置断开连接事件处理程序。
|
||||||
|
client.UseDisconnectedHandler(async e =>
|
||||||
{
|
{
|
||||||
NlogHelper.Error($"Failed to reconnect to MQTT broker: {mqtt.Name}", ex);
|
NotificationHelper.ShowWarn($"与MQTT服务器断开连接: {mqtt.Name}");
|
||||||
}
|
mqtt.IsConnected = false;
|
||||||
});
|
// 服务停止
|
||||||
|
if (_stopEvent.WaitOne(0))
|
||||||
// 尝试连接到MQTT代理。
|
return;
|
||||||
await client.ConnectAsync(options, CancellationToken.None);
|
|
||||||
// 将连接成功的客户端添加到字典。
|
NlogHelper.Info($"5秒后重新连接Mqtt服务器:{mqtt.Name}");
|
||||||
_mqttClients[mqtt.Id] = client;
|
// 尝试重新连接。
|
||||||
}
|
await Task.Delay(TimeSpan.FromSeconds(5)); // 等待5秒后重连
|
||||||
catch (Exception ex)
|
try
|
||||||
{
|
|
||||||
NotificationHelper.ShowError($"连接MQTT服务器失败: {mqtt.Name} - {ex.Message}", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 加载所有变量数据并按MQTT配置ID进行分组。
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>表示异步操作的任务。</returns>
|
|
||||||
private async Task LoadVariableData()
|
|
||||||
{
|
|
||||||
// 从数据服务获取所有变量数据。
|
|
||||||
var allVariables = _dataServices.VariableDatas;
|
|
||||||
if (!allVariables.Any())
|
|
||||||
return;
|
|
||||||
_mqttVariableData.Clear(); // 清空现有数据
|
|
||||||
|
|
||||||
// 遍历所有变量,并根据其关联的MQTT配置进行分组。
|
|
||||||
foreach (var variable in allVariables)
|
|
||||||
{
|
|
||||||
if (variable.Mqtts != null)
|
|
||||||
{
|
|
||||||
foreach (var mqtt in variable.Mqtts)
|
|
||||||
{
|
|
||||||
// 如果字典中没有该MQTT配置的条目,则创建一个新的列表。
|
|
||||||
if (!_mqttVariableData.ContainsKey(mqtt.Id))
|
|
||||||
{
|
{
|
||||||
_mqttVariableData[mqtt.Id] = new List<VariableData>();
|
await client.ConnectAsync(options, CancellationToken.None);
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
NlogHelper.Error($"重新与Mqtt服务器连接失败: {mqtt.Name}", ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// 将变量添加到对应MQTT配置的列表中。
|
// 尝试连接到MQTT代理。
|
||||||
_mqttVariableData[mqtt.Id]
|
client.ConnectAsync(options, CancellationToken.None)
|
||||||
.Add(variable);
|
.GetAwaiter()
|
||||||
}
|
.GetResult();
|
||||||
|
// 将连接成功的客户端添加到字典。
|
||||||
|
_mqttClients[mqtt.Id] = client;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
NotificationHelper.ShowError($"连接MQTT服务器失败: {mqtt.Name} - {ex.Message}", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 处理MQTT列表变化事件的回调方法。
|
/// 处理MQTT列表变化事件的回调方法。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender">事件发送者。</param>
|
/// <param name="sender">事件发送者。</param>
|
||||||
/// <param name="mqtts">更新后的MQTT配置列表。</param>
|
/// <param name="mqtts">更新后的MQTT配置列表。</param>
|
||||||
private async void HandleMqttListChanged( List<Mqtt> mqtts)
|
private async void HandleMqttListChanged(List<Mqtt> mqtts)
|
||||||
{
|
{
|
||||||
NlogHelper.Info("MQTT list changed. Reloading configurations."); // 记录MQTT列表变化信息
|
NlogHelper.Info("Mqtt列表发生了变化,正在重新加载数据..."); // 记录MQTT列表变化信息
|
||||||
// 重新加载MQTT配置和变量数据。
|
// 重新加载MQTT配置和变量数据。
|
||||||
await LoadMqttConfigurations();
|
_reloadEvent.Set();
|
||||||
await LoadVariableData(); // 重新加载变量数据,以防关联发生变化
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ using PMSWPF.Models;
|
|||||||
using PMSWPF.Enums;
|
using PMSWPF.Enums;
|
||||||
using PMSWPF.Helper;
|
using PMSWPF.Helper;
|
||||||
using S7.Net.Types;
|
using S7.Net.Types;
|
||||||
|
using SqlSugar;
|
||||||
using DateTime = System.DateTime;
|
using DateTime = System.DateTime;
|
||||||
|
|
||||||
namespace PMSWPF.Services
|
namespace PMSWPF.Services
|
||||||
@@ -280,6 +281,7 @@ namespace PMSWPF.Services
|
|||||||
int varCount = 0;
|
int varCount = 0;
|
||||||
foreach (var device in _s7Devices)
|
foreach (var device in _s7Devices)
|
||||||
{
|
{
|
||||||
|
device.IsRuning = true;
|
||||||
_deviceDic.Add(device.Id, device);
|
_deviceDic.Add(device.Id, device);
|
||||||
// 过滤出当前设备和S7协议相关的变量。
|
// 过滤出当前设备和S7协议相关的变量。
|
||||||
var s7Variables = device.VariableTables
|
var s7Variables = device.VariableTables
|
||||||
@@ -324,7 +326,12 @@ namespace PMSWPF.Services
|
|||||||
_pollingThread.Interrupt();
|
_pollingThread.Interrupt();
|
||||||
_serviceMainThread.Interrupt();
|
_serviceMainThread.Interrupt();
|
||||||
DisconnectAllPlc();
|
DisconnectAllPlc();
|
||||||
|
|
||||||
|
foreach (Device device in _deviceDic.Values.ToList())
|
||||||
|
{
|
||||||
|
device.IsRuning = false;
|
||||||
|
}
|
||||||
|
// 关闭事件
|
||||||
_reloadEvent.Close();
|
_reloadEvent.Close();
|
||||||
_stopEvent.Reset();
|
_stopEvent.Reset();
|
||||||
_stopEvent.Close();
|
_stopEvent.Close();
|
||||||
|
|||||||
@@ -24,6 +24,18 @@
|
|||||||
Opacity="0.1"
|
Opacity="0.1"
|
||||||
BlurRadius="5" />
|
BlurRadius="5" />
|
||||||
</Border.Effect>
|
</Border.Effect>
|
||||||
|
<Border.Style>
|
||||||
|
<Style TargetType="Border">
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding IsRuning}" Value="True">
|
||||||
|
<Setter Property="Background" Value="Aquamarine"></Setter>
|
||||||
|
</DataTrigger>
|
||||||
|
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</Border.Style>
|
||||||
|
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
@@ -35,7 +47,7 @@
|
|||||||
<DockPanel Grid.Row="0"
|
<DockPanel Grid.Row="0"
|
||||||
Margin="0,0,0,10">
|
Margin="0,0,0,10">
|
||||||
<ui:ToggleSwitch DockPanel.Dock="Right"
|
<ui:ToggleSwitch DockPanel.Dock="Right"
|
||||||
IsOn="{Binding IsRuning}"
|
IsOn="{Binding IsActive}"
|
||||||
OffContent="停止"
|
OffContent="停止"
|
||||||
OnContent="启动" />
|
OnContent="启动" />
|
||||||
<TextBlock Text="{Binding Name}"
|
<TextBlock Text="{Binding Name}"
|
||||||
|
|||||||
Reference in New Issue
Block a user