From 328d4212fdacd1d6b3a907d680f7b26fb06cf888 Mon Sep 17 00:00:00 2001
From: xcd <834800634@qq.com>
Date: 星期二, 30 六月 2020 16:23:11 +0800
Subject: [PATCH] Merge branch 'master' of http://gitblit.broconcentric.com:8088/r/M071

---
 src/Bro.Device.GTSCard/GTSCardDriver.cs |  321 +++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 222 insertions(+), 99 deletions(-)

diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs
index ffe11a6..e96d00c 100644
--- a/src/Bro.Device.GTSCard/GTSCardDriver.cs
+++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -33,29 +33,6 @@
             }
         }
 
-        static Dictionary<int, object> axisMoveLockDict = new Dictionary<int, object>();
-
-        /// <summary>
-        /// 杞磋繍鍔ㄥ紑濮嬫椂鐨勬娴嬶紝true:鏈夊啿绐� 涓嶅彲缁х画鎵ц false锛氭棤鍐茬獊,鍙户缁墽琛�
-        /// </summary>
-        public event OnAxisStartToCheckDelegate OnAxisStartToCheckConfliction;
-        /// <summary>
-        /// 鏆傚仠锛堢嚎绋嬪悓姝ヤ簨浠讹級
-        /// </summary>
-        Dictionary<int, ManualResetEvent> axisImmediatePauseHandleDict = new Dictionary<int, ManualResetEvent>();
-        Dictionary<int, CancellationTokenSource> axisMoveCancelDict = new Dictionary<int, CancellationTokenSource>();
-        /// <summary>
-        /// 杩愯杩囩▼涓殑绾跨▼绛夊緟
-        /// </summary>
-        private Dictionary<int, ManualResetEvent> runningEventDic = new Dictionary<int, ManualResetEvent>();
-        private Dictionary<int, AutoResetEvent> axisMovingHandleDict = new Dictionary<int, AutoResetEvent>();
-        private ConcurrentDictionary<int, int> axisDestination = new ConcurrentDictionary<int, int>();
-
-        private ObservableCollection<int> _commandAxisList = new ObservableCollection<int>();
-        public Action<bool> CommandAxisCountChangedAction = null;
-        private Dictionary<int, VelocityPara> velIndexDict = new Dictionary<int, VelocityPara>();
-        ManualResetEvent _pauseHandle = new ManualResetEvent(true);
-
         static object moveLock = new object();
         /// <summary>
         /// 鏄惁澶嶄綅鏍囧織
@@ -79,7 +56,6 @@
             InitialMotionCard();
         }
 
-
         protected override void Pause()
         {
             throw new NotImplementedException();
@@ -92,12 +68,13 @@
 
         protected override void Start()
         {
-            throw new NotImplementedException();
+            AllAxisOn();
         }
 
         protected override void Stop()
         {
-            throw new NotImplementedException();
+            AllMoveStop();
+            AllAxisOff();
         }
         #endregion
 
@@ -119,6 +96,60 @@
             }
         }
 
+        public bool AllAxisOn()
+        {
+            List<Task<bool>> taskList = new List<Task<bool>>(); ;
+            // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱寮�鍚�
+            IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum =>
+            {
+                var task = AxisOnAsync((short)IConfig.CardNum, (short)axisNum.AxisIndex);
+                taskList.Add(task);
+            });
+            Task.WaitAll(taskList.ToArray());
+            var resultOK = taskList.All(u => u.GetAwaiter().GetResult());
+            return resultOK;
+        }
+
+        public bool AllAxisOff()
+        {
+            List<Task<bool>> taskList = new List<Task<bool>>(); ;
+            // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱鍏抽棴
+            IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum =>
+            {
+                var task = AxisOffAsync((short)IConfig.CardNum, (short)axisNum.AxisIndex);
+                taskList.Add(task);
+            });
+            Task.WaitAll(taskList.ToArray());
+            var resultOK = taskList.All(u => u.GetAwaiter().GetResult());
+            return resultOK;
+        }
+
+        /// <summary>
+        /// 鍗曚釜杞村紑鍚�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<bool> AxisOnAsync(short cardNum, short axisNum)
+        {
+            return await Task.Run(() =>
+            {
+                var ret = GTSCardAPI.GT_AxisOn(cardNum, axisNum);
+                return ret == (short)GTSRetCode.GRCRunOK;
+            });
+        }
+
+        /// <summary>
+        /// 鍗曚釜杞村叧闂�
+        /// </summary>
+        /// <returns></returns>
+        public async Task<bool> AxisOffAsync(short cardNum, short axisNum)
+        {
+            return await Task.Run(() =>
+            {
+                var ret = GTSCardAPI.GT_AxisOff(cardNum, axisNum);
+                return ret == (short)GTSRetCode.GRCRunOK;
+            });
+        }
+
         /// <summary>
         /// 鐐逛綅鍒扮偣浣嶈繍鍔�
         /// </summary>
