刘锦天 8 mēneši atpakaļ
vecāks
revīzija
c8bf5bbd0f

+ 30 - 48
TeamAAS-VM/Core/Management.cs

@@ -1334,14 +1334,25 @@ namespace TeamAAS_VP.Core
                         if (state)
                         {
                             SendTaskMessage($"触发固定相机检测拍照...", MessageLevel.Debug);
+                            //相机的编号
+                            //Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameracheckNum.Address);
                             // 读取相机编号
-                            
+
                             Int16 cameraIndex = plc.ReadNode<Int16>(addressConfig.In_FixedCameracheckNum.Address);
                             SendTaskMessage($"编号:{cameraIndex}", MessageLevel.Info);
 
-                            // 直接遍历 CameraProcedures,查找名称为 "C{cameraIndex}" 的流程(不保存回退)
-                            string targetName = $"C{cameraIndex}";
-                            object selectedProcess = null;
+                            // 找到对应编号的 PlcPoint
+                            var targetPoint = currentProduct.AoiPoints?.FirstOrDefault(p => p.Number == cameraIndex);
+                            if (targetPoint == null)
+                            {
+                                SendTaskMessage($"未找到 AOI 点位,编号:{cameraIndex}", MessageLevel.Alarm);
+                                await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)2);
+                                return;
+                            }
+
+                            // CameraProcedureId 存储的是具体的视觉流程 Id(ProcedureModel.Id),
+                            // 需要在所有 CameraProcedures 的 ProcedureModels 中查找匹配的流程。
+                            ProcedureModel selectedProcedure = null;
                             try
                             {
                                 var cameraProcedures = currentProduct.CameraProcedures;
@@ -1349,41 +1360,20 @@ namespace TeamAAS_VP.Core
                                 {
                                     foreach (var cp in cameraProcedures)
                                     {
-                                        var pmProp = cp.GetType().GetProperty("ProcedureModels");
-                                        if (pmProp == null) continue;
-                                        var pms = pmProp.GetValue(cp) as IEnumerable;
-                                        if (pms == null) continue;
-
-                                        foreach (var pm in pms)
-                                        {
-                                            var nameProp = pm.GetType().GetProperty("Name")
-                                                           ?? pm.GetType().GetProperty("ProcedureName")
-                                                           ?? pm.GetType().GetProperty("CameraName");
-                                            var name = nameProp?.GetValue(pm)?.ToString() ?? string.Empty;
-
-                                            if (string.Equals(name, targetName, StringComparison.OrdinalIgnoreCase))
-                                            {
-                                                selectedProcess = pm;
-                                                SendTaskMessage($"按名称匹配到流程: {name}", MessageLevel.Debug);
-                                                break;
-                                            }
-                                        }
-
-                                        if (selectedProcess != null) break;
+                                        if (cp?.ProcedureModels == null) continue;
+                                        selectedProcedure = cp.ProcedureModels.FirstOrDefault(pm => pm.Id == targetPoint.CameraProcedureId);
+                                        if (selectedProcedure != null) break;
                                     }
                                 }
-
-                                if (selectedProcess == null)
-                                {
-                                    SendTaskMessage("未找到任何拍照流程,写入失败状态。", MessageLevel.Alarm);
-                                    await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
-                                    return;
-                                }
                             }
                             catch (Exception ex)
                             {
-                                LogHelper.WriteLogError("查找拍照流程时出错", ex);
-                                SendTaskMessage($"查找拍照流程时出错: {ex.Message}", MessageLevel.Alarm);
+                                LogHelper.WriteLogError("查找 AOI 点位对应视觉流程时出错", ex);
+                            }
+
+                            if (selectedProcedure == null)
+                            {
+                                SendTaskMessage($"未找到 AOI 点位对应的视觉流程,Point#{cameraIndex} ProcedureId={targetPoint.CameraProcedureId}", MessageLevel.Alarm);
                                 await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
                                 return;
                             }
@@ -1392,37 +1382,29 @@ namespace TeamAAS_VP.Core
                             try
                             {
                                 var cts = new CancellationTokenSource();
-                                // 参数:根据当前流程需要,第二/第三参数可调整(这里保持 null)
-                                var visionResult = await _remoteCommandService.ExecutePhotoGetSinglePoint(selectedProcess as ProcedureModel, null, null, cts.Token);
-
+                                var visionResult = await _remoteCommandService.ExecutePhotoGetSinglePoint(selectedProcedure, null, null, cts.Token);
                                 if (visionResult.IsSucceed)
                                 {
-                                    SendTaskMessage($"流程 {targetName} 执行成功:X={visionResult.X:F3} Y={visionResult.Y:F3}", MessageLevel.Info);
-                                    // 写回 PLC 成功状态
+                                    SendTaskMessage($"AOI 流程执行成功:X={visionResult.X:F3} Y={visionResult.Y:F3}", MessageLevel.Info);
                                     await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)1);
