// /************************************************************************ // * @file DeviceLockerManager.cs // * @author Su Liang // * @date 2022/11/18 // * // * @copyright © Sicentury Inc. // * // * @brief 设备锁定控制类。 // * // * @details 系统中的某些设备会被多个模块共同使用,例如Pump2被LoadLock和UnLoad共用,这类设备 // * 无法同时被使用;为提高设备利用率,并解决设备冲突竞争问题,请使用该类对设备进行锁定。 // * // * *****************************************************************************/ using System; using System.Collections.Generic; using System.Threading; using Aitex.Core.Util; using MECF.Framework.RT.EquipmentLibrary.Core.Exceptions; using Sicentury.Core; namespace MECF.Framework.RT.EquipmentLibrary.Core { public class DeviceLockerManager : Singleton { public enum LockerNames { Pump2 } private readonly Dictionary _lockerCollection; public DeviceLockerManager() { _lockerCollection = new Dictionary(); } public void Initialize() { _lockerCollection.Add(LockerNames.Pump2.ToString(), new DeviceLocker(LockerNames.Pump2.ToString(), 1)); } /// /// 获取指定名称的锁。 /// 通常一个锁对应一个设备,系统中可用的锁放在列表中,锁名称使用枚举定义。 /// /// /// public DeviceLocker GetLocker(LockerNames lockerNames) { if (_lockerCollection.ContainsKey(lockerNames.ToString()) == false) return null; return _lockerCollection[lockerNames.ToString()]; } /// /// 锁定指定的设备锁。 /// /// 锁名称 /// 占用者名称,当前锁被谁占用。 /// 锁定失败后的错误信息。 /// 终止等待锁定。 /// 等待锁定的超时时间,超过此时间后如果还未成功锁定,则返回False /// True:锁定成功;False:锁定失败 public DeviceLocker.Results TryLock(string lockerName, string occupier, out string reason, int timeoutMillisecond = 50) { if (_lockerCollection.ContainsKey(lockerName) == false) throw new DeviceLockerNotFoundException(lockerName); var locker = _lockerCollection[lockerName]; return locker.TryLock(occupier, out reason, timeoutMillisecond); } /// /// 锁定指定的设备锁。 /// /// 锁名称 /// 占用者名称,当前锁被谁占用。 /// 锁定失败后的错误信息。 /// 终止等待锁定。 /// 等待锁定的超时时间,超过此时间后如果还未成功锁定,则返回False /// True:锁定成功;False:锁定失败 public DeviceLocker.Results TryLock(LockerNames lockerName, string occupier, out string reason, int timeoutMillisecond = 50) { return TryLock(lockerName.ToString(), occupier, out reason, timeoutMillisecond); } /// /// 解除设备锁定。 /// /// 锁名称 /// 占用者名称,当前锁被谁解锁。 /// 注意:只能解锁被自己锁定的设备锁! /// 解锁失败后的错误信息 /// True:解锁成功;False:解锁失败 public DeviceLocker.Results TryUnLock(string lockerName, string occupier, out string reason) { if (_lockerCollection.ContainsKey(lockerName) == false) throw new DeviceLockerNotFoundException(lockerName); var locker = _lockerCollection[lockerName]; return locker.TryUnlock(occupier, out reason); } /// /// 解除设备锁定。 /// /// 锁名称 /// 占用者名称,当前锁被谁解锁。 /// 注意:只能解锁被自己锁定的设备锁! /// 解锁失败后的错误信息 /// True:解锁成功;False:解锁失败 public DeviceLocker.Results TryUnLock(LockerNames lockerName, string occupier, out string reason) { return TryUnLock(lockerName.ToString(), occupier, out reason); } /// /// 取消等待可用的锁。 /// /// 锁名称 /// public void CancelLockWaiting(string lockerName) { if (_lockerCollection.ContainsKey(lockerName) == false) throw new DeviceLockerNotFoundException(lockerName); var locker = _lockerCollection[lockerName]; locker.CancelLockWaiting(); } /// /// 复位设备锁。 /// /// 锁名称 /// 复位失败原因 /// True:复位成功;False:复位失败 public DeviceLocker.Results Reset(string lockerName, out string reason) { if (_lockerCollection.ContainsKey(lockerName) == false) throw new DeviceLockerNotFoundException(lockerName); reason = ""; var locker = _lockerCollection[lockerName]; locker.Reset(); return DeviceLocker.Results.Ok; } /// /// 复位设备锁。 /// /// 锁名称 /// 复位失败原因 /// True:复位成功;False:复位失败 public DeviceLocker.Results Reset(LockerNames lockerName, out string reason) { return Reset(lockerName.ToString(), out reason); } } }