From 81480d62561dcb75a1fc968814ace1368fe5181b Mon Sep 17 00:00:00 2001 From: wells.liu <wells.liu@broconcentric.com> Date: 星期四, 16 七月 2020 11:57:08 +0800 Subject: [PATCH] Merge branch 'master' of http://gitblit.broconcentric.com:8088/r/M071 --- src/Bro.Common.Device/DeviceBase/MotionCardBase.cs | 379 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 362 insertions(+), 17 deletions(-) diff --git a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs index 44eee94..f5214fe 100644 --- a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs +++ b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs @@ -12,6 +12,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using static Bro.Common.Helper.EnumHelper; namespace Bro.Common.Base { @@ -19,12 +20,119 @@ { 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); + } + + protected override void Start() + { + 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) + { + OnMonitorInvoke?.BeginInvoke(dateTime, invokeDevice, device, monitorSet, OnMethodInvoked, null); + } + + public abstract void OnMethodInvoked(IAsyncResult ar); + + public virtual void ExcuteMonitorAlarm(DateTime dateTime, IDevice device, IWarningSet warningSet) + { + OnMonitorAlarm?.BeginInvoke(dateTime, device, warningSet, null, null); + } + + public virtual MotionCardInitialConfigBase IConfig + { + get + { + return InitialConfig as MotionCardInitialConfigBase; + } + } + + /// <summary> + /// IO鐨勭洃鍚�� + /// </summary> + public List<IOItem> MonitorValues { get; set; } = new List<IOItem>(); + + /// <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 @@ -32,7 +140,7 @@ [Category("鏉垮崱閰嶇疆")] [DisplayName("鍗″彿")] [Description("CardNum锛氬崱鍙�")] - public int CardNum { get; set; } + public int CardNum { get; set; } = 1; [Category("鏉垮崱閰嶇疆")] [DisplayName("鍒濆閰嶇疆鏂囦欢璺緞")] @@ -75,6 +183,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锛氱洃鍚搷浣滈厤缃泦鍚�")] @@ -101,32 +213,170 @@ public List<IMonitorSet> GetAllMonitorSet() { WarningSetCollection.ForEach(m => m.Source = this.Name); - MonitorSetCollection.ForEach(m => m.SourceDevice = this.Id); return MonitorSetCollection; } #endregion } + [Device("MotionCardBase", "鏉垮崱鎿嶄綔閰嶇疆鍩虹被", EnumHelper.DeviceAttributeType.OperationConfig)] public class MotionCardOperationConfigBase : OperationConfigBase, IComplexDisplay { - [Category("IO鎿嶄綔閰嶇疆")] + [Category("鏉垮崱鎿嶄綔")] + [Description("鏉垮崱鎿嶄綔閰嶇疆鍩虹被闆嗗悎锛屼緷娆℃墽琛�")] + [TypeConverter(typeof(CollectionCountConvert))] + [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("1.IO鎿嶄綔閰嶇疆")] + [DisplayName("1.IO棰勬鏌�")] [Description("IO棰勬鏌ュ畾涔夐泦鍚�")] [TypeConverter(typeof(CollectionCountConvert))] - [Editor(typeof(IORefrenceItemCollectionEditor),typeof(UITypeEditor))] + [Editor(typeof(IORefrenceItemCollectionEditor), typeof(UITypeEditor))] public List<IORefrenceItem> PreCheckIOCollection { get; set; } = new List<IORefrenceItem>(); - [Category("IO鎿嶄綔閰嶇疆")] + [Category("1.IO鎿嶄綔閰嶇疆")] + [Description("瓒呮椂璁剧疆锛屽崟浣嶏細ms")] + [DisplayName("2.IO棰勬鏌ヨ秴鏃�")] + public int PreCheckIOTimeout { get; set; } = 0; + + [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鎿嶄綔閰嶇疆")] + [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("鏉垮崱杩愬姩閰嶇疆")] + [Category("1.IO鎿嶄綔閰嶇疆")] + [Description("瓒呮椂璁剧疆锛屽崟浣嶏細ms")] + [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>(); + + [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() + { + string preCheck = ""; + PreCheckIOCollection.ForEach(i => + { + preCheck += i.GetDisplayText() + " "; + }); + if (preCheck != "") + { + preCheck = " 棰勬锛�" + preCheck; + } + + string output = ""; + IOOutputCollection.ForEach(i => + { + output += i.GetDisplayText() + " "; + }); + if (output != "") + { + output = " 杈撳嚭锛�" + output; + } + string confirm = ""; + IOConfirmCollection.ForEach(i => + { + confirm += i.GetDisplayText() + " "; + }); + if (confirm != "") + { + confirm = " 纭锛�" + confirm; + } + + string moving = ""; + MovingOps.ForEach(i => + { + 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))] @@ -135,9 +385,19 @@ public string GetDisplayText() { - throw new NotImplementedException(); + return $"{string.Join(" ", MovingOps.Select(u => u.GetDisplayText()))}"; } } + + //[Device("MotionCardOperationConfigCollection", "鏉垮崱鎿嶄綔閰嶇疆鍩虹被闆嗗悎", EnumHelper.DeviceAttributeType.OperationConfig)] + //public class MotionCardOperationConfigCollection : OperationConfigBase + //{ + // [Category("澶嶄綅鎿嶄綔")] + // [Description("鏉垮崱鎿嶄綔閰嶇疆鍩虹被闆嗗悎锛屼緷娆℃墽琛�")] + // [TypeConverter(typeof(CollectionCountConvert))] + // [Editor(typeof(ComplexCollectionEditor<MotionCardOperationConfigBase>), typeof(UITypeEditor))] + // public List<MotionCardOperationConfigBase> MotionCardOpsCollection { get; set; } = new List<MotionCardOperationConfigBase>(); + //} public class IORefrenceItemCollectionEditor : CollectionEditor { @@ -159,10 +419,31 @@ return form; } - //protected override object CreateInstance(Type itemType) - //{ - // return base.CreateInstance(itemType); - //} + protected override object CreateInstance(Type itemType) + { + if (itemType == typeof(IORefrenceItem)) + { + IORefrenceItem item = new IORefrenceItem(); + 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 == set.MotionCardId); + + if (device != null && (device is MotionCardBase motionCard)) + { + item.IOItemSource = (motionCard.InitialConfig as MotionCardInitialConfigBase).IODefinitionCollection; + } + } + } + + return item; + } + + return base.CreateInstance(itemType); + } //protected override object[] GetItems(object editValue) //{ @@ -176,9 +457,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); } @@ -187,7 +468,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) { @@ -196,9 +477,12 @@ if (device is MotionCardBase motionCard) { - if (value is IORefrenceItem item) + if (value is List<IORefrenceItem> items) { - item.IOItemSource = (motionCard.InitialConfig as MotionCardInitialConfigBase).IODefinitionCollection; + items.ForEach(item => + { + item.IOItemSource = (motionCard.InitialConfig as MotionCardInitialConfigBase).IODefinitionCollection; + }); } } } @@ -245,5 +529,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