领胜LDS 键盘AOI检测项目
patrick.xu
2021-02-20 78289c64a16dd02cc9fec595bf758a9e30a30926
src/Bro.M071.Process/M071Process.cs
@@ -19,6 +19,7 @@
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -47,6 +48,7 @@
        public event Action<IShapeElement> OnElementUpdated;
        public event Action<MachineState> OnMachineStateChanged;
        public event Action OnFullResetDone;
        public event Action OnResetDone;
        #endregion
        string _precision = "f3";
@@ -193,7 +195,11 @@
        }
        #endregion
        object productionLock = new object();
        List<ProductionMeasurement> productionList = new List<ProductionMeasurement>();
        bool _isdoing = false;
        object _doingLock = new object();
        [ProcessMethod("", "StartJob", "开始扫描", InvokeType.TestInvoke)]
        public ProcessResponse StartJob(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice)
@@ -204,12 +210,13 @@
            }
            string hint = "";
            if (MachineState != MachineState.Ready)
            {
                hint = "机台未就绪,请勿开始测量";
                OnCheckHintUpload?.Invoke(hint, true);
                throw new ProcessException(hint, null, ExceptionLevel.Warning);
            }
            //if (MachineState != MachineState.Ready)
            //{
            //    hint = "机台未就绪,请勿开始测量";
            //    OnCheckHintUpload?.Invoke(hint, true);
            //    throw new ProcessException(hint, null, ExceptionLevel.Warning);
            //}
            if (string.IsNullOrWhiteSpace(BarCode))
            {
@@ -217,6 +224,17 @@
                OnClearBarcode?.Invoke();
                OnCheckHintUpload?.Invoke(hint, true);
                throw new ProcessException(hint);
            }
            lock (_doingLock)
            {
                if (_isdoing)
                {
                    LogAsync(DateTime.Now, "设备正在运行中", "");
                    return new ProcessResponse(true);
                }
                _isdoing = true;
            }
            MachineState = MachineState.Running;
@@ -247,20 +265,25 @@
            BarCode = "";
            var existedProduction = productionList.FirstOrDefault(u => u.Barcode == pMeasure.Barcode);
            if (existedProduction != null)
            lock (productionLock)
            {
                productionList.Remove(existedProduction);
                existedProduction.Dispose();
                existedProduction = null;
            }
                var existedProduction = productionList.FirstOrDefault(u => u.Barcode == pMeasure.Barcode);
                if (existedProduction != null)
                {
                    productionList.Remove(existedProduction);
                    existedProduction.Dispose();
                    existedProduction = null;
                }
            productionList.Add(pMeasure);
                productionList.Add(pMeasure);
            }
            pMeasure.InitialMeasurementsPropertyChanged();
            pMeasure.PropertyChanged += MeasureProduction_PropertyChanged;
            Config.SnapshotPointCollection.Where(u => u.IsEnabled).ToList().ForEach(s =>
            try
            {
                Config.SnapshotPointCollection.Where(u => u.IsEnabled).ToList().ForEach(s =>
                  {
                      _pausedHandle.Wait();
@@ -309,23 +332,43 @@
                      RunImageHandle(s.CameraOp.OpConfig, set, s.Id, s.Name, pMeasure.Measurements);
                  });
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                LogAsync(DateTime.Now, $"{pMeasure.Barcode}测量动作完成", "");
                _isdoing = false;
            LogAsync(DateTime.Now, $"{pMeasure.Barcode}测量动作完成", "");
            GC.Collect(0, GCCollectionMode.Optimized);
                GC.Collect(0, GCCollectionMode.Optimized);
            }
            return new ProcessResponse(true);
        }
        #region 双手启动
        object _leftStartLock = new object();
        object _rightStartLock = new object();
        bool isLeftStart = false;
        bool IsLeftStart
        {
            get => isLeftStart;
            set
            {
                isLeftStart = value;
                StartCheck();
                if (isLeftStart != value)
                {
                    lock (_leftStartLock)
                    {
                        if (IsLeftStart != value)
                        {
                            isLeftStart = value;
                            StartCheck();
                        }
                    }
                }
            }
        }
@@ -335,15 +378,30 @@
            get => isRightStart;
            set
            {
                isRightStart = value;
                StartCheck();
                if (isRightStart != value)
                {
                    lock (_rightStartLock)
                    {
                        if (isRightStart != value)
                        {
                            isRightStart = value;
                            StartCheck();
                        }
                    }
                }
            }
        }
        private void StartCheck()
        {
            if (isRightStart && isLeftStart)
            {
                if (_isdoing)
                {
                    OnCheckHintUpload?.Invoke("设备运行中", false);
                    return;
                }
                StartJob(null, null, null);
            }
        }
@@ -444,9 +502,13 @@
        {
            if (sender is ProductionMeasurement pMeasure)
            {
                var production = productionList.FirstOrDefault(u => u.Barcode == pMeasure.Barcode);
                if (production == null)
                    return;
                ProductionMeasurement production = null;
                lock (productionLock)
                {
                    production = productionList.FirstOrDefault(u => u.Barcode == pMeasure.Barcode);
                    if (production == null)
                        return;
                }
                lock (production)
                {
@@ -585,7 +647,10 @@
                SaveWholeImage(pMeasure);
                productionList.RemoveAll(p => p.Barcode == pMeasure.Barcode);
                lock (productionLock)
                {
                    productionList.RemoveAll(p => p.Barcode == pMeasure.Barcode);
                }
                pMeasure.Dispose();
                //LogAsync(DateTime.Now, $"{pMeasure.Barcode}产品信息释放完成", JsonConvert.SerializeObject(pMeasure));
            }
@@ -1195,6 +1260,13 @@
                var keys = Config.KeyUnitCollection.Where(u => u.IsEnabled && u.SnapshotPointId == snapshotId);
                var keyBindCollection = measureList.SelectMany(u => u.KeyUnitCollection).Where(u => keys.Any(k => k.Key == u.Key)).ToList();
                if (imgSet.HImage == null)
                {
                    LogAsync(DateTime.Now, $"{snapshotName}未获取扫描图像", "");
                    keyBindCollection.ForEach(k => k.FillKeyValues(null));
                    return;
                }
                string toolKey = (opConfig as CameraOprerationConfigBase).AlgorithemPath;
                HObject images = new HObject();