From e69865a1a3739740201bac8782b721da35d49923 Mon Sep 17 00:00:00 2001
From: patrick.xu <patrick.xu@broconcentric.com>
Date: 星期一, 25 一月 2021 18:45:28 +0800
Subject: [PATCH] 1. gocator添加重试和清理缓存操作 2. gts板卡调整监听频率 3. 记录产品数据使用filsstream避免程序崩溃影响

---
 src/Bro.Device.GTSCard/GTSCardDriver.cs |  549 ++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 369 insertions(+), 180 deletions(-)

diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs
index a917333..a1c7aa6 100644
--- a/src/Bro.Device.GTSCard/GTSCardDriver.cs
+++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -46,6 +46,8 @@
         /// 杩愬姩杞寸珛鍗虫殏鍋�
         /// </summary>
         Dictionary<int, ManualResetEvent> axisImmediatePauseHandleDict = new Dictionary<int, ManualResetEvent>();
+        Dictionary<int, bool> axisImmediatePauseFlag = new Dictionary<int, bool>();
+        Dictionary<int, bool> axisPauseResumeFlag = new Dictionary<int, bool>();
 
         //Dictionary<int, CancellationTokenSource> axisMoveCancelDict = new Dictionary<int, CancellationTokenSource>();
 
@@ -97,6 +99,9 @@
         {
             AllAxisOn();
 
+            MonitorPosition();
+            MonitorAxisStatus();
+
             base.Start();
         }
 
