更改配置

This commit is contained in:
quowingwang 2026-01-06 08:49:12 +08:00
parent 58bcebca51
commit a513d58aab
8 changed files with 316 additions and 38 deletions

View File

@ -451,4 +451,8 @@ namespace Infrastructure.Helper
}
#endregion
}
// ===== 新增这两行 =====
public class ThreeColorLightModbus : ModbusTcpClientHelper { }
public class AlarmLightModbus : ModbusTcpClientHelper { }
}

View File

@ -3,6 +3,7 @@ using Infrastructure.Helper;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System.Text.Json.Serialization;
using ZR.Admin.WebApi.AutoMapperProfile;
@ -16,11 +17,12 @@ using ZR.Common.Cache;
using ZR.Common.MqttHelper;
using ZR.Service.mes.andon;
using ZR.Service.mqtt;
using ZR.Service.Utils.MyAlarmLigth;
var builder = WebApplication.CreateBuilder(args);
//后台定时任务
//builder.Services.AddHostedService<ScheduledBackgroundService>();
//builder.Services.AddHostedService<SocketBackgroundService>();
builder.Services.AddHostedService<ScheduledBackgroundService>();
builder.Services.AddHostedService<SocketBackgroundService>();
// Add services to the container.
@ -127,15 +129,36 @@ builder.Services.AddSingleton<SocketGatewayServer>(provider =>
return server;
});
//三色灯网关IP配置
builder.Services.AddSingleton<ModbusTcpClientHelper>(provider =>
builder.Services.AddSingleton<ThreeColorLightModbus>(provider =>
{
var modbus = new ModbusTcpClientHelper();
var modbus = new ThreeColorLightModbus();
modbus.Connect("192.168.1.200", 9999); // 你可以按需修改 IP 和端口
modbus.Connect("192.168.60.200", 9999); // 你可以按需修改 IP 和端口
return modbus;
});
//调漆房报警灯开关IP配置
builder.Services.AddSingleton<AlarmLightModbus>(provider =>
{
var modbus = new AlarmLightModbus();
modbus.Connect("192.168.60.105", 10001); // 你可以按需修改 IP 和端口
return modbus;
});
// 2. 注册调漆房灯控监听类
builder.Services.AddSingleton<TiaoQiFangLight>(provider =>
{
var modbusClient = provider.GetRequiredService<AlarmLightModbus>();
var logger = provider.GetRequiredService<ILogger<TiaoQiFangLight>>();
var lightListener = new TiaoQiFangLight(modbusClient, logger);
// 程序启动时自动启动监听
lightListener.StartListen();
return lightListener;
});
var app = builder.Build();
InternalApp.ServiceProvider = app.Services;
InternalApp.Configuration = builder.Configuration;

View File

@ -3,20 +3,34 @@ using DOAN.ServiceCore.MyMatchPush;
using Infrastructure;
using Infrastructure.Helper;
using Microsoft.Extensions.Logging;
using System.Net.Sockets;
namespace ZR.Admin.WebApi.background
{
public class SocketBackgroundService : BackgroundService
{
private readonly SocketGatewayServer _socketGateway;
private readonly ModbusTcpClientHelper _modbusClient;
//private readonly ModbusTcpClientHelper _modbusClient;
private readonly ILogger<SocketBackgroundService> _logger;
// 直接注入包装类无需IServiceProvider无需命名
private readonly ThreeColorLightModbus _threeColorLightModbus;
private readonly AlarmLightModbus _alarmLightModbus;
public SocketBackgroundService(SocketGatewayServer socketGateway, ILogger<SocketBackgroundService> logger, ModbusTcpClientHelper modbusClient)
//public SocketBackgroundService(SocketGatewayServer socketGateway, ILogger<SocketBackgroundService> logger, ModbusTcpClientHelper modbusClient)
//{
// _socketGateway = socketGateway;
// _logger = logger;
// _modbusClient = modbusClient;
//}
public SocketBackgroundService( SocketGatewayServer socketGateway,ILogger<SocketBackgroundService> logger,
ThreeColorLightModbus threeColorLightModbus, // 三色灯实例
AlarmLightModbus alarmLightModbus) // 调漆房实例
{
_socketGateway = socketGateway;
_logger = logger;
_modbusClient = modbusClient;
_threeColorLightModbus = threeColorLightModbus;
_alarmLightModbus = alarmLightModbus;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
@ -31,6 +45,7 @@ namespace ZR.Admin.WebApi.background
var result = Watchup.StartPush("测试Socket推送功能", _socketGateway, strWatchAddress);
_logger.LogInformation($"Socket推送测试结果: {result}");
//TestLight();
TestTiaoQiIOModel();
}
catch (Exception ex)
{
@ -38,6 +53,55 @@ namespace ZR.Admin.WebApi.background
}
}
/// <summary>
/// 仅测试与调漆房IO模块的通讯连通性
/// </summary>
private void TestTiaoQiIOModel()
{
// 仅保留通用配置IP/端口不再硬编码复用注入的_modbusClient的配置
const byte MODBUS_SLAVE_ID = 0x01; // 从站地址模块默认1
const int TIMEOUT_LOG_THRESHOLD = 2000; // 超时阈值2秒
try
{
var startTime = DateTime.Now;
bool isCommSuccess = false;
// 尝试读取1个离散输入寄存器DI功能码02- 最简指令,不易出错
try
{
//List<ushort> testValues = _modbusClient.ReadInputRegisters(MODBUS_SLAVE_ID, 0x0000, 1);
List<ushort> testValues = _alarmLightModbus.ReadInputRegisters(MODBUS_SLAVE_ID, 0x0000, 1);
var costTime = (DateTime.Now - startTime).TotalMilliseconds;
// 指令返回非空即代表协议层通讯成功
if (testValues != null && testValues.Count == 1)
{
isCommSuccess = true;
_logger.LogInformation($"✅ IO模块通讯通讯测试成功");
}
else
{
_logger.LogError($"❌ 通讯测试失败MODBUS指令返回空/数量不匹配");
}
}
catch (Exception cmdEx)
{
_logger.LogError(cmdEx, $"❌ 通讯测试失败MODBUS指令执行异常");
}
}
catch (SocketException ex)
{
_logger.LogError(ex, $"❌ TCP连接失败IP/端口错误/模块离线/网段不一致");
}
catch (Exception ex)
{
_logger.LogError(ex, $"❌ IO模块通讯测试异常非TCP层面");
}
}
private void TestLight()
{
// 2. 定义要读取的寄存器信息(根据您的表格)
@ -47,7 +111,8 @@ namespace ZR.Admin.WebApi.background
// 3. PLC 下发读指令并获取原始寄存器值列表
Console.WriteLine($"正在读取从站 {UNIT_ID} 的寄存器 {startAddress} 开始的 {numberOfRegisters} 个寄存器...");
List<ushort> registerValues = _modbusClient.ReadHoldingRegisters(UNIT_ID, startAddress, numberOfRegisters);
//List<ushort> registerValues = _modbusClient.ReadHoldingRegisters(UNIT_ID, startAddress, numberOfRegisters);
List<ushort> registerValues = _alarmLightModbus.ReadHoldingRegisters(UNIT_ID, startAddress, numberOfRegisters);
// 4. 解析警灯返回指令(即解析读取到的寄存器值)
if (registerValues.Count == numberOfRegisters)

View File

@ -19,7 +19,7 @@ namespace ZR.Service.Utils.MyAlarmLigth
/// <returns>0 没有解析出来</returns>
/// <returns>其他 解析出来设备站号</returns>
public static ushort ReadAlarmlightNumber(ModbusTcpClientHelper _modbusClient)
public static ushort ReadAlarmlightNumber(ThreeColorLightModbus _modbusClient)
{
// 2. 定义要读取的寄存器信息(根据您的表格)
@ -49,7 +49,7 @@ namespace ZR.Service.Utils.MyAlarmLigth
/// <param name="unitId">警灯站号</param>
/// <param name="startAddress"></param>
/// <param name="commandValues"></param>
public static void WriteAlarmLightCommand_Red(ModbusTcpClientHelper _modbusClient, byte unitId )
public static void WriteAlarmLightCommand_Red(ThreeColorLightModbus _modbusClient, byte unitId )
{
ushort startAddress = 0x0000; // 起始地址,对应
ushort numberOfRegisters = 0x000B; // 要读取的寄存器数量 (40001 到 40012)
@ -66,7 +66,7 @@ namespace ZR.Service.Utils.MyAlarmLigth
/// <param name="unitId">警灯站号</param>
/// <param name="startAddress"></param>
/// <param name="commandValues"></param>
public static void WriteAlarmLightCommand_Yellow(ModbusTcpClientHelper _modbusClient, byte unitId)
public static void WriteAlarmLightCommand_Yellow(ThreeColorLightModbus _modbusClient, byte unitId)
{
ushort startAddress = 0x0000; // 起始地址,对应
ushort numberOfRegisters = 0x000B; // 要读取的寄存器数量 (40001 到 40012)
@ -84,7 +84,7 @@ namespace ZR.Service.Utils.MyAlarmLigth
/// <param name="unitId">警灯站号</param>
/// <param name="startAddress"></param>
/// <param name="commandValues"></param>
public static void WriteAlarmLightCommand_Normal(ModbusTcpClientHelper _modbusClient, byte unitId)
public static void WriteAlarmLightCommand_Normal(ThreeColorLightModbus _modbusClient, byte unitId)
{
ushort startAddress = 0x0000; // 起始地址,对应
ushort numberOfRegisters = 0x000B; // 要读取的寄存器数量 (40001 到 40012)
@ -99,7 +99,7 @@ namespace ZR.Service.Utils.MyAlarmLigth
/// </summary>
/// <param name="_modbusClient">Modbus客户端</param>
/// <param name="unitId">警灯站号(不传则自动读取)</param>
public static void CheckLightOnStatusAndTurnOn(ModbusTcpClientHelper _modbusClient, byte unitId)
public static void CheckLightOnStatusAndTurnOn(ThreeColorLightModbus _modbusClient, byte unitId)
{
ushort startAddress = 0x0000; // 起始地址,对应
ushort numberOfRegisters = 0x000B; // 要读取的寄存器数量 (40001 到 40012)

View File

@ -0,0 +1,168 @@
using Infrastructure.Helper;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace ZR.Service.Utils.MyAlarmLigth
{
/// <summary>
/// 调漆房IO端口监听+灯控类X1-X8监听 → 触发对应灯控方法)
/// </summary>
public class TiaoQiFangLight : IDisposable
{
// 核心配置(仅保留必要参数,对齐测试代码风格)
private const byte MODBUS_SLAVE_ID = 0x01;
private const ushort DI_START_ADDR = 0x0000;
private const int POLLING_INTERVAL_MS = 200;
private const int DI_COUNT = 8;
// 依赖注入(仅保留核心依赖)
private readonly ModbusTcpClientHelper _modbusClient;
private readonly ILogger<TiaoQiFangLight> _logger;
// 状态缓存+监听控制(精简命名)
private readonly bool[] _lastDiState = new bool[DI_COUNT];
private CancellationTokenSource _cts;
private Task _listenTask;
/// <summary>
/// 构造函数(精简参数,日志可选)
/// </summary>
public TiaoQiFangLight(ModbusTcpClientHelper modbusClient, ILogger<TiaoQiFangLight> logger = null)
{
_modbusClient = modbusClient;
_logger = logger;
Array.Fill(_lastDiState, false); // 初始化未按下
}
/// <summary>
/// 启动监听(精简逻辑,无冗余判断)
/// </summary>
public void StartListen()
{
if (_listenTask?.IsCompleted == false)
{
_logger?.LogWarning("调漆房IO监听已启动无需重复执行");
return;
}
_cts = new CancellationTokenSource();
_listenTask = Task.Run(() => ListenDiLoop(_cts.Token), _cts.Token);
_logger?.LogInformation($"✅ 启动X1-X8监听轮询间隔{POLLING_INTERVAL_MS}ms");
}
/// <summary>
/// 停止监听(精简释放逻辑)
/// </summary>
public void StopListen()
{
if (_cts == null) return;
_cts.Cancel();
_listenTask?.Wait(1000);
_logger?.LogInformation("❌ 停止X1-X8监听");
}
/// <summary>
/// 核心轮询监听DI状态精简循环逻辑对齐测试代码异常处理
/// </summary>
private async Task ListenDiLoop(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
try
{
// 1. 读取X1-X8状态对齐测试代码的ReadInputRegisters写法
List<ushort> diValues = _modbusClient.ReadInputRegisters(MODBUS_SLAVE_ID, DI_START_ADDR, DI_COUNT);
// 2. 结果校验(精简判断逻辑)
if (diValues == null || diValues.Count != DI_COUNT)
{
_logger?.LogError($"❌ 读取X1-X8失败返回值数量异常预期{DI_COUNT}个,实际{diValues?.Count ?? 0}个)");
await Task.Delay(POLLING_INTERVAL_MS, cancellationToken);
continue;
}
// 3. 检测状态变化(精简遍历逻辑)
for (int i = 0; i < DI_COUNT; i++)
{
bool isPressed = diValues[i] == 1;
string portName = $"X{i + 1}";
// 仅“从未按下→按下”时触发(精简条件判断)
if (isPressed && !_lastDiState[i])
{
_logger?.LogInformation($"📌 检测到{portName}按下,触发灯控方法");
TriggerLightMethod(i + 1); // X1=1直接传端口号
}
_lastDiState[i] = isPressed; // 更新缓存
}
}
// 分类捕获异常(对齐测试代码的异常分类)
catch (Exception cmdEx)
{
_logger?.LogError(cmdEx, $"❌ 读取DI状态异常");
}
await Task.Delay(POLLING_INTERVAL_MS, cancellationToken);
}
}
/// <summary>
/// 触发灯控方法(精简逻辑,仅保留核心映射)
/// </summary>
private void TriggerLightMethod(int portNumber)
{
byte lightUnitId = 0x01; // 警灯站号可按需替换为ReadAlarmlightNumber
try
{
switch (portNumber)
{
// X1-X4 → 红灯
case 1:
_logger?.LogInformation($"✅ X{portNumber}触发:红灯闪烁");
break;
case 2:
_logger?.LogInformation($"✅ X{portNumber}触发:红灯闪烁");
break;
case 3:
_logger?.LogInformation($"✅ X{portNumber}触发:红灯闪烁");
break;
case 4:
_logger?.LogInformation($"✅ X{portNumber}触发:红灯闪烁");
break;
// X5 → 绿灯
case 5:
_logger?.LogInformation($"✅ X{portNumber}触发:绿灯常亮");
break;
// X6-X8 → 黄灯(精简默认逻辑)
case 6:
_logger?.LogInformation($"✅ X{portNumber}触发:黄灯常亮");
break;
case 7:
_logger?.LogInformation($"✅ X{portNumber}触发:黄灯常亮");
break;
case 8:
_logger?.LogInformation($"✅ X{portNumber}触发:黄灯常亮");
break;
}
}
catch (Exception ex)
{
_logger?.LogError(ex, $"❌ X{portNumber}触发灯控方法失败");
}
}
/// <summary>
/// 释放资源精简Dispose
/// </summary>
public void Dispose()
{
StopListen();
_cts?.Dispose();
}
}
}

View File

@ -4,6 +4,7 @@
<TargetFramework>net7.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Remove="mes\md\MdMaterialReceiptService.cs" />
</ItemGroup>

View File

@ -29,11 +29,18 @@ namespace ZR.Service.mes.andon
private AndonAlarmRecordProcessService andonAlarmRecordProcessService = new AndonAlarmRecordProcessService();
private AndonAlarmTypeDictService andonAlarmTypeDictService = new AndonAlarmTypeDictService();
private SocketGatewayServer _socketGateway = null;
private readonly ModbusTcpClientHelper _modbusClient;
//private readonly ModbusTcpClientHelper _modbusClient;
private readonly ThreeColorLightModbus _modbusClient;
private AndonAlarmAreaLightDicService andonAlarmAreaLightDicService = new AndonAlarmAreaLightDicService();
private AndonAlarmReceiverWatchDicService andonAlarmReceiverWatchDicService = new AndonAlarmReceiverWatchDicService();
public AndonAlarmRecordService(SocketGatewayServer socketGateway, ModbusTcpClientHelper modbusClient)
//public AndonAlarmRecordService(SocketGatewayServer socketGateway, ModbusTcpClientHelper modbusClient)
//{
// _socketGateway = socketGateway;
// _modbusClient = modbusClient;
//}
public AndonAlarmRecordService(SocketGatewayServer socketGateway, ThreeColorLightModbus modbusClient)
{
_socketGateway = socketGateway;
_modbusClient = modbusClient;
@ -637,22 +644,28 @@ namespace ZR.Service.mes.andon
}
public ApiResult InitAlarmLightStates()
{
var lights = andonAlarmAreaLightDicService.GetList();
if (lights.Any())
{
foreach (var item in lights)
{
if (!string.IsNullOrEmpty(item.Lightip))
{
byte bLightIp = Convert.ToByte(item.Lightip);
if (bLightIp != 0)
{
LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, bLightIp);
}
}
}
}
{
//var lights = andonAlarmAreaLightDicService.GetList();
//if (lights.Any())
//{
// foreach (var item in lights)
// {
// if (!string.IsNullOrEmpty(item.Lightip))
// {
// byte bLightIp = Convert.ToByte(item.Lightip);
// if (bLightIp != 0)
// {
// LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, bLightIp);
// }
// }
// }
//}
LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(14));
LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(08));
LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(07));
LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(13));
LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(04));
LightUp.CheckLightOnStatusAndTurnOn(_modbusClient, Convert.ToByte(15));
return ApiResult.Success("处理成功");
}
}

View File

@ -1,4 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using Aliyun.OSS;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
@ -46,11 +47,14 @@ namespace ZR.Service.mes.andon
// 执行报警信息自动超时上报逻辑
var result = alarmService.AlarmReportAuto();
//
if (lightAutoCount < 4)
{
var result2 = alarmService.InitAlarmLightStates();
lightAutoCount++;
}
//if (lightAutoCount < 4)
//if(true)
//{
// var result2 = alarmService.InitAlarmLightStates();
// lightAutoCount++;
//}
var result2 = alarmService.InitAlarmLightStates();
_logger.LogInformation($"定时任务执行完成,结果:{result.Msg}");
}
_logger.LogInformation($"定时任务完成");