From 3f6a707f2373cfcee7e96c080a01ac1a4964a419 Mon Sep 17 00:00:00 2001
From: wells.liu <wells.liu@broconcentric.com>
Date: 星期四, 02 七月 2020 20:54:55 +0800
Subject: [PATCH] 解决 生成新配置问题

---
 src/Bro.Device.GTSCard/GTSCardDriver.cs |  543 +++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 414 insertions(+), 129 deletions(-)

diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs
index d4eea2e..de90301 100644
--- a/src/Bro.Device.GTSCard/GTSCardDriver.cs
+++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs
@@ -6,7 +6,9 @@
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
+using System.Diagnostics;
 using System.Drawing;
+using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading;
@@ -16,12 +18,8 @@
 namespace Bro.Device.GTSCard
 {
     [Device("GTSCard", "鍥洪珮鏉垮崱", EnumHelper.DeviceAttributeType.Device)]
-    public class GTSCardDriver : DeviceBase, IMonitor, IMotion
+    public class GTSCardDriver : MotionCardBase
     {
-        public event Action<DateTime, string, IDevice, MonitorSet> OnMonitorInvoke;
-        public event Action<DateTime, IDevice, WarningSet> OnMonitorAlarm;
-
-        public delegate bool OnAxisStartToCheckDelegate(int axisIndex, int startPosition, int endPosition);
         // 寮傚父浜嬩欢
         public Action<Exception> OnExceptionRaised;
 
@@ -44,7 +42,7 @@
             _isResetting = isReset;
         }
 
-        public List<AxisInfo> GetCurrentAxisInfo(params string[] axisName)
+        public override List<AxisInfo> GetCurrentAxisInfo(params string[] axisName)
         {
             throw new NotImplementedException();
         }
@@ -68,10 +66,16 @@
 
         protected override void Start()
         {
-            throw new NotImplementedException();
+            AllAxisOn();
         }
 
         protected override void Stop()
+        {
+            AllMoveStop();
+            AllAxisOff();
+        }
+
+        public override ResponseMessage Run(IOperationConfig config)
         {
             throw new NotImplementedException();
         }
@@ -95,12 +99,67 @@
             }
         }
 
+
+        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>
         /// <param name="item">杩愬姩瀵硅薄</param>
         /// <returns>杩愬姩鎺у埗+鍋滄鍒ゆ柇</returns>
-        public bool MoveToPoint(IOperationConfig opConfig)
+        public override ResponseMessage MoveToPoint(IOperationConfig opConfig)
         {
             bool resultOK = false;
             var gtsOperationConfig = opConfig as GTSCardOperationConfig;
@@ -119,18 +178,19 @@
             Task.WaitAll(taskList.ToArray());
             resultOK = taskList.All(u => u.GetAwaiter().GetResult());
 
-            return resultOK;
+            //return resultOK;
+            throw new NotImplementedException();
         }
 
         /// <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;
@@ -149,7 +209,7 @@
         }
 
         /// <summary>
-        /// 鍗曚釜杞� 鐐逛綅鍒扮偣浣嶈繍鍔�
+        /// 鍗曚釜杞� 杩愬姩(鐐瑰埌鐐� jog 鍥為浂...锛�
         /// </summary>
         /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
         public async Task<bool> SingleAxisMoving(MovingOption optionPara)
@@ -173,24 +233,26 @@
                                     LogAsync(DateTime.Now, "澶嶄綅涓惎鍔ㄨ繍鍔ㄥ紓甯�", optionPara.AxisIndex + "鍚姩杩愬姩寮傚父");
                                     return false;
                                 }
-                                //璁剧疆 杩愬姩鍙傛暟
-                                var isSuccess = SetAxisParam(optionPara);
-                                if (isSuccess)
+
+                                if (optionPara.IsAbsolute)
                                 {
-                                    if (optionPara.IsAbsolute)
-                                    {
-                                        isSuccessAndStop = MoveAbs(optionPara);
-                                    }
-                                    else
-                                    {
-                                        isSuccessAndStop = MoveRel(optionPara);
-                                    }
+                                    isSuccessAndStop = P2PMoveAbs(optionPara);
                                 }