@@ -145,16 +150,22 @@
             {
                 foreach (var preCheck in operationSet.PreCheckIOCollection)
                 {
-                    int timeout = operationSet.PreCheckIOTimeout;
+                    _pauseHandle.Wait();
+
                     IOValue? ioData = null;
-                    while (CurrentState == DeviceState.DSOpen)
+                    if (CurrentState == DeviceState.DSOpen)
                     {
-                        Thread.Sleep(10);
-                        ioData = MonitorValues.FirstOrDefault(u => u.IONum == preCheck.IOItem.IONum && u.IOType == preCheck.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇
-                        timeout -= 10;
-                        if (preCheck.CheckValue == ioData || (operationSet.PreCheckIOTimeout > 0 && timeout < 0))
+                        int timeout = operationSet.PreCheckIOTimeout;
+
+                        while (CurrentState == DeviceState.DSOpen)
                         {
-                            break;
+                            Thread.Sleep(10);
+                            ioData = MonitorValues.FirstOrDefault(u => u.IONum == preCheck.IOItem.IONum && u.IOType == preCheck.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇
+                            timeout -= 10;
+                            if (preCheck.CheckValue == ioData || (operationSet.PreCheckIOTimeout > 0 && timeout < 0))
+                            {
+                                break;
+                            }
                         }
                     }
 
@@ -170,10 +181,15 @@
             // 2.鏉垮崱杩愬姩
             if (CurrentState == DeviceState.DSOpen)
             {
-                responseMessage = MoveToPoint(new MotionOperationCollection() { MovingOps = operationSet.MovingOps });
-                if (!responseMessage.Result)
+                _pauseHandle.Wait();
+
+                if (CurrentState == DeviceState.DSOpen)
                 {
-                    return responseMessage;
+                    responseMessage = MoveToPoint(new MotionOperationCollection() { MovingOps = operationSet.MovingOps });
+                    if (!responseMessage.Result)
+                    {
+                        return responseMessage;
+                    }
                 }
             }
 
@@ -181,18 +197,24 @@
             // 3.IO杈撳嚭 涓嶉渶瑕佽秴鏃�
             if (CurrentState == DeviceState.DSOpen)
             {
+
                 foreach (var ioOutput in operationSet.IOOutputCollection)
                 {
-                    WriteOutput((short)ioOutput.IOItem.IONum, ioOutput.CheckValue);
+                    _pauseHandle.Wait();
 
-                    //var ioData = MonitorValues.FirstOrDefault(u => u.IONum == ioOutput.IOItem.IONum && u.IOType == ioOutput.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇
+                    if (CurrentState == DeviceState.DSOpen)
+                    {
+                        WriteOutput((short)ioOutput.IOItem.IONum, ioOutput.CheckValue);
 
-                    //if (ioOutput.CheckValue != ioData)
-                    //{
-                    //    responseMessage.Result = false;
-                    //    responseMessage.Message = $"IO杈撳嚭涓嶉�氳繃锛岄厤缃細{ioOutput.GetDisplayText()}锛屽綋鍓嶅�硷細{ioData}";
-                    //    return responseMessage;
-                    //}
+                        //var ioData = MonitorValues.FirstOrDefault(u => u.IONum == ioOutput.IOItem.IONum && u.IOType == ioOutput.IOItem.IOType)?.Value;//IO 鏄紑銆佸叧 浠嶮onitorValues 鑾峰彇
+
+                        //if (ioOutput.CheckValue != ioData)
+                        //{
+                        //    responseMessage.Result = false;
+                        //    responseMessage.Message = $"IO杈撳嚭涓嶉�氳繃锛岄厤缃細{ioOutput.GetDisplayText()}锛屽綋鍓嶅�硷細{ioData}";
+                        //    return responseMessage;
+                        //}
+                    }
                 }
             }
 
@@ -228,6 +250,8 @@
         #endregion
 
         #region ImmediatePause
+        ManualResetEventSlim _pauseHandle = new ManualResetEventSlim(true);
+
         /// <summary>
         /// 鍚姩绔嬪嵆鏆傚仠
         /// </summary>
@@ -236,12 +260,11 @@
             if (!_isResetting)
             {
                 var immediatePauseAxis = IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled && a.IsImmediatePause).Select(u => u.AxisIndex).ToList();
-
+                _pauseHandle.Reset();
                 immediatePauseAxis.ForEach(async axisIndex =>
                 {
                     axisImmediatePauseHandleDict[axisIndex].Reset();
-
-                    //axisMoveCancelDict[axisIndex].Cancel();
+                    axisImmediatePauseFlag[axisIndex] = true;
 
                     await MoveStop(axisIndex, 0);//鎵�鏈夎酱閮芥殏鍋�
                 });
@@ -251,15 +274,22 @@
         /// <summary>
         /// 鎭㈠绔嬪嵆鏆傚仠
         /// </summary>
-        public override void ResetImmediatePause()
+        public override void ResetImmediatePause(bool isResumeMoving)
         {
             var immediatePauseAxis = IConfig.AxisSettings.FindAll(a => a.IsAxisEnabled && a.IsImmediatePause).Select(u => u.AxisIndex).ToList();
-
+            _pauseHandle.Set();
             immediatePauseAxis.ForEach(axisIndex =>
             {
-                //axisMoveCancelDict[axisIndex] = new CancellationTokenSource();
-
+                axisImmediatePauseFlag[axisIndex] = false;
                 axisImmediatePauseHandleDict[axisIndex].Set();
+                if (isResumeMoving)
+                {
+                    axisPauseResumeFlag[axisIndex] = true;
+                }
+                else
+                {
+                    axisPauseResumeFlag[axisIndex] = false;
+                }
             });
         }
         #endregion
@@ -281,7 +311,6 @@
                 throw new ProcessException("鏉垮崱杞藉叆閰嶇疆鏂囦欢寮傚父锛岄敊璇爜锛�" + res);
             }
         }
-
 
         public override bool AllAxisOn()
         {
@@ -347,25 +376,17 @@
             ResponseMessage responseMessage = new ResponseMessage();
             if (opConfig is MotionOperationCollection gtsOperationCollection)
             {
-                //List<Task<bool>> taskList = new List<Task<bool>>();
-                //foreach (var movingOp in gtsOperationCollection.MovingOps)
-                //{
-                //    var task = SingleAxisMoving(movingOp);
-                //    taskList.Add(task);
-                //    task.Start();
-                //}
-                //Task.WaitAll(taskList.ToArray());                
-                //responseMessage.Result = taskList.All(u => u.GetAwaiter().GetResult());
-
                 List<bool> resultList = new List<bool>();
                 Parallel.ForEach(gtsOperationCollection.MovingOps, movingOp =>
                 {
+                    axisImmediatePauseFlag[movingOp.AxisIndex] = false;
+                    axisPauseResumeFlag[movingOp.AxisIndex] = true;
                     resultList.Add(SingleAxisMoving(movingOp).Result);
                 });
                 responseMessage.Result = resultList.All(u => u == true);
                 if (!responseMessage.Result)
                 {
-                    responseMessage.Message = $"鐐逛綅杩愬姩寮傚父";
+                    responseMessage.Message = $"鐐逛綅杩愬姩寮傚父,杩愬姩缁撴灉锛歿string.Join(" ", resultList.Select(u => u ? "1" : "0"))}";
                 }
             }
             return responseMessage;
@@ -378,24 +399,28 @@
         /// <returns></returns>
         private bool SetAxisParam(MovingOption optionPara)
         {
-            List<short> resultCode = new List<short>() { 0 };
+            List<short> resultCode = new List<short>();
             GTSCardAPI.TTrapPrm trapprm = new GTSCardAPI.TTrapPrm();
             short axisIndex = short.Parse(optionPara.AxisIndexStr);
             resultCode.Add(GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, axisIndex));
-            resultCode.Add(GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, axisIndex, out trapprm));
-            trapprm.smoothTime = 1;
 
-            if (optionPara.VelocityPara.Acc != 0)
+            if (optionPara.VelocityPara.Acc != 0 || optionPara.VelocityPara.Dec != 0)
             {
-                trapprm.acc = optionPara.VelocityPara.Acc;
-            }
+                resultCode.Add(GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, axisIndex, out trapprm));
+                trapprm.smoothTime = 1;
 
-            if (optionPara.VelocityPara.Dec != 0)
-            {
-                trapprm.dec = optionPara.VelocityPara.Dec;
-            }
+                if (optionPara.VelocityPara.Acc != 0)
+                {
+                    trapprm.acc = optionPara.VelocityPara.Acc;
+                }
 
-            resultCode.Add(GTSCardAPI.GT_SetTrapPrm((short)IConfig.CardNum, axisIndex, ref trapprm));
+                if (optionPara.VelocityPara.Dec != 0)
+                {
+                    trapprm.dec = optionPara.VelocityPara.Dec;
+                }
+
+                resultCode.Add(GTSCardAPI.GT_SetTrapPrm((short)IConfig.CardNum, axisIndex, ref trapprm));
+            }
 
             if (optionPara.VelocityPara.Velocity != 0)
             {
@@ -405,9 +430,10 @@
             var resultOK = resultCode.All(u => u == (short)GTSRetCode.GRCRunOK);
             if (!resultOK)
             {
-                throw new ProcessException("杞�" + optionPara.AxisIndex + "璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛�" + string.Join(",", resultCode));
+                //throw new ProcessException("杞�" + optionPara.AxisIndex + "璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛�" + string.Join(",", resultCode));
+                LogAsync(DateTime.Now, $"杞磠optionPara.AxisIndex}璁剧疆鍙傛暟寮傚父锛岄敊璇爜锛歿string.Join(",", resultCode)}", "");
             }
-            return resultOK;
+            return true;
         }
 
         TaskFactory taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning);
