Prechádzať zdrojové kódy

改进了TaskToken相关代码,更新IMotionControl接口,完成任务#13(运动控制-电机异常自动恢复)、#17(流程控制升级优化)

Yuli 1 týždeň pred
rodič
commit
3c7f0fb803

+ 55 - 6
SKMC.API/Common/Tasks/TaskToken.cs

@@ -2,23 +2,72 @@
 
 namespace SKMC.Api.Common.Tasks
 {
+    /// <summary>
+    /// 任务执行控制令牌,用于控制线程/工站任务的执行状态
+    /// 主要包含三种控制能力:
+    /// 1. 暂停 / 恢复(Pause / Resume)
+    /// 2. 取消执行(Cancel / Stop)
+    /// 3. 等待执行许可(SetWaitPoint)
+    /// 注意:
+    /// - Pause / Resume 属于可重复状态控制
+    /// - Cancel / Stop 为一次性终止操作,调用后不可恢复
+    /// </summary>
     public class TaskToken
     {
-        public CancellationTokenSource TokenSource { get; set; } = new CancellationTokenSource();
+        public int Id { get; set; }
 
-        public CancellationToken Token { get; set; }
+        public CancellationTokenSource TokenSource { get; set; } = new CancellationTokenSource();
 
         public ManualResetEvent ResetEvent { get; set; } = new ManualResetEvent(true);
 
-        public TaskToken()
+        /// <summary>
+        /// 添加中断点
+        /// </summary>
+        public void SetWaitPoint()
         {
-            Token = TokenSource.Token;
+            ResetEvent.WaitOne();
         }
 
-        public void SetWaitPoint()
+        /// <summary>
+        /// 取消
+        /// </summary>
+        public void Cancel()
         {
-            ResetEvent.WaitOne();
+            TokenSource.Cancel();
+        }
+
+        /// <summary>
+        /// 是否取消
+        /// </summary>
+        /// <returns></returns>
+        public bool IsCancelled()
+        {
+            return TokenSource.IsCancellationRequested;
         }
 
+        /// <summary>
+        /// 暂停
+        /// </summary>
+        public void Pause()
+        {
+            ResetEvent.Reset();
+        }
+
+        /// <summary>
+        /// 恢复
+        /// </summary>
+        public void Resume()
+        {
+            ResetEvent.Set();
+        }
+
+        /// <summary>
+        /// 停止
+        /// </summary>
+        public void Stop()
+        {
+            Cancel();
+            Resume();
+        }
     }
 }

+ 104 - 31
SKMC.API/Common/Tasks/TaskTokener.cs

