This commit is contained in:
郭睿 2024-12-12 10:25:24 +08:00
parent 43534d456f
commit cdbb1bf474
10 changed files with 125 additions and 35 deletions

View File

@ -396,7 +396,7 @@ namespace YunDa.ISAS.Application.GeneralInformation
{ {
eventDescription.AppendLine($"更改了设备的生产日期: {deviceBoardCard.ProductionDate} -> {input.ProductionDate}"); eventDescription.AppendLine($"更改了设备的生产日期: {deviceBoardCard.ProductionDate} -> {input.ProductionDate}");
} }
boardHistory.EventDescription = eventDescription.ToString(); boardHistory.EventDescription = eventDescription.ToString().TrimEnd(',');
boardHistory.EventRecordType = EventRecordTypeEnum.Board; boardHistory.EventRecordType = EventRecordTypeEnum.Board;
boardHistory.Remark = input.Remark; boardHistory.Remark = input.Remark;
_boardCardHistoryRepository.Insert(boardHistory); _boardCardHistoryRepository.Insert(boardHistory);
@ -807,7 +807,7 @@ namespace YunDa.ISAS.Application.GeneralInformation
RecodeDate = DateTime.Now, RecodeDate = DateTime.Now,
ContentJson = json, ContentJson = json,
ContentNewJson = newJson, ContentNewJson = newJson,
EventDescription = eventDescription.ToString(), EventDescription = eventDescription.ToString().TrimEnd(','),
EventRecordType = eventRecordType, EventRecordType = eventRecordType,
SeqNo = deviceBoards.Count > 0 ? deviceBoards.Max(t => t.SeqNo) + 1 : 1, SeqNo = deviceBoards.Count > 0 ? deviceBoards.Max(t => t.SeqNo) + 1 : 1,
IsSend = false // 默认为未发送,您可以根据需要调整 IsSend = false // 默认为未发送,您可以根据需要调整

View File

@ -394,7 +394,7 @@ namespace YunDa.ISAS.Application.GeneralInformation
eventDescription.AppendLine($"更改了设备的生产日期: {protectionDevice.EquipmentInfo.ProductionDate} -> {input.ProductionDate}"); eventDescription.AppendLine($"更改了设备的生产日期: {protectionDevice.EquipmentInfo.ProductionDate} -> {input.ProductionDate}");
} }
deviceHistory.Name = protectionDevice.Name; deviceHistory.Name = protectionDevice.Name;
deviceHistory.EventDescription = eventDescription.ToString(); deviceHistory.EventDescription = eventDescription.ToString().TrimEnd(',');
deviceHistory.EventRecordType = EventRecordTypeEnum.Device; deviceHistory.EventRecordType = EventRecordTypeEnum.Device;
deviceHistory.Remark = input.Remark; deviceHistory.Remark = input.Remark;
_protectionDeviceHistoryRepository.Insert(deviceHistory); _protectionDeviceHistoryRepository.Insert(deviceHistory);
@ -1271,6 +1271,7 @@ namespace YunDa.ISAS.Application.GeneralInformation
} }
return rst; return rst;
} }
#if DEBUG #if DEBUG
/// <summary> /// <summary>
/// 填充出厂编号 /// 填充出厂编号

View File

