using Aitex.Core.RT.Device; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Beckhoff.ModuleIO; using MECF.Framework.Common.CommonData.PUF; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Routine; using MECF.Framework.Common.TwinCat; using CyberX8_Core; using CyberX8_RT.Devices.Loader; using CyberX8_RT.Devices.TransPorter; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MECF.Framework.Common.IOCore; namespace CyberX8_RT.Devices.AXIS.CANOpen { public class TransporterLockRoutine : RoutineBase, IRoutine { private enum LockStep { WriteLock, End } #region 常量 private const string UNLOCK = "Unlock"; #endregion #region 内部变量 private int _timeout = 5000; private TransporterCommon _transporterCommon; #endregion /// /// 构造函数 /// /// public TransporterLockRoutine(string module) : base(module) { if (SC.ContainsItem($"Transporter.{module}.LockCheckTime")) { _timeout = SC.GetValue($"Transporter.{module}.LockCheckTime")*1000; } } /// /// 中止 /// public void Abort() { Runner.Stop("Manual Abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(LockStep.WriteLock, WriteLock, CheckLock,_timeout) .End(LockStep.End,NullFun,100); return Runner.Status; } /// /// 写入Lock数值 /// /// private bool WriteLock() { string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{UNLOCK}"); if(!string.IsNullOrEmpty(ioName)) { return IOModuleManager.Instance.WriteIoValue(ioName, false); } else { return false; } } /// /// 检验 Lock状态 /// /// private bool CheckLock() { return _transporterCommon.TransporterData.Locked1 && _transporterCommon.TransporterData.Locked2; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _transporterCommon = DEVICE.GetDevice($"{Module}.Common"); return Runner.Start(Module, "Lock"); } } }