@@ -418,63 +444,64 @@
         public override Task<bool> SingleAxisMoving(MovingOption optionPara)
         {
             return Task.Run(() =>
-             {
-                 axisImmediatePauseHandleDict[optionPara.AxisIndex].WaitOne();
-                 bool isSuccessAndStop = false;
-                 try
-                 {
-                     if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false)
-                     {
-                         // string _position = "";
-                         string motionType = optionPara.MoveMode == EnumHelper.MotionMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString();
+            {
+                bool isSuccessAndStop = false;
+                do
+                {
+                    axisImmediatePauseHandleDict[optionPara.AxisIndex].WaitOne();
 
-                         // _position = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff},{optionPara.AxisIndex},{motionType},{GetPosition(optionPara.AxisIndex)},{GetPrfPosition(optionPara.AxisIndex)},{optionPara.Destination},";
+                    if (axisPauseResumeFlag.ContainsKey(optionPara.AxisIndex) && !axisPauseResumeFlag[optionPara.AxisIndex])
+                        return true;
 
-                         switch (optionPara.MoveMode)
-                         {
-                             case MotionMode.Normal:
-                                 {
-                                     if (_isResetting)
-                                     {
-                                         LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父");
-                                         return false;
-                                     }
+                    try
+                    {
+                        if (IConfig.AxisSettings.FirstOrDefault(a => a.AxisIndex == optionPara.AxisIndex)?.IsAxisEnabled ?? false)
+                        {
+                            string motionType = optionPara.MoveMode == EnumHelper.MotionMode.Normal ? (optionPara.IsAbsolute ? "Abs" : "Rel") : optionPara.MoveMode.ToString();
 
-                                     if (optionPara.IsAbsolute)
-                                     {
-                                         isSuccessAndStop = P2PMoveAbs(optionPara);
-                                     }
-                                     else
-                                     {
-                                         isSuccessAndStop = P2PMoveRel(optionPara);
-                                     }
+                            switch (optionPara.MoveMode)
+                            {
+                                case MotionMode.Normal:
+                                    {
+                                        if (_isResetting)
+                                        {
+                                            LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父");
+                                            return false;
+                                        }
 
-                                 }
-                                 break;
-                             case MotionMode.FindOri:
-                                 {
-                                     //isSuccessAndStop = GoHome(optionPara);  
-                                     isSuccessAndStop = P2PGoHome(optionPara);
-                                 }
-                                 break;
-                             case MotionMode.Jog:
-                                 {
-                                     isSuccessAndStop = JogMove(optionPara);
-                                 }
-                                 break;
-                         }
-                         //_position += $"{GetPosition(optionPara.AxisIndex)},";
-                         //_position += $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}";
-                         //LogAsync(DateTime.Now, "", _position);
-                     }
-                 }
-                 catch (Exception ex)
-                 {
-                     isSuccessAndStop = false;
-                     LogAsync(DateTime.Now, $"杞磠optionPara.AxisIndex}杩愬姩寮傚父", ex.GetExceptionMessage());
-                 }
-                 return isSuccessAndStop;
-             });
+                                        if (optionPara.IsAbsolute)
+                                        {
+                                            isSuccessAndStop = P2PMoveAbs(optionPara);
+                                        }
+                                        //else
+                                        //{
+                                        //    isSuccessAndStop = P2PMoveRel(optionPara);
+                                        //}
+
+                                    }
+                                    break;
+                                case MotionMode.FindOri:
+                                    {
+                                        //isSuccessAndStop = GoHome(optionPara);  
+                                        isSuccessAndStop = P2PGoHome(optionPara);
+                                    }
+                                    break;
+                                case MotionMode.Jog:
+                                    {
+                                        isSuccessAndStop = JogMove(optionPara);
+                                    }
+                                    break;
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        isSuccessAndStop = false;
+                        LogAsync(DateTime.Now, $"杞磠optionPara.AxisIndex}杩愬姩寮傚父", ex.GetExceptionMessage());
+                    }
+                } while (axisImmediatePauseFlag.ContainsKey(optionPara.AxisIndex) && axisImmediatePauseFlag[optionPara.AxisIndex]);
+                return isSuccessAndStop;
+            });
         }
 
         /// <summary>
