Преглед на файлове

新增PLC点位参数模块及产品点位管理优化

本次提交实现以下主要更新:

- 新增“PLC点位参数”页面(PlcPointParams.xaml)及其ViewModel,支持点位的增删、切换、编辑、机器人点动、示教等功能,并实现权限控制。
- 扩展ProductModel,增加多组PLC点位集合属性,支持不同工序的点位分组管理。
- 优化PlcPoint模型,新增Label和Description属性,改为继承BindableBase,提升数据绑定与UI响应能力。
- 调整导航与依赖注入注册,相关页面统一跳转至PlcPointParams。
- 优化界面交互,DataGrid支持所有PLC点位参数的可视化编辑,点位切换与编号自动维护。
- 其它:RobotPointParams下拉项由Description改为Label,csproj增加新页面与ViewModel编译配置。

该改动显著提升了产品点位参数的灵活性、可维护性和自动化支持能力。
孝锋 徐 преди 8 месеца
родител
ревизия
20d262a03b

+ 2 - 0
TeamAAS-VM/App.xaml.cs

@@ -87,6 +87,7 @@ namespace TeamAAS_VP
             containerRegistry.RegisterForNavigation<FeederParams>();
             containerRegistry.RegisterForNavigation<ProcedureVisionOutput>();
             containerRegistry.RegisterForNavigation<RobotPointParams>();
+            containerRegistry.RegisterForNavigation<PlcPointParams>();
             containerRegistry.RegisterForNavigation<ProductParams>();
             containerRegistry.RegisterForNavigation<ProcedureParams>();
             containerRegistry.RegisterForNavigation<AfagFeederParams>();
@@ -139,6 +140,7 @@ namespace TeamAAS_VP
             containerRegistry.RegisterSingleton<FeederParamsViewModel>();
             containerRegistry.RegisterSingleton<ProcedureVisionOutputViewModel>();
             containerRegistry.RegisterSingleton<RobotPointParamsViewModel>();
+            containerRegistry.RegisterSingleton<PlcPointParamsViewModel>();
             containerRegistry.RegisterSingleton<ProductParamsViewModel>();
             containerRegistry.RegisterSingleton<ProcedureParamsViewModel>();
             containerRegistry.RegisterSingleton<AfagFeederParamsViewModel>();

+ 132 - 20
TeamAAS-VM/Models/PLC/PlcPoint.cs

@@ -1,4 +1,5 @@
-using System;
+using Prism.Mvvm;
+using System;
 using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
@@ -9,24 +10,134 @@ using TeamAAS_VP.Interfaces;
 
 namespace TeamAAS_VP.Models.PLC
 {
-    public class PlcPoint
+    public class PlcPoint : BindableBase
     {
-        public int Number { get; set; }
-        public float X_Position { get; set; }
-        public float X_Velocity { get; set; }
-        public float Y_Position { get; set; }
-        public float Y_Velocity { get; set; }
-        public float Z_Position_Start { get; set; }
-        public float Z_Velocity_Start { get; set; }
-        public float Z_Position_Stop { get; set; }
-        public float Z_Velocity_Stop { get; set; }
-        public float U_Position { get; set; }
-        public float U_Velocity { get; set; }
-        public float R_Position { get; set; }
-        public float R_Velocity { get; set; }
-        public float Torque { get; set; }
-        public Int16 Feeder { get; set; }
-        public Int16 ScrewProNum { get; set; }
+        private int _Number;
+        public int Number
+        {
+            get { return _Number; }
+            set { SetProperty(ref _Number, value); }
+        }
+
+        private string _Label;
+        public string Label
+        {
+            get { return _Label; }
+            set { SetProperty(ref _Label, value); }
+        }
+
+        private float _X_Position;
+        public float X_Position
+        {
+            get { return _X_Position; }
+            set { SetProperty(ref _X_Position, value); }
+        }
+
+        private float _X_Velocity;
+        public float X_Velocity
+        {
+            get { return _X_Velocity; }
+            set { SetProperty(ref _X_Velocity, value); }
+        }
+
+        private float _Y_Position;
+        public float Y_Position
+        {
+            get { return _Y_Position; }
+            set { SetProperty(ref _Y_Position, value); }
+        }
+
+        private float _Y_Velocity;
+        public float Y_Velocity
+        {
+            get { return _Y_Velocity; }
+            set { SetProperty(ref _Y_Velocity, value); }
+        }
+
+        private float _Z_Position_Start;
+        public float Z_Position_Start
+        {
+            get { return _Z_Position_Start; }
+            set { SetProperty(ref _Z_Position_Start, value); }
+        }
+
+        private float _Z_Velocity_Start;
+        public float Z_Velocity_Start
+        {
+            get { return _Z_Velocity_Start; }
+            set { SetProperty(ref _Z_Velocity_Start, value); }
+        }
+
+        private float _Z_Position_Stop;
+        public float Z_Position_Stop
+        {
+            get { return _Z_Position_Stop; }
+            set { SetProperty(ref _Z_Position_Stop, value); }
+        }
+
+        private float _Z_Velocity_Stop;
+        public float Z_Velocity_Stop
+        {
+            get { return _Z_Velocity_Stop; }
+            set { SetProperty(ref _Z_Velocity_Stop, value); }
+        }
+
+        private float _U_Position;
+        public float U_Position
+        {
+            get { return _U_Position; }
+            set { SetProperty(ref _U_Position, value); }
+        }
+
+        private float _U_Velocity;
+        public float U_Velocity
+        {
+            get { return _U_Velocity; }
+            set { SetProperty(ref _U_Velocity, value); }
+        }
+
+        private float _R_Position;
+        public float R_Position
+        {
+            get { return _R_Position; }
+            set { SetProperty(ref _R_Position, value); }
+        }
+
+        private float _R_Velocity;
+        public float R_Velocity
+        {
+            get { return _R_Velocity; }
+            set { SetProperty(ref _R_Velocity, value); }
+        }
+
+        private float _Torque;
+        public float Torque
+        {
+            get { return _Torque; }
+            set { SetProperty(ref _Torque, value); }
+        }
+
+        private Int16 _Feeder;
+        public Int16 Feeder
+        {
+            get { return _Feeder; }
+            set { SetProperty(ref _Feeder, value); }
+        }
+
+        private Int16 _ScrewProNum;
+        public Int16 ScrewProNum
+        {
+            get { return _ScrewProNum; }
+            set { SetProperty(ref _ScrewProNum, value); }
+        }
+
+        //描述
+        private string _Description;
+        public string Description
+        {
+            get { return _Description; }
+            set { SetProperty(ref _Description, value); }
+        }
 
         public PlcPoint()
         {
@@ -46,7 +157,6 @@ namespace TeamAAS_VP.Models.PLC
             Torque = 0;
             Feeder = 0;
             ScrewProNum = 0;
-
         }
 
         public PlcPoint Clone()
@@ -54,6 +164,7 @@ namespace TeamAAS_VP.Models.PLC
             return new PlcPoint
             {
                 Number = this.Number,
+                Label = this.Label,
                 X_Position = this.X_Position,
                 X_Velocity = this.X_Velocity,
                 Y_Position = this.Y_Position,
@@ -68,7 +179,8 @@ namespace TeamAAS_VP.Models.PLC
                 R_Velocity = this.R_Velocity,
                 Torque = this.Torque,
                 Feeder = this.Feeder,
-                ScrewProNum = this.ScrewProNum
+                ScrewProNum = this.ScrewProNum,
+                Description = this.Description
             };
         }
 

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

@@ -7,6 +7,7 @@ using System.Collections.ObjectModel;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using TeamAAS_VP.Models.PLC;
 using TeamAAS_VP.Models.Product;
 using TeamAAS_VP.Models.Robot;
 
@@ -155,6 +156,66 @@ namespace TeamAAS_VP.Models
             set { SetProperty(ref _GlobalParamListCollection, value); }
         }
 