@@ -128,22 +159,33 @@
         {
             bool resultOK = false;
             var gtsOperationConfig = opConfig as GTSCardOperationConfig;
+            List<Task<bool>> taskList = new List<Task<bool>>();
+            //TaskFactory factory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);
+            // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱杩愬姩缁撴潫
             foreach (var movingOp in gtsOperationConfig.MovingOps)
             {
-                resultOK = SingleAxisMoving(movingOp);
+                //var task = factory.StartNew<bool>((op) =>
+                //{
+                //    return SingleAxisMoving(op as MovingOption);
+                //}, movingOp);
+                var task = SingleAxisMoving(movingOp);
+                taskList.Add(task);
             }
+            Task.WaitAll(taskList.ToArray());
+            resultOK = taskList.All(u => u.GetAwaiter().GetResult());
+
             return resultOK;
         }
 
         /// <summary>
-        /// Set AxisParam
+        /// 鐐瑰埌鐐硅繍鍔ㄨ缃弬鏁�
         /// </summary>
         /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
         /// <returns></returns>
         private bool SetAxisParam(MovingOption optionPara)
         {
             List<short> resultCode = new List<short>() { 0 };
-            GTSCardAPI.TTrapPrm trapprm;
+            GTSCardAPI.TTrapPrm trapprm = new GTSCardAPI.TTrapPrm();
             resultCode.Add(GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, (short)optionPara.AxisIndex));
             resultCode.Add(GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, (short)optionPara.AxisIndex, out trapprm));
             trapprm.smoothTime = 1;
@@ -162,54 +204,59 @@
         }
 
         /// <summary>
-        /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔�
+        /// 鍗曚釜杞� 杩愬姩(鐐瑰埌鐐� jog 鍥為浂...锛�
         /// </summary>
         /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
-        public bool SingleAxisMoving(MovingOption optionPara)
+        public async Task<bool> SingleAxisMoving(MovingOption optionPara)
         {
-            bool isSuccessAndStop = false;
-            if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false)
+            return await Task.Run(() =>
             {
-                string _position = "";
-                string motionType = optionPara.MoveMode == EnumHelper.MotorMoveMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString();
-
-                _position = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},{optionPara.AxisIndex},{motionType},{GetPosition(optionPara.AxisIndex).ToString()},{GetPrfPosition(optionPara.AxisIndex).ToString()},{optionPara.Destination},";
-
-                switch (optionPara.MoveMode)
+                bool isSuccessAndStop = false;
+                if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false)
                 {
-                    case MotorMoveMode.Normal:
-                        {
-                            if (_isResetting)
+                    string _position = "";
+                    string motionType = optionPara.MoveMode == EnumHelper.MotorMoveMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString();
+
+                    _position = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")},{optionPara.AxisIndex},{motionType},{GetPosition(optionPara.AxisIndex).ToString()},{GetPrfPosition(optionPara.AxisIndex).ToString()},{optionPara.Destination},";
+
+                    switch (optionPara.MoveMode)
+                    {
+                        case MotorMoveMode.Normal:
                             {
-                                LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父");
-                                return false;
-                            }
-                            //璁剧疆 杩愬姩鍙傛暟
-                            var isSuccess = SetAxisParam(optionPara);
-                            if (isSuccess)
-                            {
+                                if (_isResetting)
+                                {
+                                    LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父");
+                                    return false;
+                                }
+
                                 if (optionPara.IsAbsolute)
                                 {
-                                    isSuccessAndStop = MoveAbs(optionPara);
+                                    isSuccessAndStop = P2PMoveAbs(optionPara);
                                 }
                                 else
                                 {
-                                    isSuccessAndStop = MoveRel(optionPara);
+                                    isSuccessAndStop = P2PMoveRel(optionPara);
                                 }
+
                             }
-                        }
-                        break;
-                    case MotorMoveMode.FindOri:
-                        {
-                            isSuccessAndStop = GoHome(optionPara);
-                        }
-                        break;
+                            break;
+                        case MotorMoveMode.FindOri:
+                            {
+                                isSuccessAndStop = GoHome(optionPara);
+                            }
+                            break;
+                        case MotorMoveMode.Jog:
+                            {
+                                isSuccessAndStop = JogMove(optionPara);
+                            }
+                            break;
+                    }
+                    _position += $"{GetPosition(optionPara.AxisIndex)},";
+                    _position += $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}";
+                    LogAsync(DateTime.Now, "", _position);
                 }
