From ff7cab72419729ce2c5adc46350ef45d89a5d1e5 Mon Sep 17 00:00:00 2001
From: patrick.xu <patrick.xu@broconcentric.com>
Date: 星期六, 24 七月 2021 10:31:41 +0800
Subject: [PATCH] MES动作添加异常捕捉和重试机制

---
 src/Bro.M071.Process/M071Process.cs |  179 +++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 118 insertions(+), 61 deletions(-)

diff --git a/src/Bro.M071.Process/M071Process.cs b/src/Bro.M071.Process/M071Process.cs
index 9f967b6..a281648 100644
--- a/src/Bro.M071.Process/M071Process.cs
+++ b/src/Bro.M071.Process/M071Process.cs
@@ -58,25 +58,31 @@
         {
             InitialSetting();
 
-            base.Open();
+            if (!Config.IsOfflineMode)
+            {
+                base.Open();
 
-            InitialMotionCardBaseAxisAlarm();
+                InitialMotionCardBaseAxisAlarm();
 
-            SwitchBeep(false);
-            SwitchLightGreen(false);
-            SwitchLightRed(false);
-            SwitchLightYellow(false);
+                SwitchBeep(false);
+                SwitchLightGreen(false);
+                SwitchLightRed(false);
+                SwitchLightYellow(false);
 
-            Reset(null, null, null);
-            FullReset(null);
+                Reset(null, null, null);
+                FullReset(null);
+            }
 
             if (Config.Precision > 0)
             {
                 _precision = "f" + Config.Precision;
             }
 
-            IncomingCheckMethod = InitialMESWebServiceMethod(IncomingCheckMethodName, out IncomingCheckObj);
-            DataUploadMethod = InitialMESWebServiceMethod(DataUploadMethodName, out DataUploadObj);
+            if (Config.IsEnableMESUpload)
+            {
+                IncomingCheckMethod = InitialMESWebServiceMethod(IncomingCheckMethodName, out IncomingCheckObj);
+                DataUploadMethod = InitialMESWebServiceMethod(DataUploadMethodName, out DataUploadObj);
+            }
 
             var allowedShiftStr = ConfigurationManager.AppSettings["DataShift"];
             if (!double.TryParse(allowedShiftStr, out _allowedShift))
@@ -195,6 +201,37 @@
         }
         #endregion
 
+
+        AutoResetEvent _jobDoneHandle = new AutoResetEvent(false);
+        [ProcessMethod("ManualTest", "ManualTest", "鎵嬪姩娴嬭瘯", InvokeType.TestInvoke)]
+        public ProcessResponse ManualTest(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice)
+        {
+            if (config is ManualTestOperationConfig opConfig)
+            {
+                Task.Run(async () =>
+                {
+                    for (int i = 0; i < opConfig.RepeatTimes; i++)
+                    {
+                        BarCode = $"Test_{i + 1}";
+                        StartJob(null, null, null);
+
+                        if (_jobDoneHandle.WaitOne(20000))
+                        {
+                            LogAsync(DateTime.Now, $"绗瑊i + 1}娆′换鍔″畬鎴�", "");
+                            await Task.Delay(500);
+                        }
+                        else
+                        {
+                            LogAsync(DateTime.Now, $"绗瑊i + 1}娆′换鍔¤秴鏃�", "");
+                            break;
+                        }
+                    }
+                });
+            }
+
+            return new ProcessResponse(true);
+        }
+
         object productionLock = new object();
         List<ProductionMeasurement> productionList = new List<ProductionMeasurement>();
 
@@ -237,7 +274,7 @@
                 _isdoing = true;
             }
 
-            MachineState = MachineState.Running;
+            MeasureState = MachineState = MachineState.Running;
 
             OnCheckHintUpload?.Invoke(hint, true);
             OnMeasureStart?.Invoke();
