From b3aa95bab5796caaf28a06922abf111ae55e37df Mon Sep 17 00:00:00 2001
From: patrick.xu <patrick.xu@broconcentric.com>
Date: 星期六, 20 二月 2021 10:58:39 +0800
Subject: [PATCH] xlsx文件异常处理

---
 src/Bro.Common.Device/DeviceBase/MotionCardBase.cs |  277 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 257 insertions(+), 20 deletions(-)

diff --git a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
index e42e318..ef22a40 100644
--- a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
+++ b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
@@ -20,12 +20,90 @@
     {
         public event Action<DateTime, string, IDevice, IMonitorSet> OnMonitorInvoke;
         public event Action<DateTime, IDevice, IWarningSet> OnMonitorAlarm;
+        public event Action<int, string> OnAxisAlarmRaised;
+        public event Action<int, int, int> OnAxisStatusChanged;
+        public event Action<int, int> OnAxisPositionChanged;
+        
+        public void AxisAlarmRaised(int axisIndex, string msg)
+        {
+            OnAxisAlarmRaised?.Invoke(axisIndex, msg);
+        }
 
+        public void AxisStatusChanged(int axisIndex, int preStatus, int curStatus)
+        {
+            OnAxisStatusChanged?.Invoke(axisIndex, preStatus, curStatus);
+        }
+
+        public void AxisPositionChanged(int axisIndex, int currentPosition)
+        {
+            OnAxisPositionChanged?.Invoke(axisIndex, currentPosition);
+        }
+
+        protected override void Start()
+        {
+            AxisStatusList = IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ConvertAll(a =>
+            {
+                AxisMovingStatus axisSts = new AxisMovingStatus();
+                axisSts.AxisIndex = a.AxisIndex;
+                axisSts.AxisName = a.AxisName;
+
+                return axisSts;
+            });
+
+            Task.Run(() =>
+            {
+                Monitor();
+            });
+        }
         public abstract List<AxisInfo> GetCurrentAxisInfo(params string[] axisName);
         public abstract void Monitor();
         public abstract ResponseMessage MoveToPoint(IOperationConfig opConfig);
         public abstract void ResetAlarm();
         public abstract ResponseMessage Run(IOperationConfig config);
+        /// <summary>
+        /// 娓呴櫎鐘舵��
+        /// </summary>
+        /// <param name="startAxisIndex">璧峰杞村彿</param>
+        /// <param name="count">鏁伴噺</param>
+        /// <returns></returns>
+        public abstract bool ClearStatus(int startAxisIndex, int count);
+
+        /// <summary>
+        /// 璇诲彇杞寸姸鎬�
+        /// </summary>
+        /// <param name="axisNum">杞村彿</param>
+        /// <returns></returns>
+        public abstract int GetAxisStatus(int axisNum);
+
+        /// <summary>
+        /// 浣嶇疆娓呴浂
+        /// </summary>
+        /// <param name="startAxisIndex">璧峰杞村彿</param>
+        /// <param name="count">鏁伴噺</param>
+        /// <returns></returns>
+        public abstract bool PositionReset(int startAxisIndex, int count);
+
+        public abstract bool AllAxisOn();
+
+        public abstract bool AllAxisOff();
+
+        public abstract Task<bool> AxisOnAsync(int axisNum);
+
+        public abstract Task<bool> AxisOffAsync(int axisNum);
+
+        /// <summary>
+        /// 鍗曚釜杞� 杩愬姩(鐐瑰埌鐐� jog 鍥為浂...锛�
+        /// </summary>
+        /// <param name="optionPara">杩愬姩鍙傛暟瀵硅薄</param>
+        public abstract Task<bool> SingleAxisMoving(MovingOption optionPara);
+
+        /// <summary>
+        /// 鏌愪釜杞磋繍鍔ㄥ仠姝�
+        /// </summary>
+        /// <param name="axisNum">杞村彿</param>
+        /// <param name="option">0琛ㄧず骞虫粦鍋滄锛�1琛ㄧず绱ф�ュ仠姝�</param>
+        /// <returns></returns>
+        public abstract Task<bool> MoveStop(int axisNum, int option);
 
         public virtual void ExcuteMonitorInvoke(DateTime dateTime, string invokeDevice, IDevice device, IMonitorSet monitorSet)
         {
@@ -47,9 +125,29 @@
             }
         }
 