+                                else
+                                {
+                                    isSuccessAndStop = P2PMoveRel(optionPara);
+                                }
+
                             }
                             break;
                         case MotorMoveMode.FindOri:
                             {
                                 isSuccessAndStop = GoHome(optionPara);
+                            }
+                            break;
+                        case MotorMoveMode.Jog:
+                            {
+                                isSuccessAndStop = JogMove(optionPara);
                             }
                             break;
                     }
@@ -209,18 +271,15 @@
         /// <returns></returns>
         public double GetPrfPosition(int axisNum)
         {
-            lock (moveLock)
+            double position = 0;
+            double prfpos = 0; uint pclock = 0;
+            var ret = GTSCardAPI.GT_GetPrfPos((short)IConfig.CardNum, (short)axisNum, out prfpos, 1, out pclock);
+            if (ret != (short)GTSRetCode.GRCRunOK)
             {
-                double position = 0;
-                double prfpos = 0; uint pclock = 0;
-                var ret = GTSCardAPI.GT_GetPrfPos((short)IConfig.CardNum, (short)axisNum, out prfpos, 1, out pclock);
-                if (ret != (short)GTSRetCode.GRCRunOK)
-                {
-                    throw new Exception("杞�" + axisNum + "鑾峰彇瑙勫垝浣嶇疆寮傚父锛岄敊璇爜锛�" + ret);
-                }
-                position = prfpos / IConfig.AxisVelocityRatio;
-                return position;
+                throw new Exception("杞�" + axisNum + "鑾峰彇瑙勫垝浣嶇疆寮傚父锛岄敊璇爜锛�" + ret);
             }
+            position = prfpos / IConfig.AxisVelocityRatio;
+            return position;
         }
 
         /// <summary>
@@ -244,7 +303,6 @@
             }
         }
 
-
         /// <summary>
         /// Set Single Axis Do Jog Move  
         /// </summary>
@@ -252,21 +310,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>
@@ -297,7 +372,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
             {
@@ -328,11 +403,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));//鏇存柊杩愬姩
 
@@ -342,7 +420,7 @@
                         Thread.Sleep(50);
                     }
                     repeatTime--;
-                } while (ret != (short)GTSRetCode.GRCRunOK && repeatTime > 0);
+                } while (ret != (short)GTSRetCode.GRCRunOK && !isSuccessSetAxisParam && repeatTime > 0);
 
                 //杩愬姩寮�濮嬪悗 妫�鏌ヨ繍鍔ㄦ槸鍚﹀仠姝�
                 bool isStop = false;
@@ -368,7 +446,7 @@
         ///  缁濆浣嶇疆杩愬姩
         /// </summary>
         /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
-        public bool MoveAbs(MovingOption optionPara)
+        public bool P2PMoveAbs(MovingOption optionPara)
         {
             try
             {
@@ -396,9 +474,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));//鏇存柊杩愬姩
 
@@ -408,7 +489,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;
@@ -430,41 +511,58 @@
         }
 
         /// <summary>
-        /// 杩愬姩鍋滄
+        /// 鏌愪釜杞磋繍鍔ㄥ仠姝�
         /// </summary>
         /// <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>
@@ -520,7 +618,7 @@
         }
 
         /// <summary>
-        /// 璇诲彇杈撳叆
+        /// 璇诲彇IO杈撳叆
         /// </summary>
         /// <param name="cardNum">鍗″彿</param>
         /// <param name="index">杈撳叆鍙�</param>
