Quellcode durchsuchen

添加相机读取二维码

yaoxiaohan vor 7 Monaten
Ursprung
Commit
d1ad3db5e3

+ 112 - 5
TeamAAS-VM/Core/Management.cs

@@ -683,7 +683,7 @@ namespace TeamAAS_VP.Core
             if (File.Exists(FilePath.SignalConfigPath))
             {
                 try
-                {                    
+                {
                     var port = FileHelper.ReadJsonFile<string>(FilePath.SignalConfigPath);
                     if (port != null)
                     {
@@ -1162,6 +1162,7 @@ namespace TeamAAS_VP.Core
                 addressConfig.In_WorkDone.Address,
                 //addressConfig.In_MesCheck.Address,
                 addressConfig.In_RequestPosition.Address,
+                addressConfig.In_QrCodePhotoRequest.Address,
                 addressConfig.In_ScrewTeachExe.Address,
                 addressConfig.In_PickINC.Address,
             };
@@ -1228,6 +1229,13 @@ namespace TeamAAS_VP.Core
                     await item.WriteToPlcAddress(addressConfig.Out_CheckCamera, plc);
                 }
             }
+            if (current.QrCodePoints != null && current.QrCodePoints.Count > 0)
+            {
+                foreach (var item in current.QrCodePoints)
+                {
+                    await item.WriteToPlcAddress(addressConfig.Out_QrCodeCamera, plc);
+                }
+            }
         }
 
         PointF[] DowmCameraResults = new PointF[10];
@@ -1244,6 +1252,7 @@ namespace TeamAAS_VP.Core
         Int16 _LastWorkStart = 0;
         Int16 _LastWorkDone = 0;
         Int16 _LastRequestPosition = 0;
+        Int16 _LastQrCodePhotoRequest = 0;
         Int16[] _LastMesCheck = new Int16[10];
         Int16 _LastPickINC = 0;
         DateTime[] _LastMesCheckTime = new DateTime[10];
@@ -1807,8 +1816,8 @@ namespace TeamAAS_VP.Core
                             //拍1打1 
                             if (systemConfig.WorkMode == 1)
                             {
-                                var point=currentProduct.ScrewPoints.FirstOrDefault(p=>p.Number== positionIndex);
-                                if (point==null)
+                                var point = currentProduct.ScrewPoints.FirstOrDefault(p => p.Number == positionIndex);
+                                if (point == null)
                                 {
                                     SendTaskMessage($"点:{positionIndex}不存在", MessageLevel.Info);
                                     await plc.WriteNodeAsync(addressConfig.Out_CameraDone.Address, (Int16)2);
@@ -1856,6 +1865,58 @@ namespace TeamAAS_VP.Core
                         }
                     }
                 }
+                // PLC请求二维码拍照位置
+                else if (addressConfig.In_QrCodePhotoRequest.Address.Contains(tuple.nodeId))
+                {
+                    if (tuple.value is Int16 state)
+                    {
+                        if (_LastQrCodePhotoRequest != state)
+                        {
+                            _LastQrCodePhotoRequest = state;
+                        }
+                        else
+                        {
+                            return;
+                        }
+
+                        if (state == 1)
+                        {
+                            SendTaskMessage("收到PLC二维码拍照位置请求", MessageLevel.Debug);
+                            if (currentProduct.QrCodePoints == null || currentProduct.QrCodePoints.Count == 0)
+                            {
+                                SendTaskMessage("未找到示教后的二维码拍照点位", MessageLevel.Alarm);
+                                await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)2);
+                                return;
+                            }
+                            var qrpoint = currentProduct.QrCodePoints[0];
+                            //发送点位
+                            bool SendSuccess = await qrpoint.WriteToPlcAddress(addressConfig.Out_QrCodeCamera, plc);
+                            if (SendSuccess)
+                            {
+                                SendTaskMessage("二维码拍照点位发送成功", MessageLevel.Alarm);
+                                await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)1);
+
+                                Guid qrCodeProcedureId = currentProduct.QrCodeProcedureId;
+                                if (qrCodeProcedureId == Guid.Empty)
+                                {
+                                    // 如果没有配置二维码视觉流程,直接返回成功
+                                    SendTaskMessage("未配置二维码视觉流程,跳过扫码", MessageLevel.Info);
+                                    return;
+                                }
+                            }
+                            else
+                            {
+                                SendTaskMessage("二维码拍照点位发送失败", MessageLevel.Alarm);
+                                await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)2);
+                            }
+                        }
+                        else
+                        {
+                            SendTaskMessage("二维码拍照点位发送信号已关闭", MessageLevel.Alarm);
+                        }
+                    }
+
+                }
                 // 螺丝供料器螺丝递减
                 else if (addressConfig.In_PickINC.Address.Contains(tuple.nodeId))
                 {
@@ -1886,7 +1947,6 @@ namespace TeamAAS_VP.Core
                         }
                     }
                 }
