Explorar o código

新增固定相机检测流程配置及逻辑优化

本次提交内容:
- 产品模型新增两个固定相机检测流程ID属性
- 产品参数界面支持分别配置两个检测流程
- 固定相机检测拍照逻辑重构,支持多流程并发检测
- 视觉服务未配置标定时返回默认坐标,提升健壮性
- 流程选择列显示条件优化,适配新界面
- 程序集版本号升级至 1.2.1.3
孝锋 徐 hai 7 meses
pai
achega
aa69e3e46b

+ 93 - 3
TeamAAS-VM/Core/Management.cs

@@ -1709,10 +1709,39 @@ namespace TeamAAS_VP.Core
                         {
                             SendTaskMessage($"触发上相机检测拍照...", MessageLevel.Debug);
                             //相机的编号
-                            //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.Out_UPCameracheckNum.Address);
+                            Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.Out_UPCameracheckNum.Address);
 
+                            //视觉流程ID
+                            Guid procedureId = Guid.Empty;
+                            //获取锁付拍照的点位
+                            var pos = currentProduct.CheckCameraPoints.FirstOrDefault(p => p.Number == cameraIndex);
+                            if (pos != null)
+                            {
+                                procedureId = pos.VisionProcessID;
+                            }
 
+                            // 获取流程
+                            var process = _productService.GetCurrentProductProcedureModelById(procedureId);
+                            if (process == null)
+                            {
+                                SendTaskMessage(string.Format("未找到点位:{0}的视觉流程:{1}", cameraIndex, procedureId), MessageLevel.Alarm);
+                                await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)2);
+                                return;
+                            }
 
+                            // 执行视觉任务
+                            var _cts = new CancellationTokenSource();
+                            var visionResult = await _remoteCommandService.ExecutePhotoGetSinglePoint(process, null, null, _cts.Token, cameraIndex, null);
+                            if (visionResult.IsSucceed)
+                            {
+                                await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)1);
+                                SendTaskMessage($"点位{cameraIndex}检测OK", MessageLevel.Debug);
+                            }
+                            else
+                            {
+                                await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)2);
+                                SendTaskMessage($"点位{cameraIndex}检测NG", MessageLevel.Error);
+                            }
                             await plc.WriteNodeAsync(addressConfig.Out_UPCameracheckStatus.Address, (Int16)1);
                         }
                         else
@@ -1801,10 +1830,71 @@ namespace TeamAAS_VP.Core
                         {
                             SendTaskMessage($"触发固定相机检测拍照...", MessageLevel.Debug);
                             //相机的编号
-                            //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameracheckNum.Address);
+                            Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameracheckNum.Address);
+                            List<Task<(bool IsSucceed, double X, double Y, double U)>> visionTasks = new List<Task<(bool IsSucceed, double X, double Y, double U)>>();
+                            List<ProcedureModel> visionProcesses = new List<ProcedureModel>();
+
+                            if (currentProduct.MoveDownCamer1CheckProcedureId != Guid.Empty)
+                            {
+                                var process = _productService.GetCurrentProductProcedureModelById(currentProduct.MoveDownCamer1CheckProcedureId);
+                                if (process != null)
+                                {
+                                    visionProcesses.Add(process);
+                                }
+                            }
+                            if (currentProduct.MoveDownCamer2CheckProcedureId != Guid.Empty)
+                            {
+                                var process = _productService.GetCurrentProductProcedureModelById(currentProduct.MoveDownCamer2CheckProcedureId);
+                                if (process != null)
+                                {
+                                    visionProcesses.Add(process);
+                                }
+                            }
+
+                            if (visionProcesses.Count <= 0)
+                            {
+                                SendTaskMessage($"未配置移动向下相机检测视觉流程", MessageLevel.Alarm);
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)2);
+                                return;
+                            }
+
+                            // 执行视觉任务
+                            var _cts = new CancellationTokenSource();
+                            for (int i = 0; i < visionProcesses.Count; i++)
+                            {
+                                visionTasks.Add(_remoteCommandService.ExecutePhotoGetSinglePoint(visionProcesses[i], null, null, _cts.Token, i + 1, null));
+                            }
 
+                            var visionResults = await Task.WhenAll(visionTasks.ToArray());
+
+                            if (isDryMode)
+                            {
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)1);
+                                return;
+                            }
+                            //获取visionResults集合中所有的结果,如果全部成功则为通过
+                            bool allSucceed = true;
+                            for (int i = 0; i < visionResults.Length; i++)
+                            {
+                                if (!visionResults[i].IsSucceed)
+                                {
+                                    allSucceed = false;
+                                    break;
+                                }
+                            }
 
