增加射线源探测器Z轴锁定联动功能,增加对应plc信号和配置。

This commit is contained in:
QI Mingxuan
2026-05-07 20:24:55 +08:00
parent 5e14fe3d9b
commit bb1b76ee7a
17 changed files with 404 additions and 114 deletions
@@ -1,9 +1,10 @@
using System;
using Emgu.CV.Dnn;
using Prism.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows;
using Prism.Events;
using XP.Common.Localization;
using XP.Common.Logging.Interfaces;
using XP.Hardware.MotionControl.Abstractions;
@@ -27,9 +28,10 @@ namespace XP.Hardware.MotionControl.Services
private readonly IEventAggregator _eventAggregator;
private readonly ILoggerService _logger;
private readonly IPlcService _plcService;
private readonly ISignalDataService _signalService;
// 轮询定时器 | Polling timer
private Timer _pollingTimer;
// 轮询定时器 | Polling timer
private Timer _pollingTimer;
private int _pollErrorCount = 0;
/// <summary>
@@ -58,7 +60,8 @@ namespace XP.Hardware.MotionControl.Services
MotionControlConfig config,
IEventAggregator eventAggregator,
ILoggerService logger,
IPlcService plcService)
IPlcService plcService,
ISignalDataService signalService)
{
_motionSystem = motionSystem ?? throw new ArgumentNullException(nameof(motionSystem));
_geometryCalculator = geometryCalculator ?? throw new ArgumentNullException(nameof(geometryCalculator));
@@ -68,7 +71,8 @@ namespace XP.Hardware.MotionControl.Services
_logger = (logger ?? throw new ArgumentNullException(nameof(logger)))
.ForModule<MotionControlService>();
_plcService = plcService ?? throw new ArgumentNullException(nameof(plcService));
}
_signalService = signalService ?? throw new ArgumentNullException(nameof(signalService));
}
#region | Polling Control
@@ -544,6 +548,76 @@ namespace XP.Hardware.MotionControl.Services
#endregion
#region 线Z轴联动 | Source-Detector Z-axis Linkage
/// <summary>
/// 启用/禁用射线源与探测器Z轴联动 | Enable/disable Source-Detector Z-axis linkage
/// </summary>
/// <param name="enabled">true=启用联动,false=禁用联动 | true=enable linkage, false=disable linkage</param>
/// <returns>操作结果 | Operation result</returns>
public MotionResult SetSourceDetectorZLinkage(bool enabled)
{
try
{
var config = _config.SourceDetectorZLinkage;
if (!config.Enabled)
{
_logger.Warn("射线源与探测器Z轴联动未在配置中启用 | Source-Detector Z-axis linkage not enabled in config");
return MotionResult.Fail("射线源与探测器Z轴联动未启用 | Source-Detector Z-axis linkage not enabled");
}
// 写入联动使能信号 | Write linkage enable signal
var result = _signalService.EnqueueWrite(MotionSignalNames.SourceDetZ_Linkage_Enable, (bool)enabled);
if (result)
{
_logger.Info("射线源与探测器Z轴联动已{Enabled} | Source-Detector Z-axis linkage {Enabled}",
enabled ? "启用 | enabled" : "禁用 | disabled");
}
else
{
_logger.Warn("射线源与探测器Z轴联动使能写入失败 | Source-Detector Z-axis linkage enable write failed");
}
return result ? MotionResult.Ok() : MotionResult.Fail("联动使能写入失败 | Linkage enable write failed");
}
catch (Exception ex)
{
_logger.Error(ex, "射线源与探测器Z轴联动设置异常: {Message} | Source-Detector Z-axis linkage setting error: {Message}", ex.Message);
return MotionResult.Fail($"联动设置异常: {ex.Message}");
}
}
/// <summary>
/// 设置虚拟摇杆使能 | Set virtual joystick enable
/// </summary>
/// <param name="enabled">true=启用虚拟摇杆,false=禁用虚拟摇杆 | true=enable virtual joystick, false=disable virtual joystick</param>
/// <returns>操作结果 | Operation result</returns>
public MotionResult SetVirtualJoystickEnable(bool enabled)
{
try
{
var result = _signalService.EnqueueWrite(MotionSignalNames.VirtualJoystick_Enable, (bool)enabled);
if (result)
{
_logger.Info("虚拟摇杆已{Enabled} | Virtual joystick {Enabled}",
enabled ? "启用 | enabled" : "禁用 | disabled");
}
else
{
_logger.Warn("虚拟摇杆使能写入失败 | Virtual joystick enable write failed");
}
return result ? MotionResult.Ok() : MotionResult.Fail("虚拟摇杆使能写入失败 | Virtual joystick enable write failed");
}
catch (Exception ex)
{
_logger.Error(ex, "虚拟摇杆使能设置异常: {Message} | Virtual joystick enable setting error: {Message}", ex.Message);
return MotionResult.Fail($"虚拟摇杆使能设置异常: {ex.Message}");
}
}
#endregion
#region | Safety Door Control
/// <summary>