@@ -503,7 +530,7 @@
         /// <returns></returns>
         public double GetPosition(int axisNum)
         {
-            lock (moveLock)
+            //lock (moveLock)
             {
                 double position = 0;
                 double pPos = 0;
@@ -623,7 +650,9 @@
                 if (CurrentState != EnumHelper.DeviceState.DSOpen)
                 {
                     LogAsync(DateTime.Now, "闈炴甯哥姸鎬佸紓甯�", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�");
-                    throw new ProcessException("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null);
+
+                    return false;
+                    //throw new ProcessException("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null);
                 }
 
                 LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination);
@@ -702,8 +731,11 @@
                 if (CurrentState != EnumHelper.DeviceState.DSOpen)
                 {
                     LogAsync(DateTime.Now, "闈炴甯哥姸鎬佸紓甯�", "杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�");
-                    throw new ProcessException("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null);
+
+                    return false;
+                    //throw new ProcessException("杞�" + optionPara.AxisIndex + "璇曞浘鍦ㄩ潪姝e父鐘舵�佽繍鍔�", null);
                 }
+
                 LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "寮�濮嬭繍鍔�", "鐩爣鍧愭爣锛�" + optionPara.Destination);
                 short ret = 0;
                 bool isSuccessSetAxisParam = false;
@@ -737,7 +769,14 @@
                     repeatTime--;
                 }
 
-                return (ret == (short)GTSRetCode.GRCRunOK) && isStop;
+                if (repeatTime <= 0)
+                {
+                    LogAsync(DateTime.Now, "杞�" + optionPara.AxisIndex + "APS_absolute_move鏈仠姝�", "");
+                    return false;
+                }
+
+                //return (ret == (short)GTSRetCode.GRCRunOK) && isStop;
+                return true;
             }
             catch (Exception ex)
             {
@@ -760,7 +799,8 @@
                 bool isStop = false;
                 if (option == 1)
                 {
-                    StateChange(EnumHelper.DeviceState.DSExcept);
+                    //StateChange(EnumHelper.DeviceState.DSExcept);
+                    LogAsync(DateTime.Now, "鎬ュ仠鍋滄", "");
                 }
                 var ret = GTSCardAPI.GT_Stop((short)IConfig.CardNum, 1 << (axisNum - 1), option);
                 if (ret != (short)GTSRetCode.GRCRunOK)
@@ -868,18 +908,17 @@
         {
             try
             {
-                StartCapture:
+                Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
 
-                PositionReset(movingOption.AxisIndex, 1);
-                ClearStatus(movingOption.AxisIndex, 1);
+                var goHomePara = IConfig.AxisSettings.FirstOrDefault(u => u.AxisIndex == movingOption.AxisIndex).GoHomePara;
+                bool homeDirection = goHomePara.IsHomeDirPositive;
+                bool isRightLimitReached = false;
+                short capture = 0;
 
                 GTSCardAPI.TTrapPrm trapPrm;
-                bool isStop = false;
-                //鎼滅储璺濈 闃舵1
-                // 鍚姩Home鎹曡幏
-                short sRtn = GTSCardAPI.GT_SetCaptureMode((short)IConfig.CardNum, (short)movingOption.AxisIndex, GTSCardAPI.CAPTURE_HOME);
+
                 // 鍒囨崲鍒扮偣浣嶈繍鍔ㄦā寮�
-                sRtn = GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, (short)movingOption.AxisIndex);
+                short sRtn = GTSCardAPI.GT_PrfTrap((short)IConfig.CardNum, (short)movingOption.AxisIndex);
                 // 璇诲彇鐐逛綅妯″紡杩愬姩鍙傛暟
                 sRtn = GTSCardAPI.GT_GetTrapPrm((short)IConfig.CardNum, (short)movingOption.AxisIndex, out trapPrm);
                 trapPrm.acc = movingOption.VelocityPara.Acc;
@@ -887,76 +926,145 @@
                 // 璁剧疆鐐逛綅妯″紡杩愬姩鍙傛暟
                 sRtn = GTSCardAPI.GT_SetTrapPrm((short)IConfig.CardNum, (short)movingOption.AxisIndex, ref trapPrm);
                 // 璁剧疆鐐逛綅妯″紡鐩爣閫熷害锛屽嵆鍥炲師鐐归�熷害
-                sRtn = GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)movingOption.AxisIndex, movingOption.GoHomePara.HighVelocity);
+                sRtn = GTSCardAPI.GT_SetVel((short)IConfig.CardNum, (short)movingOption.AxisIndex, goHomePara.HomeVelocity);
 
-                // 璁剧疆鐐逛綅妯″紡鐩爣浣嶇疆锛屽嵆鍘熺偣鎼滅储璺濈
-                sRtn = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, movingOption.GoHomePara.HomeDir == 1 ? 99999999 : -99999999);
-                // 鍚姩杩愬姩
-                sRtn = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (movingOption.AxisIndex - 1));
-
-                int repeatTime = 1000;
-                short capture;
-                int pos;
-                uint clk;//鏃堕挓鍙傛暟
                 do
                 {
-                    Thread.Sleep(20);
-                    // 璇诲彇鎹曡幏鐘舵��
-                    GTSCardAPI.GT_GetCaptureStatus((short)IConfig.CardNum, (short)movingOption.AxisIndex, out capture, out pos, 1, out clk);
-                    isStop = IsStop((short)movingOption.AxisIndex);
-                    repeatTime--;
-                } while (!(isStop || capture == 1 || repeatTime <= 0));
+                    PositionReset(movingOption.AxisIndex, 1);
+                    ClearStatus(movingOption.AxisIndex, 1);
 
