using Autofac; using Bro.Common.Helper; using Bro.Common.Interface; using Bro.Common.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing.Design; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Bro.Common.Helper.EnumHelper; namespace Bro.Common.Base { public abstract class MotionCardBase : DeviceBase, IMonitor, IMotionCard { public event Action OnMonitorInvoke; public event Action OnMonitorAlarm; public abstract List GetCurrentAxisInfo(params string[] axisName); public abstract void Monitor(); public abstract ResponseMessage MoveToPoint(IOperationConfig opConfig); public abstract void ResetAlarm(); public abstract ResponseMessage Run(IOperationConfig config); 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; } } public List MonitorValues { get; set; } = new List(); public abstract void WriteOutput(short cardNum, short index, IOValue value); } public class MotionCardInitialConfigBase : InitialConfigBase, IMonitorConfig { [Category("板卡配置")] [DisplayName("卡号")] [Description("CardNum:卡号")] public int CardNum { get; set; } [Category("板卡配置")] [DisplayName("初始配置文件路径")] [Description("InitialConfigFilePath:初始配置文件路径")] [Editor(typeof(FileDialogEditor), typeof(UITypeEditor))] public string InitialConfigFilePath { get; set; } [Category("轴配置")] [DisplayName("轴数量")] [Description("AxisNum:轴数量")] public int AxisNum { get; set; } = 4; [Category("轴配置")] [DisplayName("轴配置信息集合")] [Description("AxisSettings:轴配置信息集合")] [TypeConverter(typeof(CollectionCountConvert))] [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] public List AxisSettings { get; set; } = new List(); [Category("轴配置")] [DisplayName("轴速度比率")] [Description("AxisVelocityRatio:轴速度比率")] public double AxisVelocityRatio { get; set; } = 1; //[Category("延时配置")] //[DisplayName("动作完成后延迟")] //[Description("ActionAfterDelay:动作完成后延迟")] //public int ActionAfterDelay { get; set; } = 100; [Category("警报配置")] [Description("WarningSetCollection:警报配置列表")] [DisplayName("警报配置")] [TypeConverter(typeof(CollectionCountConvert))] [Editor(typeof(WarningSetsEditor), typeof(UITypeEditor))] public List WarningSetCollection { get; set; } = new List(); [Category("IO配置")] [Description("IO定义集合")] [TypeConverter(typeof(CollectionCountConvert))] [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] public List IODefinitionCollection { get; set; } = new List(); #region IMonitorConfig [Category("监听设置")] [Description("MonitorSetCollection:监听操作配置集合")] [DisplayName("监听配置")] [TypeConverter(typeof(CollectionCountConvert))] [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] public List MonitorSetCollection { get; set; } = new List(); [Category("监听设置")] [Description("true:启动监听 false:关闭监听")] [DisplayName("监听启用")] public bool IsEnableMonitor { get; set; } = true; [Category("监听设置")] [Description("扫描间隔时间,单位:ms")] [DisplayName("扫描间隔")] public int MonitorInterval { get; set; } = 10; [Category("监听设置")] [Description("超时设置,单位:ms")] [DisplayName("监听超时")] public int MonitorTimeout { get; set; } = 500; public List 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("板卡操作")] [Description("板卡操作配置基类集合,依次执行")] [TypeConverter(typeof(CollectionCountConvert))] [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] public List OperationCollection { get; set; } = new List(); public string GetDisplayText() { return string.Join(" ", OperationCollection.Select(u => u.GetDisplayText())); } } [Device("MotionOperationSet", "运动操作配置基类", EnumHelper.DeviceAttributeType.OperationConfig)] public class MotionCardOperationSet : IComplexDisplay { [Category("IO操作配置")] [DisplayName("IO预检查定义集合")] [Description("IO预检查定义集合")] [TypeConverter(typeof(CollectionCountConvert))] [Editor(typeof(IORefrenceItemCollectionEditor), typeof(UITypeEditor))] public List PreCheckIOCollection { get; set; } = new List(); [Category("IO操作配置")] [Description("超时设置,单位:ms")] [DisplayName("IO预检查超时")] public int PreCheckIOTimeout { get; set; } = 0; [Category("IO操作配置")] [DisplayName("IO输出定义集合")] [Description("IO输出定义集合")] [TypeConverter(typeof(CollectionCountConvert))] public List IOOutputCollection { get; set; } = new List(); [Category("IO操作配置")] [DisplayName("IO确认定义集合")] [Description("IO确认定义集合")] [TypeConverter(typeof(CollectionCountConvert))] public List IOConfirmCollection { get; set; } = new List(); [Category("IO操作配置")] [Description("超时设置,单位:ms")] [DisplayName("IO确认超时")] public int IOConfirmTimeout { get; set; } = 0; //[Category("板卡运动配置")] //[DisplayName("运动配置集合")] //[Description("MovingOps:运动配置集合")] //[TypeConverter(typeof(CollectionCountConvert))] //[Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] //public List MovingOps { get; set; } = new List(); [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))] [Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] public List MovingOps { get; set; } = new List(); public string GetDisplayText() { 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), typeof(UITypeEditor))] // public List MotionCardOpsCollection { get; set; } = new List(); //} public class IORefrenceItemCollectionEditor : CollectionEditor { protected override CollectionForm CreateCollectionForm() { var form = base.CreateCollectionForm(); var prop = form.GetType().GetField("propertyBrowser", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (prop != null) { if (prop.GetValue(form) is PropertyGrid grid) { grid.HelpVisible = true; grid.ToolbarVisible = false; } } return form; } protected override object CreateInstance(Type itemType) { if (itemType == typeof(IORefrenceItem)) { IORefrenceItem item = new IORefrenceItem(); if ((this.Context.Instance is IOperationConfig opConfig) && !string.IsNullOrWhiteSpace(opConfig.DeviceId)) { using (var scope = GlobalVar.Container.BeginLifetimeScope()) { List deviceList = scope.Resolve>(); var device = deviceList.FirstOrDefault(u => u.Id == opConfig.DeviceId); 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) //{ // return base.GetItems(editValue); //} //protected override object SetItems(object editValue, object[] value) //{ // return base.SetItems(editValue, value); //} public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { if (context.Instance is IOperationConfig opConfig) { if (string.IsNullOrWhiteSpace(opConfig.DeviceId)) { return base.EditValue(context, provider, value); } using (var scope = GlobalVar.Container.BeginLifetimeScope()) { List deviceList = scope.Resolve>(); var device = deviceList.FirstOrDefault(u => u.Id == opConfig.DeviceId); if (device == null) { return base.EditValue(context, provider, value); } if (device is MotionCardBase motionCard) { if (value is List items) { items.ForEach(item => { item.IOItemSource = (motionCard.InitialConfig as MotionCardInitialConfigBase).IODefinitionCollection; }); } } } } return base.EditValue(context, provider, value); } public IORefrenceItemCollectionEditor(Type type) : base(type) { } /// /// 限制一次选一个实例 /// /// protected override bool CanSelectMultipleInstances() { return false; } /// /// 指定创建的对象类型 /// /// protected override Type CreateCollectionItemType() { return typeof(IORefrenceItem); } protected override string GetDisplayText(object value) { if (value is IComplexDisplay) { return (value as IComplexDisplay).GetDisplayText(); } return base.GetDisplayText(value); } //protected override void DestroyInstance(object instance) //{ // base.DestroyInstance(instance);//重要!自动删除组件的设计时代码! //} } }