-
-                                    // 如果需要把坐标写回 PLC,请在这里添加对应地址写入(Out_* 字段需在 PlcAddressConfig 中存在)
-                                    // 例如:
-                                    // await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPick_X.Address, (float)visionResult.X);
-                                    // await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPick_Y.Address, (float)visionResult.Y);
                                 }
                                 else
                                 {
-                                    SendTaskMessage($"流程 {targetName} 执行失败。", MessageLevel.Alarm);
+                                    SendTaskMessage($"AOI 流程执行失败:Point#{cameraIndex}", MessageLevel.Alarm);
                                     await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
                                 }
                             }
                             catch (Exception ex)
                             {
-                                LogHelper.WriteLogError("执行拍照流程时出错", ex);
-                                SendTaskMessage($"执行拍照流程异常: {ex.Message}", MessageLevel.Alarm);
+                                LogHelper.WriteLogError("执行 AOI 视觉流程时出错", ex);
+                                SendTaskMessage($"执行 AOI 视觉流程异常: {ex.Message}", MessageLevel.Alarm);
                                 try { await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2); } catch { }
                             }
                         }
                         else
                         {
                             SendTaskMessage($"触发固定相机检测拍照信号已关闭", MessageLevel.Alarm);
-                            await plc.WriteNodeAsync(addressConfig.Out_FixedCameracheckStatus.Address, (Int16)0);
+                            await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)0);
                         }
                     }
                 }

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

@@ -4380,6 +4380,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>

+ 39 - 39
TeamAAS-VM/Resources/Languages/Lang.en.resx

@@ -303,6 +303,24 @@
   <data name="ProcedureSaveImageModel_OriginalAndRecorded" xml:space="preserve">
     <value>Original+Recorded</value>
   </data>
+  <data name="ProcedureSaveImagePathModel_Month_Day_Time" xml:space="preserve">
+    <value>/yyyy-MM/MM-dd/yyyy-MM-dd HH_mm_ss.png</value>
+  </data>
+  <data name="ProcedureSaveImagePathModel_Month_Day_OkNG_Time" xml:space="preserve">
+    <value>/yyyy-MM/MM-dd/OK or NG/yyyy-MM-dd HH_mm_ss.png</value>
+  </data>
+  <data name="ProcedureSaveImagePathModel_Month_Day_Ok_Time" xml:space="preserve">
+    <value>/yyyy-MM/MM-dd/OK/yyyy-MM-dd HH_mm_ss.png</value>
+  </data>
+  <data name="ProcedureSaveImagePathModel_Month_Day_Ng_Time" xml:space="preserve">
+    <value>/yyyy-MM/MM-dd/NG/yyyy-MM-dd HH_mm_ss.png</value>
+  </data>
+  <data name="TCPConnectType_Server" xml:space="preserve">
+    <value>Software as a server</value>
+  </data>
+  <data name="TCPConnectType_Client" xml:space="preserve">
+    <value>Software as a client</value>
+  </data>
   <data name="Terminator_CR" xml:space="preserve">
     <value>CR</value>
   </data>
@@ -324,36 +342,18 @@
   <data name="UserPart_Administrator" xml:space="preserve">
     <value>Administrator</value>
   </data>