-                if (repeatTime <= 0)
-                {
-                    MoveStop((short)movingOption.AxisIndex, 0);
-                    throw new ProcessException($"杩愬姩杞磠movingOption.AxisIndex} 锛屽洖鍘熺偣瓒呮椂寮傚父");
-                }
+                    //LogAsync(DateTime.Now, $"{Name}浣嶇疆缃浂", "");
 
-                if (isStop && capture != 1)
-                {
-                    ClearStatus((short)movingOption.AxisIndex, 1);
+                    if (goHomePara.IsCaptureMode)
+                    {
+                        //鎼滅储璺濈 闃舵1
+                        // 鍚姩Home鎹曡幏
+                        sRtn = GTSCardAPI.GT_SetCaptureMode((short)IConfig.CardNum, (short)movingOption.AxisIndex, GTSCardAPI.CAPTURE_HOME);
+                    }
+
+                    // 璁剧疆鐐逛綅妯″紡鐩爣浣嶇疆锛屽嵆鍘熺偣鎼滅储璺濈
+                    sRtn = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, homeDirection ? 999999999 : -999999999);
+                    // 鍚姩杩愬姩
+                    sRtn = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (movingOption.AxisIndex - 1));
+
+                    int repeatTime = goHomePara.GoHomeTimeOut * 1000;
+
+                    bool isStop = false;
+                    int pos = 0;
+                    uint clk;//鏃堕挓鍙傛暟
+
+                    int checkInterval = IConfig.MonitorInterval;
+                    if (IConfig.MonitorInterval <= 0)
+                    {
+                        checkInterval = 10;
+                    }
+
+                    do
+                    {
+                        Thread.Sleep(checkInterval);
+
+                        if (goHomePara.IsCaptureMode)
+                        {
+                            // 璇诲彇鎹曡幏鐘舵��
+                            GTSCardAPI.GT_GetCaptureStatus((short)IConfig.CardNum, (short)movingOption.AxisIndex, out capture, out pos, 1, out clk);
+                        }
+                        else
+                        {
+                            GTSCardAPI.GT_GetDi((short)IConfig.CardNum, GTSCardAPI.MC_HOME, out int pValue);
+                            capture = (short)((pValue & (1 << (movingOption.AxisIndex - 1))) == 0 ? 1 : 0);
+                            //LogAsync(DateTime.Now, $"鍘熺偣鐘舵�亄pValue}锛岃酱{movingOption.AxisIndex}鍘熺偣{capture}", "");
+                        }
+                        isStop = IsStop((short)movingOption.AxisIndex);
+                        repeatTime -= checkInterval;
+                    } while (!(isStop || capture == 1 || repeatTime <= 0));
+
+                    if (repeatTime <= 0)
+                    {
+                        MoveStop((short)movingOption.AxisIndex, 0);
+                        throw new ProcessException($"杩愬姩杞磠movingOption.AxisIndex} 锛屽洖鍘熺偣瓒呮椂寮傚父");
+                    }
 
                     var axisStatus = AxisStatusList.FirstOrDefault(u => u.AxisIndex == movingOption.AxisIndex);
 