+        private ObservableCollection<PlcPoint> _PickCameraPoints = new ObservableCollection<PlcPoint>();
+        /// <summary>
+        /// 取料拍照点位集合
+        /// </summary>
+        public ObservableCollection<PlcPoint> PickCameraPoints
+        {
+            get { return _PickCameraPoints; }
+            set { SetProperty(ref _PickCameraPoints, value); }
+        }
+
+        private ObservableCollection<PlcPoint> _PickPoints = new ObservableCollection<PlcPoint>();
+        /// <summary>
+        /// 取料点位参数集合
+        /// </summary>
+        public ObservableCollection<PlcPoint> PickPoints
+        {
+            get { return _PickPoints; }
+            set { SetProperty(ref _PickPoints, value); }
+        }
+
+        private ObservableCollection<PlcPoint> _SecPosCameraPoints = new ObservableCollection<PlcPoint>();
+        /// <summary>
+        /// 下相机二次定位点位参数集合
+        /// </summary>
+        public ObservableCollection<PlcPoint> SecPosCameraPoints
+        {
+            get { return _SecPosCameraPoints; }
+            set { SetProperty(ref _SecPosCameraPoints, value); }
+        }
+
+        private ObservableCollection<PlcPoint> _ScrewCameraPoints = new ObservableCollection<PlcPoint>();
+        /// <summary>
+        /// 锁附拍照点位参数集合
+        /// </summary>
+        public ObservableCollection<PlcPoint> ScrewCameraPoints
+        {
+            get { return _ScrewCameraPoints; }
+            set { SetProperty(ref _ScrewCameraPoints, value); }
+        }
+
+        private ObservableCollection<PlcPoint> _ScrewPoints = new ObservableCollection<PlcPoint>();
+        /// <summary>
+        /// 锁附点位参数集合
+        /// </summary>
+        public ObservableCollection<PlcPoint> ScrewPoints
+        {
+            get { return _ScrewPoints; }
+            set { SetProperty(ref _ScrewPoints, value); }
+        }
+
+        private ObservableCollection<PlcPoint> _CheckCameraPoints = new ObservableCollection<PlcPoint>();
+        /// <summary>
+        /// 复检点位参数集合
+        /// </summary>
+        public ObservableCollection<PlcPoint> CheckCameraPoints
+        {
+            get { return _CheckCameraPoints; }
+            set { SetProperty(ref _CheckCameraPoints, value); }
+        }
+
 
         private bool _IsLoad;
         /// <summary>

+ 8 - 0
TeamAAS-VM/TeamAAS-VP.csproj

@@ -763,6 +763,7 @@
     <Compile Include="ValueConverter\RoiToTextConverter.cs" />
     <Compile Include="ValueConverter\StringFormatConverter.cs" />
     <Compile Include="ViewModels\DebugMod\LightManualViewModel.cs" />
+    <Compile Include="ViewModels\Product\PlcPointParamsViewModel.cs" />
     <Compile Include="ViewModels\Setting\AddLightControllerViewModel.cs" />
     <Compile Include="ViewModels\Setting\AddPlcViewModel.cs" />
     <Compile Include="ViewModels\Product\AfagFeederParamsViewModel.cs" />
@@ -920,6 +921,9 @@
     <Compile Include="Views\Product\PalletManage.xaml.cs">
       <DependentUpon>PalletManage.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\Product\PlcPointParams.xaml.cs">
+      <DependentUpon>PlcPointParams.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\Product\ProcedureParams.xaml.cs">
       <DependentUpon>ProcedureParams.xaml</DependentUpon>
     </Compile>
@@ -1235,6 +1239,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\Product\PlcPointParams.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\Product\ProcedureParams.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 628 - 0
TeamAAS-VM/ViewModels/Product/PlcPointParamsViewModel.cs

