瀏覽代碼

支持独立相机检测流程ID配置与调用

新增独立移动模组相机1~4检测任务拍照流程ID的配置、保存和界面选择功能。修正相关流程ID判定与调用逻辑,提升流程健壮性。优化界面显示与图像刷新细节,版本号升级至1.2.1.3。
徐孝锋 7 月之前
父節點
當前提交
9f2573a40e

+ 99 - 23
TeamAAS-VM/Core/Management.cs

@@ -1730,7 +1730,7 @@ 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);
 
                             if (isDryMode)
                             {
@@ -1738,6 +1738,37 @@ namespace TeamAAS_VP.Core
                                 return;
                             }
 
+                            //视觉流程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
@@ -1767,11 +1798,66 @@ namespace TeamAAS_VP.Core
                             //相机的编号
                             //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameraPickNum.Address);
 
+                            if (currentProduct.IndependentCamer1AuxProcedureId == Guid.Empty)
+                            {
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
+                                return;
+                            }
+                            if (currentProduct.IndependentCamer2AuxProcedureId == Guid.Empty)
+                            {
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
+                                return;
+                            }
+                            if (currentProduct.IndependentCamer3AuxProcedureId == Guid.Empty)
+                            {
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
+                                return;
+                            }
+                            if (currentProduct.IndependentCamer4AuxProcedureId == Guid.Empty)
+                            {
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
+                                return;
+                            }
+
+                            //获取四个独立相机的流程id
+                            var process1 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer1AuxProcedureId);
+                            var process2 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer2AuxProcedureId);
+                            var process3 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer3AuxProcedureId);
+                            var process4 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer4AuxProcedureId);
+
+                            // 执行视觉任务
+                            var _cts = new CancellationTokenSource();
+                            var task1 = _remoteCommandService.ExecutePhotoGetSinglePoint(process1, null, null, _cts.Token, 1, null);
+                            var task2 = _remoteCommandService.ExecutePhotoGetSinglePoint(process2, null, null, _cts.Token, 2, null);
+                            var task3 = _remoteCommandService.ExecutePhotoGetSinglePoint(process3, null, null, _cts.Token, 3, null);
+                            var task4 = _remoteCommandService.ExecutePhotoGetSinglePoint(process4, null, null, _cts.Token, 4, null);
+
+                            var visionResults = await Task.WhenAll(task1, task2, task3, task4);
                             if (isDryMode)
                             {
                                 await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)1);
                                 return;
                             }
+                            if (visionResults[0].IsSucceed && visionResults[1].IsSucceed && visionResults[2].IsSucceed && visionResults[3].IsSucceed)
+                            {
+
+                                Vector<double> p1 = Vector<double>.Build.Dense(new double[] { visionResults[1].X, visionResults[1].Y });
+                                Vector<double> p2 = Vector<double>.Build.Dense(new double[] { visionResults[2].X, visionResults[2].Y });
+                                Vector<double> p3 = Vector<double>.Build.Dense(new double[] { visionResults[3].X, visionResults[3].Y });
+                                Vector<double> p4 = Vector<double>.Build.Dense(new double[] { visionResults[0].X, visionResults[0].Y });
+
+                                var center = RectangleCenterCalculator.CalculateByPCAWithKnownOrder(new List<Vector<double>> { p1, p2, p3, p4 });
+                                UpCameraPutResults[1].X = (float)center.Center[0];
+                                UpCameraPutResults[1].Y = (float)center.Center[1];
+                                UpCameraPutResults[1].Z = (float)center.MajorAxisAngle;
+                                SendTaskMessage($"LCD拍照结果:X={UpCameraPutResults[1].X},Y={UpCameraPutResults[1].Y},Angle={UpCameraPutResults[1].Z}", MessageLevel.Info);
+                            }
+                            else
+                            {
+
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
+                                return;
+                            }
 
                             await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)1);
                         }
@@ -1890,32 +1976,32 @@ namespace TeamAAS_VP.Core
                             //相机的编号
                             //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameracheckNum.Address);
 
-                            if (currentProduct.IndependentCamer1AuxProcedureId == Guid.Empty)
+                            if (currentProduct.IndependentCamer1CheckProcedureId == Guid.Empty)
                             {
                                 await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)2);
                                 return;
                             }