@@ -2,21 +2,50 @@
 
 namespace SKMC.Api.Common.Tasks
 {
+    /// <summary>
+    /// TaskToken(任务执行控制令牌)容器
+    /// 用于管理多个TaskToken相关的线程执行暂停、恢复、停止
+    /// </summary>
     public class TaskTokener
     {
 
         private static readonly ConcurrentDictionary<int, TaskToken> taskTokens = new ConcurrentDictionary<int, TaskToken>();
 
-        public static void Add(int id)
+        /// <summary>
+        /// 创建一个TaskToken
+        /// </summary>
+        /// <param name="id">TaskToken的Id</param>
+        public static TaskToken Add(int id)
         {
             if (taskTokens.ContainsKey(id))
             {
-                taskTokens.TryRemove(id, out var taskToken);
-                taskToken?.TokenSource.Cancel();
+                taskTokens.TryRemove(id, out var taskTokenGet);
+                taskTokenGet?.Cancel();
             };
-            taskTokens.TryAdd(id, new TaskToken());
+            TaskToken taskTokenNew = new TaskToken { Id = id };
+            bool result = taskTokens.TryAdd(id, taskTokenNew);
+            if (result) return taskTokenNew;
+            return null;
         }
 
+        /// <summary>
+        /// 重新创建所有的TaskToken
+        /// </summary>
+        public static void AddAll()
+        {
+            foreach (int stationId in taskTokens.Keys)
+            {
+                TaskToken taskToken = GetTaskToken(stationId);
+                if (taskToken == null) continue;
+                Add(stationId);
+            }
+        }
+
+        /// <summary>
+        /// 根据Id获取TaskToken
+        /// </summary>
+        /// <param name="id">TaskToken的Id</param>
+        /// <returns></returns>
         public static TaskToken GetTaskToken(int id)
         {
             if (!taskTokens.ContainsKey(id))
@@ -26,29 +55,59 @@ namespace SKMC.Api.Common.Tasks
             return taskTokens[id];
         }
 
-        public static void SetWaitPoint(int id)
+        /// <summary>
+        /// 设置TaskToken中断点(在Stop之前有效)
+        /// </summary>
+        /// <param name="id"></param>
+        public static void SetWaitPoint(int id) => SetWaitPoint(GetTaskToken(id));
+
+        /// <summary>
+        /// 设置TaskToken中断点(在Stop之前有效)
+        /// </summary>
+        /// <param name="taskToken"></param>
+        public static void SetWaitPoint(TaskToken taskToken)
         {
-            TaskToken taskToken = GetTaskToken(id);
             if (taskToken == null) return;
             taskToken.SetWaitPoint();
         }
 
+        /// <summary>
+        /// TaskToken是否已取消/停止
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public static bool IsCancelled(int id) => IsCancelled(GetTaskToken(id));
 
-        public static bool IsCancelled(int id)
+        /// <summary>
+        /// TaskToken是否已取消/停止
+        /// </summary>
+        /// <param name="taskToken"></param>
+        /// <returns></returns>
+        public static bool IsCancelled(TaskToken taskToken)
         {
-            TaskToken taskToken = GetTaskToken(id);
             if (taskToken == null) return true;
-            bool result = taskToken.TokenSource.IsCancellationRequested;
-            return result;
+            return taskToken.IsCancelled();
         }
 
-        public static void Pause(int id)
+        /// <summary>
+        /// 暂停TaskToken
+        /// </summary>
+        /// <param name="id"></param>
+        public static void Pause(int id) => Pause(GetTaskToken(id));
+
+        /// <summary>
+        /// 暂停TaskToken
+        /// </summary>
+        /// <param name="taskToken"></param>
+        public static void Pause(TaskToken taskToken)
         {
-            TaskToken taskToken = GetTaskToken(id);
             if (taskToken == null) return;
-            taskToken.ResetEvent.Reset();
+            taskToken.Pause();
         }
 
+        /// <summary>
+        /// 暂停所有的TaskToken
+        /// </summary>
         public static void PauseAll()
         {
             foreach (int stationId in taskTokens.Keys)
@@ -57,13 +116,25 @@ namespace SKMC.Api.Common.Tasks
             }
         }
 
-        public static void Resume(int id)
+        /// <summary>
+        /// 恢复TaskToken
+        /// </summary>
+        /// <param name="id"></param>
+        public static void Resume(int id) => Resume(GetTaskToken(id));
+
+        /// <summary>
+        /// 恢复TaskToken
+        /// </summary>
+        /// <param name="taskToken"></param>
+        public static void Resume(TaskToken taskToken)
         {
-            TaskToken taskToken = GetTaskToken(id);
             if (taskToken == null) return;
-            taskToken.ResetEvent.Set();
+            taskToken.Resume();
         }
 
+        /// <summary>
+        /// 恢复所有的TaskToken
+        /// </summary>
         public static void ResumeAll()
         {
             foreach (int station in taskTokens.Keys)
@@ -72,30 +143,32 @@ namespace SKMC.Api.Common.Tasks
             }
         }
 