@@ -529,12 +627,27 @@
         {
             int value;
             GTSCardAPI.GT_GetDi(cardNum, GTSCardAPI.MC_GPI, out value);
-            if ((value & 1 << index) == 0) return true;//鏈夎緭鍏ヨ繑鍥瀟rue
+            if ((value & (1 << index)) == 0) return true;//鏈夎緭鍏ヨ繑鍥瀟rue
             else return false;          //鏃犺緭鍏ヨ繑鍥瀎alse
         }
 
         /// <summary>
-        /// 杈撳嚭
+        /// 璇诲彇IO杈撳嚭
+        /// </summary>
+        /// <param name="cardNum"></param>
+        /// <param name="index"></param>
+        /// <returns></returns>
+        public bool GetDoSts(short cardNum, short index)
+        {
+            int outSts;
+            short outNum = (short)(index % 100);
+            GTSCardAPI.GT_GetDo(cardNum, GTSCardAPI.MC_GPO, out outSts);
+            if ((outSts & (1 << outNum)) == 0) return true;
+            else return false;
+        }
+
+        /// <summary>
+        /// 鎸変綅璁剧疆鏁板瓧 IO 杈撳嚭鐘舵��
         /// </summary>
         /// <param name="cardNum">鍗″彿</param>
         /// <param name="index">杈撳嚭鍙�,杩斿洖1-16</param>
@@ -550,59 +663,6 @@
             {
                 GTSCardAPI.GT_SetDoBit(cardNum, GTSCardAPI.MC_GPO, outNum, 1);
             }
-        }
-
-        /// <summary>
-        /// 鍋滄 鏌愪釜杞�
-        /// </summary>
-        /// <param name="cardNum"></param>
-        /// <param name="axisNum">杞村彿</param>
-        /// <param name="value">鍋滄鏂瑰紡锛宖alse琛ㄧず骞虫粦鍋滄锛宼rue琛ㄧず绱ф�ュ仠姝�</param>
-        public void Stop(short cardNum, short axisNum, bool emergencyStop)
-        {
-            if (emergencyStop)
-            {
-                GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), 1 << (axisNum - 1));
-            }
-            else
-            {
-                GTSCardAPI.GT_Stop(cardNum, 1 << (axisNum - 1), 0);
-            }
-        }
-
-        /// <summary>
-        /// IO杈撳嚭
-        /// </summary>
-        /// <param name="cardNum">鍗″彿</param>
-        /// <param name="mdl">妯″潡鍙�</param>
-        /// <param name="index">IO杈撳嚭</param>
-        /// <param name="value">true琛ㄧず杈撳嚭锛宖alse琛ㄧず鏃犺緭鍑�</param>
-        public void MC_WriteDigitalOutput(short cardNum, short mdl, short index, bool value)
-        {
-            if (value)
-            {
-                GTSCardAPI.GT_SetExtIoBit(cardNum, mdl, index, 0);
-            }
-            else
-            {
-                GTSCardAPI.GT_SetExtIoBit(cardNum, mdl, index, 1);
-            }
-        }
-
-        /// <summary>
-        /// 璇诲彇IO杈撳嚭鐘舵��
-        /// </summary>
-        /// <param name="cardNum"></param>
-        /// <param name="index"></param>
-        /// <returns></returns>
-        public bool GetDoSts(short cardNum, short index)
-        {
-            short outNum = 0;
-            int outSts;
-            outNum = (short)(index % 100);
-            GTSCardAPI.GT_GetDo(cardNum, GTSCardAPI.MC_GPO, out outSts);
-            if ((outSts & (1 << outNum)) == 0) return true;
-            else return false;
         }
 
         /// <summary>
@@ -625,16 +685,241 @@
 
         #endregion
 