-                _position += $"{GetPosition(optionPara.AxisIndex)},";
-                _position += $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}";
-                LogAsync(DateTime.Now, "", _position);
-            }
-            return isSuccessAndStop;
+                return isSuccessAndStop;
+            });
         }
 
         /// <summary>
@@ -262,21 +309,38 @@
         /// <param name="nDirection">Motion Direction 0: Negative, 1: Positive</param>
         /// <param name="nMaxVel">max velocity</param>
         /// <returns></returns>
-        public bool StartJog(int axisNum, int nDirection, int velocity)
+        public bool JogMove(MovingOption optionPara)
         {
-            GTSCardAPI.TJogPrm jogprm = new GTSCardAPI.TJogPrm();
-            short rtn = GTSCardAPI.GT_PrfJog((short)IConfig.CardNum, (short)axisNum);
-            jogprm.acc = 1;
-            jogprm.dec = 1;
-            GTSCardAPI.GT_SetJogPrm((short)IConfig.CardNum, (short)axisNum, ref jogprm);//璁剧疆jog杩愬姩鍙傛暟
-            GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)axisNum, velocity);//璁剧疆鐩爣閫熷害
-            int ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (axisNum - 1));//鏇存柊杞磋繍鍔�
-
-            if (ret != (int)GTSRetCode.GRCRunOK)
+            try
             {
+                GTSCardAPI.TJogPrm jogprm = new GTSCardAPI.TJogPrm();
+                short ret = 0;
+                int repeatTime = 100;
+                do
+                {
+                    ret = GTSCardAPI.GT_PrfJog((short)IConfig.CardNum, (short)optionPara.AxisIndex);
+                    jogprm.acc = optionPara.VelocityPara.Acc;
+                    jogprm.dec = optionPara.VelocityPara.Dec;
+                    ret = GTSCardAPI.GT_SetJogPrm((short)IConfig.CardNum, (short)optionPara.AxisIndex, ref jogprm);//璁剧疆jog杩愬姩鍙傛暟
+                    ret = GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)optionPara.AxisIndex, optionPara.VelocityPara.Velocity);//璁剧疆鐩爣閫熷害
+                    ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//鏇存柊杞磋繍鍔�
+
+                    if (ret != (short)GTSRetCode.GRCRunOK)
+                    {
+                        LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "APS_absolute_move寮傚父", "閿欒鐮侊細" + ret + ";" + "閲嶈瘯娆℃暟锛�" + repeatTime);
+                        Thread.Sleep(50);
+                    }
+                    repeatTime--;
+                } while (ret != (short)GTSRetCode.GRCRunOK && repeatTime > 0);
+                return (ret == (short)GTSRetCode.GRCRunOK);
+            }
+            catch (Exception ex)
+            {
+                AllMoveStop(true);
+                OnExceptionRaised?.Invoke(ex);
                 return false;
             }