-  <data name="VisionModel_精简模式" xml:space="preserve">
-    <value>Simple</value>
-  </data>
-  <data name="VisionModel_Advanced" xml:space="preserve">
-    <value>Advanced</value>
-  </data>
-  <data name="ProcedureSaveImagePathModel_Month_Day_Time" xml:space="preserve">
-    <value>/yyyy-MM/MM-dd/yyyy-MM-dd HH_mm_ss.png</value>
-  </data>
-  <data name="ProcedureSaveImagePathModel_Month_Day_OkNG_Time" xml:space="preserve">
-    <value>/yyyy-MM/MM-dd/OK or NG/yyyy-MM-dd HH_mm_ss.png</value>
-  </data>
-  <data name="ProcedureSaveImagePathModel_Month_Day_Ok_Time" xml:space="preserve">
-    <value>/yyyy-MM/MM-dd/OK/yyyy-MM-dd HH_mm_ss.png</value>
-  </data>
-  <data name="ProcedureSaveImagePathModel_Month_Day_Ng_Time" xml:space="preserve">
-    <value>/yyyy-MM/MM-dd/NG/yyyy-MM-dd HH_mm_ss.png</value>
-  </data>
-  <data name="TCPConnectType_Server" xml:space="preserve">
-    <value>Software as a server</value>
-  </data>
-  <data name="TCPConnectType_Client" xml:space="preserve">
-    <value>Software as a client</value>
-  </data>
   <data name="VibrationModel_PhotoVibration" xml:space="preserve">
     <value>Vibrate before taking photos</value>
   </data>
   <data name="VibrationModel_VibrationPhoto" xml:space="preserve">
     <value>Take a photo before vibrating</value>
   </data>
+  <data name="VisionModel_精简模式" xml:space="preserve">
+    <value>Simple</value>
+  </data>
+  <data name="VisionModel_Advanced" xml:space="preserve">
+    <value>Advanced</value>
+  </data>
   <data name="添加完成" xml:space="preserve">
     <value>Addition completed!</value>
   </data>
@@ -786,15 +786,6 @@
   <data name="输入2触发序列ID" xml:space="preserve">
     <value>Enter 2 trigger sequence ID</value>
   </data>
-  <data name="上使能" xml:space="preserve">
-    <value>Motor On</value>
-  </data>
-  <data name="下使能" xml:space="preserve">
-    <value>Motor Off</value>
-  </data>
-  <data name="复位错误" xml:space="preserve">
-    <value>Reset</value>
-  </data>
   <data name="序列集调试" xml:space="preserve">
     <value>Sequence set debugging</value>
   </data>
@@ -852,6 +843,15 @@
   <data name="断开连接" xml:space="preserve">
     <value>disconnect</value>
   </data>
+  <data name="上使能" xml:space="preserve">
+    <value>Motor On</value>
+  </data>
+  <data name="下使能" xml:space="preserve">
+    <value>Motor Off</value>
+  </data>
+  <data name="复位错误" xml:space="preserve">
+    <value>Reset</value>
+  </data>
   <data name="释放刹车" xml:space="preserve">
     <value>Release the brakes</value>
   </data>
@@ -1050,9 +1050,6 @@
   <data name="图像处理简单模式" xml:space="preserve">
     <value>Image processing</value>
   </data>
-  <data name="X" xml:space="preserve">
-    <value> X </value>
-  </data>
   <data name="图像处理" xml:space="preserve">
     <value>Image processing</value>
   </data>
@@ -1152,6 +1149,9 @@
   <data name="行X列" xml:space="preserve">
     <value>Row X Column: </value>
   </data>
+  <data name="X" xml:space="preserve">
+    <value> X </value>
+  </data>
   <data name="修改名称" xml:space="preserve">
     <value>Edit name</value>
   </data>
@@ -1896,12 +1896,12 @@
   <data name="频率区间" xml:space="preserve">
     <value>Frequency range</value>
   </data>
-  <data name="CameraBrand_Galaxy" xml:space="preserve">
-    <value>Daheng Camera(Galaxy)</value>
-  </data>
   <data name="振幅区间" xml:space="preserve">
     <value>Amplitude range</value>
   </data>
+  <data name="CameraBrand_Galaxy" xml:space="preserve">
+    <value>Daheng Camera(Galaxy)</value>
+  </data>
   <data name="正向" xml:space="preserve">
     <value>Positive</value>
   </data>

+ 32 - 32
TeamAAS-VM/Resources/Languages/Lang.ja-JP.resx

@@ -228,15 +228,15 @@
   <data name="SettingView_Language_Japanese" xml:space="preserve">
     <value>日本語</value>
   </data>
+  <data name="RobotBrand_默认" xml:space="preserve">
+    <value>Default</value>
+  </data>
   <data name="RobotBrand_EPSON" xml:space="preserve">
     <value>EPSON</value>
   </data>
   <data name="RobotBrand_FANUC" xml:space="preserve">
     <value>FANUC</value>
   </data>
-  <data name="RobotBrand_默认" xml:space="preserve">
-    <value>Default</value>
-  </data>
   <data name="RobotBrand_Schneider" xml:space="preserve">
     <value>Schneider</value>
   </data>
