将Feature/XP.Common和Feature/XP.Hardware分支合并至Develop/XP.forHardwareAndCommon,完善XPapp注册和相关硬件类库通用类库功能。

This commit is contained in:
QI Mingxuan
2026-04-16 17:31:13 +08:00
parent 6ec4c3ddaa
commit 2bd6e566c3
581 changed files with 74600 additions and 222 deletions
@@ -0,0 +1,68 @@
using System;
using XP.Hardware.MotionControl.Abstractions;
using XP.Hardware.MotionControl.Abstractions.Enums;
using XP.Hardware.MotionControl.Config;
using XP.Hardware.Plc.Abstractions;
namespace XP.Hardware.MotionControl.Implementations
{
/// <summary>
/// 基于 PLC 的安全门实现 | PLC-based Safety Door Implementation
/// 信号名称硬编码在 MotionSignalNames 中 | Signal names hardcoded in MotionSignalNames
/// </summary>
public class PlcSafetyDoor : SafetyDoorBase
{
private readonly ISignalDataService _signalService;
private bool _isInterlocked;
public PlcSafetyDoor(ISignalDataService signalService)
{
_signalService = signalService ?? throw new ArgumentNullException(nameof(signalService));
}
/// <inheritdoc/>
public override bool IsInterlocked => _isInterlocked;
/// <inheritdoc/>
public override MotionResult Open()
{
if (IsInterlocked)
return MotionResult.Fail("联锁信号有效,禁止开门 | Interlock active, door open blocked");
_signalService.EnqueueWrite(MotionSignalNames.Door_Open, true);
_status = DoorStatus.Opening;
return MotionResult.Ok();
}
/// <inheritdoc/>
public override MotionResult Close()
{
_signalService.EnqueueWrite(MotionSignalNames.Door_Close, true);
_status = DoorStatus.Closing;
return MotionResult.Ok();
}
/// <inheritdoc/>
public override MotionResult Stop()
{
_signalService.EnqueueWrite(MotionSignalNames.Door_Stop, true);
return MotionResult.Ok();
}
/// <inheritdoc/>
public override void UpdateStatus()
{
_isInterlocked = _signalService.GetValueByName<byte>(MotionSignalNames.Door_Interlock) == 10;
var statusValue = _signalService.GetValueByName<int>(MotionSignalNames.Door_Status);
_status = statusValue switch
{
1 => DoorStatus.Opening,
2 => DoorStatus.Open,
3 => DoorStatus.Closing,
4 => DoorStatus.Closed,
5 => DoorStatus.Locked,
6 => DoorStatus.Error,
_ => DoorStatus.Unknown
};
}
}
}