-                    if (((axisStatus.AxisStatus & 0x20) != 0) || ((axisStatus.AxisStatus & 0x40) != 0))
+                    //if (isStop)
+                    //{
+                    //    LogAsync(DateTime.Now, $"杞磠movingOption.AxisIndex}澶嶄綅涓仠姝�", $"Capture鐘舵�亄capture}");
+                    //}
+
+                    if (isStop && capture != 1)
                     {
-                        movingOption.GoHomePara.HomeDir = (short)(movingOption.GoHomePara.HomeDir == 1 ? -1 : 1);
-                        goto StartCapture;
+                        if (((axisStatus.AxisStatus & 0x20) != 0) || ((axisStatus.AxisStatus & 0x40) != 0))
+                        {
+                            capture = 0;
+
+                            //姝i檺浣�
+                            if ((axisStatus.AxisStatus & 0x20) != 0 && !goHomePara.IsCaptureDirPositive)
+                            {
+                                isRightLimitReached = true;
+                            }
+
+                            //璐熼檺浣�
+                            if ((axisStatus.AxisStatus & 0x40) != 0 && goHomePara.IsCaptureDirPositive)
+                            {
+                                isRightLimitReached = true;
+                            }
+
+                            homeDirection = !homeDirection;
+
+                            LogAsync(DateTime.Now, $"杞磠movingOption.AxisIndex}鏋侀檺浣嶇疆鎹㈠悜", "");
+                        }
+
+                        ClearStatus(movingOption.AxisIndex, 1);
                     }
 