@@ -276,23 +276,23 @@
   <data name="CameraMount_None" xml:space="preserve">
     <value>スタンドアロンカメラ</value>
   </data>
-  <data name="ModbusDataStore_InputRegisters" xml:space="preserve">
-    <value>InputRegisters</value>
-  </data>
-  <data name="ModbusDataStore_HoldingRegisters" xml:space="preserve">
-    <value>HoldingRegisters</value>
+  <data name="CoordinateModel_Orthogonality" xml:space="preserve">
+    <value>直角直交座標系</value>
   </data>
-  <data name="ModbusDataStore_InputDiscretes" xml:space="preserve">
-    <value>InputDiscretes</value>
+  <data name="CoordinateModel_Shear" xml:space="preserve">
+    <value>せん断座標系</value>
   </data>
   <data name="ModbusDataStore_CoilDiscretes" xml:space="preserve">
     <value>CoilDiscretes</value>
   </data>
-  <data name="CoordinateModel_Orthogonality" xml:space="preserve">
-    <value>直角直交座標系</value>
+  <data name="ModbusDataStore_InputDiscretes" xml:space="preserve">
+    <value>InputDiscretes</value>
   </data>
-  <data name="CoordinateModel_Shear" xml:space="preserve">
-    <value>せん断座標系</value>
+  <data name="ModbusDataStore_HoldingRegisters" xml:space="preserve">
+    <value>HoldingRegisters</value>
+  </data>
+  <data name="ModbusDataStore_InputRegisters" xml:space="preserve">
+    <value>InputRegisters</value>
   </data>
   <data name="ProcedureSaveImageModel_Original" xml:space="preserve">
     <value>原图</value>
@@ -522,9 +522,6 @@
   <data name="注册" xml:space="preserve">
     <value>登録</value>
   </data>
-  <data name="相机" xml:space="preserve">
-    <value>カメラ</value>
-  </data>
   <data name="用户名" xml:space="preserve">
     <value>ユーザー名</value>
   </data>
@@ -546,6 +543,9 @@
   <data name="校准配置" xml:space="preserve">
     <value>キャリブレーション構成</value>
   </data>
+  <data name="相机" xml:space="preserve">
+    <value>カメラ</value>
+  </data>
   <data name="选择相机" xml:space="preserve">
     <value>カメラを選択します</value>
   </data>
@@ -786,15 +786,6 @@
   <data name="输入2触发序列ID" xml:space="preserve">
     <value>トリガーシーケンスIDを2つ入力してください</value>
   </data>
-  <data name="上使能" xml:space="preserve">
-    <value>Motor On</value>
-  </data>
-  <data name="下使能" xml:space="preserve">
-    <value>Motor Off</value>
-  </data>
-  <data name="复位错误" xml:space="preserve">
-    <value>Reset</value>
-  </data>
   <data name="序列集调试" xml:space="preserve">
     <value>シーケンスセットのデバッグ</value>
   </data>
@@ -852,6 +843,15 @@
   <data name="断开连接" xml:space="preserve">
     <value>接続が切断されています</value>
   </data>
+  <data name="上使能" xml:space="preserve">
+    <value>Motor On</value>
+  </data>
+  <data name="下使能" xml:space="preserve">
+    <value>Motor Off</value>
+  </data>
+  <data name="复位错误" xml:space="preserve">
+    <value>Reset</value>
+  </data>
   <data name="释放刹车" xml:space="preserve">
     <value>ブレーキを放して</value>
   </data>
@@ -1050,9 +1050,6 @@
   <data name="图像处理简单模式" xml:space="preserve">
     <value>画像処理(コンパクトモード)</value>
   </data>
-  <data name="X" xml:space="preserve">
-    <value> X </value>
-  </data>
   <data name="图像处理" xml:space="preserve">
     <value>画像処理</value>
   </data>
@@ -1152,6 +1149,9 @@
   <data name="行X列" xml:space="preserve">
     <value>X列目: </value>
   </data>
+  <data name="X" xml:space="preserve">
+    <value> X </value>
+  </data>
   <data name="修改名称" xml:space="preserve">
     <value>名前を変更してください</value>
   </data>
@@ -1896,12 +1896,12 @@
   <data name="频率区间" xml:space="preserve">
     <value>周波数範囲</value>
   </data>
