src/A032.Process/ProcessConfig.cs
@@ -3,6 +3,7 @@
using Bro.Common.Helper;
using Bro.Common.Interface;
using Bro.Common.Model;
using Bro.Common.Model.Interface;
using Bro.Device.AuboRobot;
using Bro.Device.HikCamera;
using Bro.Device.OmronFins;
@@ -20,7 +21,7 @@
namespace A032.Process
{
    public class ProcessConfig : IStationConfig
    public class ProcessConfig : IStationConfig, IHalconToolPath
    {
        #region 设备配置
        [Category("设备配置")]
@@ -46,6 +47,12 @@
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<HikCameraInitialConfig>), typeof(UITypeEditor))]
        public List<HikCameraInitialConfig> CameraConfigCollection { get; set; } = new List<HikCameraInitialConfig>();
        [Category("设备配置")]
        [Description("AGV小车设备绑定配置,配置绑定的AGV,机器人和相机信息")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<AGVBindUnit>), typeof(UITypeEditor))]
        public List<AGVBindUnit> AGVBindCollection { get; set; } = new List<AGVBindUnit>();
        #endregion
        #region 操作配置
@@ -55,15 +62,19 @@
        //[Editor(typeof(MonitorSetBindEditor), typeof(UITypeEditor))]
        //public Dictionary<string, MonitorSet> PLCMonitorSet { get; set; } = new Dictionary<string, MonitorSet>();
        ///// <summary>
        ///// 操作配置的字典集合
        ///// Key:MethodCode,Value:操作配置
        ///// </summary>
        //[Category("操作配置")]
        //[Description("操作配置集合")]
        //[TypeConverter(typeof(CollectionCountConvert))]
        //[Editor(typeof(OperationConfigBindEditor), typeof(UITypeEditor))]
        //public Dictionary<string, IOperationConfig> ProcessOpConfigDict { get; set; } = new Dictionary<string, IOperationConfig>();
        /// <summary>
        /// 操作配置的字典集合
        /// Key:MethodCode,Value:操作配置
        /// </summary>
        [Category("操作配置")]
        [Description("默认操作配置集合")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(OperationConfigBindEditor), typeof(UITypeEditor))]
        public Dictionary<string, IOperationConfig> ProcessOpConfigDict { get; set; } = new Dictionary<string, IOperationConfig>();
        [Category("操作配置")]
        [Description("操作超时设置,单位min")]
        public int OperationTimeout { get; set; } = 10;
        //[Category("监听和操作配置")]
        //[Description("监听操作配置集合")]