-                            if (currentProduct.IndependentCamer2AuxProcedureId == Guid.Empty)
+                            if (currentProduct.IndependentCamer2CheckProcedureId == Guid.Empty)
                             {
                                 await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)2);
                                 return;
                             }
-                            if (currentProduct.IndependentCamer3AuxProcedureId == Guid.Empty)
+                            if (currentProduct.IndependentCamer3CheckProcedureId == Guid.Empty)
                             {
                                 await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)2);
                                 return;
                             }
-                            if (currentProduct.IndependentCamer4AuxProcedureId == Guid.Empty)
+                            if (currentProduct.IndependentCamer4CheckProcedureId == Guid.Empty)
                             {
                                 await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)2);
                                 return;
                             }
 
                             //获取四个独立相机的流程id
-                            var process1 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer1AuxProcedureId);
-                            var process2 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer2AuxProcedureId);
-                            var process3 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer3AuxProcedureId);
-                            var process4 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer4AuxProcedureId);
+                            var process1 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer1CheckProcedureId);
+                            var process2 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer2CheckProcedureId);
+                            var process3 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer3CheckProcedureId);
+                            var process4 = _productService.GetCurrentProductProcedureModelById(currentProduct.IndependentCamer4CheckProcedureId);
 
                             // 执行视觉任务
                             var _cts = new CancellationTokenSource();
@@ -1932,26 +2018,16 @@ namespace TeamAAS_VP.Core
                             }
                             if (visionResults[0].IsSucceed && visionResults[1].IsSucceed && visionResults[2].IsSucceed && visionResults[3].IsSucceed)
                             {
-                                
-                                Vector<double> p1 = Vector<double>.Build.Dense(new double[] { visionResults[1].X, visionResults[1].Y });
-                                Vector<double> p2 = Vector<double>.Build.Dense(new double[] { visionResults[2].X, visionResults[2].Y });
-                                Vector<double> p3 = Vector<double>.Build.Dense(new double[] { visionResults[3].X, visionResults[3].Y });
-                                Vector<double> p4 = Vector<double>.Build.Dense(new double[] { visionResults[0].X, visionResults[0].Y });
-
-                                var center = RectangleCenterCalculator.CalculateByPCAWithKnownOrder(new List<Vector<double>> { p1, p2, p3, p4 });
-                                UpCameraPutResults[1].X = (float)center.Center[0];
-                                UpCameraPutResults[1].Y = (float)center.Center[1];
-                                UpCameraPutResults[1].Z = (float)center.MajorAxisAngle;
-                                SendTaskMessage($"LCD拍照结果:X={UpCameraPutResults[1].X},Y={UpCameraPutResults[1].Y},Angle={UpCameraPutResults[1].Z}", MessageLevel.Info);
+                                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;
                             }
-
-                            await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)1);
                         }
                         else
                         {

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

@@ -316,6 +316,46 @@ namespace TeamAAS_VP.Models
             set { SetProperty(ref _IndependentCamer4AuxProcedureId, value); }
         }
 