-  <data name="CameraBrand_Galaxy" xml:space="preserve">
-    <value>大恒カメラ(Galaxy)</value>
-  </data>
   <data name="振幅区间" xml:space="preserve">
     <value>振幅範囲</value>
   </data>
+  <data name="CameraBrand_Galaxy" xml:space="preserve">
+    <value>大恒カメラ(Galaxy)</value>
+  </data>
   <data name="正向" xml:space="preserve">
     <value>よし</value>
   </data>

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

@@ -2120,4 +2120,12 @@
   <data name="相机焦距评价" xml:space="preserve">
     <value>相机焦距评价</value>
   </data>
+  <data name="示教起点" xml:space="preserve">
+    <value>示教起点</value>
+    <comment>示教起点</comment>
+  </data>
+  <data name="示教终点" xml:space="preserve">
+    <value>示教终点</value>
+    <comment>示教终点</comment>
+  </data>
 </root>

+ 9 - 9
TeamAAS-VM/Resources/Languages/Lang.zh-TW.resx

@@ -522,9 +522,6 @@
   <data name="注册" xml:space="preserve">
     <value>註冊</value>
   </data>
-  <data name="相机" xml:space="preserve">
-    <value>相機</value>
-  </data>
   <data name="用户名" xml:space="preserve">
     <value>帳號</value>
   </data>
@@ -546,6 +543,9 @@
   <data name="校准配置" xml:space="preserve">
     <value>校準配置</value>
   </data>
+  <data name="相机" xml:space="preserve">
+    <value>相機</value>
+  </data>
   <data name="选择相机" xml:space="preserve">
     <value>選擇相機</value>
   </data>
@@ -1050,9 +1050,6 @@
   <data name="图像处理简单模式" xml:space="preserve">
     <value>影像處理(簡潔模式)</value>
   </data>
-  <data name="X" xml:space="preserve">
-    <value> X </value>
-  </data>
   <data name="图像处理" xml:space="preserve">
     <value>影像處理</value>
   </data>
@@ -1152,6 +1149,9 @@
   <data name="行X列" xml:space="preserve">
     <value>行X 列: </value>
   </data>
+  <data name="X" xml:space="preserve">
+    <value> X </value>
+  </data>
   <data name="修改名称" xml:space="preserve">
     <value>修改名稱</value>
   </data>
@@ -1896,12 +1896,12 @@
   <data name="频率区间" xml:space="preserve">
     <value>頻率區間</value>
   </data>
-  <data name="CameraBrand_Galaxy" xml:space="preserve">
-    <value>大恆相機(Galaxy)</value>
-  </data>
   <data name="振幅区间" xml:space="preserve">
     <value>振幅區間</value>
   </data>
+  <data name="CameraBrand_Galaxy" xml:space="preserve">
+    <value>大恆相機(Galaxy)</value>
+  </data>
   <data name="正向" xml:space="preserve">
     <value>正向</value>
   </data>

+ 40 - 3
TeamAAS-VM/ViewModels/Product/PlcPointParamsViewModel.cs

@@ -80,6 +80,7 @@ namespace TeamAAS_VP.ViewModels.Product
                     _MovePointDownCommand?.RaiseCanExecuteChanged();
                     // 更新依赖可执行状态的命令
                     _TechPointCommand?.RaiseCanExecuteChanged();
+                    _TechPointFinishCommand?.RaiseCanExecuteChanged();
                     _ExecuteMotion?.RaiseCanExecuteChanged();
                 }
                 // 可以同步到 SelectPoint 属性
@@ -385,6 +386,10 @@ namespace TeamAAS_VP.ViewModels.Product
         public DelegateCommand TechPointCommand =>
             _TechPointCommand ?? (_TechPointCommand = new DelegateCommand(ExecuteTechPointCommand).ObservesCanExecute(() => CanExecutePointCommand).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute).ObservesProperty(() => SelectedPointInDataGrid));
 
+        private DelegateCommand _TechPointFinishCommand;
+        public DelegateCommand TechPointFinishCommand =>
+            _TechPointFinishCommand ?? (_TechPointFinishCommand = new DelegateCommand(ExecuteTechPointFinishCommand).ObservesCanExecute(() => CanExecutePointCommand).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute).ObservesProperty(() => SelectedPointInDataGrid));
+
         private DelegateCommand<string> _MotorCommand;
         public DelegateCommand<string> MotorCommand =>
             _MotorCommand ?? (_MotorCommand = new DelegateCommand<string>(ExecuteMotorCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
@@ -643,6 +648,32 @@ namespace TeamAAS_VP.ViewModels.Product
             }
         }
 