+        /// <summary>
+        /// IO鐨勭洃鍚��
+        /// </summary>
         public List<IOItem> MonitorValues { get; set; } = new List<IOItem>();
 
-        public abstract void WriteOutput(short cardNum, short index, IOValue value);
+        /// <summary>
+        /// 杞寸殑杩愬姩鐘舵�佸��
+        /// </summary>
+        public List<AxisMovingStatus> AxisStatusList { get; set; } = new List<AxisMovingStatus>();
+
+        public abstract void WriteOutput(short index, IOValue value);
+
+        #region ImmediatePause
+        /// <summary>
+        /// 鍚姩绔嬪嵆鏆傚仠
+        /// </summary>
+        public abstract void SetImmediatePause();
+
+        /// <summary>
+        /// 鎭㈠绔嬪嵆鏆傚仠
+        /// </summary>
+        public abstract void ResetImmediatePause(bool isResumeMoving);
+        #endregion
     }
 
     public class MotionCardInitialConfigBase : InitialConfigBase, IMonitorConfig
@@ -57,7 +155,7 @@
         [Category("鏉垮崱閰嶇疆")]
         [DisplayName("鍗″彿")]
         [Description("CardNum锛氬崱鍙�")]
-        public int CardNum { get; set; }
+        public int CardNum { get; set; } = 1;
 
         [Category("鏉垮崱閰嶇疆")]
         [DisplayName("鍒濆閰嶇疆鏂囦欢璺緞")]
@@ -100,6 +198,10 @@
         [Editor(typeof(ComplexCollectionEditor<IODefinition>), typeof(UITypeEditor))]
         public List<IODefinition> IODefinitionCollection { get; set; } = new List<IODefinition>();
 
+        [Category("IO閰嶇疆")]
+        [Description("true锛氳緭鍑哄彇鍙� false锛氳緭鍑轰笉鍙栧弽")]
+        public bool IsOutputReversed { get; set; } = true;
+
         #region IMonitorConfig
         [Category("鐩戝惉璁剧疆")]
         [Description("MonitorSetCollection锛氱洃鍚搷浣滈厤缃泦鍚�")]
@@ -138,50 +240,107 @@
         [Category("鏉垮崱鎿嶄綔")]
         [Description("鏉垮崱鎿嶄綔閰嶇疆鍩虹被闆嗗悎锛屼緷娆℃墽琛�")]
         [TypeConverter(typeof(CollectionCountConvert))]
-        [Editor(typeof(ComplexCollectionEditor<MotionCardOperationConfigBase>), typeof(UITypeEditor))]
+        [Editor(typeof(MotionCardOperationSetEditor), typeof(UITypeEditor))]
         public List<MotionCardOperationSet> OperationCollection { get; set; } = new List<MotionCardOperationSet>();
 
         public string GetDisplayText()
         {
+            //OperationCollection.ForEach(o =>
+            //{
+            //    o.MotionCardId = DeviceId;
+            //});
+
             return string.Join(" ", OperationCollection.Select(u => u.GetDisplayText()));
         }
     }
 