-
                 // 过站检查
                 else
                 {
@@ -1904,7 +1964,54 @@ namespace TeamAAS_VP.Core
                                 {
                                     return;
                                 }
-                                var code = plc.ReadNode<string>(string.Format(addressConfig.In_Code.Address, i));
+
+                                string code = "";
+                                //plc启用的模式
+                                bool models = plc.ReadNode<bool>(addressConfig.Cam_code_mode.Address);
+
+                                if (models)
+                                {
+                                    //拍照读码
+                                    SendTaskMessage(Lang.触发上相机锁附组装拍照, MessageLevel.Debug);
+                                    //相机的编号
+                                    Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_UpCameraPutNum.Address);
+                                    SendTaskMessage(string.Format(Lang.编号0, cameraIndex), MessageLevel.Info);
+
+                                    Guid qrCodeProcedureId = currentProduct.QrCodeProcedureId;
+
+                                    //视觉流程ID
+                                    var qrCodeProcess = _productService.GetCurrentProductProcedureModelById(qrCodeProcedureId);
+                                    if (qrCodeProcess == null)
+                                    {
+                                        SendTaskMessage($"未找到二维码视觉流程,流程ID: {qrCodeProcedureId}", MessageLevel.Alarm);
+                                        await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)2);
+                                        return;
+                                    }
+                                    SendTaskMessage($"开始执行二维码扫码视觉流程", MessageLevel.Debug);
+                                    var _cts = new CancellationTokenSource();
+
+                                    await _remoteCommandService.SetLightBeforePhoto(qrCodeProcess);
+                                    var qrCodeResult = _remoteCommandService.ExecutePhoto(qrCodeProcess, out CogToolBlockTerminalCollection outputCollection);
+
+                                    if (qrCodeResult && outputCollection.Contains("QR"))
+                                    {
+                                        code = outputCollection["QR"].Value as string;
+                                        SendTaskMessage($"二维码扫码成功:{code}", MessageLevel.Info);
+                                        await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)1);
+                                    }
+                                    else
+                                    {
+                                        code = "";
+                                        SendTaskMessage("二维码扫码失败", MessageLevel.Alarm);
+                                        await plc.WriteNodeAsync(addressConfig.Out_QrCodePhotoResault.Address, (Int16)2);
+                                        return;
+                                    }
+                                }
+                                else
+                                {
+                                    code = plc.ReadNode<string>(string.Format(addressConfig.In_Code.Address, i));
+                                }
+
                                 //询问mes
                                 if (state == 1)
                                 {

+ 7 - 0
TeamAAS-VM/Interfaces/IRemoteCommandService.cs

@@ -240,6 +240,13 @@ namespace TeamAAS_VP.Interfaces
         /// <param name="outputCollection"></param>
         /// <returns></returns>
         bool ExecutePhoto(ProcedureModel procedure, Dictionary<string, string> InputTerminal, out CogToolBlockTerminalCollection outputCollection);
+        /// <summary>
+        /// 执行拍照二维码流程运行
+        /// </summary>
+        /// <param name="procedure"></param>
+        /// <param name="outputCollection"></param>
+        /// <returns></returns>
+        bool ExecutePhoto(ProcedureModel procedure, out CogToolBlockTerminalCollection outputCollection);
 
         /// <summary>
         /// 执行相机拍照获取单个点位结果

+ 75 - 1
TeamAAS-VM/Models/PLC/PlcAddressConfig.cs

@@ -188,7 +188,7 @@ namespace TeamAAS_VP.Models.PLC
             get { return _FixedCameracheckStatus; }
             set { SetProperty(ref _FixedCameracheckStatus, value); }
         }