-                    throw new ProcessException($"杩愬姩杞磠movingOption.AxisIndex} 锛屽洖鍘熺偣瓒呮椂寮傚父");
-                }
-
-                if (capture == 1)
-                {
-                    //鍏坰top
-                    MoveStop((short)movingOption.AxisIndex, 0);
-                    ClearStatus((short)movingOption.AxisIndex, 1);
-                    //宸茬粡鎹曡幏鍒癏ome鎵嶅彲浠ュ洖闆� 闃舵2
-                    // 杩愬姩鍒�"鎹曡幏浣嶇疆+鍋忕Щ閲�"
-                    sRtn = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, pos + movingOption.GoHomePara.HomeOffset);
-                    // 鍦ㄨ繍鍔ㄧ姸鎬佷笅鏇存柊鐩爣浣嶇疆
-                    sRtn = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (movingOption.AxisIndex - 1));
-                    isStop = false;
-
-                    repeatTime = 1000;
-                    do
+                    if (capture == 1)
                     {
-                        Thread.Sleep(20);
-                        isStop = IsStop((short)movingOption.AxisIndex);
-                        repeatTime--;
-                    } while (!isStop && repeatTime > 0);
-                    PositionReset(movingOption.AxisIndex, 1);
-                    return (sRtn == (short)GTSRetCode.GRCRunOK) && isStop;
-                }
+                        if (!isRightLimitReached)
+                        {
+                            capture = 0;
+                            ClearStatus(movingOption.AxisIndex, 1);
+                            //GTSCardAPI.GT_SetCaptureMode((short)IConfig.CardNum, (short)movingOption.AxisIndex, GTSCardAPI.CAPTURE_HOME);
+                            continue;
+                        }
+
+                        //鍏坰top
+                        MoveStop((short)movingOption.AxisIndex, 0);
+                        ClearStatus((short)movingOption.AxisIndex, 1);
+
+                        //宸茬粡鎹曡幏鍒癏ome鎵嶅彲浠ュ洖闆� 闃舵2
+                        // 杩愬姩鍒�"鎹曡幏浣嶇疆+鍋忕Щ閲�"
+                        sRtn = GTSCardAPI.GT_SetPos((short)IConfig.CardNum, (short)movingOption.AxisIndex, pos + goHomePara.HomeOffset);
+                        // 鍦ㄨ繍鍔ㄧ姸鎬佷笅鏇存柊鐩爣浣嶇疆
+                        sRtn = GTSCardAPI.GT_Update((short)IConfig.CardNum, 1 << (movingOption.AxisIndex - 1));
+                        isStop = false;
+
+                        repeatTime = 1000;
+                        do
+                        {
+                            Thread.Sleep(20);
+                            isStop = IsStop((short)movingOption.AxisIndex);
+                            repeatTime--;
+                        } while (!isStop && repeatTime > 0);
+                        PositionReset(movingOption.AxisIndex, 1);
+                        LogAsync(DateTime.Now, $"杞磠movingOption.AxisIndex}澶嶄綅瀹屾垚锛屼綅缃竻闆�", "");
+
+                        return (sRtn == (short)GTSRetCode.GRCRunOK) && isStop;
+                    }
+
+                } while (!(capture == 1 && isRightLimitReached));
+
                 return false;
             }
             catch (Exception ex)
             {
+                LogAsync(DateTime.Now, $"{Name}鍥炲師鐐瑰紓甯�", ex.GetExceptionMessage());
                 AllMoveStop(true);
                 OnExceptionOccured?.Invoke(DateTime.Now, ex);
                 return false;
+            }
+            finally
+            { 
+            
             }
         }
 