-        public void Monitor()
+        #region IMonitor
+
+        public List<IOItem> MonitorValues { get; set; } = new List<IOItem>();
+
+
+        public List<IOItem> GetMonitorValues()
         {
-            throw new NotImplementedException();
+            var result = new List<IOItem>();
+            //璇诲彇IO杈撳叆
+            int inValue;
+            GTSCardAPI.GT_GetDi((short)IConfig.CardNum, GTSCardAPI.MC_GPI, out inValue);
+            //璇诲彇IO杈撳嚭
+            int outValue;
+            GTSCardAPI.GT_GetDo((short)IConfig.CardNum, GTSCardAPI.MC_GPO, out outValue);
+
+            //瑙f瀽缁撴灉
+            for (var index = 1; index <= 16; index++)
+            {
+                IOItem inItem = new IOItem()
+                {
+                    IONum = index,
+                    Value = (inValue & (1 << index)) == 0 ? 1 : 0,
+                    IOType = IOType.In
+                };
+                IOItem outItem = new IOItem()
+                {
+                    IONum = index,
+                    Value = (outValue & (1 << index)) == 0 ? 1 : 0,
+                    IOType = IOType.Out
+                };
+                result.Add(inItem);
+                result.Add(outItem);
+            }
+
+            return result;
         }
 
-        public void ResetAlarm()
+        public async override void Monitor()
         {
-            throw new NotImplementedException();
+            await Task.Run(() =>
+            {
+                while (CurrentState != EnumHelper.DeviceState.DSClose && CurrentState != EnumHelper.DeviceState.DSExcept && CurrentState != EnumHelper.DeviceState.DSUninit)
+                {
+                    try
+                    {
+                        if (!IConfig.IsEnableMonitor)
+                            return;
+                        var newValues = GetMonitorValues();
+                        if (newValues == null || newValues.Count == 0)
+                            continue;
+
+                        Stopwatch sw = new Stopwatch();
+                        sw.Start();
+                        if (MonitorValues.Count == newValues.Count)
+                        {
+                            var tempNew = newValues.DeepSerializeClone();//clone
+                            var tempOld = MonitorValues.DeepSerializeClone();
+                            MonitorCheckAndInvoke(tempNew, tempOld);
+                        }
+                        MonitorValues = new List<IOItem>(newValues);
+                        sw.Stop();
+
+                        if (sw.ElapsedMilliseconds > 20)
+                        {
+                            LogAsync(DateTime.Now, $"{this.Name}杞鏃堕棿锛歿sw.ElapsedMilliseconds}", "");
+                        }
+
+                        if (IConfig.MonitorInterval > 0)
+                        {
+                            Thread.Sleep(IConfig.MonitorInterval);
+                        }
+
+                    }
+                    catch (Exception ex)
+                    {
+                        if (CurrentState == DeviceState.DSOpen)
+                        {
+                            LogAsync(DateTime.Now, $"{this.Name}鐩戝惉寮傚父", ex.GetExceptionMessage());
+                        }
+                    }
+                }
+            });
         }
 