-                            await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)1);
+                            if (allSucceed)
+                            {
+                                SendTaskMessage($"固定相机检测OK", MessageLevel.Debug);
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)1);
+                                return;
+                            }
+                            else
+                            {
+                                SendTaskMessage($"固定相机检测NG", MessageLevel.Error);
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)2);
+                                return;
+                            }
                         }
                         else
                         {

+ 20 - 0
TeamAAS-VM/Models/Product/ProductModel.cs

@@ -236,6 +236,26 @@ namespace TeamAAS_VP.Models
             set { SetProperty(ref _MoveDownCamer2PickPhotoProcedureId, value); }
         }
 
+        /// <summary>
+        /// 移动向下相机1检测拍照流程ID
+        /// </summary>
+        private Guid _MoveDownCamer1CheckProcedureId;
+        public Guid MoveDownCamer1CheckProcedureId
+        {
+            get { return _MoveDownCamer1CheckProcedureId; }
+            set { SetProperty(ref _MoveDownCamer1CheckProcedureId, value); }
+        }
+
+        /// <summary>
+        /// 移动向下相机2检测拍照流程ID
+        /// </summary>
+        private Guid _MoveDownCamer2CheckProcedureId;
+        public Guid MoveDownCamer2CheckProcedureId
+        {
+            get { return _MoveDownCamer2CheckProcedureId; }
+            set { SetProperty(ref _MoveDownCamer2CheckProcedureId, value); }
+        }
+
         /// <summary>
         /// 移动向上的相机模板角度
         /// </summary>

+ 2 - 2
TeamAAS-VM/Properties/AssemblyInfo.cs

@@ -51,5 +51,5 @@ using System.Windows;
 //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
 //通过使用 "*",如下所示:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.2.1.2")]
-[assembly: AssemblyFileVersion("1.2.1.2")]
+[assembly: AssemblyVersion("1.2.1.3")]
+[assembly: AssemblyFileVersion("1.2.1.3")]

+ 6 - 0
TeamAAS-VM/Services/RemoteCommandService.cs

@@ -1704,6 +1704,12 @@ namespace TeamAAS_VP.Services
                     }
 
                     SendTaskMessage(Lang.拍照OK, MessageLevel.Debug);
+                    if (procedure.CalibrationId == Guid.Empty)
+                    {
+                        //没有关联校准时,则执行检测任务
+                        await RecordPhotoCaptureAsync(procedure, robotCoord, true, new double[] { 0, 0, 0 }, new double[] { 0, 0, 0 }, string.Empty, positionIndex, remark);
+                        return (true, 0, 0, 0);
+                    }
 
                     // 3. 获取视觉输出结果
                     LogHelper.WriteLogInfo("开始获取视觉输出结果");

+ 51 - 0
TeamAAS-VM/ViewModels/Product/ProductParamsViewModel.cs

@@ -200,6 +200,39 @@ namespace TeamAAS_VP.ViewModels.Product
             }
         }
 
+        private ProcedureModel _MoveDownCamer1CheckProcedureId;
+        /// <summary>
+        /// 移动向下相机1检测拍照流程ID
+        /// </summary>
+        public ProcedureModel MoveDownCamer1CheckProcedureId
+        {
+            get { return _MoveDownCamer1CheckProcedureId; }
+            set
+            {
+                SetProperty(ref _MoveDownCamer1CheckProcedureId, value);
+                if (value != null)
+                {
+                    SelectProduct.MoveDownCamer1CheckProcedureId = value.Id;
+                }
+            }
+        }
+
+        private ProcedureModel _MoveDownCamer2CheckProcedureId;
+        /// <summary>
+        /// 移动向下相机2检测拍照流程ID
+        /// </summary>
+        public ProcedureModel MoveDownCamer2CheckProcedureId
+        {
+            get { return _MoveDownCamer2CheckProcedureId; }
+            set
+            {
+                SetProperty(ref _MoveDownCamer2CheckProcedureId, value);
+                if (value != null)
+                {
+                    SelectProduct.MoveDownCamer2CheckProcedureId = value.Id;
+                }
+            }
+        }
         #endregion
 
         #region 命令
@@ -316,6 +349,15 @@ namespace TeamAAS_VP.ViewModels.Product
             {
                 SelectProduct.MoveDownCamer2PickPhotoProcedureId = Guid.Empty;
             }