@@ -1027,7 +1135,7 @@
         /// <returns></returns>
         public override int GetAxisStatus(int axisNum)
         {
-            lock (moveLock)
+            //lock (moveLock)
             {
                 int sts = 0;
                 uint pclock = 0;
@@ -1050,7 +1158,7 @@
         /// <returns></returns>
         public override bool PositionReset(int startAxisIndex, int count)
         {
-            lock (moveLock)
+            //lock (moveLock)
             {
                 var rtn = GTSCardAPI.GT_ZeroPos((short)IConfig.CardNum, (short)startAxisIndex, (short)count);
                 return rtn == (short)GTSRetCode.GRCRunOK;
@@ -1081,7 +1189,6 @@
 
             return axisMovingStatusesList;
         }
-
 
         public List<IOItem> GetMonitorValues()
         {
@@ -1115,6 +1222,82 @@
             return result;
         }
 
+        SpinWait _positionWait = new SpinWait();
+        private async void MonitorPosition()
+        {
+            await Task.Run(() =>
+            {
+                while (CurrentState != EnumHelper.DeviceState.DSClose && CurrentState != EnumHelper.DeviceState.DSExcept && CurrentState != EnumHelper.DeviceState.DSUninit)
+                {
+                    try
+                    {
+                        if (!IConfig.IsEnableMonitor)
+                            return;
+
+                        AxisStatusList.ForEach(a =>
+                        {
+                            int curPosition = (int)GetPrfPosition(a.AxisIndex);
+
+                            if (a.CurPosition != curPosition)
+                            {
+                                a.CurPosition = curPosition;
+                                AxisPositionChanged(a.AxisIndex, curPosition);
+                            }
+                        });
+
+                        Task.Delay(100).Wait();
+
+                        //_positionWait.SpinOnce();
+                    }
+                    catch (Exception ex)
+                    {
+                        if (CurrentState == DeviceState.DSOpen)
+                        {
+                            LogAsync(DateTime.Now, $"{this.Name}鐩戝惉杞翠俊鎭紓甯�", ex.GetExceptionMessage());
+                        }
+                    }
+                }
+            });
+        }
+
+        SpinWait _statusWait = new SpinWait();
+        private async void MonitorAxisStatus()
+        {
+            await Task.Run(() =>
+            {
+                while (CurrentState != EnumHelper.DeviceState.DSClose && CurrentState != EnumHelper.DeviceState.DSExcept && CurrentState != EnumHelper.DeviceState.DSUninit)
+                {
+                    try
+                    {
+                        if (!IConfig.IsEnableMonitor)
+                            return;
+
+                        AxisStatusList.ForEach(a =>
+                        {
+                            int curStatus = GetAxisStatus(a.AxisIndex);
+
+                            if (a.AxisStatus != curStatus)
+                            {
+                                int temp = a.AxisStatus;
+                                a.AxisStatus = curStatus;
+                                AxisStatusChanged(a.AxisIndex, temp, curStatus);
+                            }
+                        });
+
+                        Thread.Sleep(10);
+                        //Task.Delay(10).Wait();
+                    }
+                    catch (Exception ex)
+                    {
+                        if (CurrentState == DeviceState.DSOpen)
+                        {
+                            LogAsync(DateTime.Now, $"{this.Name}鐩戝惉杞翠俊鎭紓甯�", ex.GetExceptionMessage());
+                        }
+                    }
+                }
+            });
+        }
+
         public async override void Monitor()
         {
             await Task.Run(() =>
@@ -1127,9 +1310,9 @@
                             return;
 
                         var newValues = GetMonitorValues();
-                        var newAxisMovingStatus = GetAxisMovingStatus();
+                        //var newAxisMovingStatus = GetAxisMovingStatus();
 
-                        if (newValues == null || newValues.Count == 0 || newAxisMovingStatus == null || newAxisMovingStatus.Count == 0)
+                        if (newValues == null || newValues.Count == 0)
                             continue;
 
                         //Stopwatch sw = new Stopwatch();
@@ -1143,14 +1326,14 @@
                             MonitorCheckAndInvoke(tempNew, tempOld);
                         }
 
-                        if (AxisStatusList.Count == newAxisMovingStatus.Count)
-                        {
-                            var tempNew = new List<AxisMovingStatus>(newAxisMovingStatus);//clone
-                            var tempOld = new List<AxisMovingStatus>(AxisStatusList);
-                            AxisStatusCheck(tempNew, tempOld);
-                        }
+                        //if (AxisStatusList.Count == newAxisMovingStatus.Count)
+                        //{
+                        //    var tempNew = new List<AxisMovingStatus>(newAxisMovingStatus);//clone
+                        //    var tempOld = new List<AxisMovingStatus>(AxisStatusList);
+                        //    AxisStatusCheck(tempNew, tempOld);
+                        //}
 
-                        AxisStatusList = new List<AxisMovingStatus>(newAxisMovingStatus);
+                        //AxisStatusList = new List<AxisMovingStatus>(newAxisMovingStatus);
                         MonitorValues = new List<IOItem>(newValues);
                         //sw.Stop();
 
@@ -1282,10 +1465,16 @@
             int axis_sts;
             var axisSettings = IConfig.AxisSettings.FindAll(u => u.IsAxisEnabled);
             ClearStatus(1, axisSettings.Count);
+
+            if (AxisStatusList.Count == 0)
+            {
+                Thread.Sleep(10);
+            }
+
             foreach (var axisSetting in axisSettings)
             {
                 //axis_sts = GetAxisStatus((short)axisSetting.AxisIndex);
-                axis_sts = AxisStatusList.FirstOrDefault(u => u.AxisIndex == axisSetting.AxisIndex).AxisStatus;
+                axis_sts = AxisStatusList.FirstOrDefault(u => u.AxisIndex == axisSetting.AxisIndex)?.AxisStatus ?? 0;
                 if ((axis_sts & 0x200) == 0)
                 {
                     var rst = GTSCardAPI.GT_AxisOn((short)IConfig.CardNum, (short)axisSetting.AxisIndex);

--
Gitblit v1.8.0