1
This commit is contained in:
parent
43534d456f
commit
cdbb1bf474
@ -396,7 +396,7 @@ namespace YunDa.ISAS.Application.GeneralInformation
|
||||
{
|
||||
eventDescription.AppendLine($"更改了设备的生产日期: {deviceBoardCard.ProductionDate} -> {input.ProductionDate}");
|
||||
}
|
||||
boardHistory.EventDescription = eventDescription.ToString();
|
||||
boardHistory.EventDescription = eventDescription.ToString().TrimEnd(',');
|
||||
boardHistory.EventRecordType = EventRecordTypeEnum.Board;
|
||||
boardHistory.Remark = input.Remark;
|
||||
_boardCardHistoryRepository.Insert(boardHistory);
|
||||
@ -807,7 +807,7 @@ namespace YunDa.ISAS.Application.GeneralInformation
|
||||
RecodeDate = DateTime.Now,
|
||||
ContentJson = json,
|
||||
ContentNewJson = newJson,
|
||||
EventDescription = eventDescription.ToString(),
|
||||
EventDescription = eventDescription.ToString().TrimEnd(','),
|
||||
EventRecordType = eventRecordType,
|
||||
SeqNo = deviceBoards.Count > 0 ? deviceBoards.Max(t => t.SeqNo) + 1 : 1,
|
||||
IsSend = false // 默认为未发送,您可以根据需要调整
|
||||
|
@ -394,7 +394,7 @@ namespace YunDa.ISAS.Application.GeneralInformation
|
||||
eventDescription.AppendLine($"更改了设备的生产日期: {protectionDevice.EquipmentInfo.ProductionDate} -> {input.ProductionDate}");
|
||||
}
|
||||
deviceHistory.Name = protectionDevice.Name;
|
||||
deviceHistory.EventDescription = eventDescription.ToString();
|
||||
deviceHistory.EventDescription = eventDescription.ToString().TrimEnd(',');
|
||||
deviceHistory.EventRecordType = EventRecordTypeEnum.Device;
|
||||
deviceHistory.Remark = input.Remark;
|
||||
_protectionDeviceHistoryRepository.Insert(deviceHistory);
|
||||
@ -1271,6 +1271,7 @@ namespace YunDa.ISAS.Application.GeneralInformation
|
||||
}
|
||||
return rst;
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
/// <summary>
|
||||
/// 填充出厂编号
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Abp.Application.Services;
|
||||
using Abp.Auditing;
|
||||
using Abp.Authorization;
|
||||
using Abp.Collections.Extensions;
|
||||
using Abp.Domain.Repositories;
|
||||
@ -9,10 +10,13 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using ToolLibrary.LogHelper;
|
||||
using YunDa.ISAS.Application.Core;
|
||||
using YunDa.ISAS.Application.Core.Session;
|
||||
using YunDa.ISAS.Application.Core.SwaggerHelper;
|
||||
using YunDa.ISAS.DataTransferObject;
|
||||
using YunDa.ISAS.Redis.Repositories;
|
||||
using YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto;
|
||||
using YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport;
|
||||
using YunDa.SOMS.Entities.GeneralInformation;
|
||||
|
||||
@ -25,16 +29,18 @@ namespace YunDa.ISAS.Application.GeneralInformation.ProtectionDevice
|
||||
|
||||
private readonly IRepository<SecondaryCircuitProtectionDevice, Guid> _secondaryCircuitProtectionDeviceRepository;
|
||||
|
||||
|
||||
private readonly IRedisRepository<ProtectionDeviceCommInfoOutput, string> _protectionDeviceCommInfoRedis;
|
||||
public ProtecttionDeviceRedisAppService(ISessionAppService sessionAppService,
|
||||
IRepository<SecondaryCircuit, Guid> secondaryCircuitRepository,
|
||||
IRepository<ProtectionDeviceInfo, Guid> protectionDeviceInfoRepository,
|
||||
IRedisRepository<ProtectionDeviceCommInfoOutput, string> protectionDeviceCommInfoRedis,
|
||||
IRepository<SecondaryCircuitProtectionDevice, Guid> secondaryCircuitProtectionDeviceRepository
|
||||
) : base(sessionAppService)
|
||||
{
|
||||
_protectionDeviceInfoRepository = protectionDeviceInfoRepository;
|
||||
_secondaryCircuitRepository = secondaryCircuitRepository;
|
||||
_secondaryCircuitProtectionDeviceRepository = secondaryCircuitProtectionDeviceRepository;
|
||||
_protectionDeviceCommInfoRedis = protectionDeviceCommInfoRedis;
|
||||
}
|
||||
/// <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;
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,9 @@
|
||||
using System;
|
||||
using MessagePack;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto
|
||||
@ -9,6 +11,7 @@ namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoD
|
||||
/// <summary>
|
||||
/// 保护装置通信地址
|
||||
/// </summary>
|
||||
[MessagePackObject(keyAsPropertyName: true)]
|
||||
public class ProtectionDeviceCommInfoOutput
|
||||
{
|
||||
/// <summary>
|
||||
@ -16,7 +19,6 @@ namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoD
|
||||
/// </summary>
|
||||
public Guid EquipmentInfoId { get; set; }
|
||||
public string EquipmentInfoName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 保护装置id
|
||||
/// </summary>
|
||||
@ -37,6 +39,11 @@ namespace YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoD
|
||||
public string Sntp1 { get; set; }
|
||||
public string Sntp2 { get; set; }
|
||||
public bool IsZY { get; set; }
|
||||
//[MessagePackFormatter(typeof(DateTimeAsUnixTimeFormatter))]
|
||||
[IgnoreMember]
|
||||
[JsonIgnore]
|
||||
public DateTime LastComTime { get; set; }
|
||||
public bool IsOnline { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -15670,6 +15670,16 @@
|
||||
信号类型的枚举
|
||||
</summary>
|
||||
</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">
|
||||
<summary>
|
||||
设备参数信息
|
||||
@ -15700,6 +15710,11 @@
|
||||
板卡信息
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.DeviceTcpData.CommunicationParameters">
|
||||
<summary>
|
||||
通信参数
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:YunDa.SOMS.DataTransferObject.MainStationMaintenanceInfo.OperationReport.AbnormalComponent">
|
||||
<summary>
|
||||
装置自检
|
||||
|
@ -103,6 +103,7 @@ namespace YunDa.ISAS.Redis
|
||||
IocManager.Register<IRedisRepository<List<NameIntValueProperty>, string>, RedisRepository<List<NameIntValueProperty>, string>>();
|
||||
IocManager.Register<IRedisRepository<List<NameValueProperty>, string>, RedisRepository<List<NameValueProperty>, string>>();
|
||||
IocManager.Register<IRedisRepository<DeviceBoardStates, string>, RedisRepository<DeviceBoardStates, string>>();
|
||||
IocManager.Register<IRedisRepository<ProtectionDeviceCommInfoOutput, string>, RedisRepository<ProtectionDeviceCommInfoOutput, string>>();
|
||||
|
||||
|
||||
}
|
||||
|
@ -65,14 +65,13 @@ namespace YunDa.ISAS.Redis.Repositories
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
public event Action<string, TEntity> OnMessageReceived;
|
||||
// 订阅接口,支持模式匹配
|
||||
public void Subscribe(string pattern)
|
||||
|
@ -115,7 +115,6 @@ namespace Yunda.ISAS.DataMonitoringServer.DataAnalysis
|
||||
|
||||
await _protectionDeviceDataCenter.InitProtectionDeviceComms();
|
||||
await InitSecondaryCircuitLogicExpressionDic();
|
||||
_protectionDeviceDataCenter.InitDevices();
|
||||
}
|
||||
_dataCollectionTask.CollectionStart(settingModel, startWebsocket);//开启数据采集
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ using ToolLibrary.LogHelper;
|
||||
using Yunda.ISAS.DataMonitoringServer.DataAnalysis;
|
||||
using Yunda.SOMS.DataMonitoringServer.TcpSocket.Server;
|
||||
using YunDa.ISAS.Redis.Repositories;
|
||||
using YunDa.SOMS.Commdb.Models;
|
||||
using YunDa.SOMS.DataTransferObject.GeneralInformation.ProtectionDeviceInfoDto;
|
||||
namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
|
||||
{
|
||||
@ -25,6 +26,8 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
|
||||
ProtectionDeviceSelfCheckHandle _protectionDeviceSelfCheckHandle;
|
||||
ProtectionDeviceBCodeHandle _protectionDeviceBCodeHandle;
|
||||
IRedisRepository<int[], string> _deviceBoardStatesRedis;
|
||||
IRedisRepository<ProtectionDeviceCommInfoOutput, string> _protectionDeviceCommInfoRedis;
|
||||
|
||||
DotNettyTcpServer _dotNettyTcpServer;
|
||||
string deviceBoardStatesRedisKey = "deviceBoardStates";
|
||||
ConcurrentBag<Process> _processes = new ConcurrentBag<Process>();
|
||||
@ -37,6 +40,7 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
|
||||
, ProtectionDeviceRunInfoHandle protectionDeviceRunInfoHandle
|
||||
,ProtectionDeviceBCodeHandle protectionDeviceBCodeHandle
|
||||
, IRedisRepository<int[], string> deviceBoardStatesRedis
|
||||
, IRedisRepository<ProtectionDeviceCommInfoOutput, string> protectionDeviceCommInfoRedis
|
||||
)
|
||||
{
|
||||
_webApiRequest = webApiRequest;
|
||||
@ -47,44 +51,34 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
|
||||
_protectionDeviceRunInfoHandle = protectionDeviceRunInfoHandle;
|
||||
_deviceBoardStatesRedis = deviceBoardStatesRedis;
|
||||
_protectionDeviceSelfCheckHandle = protectionDeviceSelfCheckHandle;
|
||||
}
|
||||
public void InitDevices()
|
||||
{
|
||||
try
|
||||
{
|
||||
_devices = _webApiRequest.GetProtectionDeviceCommInfos("神池南");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log4Helper.Error(this.GetType(), "初始化装置IO错误", ex);
|
||||
}
|
||||
_protectionDeviceCommInfoRedis = protectionDeviceCommInfoRedis;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public List<ProtectionDeviceCommInfoOutput> ProtectionDeviceComms { get; set; }
|
||||
|
||||
public async Task InitProtectionDeviceComms()
|
||||
{
|
||||
MonitoringEventBus.LogHandler("开始启动103客户端", "装置定值");
|
||||
await Task.Run(async () =>
|
||||
{
|
||||
List<ProtectionDeviceCommInfoOutput> devices = _webApiRequest.GetProtectionDeviceCommInfos("神池南");
|
||||
if (devices == null)
|
||||
_devices = _webApiRequest.GetProtectionDeviceCommInfos("神池南");
|
||||
if (_devices == null)
|
||||
{
|
||||
MonitoringEventBus.LogHandler("没有获取到装置数据", "获取信息");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
_protectionDeviceDZDataHandle.Init(devices);
|
||||
MonitoringEventBus.LogHandler($"共获取{devices.Count}条装置数据", "装置定值");
|
||||
_protectionDeviceDZDataHandle.Init(_devices);
|
||||
MonitoringEventBus.LogHandler($"共获取{_devices.Count}条装置数据", "装置定值");
|
||||
string currentDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
||||
string sourceDirectory = Path.Combine(currentDirectory, "DeviceComm");
|
||||
string destDirectoryBase = Path.Combine(currentDirectory, "DeviceComms", "DeviceComm");
|
||||
|
||||
|
||||
// 定义一个并行处理每个设备的过程
|
||||
Parallel.ForEach(devices, device =>
|
||||
Parallel.ForEach(_devices, device =>
|
||||
{
|
||||
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
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
||||
MonitoringEventBus.LogHandler($"{ex.Message}", "错误信息");
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
string protectionDeviceCommInfoRedisKey = "protectionDeviceCommInfo";
|
||||
_protectionDeviceCommInfoRedis.HashSetUpdateManyAsync(protectionDeviceCommInfoRedisKey, _devices.Select(t => t.DeviceAddr.ToString()).ToList(), _devices);
|
||||
MonitoringEventBus.LogHandler("开始启动TCP服务端", "装置定值");
|
||||
await _dotNettyTcpServer.RunServerAsync();
|
||||
});
|
||||
|
@ -32,11 +32,14 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
|
||||
DotNettyTcpServer _dotNettyTcpServer;
|
||||
private readonly RedisDataRepository _redisDataRepository;
|
||||
private readonly IRedisRepository<DeviceBoardStates, string> _deviceBoardStatesRedis;
|
||||
IRedisRepository<ProtectionDeviceCommInfoOutput, string> _protectionDeviceCommInfoRedis;
|
||||
|
||||
public ProtectionDeviceRunInfoHandle(
|
||||
FtpFile ftpFile,
|
||||
DotNettyTcpServer dotNettyTcpServer,
|
||||
IRedisRepository<DeviceBoardStates, string> redisRepository,
|
||||
WebApiRequest webApiRequest,
|
||||
IRedisRepository<ProtectionDeviceCommInfoOutput, string> protectionDeviceCommInfoRedis,
|
||||
RedisDataRepository redisDataRepository
|
||||
)
|
||||
{
|
||||
@ -46,12 +49,16 @@ namespace Yunda.SOMS.DataMonitoringServer.ProtectionDeviceHandle
|
||||
_redisDataRepository = redisDataRepository;
|
||||
_dotNettyTcpServer.MessageReceived += OnMessageReceived; // 订阅事件
|
||||
_deviceBoardStatesRedis = redisRepository;
|
||||
_protectionDeviceCommInfoRedis = protectionDeviceCommInfoRedis;
|
||||
}
|
||||
//Dictionary<byte, DeviceInfo> _deviceRunStates = new Dictionary<byte, DeviceInfo>();
|
||||
//private ConcurrentDictionary<byte, int> _communicationStateCounts = new();
|
||||
|
||||
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
|
||||
{
|
||||
@ -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++;
|
||||
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user