+
+            if (MoveDownCamer1CheckProcedureId == null)
+            {
+                SelectProduct.MoveDownCamer1CheckProcedureId = Guid.Empty;
+            }
+            if (MoveDownCamer2CheckProcedureId == null)
+            {
+                SelectProduct.MoveDownCamer2CheckProcedureId = Guid.Empty;
+            }
         }
         /// <summary>
         /// 上一步
@@ -402,6 +444,15 @@ namespace TeamAAS_VP.ViewModels.Product
                 {
                     MoveDownCamer2PickPhotoProcedureId = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.MoveDownCamer2PickPhotoProcedureId);
                 }
+
+                if (SelectProduct.MoveDownCamer1CheckProcedureId != Guid.Empty)
+                {
+                    MoveDownCamer1CheckProcedureId = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.MoveDownCamer1CheckProcedureId);
+                }
+                if (SelectProduct.MoveDownCamer2CheckProcedureId != Guid.Empty)
+                {
+                    MoveDownCamer2CheckProcedureId = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.MoveDownCamer2CheckProcedureId);
+                }
             }
             catch (Exception ex)
             {

+ 1 - 1
TeamAAS-VM/Views/Product/PlcPointParams.xaml.cs

@@ -39,7 +39,7 @@ namespace TeamAAS_VP.Views.Product
             {
                 try
                 {
-                    var visible = VM.SelectedIndex == 3 ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
+                    var visible = VM.SelectedIndex == 3 || VM.SelectedIndex == 5 ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
                     this.Dispatcher.BeginInvoke(new Action(() =>
                     {
                         if (colProcedure != null)

+ 49 - 0
TeamAAS-VM/Views/Product/ProductParams.xaml

@@ -123,6 +123,8 @@
                         <RowDefinition Height="auto" />
                         <RowDefinition Height="auto" />
                         <RowDefinition Height="auto" />
+                        <RowDefinition Height="auto" />
+                        <RowDefinition Height="auto" />
                     </Grid.RowDefinitions>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition Width="auto" />
@@ -419,6 +421,53 @@
                             </DataTemplate>
                         </ComboBox.ItemTemplate>
                     </ComboBox>
+
+                    <!--固定相机1检测拍照流程-->
+                    <TextBlock Grid.Row="9"
+                               Grid.Column="0"
+                               Text="固定机1检测拍照流程ID: " />
+                    <ComboBox Grid.Row="9"
+                              Grid.Column="1"
+                              ItemsSource="{Binding ProcedureModels}"
+                              SelectedItem="{Binding MoveDownCamer1CheckProcedureId}"
+                              materialDesign:TextFieldAssist.HasClearButton="True"
+                              materialDesign:HintAssist.Hint="{lex:Loc 选择需要配置的流程}">
+                        <ComboBox.ItemTemplate>
+                            <DataTemplate>
+                                <StackPanel Orientation="Horizontal">
+                                    <materialDesign:PackIcon Kind="VideoOutline" />
+                                    <TextBlock Text="{Binding CameraName}"
+                                               Margin="6,0" />
+                                    <materialDesign:PackIcon Kind="ProgressWrench" />
+                                    <TextBlock Text="{Binding Name}"
+                                               Margin="6,0" />
+                                </StackPanel>
+                            </DataTemplate>
+                        </ComboBox.ItemTemplate>
+                    </ComboBox>
+                    <!--固定相机2检测拍照流程-->
+                    <TextBlock Grid.Row="10"
+                               Grid.Column="0"
+                               Text="固定机2检测拍照流程ID: " />
+                    <ComboBox Grid.Row="10"
+                              Grid.Column="1"
+                              ItemsSource="{Binding ProcedureModels}"
+                              SelectedItem="{Binding MoveDownCamer2CheckProcedureId}"
+                              materialDesign:TextFieldAssist.HasClearButton="True"
+                              materialDesign:HintAssist.Hint="{lex:Loc 选择需要配置的流程}">
+                        <ComboBox.ItemTemplate>
+                            <DataTemplate>
+                                <StackPanel Orientation="Horizontal">
+                                    <materialDesign:PackIcon Kind="VideoOutline" />
+                                    <TextBlock Text="{Binding CameraName}"
+                                               Margin="6,0" />
+                                    <materialDesign:PackIcon Kind="ProgressWrench" />
+                                    <TextBlock Text="{Binding Name}"
+                                               Margin="6,0" />
+                                </StackPanel>
+                            </DataTemplate>
+                        </ComboBox.ItemTemplate>
+                    </ComboBox>
                 </Grid>
             </Grid>