@@ -394,7 +431,6 @@
 
         private void StartCheck()
         {
-
             if (isRightStart && isLeftStart)
             {
                 if (_isdoing)
@@ -618,6 +654,7 @@
                 //if (MachineState == MachineState.Running)
                 //    MachineState = MachineState.Ready;
 
+                MeasureState = MachineState.Ready;
                 if (MachineState != MachineState.Alarm)
                 {
                     if (MachineState == MachineState.Pause)
@@ -629,6 +666,8 @@
                         MachineState = MachineState.Ready;
                     }
                 }
+
+                _jobDoneHandle.Set();
 
                 var measurementUnitResultAndKeyUnitDataSet = GetMeasurementUnitResultAndKeyUnitData(pMeasure);
 
@@ -821,6 +860,7 @@
         //}
 
         static object excelExportLock = new object();
+        string fileName = "";
         private async void ExportProductionInColumns(ProductionMeasurementUnitResultAndKeyUnitDataSet exportData)
         {
             if (!Config.IsCSVOutputEnabled)
@@ -834,7 +874,11 @@
                     {
                         Directory.CreateDirectory(Config.LogPath);
                     }
-                    var fileName = Path.Combine(Config.LogPath, $"LDSData_{DateTime.Now.ToString("yyyyMMdd")}.xlsx");
+
+                    if (string.IsNullOrWhiteSpace(fileName))
+                    {
+                        fileName = Path.Combine(Config.LogPath, $"LDSData_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.xlsx");
+                    }
 
                     try
                     {
@@ -1139,9 +1183,10 @@
                     catch (Exception ex)
                     {
                         LogAsync(DateTime.Now, "Excel鏃ュ織寮傚父", ex.GetExceptionMessage());
-                        string bkFileName = Path.Combine(Config.LogPath, $"{Path.GetFileNameWithoutExtension(fileName)}_bk_{DateTime.Now.ToString("HHmmss")}.xlsx");
-                        File.Copy(fileName, bkFileName);
-                        File.Delete(fileName);
+                        fileName = Path.Combine(Config.LogPath, $"LDSData_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.xlsx");
+                        //string bkFileName = Path.Combine(Config.LogPath, $"{Path.GetFileNameWithoutExtension(fileName)}_bk_{DateTime.Now.ToString("HHmmss")}.xlsx");
+                        //File.Copy(fileName, bkFileName);
+                        //File.Delete(fileName);
                     }
                 }
             });
@@ -1263,6 +1308,8 @@
         }
         #endregion
 