+        private Guid _IndependentCamer1CheckProcedureId;
+        /// <summary>
+        /// 独立移动模组相机1检测任务拍照流程ID
+        /// </summary>
+        public Guid IndependentCamer1CheckProcedureId
+        {
+            get { return _IndependentCamer1CheckProcedureId; }
+            set { SetProperty(ref _IndependentCamer1CheckProcedureId, value); }
+        }
+
+        private Guid _IndependentCamer2CheckProcedureId;
+        /// <summary>
+        /// 独立移动模组相机2检测任务拍照流程ID
+        /// </summary>
+        public Guid IndependentCamer2CheckProcedureId
+        {
+            get { return _IndependentCamer2CheckProcedureId; }
+            set { SetProperty(ref _IndependentCamer2CheckProcedureId, value); }
+        }
+
+        private Guid _IndependentCamer3CheckProcedureId;
+        /// <summary>
+        /// 独立移动模组相机3检测任务拍照流程ID
+        /// </summary>
+        public Guid IndependentCamer3CheckProcedureId
+        {
+            get { return _IndependentCamer3CheckProcedureId; }
+            set { SetProperty(ref _IndependentCamer3CheckProcedureId, value); }
+        }
+
+        private Guid _IndependentCamer4CheckProcedureId;
+        /// <summary>
+        /// 独立移动模组相机4检测任务拍照流程ID
+        /// </summary>
+        public Guid IndependentCamer4CheckProcedureId
+        {
+            get { return _IndependentCamer4CheckProcedureId; }
+            set { SetProperty(ref _IndependentCamer4CheckProcedureId, 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")]

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

@@ -1705,6 +1705,13 @@ 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("开始获取视觉输出结果");
                     //获取相机校准

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

@@ -340,6 +340,74 @@ namespace TeamAAS_VP.ViewModels.Product
             }
         }
 
+        private ProcedureModel _IndependentCamer1CheckProcedureId;
+        /// <summary>
+        /// 独立移动模组相机1检测任务拍照流程ID
+        /// </summary>
+        public ProcedureModel IndependentCamer1CheckProcedureId
+        {
+            get { return _IndependentCamer1CheckProcedureId; }
+            set
+            {
+                SetProperty(ref _IndependentCamer1CheckProcedureId, value);
+                if (value != null)
+                {
+                    SelectProduct.IndependentCamer1CheckProcedureId = value.Id;
+                }
+            }
+        }
+
+        private ProcedureModel _IndependentCamer2CheckProcedureId;
+        /// <summary>
+        /// 独立移动模组相机2检测任务拍照流程ID
+        /// </summary>
+        public ProcedureModel IndependentCamer2CheckProcedureId
+        {
+            get { return _IndependentCamer2CheckProcedureId; }
+            set
+            {
+                SetProperty(ref _IndependentCamer2CheckProcedureId, value);
+                if (value != null)
+                {
+                    SelectProduct.IndependentCamer2CheckProcedureId = value.Id;
+                }
+            }
+        }
+
+        private ProcedureModel _IndependentCamer3CheckProcedureId;
+        /// <summary>
+        /// 独立移动模组相机3检测任务拍照流程ID
+        /// </summary>
+        public ProcedureModel IndependentCamer3CheckProcedureId
+        {
+            get { return _IndependentCamer3CheckProcedureId; }
+            set
+            {
+                SetProperty(ref _IndependentCamer3CheckProcedureId, value);
+                if (value != null)
+                {
+                    SelectProduct.IndependentCamer3CheckProcedureId = value.Id;
+                }
+            }
+        }
+
+        private ProcedureModel _IndependentCamer4CheckProcedureId;
+        /// <summary>
+        /// 独立移动模组相机4检测任务拍照流程ID
+        /// </summary>
+        public ProcedureModel IndependentCamer4CheckProcedureId
+        {
+            get { return _IndependentCamer4CheckProcedureId; }
+            set
+            {
+                SetProperty(ref _IndependentCamer4CheckProcedureId, value);
+                if (value != null)
+                {
+                    SelectProduct.IndependentCamer4CheckProcedureId = value.Id;
+                }
+            }
+        }
+
         #endregion
 
         #region 命令
@@ -490,6 +558,22 @@ namespace TeamAAS_VP.ViewModels.Product
                 SelectProduct.IndependentCamer4AuxProcedureId = Guid.Empty;
             }
 
+            if (IndependentCamer1CheckProcedureId == null)
+            {
+                SelectProduct.IndependentCamer1CheckProcedureId = Guid.Empty;
+            }
+            if (IndependentCamer2CheckProcedureId == null)
+            {
+                SelectProduct.IndependentCamer2CheckProcedureId = Guid.Empty;
+            }
+            if (IndependentCamer3CheckProcedureId == null)
+            {
+                SelectProduct.IndependentCamer3CheckProcedureId = Guid.Empty;
+            }
+            if (IndependentCamer4CheckProcedureId == null)
+            {
+                SelectProduct.IndependentCamer4CheckProcedureId = Guid.Empty;
+            }
 
         }
 
@@ -612,6 +696,23 @@ namespace TeamAAS_VP.ViewModels.Product
                 {
                     IndependentCamer4ProductProcedureId = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.IndependentCamer4ProductProcedureId);
                 }