@ -1,4 +1,5 @@
using Abp.Application.Services; using Abp.Application.Services;
using Abp.Auditing;
using Abp.Authorization; using Abp.Authorization;
using Abp.Collections.Extensions; using Abp.Collections.Extensions;
using Abp.Domain.Repositories; using Abp.Domain.Repositories;
@ -9,10 +10,13 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using ToolLibrary.LogHelper;
using YunDa.ISAS.Application.Core; using YunDa.ISAS.Application.Core;
using YunDa.ISAS.Application.Core.Session; using YunDa.ISAS.Application.Core.Session;
using YunDa.ISAS.Application.Core.SwaggerHelper; using YunDa.ISAS.Application.Core.SwaggerHelper;
using YunDa.ISAS.DataTransferObject; using YunDa.ISAS.DataTransferObject;
using YunDa.ISAS.Redis.Repositories;
using YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto;
using YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport; using YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport;
using YunDa.SOMS.Entities.GeneralInformation; using YunDa.SOMS.Entities.GeneralInformation;
@ -25,16 +29,18 @@ namespace YunDa.ISAS.Application.GeneralInformation.ProtectionDevice
private readonly IRepository<SecondaryCircuitProtectionDevice, Guid> _secondaryCircuitProtectionDeviceRepository; private readonly IRepository<SecondaryCircuitProtectionDevice, Guid> _secondaryCircuitProtectionDeviceRepository;
private readonly IRedisRepository<ProtectionDeviceCommInfoOutput, string> _protectionDeviceCommInfoRedis;
public ProtecttionDeviceRedisAppService(ISessionAppService sessionAppService, public ProtecttionDeviceRedisAppService(ISessionAppService sessionAppService,
IRepository<SecondaryCircuit, Guid> secondaryCircuitRepository, IRepository<SecondaryCircuit, Guid> secondaryCircuitRepository,
IRepository<ProtectionDeviceInfo, Guid> protectionDeviceInfoRepository, IRepository<ProtectionDeviceInfo, Guid> protectionDeviceInfoRepository,
IRedisRepository<ProtectionDeviceCommInfoOutput, string> protectionDeviceCommInfoRedis,
IRepository<SecondaryCircuitProtectionDevice, Guid> secondaryCircuitProtectionDeviceRepository IRepository<SecondaryCircuitProtectionDevice, Guid> secondaryCircuitProtectionDeviceRepository
) : base(sessionAppService) ) : base(sessionAppService)
{ {
_protectionDeviceInfoRepository = protectionDeviceInfoRepository; _protectionDeviceInfoRepository = protectionDeviceInfoRepository;
_secondaryCircuitRepository = secondaryCircuitRepository; _secondaryCircuitRepository = secondaryCircuitRepository;
_secondaryCircuitProtectionDeviceRepository = secondaryCircuitProtectionDeviceRepository; _secondaryCircuitProtectionDeviceRepository = secondaryCircuitProtectionDeviceRepository;
_protectionDeviceCommInfoRedis = protectionDeviceCommInfoRedis;
} }
/// <summary> /// <summary>
/// 获取装置自检信息 /// 获取装置自检信息
@ -198,6 +204,35 @@ namespace YunDa.ISAS.Application.GeneralInformation.ProtectionDevice
} }
return rst;
}
/// <summary>
/// 查询保护装置在线情况
/// </summary>
/// <param name="stationId"></param>
/// <returns></returns>
[AbpAllowAnonymous]
[HttpGet]
[DisableAuditing]
[ShowApi]
public async Task<RequestResult<List<ProtectionDeviceCommInfoOutput>>> GetProtectionDeviceCommInfoAsync(Guid stationId)
{
string protectionDeviceCommInfoRedisKey = "protectionDeviceCommInfo";
RequestResult<List<ProtectionDeviceCommInfoOutput>> rst = new RequestResult<List<ProtectionDeviceCommInfoOutput>>();
try
{
var datas = await _protectionDeviceCommInfoRedis.HashSetGetAllAsync(protectionDeviceCommInfoRedisKey);
rst.ResultData = datas.ToList();
rst.Flag = true;
}
catch (Exception ex)
{
rst.Message = ex.Message;
Log4Helper.Error(this.GetType(), "查询保护装置在线情况", ex);
}
return rst; return rst;
} }
} }

View File