-            return true;
+
         }
 
         /// <summary>
@@ -307,7 +371,7 @@
         /// <param name="axisNum">AxisNo</param>
         /// <param name="nDistance">run distance</param>
         /// <returns></returns>
-        public bool MoveRel(MovingOption optionPara)
+        public bool P2PMoveRel(MovingOption optionPara)
         {
             try
             {
@@ -338,11 +402,14 @@
 
                 LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination);
                 short ret = 0;
-                repeatTime = 1000;
+                repeatTime = 100;
+                bool isSuccessSetAxisParam = false;
                 int currentPosition = (int)GetPosition(optionPara.AxisIndex);
                 int dPosition = optionPara.Destination + currentPosition;
                 do
                 {
+                    //璁剧疆 杩愬姩鍙傛暟
+                    isSuccessSetAxisParam = SetAxisParam(optionPara);
                     ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(dPosition * IConfig.AxisVelocityRatio));// 璁剧疆瑙勫垝浣嶇疆
                     ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//鏇存柊杩愬姩
 
@@ -352,7 +419,7 @@
                         Thread.Sleep(50);
                     }
                     repeatTime--;
-                } while (ret != (short)GTSRetCode.GRCRunOK && repeatTime > 0);
+                } while (ret != (short)GTSRetCode.GRCRunOK && !isSuccessSetAxisParam && repeatTime > 0);
 
                 //杩愬姩寮�濮嬪悗 妫�鏌ヨ繍鍔ㄦ槸鍚﹀仠姝�
                 bool isStop = false;
@@ -378,7 +445,7 @@
         ///  缁濆浣嶇疆杩愬姩
         /// </summary>
         /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
-        public bool MoveAbs(MovingOption optionPara)
+        public bool P2PMoveAbs(MovingOption optionPara)
         {
             try
             {
@@ -406,9 +473,12 @@
                 }
                 LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination);
                 short ret = 0;
-                repeatTime = 1000;
+                repeatTime = 100;
+                bool isSuccessSetAxisParam = false;
                 do
                 {
+                    //璁剧疆 杩愬姩鍙傛暟
+                    isSuccessSetAxisParam = SetAxisParam(optionPara);
                     ret = GTSCardAPI.GT_SetPrfPos((short)IConfig.CardNum, (short)optionPara.AxisIndex, (int)(optionPara.Destination * IConfig.AxisVelocityRatio));// 璁剧疆瑙勫垝浣嶇疆
                     ret = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (optionPara.AxisIndex - 1));//鏇存柊杩愬姩
 
@@ -418,7 +488,7 @@
                         Thread.Sleep(50);
                     }
                     repeatTime--;
-                } while (ret != (short)GTSRetCode.GRCRunOK && repeatTime > 0);
+                } while (ret != (short)GTSRetCode.GRCRunOK && !isSuccessSetAxisParam && repeatTime > 0);
 
                 bool isStop = false;
                 repeatTime = 1000;
@@ -445,36 +515,53 @@
         /// <param name="axisNum">axisNo</param>
         /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param>
         /// <returns></returns>