+
+                if (SelectProduct.IndependentCamer1CheckProcedureId != Guid.Empty)
+                {
+                    IndependentCamer1CheckProcedureId = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.IndependentCamer1CheckProcedureId);
+                }
+                if (SelectProduct.IndependentCamer2CheckProcedureId != Guid.Empty)
+                {
+                    IndependentCamer2CheckProcedureId = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.IndependentCamer2CheckProcedureId);
+                }
+                if (SelectProduct.IndependentCamer3CheckProcedureId != Guid.Empty)
+                {
+                    IndependentCamer3CheckProcedureId = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.IndependentCamer3CheckProcedureId);
+                }
+                if (SelectProduct.IndependentCamer4CheckProcedureId != Guid.Empty)
+                {
+                    IndependentCamer4CheckProcedureId = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.IndependentCamer4CheckProcedureId);
+                }
             }
             catch (Exception ex)
             {

+ 5 - 5
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)
@@ -73,12 +73,12 @@ namespace TeamAAS_VP.Views.Product
         {
             if (e.PropertyName == "Image")
             {
-                if (this.display.Image==null)
+                if (this.display.Image == null)
                 {
                     this.display.Image = VM.Image;
                     //图像中心点坐标
-                    _imageWidth= this.display.Image.Width;
-                    _imageHeight= this.display.Image.Height;
+                    _imageWidth = this.display.Image.Width;
+                    _imageHeight = this.display.Image.Height;
                     CogGraphicCollection graphic = new CogGraphicCollection();
                     CogCreateLineTool line1 = new CogCreateLineTool();
                     CogCreateLineTool line2 = new CogCreateLineTool();
@@ -101,7 +101,7 @@ namespace TeamAAS_VP.Views.Product
                 {
                     this.display.Image = VM.Image;
                     //如果图像的长宽发生变化,则重新绘制十字线
-                    if (_imageWidth!= this.display.Image.Width|| _imageHeight!= this.display.Image.Height)
+                    if (_imageWidth != this.display.Image.Width || _imageHeight != this.display.Image.Height)
                     {
                         _imageWidth = this.display.Image.Width;
                         _imageHeight = this.display.Image.Height;

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

@@ -131,6 +131,10 @@
                         <RowDefinition Height="auto" />
                         <RowDefinition Height="auto" />
                         <RowDefinition Height="auto" />
+                        <RowDefinition Height="auto" />
+                        <RowDefinition Height="auto" />
+                        <RowDefinition Height="auto" />
+                        <RowDefinition Height="auto" />
                     </Grid.RowDefinitions>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition Width="auto" />
@@ -611,6 +615,99 @@
                             </DataTemplate>
                         </ComboBox.ItemTemplate>
                     </ComboBox>
+
+                    <!--独立向下相机1检测拍照流程ID-->
+                    <TextBlock Grid.Row="17"
+                               Grid.Column="0"
+                               Text="独立向下相机1检测拍照流程ID: " />
+                    <ComboBox Grid.Row="17"
+                              Grid.Column="1"
+                              ItemsSource="{Binding ProcedureModels}"
+                              SelectedItem="{Binding IndependentCamer1CheckProcedureId}"
+                              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检测拍照流程ID-->
+                    <TextBlock Grid.Row="18"
+                               Grid.Column="0"
+                               Text="独立向下相机2检测拍照流程ID: " />
+                    <ComboBox Grid.Row="18"
+                              Grid.Column="1"
+                              ItemsSource="{Binding ProcedureModels}"
+                              SelectedItem="{Binding IndependentCamer2CheckProcedureId}"
+                              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>
+                    <!--独立向下相机3检测拍照流程ID-->
+                    <TextBlock Grid.Row="19"
+                               Grid.Column="0"
+                               Text="独立向下相机3检测拍照流程ID: " />
+                    <ComboBox Grid.Row="19"
+                              Grid.Column="1"
+                              ItemsSource="{Binding ProcedureModels}"
+                              SelectedItem="{Binding IndependentCamer3CheckProcedureId}"
+                              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>
+                    <!--独立向下相机4检测拍照流程ID-->
+                    <TextBlock Grid.Row="20"
+                               Grid.Column="0"
+                               Text="独立向下相机4检测拍照流程ID: " />
+                    <ComboBox Grid.Row="20"
+                              Grid.Column="1"
+                              ItemsSource="{Binding ProcedureModels}"
+                              SelectedItem="{Binding IndependentCamer4CheckProcedureId}"
+                              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>