@ -1,7 +1,9 @@
using System; using MessagePack;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto
@ -9,6 +11,7 @@ namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoD
/// <summary> /// <summary>
/// 保护装置通信地址 /// 保护装置通信地址
/// </summary> /// </summary>
[MessagePackObject(keyAsPropertyName: true)]
public class ProtectionDeviceCommInfoOutput public class ProtectionDeviceCommInfoOutput
{ {
/// <summary> /// <summary>
@ -16,7 +19,6 @@ namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoD
/// </summary> /// </summary>
public Guid EquipmentInfoId { get; set; } public Guid EquipmentInfoId { get; set; }
public string EquipmentInfoName { get; set; } public string EquipmentInfoName { get; set; }
/// <summary> /// <summary>
/// 保护装置id /// 保护装置id
/// </summary> /// </summary>
@ -37,6 +39,11 @@ namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoD
public string Sntp1 { get; set; } public string Sntp1 { get; set; }
public string Sntp2 { get; set; } public string Sntp2 { get; set; }
public bool IsZY { get; set; } public bool IsZY { get; set; }
//[MessagePackFormatter(typeof(DateTimeAsUnixTimeFormatter))]
[IgnoreMember]
[JsonIgnore]
public DateTime LastComTime { get; set; }
public bool IsOnline { get; set; }
} }
} }

View File

@ -15670,6 +15670,16 @@
信号类型的枚举 信号类型的枚举
</summary> </summary>
</member> </member>
<member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.DeviceHistoryChange.DeviceProductionInfo">
<summary>
装置信息
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.DeviceHistoryChange.SoftwareVersionHistoryInfo">
<summary>
基线版本
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.DeviceOperationWarning.DeviceParameterInfo"> <member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.DeviceOperationWarning.DeviceParameterInfo">
<summary> <summary>
设备参数信息 设备参数信息
@ -15700,6 +15710,11 @@
板卡信息 板卡信息
</summary> </summary>
</member> </member>
<member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.DeviceTcpData.CommunicationParameters">
<summary>
通信参数
</summary>
</member>
<member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport.AbnormalComponent"> <member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport.AbnormalComponent">
<summary> <summary>
装置自检 装置自检

View File

@ -103,6 +103,7 @@ namespace YunDa.ISAS.Redis
IocManager.Register<IRedisRepository<List<NameIntValueProperty>, string>, RedisRepository<List<NameIntValueProperty>, string>>(); IocManager.Register<IRedisRepository<List<NameIntValueProperty>, string>, RedisRepository<List<NameIntValueProperty>, string>>();
IocManager.Register<IRedisRepository<List<NameValueProperty>, string>, RedisRepository<List<NameValueProperty>, string>>(); IocManager.Register<IRedisRepository<List<NameValueProperty>, string>, RedisRepository<List<NameValueProperty>, string>>();
IocManager.Register<IRedisRepository<DeviceBoardStates, string>, RedisRepository<DeviceBoardStates, string>>(); IocManager.Register<IRedisRepository<DeviceBoardStates, string>, RedisRepository<DeviceBoardStates, string>>();
IocManager.Register<IRedisRepository<ProtectionDeviceCommInfoOutput, string>, RedisRepository<ProtectionDeviceCommInfoOutput, string>>();
} }

View File

@ -65,14 +65,13 @@ namespace YunDa.ISAS.Redis.Repositories
} }
public async Task<long> PublishAsync(string channel,TEntity entity) public async Task<long> PublishAsync(string channel,TEntity entity)
{ {
//string jsonMessage = JsonSerializer.Serialize(message);
var jsonMessage = GetSerializeObjectString(entity); //序列化
// 显式指定 RedisChannel
var redisChannel = new RedisChannel(channel, RedisChannel.PatternMode.Literal);
var jsonMessage = GetSerializeObjectString(entity); //序列化
var redisChannel = new RedisChannel(channel, RedisChannel.PatternMode.Literal);
// 发布消息 // 发布消息
return await _subscriber.PublishAsync(redisChannel, jsonMessage); return await _subscriber.PublishAsync(redisChannel, jsonMessage);
} }
public event Action<string, TEntity> OnMessageReceived; public event Action<string, TEntity> OnMessageReceived;
// 订阅接口,支持模式匹配 // 订阅接口,支持模式匹配
public void Subscribe(string pattern) public void Subscribe(string pattern)

