From ca718bf67886ef08cfd22599d22d458b610c02aa Mon Sep 17 00:00:00 2001
From: xcd <834800634@qq.com>
Date: 星期五, 10 七月 2020 18:34:43 +0800
Subject: [PATCH] 板卡添加轴状态和轴报警信息输出

---
 src/Bro.Common.Device/DeviceBase/MotionCardBase.cs |  252 +++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 216 insertions(+), 36 deletions(-)

diff --git a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
index 1cd328f..4e539a0 100644
--- a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
+++ b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs
@@ -20,12 +20,68 @@
     {
         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 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 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 +103,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();
+        #endregion
     }
 
     public class MotionCardInitialConfigBase : InitialConfigBase, IMonitorConfig
@@ -138,58 +214,99 @@
         [Category("鏉垮崱鎿嶄綔")]
         [Description("鏉垮崱鎿嶄綔閰嶇疆鍩虹被闆嗗悎锛屼緷娆℃墽琛�")]
         [TypeConverter(typeof(CollectionCountConvert))]
-        [Editor(typeof(ComplexCollectionEditor<MotionCardOperationSet>), 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()));
         }
     }
 
-    [Device("MotionOperationSet", "杩愬姩鎿嶄綔閰嶇疆鍩虹被", EnumHelper.DeviceAttributeType.OperationConfig)]
-    public class MotionCardOperationSet :  IComplexDisplay
+    public class MotionCardOperationSetEditor : ComplexCollectionEditor<MotionCardOperationSet>
     {
-        [Category("IO鎿嶄綔閰嶇疆")]
-        [DisplayName("IO棰勬鏌ュ畾涔夐泦鍚�")]
+        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("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("2.鏉垮崱杩愬姩閰嶇疆")]
+        [DisplayName("杩愬姩閰嶇疆闆嗗悎")]
+        [Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
+        [TypeConverter(typeof(CollectionCountConvert))]
+        [Editor(typeof(MovingOpsCollectionEditor), typeof(UITypeEditor))]
+        public List<MovingOption> MovingOps { get; set; } = new List<MovingOption>();
+
+        public string MotionCardId = "";
 
         //[Category("鏉垮崱杩愬姩閰嶇疆")]
         //[DisplayName("杩愬姩閰嶇疆闆嗗悎")]
         //[Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
-        //[TypeConverter(typeof(CollectionCountConvert))]
-        //[Editor(typeof(ComplexCollectionEditor<MovingOption>), typeof(UITypeEditor))]
-        //public List<MovingOption> MovingOps { get; set; } = new List<MovingOption>();
-        [Category("鏉垮崱杩愬姩閰嶇疆")]
-        [DisplayName("杩愬姩閰嶇疆闆嗗悎")]
-        [Description("MovingOps锛氳繍鍔ㄩ厤缃泦鍚�")]
-        [TypeConverter(typeof(ComplexObjectConvert))]
-        [Editor(typeof(PropertyObjectEditor),typeof(UITypeEditor))]
-        public MotionOperationCollection MotionOperationCollection { get; set; } = new MotionOperationCollection();
+        //[TypeConverter(typeof(ComplexObjectConvert))]
+        //[Editor(typeof(PropertyObjectEditor), typeof(UITypeEditor))]
+        //public MotionOperationCollection MotionOperationCollection { get; set; } = new MotionOperationCollection();
 
 
         public string GetDisplayText()
@@ -224,14 +341,15 @@
             }
 
             string moving = "";
-            //MovingOps.ForEach(i =>
-            //{
-            //    moving += i.GetDisplayText() + " ";
-            //});
-            //if (moving != "")
-            //{
-            //    moving = " 杩愬姩锛�" + moving;
-            //}
+            MovingOps.ForEach(i =>
+            {
+                moving += i.GetDisplayText() + " ";
+            });
+
+            if (moving != "")
+            {
+                moving = " 杩愬姩锛�" + moving;
+            }
 
             return (preCheck + output + confirm + moving).Trim();
         }
@@ -287,13 +405,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))
                         {
@@ -320,9 +438,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);
                 }
@@ -331,7 +449,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)
                     {
@@ -392,4 +510,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