+        static object _resultCalcLock = new object();
+
         private async void RunImageHandle(IOperationConfig opConfig, IImageSet imgSet, string snapshotId, string snapshotName, List<MeasurementUnit> measureList)
         {
             await Task.Run(() =>
@@ -1340,71 +1387,81 @@
                 //    Directory.CreateDirectory(dir);
                 //}
 
-                //Parallel.For(1, count.I + 1, (i) =>
-                for (int i = 1; i <= count.I; i++)
+                lock (_resultCalcLock)
                 {
-                    HOperatorSet.SelectObj(images, out HObject image, i);
-
-                    //string fileName = Path.Combine(dir, $"{i}.tif");
-                    //using (HImage temp = image.ConvertHObjectToHImage())
-                    //{
-                    //    temp.WriteImage("tiff", 0, fileName);
-                    //}
-
-                    keys.Where(u => u.ImageSeq == i).ToList().ForEach(k =>
+                    //Parallel.For(1, count.I + 1, (i) =>
+                    for (int i = 1; i <= count.I; i++)
                     {
-                        Dictionary<string, double> resultDict = null;
+                        HOperatorSet.SelectObj(images, out HObject image, i);
 
-                        var keyBindList = keyBindCollection.Where(u => u.Key == k.Key).ToList();
+                        //string fileName = Path.Combine(dir, $"{i}.tif");
+                        //using (HImage temp = image.ConvertHObjectToHImage())
+                        //{
+                        //    temp.WriteImage("tiff", 0, fileName);
+                        //}
 
-                        string keyToolKey = k.AliasName + "|" + k.KeyAlgorithemPath;
-                        if (!_halconToolDict.ContainsKey(keyToolKey))
+                        keys.Where(u => u.ImageSeq == i).ToList().ForEach(k =>
                         {
-                            LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曟湭鍒濆鍖�", "");
-                        }
-                        else
-                        {
-                            _halconToolDict[keyToolKey].InputImageDic["INPUT_Image"] = image;
-                            _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_X"] = scanParam.Resolution_X / 1000000.0;
-                            _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Y"] = scanParam.Resolution_Y / 1000000.0;
-                            _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Z"] = scanParam.Resolution_Z / 1000000.0;
-                            _halconToolDict[keyToolKey].InputTupleDic["INPUT_ImageId"] = $"{k.AliasName}_{DateTime.Now.ToString("HHmmssfff")}.tif";
-                            if (!_halconToolDict[keyToolKey].RunProcedure(out string error))
+                            Dictionary<string, double> resultDict = null;
+
+                            var keyBindList = keyBindCollection.Where(u => u.Key == k.Key).ToList();
+
+                            string keyToolKey = k.AliasName + "|" + k.KeyAlgorithemPath;
+                            if (!_halconToolDict.ContainsKey(keyToolKey))
                             {
-                                LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曞紓甯革紝{error}", "");
+                                LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曟湭鍒濆鍖�", "");
                             }
                             else
                             {
-                                var results = _halconToolDict[keyToolKey].GetResultTuple("OUTPUT_Results").DArr.ToList();
-                                if (results.Count == 0 || results.Any(u => u < 0))
+                                _halconToolDict[keyToolKey].InputImageDic["INPUT_Image"] = image;
+                                _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_X"] = scanParam.Resolution_X / 1000000.0;
+                                _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Y"] = scanParam.Resolution_Y / 1000000.0;
+                                _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Z"] = scanParam.Resolution_Z / 1000000.0;
+                                _halconToolDict[keyToolKey].InputTupleDic["INPUT_ImageId"] = $"{k.AliasName}_{DateTime.Now.ToString("HHmmssfff")}.tif";
+                                if (!_halconToolDict[keyToolKey].RunProcedure(out string error))
                                 {
-                                    LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁寮傚父", "");
+                                    LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曞紓甯革紝{error}", "");
                                 }
                                 else
                                 {
-                                    //LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁", $"{string.Join(" ", results)}");
-
-                                    results = results.Select(u => u - Config.PlanCompensation).ToList();
-                                    resultDict = k.KeyResultList.ToDictionary(u => u, u =>
+                                    var results = _halconToolDict[keyToolKey].GetResultTuple("OUTPUT_Results").DArr.ToList();
+                                    if (results.Count == 0 || results.Any(u => u < 0))
                                     {
-                                        int index = k.KeyResultList.IndexOf(u);
-                                        return results[index];
-                                    });
+                                        LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁寮傚父", "");
+                                    }
+                                    else
+                                    {
+                                        //LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁", $"{string.Join(" ", results)}");
+
+                                        results = results.Select(u => u - Config.PlanCompensation).ToList();
+                                        resultDict = k.KeyResultList.ToDictionary(u => u, u =>
+                                        {
+                                            int index = k.KeyResultList.IndexOf(u);
+                                            return results[index];
+                                        });
+                                    }
                                 }
                             }
-                        }
 
-                        keyBindList.ForEach(kb =>
-                        {
-                            kb.KeyImages.Add(image.ConvertHObjectToHImage());
-                            kb.FillKeyValues(resultDict);
+                            keyBindList.ForEach(kb =>
+                            {
+                                if (kb.KeyImages != null)
+                                {
+                                    kb.KeyImages.Add(image.ConvertHObjectToHImage());
+                                    kb.FillKeyValues(resultDict);
+                                }
+                                else
+                                {
+
+                                }
+                            });
                         });
-                    });
 
-                    image.Dispose();
-                    image = null;
+                        image.Dispose();
+                        image = null;
+                    }
+                    //);
                 }
-                //);
 
                 imgSet.HImage.Dispose();
                 imgSet.HImage = null;

--
Gitblit v1.8.0