View File

@ -115,7 +115,6 @@ namespace Yunda.ISAS.DataMonitoringServer.DataAnalysis
await _protectionDeviceDataCenter.InitProtectionDeviceComms(); await _protectionDeviceDataCenter.InitProtectionDeviceComms();
await InitSecondaryCircuitLogicExpressionDic(); await InitSecondaryCircuitLogicExpressionDic();
_protectionDeviceDataCenter.InitDevices();
} }
_dataCollectionTask.CollectionStart(settingModel, startWebsocket);//开启数据采集 _dataCollectionTask.CollectionStart(settingModel, startWebsocket);//开启数据采集
} }

View File

@ -11,6 +11,7 @@ using ToolLibrary.LogHelper;
using Yunda.ISAS.DataMonitoringServer.DataAnalysis; using Yunda.ISAS.DataMonitoringServer.DataAnalysis;
using Yunda.SOMS.DataMonitoringServer.TcpSocket.Server; using Yunda.SOMS.DataMonitoringServer.TcpSocket.Server;
using YunDa.ISAS.Redis.Repositories; using YunDa.ISAS.Redis.Repositories;
using YunDa.SOMS.Commdb.Models;
using YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto; using YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto;
namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
{ {
@ -25,6 +26,8 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
ProtectionDeviceSelfCheckHandle _protectionDeviceSelfCheckHandle; ProtectionDeviceSelfCheckHandle _protectionDeviceSelfCheckHandle;
ProtectionDeviceBCodeHandle _protectionDeviceBCodeHandle; ProtectionDeviceBCodeHandle _protectionDeviceBCodeHandle;
IRedisRepository<int[], string> _deviceBoardStatesRedis; IRedisRepository<int[], string> _deviceBoardStatesRedis;
IRedisRepository<ProtectionDeviceCommInfoOutput, string> _protectionDeviceCommInfoRedis;
DotNettyTcpServer _dotNettyTcpServer; DotNettyTcpServer _dotNettyTcpServer;
string deviceBoardStatesRedisKey = "deviceBoardStates"; string deviceBoardStatesRedisKey = "deviceBoardStates";
ConcurrentBag<Process> _processes = new ConcurrentBag<Process>(); ConcurrentBag<Process> _processes = new ConcurrentBag<Process>();
@ -37,6 +40,7 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
, ProtectionDeviceRunInfoHandle protectionDeviceRunInfoHandle , ProtectionDeviceRunInfoHandle protectionDeviceRunInfoHandle
,ProtectionDeviceBCodeHandle protectionDeviceBCodeHandle ,ProtectionDeviceBCodeHandle protectionDeviceBCodeHandle
, IRedisRepository<int[], string> deviceBoardStatesRedis , IRedisRepository<int[], string> deviceBoardStatesRedis
, IRedisRepository<ProtectionDeviceCommInfoOutput, string> protectionDeviceCommInfoRedis
) )
{ {
_webApiRequest = webApiRequest; _webApiRequest = webApiRequest;
@ -47,44 +51,34 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
_protectionDeviceRunInfoHandle = protectionDeviceRunInfoHandle; _protectionDeviceRunInfoHandle = protectionDeviceRunInfoHandle;
_deviceBoardStatesRedis = deviceBoardStatesRedis; _deviceBoardStatesRedis = deviceBoardStatesRedis;
_protectionDeviceSelfCheckHandle = protectionDeviceSelfCheckHandle; _protectionDeviceSelfCheckHandle = protectionDeviceSelfCheckHandle;
} _protectionDeviceCommInfoRedis = protectionDeviceCommInfoRedis;
public void InitDevices()
{
try
{
_devices = _webApiRequest.GetProtectionDeviceCommInfos("神池南");
}
catch (Exception ex)
{
Log4Helper.Error(this.GetType(), "初始化装置IO错误", ex);
}
} }
public List<ProtectionDeviceCommInfoOutput> ProtectionDeviceComms { get; set; }
public async Task InitProtectionDeviceComms() public async Task InitProtectionDeviceComms()
{ {
MonitoringEventBus.LogHandler("开始启动103客户端", "装置定值"); MonitoringEventBus.LogHandler("开始启动103客户端", "装置定值");
await Task.Run(async () => await Task.Run(async () =>
{ {
List<ProtectionDeviceCommInfoOutput> devices = _webApiRequest.GetProtectionDeviceCommInfos("神池南"); _devices = _webApiRequest.GetProtectionDeviceCommInfos("神池南");
if (devices == null) if (_devices == null)
{ {
MonitoringEventBus.LogHandler("没有获取到装置数据", "获取信息"); MonitoringEventBus.LogHandler("没有获取到装置数据", "获取信息");
return; return;
} }
_protectionDeviceDZDataHandle.Init(devices); _protectionDeviceDZDataHandle.Init(_devices);
MonitoringEventBus.LogHandler($"共获取{devices.Count}条装置数据", "装置定值"); MonitoringEventBus.LogHandler($"共获取{_devices.Count}条装置数据", "装置定值");
string currentDirectory = AppDomain.CurrentDomain.BaseDirectory; string currentDirectory = AppDomain.CurrentDomain.BaseDirectory;
string sourceDirectory = Path.Combine(currentDirectory, "DeviceComm"); string sourceDirectory = Path.Combine(currentDirectory, "DeviceComm");
string destDirectoryBase = Path.Combine(currentDirectory, "DeviceComms", "DeviceComm"); string destDirectoryBase = Path.Combine(currentDirectory, "DeviceComms", "DeviceComm");
// 定义一个并行处理每个设备的过程 // 定义一个并行处理每个设备的过程
Parallel.ForEach(devices, device => Parallel.ForEach(_devices, device =>
{ {
try try
{ {
@ -105,20 +99,36 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
} }
} }
else if(IsDeviceOnline(device.GatewayIP2))
{
string destDirectory = $"{destDirectoryBase}_{device.DeviceAddr}";
CopyDirectory(sourceDirectory, destDirectory);
string configFilePath = Path.Combine(destDirectory, "cfg", "scmgateway.ini");
ModifyDeviceAddrInConfig(configFilePath, device.GatewayIP2, device.DeviceAddr);
string exePath = Path.Combine(destDirectory, "scmgateway.exe");
var process = StartExe(exePath);
if (process != null)
{
MonitoringEventBus.LogHandler($"装置地址:{device.DeviceAddr}ip:{device.GatewayIP2} 启动成功", "装置定值");
_processes.Add(process);
}
}
else else
{ {
MonitoringEventBus.LogHandler($"装置地址:{device.DeviceAddr}ip:{device.GatewayIP1} {(online ? "线" : "线")}", "装置定值"); device.IsOnline = false;
MonitoringEventBus.LogHandler($"装置地址:{device.DeviceAddr}ip1:{device.GatewayIP1}ip2:{device.GatewayIP2} {(online ? "线" : "线")}", "装置状态");
} }
device.IsOnline = true;
} }
catch (Exception ex) catch (Exception ex)
{ {
MonitoringEventBus.LogHandler($"{ex.Message}", "错误信息"); MonitoringEventBus.LogHandler($"{ex.Message}", "错误信息");
} }
}); });
string protectionDeviceCommInfoRedisKey = "protectionDeviceCommInfo";
_protectionDeviceCommInfoRedis.HashSetUpdateManyAsync(protectionDeviceCommInfoRedisKey, _devices.Select(t => t.DeviceAddr.ToString()).ToList(), _devices);
MonitoringEventBus.LogHandler("开始启动TCP服务端", "装置定值"); MonitoringEventBus.LogHandler("开始启动TCP服务端", "装置定值");
await _dotNettyTcpServer.RunServerAsync(); await _dotNettyTcpServer.RunServerAsync();
}); });

