From 6f92829951f3ec228b18df8c157239573edd9cb4 Mon Sep 17 00:00:00 2001 From: xcd <834800634@qq.com> Date: 星期三, 09 九月 2020 15:20:53 +0800 Subject: [PATCH] 1. 取消ImageSet中的HImage释放动作,转移到业务流程中 2. 拆分板卡的IO监听和轴状态,轴位置监听 --- src/Bro.Device.GTSCard/GTSCardDriver.cs | 95 ++++++++++++++- src/Bro.Process/Bro.Process.csproj | 4 src/Bro.Common.Device/DeviceBase/MotionCardBase.cs | 17 ++ src/Bro.M071.Process/M071Process.cs | 236 ++++++++++++++++++++------------------- src/Bro.Common.Device/DeviceBase/CameraBase.cs | 8 5 files changed, 230 insertions(+), 130 deletions(-) diff --git a/src/Bro.Common.Device/DeviceBase/CameraBase.cs b/src/Bro.Common.Device/DeviceBase/CameraBase.cs index 42d1be2..82b529d 100644 --- a/src/Bro.Common.Device/DeviceBase/CameraBase.cs +++ b/src/Bro.Common.Device/DeviceBase/CameraBase.cs @@ -912,11 +912,11 @@ autoDisposeTimer.Change(-1, -1); autoDisposeTimer.Dispose(); - Image?.Dispose(); - Image = null; + //Image?.Dispose(); + //Image = null; - HImage?.Dispose(); - HImage = null; + //HImage?.Dispose(); + //HImage = null; } #endregion } diff --git a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs index f5214fe..ef22a40 100644 --- a/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs +++ b/src/Bro.Common.Device/DeviceBase/MotionCardBase.cs @@ -22,7 +22,8 @@ public event Action<DateTime, IDevice, IWarningSet> OnMonitorAlarm; public event Action<int, string> OnAxisAlarmRaised; public event Action<int, int, int> OnAxisStatusChanged; - + public event Action<int, int> OnAxisPositionChanged; + public void AxisAlarmRaised(int axisIndex, string msg) { OnAxisAlarmRaised?.Invoke(axisIndex, msg); @@ -33,8 +34,22 @@ OnAxisStatusChanged?.Invoke(axisIndex, preStatus, curStatus); } + public void AxisPositionChanged(int axisIndex, int currentPosition) + { + OnAxisPositionChanged?.Invoke(axisIndex, currentPosition); + } + protected override void Start() { + AxisStatusList = IConfig.AxisSettings.Where(a => a.IsAxisEnabled).ToList().ConvertAll(a => + { + AxisMovingStatus axisSts = new AxisMovingStatus(); + axisSts.AxisIndex = a.AxisIndex; + axisSts.AxisName = a.AxisName; + + return axisSts; + }); + Task.Run(() => { Monitor(); diff --git a/src/Bro.Device.GTSCard/GTSCardDriver.cs b/src/Bro.Device.GTSCard/GTSCardDriver.cs index c430886..a721273 100644 --- a/src/Bro.Device.GTSCard/GTSCardDriver.cs +++ b/src/Bro.Device.GTSCard/GTSCardDriver.cs @@ -99,6 +99,9 @@ { AllAxisOn(); + MonitorPosition(); + MonitorAxisStatus(); + base.Start(); } @@ -1131,7 +1134,6 @@ return axisMovingStatusesList; } - public List<IOItem> GetMonitorValues() { var result = new List<IOItem>(); @@ -1164,6 +1166,79 @@ return result; } + SpinWait _positionWait = new SpinWait(); + private async void MonitorPosition() + { + await Task.Run(() => + { + while (CurrentState != EnumHelper.DeviceState.DSClose && CurrentState != EnumHelper.DeviceState.DSExcept && CurrentState != EnumHelper.DeviceState.DSUninit) + { + try + { + if (!IConfig.IsEnableMonitor) + return; + + AxisStatusList.ForEach(a => + { + int curPosition = (int)GetPrfPosition(a.AxisIndex); + + if (a.CurPosition != curPosition) + { + a.CurPosition = curPosition; + AxisPositionChanged(a.AxisIndex, curPosition); + } + }); + + _positionWait.SpinOnce(); + } + catch (Exception ex) + { + if (CurrentState == DeviceState.DSOpen) + { + LogAsync(DateTime.Now, $"{this.Name}鐩戝惉杞翠俊鎭紓甯�", ex.GetExceptionMessage()); + } + } + } + }); + } + + SpinWait _statusWait = new SpinWait(); + private async void MonitorAxisStatus() + { + await Task.Run(() => + { + while (CurrentState != EnumHelper.DeviceState.DSClose && CurrentState != EnumHelper.DeviceState.DSExcept && CurrentState != EnumHelper.DeviceState.DSUninit) + { + try + { + if (!IConfig.IsEnableMonitor) + return; + + AxisStatusList.ForEach(a => + { + int curStatus = GetAxisStatus(a.AxisIndex); + + if (a.AxisStatus != curStatus) + { + int temp = a.AxisStatus; + a.AxisStatus = curStatus; + AxisStatusChanged(a.AxisIndex, temp, curStatus); + } + }); + + _statusWait.SpinOnce(); + } + catch (Exception ex) + { + if (CurrentState == DeviceState.DSOpen) + { + LogAsync(DateTime.Now, $"{this.Name}鐩戝惉杞翠俊鎭紓甯�", ex.GetExceptionMessage()); + } + } + } + }); + } + public async override void Monitor() { await Task.Run(() => @@ -1176,9 +1251,9 @@ return; var newValues = GetMonitorValues(); - var newAxisMovingStatus = GetAxisMovingStatus(); + //var newAxisMovingStatus = GetAxisMovingStatus(); - if (newValues == null || newValues.Count == 0 || newAxisMovingStatus == null || newAxisMovingStatus.Count == 0) + if (newValues == null || newValues.Count == 0 ) continue; //Stopwatch sw = new Stopwatch(); @@ -1192,14 +1267,14 @@ MonitorCheckAndInvoke(tempNew, tempOld); } - if (AxisStatusList.Count == newAxisMovingStatus.Count) - { - var tempNew = new List<AxisMovingStatus>(newAxisMovingStatus);//clone - var tempOld = new List<AxisMovingStatus>(AxisStatusList); - AxisStatusCheck(tempNew, tempOld); - } + //if (AxisStatusList.Count == newAxisMovingStatus.Count) + //{ + // var tempNew = new List<AxisMovingStatus>(newAxisMovingStatus);//clone + // var tempOld = new List<AxisMovingStatus>(AxisStatusList); + // AxisStatusCheck(tempNew, tempOld); + //} - AxisStatusList = new List<AxisMovingStatus>(newAxisMovingStatus); + //AxisStatusList = new List<AxisMovingStatus>(newAxisMovingStatus); MonitorValues = new List<IOItem>(newValues); //sw.Stop(); diff --git a/src/Bro.M071.Process/M071Process.cs b/src/Bro.M071.Process/M071Process.cs index a3a23dc..155f253 100644 --- a/src/Bro.M071.Process/M071Process.cs +++ b/src/Bro.M071.Process/M071Process.cs @@ -1061,139 +1061,147 @@ private async void RunImageHandle(IOperationConfig opConfig, IImageSet imgSet, string snapshotId, string snapshotName, List<MeasurementUnit> measureList) { await Task.Run(() => - { - 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(); + { + 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(); - string toolKey = (opConfig as CameraOprerationConfigBase).AlgorithemPath; - //HObject images = imgSet.HImage; + string toolKey = (opConfig as CameraOprerationConfigBase).AlgorithemPath; + //HObject images = imgSet.HImage; - HObject images = new HObject(); - LaserScanParam scanParam = JsonConvert.DeserializeObject<LaserScanParam>(imgSet.ImageData); - LogAsync(DateTime.Now, $"鎵弿鍙傛暟:{imgSet.ImageData}", ""); + HObject images = new HObject(); + LaserScanParam scanParam = JsonConvert.DeserializeObject<LaserScanParam>(imgSet.ImageData); + LogAsync(DateTime.Now, $"鎵弿鍙傛暟:{imgSet.ImageData}", ""); - if (!string.IsNullOrWhiteSpace(toolKey)) - { - toolKey = snapshotId + "|" + toolKey; - if (!_halconToolDict.ContainsKey(toolKey)) - { - LogAsync(DateTime.Now, $"{snapshotName}鏈垵濮嬪寲鍙栧浘绠楁硶閰嶇疆", ""); - keyBindCollection.ForEach(k => k.FillKeyValues(null)); - return; - } + if (!string.IsNullOrWhiteSpace(toolKey)) + { + toolKey = snapshotId + "|" + toolKey; + if (!_halconToolDict.ContainsKey(toolKey)) + { + LogAsync(DateTime.Now, $"{snapshotName}鏈垵濮嬪寲鍙栧浘绠楁硶閰嶇疆", ""); + keyBindCollection.ForEach(k => k.FillKeyValues(null)); + return; + } - //string fileName = Path.Combine(Config.ImageSaveFolder, "BeforeRun", $"{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.tif"); - //imgSet.HImage.WriteImage("tiff", 0, fileName); + //string fileName = Path.Combine(Config.ImageSaveFolder, "BeforeRun", $"{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.tif"); + //imgSet.HImage.WriteImage("tiff", 0, fileName); - _halconToolDict[toolKey].InputImageDic["INPUT_Image"] = imgSet.HImage; - if (!_halconToolDict[toolKey].RunProcedure(out string error)) - { - LogAsync(DateTime.Now, $"{snapshotName}鍙栧浘绠楁硶寮傚父锛寋error}", ""); - keyBindCollection.ForEach(k => k.FillKeyValues(null)); - return; - } + if (imgSet.HImage == null) + { + LogAsync(DateTime.Now, $"{snapshotName}鍥剧墖涓虹┖瀵硅薄", ""); + keyBindCollection.ForEach(k => k.FillKeyValues(null)); + return; + } - images = _halconToolDict[toolKey].GetResultObject("OUTPUT_Images"); - } + _halconToolDict[toolKey].InputImageDic["INPUT_Image"] = imgSet.HImage; + if (!_halconToolDict[toolKey].RunProcedure(out string error)) + { + LogAsync(DateTime.Now, $"{snapshotName}鍙栧浘绠楁硶寮傚父锛寋error}", ""); + keyBindCollection.ForEach(k => k.FillKeyValues(null)); + return; + } - HOperatorSet.CountObj(images, out HTuple count); - LogAsync(DateTime.Now, $"{snapshotName}鍒囧浘{count.I}寮�", ""); + images = _halconToolDict[toolKey].GetResultObject("OUTPUT_Images"); + } - if (count == 0) - { - LogAsync(DateTime.Now, $"{snapshotName}鍙栧浘绠楁硶鏈緭鍑哄浘鍍�", ""); - keyBindCollection.ForEach(k => k.FillKeyValues(null)); - return; - } + HOperatorSet.CountObj(images, out HTuple count); + LogAsync(DateTime.Now, $"{snapshotName}鍒囧浘{count.I}寮�", ""); - var excludeKeys = keys.Where(u => u.ImageSeq > count.I).ToList(); - if (excludeKeys.Count > 0) - { - LogAsync(DateTime.Now, $"{string.Join(" ", excludeKeys.Select(u => u.AliasName))}鏈湪鍥剧墖鑾峰彇搴忓垪涓�", ""); - keyBindCollection.Where(k => excludeKeys.Any(u => u.Key == k.Key)).ToList().ForEach(k => - { - k.FillKeyValues(null); - }); - } + if (count == 0) + { + LogAsync(DateTime.Now, $"{snapshotName}鍙栧浘绠楁硶鏈緭鍑哄浘鍍�", ""); + keyBindCollection.ForEach(k => k.FillKeyValues(null)); + return; + } - //string dir = Path.Combine(Config.ImageSaveFolder, "Clips", $"{DateTime.Now.ToString("yyyyMMdd")}", $"{snapshotName}_{DateTime.Now.ToString("HHmmss")}"); - //if (!Directory.Exists(dir)) - //{ - // Directory.CreateDirectory(dir); - //} + var excludeKeys = keys.Where(u => u.ImageSeq > count.I).ToList(); + if (excludeKeys.Count > 0) + { + LogAsync(DateTime.Now, $"{string.Join(" ", excludeKeys.Select(u => u.AliasName))}鏈湪鍥剧墖鑾峰彇搴忓垪涓�", ""); + keyBindCollection.Where(k => excludeKeys.Any(u => u.Key == k.Key)).ToList().ForEach(k => + { + k.FillKeyValues(null); + }); + } - //Parallel.For(1, count.I + 1, (i) => - for (int i = 1; i <= count.I; i++) - { - HOperatorSet.SelectObj(images, out HObject image, i); + //string dir = Path.Combine(Config.ImageSaveFolder, "Clips", $"{DateTime.Now.ToString("yyyyMMdd")}", $"{snapshotName}_{DateTime.Now.ToString("HHmmss")}"); + //if (!Directory.Exists(dir)) + //{ + // Directory.CreateDirectory(dir); + //} - //string fileName = Path.Combine(dir, $"{i}.tif"); - //using (HImage temp = image.ConvertHObjectToHImage()) - //{ - // temp.WriteImage("tiff", 0, fileName); - //} + //Parallel.For(1, count.I + 1, (i) => + for (int i = 1; i <= count.I; i++) + { + HOperatorSet.SelectObj(images, out HObject image, i); - keys.Where(u => u.ImageSeq == i).ToList().ForEach(k => - { - Dictionary<string, double> resultDict = null; + //string fileName = Path.Combine(dir, $"{i}.tif"); + //using (HImage temp = image.ConvertHObjectToHImage()) + //{ + // temp.WriteImage("tiff", 0, fileName); + //} - var keyBindList = keyBindCollection.Where(u => u.Key == k.Key).ToList(); + keys.Where(u => u.ImageSeq == i).ToList().ForEach(k => + { + Dictionary<string, double> resultDict = null; - string keyToolKey = k.AliasName + "|" + k.KeyAlgorithemPath; - if (!_halconToolDict.ContainsKey(keyToolKey)) - { - 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)) - { - LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曞紓甯革紝{error}", ""); - } - else - { - var results = _halconToolDict[keyToolKey].GetResultTuple("OUTPUT_Results").DArr.ToList(); - if (results.Count == 0 || results.Any(u => u < 0)) - { - LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁寮傚父", ""); - } - else - { - //LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁", $"{string.Join(" ", results)}"); + var keyBindList = keyBindCollection.Where(u => u.Key == k.Key).ToList(); - results = results.Select(u => u - Config.PlanCompensation).ToList(); - resultDict = k.KeyResultList.ToDictionary(u => u, u => - { - int index = k.KeyResultList.IndexOf(u); - return results[index]; - }); - } - } - } + string keyToolKey = k.AliasName + "|" + k.KeyAlgorithemPath; + if (!_halconToolDict.ContainsKey(keyToolKey)) + { + 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)) + { + LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曞紓甯革紝{error}", ""); + } + else + { + var results = _halconToolDict[keyToolKey].GetResultTuple("OUTPUT_Results").DArr.ToList(); + if (results.Count == 0 || results.Any(u => u < 0)) + { + LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁寮傚父", ""); + } + else + { + //LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁", $"{string.Join(" ", results)}"); - keyBindList.ForEach(kb => - { - kb.KeyImages.Add(image.ConvertHObjectToHImage()); - kb.FillKeyValues(resultDict); - }); - }); + results = results.Select(u => u - Config.PlanCompensation).ToList(); + resultDict = k.KeyResultList.ToDictionary(u => u, u => + { + int index = k.KeyResultList.IndexOf(u); + return results[index]; + }); + } + } + } - image.Dispose(); - } - //); + keyBindList.ForEach(kb => + { + kb.KeyImages.Add(image.ConvertHObjectToHImage()); + kb.FillKeyValues(resultDict); + }); + }); - images.Dispose(); - //if (count.I != 1) - //{ - // hImage?.Dispose(); - // hImage = null; - //} - }); + image.Dispose(); + } + //); + + imgSet.HImage.Dispose(); + images.Dispose(); + //if (count.I != 1) + //{ + // hImage?.Dispose(); + // hImage = null; + //} + }); } #endregion } diff --git a/src/Bro.Process/Bro.Process.csproj b/src/Bro.Process/Bro.Process.csproj index e56f5e8..cbf405b 100644 --- a/src/Bro.Process/Bro.Process.csproj +++ b/src/Bro.Process/Bro.Process.csproj @@ -128,7 +128,9 @@ </ItemGroup> <ItemGroup> <None Include="packages.config" /> - <None Include="Setting.json" /> + <None Include="Setting.json"> + <CopyToOutputDirectory>Always</CopyToOutputDirectory> + </None> </ItemGroup> <ItemGroup> <EmbeddedResource Include="Forms\Calibration\FrmCalibration_9P.resx"> -- Gitblit v1.8.0