+        private void OnMethodInvoked(IAsyncResult ar)
+        {
+            MotionCardMonitorSet monitorSet = ar.AsyncState as MotionCardMonitorSet;
+            ProcessResponse resValues = monitorSet.Response;
+            if (resValues.ResultValue == (int)ReplyValue.IGNORE)
+            {
+                return;
+            }
 
+            Stopwatch sw = new Stopwatch();
+            sw.Start();
+            // 灏嗘寚瀹欼OItem鍐欏叆鏉垮崱
+            foreach (var replyIOData in monitorSet.ReplyIODatas)
+            {
+                //鍐欏叆IO杈撳嚭
+                if (replyIOData.IOType == IOType.Out)
+                {
+                    GTSCardAPI.GT_SetDoBit((short)IConfig.CardNum, GTSCardAPI.MC_GPI, (short)replyIOData.IONum, (short)replyIOData.Value);
+                }
+                // in鍙涓嶈兘鍐�
+            }
+            sw.Stop();
+            LogAsync(DateTime.Now, $"{Name}鍙嶉瀹屾垚锛岃�楁椂{sw.ElapsedMilliseconds}ms", $"{resValues.GetDisplayText()}");
+        }
+
+        protected void MonitorCheckAndInvoke(List<IOItem> tempNew, List<IOItem> tempOld)
+        {
+            #region 璀︽姤淇℃伅
+            Parallel.ForEach(IConfig.WarningSetCollection, wSet =>
+            {
+                MotionCardWarningSet warningSet = wSet as MotionCardWarningSet;
+
+                bool isOn = ((tempNew.FirstOrDefault(u => u.IONum == warningSet.TriggerIndex && u.IOType == warningSet.WarningIOModel)?.Value >> warningSet.TriggerIndex) & 1) == (warningSet.TriggerValue ? 1 : 0);
+
+                if (warningSet.CurrentStatus != isOn)
+                {
+                    warningSet.CurrentStatus = isOn;
+                    warningSet.TriggerTime = DateTime.Now;
+                    warningSet.WarningDescription = $"璀︽姤锛歿warningSet.Name}-瑙﹀彂绱㈠紩锛歿warningSet.TriggerIndex}-{warningSet.WarningIOModel.GetEnumDescription()}:{warningSet.WarningCode}";
+                    SaveAlarmCSVAsync(DateTime.Now, this.Name, warningSet);
+                    ExcuteMonitorAlarm(DateTime.Now, this, warningSet);
+                }
+            });
+            #endregion
+
+            #region 鐩戝惉淇℃伅
+            Parallel.ForEach(IConfig.MonitorSetCollection, mSet =>
+            {
+                MotionCardMonitorSet monitorSet = mSet as MotionCardMonitorSet;
+                if (monitorSet.TriggerIndex < 0 || monitorSet.TriggerIndex > tempNew.Count)
+                {
+                    return;
+                }
+
+                var newIOItem = tempNew.FirstOrDefault(u => u.IONum == monitorSet.TriggerIndex);
+                var oldIOItem = tempOld.FirstOrDefault(u => u.IONum == monitorSet.TriggerIndex);
+
+                if (newIOItem?.Value != oldIOItem?.Value)
+                {
+                    if (monitorSet.TriggerValue == -999 || newIOItem.Value == monitorSet.TriggerValue)
+                    {
+                        if (monitorSet.OpConfig == null)
+                        {
+                            monitorSet.OpConfig = new OperationConfigBase();
+                        }
+
+                        //monitorSet.OpConfig.InputPara = monitorSet.InputDataIndex.ConvertAll(index =>
+                        //{
+                        //    return tempNew[index].Value;
+                        //}).ToList();
+
+                        ExcuteMonitorInvok(DateTime.Now, monitorSet.InvokeDevice, this, monitorSet);
+                    }
+                }
+            });
+            #endregion
+        }
+
+        public override void ResetAlarm()
+        {
+            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);
+        }
+
+        object _alarmLock = new object();
+        private async void SaveAlarmCSVAsync(DateTime now, string plcName, IWarningSet ws)
+        {
+            await Task.Run(() =>
+            {
+                lock (_alarmLock)
+                {
+                    DirectoryInfo dir = new DirectoryInfo(this.IConfig.LogPath);
+                    if (!dir.Exists)
+                    {
+                        dir.Create();
+                    }
+
+                    string path = Path.Combine(IConfig.LogPath, $"Alarm_{Name}_{now.ToString("yyyyMMdd")}.csv");
+                    bool fileExist = File.Exists(path);
+
+                    using (StreamWriter writer = new StreamWriter(path, true, System.Text.Encoding.UTF8))
+                    {
+                        if (!fileExist)
+                        {
+                            writer.WriteLine("Time,Source,AlarmCode,AlarmDescription,AlarmStatus");
+                        }
+
+                        writer.WriteLine($"{now.ToString("HH:mm:ss.fff")},{plcName},{ws.WarningCode},{ws.WarningDescription},{(ws.CurrentStatus ? "鎶ヨ" : "鍋滄")}");
+
+                        writer.Flush();
+                        writer.Close();
+                    }
+                }
+            });
+        }
+        #endregion
     }
 }

--
Gitblit v1.8.0