View File

@ -32,11 +32,14 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
DotNettyTcpServer _dotNettyTcpServer; DotNettyTcpServer _dotNettyTcpServer;
private readonly RedisDataRepository _redisDataRepository; private readonly RedisDataRepository _redisDataRepository;
private readonly IRedisRepository<DeviceBoardStates, string> _deviceBoardStatesRedis; private readonly IRedisRepository<DeviceBoardStates, string> _deviceBoardStatesRedis;
IRedisRepository<ProtectionDeviceCommInfoOutput, string> _protectionDeviceCommInfoRedis;
public ProtectionDeviceRunInfoHandle( public ProtectionDeviceRunInfoHandle(
FtpFile ftpFile, FtpFile ftpFile,
DotNettyTcpServer dotNettyTcpServer, DotNettyTcpServer dotNettyTcpServer,
IRedisRepository<DeviceBoardStates, string> redisRepository, IRedisRepository<DeviceBoardStates, string> redisRepository,
WebApiRequest webApiRequest, WebApiRequest webApiRequest,
IRedisRepository<ProtectionDeviceCommInfoOutput, string> protectionDeviceCommInfoRedis,
RedisDataRepository redisDataRepository RedisDataRepository redisDataRepository
) )
{ {
@ -46,12 +49,16 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
_redisDataRepository = redisDataRepository; _redisDataRepository = redisDataRepository;
_dotNettyTcpServer.MessageReceived += OnMessageReceived; // 订阅事件 _dotNettyTcpServer.MessageReceived += OnMessageReceived; // 订阅事件
_deviceBoardStatesRedis = redisRepository; _deviceBoardStatesRedis = redisRepository;
_protectionDeviceCommInfoRedis = protectionDeviceCommInfoRedis;
} }
//Dictionary<byte, DeviceInfo> _deviceRunStates = new Dictionary<byte, DeviceInfo>(); //Dictionary<byte, DeviceInfo> _deviceRunStates = new Dictionary<byte, DeviceInfo>();
//private ConcurrentDictionary<byte, int> _communicationStateCounts = new(); //private ConcurrentDictionary<byte, int> _communicationStateCounts = new();
int _commCount = 0; int _commCount = 0;
private void OnMessageReceived(byte address, byte[] message, byte functionType) string protectionDeviceCommInfoRedisKey = "protectionDeviceCommInfo";
string protectionDeviceCommInfoRedisChannel = "protectionDeviceCommInfosChannel";
private async void OnMessageReceived(byte address, byte[] message, byte functionType)
{ {
try try
{ {
@ -79,6 +86,13 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
} }
} }
} }
device.LastComTime = DateTime.Now;
if (!device.IsOnline)
{
await _protectionDeviceCommInfoRedis.HashSetUpdateOneAsync(protectionDeviceCommInfoRedisKey, device.DeviceAddr.ToString(), device);
await _protectionDeviceCommInfoRedis.PublishAsync(protectionDeviceCommInfoRedisChannel, device);
}
device.IsOnline = true;
} }
_commCount++; _commCount++;
@ -88,6 +102,15 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
} }
} }
foreach (var item in ProtectionDeviceDataCenter._devices)
{
if (DateTime.Now - item.LastComTime>TimeSpan.FromSeconds(30)&& item.IsOnline)
{
item.IsOnline = false;
await _protectionDeviceCommInfoRedis.HashSetUpdateOneAsync(protectionDeviceCommInfoRedisKey, item.DeviceAddr.ToString(), item);
await _protectionDeviceCommInfoRedis.PublishAsync(protectionDeviceCommInfoRedisChannel, item);
}
}
} }
catch (Exception ex) catch (Exception ex)
{ {