-
+    
         private PlcAddress _Out_CameraDone = new PlcAddress();
         /// <summary>
         /// 相机坐标拟合完成
@@ -209,6 +209,15 @@ namespace TeamAAS_VP.Models.PLC
             set { SetProperty(ref _MesStatus, value); }
         }
 
+        private PlcAddress _QrCodePhotoResault = new PlcAddress();
+        /// <summary>
+        /// pc发送二维码拍照点位成功后 =1 失败=2 未执行=0
+        /// </summary>
+        public PlcAddress Out_QrCodePhotoResault
+        {
+            get { return _QrCodePhotoResault; }
+            set { SetProperty(ref _QrCodePhotoResault, value); }
+        }
         private PlcPointAddress _PickCamera = new PlcPointAddress();
         /// <summary>
         /// 取料拍照点位参数
@@ -279,6 +288,16 @@ namespace TeamAAS_VP.Models.PLC
             set { SetProperty(ref _Out_ScrewTeachNum, value); }
         }
 
+        private PlcPointAddress _QrCodeCamera = new PlcPointAddress();
+        /// <summary>
+        /// 二维码拍照点位参数
+        /// </summary>
+        public PlcPointAddress Out_QrCodeCamera
+        {
+            get { return _QrCodeCamera; }
+            set { SetProperty(ref _QrCodeCamera, value); }
+        }
+
         private PlcAddress _Out_ScrewTeachOk;
         /// <summary>
         /// 下相机矫正披头的结果,1:OK,2:NG
@@ -416,6 +435,15 @@ namespace TeamAAS_VP.Models.PLC
             set { SetProperty(ref _In_Code, value); }
         }
 
+        private PlcAddress _Cam_code_mode;
+
+        public PlcAddress Cam_code_mode
+        {
+            get { return _Cam_code_mode; }
+            set { SetProperty(ref _Cam_code_mode, value); }
+        }
+
+
         private PlcAddress _In_MesCheck = new PlcAddress();
         /// <summary>
         /// Mes交互 =1 获取过站信息当站是否生产,=2 上传本站数据
@@ -576,6 +604,16 @@ namespace TeamAAS_VP.Models.PLC
             set { SetProperty(ref _In_FixedCameracheckExe, value); }
         }
 
+        private PlcAddress _In_QrCodePhotoRequest = new PlcAddress();
+        /// <summary>
+        /// 二维码拍照请求
+        /// </summary>
+        public PlcAddress In_QrCodePhotoRequest
+        {
+            get { return _In_QrCodePhotoRequest; }
+            set { SetProperty(ref _In_QrCodePhotoRequest, value); }
+        }
+
         private PlcAddress _In_ProductNum = new PlcAddress();
         /// <summary>
         /// 正在锁附/组装编号
@@ -773,6 +811,11 @@ namespace TeamAAS_VP.Models.PLC
             Out_MesStatus.DataType = "int16";
             Out_MesStatus.Description = Lang.过站信息1允许工作2本站放行3数据上传完成;
 
+            Out_QrCodePhotoResault = Ensure(Out_QrCodePhotoResault);
+            Out_QrCodePhotoResault.Address = "ns=4;s=DB_Communication|FromPC.photo_dwon";
+            Out_QrCodePhotoResault.DataType = "int16";
+            Out_QrCodePhotoResault.Description = "pc发送二维码拍照点位 1=成功 2=失败";
+
             Check_ScrewTorque = Ensure(Check_ScrewTorque);
             Check_ScrewTorque.Address = "ns=4;s=DB_DriveControl|ScrewCtrl[1].Cmd.ManuStart";
             Check_ScrewTorque.DataType = "Bool";