@@ -96,18 +107,20 @@
        [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
        public string LogPath { get; set; }
        [Category("日志配置")]
        [Description("GRR日志文件夹路径")]
        [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
        public string GRRLogPath { get; set; }
        //[Category("日志配置")]
        //[Description("GRR日志文件夹路径")]
        //[Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
        //public string GRRLogPath { get; set; }
        [Category("CSV文件配置")]
        [Description("是否做CSV文件输出")]
        [Browsable(false)]
        public bool IsCSVOutput { get; set; } = false;
        [Category("CSV文件配置")]
        [Description("CSV输出文件夹路径")]
        [Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
        [Browsable(false)]
        public string CSVFilePath { get; set; }
        #endregion
@@ -117,9 +130,9 @@
        //[Editor(typeof(ComplexCollectionEditor<WarningSet>), typeof(UITypeEditor))]
        //public List<WarningSet> WarningSets { get; set; } = new List<WarningSet>();
        [Category("PLC相关配置")]
        [Description("产品出列时是否有确认动作。true:有确认动作,确认后产品出列;false:没有确认动作,查询时产品出列")]
        public bool IsConfirmWhenProductionDone { get; set; } = false;
        //[Category("PLC相关配置")]
        //[Description("产品出列时是否有确认动作。true:有确认动作,确认后产品出列;false:没有确认动作,查询时产品出列")]
        //public bool IsConfirmWhenProductionDone { get; set; } = false;
        [Category("NG图片保存配置")]
        [Description("NG图片保存目录")]
@@ -131,6 +144,7 @@
        //[Description("是否采用外部算子。true:采用外部算子,false:使用内部算法")]
        //public bool IsUsingExternalAlgorithem { get; set; } = true;
        #region A032
        [Category("路径相关")]
        [Description("路径节点配置")]
        [TypeConverter(typeof(CollectionCountConvert))]
@@ -140,8 +154,82 @@
        [Category("路径相关")]
        [Description("各位置标定矩阵")]
        [TypeConverter(typeof(CollectionCountConvert))]
        [Editor(typeof(ComplexCollectionEditor<PositionMatrix>), typeof(UITypeEditor))]
        public List<PositionMatrix> MatrixCollection { get; set; } = new List<PositionMatrix>();
        [Editor(typeof(ComplexCollectionEditor<PositionVisionConfig>), typeof(UITypeEditor))]
        public List<PositionVisionConfig> VisionConfigCollection { get; set; } = new List<PositionVisionConfig>();
        [Category("视觉配置")]
        [Description("是否启用视觉引导")]
        public bool IsEnableVisionGuide { get; set; } = false;
        [Category("视觉配置")]
        [Description("视觉引导次数")]
        public int VisionGuideTimes { get; set; } = 2;
        [Category("设备参数配置")]
        [Description("光源开关索引配置")]
        public int LightOutputIndex { get; set; }
        [Category("设备参数配置")]
        [Description("AGV满载满Tray/空Tray数量")]
        public int AGVAvailableTrayNums { get; set; } = 6;
        [Category("设备参数配置")]
        [Description("默认等待任务轮数。当某些条件不满足当前任务执行前提,当前任务会等待若干任务数后执行")]
        public int DefaultWaitShift { get; set; } = 3;
        /// <summary>
        /// 产线忙时拍照确认等待间隔,以秒为单位
        /// </summary>
        [Category("阈值设置")]
        [Description("产线忙时拍照确认等待间隔,以秒为单位")]
        public int LineBusyWaitInterval { get; set; } = 60;
        /// <summary>
        /// 产线忙时拍照重试次数
        /// </summary>
        [Category("阈值设置")]
        [Description("产线忙时拍照重试次数")]
        public int LineBusyRetryTimes { get; set; } = 10;
        [Category("阈值设置")]
        [Description("机台压机满Tray数量")]
        public int Machine_FullTrayNum { get; set; } = 6;
        [Category("阈值设置")]
        [Description("机台压机空Tray数量")]
        public int Machine_EmptyTrayNum { get; set; } = 6;
        #endregion
        #region IHalconToolPath
        public List<string> GetHalconToolPathList()
        {
            List<string> list = new List<string>();
            ProcessOpConfigDict.Values.ToList().ForEach(c =>
            {
                if (c is IHalconToolPath)
                {
                    list.AddRange((c as IHalconToolPath).GetHalconToolPathList());
                }
            });
            this.GetType().GetProperties().ToList().ForEach(p =>
            {
                var pValue = p.GetValue(this);
                if (pValue is IHalconToolPath)
                {
                    list.AddRange((pValue as IHalconToolPath).GetHalconToolPathList());
                }
                else if (pValue is IEnumerable<IHalconToolPath>)
                {
                    list.AddRange((pValue as IEnumerable<IHalconToolPath>).SelectMany(u => u.GetHalconToolPathList()));
                }
            });
            return list.Distinct().ToList();
        }
        #endregion
        #region Ignore
        [Browsable(false)]
@@ -192,53 +280,22 @@
        #endregion
    }
    public class PathPosition : IComplexDisplay
    [Device("OperationTest", "测试方法配置", DeviceAttributeType.OperationConfig)]
    public class OperationTestConfig : OperationConfigBase
    {
        [Category("导航路径")]
        [Description("路径节点代码")]
        public string PositionCode { get; set; }
        //[Category("测试配置")]
        //[Description("方法类型")]
        //public TaskType TaskType { get; set; } = TaskType.LoadEmptyTrayToAGV;
        [Category("导航路径")]
        [Description("路径节点描述")]
        public string Description { get; set; }
        [Category("测试配置")]
        [Description("方法信息")]
        [TypeConverter(typeof(ComplexObjectConvert))]
        [Editor(typeof(PropertyObjectEditor), typeof(UITypeEditor))]
        public TrayTask TaskInfo { get; set; } = new TrayTask();
        public string GetDisplayText()
        {
            return $"{PositionCode}-{Description}";
        }
    }
    public class PositionMatrix : IComplexDisplay
    {
        [Category("位置矩阵")]
        [Description("位置代码")]
        [TypeConverter(typeof(PositionCodeConverter))]
        public string PositionCode { get; set; }
        [Category("位置矩阵")]
        [Description("该位置标定矩阵")]
        [TypeConverter(typeof(SimpleCollectionConvert<double>))]
        public List<double> Matrix { get; set; } = new List<double>();
        public string GetDisplayText()
        {
            return $"{PositionCode}:{string.Join(",", Matrix)}";
        }
    }
    public class PositionCodeConverter : ComboBoxItemTypeConvert
    {
        public override void GetConvertHash()
        {
            using (var scope = GlobalVar.Container.BeginLifetimeScope())
            {
                var config = scope.Resolve<ProcessConfig>();
                config.PositionCollection.ForEach(p =>
                {
                    _hash[p.PositionCode] = $"{p.PositionCode}-{p.Description}";
                });
            }
        }
        [Category("测试配置")]
        [Description("执行AGV设备")]
        [TypeConverter(typeof(AGVDeviceConverter))]
        public string AGVId { get; set; }
    }
}