-        public static void Stop(int id)
+        /// <summary>
+        /// 停止TaskToken
+        /// </summary>
+        /// <param name="id"></param>
+        public static void Stop(int id) => Stop(GetTaskToken(id));
+
+        /// <summary>
+        /// 停止TaskToken
+        /// </summary>
+        /// <param name="taskToken"></param>
+        public static void Stop(TaskToken taskToken)
         {
-            TaskToken taskToken = GetTaskToken(id);
             if (taskToken == null) return;
-            taskToken.TokenSource.Cancel();
-            taskToken.ResetEvent.Set();
+            taskToken.Stop();
+            //taskTokens.TryRemove(taskToken.Id, out _);
         }
 
+        /// <summary>
+        /// 停止所有的TaskToken
+        /// </summary>
         public static void StopAll()
         {
             foreach (int stationId in taskTokens.Keys)
             {
                 Stop(stationId);
             }
-        }
-
-        public static void RestoreAll()
-        {
-            foreach (int stationId in taskTokens.Keys)
-            {
-                TaskToken taskToken = GetTaskToken(stationId);
-                if (taskToken == null) continue;
-                Add(stationId);
-            }
-        }
+        }    
     }
 }

+ 45 - 34
SKMC.API/Motion/Control/IMotionControl.cs

@@ -19,7 +19,8 @@ namespace SKMC.Api.Motion.Control
         void Set(string key, int value);
 
         /// <summary>
-        /// 设置流程站点Id,绑定流程站点的中断点
+        /// 设置流程站点Id,绑定流程站点的TaskToken
+        /// 绑定后可实现电机回零、移动完成后自动设置中断点,更及时更方便的完成Station暂停、恢复、停止
         /// </summary>
         /// <param name="stationId"></param>
         void SetStationId(int stationId);
@@ -31,18 +32,6 @@ namespace SKMC.Api.Motion.Control
         /// <returns></returns>
         int Get(string key);
 
-        /// <summary>
-        /// 控制使能, true: motion控制有效,  false: motion控制无效
-        /// 运动过程中如有电机抛出MotionException, 该控制使能自动失效
-        /// </summary>
-        //void Enable(bool enabled = true);
-
-        /// <summary>
-        /// 控制使能是否有效
-        /// </summary>
-        /// <returns></returns>
-        //bool IsEnable();
-
         /// <summary>
         /// 开启所有电机使能
         /// </summary>
@@ -151,9 +140,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="pointCode">点位码</param>
         /// <param name="speedRound">电机每秒旋转圈数</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