@@ -951,6 +994,25 @@ namespace TeamAAS_VP.Models.PLC
             Out_CheckCamera.Feeder.Address = "ns=4;s=DB_Communication|FromPC.Point_CheckCamera[{0}].Feeder";
             Out_CheckCamera.ScrewProNum.Address = "ns=4;s=DB_Communication|FromPC.Point_CheckCamera[{0}].ScrewProNum";
 
+            // Out_QrCodeCamera(二维码拍照点位)初始化并赋地址
+            Out_QrCodeCamera = EnsurePoint(Out_QrCodeCamera);
+            Out_QrCodeCamera.Description = Lang.二维码拍照点位参数;
+            Out_QrCodeCamera.X_Position.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].X_Position";
+            Out_QrCodeCamera.X_Velocity.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].X_Velocity";
+            Out_QrCodeCamera.Y_Position.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].Y_Position";
+            Out_QrCodeCamera.Y_Velocity.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].Y_Velocity";
+            Out_QrCodeCamera.Z_Position_Start.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].Z_Position_Start";
+            Out_QrCodeCamera.Z_Velocity_Start.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].Z_Velocity_Start";
+            Out_QrCodeCamera.Z_Position_Stop.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].Z_Position_Stop";
+            Out_QrCodeCamera.Z_Velocity_Stop.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].Z_Velocity_Stop";
+            Out_QrCodeCamera.U_Position.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].U_Position";
+            Out_QrCodeCamera.U_Velocity.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].U_Velocity";
+            Out_QrCodeCamera.R_Position.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].R_Position";
+            Out_QrCodeCamera.R_Velocity.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].R_Velocity";
+            Out_QrCodeCamera.Torque.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].Torque";
+            Out_QrCodeCamera.Feeder.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].Feeder";
+            Out_QrCodeCamera.ScrewProNum.Address = "ns=4;s=DB_Communication|FromPC.Photo_Positipn[{0}].ScrewProNum";
+
             Out_ScrewTeachNum = Ensure(Out_ScrewTeachNum);
             Out_ScrewTeachNum.Address = "ns=4;s=DB_Communication|FromPC.ScrewTeachNum";
             Out_ScrewTeachNum.DataType = "int16";
@@ -1053,6 +1115,11 @@ namespace TeamAAS_VP.Models.PLC
             In_FixedCameracheckExe.DataType = "int16";
             In_FixedCameracheckExe.Description = Lang.固定相机检测拍照触发;
 
+            In_QrCodePhotoRequest = Ensure(In_QrCodePhotoRequest);
+            In_QrCodePhotoRequest.Address = "ns=4;s=DB_Communication|ToPC.photo_request";
+            In_QrCodePhotoRequest.DataType = "int16";
+            In_QrCodePhotoRequest.Description = Lang.二维码拍照请求;
+
             In_ProductNum = Ensure(In_ProductNum);
             In_ProductNum.Address = "ns=4;s=DB_Communication|ToPC.ProductNum";
             In_ProductNum.DataType = "int16";
@@ -1088,6 +1155,13 @@ namespace TeamAAS_VP.Models.PLC
             In_PickINC.DataType = "int16";
             In_PickINC.Description = Lang.取一颗螺丝触发信号;
 
+            //ns=4;s=DB_HMI|Cam_code_mode  读取plc模式  0普通读取plc寄存器的二维码询问mes   1由上位机拍照获取二维码上传mes
+
+            Cam_code_mode = Ensure(Cam_code_mode);
+            Cam_code_mode.Address = "ns=4;s=DB_HMI|Cam_code_mode";
+            Cam_code_mode.DataType = "Bool";
+            Cam_code_mode.Description = "PLC二维码读取模式";
+
             // 说明:若项目中 PlcAddress 的实际属性名或类型与此不同(例如使用枚举、不同字段名),
             // 请根据实际类型调整赋值。本方法主要提供合理的默认字符串地址、数据类型及描述,便于后续从配置覆盖。
         }

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