@@ -0,0 +1,628 @@
+using Prism.Commands;
+using Prism.Events;
+using Prism.Ioc;
+using Prism.Mvvm;
+using Prism.Regions;
+using Prism.Services.Dialogs;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Windows;
+using TeamAAS_VP.Core;
+using TeamAAS_VP.Core.PLCs;
+using TeamAAS_VP.Enums;
+using TeamAAS_VP.Events;
+using TeamAAS_VP.Interfaces;
+using TeamAAS_VP.Models;
+using TeamAAS_VP.Models.PLC;
+using TeamAAS_VP.Models.Robot;
+using TeamAAS_VP.Resources.Languages;
+
+namespace TeamAAS_VP.ViewModels.Product
+{
+    public class PlcPointParamsViewModel : BindableBase, IConfirmNavigationRequest
+    {
+        IRegionManager _regionManager;
+        IEventAggregator _eventAggregator;
+        IContainerProvider _container;
+        IDialogService _dialogService;
+        IConfigService _configService;
+        IRobotService _robotService;
+        ISystemDatabaseService _systemDatabaseService;
+
+        #region 属性
+
+        private ProductModel _SelectProduct;
+
+        /// <summary>
+        /// 选中的产品
+        /// </summary>
+        public ProductModel SelectProduct
+        {
+            get { return _SelectProduct; }
+            set { SetProperty(ref _SelectProduct, value); }
+        }
+
+        private PlcPoint _SelectedPoint;
+        public PlcPoint SelectedPoint
+        {
+            get { return _SelectedPoint; }
+            set { SetProperty(ref _SelectedPoint, value); }
+        }
+
+        private PlcPoint _selectedPointInDataGrid;
+        public PlcPoint SelectedPointInDataGrid
+        {
+            get { return _selectedPointInDataGrid; }
+            set
+            {
+                if (SetProperty(ref _selectedPointInDataGrid, value))
+                {
+                    SelectedPointInComboBox = value;
+                }
+                // 可以同步到 SelectPoint 属性
+                SelectedPoint = value;
+
+            }
+        }
+
+        private PlcPoint _selectedPointInComboBox;
+        public PlcPoint SelectedPointInComboBox
+        {
+            get { return _selectedPointInComboBox; }
+            set
+            {
+                if (SetProperty(ref _selectedPointInComboBox, value))
+                {
+                    SelectedPointInDataGrid = value;
+                }
+                // 可以同步到 SelectPoint 属性
+                SelectedPoint = value;
+
+            }
+        }
+
+        private ObservableCollection<PlcPoint> _Points = new ObservableCollection<PlcPoint>();
+        /// <summary>
+        /// 点位集合
+        /// </summary>
+        public ObservableCollection<PlcPoint> Points
+        {
+            get { return _Points; }
+            set { SetProperty(ref _Points, value); }
+        }
+
+        private MotionCommand _SelectMotionCommand;
+        /// <summary>
+        /// 选中的运动指令
+        /// </summary>
+        public MotionCommand SelectMotionCommand
+        {
+            get { return _SelectMotionCommand; }
+            set { SetProperty(ref _SelectMotionCommand, value); }
+        }
+
+        public Management management { get; set; }
+
+        private IRobot _Robot;
+
+        public IRobot Robot
+        {
+            get { return _Robot; }
+            set
+            {
+                SetProperty(ref _Robot, value);
+
+            }
+        }
+
+        private int _SelectedIndex;
+        public int SelectedIndex
+        {
+            get { return _SelectedIndex; }
+            set { SetProperty(ref _SelectedIndex, value); }
+        }
+
+        private double _Distance = 1;
+
+        public double Distance
+        {
+            get { return _Distance; }
+            set
+            {
+                SetProperty(ref _Distance, value);
+                try
+                {
+                    if (Robot == null)
+                    {
+                        return;
+                    }
+                    _configService.UpdateRobotStepDistance(Robot.Id, value);
+                }
+                catch (Exception)
+                {
+
+                }
+            }
+        }
+        #endregion
+
+        #region 命令
+        private DelegateCommand _NextCommand;
+        public DelegateCommand NextCommand =>
+            _NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand));
+
+        private DelegateCommand _BackCommand;
+        public DelegateCommand BackCommand =>
+            _BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand));
+
+        private DelegateCommand _LoadedCommand;
+        public DelegateCommand LoadedCommand =>
+            _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
+
+        private DelegateCommand<object> _ExecuteMotion;
+        public DelegateCommand<object> ExecuteMotion =>
+            _ExecuteMotion ?? (_ExecuteMotion = new DelegateCommand<object>(ExecuteExecuteMotion).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+        private DelegateCommand<object> _JogCommand;
+        public DelegateCommand<object> JogCommand =>
+            _JogCommand ?? (_JogCommand = new DelegateCommand<object>(ExecuteJogCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+        private DelegateCommand<RPoint> _TechPointCommand;
+        public DelegateCommand<RPoint> TechPointCommand =>
+            _TechPointCommand ?? (_TechPointCommand = new DelegateCommand<RPoint>(ExecuteTechPointCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+        private DelegateCommand<string> _MotorCommand;
+        public DelegateCommand<string> MotorCommand =>
+            _MotorCommand ?? (_MotorCommand = new DelegateCommand<string>(ExecuteMotorCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+        private DelegateCommand _ResetCommand;
+        public DelegateCommand ResetCommand =>
+            _ResetCommand ?? (_ResetCommand = new DelegateCommand(ExecuteResetCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+        private DelegateCommand _sFreeCommand;
+        public DelegateCommand sFreeCommand =>
+            _sFreeCommand ?? (_sFreeCommand = new DelegateCommand(ExecutesFreeCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+        private DelegateCommand _SLockCommand;
+        public DelegateCommand SLockCommand =>
+            _SLockCommand ?? (_SLockCommand = new DelegateCommand(ExecuteSLockCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+
+        private DelegateCommand _SelectionChangedCommand;
+        public DelegateCommand SelectionChangedCommand =>
+            _SelectionChangedCommand ?? (_SelectionChangedCommand = new DelegateCommand(ExecuteSelectionChangedCommand));
+
+        private DelegateCommand _AddPointCommand;
+        public DelegateCommand AddPointCommand =>
+            _AddPointCommand ?? (_AddPointCommand = new DelegateCommand(ExecuteAddPointCommand));
+
+        private DelegateCommand _DeletePointCommand;
+        public DelegateCommand DeletePointCommand =>
+            _DeletePointCommand ?? (_DeletePointCommand = new DelegateCommand(ExecuteDeletePointCommand));
+
+        
+
+        #endregion
+
+        #region 事件
+
+        #endregion
+
+        public PlcPointParamsViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService,
+            IConfigService configService, IRobotService robotService, ISystemDatabaseService systemDatabaseService)
+        {
+            _regionManager = regionManager;
+            _eventAggregator = ea;
+            _container = container;
+            _dialogService = dialogService;
+            _configService = configService;
+            _systemDatabaseService = systemDatabaseService;
+            //订阅权限登录事件
+            _eventAggregator.GetEvent<UserLoginNotification>().Subscribe(LoginChange);
+            management = _container.Resolve<Management>();
+            _robotService = robotService;
+        }
+
+        #region 方法
+
+        /// <summary>
+        /// 下一步
+        /// </summary>
+        void ExecuteNextCommand()
+        {
+            NavigationParameters param = new NavigationParameters();
+            param.Add("SelectProduct", SelectProduct);
+            _regionManager.RequestNavigate("ProductRegionContext", "ProductParams", param);
+        }
+
+        /// <summary>
+        /// 上一步
+        /// </summary>
+        void ExecuteBackCommand()
+        {
+            NavigationParameters param = new NavigationParameters();
+            param.Add("SelectProduct", SelectProduct);
+            param.Add("SelectedProcedure", null);
+            _regionManager.RequestNavigate("ProductRegionContext", "ProcessBasics", param);
+        }
+
+        /// <summary>
+        /// 点动
+        /// </summary>
+        /// <param name="obj"></param>
+        private async void ExecuteJogCommand(object obj)
+        {
+            if (Robot == null || !Robot.IsConnected) return;
+            try
+            {
+                Robot.Timeout = 6000000;
+                var items = ((string)obj).Split(':');
+                switch (items[0])
+                {
+                    case "X+":
+                        await Robot.JogAsync("X", double.Parse(items[1]));
+                        break;
+                    case "X-":
+                        await Robot.JogAsync("X", -double.Parse(items[1]));
+                        break;
+                    case "Y+":
+                        await Robot.JogAsync("Y", double.Parse(items[1]));
+                        break;
+                    case "Y-":
+                        await Robot.JogAsync("Y", -double.Parse(items[1]));
+                        break;
+                    case "Z+":
+                        await Robot.JogAsync("Z", double.Parse(items[1]));
+                        break;
+                    case "Z-":
+                        await Robot.JogAsync("Z", -double.Parse(items[1]));
+                        break;
+                    case "U+":
+                        await Robot.JogAsync("U", double.Parse(items[1]));
+                        break;
+                    case "U-":
+                        await Robot.JogAsync("U", -double.Parse(items[1]));
+                        break;
+                    case "V+":
+                        await Robot.JogAsync("V", double.Parse(items[1]));
+                        break;
+                    case "V-":
+                        await Robot.JogAsync("V", -double.Parse(items[1]));
+                        break;
+                    case "W+":
+                        await Robot.JogAsync("W", double.Parse(items[1]));
+                        break;
+                    case "W-":
+                        await Robot.JogAsync("W", -double.Parse(items[1]));
+                        break;
+                    default:
+                        break;
+                }
+                Robot.Timeout = 5000;
+
+                _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 });
+            }
+        }
+
+        /// <summary>
+        /// 执行运动
+        /// </summary>
+        /// <param name="obj"></param>
+        async void ExecuteExecuteMotion(object parameter)
+        {
+            var values = (object[])parameter;
+            var point = values[0] as RPoint;
+            MotionCommand motionCmd = (MotionCommand)values[1];
+            if (Robot == null || !Robot.IsConnected) return;
+            try
+            {
+                Robot.Timeout = 6000000;
+                switch (motionCmd)
+                {
+                    case MotionCommand.Go:
+                        await Robot.GoAsync(point);
+                        break;
+                    case MotionCommand.Jump:
+                        await Robot.JumpAsync(point, 0);
+                        break;
+                    case MotionCommand.Move:
+                        await Robot.MoveAsync(point);
+                        break;
+                }
+                Robot.Timeout = 5000;
+                _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 });
+            }
+        }
+
+        /// <summary>
+        /// 示教点位
+        /// </summary>
+        /// <param name="point"></param>
+        async void ExecuteTechPointCommand(RPoint point)
+        {
+            //if (Robot == null || !Robot.IsConnected) return;
+            //try
+            //{
+            //    var curpos = await Robot.GetRobotPosAsync();
+            //    var p0 = SelectedRobot.Points.FirstOrDefault(x => x.Number == point.Number);
+            //    p0.X = curpos.X;
+            //    p0.Y = curpos.Y;
+            //    p0.Z = curpos.Z;
+            //    p0.U = curpos.U;
+            //    p0.V = curpos.V;
+            //    p0.W = curpos.W;
+            //    p0.Hand = curpos.Hand;
+            //    p0.Local = curpos.Local;
+            //    p0.Tool = curpos.Tool;
+            //    _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)
+            {
+                IsAllowEdit = false;
+            }
+            else
+            {
+                IsAllowEdit = true;
+            }
+        }
+
+        /// <summary>
+        /// 电机
+        /// </summary>
+        /// <param name="obj"></param>
+        private async void ExecuteMotorCommand(string obj)
+        {
+            if (Robot == null || !Robot.IsConnected) return;
+            try
+            {
+                await Robot.MotorAsync(Convert.ToBoolean(obj));
+                _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 });
+            }
+        }
+
+        /// <summary>
+        /// 重置
+        /// </summary>
+        private async void ExecuteResetCommand()
+        {
+            if (Robot == null || !Robot.IsConnected) return;
+            try
+            {
+                await Robot.ResetAsync();
+                _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 });
+            }
+        }
+
+        /// <summary>
+        /// 锁定刹车
+        /// </summary>
+        private async void ExecuteSLockCommand()
+        {
+            if (Robot == null || !Robot.IsConnected) return;
+            try
+            {
+                await Robot.SLockAsync();
+                _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 });
+            }
+        }
+
+        /// <summary>
+        /// 释放刹车
+        /// </summary>
+        private async void ExecutesFreeCommand()
+        {
+            if (Robot == null || !Robot.IsConnected) return;
+            try
+            {
+                await Robot.SFreeAsync();
+                _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 });
+            }
+        }
+
+        private bool CanExecute
+        {
+            get
+            {
+                if (Robot != null)
+                {
+                    return Robot.CanExecute;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 点位表切换时
+        /// </summary>
+        void ExecuteSelectionChangedCommand()
+        {
+            switch (SelectedIndex)
+            {
+                case 0:
+                    Points = SelectProduct.PickCameraPoints;
+                    break;
+                case 1:
+                    Points = SelectProduct.PickPoints;
+                    break;
+                case 2:
+                    Points = SelectProduct.SecPosCameraPoints;
+                    break;
+                case 3:
+                    Points = SelectProduct.ScrewCameraPoints;
+                    break;
+                case 4:
+                    Points = SelectProduct.ScrewPoints;
+                    break;
+                case 5:
+                    Points = SelectProduct.CheckCameraPoints;
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        /// <summary>
+        /// 增加点位
+        /// </summary>
+        void ExecuteAddPointCommand()
+        {
+            //添加点位
+            Points.Add(new PlcPoint()
+            {
+                Number = Points.Count + 1,
+            });
+        }
+
+        /// <summary>
+        /// 移除点位
+        /// </summary>
+        void ExecuteDeletePointCommand()
+        {
+            if (SelectedPoint==null)
+            {
+                return;
+            }
+            Points.Remove(SelectedPoint);
+            //重新编号
+            for (int i = 1; i < Points.Count; i++)
+            {
+                Points[i].Number = i + 1;
+            }
+        }
+        #endregion
+
+        #region 继承
+        /// <summary>
+        /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。
+        /// </summary>
+        /// <param name="navigationContext"></param>
+        /// <param name="continuationCallback"></param>
+        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
+        {
+            continuationCallback(true);
+        }
+
+        /// <summary>
+        /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。
+        /// </summary>
+        /// <param name="navigationContext"></param>
+        /// <exception cref="NotImplementedException"></exception>
+        public async void OnNavigatedTo(NavigationContext navigationContext)
+        {
+            try
+            {
+                SelectProduct = navigationContext.Parameters.GetValue<ProductModel>("SelectProduct");
+
+                SelectedIndex = 0;
+                Points = SelectProduct.PickCameraPoints;
+
+                if (Robot==null)
+                {
+                    Robot = _robotService.GetRobotByNumber(1);
+                }
+
+                if (Robot != null && Robot.IsConnected)
+                {
+                    this.Distance = _configService.GetRobotStepDistance(Robot.Id);
+                    Robot.EnterDebugMode = true;
+                }
+                else if (Robot != null)
+                {
+                    Robot.EnterDebugMode = true;
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("机器人点位界面进入时出错!", ex);
+            }
+        }
+
+        /// <summary>
+        /// 是否允许导航到此视图模型。
+        /// </summary>
+        /// <param name="navigationContext"></param>
+        /// <returns></returns>
+        public bool IsNavigationTarget(NavigationContext navigationContext)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。
+        /// </summary>
+        /// <param name="navigationContext"></param>
+        public void OnNavigatedFrom(NavigationContext navigationContext)
+        {
+            //if (Robot != null)
+            //{
+            //    Robot.EnterDebugMode = false;
+            //}
+        }
+        #endregion
+
+        private bool _IsAllowEdit = false;
+
+        public bool IsAllowEdit
+        {
+            get { return _IsAllowEdit; }
+            set { SetProperty(ref _IsAllowEdit, value); }
+        }
+
+        private void LoginChange(Models.User user)
+        {
+            if (user.userPart == Enums.UserPart.Operator)
+            {
+                IsAllowEdit = false;
+            }
+            else
+            {
+                IsAllowEdit = true;
+            }
+        }
+    }
+}

+ 1 - 2
TeamAAS-VM/ViewModels/Product/ProcessBasicsViewModel.cs

@@ -346,8 +346,7 @@ namespace TeamAAS_VP.ViewModels.Product
         {
             NavigationParameters param = new NavigationParameters();
             param.Add("SelectProduct", SelectProduct);
-            param.Add("SelectedProcedure", SelectProcedure);
-            _regionManager.RequestNavigate("ProductRegionContext", "RobotPointParams", param);
+            _regionManager.RequestNavigate("ProductRegionContext", "PlcPointParams", param);
         }
 
         /// <summary>

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

@@ -130,7 +130,7 @@ namespace TeamAAS_VP.ViewModels.Product
         {
             NavigationParameters param = new NavigationParameters();
             param.Add("SelectProduct", SelectProduct);
-            _regionManager.RequestNavigate("ProductRegionContext", "RobotPointParams", param);
+            _regionManager.RequestNavigate("ProductRegionContext", "PlcPointParams", param);
         }
 
         void ExecuteLoadedCommand()

+ 1024 - 0
TeamAAS-VM/Views/Product/PlcPointParams.xaml

@@ -0,0 +1,1024 @@
+<UserControl x:Class="TeamAAS_VP.Views.Product.PlcPointParams"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:prism="http://prismlibrary.com/"
+             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+             xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
+             xmlns:sys="clr-namespace:System;assembly=mscorlib"
+             xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
+             xmlns:enums="clr-namespace:TeamAAS_VP.Enums"
+             xmlns:uControl="clr-namespace:TeamAAS_VP.Controls"
+             xmlns:convert="clr-namespace:TeamAAS_VP.ValueConverter"
+             xmlns:local="clr-namespace:TeamAAS_VP.Views.Product"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             xmlns:vm="clr-namespace:TeamAAS_VP.ViewModels.Product"
+             xmlns:ext="clr-namespace:TeamAAS_VP.Extension"
+             xmlns:lex="http://wpflocalizeextension.codeplex.com"
+             xmlns:localRobot="clr-namespace:TeamAAS_VP.Models.Robot"
+             lex:LocalizeDictionary.DesignCulture="zh-CN"
+             lex:ResxLocalizationProvider.DefaultAssembly="TeamAAS-VP"
+             lex:ResxLocalizationProvider.DefaultDictionary="Lang"
+             prism:ViewModelLocator.AutoWireViewModel="True"
+             mc:Ignorable="d"
+             d:DataContext="{d:DesignInstance Type=vm:PlcPointParamsViewModel}"
+             d:Height="600"
+             d:Width="1024"
+             d:Background="White"
+             FontFamily="{DynamicResource DefaultFont}">
+    <b:Interaction.Triggers>
+        <b:EventTrigger EventName="Loaded">
+            <b:InvokeCommandAction Command="{Binding LoadedCommand}" />
+        </b:EventTrigger>
+    </b:Interaction.Triggers>
+
+    <UserControl.Resources>
+        <ObjectDataProvider x:Key="eRobotHand"
+                            MethodName="GetValues"
+                            ObjectType="{x:Type sys:Enum}">
+            <ObjectDataProvider.MethodParameters>
+                <x:Type TypeName="enums:RobotHand" />
+            </ObjectDataProvider.MethodParameters>
+        </ObjectDataProvider>
+        <ObjectDataProvider x:Key="eMotionCommand"
+                            MethodName="GetValues"
+                            ObjectType="{x:Type sys:Enum}">
+            <ObjectDataProvider.MethodParameters>
+                <x:Type TypeName="enums:MotionCommand" />
+            </ObjectDataProvider.MethodParameters>
+        </ObjectDataProvider>
+        <convert:JogConverter x:Key="JogConverter" />
+        <convert:MultiParameterConverter x:Key="MultiParameterConverter" />
+        <convert:RobotConverter x:Key="RobotConverter" />
+    </UserControl.Resources>
+
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="auto" />
+            <RowDefinition Height="*" />
+            <RowDefinition Height="auto" />
+        </Grid.RowDefinitions>
+        <Button Grid.Row="0"
+                Content="{materialDesign:PackIcon Kind=ArrowLeftCircle}"
+                Width="50"
+                HorizontalAlignment="Left"
+                VerticalAlignment="Top"
+                ToolTip="{lex:Loc 返回}"
+                Style="{StaticResource MaterialDesignIconButton}"
+                Command="{Binding BackCommand}" />
+        <StackPanel Grid.Row="0"
+                    Orientation="Horizontal"
+                    Margin="50,0"
+                    VerticalAlignment="Center">
+            <materialDesign:PackIcon Kind="CubeOutline"
+                                     Width="30"
+                                     Height="30" />
+            <TextBlock Text="{Binding SelectProduct.Name}"
+                       VerticalAlignment="Center" />
+            <TextBlock Text="{lex:Loc 机器人点位,Converter={StaticResource StringFormatConverter},ConverterParameter=' - {0}'}"
+                       VerticalAlignment="Center" />
+        </StackPanel>
+        <Border BorderThickness="1,1,1,1"
+                VerticalAlignment="Bottom"
+                Height="1">
+            <Border.BorderBrush>
+                <VisualBrush>
+                    <VisualBrush.Visual>
+                        <Rectangle StrokeDashArray="4 4"
+                                   Stroke="LightGray"
+                                   StrokeThickness="1"
+                                   Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualWidth}"
+                                   Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualHeight}" />
+                    </VisualBrush.Visual>
+                </VisualBrush>
+            </Border.BorderBrush>
+        </Border>
+
+        <materialDesign:DrawerHost Grid.Row="1"
+                                   OpenMode="Modal"
+                                   x:Name="DrawerHost"
+                                   IsEnabled="{Binding IsAllowEdit}">
+            <!--<materialDesign:DrawerHost.RightDrawerContent>
+            <local:TestProductPage Visibility="{Binding IsHaveRobot,Converter={StaticResource BooleanToVisibilityConverter}}" />
+        </materialDesign:DrawerHost.RightDrawerContent>-->
+            <Grid>
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="auto" />
+                    <ColumnDefinition Width="*" />
+                </Grid.ColumnDefinitions>
+                <Expander Grid.Column="0"
+                          ExpandDirection="Right"
+                          Background="Transparent">
+                    <Expander.Header>
+                        <TextBlock RenderTransformOrigin=".5,.5"
+                                   Text="Navigation Description">
+                            <TextBlock.LayoutTransform>
+                                <RotateTransform Angle="90" />
+                            </TextBlock.LayoutTransform>
+                        </TextBlock>
+                    </Expander.Header>
+                    <ScrollViewer>
+                        <StackPanel Margin="8,24,16,24"
+                                    Orientation="Vertical">
+                            <Image Source="pack://application:,,,/TeamAAS-VP;component/Resources/Images/9机器人点位.png"
+                                   Stretch="Uniform"
+                                   Width="350"
+                                   HorizontalAlignment="Center"
+                                   VerticalAlignment="Top" />
+                            <TextBlock Text="{lex:Loc 机器人点位示教}" />
+                            <TextBlock Foreground="Gray"
+                                       TextWrapping="Wrap"
+                                       Text="{lex:Loc 机器人点位示教描述}" />
+                        </StackPanel>
+                    </ScrollViewer>
+                </Expander>
+
+                <Grid Grid.Column="1">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="*" />
+                        <ColumnDefinition Width="auto" />
+                    </Grid.ColumnDefinitions>
+                    <DockPanel Grid.Column="0">
+                        <ListBox Height="80"
+                                 DockPanel.Dock="Top"
+                                 SelectedIndex="{Binding SelectedIndex}"
+                                 Style="{StaticResource MaterialDesign3.NavigationBarPrimaryListBox}">
+                            <b:Interaction.Triggers>
+                                <b:EventTrigger EventName="SelectionChanged">
+                                    <b:InvokeCommandAction Command="{Binding SelectionChangedCommand}" />
+                                </b:EventTrigger>
+                            </b:Interaction.Triggers>
+                            <ListBoxItem>
+                                <ListBoxItem.Style>
+                                    <Style TargetType="ListBoxItem"
+                                           BasedOn="{StaticResource MaterialDesign3.NavigationBarPrimaryListBoxItem}">
+                                        <Setter Property="materialDesign:NavigationBarAssist.SelectedIcon"
+                                                Value="Circle" />
+                                        <Setter Property="materialDesign:NavigationBarAssist.UnselectedIcon"
+                                                Value="CircleOutline" />
+                                    </Style>
+                                </ListBoxItem.Style>
+                                <TextBlock Text="取料拍照点位" />
+                            </ListBoxItem>
+                            <ListBoxItem>
+                                <ListBoxItem.Style>
+                                    <Style TargetType="ListBoxItem"
+                                           BasedOn="{StaticResource MaterialDesign3.NavigationBarPrimaryListBoxItem}">
+                                        <Setter Property="materialDesign:NavigationBarAssist.SelectedIcon"
+                                                Value="Circle" />
+                                        <Setter Property="materialDesign:NavigationBarAssist.UnselectedIcon"
+                                                Value="CircleOutline" />
+                                    </Style>
+                                </ListBoxItem.Style>
+                                <TextBlock Text="取料点位" />
+                            </ListBoxItem>
+                            <ListBoxItem>
+                                <ListBoxItem.Style>
+                                    <Style TargetType="ListBoxItem"
+                                           BasedOn="{StaticResource MaterialDesign3.NavigationBarPrimaryListBoxItem}">
+                                        <Setter Property="materialDesign:NavigationBarAssist.SelectedIcon"
+                                                Value="Circle" />
+                                        <Setter Property="materialDesign:NavigationBarAssist.UnselectedIcon"
+                                                Value="CircleOutline" />
+                                    </Style>
+                                </ListBoxItem.Style>
+                                <TextBlock Text="下相机二次定位点位" />
+                            </ListBoxItem>
+                            <ListBoxItem>
+                                <ListBoxItem.Style>
+                                    <Style TargetType="ListBoxItem"
+                                           BasedOn="{StaticResource MaterialDesign3.NavigationBarPrimaryListBoxItem}">
+                                        <Setter Property="materialDesign:NavigationBarAssist.SelectedIcon"
+                                                Value="Circle" />
+                                        <Setter Property="materialDesign:NavigationBarAssist.UnselectedIcon"
+                                                Value="CircleOutline" />
+                                    </Style>
+                                </ListBoxItem.Style>
+                                <TextBlock Text="锁附拍照点位" />
+                            </ListBoxItem>
+                            <ListBoxItem>
+                                <ListBoxItem.Style>
+                                    <Style TargetType="ListBoxItem"
+                                           BasedOn="{StaticResource MaterialDesign3.NavigationBarPrimaryListBoxItem}">
+                                        <Setter Property="materialDesign:NavigationBarAssist.SelectedIcon"
+                                                Value="Circle" />
+                                        <Setter Property="materialDesign:NavigationBarAssist.UnselectedIcon"
+                                                Value="CircleOutline" />
+                                    </Style>
+                                </ListBoxItem.Style>
+                                <TextBlock Text="锁附点位" />
+                            </ListBoxItem>
+                            <ListBoxItem>
+                                <ListBoxItem.Style>
+                                    <Style TargetType="ListBoxItem"
+                                           BasedOn="{StaticResource MaterialDesign3.NavigationBarPrimaryListBoxItem}">
+                                        <Setter Property="materialDesign:NavigationBarAssist.SelectedIcon"
+                                                Value="Circle" />
+                                        <Setter Property="materialDesign:NavigationBarAssist.UnselectedIcon"
+                                                Value="CircleOutline" />
+                                    </Style>
+                                </ListBoxItem.Style>
+                                <TextBlock Text="复检点位" />
+                            </ListBoxItem>
+                        </ListBox>
+                        
+                        <StackPanel DockPanel.Dock="Bottom"
+                                    Orientation="Horizontal">
+                            <Button Content="{lex:Loc 添加点}"
+                                    Margin="5,2"
+                                    MinWidth="80"
+                                    Command="{Binding AddPointCommand}" />
+                            <Button Content="{lex:Loc 删除点}"
+                                    Margin="5,2"
+                                    MinWidth="80"
+                                    Command="{Binding DeletePointCommand}" />
+                            
+                        </StackPanel>
+                        <DataGrid x:Name="dgPoints"
+                                  AutoGenerateColumns="False"
+                                  CanUserAddRows="False"
+                                  CanUserDeleteRows="False"
+                                  ColumnWidth="*"
+                                  SelectionUnit="FullRow"
+                                  SelectionMode="Single"
+                                  SelectedItem="{Binding SelectedPointInDataGrid,Mode=TwoWay}"
+                                  ItemsSource="{Binding Points}"
+                                  HeadersVisibility="Column"
+                                  HorizontalScrollBarVisibility="Auto"
+                                  ScrollViewer.CanContentScroll="True"
+                                  ScrollViewer.HorizontalScrollBarVisibility="Auto"
+                                  GridLinesVisibility="All"
+                                  VerticalGridLinesBrush="#D0D0D0">
+                            <DataGrid.Resources>
+                                <Style TargetType="DataGridCell">
+                                    <Style.Resources>
+                                        <SolidColorBrush  x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}"
+                                                          Color="#0078D7" />
+                                    </Style.Resources>
+                                    <Setter Property="MinHeight"
+                                            Value="25" />
+                                    <Setter Property="VerticalContentAlignment"
+                                            Value="Center" />
+                                    <Setter Property="HorizontalContentAlignment"
+                                            Value="Center" />
+                                    <Setter Property="VerticalAlignment"
+                                            Value="Center" />
+                                    <Setter Property="TextBlock.TextAlignment"
+                                            Value="Center" />
+                                    <Setter Property="Padding"
+                                            Value="0" />
+                                    <Style.Triggers>
+                                        <Trigger Property="IsSelected"
+                                                 Value="True">
+                                            <Setter Property="Foreground"
+                                                    Value="White" />
+                                        </Trigger>
+                                    </Style.Triggers>
+                                </Style>
+
+                                <!-- 为 TextBlock 添加默认居中样式 -->
+                                <Style TargetType="TextBlock">
+                                    <Setter Property="TextAlignment"
+                                            Value="Center" />
+                                    <Setter Property="HorizontalAlignment"
+                                            Value="Center" />
+                                    <Setter Property="VerticalAlignment"
+                                            Value="Center" />
+                                </Style>
+                            </DataGrid.Resources>
+                            <DataGrid.Columns>
+                                <DataGridTextColumn Header="{lex:Loc 编号}"
+                                                    IsReadOnly="True"
+                                                    MinWidth="60"
+                                                    Width="Auto"
+                                                    Binding="{Binding Number, Mode=TwoWay, StringFormat={}{0:F0}}">
+                                </DataGridTextColumn>
+                                <DataGridTextColumn Header="{lex:Loc 标签}"
+                                                    MinWidth="100"
+                                                    Width="Auto"
+                                                    Binding="{Binding Label, Mode=TwoWay}" />
+                                <!--X 坐标-->
+                                <DataGridTemplateColumn Header="X位置"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding X_Position, StringFormat={}{0:F3}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding X_Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="-9999.000"
+                                                               Maximum="9999.000"
+                                                               Interval="0.1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--X 速度-->
+                                <DataGridTemplateColumn Header="X速度"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding X_Velocity, StringFormat={}{0:F0}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding X_Velocity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="0"
+                                                               Maximum="9999.000"
+                                                               Interval="1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--Y 坐标-->
+                                <DataGridTemplateColumn Header="Y位置"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding Y_Position, StringFormat={}{0:F3}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding Y_Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="-9999.000"
+                                                               Maximum="9999.000"
+                                                               Interval="0.1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--Y 速度-->
+                                <DataGridTemplateColumn Header="Y速度"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding Y_Velocity, StringFormat={}{0:F0}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding Y_Velocity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="0"
+                                                               Maximum="9999.000"
+                                                               Interval="1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--Z 起点坐标-->
+                                <DataGridTemplateColumn Header="Z起点位置"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding Z_Position_Start, StringFormat={}{0:F3}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding Z_Position_Start, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="-9999.000"
+                                                               Maximum="9999.000"
+                                                               Interval="0.1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--Z 起点速度-->
+                                <DataGridTemplateColumn Header="Z起点速度"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding Z_Velocity_Start, StringFormat={}{0:F0}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding Z_Velocity_Start, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="0"
+                                                               Maximum="9999.000"
+                                                               Interval="1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--Z 终点坐标-->
+                                <DataGridTemplateColumn Header="Z终点位置"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding Z_Position_Stop, StringFormat={}{0:F3}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding Z_Position_Stop, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="-9999.000"
+                                                               Maximum="9999.000"
+                                                               Interval="0.1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--Z 终点速度-->
+                                <DataGridTemplateColumn Header="Z终点速度"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding Z_Velocity_Stop, StringFormat={}{0:F0}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding Z_Velocity_Stop, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="0"
+                                                               Maximum="9999.000"
+                                                               Interval="1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--U 坐标-->
+                                <DataGridTemplateColumn Header="U位置"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding U_Position, StringFormat={}{0:F3}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding U_Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="-9999.000"
+                                                               Maximum="9999.000"
+                                                               Interval="0.1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--U 速度-->
+                                <DataGridTemplateColumn Header="U速度"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding U_Velocity, StringFormat={}{0:F0}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding U_Velocity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="0"
+                                                               Maximum="9999.000"
+                                                               Interval="1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--R 坐标-->
+                                <DataGridTemplateColumn Header="R位置"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding R_Position, StringFormat={}{0:F3}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding R_Position, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="-9999.000"
+                                                               Maximum="9999.000"
+                                                               Interval="0.1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--R 速度-->
+                                <DataGridTemplateColumn Header="R速度"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding R_Velocity, StringFormat={}{0:F0}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding R_Velocity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="0"
+                                                               Maximum="9999.000"
+                                                               Interval="1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--扭矩-->
+                                <DataGridTemplateColumn Header="扭矩"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding Torque, StringFormat={}{0:F3}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding Torque, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="-9999.000"
+                                                               Maximum="9999.000"
+                                                               Interval="0.1"
+                                                               StringFormat="F3"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--供料器-->
+                                <DataGridTemplateColumn Header="供料器"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding Feeder, StringFormat={}{0:F0}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding Feeder, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="0"
+                                                               Maximum="9999.000"
+                                                               Interval="1"
+                                                               StringFormat="F0"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+                                <!--电批程序号-->
+                                <DataGridTemplateColumn Header="电批程序号"
+                                                        MinWidth="60"
+                                                        Width="Auto">
+                                    <DataGridTemplateColumn.CellTemplate>
+                                        <DataTemplate>
+                                            <TextBlock Text="{Binding ScrewProNum, StringFormat={}{0:F0}}"
+                                                       HorizontalAlignment="Center"
+                                                       VerticalAlignment="Center" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellTemplate>
+                                    <DataGridTemplateColumn.CellEditingTemplate>
+                                        <DataTemplate>
+                                            <mah:NumericUpDown Value="{Binding ScrewProNum, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                                                               Minimum="0"
+                                                               Maximum="9999.000"
+                                                               Interval="1"
+                                                               StringFormat="F0"
+                                                               HorizontalAlignment="Stretch"
+                                                               VerticalAlignment="Center"
+                                                               Margin="0"
+                                                               Padding="2" />
+                                        </DataTemplate>
+                                    </DataGridTemplateColumn.CellEditingTemplate>
+                                </DataGridTemplateColumn>
+
+                                <DataGridTextColumn Header="{lex:Loc 描述}"
+                                                    MinWidth="100"
+                                                    Width="200"
+                                                    Binding="{Binding Description, Mode=TwoWay}" />
+                            </DataGrid.Columns>
+                        </DataGrid>
+                    </DockPanel>
+                    <GridSplitter Grid.Column="0"
+                                  Grid.Row="0"
+                                  Grid.RowSpan="2"
+                                  Width="2"
+                                  Background="DeepSkyBlue"
+                                  VerticalAlignment="Stretch"
+                                  HorizontalAlignment="Right" />
+                    <Viewbox Grid.Column="1">
+                        <Grid Grid.Row="1">
+                            <Grid.ColumnDefinitions>
+                                <ColumnDefinition Width="auto" />
+                                <ColumnDefinition Width="auto" />
+                            </Grid.ColumnDefinitions>
+                            <Grid Grid.Column="0"
+                                  VerticalAlignment="Center">
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                </Grid.RowDefinitions>
+                                <Button Content="{lex:Loc 上使能}"
+                                        Grid.Row="0"
+                                        materialDesign:ButtonAssist.CornerRadius="10"
+                                        Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                                        Command="{Binding DataContext.MotorCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="True" />
+                                <Button Content="{lex:Loc 下使能}"
+                                        Grid.Row="1"
+                                        Margin="0,10,0,10"
+                                        materialDesign:ButtonAssist.CornerRadius="10"
+                                        Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                                        Command="{Binding DataContext.MotorCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="False" />
+                                <Button Content="{lex:Loc 复位错误}"
+                                        Grid.Row="2"
+                                        materialDesign:ButtonAssist.CornerRadius="10"
+                                        Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                                        Command="{Binding DataContext.ResetCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
+                                <Button Content="{lex:Loc 释放刹车}"
+                                        Grid.Row="3"
+                                        Margin="0,10,0,10"
+                                        materialDesign:ButtonAssist.CornerRadius="10"
+                                        Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                                        Command="{Binding DataContext.sFreeCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
+                                <Button Content="{lex:Loc 锁定刹车}"
+                                        Grid.Row="4"
+                                        materialDesign:ButtonAssist.CornerRadius="10"
+                                        Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                                        Command="{Binding DataContext.SLockCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
+                            </Grid>
+                            <Grid Grid.Column="1">
+                                <Grid.ColumnDefinitions>
+                                    <ColumnDefinition Width="auto" />
+                                    <ColumnDefinition Width="auto" />
+                                    <ColumnDefinition Width="auto" />
+                                    <ColumnDefinition Width="auto" />
+                                    <ColumnDefinition Width="auto" />
+                                    <ColumnDefinition Width="auto" />
+                                </Grid.ColumnDefinitions>
+                                <Grid.RowDefinitions>
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                    <RowDefinition Height="auto" />
+                                </Grid.RowDefinitions>
+                                <Grid.Resources>
+                                    <Style TargetType="Button"
+                                           BasedOn="{StaticResource MaterialDesignRaisedDarkButton}">
+                                        <Setter Property="Width"
+                                                Value="60" />
+                                        <Setter Property="Height"
+                                                Value="60" />
+                                        <Setter Property="FontSize"
+                                                Value="13" />
+                                        <Setter Property="Padding"
+                                                Value="0" />
+                                        <Setter Property="HorizontalAlignment"
+                                                Value="Center" />
+                                        <Setter Property="VerticalAlignment"
+                                                Value="Center" />
+                                        <Setter Property="Margin"
+                                                Value="2" />
+                                        <Setter Property="materialDesign:ButtonAssist.CornerRadius"
+                                                Value="10" />
+                                    </Style>
+                                </Grid.Resources>
+
+                                <Button x:Name="btn_x"
+                                        Grid.Row="1"
+                                        Grid.Column="0"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=X-}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="ArrowLeftBold"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="-X"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="1"
+                                        Grid.Column="2"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=X+}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="ArrowRightBold"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="+X"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="0"
+                                        Grid.Column="1"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Y+}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="ArrowBottomBold"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="+Y"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="2"
+                                        Grid.Column="1"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Y-}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="ArrowBottomBold"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="-Y"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="0"
+                                        Grid.Column="3"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Z+}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="ArrowTopBold"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="+Z"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="2"
+                                        Grid.Column="3"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Z-}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="ArrowBottomBold"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="-Z"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="3"
+                                        Grid.Column="0"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=U+}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="AxisZRotateCounterclockwise"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="+U"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="4"
+                                        Grid.Column="0"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=U-}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="AxisZRotateClockwise"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="-U"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="3"
+                                        Grid.Column="1"
+                                        Grid.ColumnSpan="2"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=R+}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="AxisZRotateCounterclockwise"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="+R"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                <Button Grid.Row="4"
+                                        Grid.Column="1"
+                                        Grid.ColumnSpan="2"
+                                        Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                        CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=R-}">
+                                    <StackPanel Orientation="Vertical">
+                                        <materialDesign:PackIcon Kind="AxisZRotateClockwise"
+                                                                 Width="26"
+                                                                 Height="26" />
+                                        <TextBlock Text="-R"
+                                                   HorizontalAlignment="Center" />
+                                    </StackPanel>
+                                </Button>
+                                
+                                <Grid Grid.Row="5"
+                                      Grid.ColumnSpan="7"
+                                      Margin="10">
+                                    <Grid.RowDefinitions>
+                                        <RowDefinition Height="auto" />
+                                        <RowDefinition Height="auto" />
+                                        <RowDefinition Height="auto" />
+                                        <RowDefinition Height="auto" />
+                                    </Grid.RowDefinitions>
+                                    <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="auto" />
+                                        <ColumnDefinition Width="auto" />
+                                        <ColumnDefinition Width="auto" />
+                                    </Grid.ColumnDefinitions>
+                                    <TextBlock Grid.Row="0"
+                                               Grid.Column="0"
+                                               Text="{lex:Loc 步进距离,Converter={StaticResource StringFormatConverter},ConverterParameter='{}{0}: '}"
+                                               Margin="10"
+                                               VerticalAlignment="Center"
+                                               HorizontalAlignment="Right" />
+                                    <uControl:myNumericUpDowm x:Name="txtDistance"
+                                                              Grid.Row="0"
+                                                              Grid.Column="1"
+                                                              MinWidth="100"
+                                                              Value="{Binding DataContext.Distance,RelativeSource={RelativeSource AncestorType={x:Type UserControl}},Mode=TwoWay}"
+                                                              Interval="0.1"
+                                                              Minimum="0"
+                                                              Maximum="100"
+                                                              StringFormat="{}{0:N3} mm"
+                                                              Margin="10"
+                                                              materialDesign:HintAssist.Hint="{lex:Loc 步进距离}" />
+
+                                    <TextBlock Grid.Row="1"
+                                               Grid.Column="0"
+                                               Text="{lex:Loc 点编号,Converter={StaticResource StringFormatConverter},ConverterParameter='{}{0}: '}"
+                                               Margin="10"
+                                               VerticalAlignment="Center" />
+                                    <ComboBox x:Name="cmbSelectPoint"
+                                              Grid.Row="2"
+                                              Grid.Column="0"
+                                              MinWidth="80"
+                                              materialDesign:HintAssist.Hint="{lex:Loc 选择点}"
+                                              Margin="10,5"
+                                              ItemsSource="{Binding Points}"
+                                              SelectedItem="{Binding SelectedPointInComboBox,Mode=TwoWay}">
+                                        <ComboBox.ItemTemplate>
+                                            <DataTemplate>
+                                                <StackPanel HorizontalAlignment="Left"
+                                                            Orientation="Horizontal">
+                                                    <TextBlock Text="{Binding Number,StringFormat={}{0}:}" />
+                                                    <TextBlock Text="{Binding Label}" />
+                                                </StackPanel>
+                                            </DataTemplate>
+                                        </ComboBox.ItemTemplate>
+                                    </ComboBox>
+
+                                    <TextBlock Grid.Row="1"
+                                               Grid.Column="1"
+                                               Text="{lex:Loc 动作指令,Converter={StaticResource StringFormatConverter},ConverterParameter='{}{0}: '}"
+                                               Margin="10"
+                                               VerticalAlignment="Center" />
+                                    <ComboBox x:Name="cmbSelectMotioncmd"
+                                              Grid.Row="2"
+                                              Grid.Column="1"
+                                              MinWidth="80"
+                                              Margin="10,5"
+                                              materialDesign:HintAssist.Hint="{lex:Loc 动作指令}"
+                                              ItemsSource="{ext:EnumBindingSource EnumType=enums:MotionCommand}"
+                                              SelectedItem="{Binding DataContext.SelectMotionCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
+
+                                    <Button Grid.Row="2"
+                                            Grid.Column="2"
+                                            Content="{lex:Loc 执行动作}"
+                                            Margin="10,5"
+                                            Command="{Binding DataContext.ExecuteMotion,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}">
+                                        <Button.CommandParameter>
+                                            <MultiBinding Converter="{StaticResource MultiParameterConverter}">
+                                                <Binding ElementName="cmbSelectPoint"
+                                                         Path="SelectedItem" />
+                                                <Binding ElementName="cmbSelectMotioncmd"
+                                                         Path="SelectedItem" />
+                                            </MultiBinding>
+                                        </Button.CommandParameter>
+                                    </Button>
+
+                                    <Button Grid.Row="3"
+                                            Grid.Column="0"
+                                            Content="{lex:Loc 示教}"
+                                            Margin="10"
+                                            HorizontalAlignment="Right"
+                                            Command="{Binding DataContext.TechPointCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                            CommandParameter="{Binding ElementName=cmbSelectPoint,Path=SelectedItem}" />
+                                    <!--<ToggleButton Grid.Row="3"
+                                                  Grid.Column="2"
+                                                  HorizontalAlignment="Right"
+                                                  VerticalAlignment="Center"
+                                                  Visibility="{Binding IsHaveRobot,Converter={StaticResource BooleanToVisibilityConverter}}"
+                                                  materialDesign:ToggleButtonAssist.OnContent="{materialDesign:PackIcon Kind=ArrowRight}"
+                                                  Content="{materialDesign:PackIcon Kind=ProgressWrench}"
+                                                  Style="{StaticResource MaterialDesignActionToggleButton}"
+                                                  ToolTip="{lex:Loc 手动验证流程}"
+                                                  Margin="5,0"
+                                                  IsChecked="{Binding IsRightDrawerOpen,ElementName=DrawerHost}" />-->
+                                </Grid>
+                            </Grid>
+                        </Grid>
+                    </Viewbox>
+                </Grid>
+            </Grid>
+        </materialDesign:DrawerHost>
+
+        <StackPanel Grid.Row="2"
+                    Orientation="Horizontal"
+                    HorizontalAlignment="Center"
+                    VerticalAlignment="Center"
+                    Margin="20">
+            <Button Content="{lex:Loc 下一步}"
+                    IsEnabled="{Binding IsAllowEdit}"
+                    MinWidth="100"
+                    HorizontalAlignment="Center"
+                    VerticalAlignment="Center"
+                    materialDesign:ButtonAssist.CornerRadius="10"
+                    Style="{StaticResource MaterialDesignRaisedButton}"
+                    Command="{Binding NextCommand}" />
+        </StackPanel>
+    </Grid>
+</UserControl>

+ 15 - 0
TeamAAS-VM/Views/Product/PlcPointParams.xaml.cs

@@ -0,0 +1,15 @@
+using System.Windows.Controls;
+
+namespace TeamAAS_VP.Views.Product
+{
+    /// <summary>
+    /// Interaction logic for PlcPointParams
+    /// </summary>
+    public partial class PlcPointParams : UserControl
+    {
+        public PlcPointParams()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 1 - 1
TeamAAS-VM/Views/Product/RobotPointParams.xaml

@@ -721,7 +721,7 @@
                                                                 <StackPanel HorizontalAlignment="Left"
                                                                             Orientation="Horizontal">
                                                                     <TextBlock Text="{Binding Number,StringFormat={}{0}:}" />
-                                                                    <TextBlock Text="{Binding Description}" />
+                                                                    <TextBlock Text="{Binding Label}" />
                                                                 </StackPanel>
                                                             </DataTemplate>
                                                         </ComboBox.ItemTemplate>