+    public class MotionCardOperationSetEditor : ComplexCollectionEditor<MotionCardOperationSet>
+    {
+        public MotionCardOperationSetEditor(Type type) : base(type) { }
+
+        IOperationConfig opConfig = null;
+        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+        {
+            if (context.Instance is IOperationConfig config && value is List<MotionCardOperationSet> setList)
+            {
+                opConfig = config;
+                setList.ForEach(set => set.MotionCardId = opConfig.DeviceId);
+            }
+
+            return base.EditValue(context, provider, value);
+        }
+
+        protected override object CreateInstance(Type itemType)
+        {
+            object obj = base.CreateInstance(itemType);
+
+            if (obj is MotionCardOperationSet set)
+            {
+                set.MotionCardId = opConfig?.DeviceId;
+            }
+
+            return obj;
+        }
+
+    }
+
+    [Device("MotionOperationSet", "杩愬姩鎿嶄綔閰嶇疆鍩虹被", EnumHelper.DeviceAttributeType.OperationConfig)]
     public class MotionCardOperationSet : IComplexDisplay
     {
-        [Category("IO鎿嶄綔閰嶇疆")]
-        [DisplayName("IO棰勬鏌ュ畾涔夐泦鍚�")]
+        [Category("1.IO鎿嶄綔閰嶇疆")]
+        [DisplayName("1.IO棰勬鏌�")]
         [Description("IO棰勬鏌ュ畾涔夐泦鍚�")]
         [TypeConverter(typeof(CollectionCountConvert))]
         [Editor(typeof(IORefrenceItemCollectionEditor), typeof(UITypeEditor))]
         public List<IORefrenceItem> PreCheckIOCollection { get; set; } = new List<IORefrenceItem>();
-        [Category("IO鎿嶄綔閰嶇疆")]
+
+        [Category("1.IO鎿嶄綔閰嶇疆")]
         [Description("瓒呮椂璁剧疆锛屽崟浣嶏細ms")]
-        [DisplayName("IO棰勬鏌ヨ秴鏃�")]
+        [DisplayName("2.IO棰勬鏌ヨ秴鏃�")]
         public int PreCheckIOTimeout { get; set; } = 0;
 
-        [Category("IO鎿嶄綔閰嶇疆")]
-        [DisplayName("IO杈撳嚭瀹氫箟闆嗗悎")]
+        [Category("1.IO鎿嶄綔閰嶇疆")]
+        [DisplayName("3.IO杈撳嚭")]
         [Description("IO杈撳嚭瀹氫箟闆嗗悎")]
         [TypeConverter(typeof(CollectionCountConvert))]
+        [Editor(typeof(IORefrenceItemCollectionEditor), typeof(UITypeEditor))]
         public List<IORefrenceItem> IOOutputCollection { get; set; } = new List<IORefrenceItem>();
 
-        [Category("IO鎿嶄綔閰嶇疆")]
-        [DisplayName("IO纭瀹氫箟闆嗗悎")]
+        [Category("1.IO鎿嶄綔閰嶇疆")]
+        [DisplayName("4.IO杈撳嚭纭")]
         [Description("IO纭瀹氫箟闆嗗悎")]
         [TypeConverter(typeof(CollectionCountConvert))]
+        [Editor(typeof(IORefrenceItemCollectionEditor), typeof(UITypeEditor))]
         public List<IORefrenceItem> IOConfirmCollection { get; set; } = new List<IORefrenceItem>();
-        [Category("IO鎿嶄綔閰嶇疆")]
+
+        [Category("1.IO鎿嶄綔閰嶇疆")]
         [Description("瓒呮椂璁剧疆锛屽崟浣嶏細ms")]
-        [DisplayName("IO纭瓒呮椂")]
+        [DisplayName("5.IO杈撳嚭纭瓒呮椂")]
         public int IOConfirmTimeout { get; set; } = 0;
 
-        [Category("鏉垮崱杩愬姩閰嶇疆")]
+        [Category("2.鏉垮崱杩愬姩閰嶇疆")]
         [DisplayName("杩愬姩閰嶇疆闆嗗悎")]
         [Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
         [TypeConverter(typeof(CollectionCountConvert))]
-        [Editor(typeof(ComplexCollectionEditor<MovingOption>), typeof(UITypeEditor))]
+        [Editor(typeof(MovingOpsCollectionEditor), typeof(UITypeEditor))]
         public List<MovingOption> MovingOps { get; set; } = new List<MovingOption>();
+
+        [Category("3.杩愬姩寤舵椂")]
+        [Description("鎿嶄綔鍓嶅欢鏃讹紝鍗曚綅ms")]
+        public int DelayBefore { get; set; } = 0;
+
+        [Category("3.杩愬姩寤舵椂")]
+        [Description("鎿嶄綔鍚庡欢鏃讹紝鍗曚綅ms")]
+        public int DelayAfter { get; set; } = 0;
+
+        public string MotionCardId = "";
+
+        //[Category("鏉垮崱杩愬姩閰嶇疆")]
+        //[DisplayName("杩愬姩閰嶇疆闆嗗悎")]
+        //[Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
+        //[TypeConverter(typeof(ComplexObjectConvert))]
+        //[Editor(typeof(PropertyObjectEditor), typeof(UITypeEditor))]
+        //public MotionOperationCollection MotionOperationCollection { get; set; } = new MotionOperationCollection();
 
 
         public string GetDisplayText()
@@ -220,12 +379,28 @@
             {
                 moving += i.GetDisplayText() + " ";
             });
+
             if (moving != "")
             {
                 moving = " 杩愬姩锛�" + moving;
             }
 
             return (preCheck + output + confirm + moving).Trim();
+        }
+    }
+
+    public class MotionOperationCollection : OperationConfigBase, IComplexDisplay
+    {
+        [Category("杩愬姩閰嶇疆")]
+        [DisplayName("杩愬姩閰嶇疆闆嗗悎")]
+        [Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
+        [TypeConverter(typeof(CollectionCountConvert))]
+        [Editor(typeof(ComplexCollectionEditor<MovingOption>), typeof(UITypeEditor))]
+        public List<MovingOption> MovingOps { get; set; } = new List<MovingOption>();
+
+        public string GetDisplayText()
+        {
+            return $"{string.Join(" ", MovingOps.Select(u => u.GetDisplayText()))}";
         }
     }
 
@@ -264,13 +439,13 @@
             if (itemType == typeof(IORefrenceItem))
             {
                 IORefrenceItem item = new IORefrenceItem();
-                if ((this.Context.Instance is IOperationConfig opConfig) && !string.IsNullOrWhiteSpace(opConfig.DeviceId))
+                if (this.Context.Instance is MotionCardOperationSet set)
                 {
                     using (var scope = GlobalVar.Container.BeginLifetimeScope())
                     {
                         List<IDevice> deviceList = scope.Resolve<List<IDevice>>();
 
-                        var device = deviceList.FirstOrDefault(u => u.Id == opConfig.DeviceId);
+                        var device = deviceList.FirstOrDefault(u => u.Id == set.MotionCardId);
 
                         if (device != null && (device is MotionCardBase motionCard))
                         {
@@ -297,9 +472,9 @@
 
         public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
         {
-            if (context.Instance is IOperationConfig opConfig)
+            if (context.Instance is MotionCardOperationSet set)
             {
-                if (string.IsNullOrWhiteSpace(opConfig.DeviceId))
+                if (string.IsNullOrWhiteSpace(set.MotionCardId))
                 {
                     return base.EditValue(context, provider, value);
                 }
@@ -308,7 +483,7 @@
                 {
                     List<IDevice> deviceList = scope.Resolve<List<IDevice>>();
 
-                    var device = deviceList.FirstOrDefault(u => u.Id == opConfig.DeviceId);
+                    var device = deviceList.FirstOrDefault(u => u.Id == set.MotionCardId);
 
                     if (device == null)
                     {
@@ -369,4 +544,66 @@
         //}
     }
 
+    public class MovingOpsCollectionEditor : ComplexCollectionEditor<MovingOption>
+    {
+        public MovingOpsCollectionEditor(Type type) : base(type)
+        {
+        }
+
+        MotionCardBase motionCard = null;
+        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+        {
+            if (context.Instance is MotionCardOperationSet set)
+            {
+                if (!string.IsNullOrWhiteSpace(set.MotionCardId))
+                {
+                    using (var scope = GlobalVar.Container.BeginLifetimeScope())
+                    {
+                        var deviceList = scope.Resolve<List<IDevice>>();
+                        if (deviceList != null)
+                        {
+                            motionCard = deviceList.FirstOrDefault(u => u.Id == set.MotionCardId) as MotionCardBase;
+                        }
+                    }
+                }
+
+                if (motionCard != null && value is List<MovingOption> ops)
+                {
+                    ops.ForEach(o => o.SetAxisSetting(motionCard.IConfig.AxisSettings));
+                }
+            }
+
+            return base.EditValue(context, provider, value);
+        }
+
+        protected override object SetItems(object editValue, object[] value)
+        {
+            Array.ForEach(value, v =>
+             {
+                 if (v is MovingOption op && motionCard != null)
+                 {
+                     op.SetAxisSetting(motionCard.IConfig.AxisSettings);
+                 }
+             });
+
+            return base.SetItems(editValue, value);
+        }
+        ///// <summary> 
+        ///// 闄愬埗涓�娆¢�変竴涓疄渚� 
+        ///// </summary> 
+        ///// <returns></returns> 
+        //protected override bool CanSelectMultipleInstances()
+        //{
+        //    return false;
+        //}
+        ///// <summary> 
+        ///// 鎸囧畾鍒涘缓鐨勫璞$被鍨� 
+        ///// </summary> 
+        ///// <returns></returns> 
+        //protected override Type CreateCollectionItemType()
+        //{
+        //    return typeof(MovingOption);
+        //}
+    }
+
 }

--
Gitblit v1.8.0