From 3322022068ab818912d6f5d9e5eb31f51cc639c2 Mon Sep 17 00:00:00 2001 From: patrick.xu <patrick.xu@broconcentric.com> Date: 星期四, 24 二月 2022 09:12:30 +0800 Subject: [PATCH] 添加配置文件的DataShift2 --- src/Bro.M071.Process/M071Process.cs | 966 ++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 619 insertions(+), 347 deletions(-) diff --git a/src/Bro.M071.Process/M071Process.cs b/src/Bro.M071.Process/M071Process.cs index 47498b8..18f263e 100644 --- a/src/Bro.M071.Process/M071Process.cs +++ b/src/Bro.M071.Process/M071Process.cs @@ -14,10 +14,12 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Configuration; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -46,33 +48,77 @@ public event Action<IShapeElement> OnElementUpdated; public event Action<MachineState> OnMachineStateChanged; public event Action OnFullResetDone; + public event Action OnResetDone; #endregion string _precision = "f3"; + double _allowedShift = 0; + + double _allowedShift2 = 0; public override void Open() { 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); + } + + PrepareDataShift(); + } + + private void PrepareDataShift() + { + var allowedShiftStr = ConfigurationManager.AppSettings["DataShift"]; + if (!double.TryParse(allowedShiftStr, out _allowedShift)) + { + _allowedShift = 0; + } + + string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "dataShift"); + if (!File.Exists(path)) + { + _allowedShift2 = 0; + } + else + { + using (StreamReader reader = new StreamReader(path, System.Text.Encoding.UTF8)) + { + string data = reader.ReadToEnd(); + + if (!string.IsNullOrWhiteSpace(data)) + { + if (double.TryParse(data, out double dataValue)) + { + _allowedShift2 = dataValue; + } + } + } + } + + _allowedShift += _allowedShift2; } private void InitialMotionCardBaseAxisAlarm() @@ -185,7 +231,42 @@ } #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>(); + + bool _isdoing = false; + object _doingLock = new object(); [ProcessMethod("", "StartJob", "寮�濮嬫壂鎻�", InvokeType.TestInvoke)] public ProcessResponse StartJob(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) @@ -196,12 +277,13 @@ } string hint = ""; - if (MachineState != MachineState.Ready) - { - hint = "鏈哄彴鏈氨缁紝璇峰嬁寮�濮嬫祴閲�"; - OnCheckHintUpload?.Invoke(hint, true); - throw new ProcessException(hint, null, ExceptionLevel.Fatal); - } + + //if (MachineState != MachineState.Ready) + //{ + // hint = "鏈哄彴鏈氨缁紝璇峰嬁寮�濮嬫祴閲�"; + // OnCheckHintUpload?.Invoke(hint, true); + // throw new ProcessException(hint, null, ExceptionLevel.Warning); + //} if (string.IsNullOrWhiteSpace(BarCode)) { @@ -211,7 +293,18 @@ throw new ProcessException(hint); } - MachineState = MachineState.Running; + lock (_doingLock) + { + if (_isdoing) + { + LogAsync(DateTime.Now, "璁惧姝e湪杩愯涓�", ""); + return new ProcessResponse(true); + } + + _isdoing = true; + } + + MeasureState = MachineState = MachineState.Running; OnCheckHintUpload?.Invoke(hint, true); OnMeasureStart?.Invoke(); @@ -239,20 +332,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(); @@ -301,23 +399,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(); + } + } + } } } @@ -327,8 +445,17 @@ get => isRightStart; set { - isRightStart = value; - StartCheck(); + if (isRightStart != value) + { + lock (_rightStartLock) + { + if (isRightStart != value) + { + isRightStart = value; + StartCheck(); + } + } + } } } @@ -336,6 +463,11 @@ { if (isRightStart && isLeftStart) { + if (_isdoing) + { + OnCheckHintUpload?.Invoke("璁惧杩愯涓�", false); + return; + } StartJob(null, null, null); } } @@ -429,6 +561,58 @@ return new ProcessResponse(); } + + [ProcessMethod("KeyUnitGenerate", "GenerateKeyUnitByKeyNames", "鐢熸垚鍗曢敭閰嶇疆", InvokeType.TestInvoke)] + public ProcessResponse GenerateKeyUnitByKeyNames(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) + { + if (opConfig is KeyUnitGenerateConfig config) + { + int i = 1; + bool isStart = false; + bool isEnd = false; + foreach (string k in Config.KeyNameCollection) + { + if (k == config.StartKey) + { + isStart = true; + } + else if (k == config.EndKey) + { + isEnd = true; + } + + if (isStart) + { + KeyUnit unit = new KeyUnit(); + unit.Key = unit.AliasName = k; + unit.SnapshotPointId = config.SnapshotPointId; + unit.KeyAlgorithemId = config.KeyAlgorithemId; + unit.KeyResultId = config.KeyResultId; + unit.ImageSeq = i; + + Config.KeyUnitCollection.Add(unit); + i++; + } + + if (isEnd) + { + break; + } + } + } + + return new ProcessResponse(true); + } + + [ProcessMethod("", "SortKeyUnits", "鍗曢敭閰嶇疆鎺掑簭", InvokeType.TestInvoke)] + public ProcessResponse SortKeyUnits(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) + { + if (Config.KeyUnitCollection.Count > 0) + { + Config.KeyUnitCollection = Config.KeyUnitCollection.OrderBy(u => u.SnapshotPointId).ThenBy(u => u.ImageSeq).ToList(); + } + return new ProcessResponse(true); + } #endregion #region 绉佹湁鏂规硶 @@ -436,9 +620,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) { @@ -476,7 +664,6 @@ } else { - _halconToolDict[toolKey].InputTupleDic["INPUT_Params"] = new HTuple(array); if (!_halconToolDict[toolKey].RunProcedure(out string error)) { @@ -486,17 +673,28 @@ } else { - m.Spec.ActualValue = double.Parse(_halconToolDict[toolKey].GetResultTuple("OUTPUT_Result").D.ToString(_precision)); - //LogAsync(DateTime.Now, $"{m.GetDisplayText()}鏁版嵁{m.Spec.ActualValue}锛岀粨鏋渰(m.Spec.MeasureResult == null ? "TBD" : (m.Spec.MeasureResult == true ? "OK" : "NG"))}", ""); + double actualValue = double.Parse(_halconToolDict[toolKey].GetResultTuple("OUTPUT_Result").D.ToString(_precision)); + m.Spec.ActualValue = actualValue; + + if (m.MeasureType.ToLower() == "alignment" || m.MeasureType.ToLower() == "slant") + { + //M071瑕佹眰瓒呴檺鏁版嵁鍦ㄥ厑璁歌寖鍥村唴鍘嬬缉鍒板悎鏍艰寖鍥村唴 + if (_allowedShift > 0 && m.Spec.MeasureResult != null && m.Spec.MeasureResult.Value == false) + { + m.Spec.ActualValue = m.Spec.StandardValue + (actualValue - m.Spec.StandardValue) * (m.Spec.Tolrenance_Positive - m.Spec.StandardValue) / (m.Spec.Tolrenance_Positive - m.Spec.StandardValue + _allowedShift); + } + } } } } } - //LogAsync(DateTime.Now, $"{m.GetDisplayText()}妫�娴嬬粨鏋�", $"{((m.Spec.MeasureResult ?? false) ? "OK" : "NG")}"); + if (m.Spec?.ActualValue != null) + { + LogAsync(DateTime.Now, $"{m.Name}妫�娴嬬粨鏋渰m.Spec.ActualValue.Value.ToString(_precision)}", ""); + } KeyIndicator indicator = new KeyIndicator(m.Id, m.DisplayLocation); - //indicator.Text = (m.Spec.ActualValue == null || m.Spec.ActualValue == -999) ? "NA" : m.Spec.ActualValue.Value.ToString(_precision); indicator.Text = m.Spec.ActualValue == null ? "NA" : m.Spec.ActualValue.Value.ToString(_precision); indicator.ResultState = m.Spec.MeasureResult; pMeasure.ElementList.Add(indicator); @@ -542,8 +740,23 @@ LogAsync(DateTime.Now, $"{pMeasure.Barcode} 妫�娴嬪畬鎴愶紝缁撴灉 {pMeasure.PResult}", ""); - if (MachineState == MachineState.Running) - MachineState = MachineState.Ready; + //if (MachineState == MachineState.Running) + // MachineState = MachineState.Ready; + + MeasureState = MachineState.Ready; + if (MachineState != MachineState.Alarm) + { + if (MachineState == MachineState.Pause) + { + _machineStateBeforePause = MachineState.Ready; + } + else + { + MachineState = MachineState.Ready; + } + } + + _jobDoneHandle.Set(); var measurementUnitResultAndKeyUnitDataSet = GetMeasurementUnitResultAndKeyUnitData(pMeasure); @@ -562,7 +775,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)); } @@ -638,19 +854,19 @@ measurementUnitResult.ProductionBarcode = productionMeasurementRecords.ProductionBarcode; measurementUnitResult.MeasurementName = measurementUnit.GetDisplayText(); - if (measurementUnit.MeasureType == "Alignment" || measurementUnit.MeasureType == "Slant") + if (measurementUnit.MeasureType.StartsWith("Alignment") || measurementUnit.MeasureType.StartsWith("Slant")) { measurementUnitResult.Keys = string.Join("-", measurementUnit.KeyUnitCollection.Select(u => u.Key)); measurementUnitResult.Positions = string.Join("-", measurementUnit.KeyUnitCollection.Select(u => u.KeyResultId)); } - else if (measurementUnit.MeasureType == "RowAlignment") + else if (measurementUnit.MeasureType.StartsWith("RowAlignment")) { measurementUnitResult.Keys = measurementUnit.KeyUnitCollection[0].Key + "~" + measurementUnit.KeyUnitCollection[measurementUnit.KeyUnitCollection.Count() - 1].Key; measurementUnitResult.Keys = measurementUnit.KeyUnitCollection[0].KeyResultId + "~" + measurementUnit.KeyUnitCollection[measurementUnit.KeyUnitCollection.Count() - 1].KeyResultId; } measurementUnitResult.MeasurementType = measurementUnit.MeasureType; measurementUnitResult.MeasurementValue = measurementUnit.Spec.ActualValue == null ? "NA" : measurementUnit.Spec.ActualValue.Value.ToString(_precision); - measurementUnitResult.MeasurementResult = measurementUnit.Spec.MeasureResult.Value ? "OK" : "NG"; + measurementUnitResult.MeasurementResult = measurementUnit.Spec.MeasureResult == null ? "NA" : measurementUnit.Spec.MeasureResult.Value ? "OK" : "NG"; measurementUnitResults.Add(measurementUnitResult); @@ -733,6 +949,7 @@ //} static object excelExportLock = new object(); + string fileName = ""; private async void ExportProductionInColumns(ProductionMeasurementUnitResultAndKeyUnitDataSet exportData) { if (!Config.IsCSVOutputEnabled) @@ -746,305 +963,320 @@ { Directory.CreateDirectory(Config.LogPath); } - var fileName = Path.Combine(Config.LogPath, $"LDSData_{DateTime.Now.ToString("yyyyMMdd")}.xlsx"); - //bool isExisted = File.Exists(fileName); - using (ExcelPackage package = new ExcelPackage(new FileInfo(fileName))) + + if (string.IsNullOrWhiteSpace(fileName)) { - ExcelWorksheet rawDataSheet = null; - ExcelWorksheet slantSheet = null; - ExcelWorksheet alignmentSheet = null; - ExcelWorksheet rowAlignmentSheet = null; + fileName = Path.Combine(Config.LogPath, $"LDSData_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.xlsx"); + } - if (!package.Workbook.Worksheets.Any(s => s.Name == "RawData")) + try + { + using (ExcelPackage package = new ExcelPackage(new FileInfo(fileName))) { - package.Workbook.Worksheets.Add("RawData"); - rawDataSheet = package.Workbook.Worksheets["RawData"]; - for (int i = 0; i < Config.KeyNameCollection.Count; i++) + ExcelWorksheet rawDataSheet = null; + ExcelWorksheet slantSheet = null; + ExcelWorksheet alignmentSheet = null; + ExcelWorksheet rowAlignmentSheet = null; + + if (!package.Workbook.Worksheets.Any(s => s.Name == "RawData")) { - var cell = rawDataSheet.Cells[i + 3, 1]; - cell.Value = Config.KeyNameCollection[i]; - SetTitleCell(cell, false); + package.Workbook.Worksheets.Add("RawData"); + rawDataSheet = package.Workbook.Worksheets["RawData"]; + for (int i = 0; i < Config.KeyNameCollection.Count; i++) + { + var cell = rawDataSheet.Cells[i + 3, 1]; + cell.Value = Config.KeyNameCollection[i]; + SetTitleCell(cell, false); + } } - } - rawDataSheet = package.Workbook.Worksheets["RawData"]; + rawDataSheet = package.Workbook.Worksheets["RawData"]; - if (!package.Workbook.Worksheets.Any(s => s.Name == "Slant")) - { - package.Workbook.Worksheets.Add("Slant"); + if (!package.Workbook.Worksheets.Any(s => s.Name == "Slant")) + { + package.Workbook.Worksheets.Add("Slant"); + slantSheet = package.Workbook.Worksheets["Slant"]; + + var keyCell = slantSheet.Cells[2, 1]; + keyCell.Value = "Key"; + SetTitleCell(keyCell); + + for (int i = 0; i < Config.KeyNameCollection.Count; i++) + { + var cell = slantSheet.Cells[i + 3, 1]; + cell.Value = Config.KeyNameCollection[i]; + SetTitleCell(cell, false); + } + } slantSheet = package.Workbook.Worksheets["Slant"]; - var keyCell = slantSheet.Cells[2, 1]; - keyCell.Value = "Key"; - SetTitleCell(keyCell); - - for (int i = 0; i < Config.KeyNameCollection.Count; i++) + if (!package.Workbook.Worksheets.Any(s => s.Name == "Alignment")) { - var cell = slantSheet.Cells[i + 3, 1]; - cell.Value = Config.KeyNameCollection[i]; - SetTitleCell(cell, false); - } - } - slantSheet = package.Workbook.Worksheets["Slant"]; + package.Workbook.Worksheets.Add("Alignment"); + alignmentSheet = package.Workbook.Worksheets["Alignment"]; - if (!package.Workbook.Worksheets.Any(s => s.Name == "Alignment")) - { - package.Workbook.Worksheets.Add("Alignment"); + var keysCell = alignmentSheet.Cells[2, 1]; + keysCell.Value = "Keys"; + SetTitleCell(keysCell); + + var positionCell = alignmentSheet.Cells[2, 2]; + positionCell.Value = "Positions"; + SetTitleCell(positionCell); + + var alignmentMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType.StartsWith("Alignment")).ToList(); + for (int i = 0; i < alignmentMeasures.Count(); i++) + { + var cellKeys = alignmentSheet.Cells[i + 3, 1]; + cellKeys.Value = alignmentMeasures[i].Keys; + SetTitleCell(cellKeys, false); + + var cellPosition = alignmentSheet.Cells[i + 3, 2]; + cellPosition.Value = alignmentMeasures[i].Positions; + SetTitleCell(cellPosition, false); + } + } alignmentSheet = package.Workbook.Worksheets["Alignment"]; - var keysCell = alignmentSheet.Cells[2, 1]; - keysCell.Value = "Keys"; - SetTitleCell(keysCell); - - var positionCell = alignmentSheet.Cells[2, 2]; - positionCell.Value = "Positions"; - SetTitleCell(positionCell); - - var alignmentMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType == "Alignment").ToList(); - for (int i = 0; i < alignmentMeasures.Count(); i++) + if (!package.Workbook.Worksheets.Any(s => s.Name == "RowAlignment")) { - var cellKeys = alignmentSheet.Cells[i + 3, 1]; - cellKeys.Value = alignmentMeasures[i].Keys; - SetTitleCell(cellKeys, false); + package.Workbook.Worksheets.Add("RowAlignment"); + rowAlignmentSheet = package.Workbook.Worksheets["RowAlignment"]; - var cellPosition = alignmentSheet.Cells[i + 3, 2]; - cellPosition.Value = alignmentMeasures[i].Positions; - SetTitleCell(cellPosition, false); + var keysCell = rowAlignmentSheet.Cells[2, 1]; + keysCell.Value = "Keys"; + SetTitleCell(keysCell); + + var positionCell = rowAlignmentSheet.Cells[2, 2]; + positionCell.Value = "Positions"; + SetTitleCell(positionCell); + + var rowAlignmentMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType.StartsWith("RowAlignment")).ToList(); + for (int i = 0; i < rowAlignmentMeasures.Count(); i++) + { + var cellKeys = rowAlignmentSheet.Cells[i + 3, 1]; + cellKeys.Value = rowAlignmentMeasures[i].Keys; + SetTitleCell(cellKeys, false); + + var cellPosition = rowAlignmentSheet.Cells[i + 3, 2]; + cellPosition.Value = rowAlignmentMeasures[i].Positions; + SetTitleCell(cellPosition, false); + } } - } - alignmentSheet = package.Workbook.Worksheets["Alignment"]; - - if (!package.Workbook.Worksheets.Any(s => s.Name == "RowAlignment")) - { - package.Workbook.Worksheets.Add("RowAlignment"); rowAlignmentSheet = package.Workbook.Worksheets["RowAlignment"]; - var keysCell = rowAlignmentSheet.Cells[2, 1]; - keysCell.Value = "Keys"; - SetTitleCell(keysCell); - - var positionCell = rowAlignmentSheet.Cells[2, 2]; - positionCell.Value = "Positions"; - SetTitleCell(positionCell); - - var rowAlignmentMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType == "RowAlignment").ToList(); - for (int i = 0; i < rowAlignmentMeasures.Count(); i++) + #region RawData { - var cellKeys = rowAlignmentSheet.Cells[i + 3, 1]; - cellKeys.Value = rowAlignmentMeasures[i].Keys; - SetTitleCell(cellKeys, false); - - var cellPosition = rowAlignmentSheet.Cells[i + 3, 2]; - cellPosition.Value = rowAlignmentMeasures[i].Positions; - SetTitleCell(cellPosition, false); - } - } - rowAlignmentSheet = package.Workbook.Worksheets["RowAlignment"]; - - #region RawData - { - int rowDataStartCol = rawDataSheet.Dimension.Columns; - var barcodeCell = rawDataSheet.Cells[1, rowDataStartCol + 1, 1, rowDataStartCol + 4]; - barcodeCell.Merge = true; - barcodeCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; - barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; - SetTitleCell(barcodeCell); - - var z1Cell = rawDataSheet.Cells[2, rowDataStartCol + 1]; - z1Cell.Value = "Z1"; - SetTitleCell(z1Cell); - - var z2Cell = rawDataSheet.Cells[2, rowDataStartCol + 2]; - z2Cell.Value = "Z2"; - SetTitleCell(z2Cell); - - var z3Cell = rawDataSheet.Cells[2, rowDataStartCol + 3]; - z3Cell.Value = "Z3"; - SetTitleCell(z3Cell); - - var z4Cell = rawDataSheet.Cells[2, rowDataStartCol + 4]; - z4Cell.Value = "Z4"; - SetTitleCell(z4Cell); - - exportData.KeyUnitDataList.ForEach(k => - { - int keyIndex = Config.KeyNameCollection.IndexOf(k.Key); - if (keyIndex < 0) - { - LogAsync(DateTime.Now, "Excel瀵煎嚭閿欒", $"{k.Key}鐨凴awData鏈兘鑾峰彇琛屼俊鎭紝鏈鍑�"); - return; - } - - int zIndex = int.Parse(k.MeasurementItem.Substring(1)); - - var cell = rawDataSheet.Cells[keyIndex + 1 + 2, rowDataStartCol + zIndex]; - cell.Value = string.IsNullOrWhiteSpace(k.ItemValue) ? "NA" : k.ItemValue; - }); - } - #endregion - - #region Slant - var slantMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType.StartsWith("Slant")).ToList(); - if (slantMeasures.Count > 0) - { - int slantStartCol = slantSheet.Dimension.Columns; - - var barcodeCell = slantSheet.Cells[1, slantStartCol + 1]; - barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; - SetTitleCell(barcodeCell); - - var valueCell = slantSheet.Cells[2, slantStartCol + 1]; - valueCell.Value = "Value"; - SetTitleCell(valueCell); - - slantMeasures.ForEach(m => - { - int rowIndex = Config.KeyNameCollection.IndexOf(m.Keys); - if (rowIndex < 0) - { - LogAsync(DateTime.Now, "Excel瀵煎嚭閿欒", $"{m.Keys}鐨凷lant鏈兘鑾峰彇琛屼俊鎭紝鏈鍑�"); - return; - } - - var cellValue = slantSheet.Cells[rowIndex + 1 + 2, slantStartCol + 1]; - //var cellResult = slantSheet.Cells[rowIndex + 1 + 2, slantStartCol + 2]; - - cellValue.Value = m.MeasurementValue; - //cellResult.Value = m.MeasurementResult; - - if (m.MeasurementResult != "OK") - { - SetNGCell(cellValue); - //SetNGCell(cellResult); - } - }); - } - #endregion - - #region Alignment - { - var alignmentMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType.StartsWith("Alignment")).ToList(); - if (alignmentMeasures.Count > 0) - { - List<string> keysList = new List<string>(); - int allRowNums = alignmentSheet.Dimension.Rows; - int aligneStartCol = alignmentSheet.Dimension.Columns; - - for (int i = 3; i <= alignmentSheet.Dimension.End.Row; i++) - { - string keys = alignmentSheet.Cells[i, 1].Value.ToString(); - string position = alignmentSheet.Cells[i, 2].Value.ToString(); - - keysList.Add($"{keys}_{position}"); - } - - //var barcodeCell = alignmentSheet.Cells[1, aligneStartCol + 1, 1, aligneStartCol + 2]; - //barcodeCell.Merge = true; - //barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; - //SetTitleCell(barcodeCell); - - var barcodeCell = alignmentSheet.Cells[1, aligneStartCol + 1]; + int rowDataStartCol = rawDataSheet.Dimension.Columns; + var barcodeCell = rawDataSheet.Cells[1, rowDataStartCol + 1, 1, rowDataStartCol + 4]; + barcodeCell.Merge = true; + barcodeCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; SetTitleCell(barcodeCell); - var valueCell = alignmentSheet.Cells[2, aligneStartCol + 1]; - valueCell.Value = "Value"; - SetTitleCell(valueCell); + var z1Cell = rawDataSheet.Cells[2, rowDataStartCol + 1]; + z1Cell.Value = "Z1"; + SetTitleCell(z1Cell); - //var resultCell = alignmentSheet.Cells[2, aligneStartCol + 2]; - //resultCell.Value = "Result"; - //SetTitleCell(resultCell); + var z2Cell = rawDataSheet.Cells[2, rowDataStartCol + 2]; + z2Cell.Value = "Z2"; + SetTitleCell(z2Cell); - alignmentMeasures.ForEach(a => + var z3Cell = rawDataSheet.Cells[2, rowDataStartCol + 3]; + z3Cell.Value = "Z3"; + SetTitleCell(z3Cell); + + var z4Cell = rawDataSheet.Cells[2, rowDataStartCol + 4]; + z4Cell.Value = "Z4"; + SetTitleCell(z4Cell); + + exportData.KeyUnitDataList.ForEach(k => { - int rowIndex = keysList.IndexOf($"{a.Keys}_{a.Positions}"); - if (rowIndex < 0) + int keyIndex = Config.KeyNameCollection.IndexOf(k.Key); + if (keyIndex < 0) { - LogAsync(DateTime.Now, "Excel瀵煎嚭閿欒", $"{a.Keys}_{a.Positions}鐨凙lignment鏈兘鑾峰彇琛屼俊鎭紝鏈鍑�"); + LogAsync(DateTime.Now, "Excel瀵煎嚭閿欒", $"{k.Key}鐨凴awData鏈兘鑾峰彇琛屼俊鎭紝鏈鍑�"); return; } - var cellValue = alignmentSheet.Cells[rowIndex + 1 + 2, aligneStartCol + 1]; - //var cellResult = alignmentSheet.Cells[rowIndex + 1 + 2, aligneStartCol + 2]; + int zIndex = int.Parse(k.MeasurementItem.Substring(1)); - cellValue.Value = a.MeasurementValue; - //cellResult.Value = a.MeasurementResult; + var cell = rawDataSheet.Cells[keyIndex + 1 + 2, rowDataStartCol + zIndex]; + cell.Value = string.IsNullOrWhiteSpace(k.ItemValue) ? "NA" : k.ItemValue; + }); + } + #endregion - if (a.MeasurementResult != "OK") + #region Slant + var slantMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType.StartsWith("Slant")).ToList(); + if (slantMeasures.Count > 0) + { + int slantStartCol = slantSheet.Dimension.Columns; + + var barcodeCell = slantSheet.Cells[1, slantStartCol + 1]; + barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; + SetTitleCell(barcodeCell); + + var valueCell = slantSheet.Cells[2, slantStartCol + 1]; + valueCell.Value = "Value"; + SetTitleCell(valueCell); + + slantMeasures.ForEach(m => + { + int rowIndex = Config.KeyNameCollection.IndexOf(m.Keys); + if (rowIndex < 0) + { + LogAsync(DateTime.Now, "Excel瀵煎嚭閿欒", $"{m.Keys}鐨凷lant鏈兘鑾峰彇琛屼俊鎭紝鏈鍑�"); + return; + } + + var cellValue = slantSheet.Cells[rowIndex + 1 + 2, slantStartCol + 1]; + //var cellResult = slantSheet.Cells[rowIndex + 1 + 2, slantStartCol + 2]; + + cellValue.Value = m.MeasurementValue; + //cellResult.Value = m.MeasurementResult; + + if (m.MeasurementResult != "OK") { SetNGCell(cellValue); //SetNGCell(cellResult); } }); } - } - #endregion + #endregion - #region RowAlignment - { - var rowAlignmentMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType.StartsWith("RowAlignment")).ToList(); - if (rowAlignmentMeasures.Count > 0) + #region Alignment { - List<string> keysList = new List<string>(); - int allRowNums = rowAlignmentSheet.Dimension.Rows; - int aligneStartCol = rowAlignmentSheet.Dimension.Columns; - - for (int i = 3; i <= allRowNums; i++) + var alignmentMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType.StartsWith("Alignment")).ToList(); + if (alignmentMeasures.Count > 0) { - string keys = alignmentSheet.Cells[i, 1].Value.ToString(); - string position = alignmentSheet.Cells[i, 2].Value.ToString(); + List<string> keysList = new List<string>(); + int allRowNums = alignmentSheet.Dimension.Rows; + int aligneStartCol = alignmentSheet.Dimension.Columns; - keysList.Add($"{keys}_{position}"); + for (int i = 3; i <= alignmentSheet.Dimension.End.Row; i++) + { + string keys = alignmentSheet.Cells[i, 1].Value.ToString(); + string position = alignmentSheet.Cells[i, 2].Value.ToString(); + + keysList.Add($"{keys}_{position}"); + } + + //var barcodeCell = alignmentSheet.Cells[1, aligneStartCol + 1, 1, aligneStartCol + 2]; + //barcodeCell.Merge = true; + //barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; + //SetTitleCell(barcodeCell); + + var barcodeCell = alignmentSheet.Cells[1, aligneStartCol + 1]; + barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; + SetTitleCell(barcodeCell); + + var valueCell = alignmentSheet.Cells[2, aligneStartCol + 1]; + valueCell.Value = "Value"; + SetTitleCell(valueCell); + + //var resultCell = alignmentSheet.Cells[2, aligneStartCol + 2]; + //resultCell.Value = "Result"; + //SetTitleCell(resultCell); + + alignmentMeasures.ForEach(a => + { + int rowIndex = keysList.IndexOf($"{a.Keys}_{a.Positions}"); + if (rowIndex < 0) + { + LogAsync(DateTime.Now, "Excel瀵煎嚭閿欒", $"{a.Keys}_{a.Positions}鐨凙lignment鏈兘鑾峰彇琛屼俊鎭紝鏈鍑�"); + return; + } + + var cellValue = alignmentSheet.Cells[rowIndex + 1 + 2, aligneStartCol + 1]; + //var cellResult = alignmentSheet.Cells[rowIndex + 1 + 2, aligneStartCol + 2]; + + cellValue.Value = a.MeasurementValue; + //cellResult.Value = a.MeasurementResult; + + if (a.MeasurementResult != "OK") + { + SetNGCell(cellValue); + //SetNGCell(cellResult); + } + }); } - - //var barcodeCell = rowAlignmentSheet.Cells[1, aligneStartCol + 1, 1, aligneStartCol + 2]; - //barcodeCell.Merge = true; - //barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; - //SetTitleCell(barcodeCell); - - var barcodeCell = rowAlignmentSheet.Cells[1, aligneStartCol + 1]; - barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; - SetTitleCell(barcodeCell); - - var valueCell = rowAlignmentSheet.Cells[2, aligneStartCol + 1]; - valueCell.Value = "Value"; - SetTitleCell(valueCell); - - //var resultCell = rowAlignmentSheet.Cells[2, aligneStartCol + 2]; - //resultCell.Value = "Result"; - //SetTitleCell(resultCell); - - rowAlignmentMeasures.ForEach(a => - { - int rowIndex = keysList.IndexOf($"{a.Keys}_{a.Positions}"); - if (rowIndex < 0) - { - LogAsync(DateTime.Now, "Excel瀵煎嚭閿欒", $"{a.Keys}_{a.Positions}鐨凴owAlignment鏈兘鑾峰彇琛屼俊鎭紝鏈鍑�"); - return; - } - - var cellValue = rowAlignmentSheet.Cells[rowIndex + 1 + 2, aligneStartCol + 1]; - //var cellResult = rowAlignmentSheet.Cells[rowIndex + 1 + 2, aligneStartCol + 2]; - - cellValue.Value = a.MeasurementValue; - //cellResult.Value = a.MeasurementResult; - - if (a.MeasurementResult != "OK") - { - SetNGCell(cellValue); - //SetNGCell(cellResult); - } - }); } - } - #endregion + #endregion - package.Save(); + #region RowAlignment + { + var rowAlignmentMeasures = exportData.MeasurementUnitResultList.Where(u => u.MeasurementType.StartsWith("RowAlignment")).ToList(); + if (rowAlignmentMeasures.Count > 0) + { + List<string> keysList = new List<string>(); + int allRowNums = rowAlignmentSheet.Dimension.Rows; + int aligneStartCol = rowAlignmentSheet.Dimension.Columns; - rawDataSheet.Dispose(); - slantSheet.Dispose(); - alignmentSheet.Dispose(); - rowAlignmentSheet.Dispose(); - }; + for (int i = 3; i <= allRowNums; i++) + { + string keys = alignmentSheet.Cells[i, 1].Value.ToString(); + string position = alignmentSheet.Cells[i, 2].Value.ToString(); + + keysList.Add($"{keys}_{position}"); + } + + //var barcodeCell = rowAlignmentSheet.Cells[1, aligneStartCol + 1, 1, aligneStartCol + 2]; + //barcodeCell.Merge = true; + //barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; + //SetTitleCell(barcodeCell); + + var barcodeCell = rowAlignmentSheet.Cells[1, aligneStartCol + 1]; + barcodeCell.Value = exportData.ProductionMeasurementRecord.ProductionBarcode; + SetTitleCell(barcodeCell); + + var valueCell = rowAlignmentSheet.Cells[2, aligneStartCol + 1]; + valueCell.Value = "Value"; + SetTitleCell(valueCell); + + //var resultCell = rowAlignmentSheet.Cells[2, aligneStartCol + 2]; + //resultCell.Value = "Result"; + //SetTitleCell(resultCell); + + rowAlignmentMeasures.ForEach(a => + { + int rowIndex = keysList.IndexOf($"{a.Keys}_{a.Positions}"); + if (rowIndex < 0) + { + LogAsync(DateTime.Now, "Excel瀵煎嚭閿欒", $"{a.Keys}_{a.Positions}鐨凴owAlignment鏈兘鑾峰彇琛屼俊鎭紝鏈鍑�"); + return; + } + + var cellValue = rowAlignmentSheet.Cells[rowIndex + 1 + 2, aligneStartCol + 1]; + //var cellResult = rowAlignmentSheet.Cells[rowIndex + 1 + 2, aligneStartCol + 2]; + + cellValue.Value = a.MeasurementValue; + //cellResult.Value = a.MeasurementResult; + + if (a.MeasurementResult != "OK") + { + SetNGCell(cellValue); + //SetNGCell(cellResult); + } + }); + } + } + #endregion + + package.Save(); + + rawDataSheet.Dispose(); + slantSheet.Dispose(); + alignmentSheet.Dispose(); + rowAlignmentSheet.Dispose(); + }; + } + catch (Exception ex) + { + LogAsync(DateTime.Now, "Excel鏃ュ織寮傚父", ex.GetExceptionMessage()); + 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); + } } }); } @@ -1165,6 +1397,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(() => @@ -1172,8 +1406,14 @@ 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 = imgSet.HImage; HObject images = new HObject(); LaserScanParam scanParam = JsonConvert.DeserializeObject<LaserScanParam>(imgSet.ImageData); @@ -1236,71 +1476,103 @@ // 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").HTupleToDouble(); + if (results.Count == 0 || results.Any(u => u < 0)) { - int index = k.KeyResultList.IndexOf(u); - return results[index]; - }); + LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁{string.Join(",", results)}寮傚父", ""); + } + else + { + //LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁", $"{string.Join(" ", results)}"); + + results = results.Select(u => u - Config.PlanCompensation).ToList(); + + string resultStr = ""; + resultDict = k.KeyResultList.ToDictionary(u => u, u => + { + int index = k.KeyResultList.IndexOf(u); + + if (index < results.Count && index >= 0) + { + double origin = results[index]; + + var compensation = k.KeyCompensationCollection.FirstOrDefault(c => c.KeyResult == u); + if (compensation != null) + { + origin = origin + compensation.Compensation; + } + + resultStr += $"{u} {origin};"; + + return origin; + } + else + { + return -999.0; + } + }); + + LogAsync(DateTime.Now, $"{k.AliasName}缁撴灉锛歿resultStr}", ""); + } } } - } - 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