+        /// <summary>
+        /// 示教终点位
+        /// </summary>
+        /// <param name="point"></param>
+        async void ExecuteTechPointFinishCommand()
+        {
+            if (Robot == null || !Robot.IsConnected) return;
+            if (SelectedPoint == null) return;
+
+            try
+            {
+                var curpos = await Robot.GetRobotPosAsync();
+                SelectedPoint.X_Position_Stop = curpos.X;
+                SelectedPoint.Y_Position_Stop = curpos.Y;
+                SelectedPoint.Z_Position_Stop = curpos.Z;
+                SelectedPoint.U_Position_Stop = curpos.U;
+                SelectedPoint.R_Position = curpos.V;
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 });
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("机器人点位-示教点位时出错", ex);
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
+            }
+        }
+
         void ExecuteLoadedCommand()
         {
             if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator)
@@ -1053,7 +1084,7 @@ namespace TeamAAS_VP.ViewModels.Product
         void ExecuteApplyLockPointSpeedCommand()
         {
             //检查速度是否大于0,如果小于等于0,则提示用户速度是否正确,是否继续写入
-            if (LockXSpeed <= 0 || LockYSpeed <= 0 || LockZSpeed <= 0 || LockZSpeed <= 0)
+            if (LockXSpeed <= 0 || LockYSpeed <= 0 || LockZSpeed <= 0 || LockUSpeed <= 0)
             {
                 var result = MessageBox.Show("速度小于等于0,是否继续写入?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question);
                 if (result != MessageBoxResult.Yes)
@@ -1068,7 +1099,11 @@ namespace TeamAAS_VP.ViewModels.Product
                 point.X_Velocity_Start = LockXSpeed;
                 point.Y_Velocity_Start = LockYSpeed;
                 point.Z_Velocity_Start = LockZSpeed;
-                point.U_Velocity_Start = LockZSpeed;
+                point.U_Velocity_Start = LockUSpeed;
+                point.X_Velocity_Stop = LockXSpeed;
+                point.Y_Velocity_Stop = LockYSpeed;
+                point.Z_Velocity_Stop = LockZSpeed;
+                point.U_Velocity_Stop = LockUSpeed;
             }
         }
 
@@ -1511,6 +1546,7 @@ namespace TeamAAS_VP.ViewModels.Product
                 // 默认选择 AOI 点位(索引 6),并初始化 Points
                 SelectedIndex = 6;
                 PickPoints = SelectProduct.PickPoints;
+                Points = null;
                 Points = SelectProduct.AoiPoints;
                 // 默认选中第一个点(如果存在)
                 SelectedPointInDataGrid = Points?.FirstOrDefault();
@@ -1545,7 +1581,8 @@ namespace TeamAAS_VP.ViewModels.Product
                 LockXSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.X_Velocity_Start ?? 100;
                 LockYSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.Y_Velocity_Start ?? 100;
                 LockZSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.Z_Velocity_Start ?? 100;
-                LockZDescendSpeed= SelectProduct.ScrewPoints.FirstOrDefault()?.Z_Velocity_Stop ?? 100;
+                LockUSpeed = SelectProduct.ScrewPoints.FirstOrDefault()?.U_Velocity_Start ?? 100;
+                LockZDescendSpeed = SelectProduct.ScrewPoints.FirstOrDefault()?.Z_Velocity_Stop ?? 100;
                 LockFeederNumber= SelectProduct.ScrewPoints.FirstOrDefault()?.Feeder ?? 1;
                 LockScrewProgramNumber= SelectProduct.ScrewPoints.FirstOrDefault()?.ScrewProNum ?? 1;
 

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

@@ -1856,10 +1856,16 @@
 
                                         <Button Grid.Row="3"
                                                 Grid.Column="0"
-                                                Content="{lex:Loc 示教}"
+                                                Content="{lex:Loc 示教起点}"
                                                 Margin="2"
                                                 HorizontalAlignment="Right"
                                                 Command="{Binding DataContext.TechPointCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
+                                        <Button Grid.Row="3"
+        Grid.Column="1"
+        Content="{lex:Loc 示教终点}"
+        Margin="2"
+        HorizontalAlignment="Right"
+        Command="{Binding DataContext.TechPointFinishCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                                         <!--<ToggleButton Grid.Row="3"
                       Grid.Column="2"
                       HorizontalAlignment="Right"