领胜LDS 键盘AOI检测项目
xcd
2020-07-06 0f71990dc60af6e96c9f4c2f2095ca6711e2c870
src/Bro.M071.Process/M071Process.cs
@@ -2,6 +2,7 @@
using Bro.Common.Helper;
using Bro.Common.Interface;
using Bro.Common.Model;
using Bro.M071.Model;
using Bro.Process;
using HalconDotNet;
using System;
@@ -13,6 +14,7 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static Bro.Common.Helper.EnumHelper;
namespace Bro.M071.Process
{
@@ -33,8 +35,10 @@
        #region 事件
        public event Action OnMeasureStart;
        public event Action<string> OnBarcodeChanged;
        public event Action OnClearBarcode;
        public event Action<IShapeElement> OnElementUpdated;
        public event Action<MachineState> OnMachineStateChanged;
        public event Action OnFullResetDone;
        #endregion
        public override void Open()
@@ -42,10 +46,18 @@
            InitialSetting();
            base.Open();
            Reset(null, null, null);
            FullReset(null);
        }
        private void InitialSetting()
        {
            //数据库迁移检查
            DatabaseInitialize.Initialize();
            MotionCardSettingCheck();
            Config.SnapshotPointCollection.ForEach(u =>
            {
                u.GetHalconToolPathList().ForEach(path =>
@@ -100,7 +112,7 @@
                    if (keyRespone.Count == 0)
                        throw new ProcessException($"{u.GetDisplayText()}对应的单键不存在或不可用");
                    if (b.KeyResult == "All")
                    if (b.KeyResultId == "All")
                    {
                        keyRespone.SelectMany(kr => kr.KeyResultList).ToList().ForEach(r =>
                          {
@@ -109,67 +121,48 @@
                    }
                    else
                    {
                        b.MeasureValueDict[b.KeyResult] = null;
                        b.MeasureValueDict[b.KeyResultId] = null;
                    }
                });
            });
        }
        #region InitialHalconTool
        //protected override void InitialHalconTool()
        //{
        //    base.InitialHalconTool();
        //    Config.SnapshotPointCollection.ForEach(u =>
        //    {
        //        u.GetHalconToolPathList().ForEach(path =>
        //        {
        //            if (!string.IsNullOrWhiteSpace(path))
        //            {
        //                string directoryPath = Path.GetDirectoryName(path);
        //                string fileName = Path.GetFileNameWithoutExtension(path);
        //                HDevEngineTool tool = new HDevEngineTool(directoryPath);
        //                tool.LoadProcedure(fileName);
        //                //使用“|”作为间隔符
        //                _halconToolDict[u.Id + "|" + path] = tool;
        //            }
        //        });
        //    });
        //}
        #endregion
        private string barCode = "";
        public string BarCode
        #region 流程中抛出异常
        public override void ExceptionRaisedInMonitor(Exception ex)
        {
            get => barCode;
            set
            if (ex is ProcessException pEx)
            {
                if (barCode != value)
                if (pEx.Level >= ExceptionLevel.Fatal)
                {
                    barCode = value;
                    OnBarcodeChanged?.Invoke(value);
                    RaisedAlarm(pEx.Message);
                    MachineState = MachineState.Alarm;
                }
            }
            else
            {
                RaisedAlarm(ex.Message);
                MachineState = MachineState.Alarm;
            }
        }
        #endregion
        public string BarCode { get; set; }
        List<ProductionMeasurement> productionList = new List<ProductionMeasurement>();
        [ProcessMethod("", "StartJob", "开始扫描", InvokeType.TestInvoke)]
        public ProcessResponse StartJob(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
        {
            if (MachineState != MachineState.Ready)
                throw new ProcessException("机台未就绪,请勿开始测量", null, ExceptionLevel.Fatal);
            if (string.IsNullOrWhiteSpace(BarCode))
            {
                OnClearBarcode?.Invoke();
                throw new ProcessException("未输入产品条码,请勿开始测量");
            }
            //检查产品放置OK
            //气缸推动压板移动到产品上方
            //压板压紧产品
            MachineState = MachineState.Running;
            OnMeasureStart?.BeginInvoke(null, null);
            var measurements = Config.MeasurementUnitCollection.Where(u => u.IsEnabled).ToList().DeepSerializeClone();
@@ -182,6 +175,7 @@
            {
                Barcode = BarCode,
                Measurements = measurements,
                StartTime = DateTime.Now,
            };
            var existedProduction = productionList.FirstOrDefault(u => u.Barcode == pMeasure.Barcode);
@@ -213,14 +207,25 @@
                      var response = motionDevice.Run(s.MotionOp.OpConfig);
                      if (!response.Result)
                      {
                          throw new ProcessException($"{device.Name}异常,{response.Message}", null, ExceptionLevel.Info);
                          throw new ProcessException($"{device.Name}异常,{response.Message}", null, ExceptionLevel.Fatal);
                      }
                      CameraBase camera = DeviceCollection.FirstOrDefault(u => u.Id == s.CameraOp.Device) as CameraBase;
                      if (camera == null)
                          return;
                      HImage hImage = CollectHImage(camera, s.CameraOp.OpConfig, out string imgSetId);
                      string imgSetId = "";
                      HImage hImage = null;
                      try
                      {
                          hImage = CollectHImage(camera, s.CameraOp.OpConfig, out imgSetId);
                      }
                      catch (ProcessException pEx)
                      {
                          pEx.Level = ExceptionLevel.Fatal;
                          throw pEx;
                      }
                      if (string.IsNullOrWhiteSpace(imgSetId))
                      {
                          return;
@@ -230,44 +235,64 @@
                  });
            BarCode = "";
            LogAsync(DateTime.Now, $"{pMeasure.Barcode}测量动作完成", "");
            return new ProcessResponse(true);
        }
        /// <summary>
        /// 暂停标志
        /// WaitHandle 暂停句柄  默认为非阻塞 可执行
        /// WaitResult 暂停标志 true 正常执行  false 暂停中
        /// </summary>
        ManualWaitConfirm _pauseHandle = new ManualWaitConfirm()
        #region 双手启动
        bool isLeftStart = false;
        bool IsLeftStart
        {
            WaitHandle = new ManualResetEvent(true),
            WaitResult = true,
        };
        [ProcessMethod("", "PauseJob", "暂停流程", InvokeType.TestInvoke)]
        public ProcessResponse PauseJob(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
        {
            if (_pauseHandle.WaitResult)
            get => isLeftStart;
            set
            {
                #region 板卡暂停动作
                #endregion
                _pauseHandle.WaitHandle.Reset();
                isLeftStart = value;
                StartCheck();
            }
            else
            {
                #region 板卡恢复动作
                #endregion
                _pauseHandle.WaitHandle.Set();
            }
            _pauseHandle.WaitResult = !_pauseHandle.WaitResult;
            return new ProcessResponse(_pauseHandle.WaitResult);
        }
        bool isRightStart = false;
        bool IsRightStart
        {
            get => isRightStart;
            set
            {
                isRightStart = value;
                StartCheck();
            }
        }
        private void StartCheck()
        {
            if (isRightStart && isLeftStart)
            {
                StartJob(null, null, null);
            }
        }
        [ProcessMethod("", "Start_Left", "左手启动", InvokeType.TestInvoke)]
        public ProcessResponse Start_Left(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
        {
            if (opConfig.InputPara != null && opConfig.InputPara.Count > 0)
            {
                IsLeftStart = opConfig.InputPara[0] == 1;
            }
            return new ProcessResponse();
        }
        [ProcessMethod("", "Start_Right", "右手启动", InvokeType.TestInvoke)]
        public ProcessResponse Start_Right(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
        {
            if (opConfig.InputPara != null && opConfig.InputPara.Count > 0)
            {
                IsRightStart = opConfig.InputPara[0] == 1;
            }
            return new ProcessResponse();
        }
        #endregion
        #region 私有方法
        private void MeasureProduction_PropertyChanged(object sender, PropertyChangedEventArgs e)
@@ -330,18 +355,28 @@
                    {
                        return;
                    }
                    //MES输出 todo
                    //Excel报表输出 todo
                    //数据库保存 todo
                    SaveWholeImage(pMeasure);
                    productionList.RemoveAll(p => p.Barcode == pMeasure.Barcode);
                    pMeasure.Dispose();
                }
                pMeasure.EndTime = DateTime.Now;
                bool pResult = pMeasure.Measurements.All(u => u.Spec.MeasureResult == true);
                OnUpdateResult?.Invoke(DateTime.Now, pResult ? 1 : 0);
                OnUpdateCT?.Invoke((float)(pMeasure.EndTime.Value - pMeasure.StartTime.Value).TotalSeconds);
                LogAsync(DateTime.Now, $"{pMeasure.Barcode} 检测完成,结果 {(pResult ? "OK" : "NG")}", "");
                if (MachineState == MachineState.Running)
                    MachineState = MachineState.Ready;
                //MES输出 todo
                //Excel报表输出 todo
                //数据库保存 todo
                SaveWholeImage(pMeasure);
                productionList.RemoveAll(p => p.Barcode == pMeasure.Barcode);
                pMeasure.Dispose();
            }
        }
@@ -377,7 +412,7 @@
            }
        }
        private void SaveKeyImages(string barCode, MeasurementUint measureUnit)
        private void SaveKeyImages(string barCode, MeasurementUnit measureUnit)
        {
            string measureName = measureUnit.GetDisplayText();
            if (Config.ImageSaveOption.IsSaveOriginImage)
@@ -408,7 +443,7 @@
            }
        }
        private async void SaveKeyImages(MeasurementUint measureUnit, string measureName, string dir)
        private async void SaveKeyImages(MeasurementUnit measureUnit, string measureName, string dir)
        {
            await Task.Run(() =>
            {
@@ -428,7 +463,7 @@
        }
        #endregion
        private async void RunImageHandle(CameraBase camera, IOperationConfig opConfig, HImage hImage, string snapshotId, string snapshotName, List<MeasurementUint> measureList)
        private async void RunImageHandle(CameraBase camera, IOperationConfig opConfig, HImage hImage, string snapshotId, string snapshotName, List<MeasurementUnit> measureList)
        {
            await Task.Run(() =>
             {