@@ -187,6 +187,14 @@ namespace TeamAAS_VP.Models
             set { SetProperty(ref _MoveDownCameraLockPhotoProcedureId, value); }
         }
 
+        // 二维码扫码流程ID
+        private Guid _QrCodeProcedureId;
+        public Guid QrCodeProcedureId
+        {
+            get { return _QrCodeProcedureId; }
+            set { SetProperty(ref _QrCodeProcedureId, value); }
+        }
+
         private ObservableCollection<ProductGlobalParam> _GlobalParamListCollection;
         /// <summary>
         /// 产品全局参数集合
@@ -401,6 +409,7 @@ namespace TeamAAS_VP.Models
                 ScrewCameraPoints = this.ScrewCameraPoints,
                 ScrewPoints = this.ScrewPoints,
                 CheckCameraPoints = this.CheckCameraPoints,
+                QrCodePoints=this.QrCodePoints,
                 IsLoad = this.IsLoad,
                 IsCreate = this.IsCreate
             };

+ 18 - 0
TeamAAS-VM/Resources/Languages/Lang.Designer.cs

@@ -2112,6 +2112,24 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似  的本地化字符串。
+        /// </summary>
+        public static string 二维码拍照点位参数 {
+            get {
+                return ResourceManager.GetString("二维码拍照点位参数", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   查找类似  的本地化字符串。
+        /// </summary>
+        public static string 二维码拍照请求 {
+            get {
+                return ResourceManager.GetString("二维码拍照请求", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 产品 的本地化字符串。
         /// </summary>

+ 6 - 0
TeamAAS-VM/Resources/Languages/Lang.resx

@@ -4073,4 +4073,10 @@
   <data name="二维码拍照点位" xml:space="preserve">
     <value>二维码拍照点位</value>
   </data>
+  <data name="二维码拍照请求" xml:space="preserve">
+    <value></value>
+  </data>
+  <data name="二维码拍照点位参数" xml:space="preserve">
+    <value></value>
+  </data>
 </root>

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

@@ -1530,6 +1530,105 @@ namespace TeamAAS_VP.Services
                         SavePath = procedure.SavePath,
                         IsCompress = procedure.IsCompress,
                     });
+                    SendTaskMessage($"{procedure.CameraName},{procedure.CameraId}", MessageLevel.Info);
+                    return true;
+                }
+                else
+                {
+                    SendTaskMessage(Lang.视觉流程执行出错耗时.Replace("{0}", procedure.Name).Replace("{1}", $"{procedure.ToolBlock.RunStatus.ProcessingTime:F1}"), MessageLevel.Error);
+                    SendTaskMessage(procedure.ToolBlock.RunStatus.Message, MessageLevel.Error);
+                    outputCollection = null;
+                    _eventAggregator.GetEvent<RenderUpdateNotification>().Publish(new ShowRender()
+                    {
+                        CameraName = procedure.CameraName,
+                        Id = procedure.CameraId,
+                        Image = (ICogImage)procedure.ToolBlock.Inputs["InputImage"].Value,
+                        Graphic = new CogGraphicCollection(),
+                        Result = false,
+                        IsShow = true,
+                        IsSaveImage = procedure.IsSaveImage,
+                        SaveImageModel = procedure.SaveImageModel,
+                        SaveImagePathModel = procedure.SaveImagePathModel,
+                        SavePath = procedure.SavePath
+                    });
+                    return false;
+                }
+            }
+            catch (Exception ex)
+            {
+                SendTaskMessage(ex.Message, MessageLevel.Error);
+                LogHelper.WriteLogError(Lang.执行相机取图并执行视觉工具组时出错, ex);
+                outputCollection = null;
+                return false;
+            }
+        }
+        /// <summary>
+        /// 执行拍照二维码流程运行
+        /// </summary>
+        /// <param name="procedure"></param>
+        /// <param name="outputCollection"></param>
+        /// <returns></returns>
+        public bool ExecutePhoto(ProcedureModel procedure, out CogToolBlockTerminalCollection outputCollection)
+        {
+            try
+            {
+                SetLightBeforePhoto(procedure);
+                // 1. 采集图像
+                var camera = _cameraService.GetCamera(procedure.CameraId);
+                bool succed = camera.SetExposureTime(procedure.ExposureTime);
+                if (!succed)
+                {
+                    SendTaskMessage(Lang.相机曝光设置失败, MessageLevel.Error);
+                }
+                succed = camera.SetGain(procedure.Gain);
+                if (!succed)
+                {
+                    SendTaskMessage(Lang.相机增益设置失败, MessageLevel.Error);
+                }
+                DateTime nowtime = DateTime.Now;
+                LogHelper.WriteLogInfo(Lang.开始采集图像);
+                var image = camera.Grab();
+                if (image == null)
+                {
+
+                    SendTaskMessage(Lang.图像采集失败, MessageLevel.Error);
+                    outputCollection = null;
+                    return false;
+                }
+                procedure.ToolBlock.Inputs["InputImage"].Value = image;
+                LogHelper.WriteLogInfo(string.Format(Lang.采集图像完成用时0ms, (DateTime.Now - nowtime).Milliseconds));
+
+                // 3. 运行视觉工具
+                LogHelper.WriteLogInfo(Lang.开始运行视觉工具);
+                procedure.ToolBlock.Run();      //运行ToolBlock
+
+                if (procedure.ToolBlock.RunStatus.Result == CogToolResultConstants.Accept)
+                {
+                    SendTaskMessage(Lang.视觉流程执行耗时.Replace("{0}", procedure.Name).Replace("{1}", $"{procedure.ToolBlock.RunStatus.ProcessingTime:F1}"), MessageLevel.Info);
+                    outputCollection = procedure.ToolBlock.Outputs;     //获取输出终端集合
+                    DatabaseHelper.AddCameraRecords(_productService.GetCurrentProduct().Name, procedure.Name, outputCollection);
+                    ICogRecord record = null;
+                    foreach (CogToolBlockTerminal item in outputCollection)
+                    {
+                        if (item.Value is ICogRecord)
+                            record = item.Value as ICogRecord;
+                    }
+                    _eventAggregator.GetEvent<RenderUpdateNotification>().Publish(new ShowRender()
+                    {
+                        CameraName = procedure.CameraName,
+                        Id = procedure.CameraId,
+                        Image = (ICogImage)procedure.ToolBlock.Inputs["InputImage"].Value,
+                        Record = record,
+                        Result = (bool)(outputCollection["Found"].Value),
+                        IsShow = true,
+                        Graphic = new CogGraphicCollection(),
+                        IsSaveImage = procedure.IsSaveImage,
+                        SaveImageModel = procedure.SaveImageModel,
+                        SaveImagePathModel = procedure.SaveImagePathModel,
+                        SavePath = procedure.SavePath,
+                        IsCompress = procedure.IsCompress,
+                    });
+                    SendTaskMessage($"{procedure.CameraName},{procedure.CameraId}", MessageLevel.Info);
                     return true;
                 }
                 else

+ 3 - 1
TeamAAS-VM/TeamAAS-VP.csproj

@@ -1571,7 +1571,9 @@
     <EmbeddedResource Include="Resources\Languages\Lang.en.resx">
       <SubType>Designer</SubType>
     </EmbeddedResource>
-    <EmbeddedResource Include="Resources\Languages\Lang.ja-JP.resx" />
+    <EmbeddedResource Include="Resources\Languages\Lang.ja-JP.resx">
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
     <EmbeddedResource Include="Resources\Languages\Lang.resx">
       <Generator>PublicResXFileCodeGenerator</Generator>
       <LastGenOutput>Lang.Designer.cs</LastGenOutput>

+ 1 - 1
TeamAAS-VM/ViewModels/Product/PlcPointParamsViewModel.cs

@@ -1645,7 +1645,7 @@ namespace TeamAAS_VP.ViewModels.Product
             }
             else
             {
-                parameters1.Add("Title", "点位-补偿值设置");
+                parameters1.Add("Title", "二维码拍照点位-补偿值设置");
             }
 
             List<PlcPoint> _points = new List<PlcPoint>();

+ 5 - 5
TeamAAS-VM/ViewModels/Product/ProductHomeViewModel.cs

@@ -201,11 +201,11 @@ namespace TeamAAS_VP.ViewModels.Product
                         GlobalParamListCollection = new ObservableCollection<ProductGlobalParam>(),
                         PickCameraPoints = new ObservableCollection<Models.PLC.PlcPoint>(),
                         PickPoints = new ObservableCollection<Models.PLC.PlcPoint>(),
-                        SecPosCameraPoints=new ObservableCollection<Models.PLC.PlcPoint>(),
-                        ScrewCameraPoints=new ObservableCollection<Models.PLC.PlcPoint>(),
-                        ScrewPoints=new ObservableCollection<Models.PLC.PlcPoint>(),
-                        CheckCameraPoints=new ObservableCollection<Models.PLC.PlcPoint>(),
-
+                        SecPosCameraPoints = new ObservableCollection<Models.PLC.PlcPoint>(),
+                        ScrewCameraPoints = new ObservableCollection<Models.PLC.PlcPoint>(),
+                        ScrewPoints = new ObservableCollection<Models.PLC.PlcPoint>(),
+                        CheckCameraPoints = new ObservableCollection<Models.PLC.PlcPoint>(),
+                        QrCodePoints = new ObservableCollection<Models.PLC.PlcPoint>()
                     };
 
                     var cameras = _configService.GetAllCameras();

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

@@ -132,6 +132,23 @@ namespace TeamAAS_VP.ViewModels.Product
             }
         }
 