-        public void MoveStop(int axisNum, int option)
+        public async Task<bool> MoveStop(int axisNum, int option)
         {
-            if (option == 1)
+            return await Task.Run(() =>
             {
-                StateChange(EnumHelper.DeviceState.DSExcept);
-            }
-            var ret = GTSCardAPI.GT_Stop((short)IConfig.CardNum, 1 << (axisNum - 1), option);
-            if (ret != (short)GTSRetCode.GRCRunOK)
-            {
-                LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄寮傚父", "閿欒鐮侊細" + ret);
-                throw new Exception("杞�" + axisNum + "杩愬姩鍋滄寮傚父锛岄敊璇爜锛�" + ret);
-            }
-            else
-            {
-                LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄", "");
-            }
+                bool isStop = false;
+                if (option == 1)
+                {
+                    StateChange(EnumHelper.DeviceState.DSExcept);
+                }
+                var ret = GTSCardAPI.GT_Stop((short)IConfig.CardNum, 1 << (axisNum - 1), option);
+                if (ret != (short)GTSRetCode.GRCRunOK)
+                {
+                    LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄寮傚父", "閿欒鐮侊細" + ret);
+                    throw new Exception("杞�" + axisNum + "杩愬姩鍋滄寮傚父锛岄敊璇爜锛�" + ret);
+                }
+                else
+                {
+                    LogAsync(DateTime.Now, "杞�" + axisNum + "杩愬姩鍋滄", "");
+                }
+                int repeatTime = 100;
+                do
+                {
+                    isStop = IsStop((short)IConfig.CardNum, (short)axisNum);
+                    Thread.Sleep(10);
+                    repeatTime--;
+                } while (!isStop && repeatTime > 0);
+
+                return (ret == (short)GTSRetCode.GRCRunOK) && isStop;
+            });
         }
 
         /// <summary>
-        /// 鎵�鏈夊紑鍚殑杞村叧闂�
+        /// 鎵�鏈夊紑鍚殑杞村仠姝�
         /// </summary>
         /// <param name="emergencyStop"></param>
         public void AllMoveStop(bool emergencyStop = false)
         {
             int option = emergencyStop ? 1 : 0;
-
+            List<Task<bool>> taskList = new List<Task<bool>>(); ;
+            // 濡傛灉鏄涓酱鐨勮繍鍔� 绛夋瘡涓酱杩愬姩缁撴潫
             IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ForEach(axisNum =>
             {
-                MoveStop(axisNum.AxisIndex, option);
+                var task = MoveStop(axisNum.AxisIndex, option);
+                taskList.Add(task);
             });
+            Task.WaitAll(taskList.ToArray());
+            var resultOK = taskList.All(u => u.GetAwaiter().GetResult());
         }
 
         /// <summary>
@@ -642,9 +729,45 @@
 
         public void ResetAlarm()
         {
-            throw new NotImplementedException();
-        }
+            int axis_sts;
+            uint clk;
+            var axisSettings = IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled);
+            GTSCardAPI.GT_ClrSts((short)IConfig.CardNum, 1, (short)axisSettings.Count);
+            foreach (var axisSetting in axisSettings)
+            {
+                GTSCardAPI.GT_GetSts((short)IConfig.CardNum, (short)axisSetting.AxisIndex, out axis_sts, 1, out clk);
+                if ((axis_sts & 0x200) == 0)
+                {
+                    var rst = GTSCardAPI.GT_AxisOn((short)IConfig.CardNum, (short)axisSetting.AxisIndex);
+                }
+                // 浣嶇疆璇烽浂
+                GTSCardAPI.GT_ZeroPos((short)IConfig.CardNum, 1, (short)axisSettings.Count);
+                // 姝f瀬闄愭姤璀�
+                if ((axis_sts & 0x20) != 0)
+                {
+                    // 璐熷悜绉诲姩
+                    MovingOption movingOption = new MovingOption();
+                    movingOption.AxisIndex = (short)axisSetting.AxisIndex;
+                    movingOption.Destination = -50; // 璐熷悜绉诲姩
+                    movingOption.VelocityPara.Velocity = 50;
+                    P2PMoveAbs(movingOption);
+                }
 
+                // 璐熸瀬闄愭姤璀�
+                if ((axis_sts & 0x40) != 0)
+                {
+                    // 姝e悜绉诲姩
+                    MovingOption movingOption = new MovingOption();
+                    movingOption.AxisIndex = (short)axisSetting.AxisIndex;
+                    movingOption.Destination = 50; // 璐熷悜绉诲姩
+                    movingOption.VelocityPara.Velocity = 50;
+                    P2PMoveAbs(movingOption);
+                }
+            }
+
+            // 娓呴櫎鐘舵��
+            GTSCardAPI.GT_ClrSts((short)IConfig.CardNum, 1, (short)IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled).Count);
+        }
 
     }
 }

--
Gitblit v1.8.0