using Aitex.Core.RT.Routine; using MECF.Framework.Common.Equipment; using CyberX8_Core; using CyberX8_RT.Devices.AXIS; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Modules.SRD { internal class SRDPositionRoutine : ModuleRoutineBase, IRoutine { private enum PositionStep { Position, Wait, End } #region 内部变量 private JetAxisBase _axis; private string _position; private int _timeOut = 6000; #endregion #region 属性 /// /// 当前子状态机 /// public string CurrentStateMachine { get { return Runner.CurrentStep.ToString(); } } #endregion public SRDPositionRoutine(ModuleName module) : base(module) { Name = "GotoPosition"; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(PositionStep.Position, GotoPosition, NullFun, _timeOut) .WaitWithStopCondition(PositionStep.Wait, CheckPositionStatus, CheckPositionRunStop) .End(PositionStep.End, NullFun); return Runner.Status; } public bool GotoPosition() { return _axis.PositionStation(_position); } /// /// 检验移动状态 /// /// private bool CheckPositionStatus() { return _axis.Status == RState.End; } /// /// 检验是否还在运动 /// /// private bool CheckPositionRunStop() { return _axis.Status == RState.Failed; } public RState Start(params object[] objs) { _axis = (JetAxisBase)objs[0]; _position = objs[1].ToString(); Runner.Start(Module, Name); return RState.Running; } } }