-        void MoveRound(string pointCode, double speedRound, bool waiting = true, double inRange = -1, Action onTimeout = null);
+        void MoveRound(string pointCode, double speedRound, bool waiting = true, 
+            bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的(多个)电机以指定速度运动到点位码
@@ -161,9 +152,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="pointCode">点位码</param>
         /// <param name="speedCode">速度码, null表示使用该点配置的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
-        void MovePoint(string pointCode, string speedCode = null, bool waiting = true, double inRange = -1, Action onTimeout = null);
+        void MovePoint(string pointCode, string speedCode = null, bool waiting = true, 
+            bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的(多个)电机以指定速度运动到点位码
@@ -171,9 +164,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="recipePoint">点位对象</param>
         /// <param name="recipeSpeed">速度对象, null表示使用该点配置的默认速度</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
-        void MovePoint(RecipePoint recipePoint, RecipeSpeed recipeSpeed = null, bool waiting = true, double inRange = -1, Action onTimeout = null);
+        void MovePoint(RecipePoint recipePoint, RecipeSpeed recipeSpeed = null, bool waiting = true, 
+            bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的(多个)电机以指定速度运动到点位码
@@ -181,9 +176,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="recipePoint">点位对象</param>
         /// <param name="speedCode">速度码, null表示使用该点配置的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
-        void MovePoint(RecipePoint recipePoint, string speedCode = null, bool waiting = true, double inRange = -1, Action onTimeout = null);
+        void MovePoint(RecipePoint recipePoint, string speedCode = null, bool waiting = true, 
+            bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的(多个)电机以指定速度运动到点位码并能叠加指定偏移量
@@ -192,10 +189,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="posOffsets">各个电机的偏移量数组, 需要按电机绑定顺序赋值</param>
         /// <param name="speedCode">速度码, null表示使用该点配置的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointFix(string pointCode, double[] posOffsets, string speedCode = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的(多个)电机以指定速度运动到点位码,并能叠加指定偏移量
@@ -204,10 +202,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="posOffsets">各个电机的偏移量数组, 需要按电机绑定顺序赋值</param>
         /// <param name="speedCode">速度码, null表示使用该点配置的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointFix(RecipePoint recipePoint, double[] posOffsets, string speedCode = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的(多个)电机以指定速度运动到点位码,并能叠加指定偏移量
@@ -216,10 +215,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="posOffsets">各个电机的偏移量数组, 需要按电机绑定顺序赋值</param>
         /// <param name="recipeSpeed">速度对象, null表示使用该点配置的默认速度</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointFix(RecipePoint recipePoint, double[] posOffsets, RecipeSpeed recipeSpeed = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的指定单个电机以指定速度运动到点位码
@@ -228,10 +228,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="axisCode">指定电机的电机码</param>
         /// <param name="speedCode">速度码, null表示使用该点配置的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointOne(string pointCode, string axisCode, string speedCode = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的指定单个电机以指定速度运动到点位码
@@ -240,10 +241,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="axisCode">指定电机的电机码</param>
         /// <param name="speedCode">速度码, null表示使用该点配置的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointOne(RecipePoint recipePoint, string axisCode, string speedCode = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的指定单个电机以指定速度运动到点位码
@@ -252,10 +254,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="axisCode">指定电机的电机码</param>
         /// <param name="recipeSpeed">速度对象, null表示使用该点配置的默认速度</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointOne(RecipePoint recipePoint, string axisCode, RecipeSpeed recipeSpeed = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的指定单个电机以指定速度运动到点位码,并能叠加指定偏移量
@@ -265,10 +268,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="axisCode">指定电机的电机码</param>
         /// <param name="speedCode">速度码, null表示使用该点配置的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointOneFix(string pointCode, double fixset, string axisCode, string speedCode = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的指定单个电机以指定速度运动到点位码,并能叠加指定偏移量
@@ -278,10 +282,11 @@ namespace SKMC.Api.Motion.Control
         /// <param name="axisCode">指定电机的电机码</param>
         /// <param name="recipeSpeed">速度对象, null表示使用该点配置的默认速度</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointOneFix(RecipePoint recipePoint, double fixset, string axisCode, RecipeSpeed recipeSpeed = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 让绑定点位码的指定单个电机以指定速度运动到点位码,并能叠加指定偏移量
@@ -291,21 +296,23 @@ namespace SKMC.Api.Motion.Control
         /// <param name="axisCode">指定电机的电机码</param>
         /// <param name="speedCode">速度码, null表示使用该点配置的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePointOneFix(RecipePoint recipePoint, double fixset, string axisCode, string speedCode = null,
-            bool waiting = true, double inRange = -1, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 聚合多个点位码并同时运动
         /// </summary>
         /// <param name="recipePoints">需要聚合运动的点位对象集合</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="sync">是否同步到达,false: 使用recipeSpeed的速度,true:以recipeSpeed为基准,调整各点位速度</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePoints(List<RecipePoint> recipePoints, RecipeSpeed recipeSpeed,
-            bool waiting = true, double inRange = -1, bool sync = false, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, bool sync = false, Action onTimeout = null);
 
         /// <summary>
         /// 聚合多个点位码并同时运动
@@ -313,47 +320,52 @@ namespace SKMC.Api.Motion.Control
         /// <param name="pointCodes">需要聚合运动的点位码集合</param>
         /// <param name="speedCode">速度码, null表示使用各点位的默认速度码</param>
         /// <param name="waiting">是否等待到位, 默认为true</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="sync">是否同步到达,false: 使用各自的点位中的速度,true:以speedCode为基准,调整各点位速度</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
         void MovePoints(string[] pointCodes, string speedCode = null,
-            bool waiting = true, double inRange = -1, bool sync = false, Action onTimeout = null);
+            bool waiting = true, bool pausePoint = true, double inRange = -1, bool sync = false, Action onTimeout = null);
 
         /// <summary>
         /// 等待电机运动到位
         /// </summary>
         /// <param name="axisCode">电机码</param>
         /// <param name="timeout">超时时间</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
-        void WaitAxis(string axisCode, int timeout = 10000, double inRange = -1, Action onTimeout = null);
+        void WaitAxis(string axisCode, int timeout = 10000, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 等待电机运动到位
         /// </summary>
         /// <param name="motionAxis">电机对象</param>
         /// <param name="timeout">超时时间</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
-        void WaitAxis(MotionAxis motionAxis, int timeout = 10000, double inRange = -1, Action onTimeout = null);
+        void WaitAxis(MotionAxis motionAxis, int timeout = 10000, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 等待点位上所有电机到位
         /// </summary>
         /// <param name="pointCode">点位码</param>
         /// <param name="timeout">超时时间</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
-        void WaitPoint(string pointCode, int timeout = 10000, double inRange = -1, Action onTimeout = null);
+        void WaitPoint(string pointCode, int timeout = 10000, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 等待点位上所有电机到位
         /// </summary>
         /// <param name="recipePoint">点位对象</param>
         /// <param name="timeout">超时时间</param>
+        /// <param name="pausePoint">到位是否设置暂停点, 默认为true</param>
         /// <param name="inRange">整定范围, 单位毫米或者步距</param>
         /// <param name="onTimeout">超时未完成的回调动作</param>
-        void WaitPoint(RecipePoint recipePoint, int timeout = 10000, double inRange = -1, Action onTimeout = null);
+        void WaitPoint(RecipePoint recipePoint, int timeout = 10000, bool pausePoint = true, double inRange = -1, Action onTimeout = null);
 
         /// <summary>
         /// 等待电机组所有电机到位
@@ -385,8 +397,7 @@ namespace SKMC.Api.Motion.Control
         /// <param name="speedCode">速度码</param>
         /// <param name="distance">距离</param>
         /// <param name="waiting">是否等待</param>
-        void MoveRel(string axisCode, string speedCode, double distance, bool waiting = true);
-
+        void MoveRel(string axisCode, string speedCode, double distance, bool waiting = false);
 
         /// <summary>
         /// 电机绝对运动,确保回零后调用

+ 5 - 8
SKMC.API/Motion/Model/MotionAxis.cs

@@ -102,6 +102,11 @@ namespace SKMC.Api.Motion.Model
         /// </summary>
         public double InRange { get; set; }
 
+        /// <summary>
+        /// 异常时是否可自动恢复(0:不恢复 1:恢复)
+        /// </summary>
+        public short AutoRecovery { get; set; }
+
         /// <summary>
         /// 是否已停止
         /// </summary>
@@ -112,12 +117,6 @@ namespace SKMC.Api.Motion.Model
         /// </summary>
         public bool IsEnabled => _axisSts.IsEnable == 1;
 
-        /// <summary>
-        /// <para>如果该轴出现异常, 是否会中断其他电机与IO控制</para>
-        /// <para>如果需要对该轴出现异常后进行恢复处理, 为不影响到其他电机与IO控制, 这里需要设置为false</para>
-        /// </summary>
-        public bool CanInterruptAll { get; set; } = true;
-
         /// <summary>
         /// 是否已回零
         /// </summary>
@@ -127,7 +126,6 @@ namespace SKMC.Api.Motion.Model
             set => _axisSts.IsHomed = value ? (byte)1 : (byte)0;
         }
 
-
         private string _name;
 
         /// <summary>
@@ -357,7 +355,6 @@ namespace SKMC.Api.Motion.Model
         /// 当前位置是否在偏移量之内
         /// </summary>
         /// <param name="targetVal"></param>
-        /// <param name="offset"></param>
         /// <returns></returns>
         public bool IsEncInRange(double targetVal)
         {