+        private ProcedureModel _QrCodePhotoProcedure;
+        /// <summary>
+        /// 移动向下相机锁付拍照流程ID
+        /// </summary>
+        public ProcedureModel QrCodePhotoProcedure
+        {
+            get { return _QrCodePhotoProcedure; }
+            set
+            {
+                SetProperty(ref _QrCodePhotoProcedure, value);
+                if (value != null)
+                {
+                    SelectProduct.QrCodeProcedureId = value.Id;
+                }
+            }
+        }
+
         #endregion
 
         #region 命令
@@ -292,6 +309,10 @@ namespace TeamAAS_VP.ViewModels.Product
                 {
                     MoveDownCameraLockPhotoProcedure = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.MoveDownCameraLockPhotoProcedureId);
                 }
+                if (SelectProduct.QrCodeProcedureId != Guid.Empty)
+                {
+                    QrCodePhotoProcedure = ProcedureModels.FirstOrDefault(p => p.Id == SelectProduct.QrCodeProcedureId);
+                }
             }
             catch (Exception ex)
             {

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

@@ -120,6 +120,7 @@
                         <RowDefinition Height="auto" />
                         <RowDefinition Height="auto" />
                         <RowDefinition Height="auto" />
+                        <RowDefinition Height="auto" />
                     </Grid.RowDefinitions>
                     <Grid.ColumnDefinitions>
                         <ColumnDefinition Width="auto" />
@@ -324,6 +325,29 @@
                             </DataTemplate>
                         </ComboBox.ItemTemplate>
                     </ComboBox>
+                    <!--相机扫码拍照流程-->
+                    <TextBlock Grid.Row="5"
+                        Grid.Column="0"
+                        Text="相机扫码拍照流程ID" />
+                    <ComboBox Grid.Row="5"
+                        Grid.Column="1"
+                        ItemsSource="{Binding ProcedureModels}"
+                        SelectedItem="{Binding QrCodePhotoProcedure}"
+                        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>