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 { /// /// 基于 PLC 的安全门实现 | PLC-based Safety Door Implementation /// 信号名称硬编码在 MotionSignalNames 中 | Signal names hardcoded in MotionSignalNames /// public class PlcSafetyDoor : SafetyDoorBase { private readonly ISignalDataService _signalService; private bool _isInterlocked; public PlcSafetyDoor(ISignalDataService signalService) { _signalService = signalService ?? throw new ArgumentNullException(nameof(signalService)); } /// public override bool IsInterlocked => _isInterlocked; /// 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(); } /// public override MotionResult Close() { _signalService.EnqueueWrite(MotionSignalNames.Door_Close, true); _status = DoorStatus.Closing; return MotionResult.Ok(); } /// public override MotionResult Stop() { _signalService.EnqueueWrite(MotionSignalNames.Door_Stop, true); return MotionResult.Ok(); } /// public override void UpdateStatus() { _isInterlocked = _signalService.GetValueByName(MotionSignalNames.Door_Interlock) == 10; var statusValue = _signalService.GetValueByName(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 }; } } }