KWD 3 months ago
parent
commit
6878d57f01
29 changed files with 901 additions and 327 deletions
  1. 22 22
      TeamAAS-VM/App.xaml
  2. 7 6
      TeamAAS-VM/Controls/ParameterEdit.xaml
  3. 22 7
      TeamAAS-VM/Controls/ParameterEdit.xaml.cs
  4. 5 1
      TeamAAS-VM/Core/ImageHelper.cs
  5. 110 84
      TeamAAS-VM/Core/Management.cs
  6. 2 2
      TeamAAS-VM/Core/PLCs/OPCuaClientPLC.cs
  7. 8 0
      TeamAAS-VM/Models/PLC/PlcPoint.cs
  8. 0 10
      TeamAAS-VM/Models/SystemConfiguration.cs
  9. 7 6
      TeamAAS-VM/Resources/FontSize/DefaultFontSize.xaml
  10. 180 9
      TeamAAS-VM/Resources/Languages/Lang.Designer.cs
  11. 61 4
      TeamAAS-VM/Resources/Languages/Lang.en.resx
  12. 101 45
      TeamAAS-VM/Resources/Languages/Lang.ja-JP.resx
  13. 60 3
      TeamAAS-VM/Resources/Languages/Lang.resx
  14. 60 3
      TeamAAS-VM/Resources/Languages/Lang.vi.resx
  15. 100 44
      TeamAAS-VM/Resources/Languages/Lang.zh-TW.resx
  16. 7 14
      TeamAAS-VM/Resources/Styles/DefaultColors.xaml
  17. 6 1
      TeamAAS-VM/Services/ProductService.cs
  18. 10 9
      TeamAAS-VM/Services/RemoteCommandService.cs
  19. 27 5
      TeamAAS-VM/ViewModels/HomeViewModel.cs
  20. 5 5
      TeamAAS-VM/ViewModels/MainWindowViewModel.cs
  21. 6 0
      TeamAAS-VM/ViewModels/Product/ProductParamsViewModel.cs
  22. 27 1
      TeamAAS-VM/ViewModels/Product/VisionDynamicAccuracyAnalyzerViewModel.cs
  23. 9 8
      TeamAAS-VM/Views/HomeView.xaml
  24. 3 3
      TeamAAS-VM/Views/MainWindowView.xaml
  25. 25 0
      TeamAAS-VM/Views/Product/PlcPointParams.xaml
  26. 1 1
      TeamAAS-VM/Views/Product/ProductParams.xaml
  27. 0 17
      TeamAAS-VM/Views/Product/ProductParams.xaml.cs
  28. 20 7
      TeamAAS-VM/Views/Product/VisionDynamicAccuracyAnalyzer.xaml
  29. 10 10
      TeamAAS-VM/Views/SettingView.xaml

+ 22 - 22
TeamAAS-VM/App.xaml

@@ -1,35 +1,37 @@
-<prism:PrismApplication x:Class="TeamAAS_VP.App"
-                        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-                        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
-                        xmlns:c="clr-namespace:TeamAAS_VP.ValueConverter"
-                        xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf;assembly=MaterialDesignThemes.Wpf"
-                        xmlns:local="clr-namespace:TeamAAS_VP"
-                        xmlns:prism="http://prismlibrary.com/">
+<prism:PrismApplication
+    x:Class="TeamAAS_VP.App"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:c="clr-namespace:TeamAAS_VP.ValueConverter"
+    xmlns:local="clr-namespace:TeamAAS_VP"
+    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+    xmlns:prism="http://prismlibrary.com/"
+    xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf;assembly=MaterialDesignThemes.Wpf">
     <Application.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
-                
+
                 <!--<ResourceDictionary Source="Resources/Languages1/Chinese.xaml" />-->
                 <ResourceDictionary Source="Resources\Styles\DefaultColors.xaml" />
 
                 <ResourceDictionary Source="Resources/FontSize/DefaultFontSize.xaml" />
 
-                <materialDesign:BundledTheme BaseTheme="Inherit"
-                                             PrimaryColor="DeepPurple"
-                                             SecondaryColor="Purple" />
-                <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
+                <materialDesign:BundledTheme
+                    BaseTheme="Inherit"
+                    PrimaryColor="DeepPurple"
+                    SecondaryColor="Purple" />
+                <!--  MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive!  -->
                 <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                 <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
-                <!-- Theme setting -->
+                <!--  Theme setting  -->
                 <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml" />
-                
-                <!--MaterialDesign-->
+
+                <!--  MaterialDesign  -->
                 <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
                 <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesign3.Defaults.xaml" />
                 <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
                 <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Secondary/MaterialDesignColor.Lime.xaml" />
-                <!--MaterialDesign-->
+                <!--  MaterialDesign  -->
 
                 <ResourceDictionary Source="pack://application:,,,/ICSharpCode.AvalonEdit;component/themes/generic.xaml" />
             </ResourceDictionary.MergedDictionaries>
@@ -38,12 +40,10 @@
             <c:StringFormatConverter x:Key="StringFormatConverter" />
             <c:InvertBooleanConverter x:Key="InvertBooleanConverter" />
             <c:ObjectToVisibilityConverter x:Key="ObjectToVisibilityConverter" />
-            <c:ObjectToVisibilityConverter x:Key="ObjectToCollapsedConverter"
-                                           Invert="True" />
+            <c:ObjectToVisibilityConverter x:Key="ObjectToCollapsedConverter" Invert="True" />
             <c:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
-            <c:BooleanToVisibilityConverter x:Key="BooleanToCollapsedConverter"
-                                            Invert="True" />
+            <c:BooleanToVisibilityConverter x:Key="BooleanToCollapsedConverter" Invert="True" />
         </ResourceDictionary>
-        
+
     </Application.Resources>
 </prism:PrismApplication>

+ 7 - 6
TeamAAS-VM/Controls/ParameterEdit.xaml

@@ -1,4 +1,5 @@
 <UserControl x:Class="TeamAAS_VP.Controls.ParameterEdit"
+             x:Name="root"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -27,9 +28,9 @@
             <StackPanel Orientation="Horizontal">
                 <Button Content="{lex:Loc 增加}"
                         Margin="10"
-                        Command="{Binding AddCommand}" />
+                        Command="{Binding AddCommand, ElementName=root}" />
                 <Button Content="{lex:Loc 移除}"
-                        Command="{Binding RemoveCommand}" 
+                        Command="{Binding RemoveCommand, ElementName=root}"
                         CommandParameter="{Binding ElementName=dg_params,Path=SelectedItem}"/>
                 <TextBlock Text="{lex:Loc 总数,Converter={StaticResource StringFormatConverter},ConverterParameter='{}{0}: '}"
                            VerticalAlignment="Center"
@@ -37,14 +38,14 @@
                 <TextBlock Text="{Binding ElementName=dg_params,Path=Items.Count}" VerticalAlignment="Center" Margin="5,0" />
             </StackPanel>
         </StackPanel>
-        
+
         <DataGrid x:Name="dg_params" Grid.Row="1" AutoGenerateColumns="False"
                   CanUserAddRows="False"
                   ColumnWidth="*"
                   SelectionUnit="FullRow"
                   SelectionMode="Single"
-                  SelectedItem="{Binding SelectParam}"
-                  ItemsSource="{Binding GlobalParamListCollection}"
+                  SelectedItem="{Binding SelectParam, ElementName=root}"
+                  ItemsSource="{Binding GlobalParamListCollection, ElementName=root}"
                   HeadersVisibility="All">
             <DataGrid.Columns>
                 <DataGridTextColumn Header="{lex:Loc 编号}"
@@ -72,6 +73,6 @@
                                     Binding="{Binding Param5, Mode=TwoWay}" />
             </DataGrid.Columns>
         </DataGrid>
-        
+
     </Grid>
 </UserControl>

+ 22 - 7
TeamAAS-VM/Controls/ParameterEdit.xaml.cs

@@ -29,7 +29,6 @@ namespace TeamAAS_VP.Controls
         public ParameterEdit()
         {
             InitializeComponent();
-            DataContext = this;
         }
 
         private ProductGlobalParam _SelectParam;
@@ -37,18 +36,27 @@ namespace TeamAAS_VP.Controls
         public ProductGlobalParam SelectParam
         {
             get { return _SelectParam; }
-            set { SetProperty(ref _SelectParam,value); }
+            set { SetProperty(ref _SelectParam, value); }
         }
 
 
-        private ObservableCollection<ProductGlobalParam> _GlobalParamListCollection;
         /// <summary>
-        /// 产品全局参数集合
+        /// 产品全局参数集合 依赖属性(支持外部 Binding)
+        /// </summary>
+        public static readonly DependencyProperty GlobalParamListCollectionProperty =
+            DependencyProperty.Register(
+                nameof(GlobalParamListCollection),
+                typeof(ObservableCollection<ProductGlobalParam>),
+                typeof(ParameterEdit),
+                new PropertyMetadata(null));
+
+        /// <summary>
+        /// 公开可绑定属性
         /// </summary>
         public ObservableCollection<ProductGlobalParam> GlobalParamListCollection
         {
-            get { return _GlobalParamListCollection; }
-            set { SetProperty(ref _GlobalParamListCollection, value); }
+            get => (ObservableCollection<ProductGlobalParam>)GetValue(GlobalParamListCollectionProperty);
+            set => SetValue(GlobalParamListCollectionProperty, value);
         }
 
         private DelegateCommand _AddCommand;
@@ -61,6 +69,8 @@ namespace TeamAAS_VP.Controls
 
         void ExecuteRemoveCommand(ProductGlobalParam param)
         {
+            if (param == null || GlobalParamListCollection == null) return;
+
             GlobalParamListCollection.Remove(param);
             for (int i = 0; i < GlobalParamListCollection.Count; i++)
             {
@@ -70,7 +80,12 @@ namespace TeamAAS_VP.Controls
 
         void ExecuteAddCommand()
         {
-            GlobalParamListCollection.Add(new ProductGlobalParam() { Number= GlobalParamListCollection .Count});
+            if (GlobalParamListCollection == null)
+            {
+                GlobalParamListCollection = new ObservableCollection<ProductGlobalParam>();
+            }
+
+            GlobalParamListCollection.Add(new ProductGlobalParam() { Number= GlobalParamListCollection.Count});
         }
         #region 属性通知
         /// <summary>

+ 5 - 1
TeamAAS-VM/Core/ImageHelper.cs

@@ -68,11 +68,15 @@ namespace TeamAAS_VP.Core
         public static ICogImage MatConvertICogImage(Mat image, bool color = false)
         {
             var im = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
-            ICogImage cogImage = new CogImage8Grey(im);
+            ICogImage cogImage = null;
             if (color)
             {
                 cogImage = new CogImage24PlanarColor(im);
             }
+            else
+            {
+                cogImage = new CogImage8Grey(im);
+            }
             im.Dispose();
             return cogImage;
         }

+ 110 - 84
TeamAAS-VM/Core/Management.cs

@@ -6,8 +6,6 @@ using NPOI.SS.Formula.Eval;
 using NPOI.SS.Formula.Functions;
 using NPOI.Util;
 using Org.BouncyCastle.Ocsp;
-
-
 //using ICSharpCode.SharpZipLib.Zip;
 using Prism.Events;
 using Prism.Ioc;
@@ -74,14 +72,14 @@ namespace TeamAAS_VP.Core
         /// <summary>
         /// 工单信息
         /// </summary>
-        string wo = "";
-        string model_num = "";//产品model_num
-        string color = "";//产品color
-        string ppid = "";//产品ppid
-        string revision = "";//产品revision
-        string stage = "";//产品revision
-        string kb_sn = "";//产品kb_sn
-        string kb_pn = "";//产品kb_sn
+        string[] wo = new string[10];
+        string[] model_num = new string[10];//产品model_num
+        string[] color = new string[10];//产品color
+        string[] ppid = new string[10];//产品ppid
+        string[] revision = new string[10];//产品revision
+        string[] stage = new string[10];//产品revision
+        string[] kb_sn = new string[10];//产品kb_sn
+
         /// <summary>
         /// 上次执行上传csv的日期
         /// </summary>
@@ -1721,44 +1719,44 @@ namespace TeamAAS_VP.Core
                                         string woItem = items.FirstOrDefault(f => f.Contains("wo="));
                                         if (woItem != null)
                                         {
-                                            wo = woItem.Replace("wo=", "").Trim();
+                                            wo[0] = woItem.Replace("wo=", "").Trim();
                                             SendTaskMessage($"产品wo:{wo}", MessageLevel.Info);
                                         }
                                         string modelItem = items.FirstOrDefault(f => f.Contains("model_num="));
                                         if (modelItem != null)
                                         {
-                                            model_num = modelItem.Replace("model_num=", "").Trim();
+                                            model_num[0] = modelItem.Replace("model_num=", "").Trim();
                                             SendTaskMessage($"model_num:{model_num}", MessageLevel.Info);
                                         }
                                         string colorItem = items.FirstOrDefault(f => f.Contains("color="));
                                         if (colorItem != null)
                                         {
-                                            color = colorItem.Replace("color=", "").Trim();
+                                            color[0] = colorItem.Replace("color=", "").Trim();
                                             SendTaskMessage($"color:{color}", MessageLevel.Info);
                                         }
                                         string ppidItem = items.FirstOrDefault(f => f.Contains("ppid="));
                                         if (ppidItem != null)
                                         {
-                                            ppid = ppidItem.Replace("ppid=", "").Trim();
+                                            ppid[0] = ppidItem.Replace("ppid=", "").Trim();
                                             SendTaskMessage($"ppid:{ppid}", MessageLevel.Info);
                                         }
                                         string stageItem = items.FirstOrDefault(f => f.Contains("stage="));
                                         if (stageItem != null)
                                         {
-                                            stage = stageItem.Replace("stage=", "").Trim();
+                                            stage[0] = stageItem.Replace("stage=", "").Trim();
                                             SendTaskMessage($"stage:{stage}", MessageLevel.Info);
                                         }
                                         string kbsnitem = items.FirstOrDefault(f => f.Contains("KB="));
                                         if (kbsnitem != null)
                                         {
-                                            kb_sn = kbsnitem.Replace("KB=", "").Trim();
+                                            kb_sn[0] = kbsnitem.Replace("KB=", "").Trim();
                                             SendTaskMessage($"KB:{kb_sn}", MessageLevel.Info);
                                         }
 
                                     }
                                     LogHelper.WriteLogMes($"【mes结束QUERY】");
                                     SendTaskMessage($"mes结束QUERY", MessageLevel.Info);
-                                    var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num, color);
+                                    var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num[0], color[0]);
                                     if (!string.IsNullOrEmpty(q))
                                     {
                                         ProductWithMes productWithMes = new ProductWithMes();
@@ -1772,7 +1770,7 @@ namespace TeamAAS_VP.Core
                                                 break;
                                             }
                                         }
-                                        if (currentProduct.ID != productId || productWithMes.ProductKBSN != kb_sn)
+                                        if (currentProduct.ID != productId || productWithMes.ProductKBSN != kb_sn[0])
                                         {
 
                                             _productService.Clear();
@@ -1868,44 +1866,44 @@ namespace TeamAAS_VP.Core
                                             string woItem = item.FirstOrDefault(f => f.Contains("wo="));
                                             if (woItem != null)
                                             {
-                                                wo = woItem.Replace("wo=", "").Trim();
-                                                SendTaskMessage($"产品wo:{wo}", MessageLevel.Info);
+                                                wo[0] = woItem.Replace("wo=", "").Trim();
+                                                SendTaskMessage($"产品wo:{wo[0]}", MessageLevel.Info);
                                             }
                                             string modelItem = item.FirstOrDefault(f => f.Contains("model_num="));
                                             if (modelItem != null)
                                             {
-                                                model_num = modelItem.Replace("model_num=", "").Trim();
-                                                SendTaskMessage($"model_num:{model_num}", MessageLevel.Info);
+                                                model_num[0] = modelItem.Replace("model_num=", "").Trim();
+                                                SendTaskMessage($"model_num:{model_num[0]}", MessageLevel.Info);
                                             }
                                             string colorItem = item.FirstOrDefault(f => f.Contains("color="));
                                             if (colorItem != null)
                                             {
-                                                color = colorItem.Replace("color=", "").Trim();
-                                                SendTaskMessage($"color:{color}", MessageLevel.Info);
+                                                color[0] = colorItem.Replace("color=", "").Trim();
+                                                SendTaskMessage($"color:{color[0]}", MessageLevel.Info);
                                             }
                                             string ppidItem = item.FirstOrDefault(f => f.Contains("ppid="));
                                             if (ppidItem != null)
                                             {
-                                                ppid = ppidItem.Replace("ppid=", "").Trim();
-                                                SendTaskMessage($"ppid:{ppid}", MessageLevel.Info);
+                                                ppid[0] = ppidItem.Replace("ppid=", "").Trim();
+                                                SendTaskMessage($"ppid:{ppid[0]}", MessageLevel.Info);
                                             }
                                             string stageItem = item.FirstOrDefault(f => f.Contains("stage="));
                                             if (stageItem != null)
                                             {
-                                                stage = stageItem.Replace("stage=", "").Trim();
-                                                SendTaskMessage($"stage:{stage}", MessageLevel.Info);
+                                                stage[0] = stageItem.Replace("stage=", "").Trim();
+                                                SendTaskMessage($"stage:{stage[0]}", MessageLevel.Info);
                                             }
                                             string kbsnitem = item.FirstOrDefault(f => f.Contains("KB="));
                                             if (kbsnitem != null)
                                             {
-                                                kb_sn = kbsnitem.Replace("KB=", "").Trim();
-                                                SendTaskMessage($"KB:{kb_sn}", MessageLevel.Info);
+                                                kb_sn[0] = kbsnitem.Replace("KB=", "").Trim();
+                                                SendTaskMessage($"KB:{kb_sn[0]}", MessageLevel.Info);
                                             }
                                         }
                                         LogHelper.WriteLogMes($"第二次询问mes成功");
                                         SendTaskMessage($"第二次询问mes成功:{response2}", MessageLevel.Debug);
 
-                                        var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num, color);
+                                        var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num[0], color[0]);
                                         if (!string.IsNullOrEmpty(q))
                                         {
                                             ProductWithMes productWithMes = new ProductWithMes();
@@ -1919,7 +1917,7 @@ namespace TeamAAS_VP.Core
                                                     break;
                                                 }
                                             }
-                                            if (currentProduct.ID != productId || productWithMes.ProductKBSN != kb_sn)
+                                            if (currentProduct.ID != productId || productWithMes.ProductKBSN != kb_sn[0])
                                             {
                                                 //切换产品
                                                 _productService.LoadProduct(productId);
@@ -1969,7 +1967,6 @@ namespace TeamAAS_VP.Core
                                     await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
                                     return;
                                 }
-
                             }
 
                             if (cameraIndex == currentProduct.PhotoCount)
@@ -2108,44 +2105,44 @@ namespace TeamAAS_VP.Core
                                                 string woItem = item.FirstOrDefault(f => f.Contains("wo="));
                                                 if (woItem != null)
                                                 {
-                                                    wo = woItem.Replace("wo=", "").Trim();
-                                                    SendTaskMessage($"产品wo:{wo}", MessageLevel.Info);
+                                                    wo[0] = woItem.Replace("wo=", "").Trim();
+                                                    SendTaskMessage($"产品wo:{wo[0]}", MessageLevel.Info);
                                                 }
                                                 string modelItem = item.FirstOrDefault(f => f.Contains("model_num="));
                                                 if (modelItem != null)
                                                 {
-                                                    model_num = modelItem.Replace("model_num=", "").Trim();
-                                                    SendTaskMessage($"model_num:{model_num}", MessageLevel.Info);
+                                                    model_num[0] = modelItem.Replace("model_num=", "").Trim();
+                                                    SendTaskMessage($"model_num:{model_num[0]}", MessageLevel.Info);
                                                 }
                                                 string colorItem = item.FirstOrDefault(f => f.Contains("color="));
                                                 if (colorItem != null)
                                                 {
-                                                    color = colorItem.Replace("color=", "").Trim();
-                                                    SendTaskMessage($"color:{color}", MessageLevel.Info);
+                                                    color[0] = colorItem.Replace("color=", "").Trim();
+                                                    SendTaskMessage($"color:{color[0]}", MessageLevel.Info);
                                                 }
                                                 string ppidItem = item.FirstOrDefault(f => f.Contains("ppid="));
                                                 if (ppidItem != null)
                                                 {
-                                                    ppid = ppidItem.Replace("ppid=", "").Trim();
-                                                    SendTaskMessage($"ppid:{ppid}", MessageLevel.Info);
+                                                    ppid[0] = ppidItem.Replace("ppid=", "").Trim();
+                                                    SendTaskMessage($"ppid:{ppid[0]}", MessageLevel.Info);
                                                 }
                                                 string stageItem = item.FirstOrDefault(f => f.Contains("stage="));
                                                 if (stageItem != null)
                                                 {
-                                                    stage = stageItem.Replace("stage=", "").Trim();
-                                                    SendTaskMessage($"stage:{stage}", MessageLevel.Info);
+                                                    stage[0] = stageItem.Replace("stage=", "").Trim();
+                                                    SendTaskMessage($"stage:{stage[0]}", MessageLevel.Info);
                                                 }
                                                 string kbsnitem = item.FirstOrDefault(f => f.Contains("KB="));
                                                 if (kbsnitem != null)
                                                 {
-                                                    kb_sn = kbsnitem.Replace("KB=", "").Trim();
-                                                    SendTaskMessage($"KB:{kb_sn}", MessageLevel.Info);
+                                                    kb_sn[0] = kbsnitem.Replace("KB=", "").Trim();
+                                                    SendTaskMessage($"KB:{kb_sn[0]}", MessageLevel.Info);
                                                 }
                                             }
                                             LogHelper.WriteLogMes($"第二次询问mes成功");
                                             SendTaskMessage($"第二次询问mes成功:{response2}", MessageLevel.Debug);
 
-                                            var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num, color);
+                                            var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num[0], color[0]);
                                             if (!string.IsNullOrEmpty(q))
                                             {
                                                 ProductWithMes productWithMes = new ProductWithMes();
@@ -2159,7 +2156,7 @@ namespace TeamAAS_VP.Core
                                                         break;
                                                     }
                                                 }
-                                                if (currentProduct.ID != productId || productWithMes.ProductKBSN != kb_sn)
+                                                if (currentProduct.ID != productId || productWithMes.ProductKBSN != kb_sn[0])
                                                 {
                                                     //切换产品
                                                     _productService.LoadProduct(productId);
@@ -2276,44 +2273,44 @@ namespace TeamAAS_VP.Core
                                             string woItem = items.FirstOrDefault(f => f.Contains("wo="));
                                             if (woItem != null)
                                             {
-                                                wo = woItem.Replace("wo=", "").Trim();
-                                                SendTaskMessage($"产品wo:{wo}", MessageLevel.Info);
+                                                wo[0] = woItem.Replace("wo=", "").Trim();
+                                                SendTaskMessage($"产品wo:{wo[0]}", MessageLevel.Info);
                                             }
                                             string modelItem = items.FirstOrDefault(f => f.Contains("model_num="));
                                             if (modelItem != null)
                                             {
-                                                model_num = modelItem.Replace("model_num=", "").Trim();
-                                                SendTaskMessage($"model_num:{model_num}", MessageLevel.Info);
+                                                model_num[0] = modelItem.Replace("model_num=", "").Trim();
+                                                SendTaskMessage($"model_num:{model_num[0]}", MessageLevel.Info);
                                             }
                                             string colorItem = items.FirstOrDefault(f => f.Contains("color="));
                                             if (colorItem != null)
                                             {
-                                                color = colorItem.Replace("color=", "").Trim();
-                                                SendTaskMessage($"color:{color}", MessageLevel.Info);
+                                                color[0] = colorItem.Replace("color=", "").Trim();
+                                                SendTaskMessage($"color:{color[0]}", MessageLevel.Info);
                                             }
                                             string ppidItem = items.FirstOrDefault(f => f.Contains("ppid="));
                                             if (ppidItem != null)
                                             {
-                                                ppid = ppidItem.Replace("ppid=", "").Trim();
-                                                SendTaskMessage($"ppid:{ppid}", MessageLevel.Info);
+                                                ppid[0] = ppidItem.Replace("ppid=", "").Trim();
+                                                SendTaskMessage($"ppid:{ppid[0]}", MessageLevel.Info);
                                             }
                                             string stageItem = items.FirstOrDefault(f => f.Contains("stage="));
                                             if (stageItem != null)
                                             {
-                                                stage = stageItem.Replace("stage=", "").Trim();
-                                                SendTaskMessage($"stage:{stage}", MessageLevel.Info);
+                                                stage[0] = stageItem.Replace("stage=", "").Trim();
+                                                SendTaskMessage($"stage:{stage[0]}", MessageLevel.Info);
                                             }
                                             string kbsnitem = items.FirstOrDefault(f => f.Contains("KB="));
                                             if (kbsnitem != null)
                                             {
-                                                kb_sn = kbsnitem.Replace("KB=", "").Trim();
-                                                SendTaskMessage($"KB:{kb_sn}", MessageLevel.Info);
+                                                kb_sn[0] = kbsnitem.Replace("KB=", "").Trim();
+                                                SendTaskMessage($"KB:{kb_sn[0]}", MessageLevel.Info);
                                             }
                                         }
                                         LogHelper.WriteLogMes($"【mes结束QUERY】");
                                         SendTaskMessage($"mes结束QUERY", MessageLevel.Info);
 
-                                        var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num, color);
+                                        var q = await _systemDatabaseService.QueryProductFromMesAsync(model_num[0], color[0]);
                                         if (!string.IsNullOrEmpty(q))
                                         {
                                             ProductWithMes productWithMes = new ProductWithMes();
@@ -2327,7 +2324,7 @@ namespace TeamAAS_VP.Core
                                                     break;
                                                 }
                                             }
-                                            if (currentProduct.ID != productId || productWithMes.ProductKBSN != kb_sn)
+                                            if (currentProduct.ID != productId || productWithMes.ProductKBSN != kb_sn[0])
                                             {
                                                 //切换产品
                                                 _productService.LoadProduct(productId);
@@ -2369,6 +2366,7 @@ namespace TeamAAS_VP.Core
                             #endregion
 
 
+
                             //不能使用全局变量,不然并发的时候会被清除掉,所以局部变量
                             var _ImageTaskList = new List<Task<(bool IsSucceed, ICogImage[] Images, string Message, int cameraIndex, Guid procedureId)>>();
 
@@ -2404,11 +2402,20 @@ namespace TeamAAS_VP.Core
                                         return;
                                     }
                                     await ExecuteProcedureAsync(cameraIndex, prcId, tt.imges, Is3dPhoto, currentProduct);
+                                    if (targetPoint.AiVision == 1)
+                                    {
+                                        var targetPoint2 = currentProduct.AoiPoints?.FirstOrDefault(p => p.Number == targetPoint.AiVision);
+                                        await ExecuteProcedureAsync(targetPoint.AiVision, targetPoint2.CameraProcedureId1, tt.imges, Is3dPhoto, currentProduct);
+                                    }
                                 }
                                 else
                                 {
                                     bool Is3dPhoto = Is3D(prcId);
                                     _ImageTaskList.Add(GrabImageEx(cameraIndex, prcId, Is3dPhoto, currentProduct, sysConfig));
+                                    if (targetPoint.AiVision == 1)
+                                    {
+                                        break;
+                                    }
                                 }
 
                                 if (sysConfig.TurnOnAllLightUse == false)
@@ -2434,6 +2441,11 @@ namespace TeamAAS_VP.Core
                                         if (item.IsSucceed)
                                         {
                                             bool Is3d = Is3D(item.procedureId);
+                                            if (targetPoint.AiVision == 1)
+                                            {
+                                                var targetPoint2 = currentProduct.AoiPoints?.FirstOrDefault(p => p.Number == cameraIndex);
+                                                await ExecuteProcedureAsync(targetPoint.AiVision, targetPoint2.CameraProcedureId2, item.Images, Is3d, currentProduct);
+                                            }
                                             await ExecuteProcedureAsync(item.cameraIndex, item.procedureId, item.Images, Is3d, currentProduct);
                                         }
                                         else
@@ -2483,12 +2495,14 @@ namespace TeamAAS_VP.Core
                                 {
                                     SendTaskMessage($"检测执行成功", MessageLevel.Debug);
                                     await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)1);
+                                    return;
                                 }
                                 //存在NG
                                 else
                                 {
                                     SendTaskMessage($"检测执行失败", MessageLevel.Alarm);
                                     await plc.WriteNodeAsync(addressConfig.Out_FixedCameraPickStatus.Address, (Int16)2);
+                                    return;
                                 }
                             }
                             return;
@@ -2693,6 +2707,11 @@ namespace TeamAAS_VP.Core
                                 {
                                     return;
                                 }
+                                if (i == 1)
+                                {
+                                    SendTaskMessage($"收到人工站请求不处理", MessageLevel.Debug);
+                                    return;
+                                }
                                 var sysConfig = _configService.GetSystemConfiguration();
                                 if (sysConfig.CodeUse == true && state == 1)
                                 {
@@ -2708,10 +2727,6 @@ namespace TeamAAS_VP.Core
                                 {
                                     code = plc.ReadNode<string>(string.Format(addressConfig.In_Code.Address, i));
                                 }
-                                if (sysConfig.IsManual && i == 1)
-                                {
-                                    return;
-                                }
 
                                 //var homeview = _container.Resolve<HomeViewModel>();
                                 if (i == 0)
@@ -2727,8 +2742,17 @@ namespace TeamAAS_VP.Core
                                 {
                                     //这里缺少从MES获取产品配方的内容,需要补充
                                     _LastMesCheckTime[i] = (await _mesService.GetServerTimeAsync(code, 2)).Now;
-                                    ProductMainSN = "";
-                                    var stationConfig2 = _configService.GetDeviceInfo(0);
+                                    DeviceInfo stationConfig2 = new DeviceInfo();
+                                    try
+                                    {
+                                        stationConfig2 = _configService.GetDeviceInfo(i);
+                                    }
+                                    catch (Exception)
+                                    {
+                                        await plc.WriteNodeAsync(string.Format(addressConfig.Out_MesStatus.Address, i), (Int16)2);
+                                        SendTaskMessage($"设置无当前站点:{i}", MessageLevel.Error);
+                                        return;
+                                    }
 
                                     //if (homeview.IsNoCode == false)
                                     //{
@@ -2766,9 +2790,9 @@ namespace TeamAAS_VP.Core
                                             string snItem = item.FirstOrDefault(f => f.Contains("sn="));
                                             if (snItem != null)
                                             {
-                                                ProductMainSN = snItem.Replace("sn=", "").Trim();
                                                 if (i == 0)
                                                 {
+                                                     ProductMainSN = snItem.Replace("sn=", "").Trim();
                                                     _productService.CurrentProductCode = ProductMainSN;
                                                 }
                                                 SendTaskMessage($"产品主sn:{ProductMainSN}", MessageLevel.Info);
@@ -2776,38 +2800,38 @@ namespace TeamAAS_VP.Core
                                             string woItem = item.FirstOrDefault(f => f.Contains("wo="));
                                             if (woItem != null)
                                             {
-                                                wo = woItem.Replace("wo=", "").Trim();
-                                                SendTaskMessage($"工单信息:{wo}", MessageLevel.Info);
+                                                wo[i] = woItem.Replace("wo=", "").Trim();
+                                                SendTaskMessage($"工单信息:{wo[i]}", MessageLevel.Info);
                                             }
                                             string modelItem = item.FirstOrDefault(f => f.Contains("model_num="));
                                             if (modelItem != null)
                                             {
-                                                model_num = modelItem.Replace("model_num=", "").Trim();
-                                                SendTaskMessage($"model_num:{model_num}", MessageLevel.Info);
+                                                model_num[i] = modelItem.Replace("model_num=", "").Trim();
+                                                SendTaskMessage($"model_num:{model_num[i]}", MessageLevel.Info);
                                             }
                                             string colorItem = item.FirstOrDefault(f => f.Contains("color="));
                                             if (colorItem != null)
                                             {
-                                                color = colorItem.Replace("color=", "").Trim();
-                                                SendTaskMessage($"color:{color}", MessageLevel.Info);
+                                                color[i] = colorItem.Replace("color=", "").Trim();
+                                                SendTaskMessage($"color:{color[i]}", MessageLevel.Info);
                                             }
                                             string ppidItem = item.FirstOrDefault(f => f.Contains("ppid="));
                                             if (ppidItem != null)
                                             {
-                                                ppid = ppidItem.Replace("ppid=", "").Trim();
-                                                SendTaskMessage($"ppid:{ppid}", MessageLevel.Info);
+                                                ppid[i] = ppidItem.Replace("ppid=", "").Trim();
+                                                SendTaskMessage($"ppid:{ppid[i]}", MessageLevel.Info);
                                             }
                                             string stageItem = item.FirstOrDefault(f => f.Contains("stage="));
                                             if (stageItem != null)
                                             {
-                                                stage = stageItem.Replace("stage=", "").Trim();
-                                                SendTaskMessage($"stage:{stage}", MessageLevel.Info);
+                                                stage[i] = stageItem.Replace("stage=", "").Trim();
+                                                SendTaskMessage($"stage:{stage[i]}", MessageLevel.Info);
                                             }
                                             string kbsnitem = item.FirstOrDefault(f => f.Contains("KB="));
                                             if (kbsnitem != null)
                                             {
-                                                kb_sn = kbsnitem.Replace("KB=", "").Trim();
-                                                SendTaskMessage($"KB:{kb_sn}", MessageLevel.Info);
+                                                kb_sn[i] = kbsnitem.Replace("KB=", "").Trim();
+                                                SendTaskMessage($"KB:{kb_sn[i]}", MessageLevel.Info);
                                             }
 
                                             string kbpnsnitem = item.FirstOrDefault(f => f.Contains("KB_PN="));
@@ -3051,7 +3075,7 @@ namespace TeamAAS_VP.Core
                                     {
                                         string saveppid = "NA";
                                         string names = currentProduct.Name;
-                                        if (stationConfig.SaveCsvPPID) saveppid = ppid;
+                                        if (stationConfig.SaveCsvPPID) saveppid = ppid[i];
 
                                         // Dictionary<string, double> adjacentDiffDict1 = GetAdjacentDiffDict(keyData1);
                                         //判断锁付路径字符串是否为空,如果不为空则保存,否则不保存
@@ -3127,7 +3151,7 @@ namespace TeamAAS_VP.Core
                                                     SUPPLIER_NAME = stationConfig.DataInfo.SUPPLIER_NAME,
                                                     COMMODITY_TYPE = temp_COMMODITY_TYPE,
                                                     REVISION = stationConfig.DataInfo.REVISION + "_" + stage,//
-                                                    WO = wo,//
+                                                    WO = wo[i],//
                                                     MFG_LOT = stationConfig.DataInfo.MFG_LOT,//
                                                     MFG_ASSY_LINE = stationConfig.DataInfo.MFG_ASSY_LINE,
                                                     PROCESS_OUTCOME = item.PhotoPassed == "OK" ? "PASS" : "FAIL",
@@ -3161,7 +3185,7 @@ namespace TeamAAS_VP.Core
                                                         SUPPLIER_NAME = stationConfig.DataInfo.SUPPLIER_NAME,
                                                         COMMODITY_TYPE = stationConfig.DataInfo.COMMODITY_TYPE,
                                                         REVISION = stationConfig.DataInfo.REVISION + "_" + stage,//
-                                                        WO = wo,//
+                                                        WO = wo[i],//
                                                         MFG_LOT = stationConfig.DataInfo.MFG_LOT,//
                                                         MFG_ASSY_LINE = stationConfig.DataInfo.MFG_ASSY_LINE,
                                                         PROCESS_OUTCOME = ok ? "Pass" : "FAIL",
@@ -3192,7 +3216,7 @@ namespace TeamAAS_VP.Core
                                                         SUPPLIER_NAME = stationConfig.DataInfo.SUPPLIER_NAME,
                                                         COMMODITY_TYPE = stationConfig.DataInfo.COMMODITY_TYPE,
                                                         REVISION = stationConfig.DataInfo.REVISION + "_" + stage,//
-                                                        WO = wo,//
+                                                        WO = wo[i],//
                                                         MFG_LOT = stationConfig.DataInfo.MFG_LOT,//
                                                         MFG_ASSY_LINE = stationConfig.DataInfo.MFG_ASSY_LINE,
                                                         PROCESS_OUTCOME = ok ? "Pass" : "FAIL",
@@ -5201,8 +5225,10 @@ namespace TeamAAS_VP.Core
                 TotalQuantity = await _systemDatabaseService.GetOverallProductionAsync(currentproduct.Name);
                 //TotalQuantityToday = await _systemDatabaseService.GetTodayProductionAsync(currentproduct.Name);
                 //CurrentUPH = await _systemDatabaseService.GetLastHourProductionAsync(currentproduct.Name);
+                ////
                 //NgNumber = await _systemDatabaseService.GetNGProductionAsync(currentproduct.Name);
                 //Yield = ((double)TotalQuantityToday - (double)NgNumber) / (double)TotalQuantityToday * 100;
+
                 TotalQuantityToday = 0;
                 CurrentUPH = 0;
                 NgNumber = 0;

+ 2 - 2
TeamAAS-VM/Core/PLCs/OPCuaClientPLC.cs

@@ -45,7 +45,7 @@ namespace TeamAAS_VP.Core.PLCs
         /// 仅在 <see cref="Mode"/> 为 <see cref="OpcUaSubscriptionMode.CustomPolling"/> 时生效。
         /// 默认值为 50。
         /// </summary>
-        public int PollingInterval { get; set; } = 50;
+        public int PollingInterval { get; set; } = 25;
 
         /// <summary>
         /// 获取或设置首次扫描时是否立即通知当前值。
@@ -90,7 +90,7 @@ namespace TeamAAS_VP.Core.PLCs
         /// 仅当默认订阅模式或实际订阅选项使用自定义轮询时生效。
         /// 默认值为 `100`。
         /// </summary>
-        public int DefaultSubscriptionPollingInterval { get; set; } = 50;
+        public int DefaultSubscriptionPollingInterval { get; set; } = 25;
 
         /// <summary>
         /// 获取或设置在默认轮询订阅模式下,首次扫描节点时是否立即触发一次数据变更通知。

+ 8 - 0
TeamAAS-VM/Models/PLC/PlcPoint.cs

@@ -422,6 +422,12 @@ namespace TeamAAS_VP.Models.PLC
             set { SetProperty(ref _Description, value); }
         }
 
+        private Int16 _AiVision;
+        public Int16 AiVision
+        {
+            get { return _AiVision; }
+            set { SetProperty(ref _AiVision, value); }
+        }
         public PlcPoint()
         {
             Number = 0;
@@ -457,6 +463,7 @@ namespace TeamAAS_VP.Models.PLC
             Enable_Light2 = 0;
             Enable_Light3 = 0;
             Enable_Light4 = 0;
+            AiVision = 0;
 
 
 
@@ -483,6 +490,7 @@ namespace TeamAAS_VP.Models.PLC
                 Y_Velocity_Stop = this.Y_Velocity_Stop,
                 Z_Position_Start = this.Z_Position_Start,
                 Z_Velocity_Start = this.Z_Velocity_Start,
+                AiVision = this.AiVision,
                 Z_Position_Stop = this.Z_Position_Stop,
                 Z_Velocity_Stop = this.Z_Velocity_Stop,
                 U_Position_Start = this.U_Position_Start,

+ 0 - 10
TeamAAS-VM/Models/SystemConfiguration.cs

@@ -532,16 +532,6 @@ namespace TeamAAS_VP.Models
             set => SetProperty(ref _iouThreshold, value);
         }
 
-        private bool _IsManual;
-        /// <summary>
-        /// 是否有人工站
-        /// </summary>
-        public bool IsManual
-        {
-            get => _IsManual;
-            set => SetProperty(ref _IsManual, value);
-        }
-
         private double _PermissionIdleTimeout = 0;
         /// <summary>
         ///  工程师和管理员权限的无操作超时时长

+ 7 - 6
TeamAAS-VM/Resources/FontSize/DefaultFontSize.xaml

@@ -1,17 +1,18 @@
-<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-                    xmlns:sys="clr-namespace:System;assembly=mscorlib">
-    <!--标题-->
+<ResourceDictionary
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:sys="clr-namespace:System;assembly=mscorlib">
+    <!--  标题  -->
     <sys:Double x:Key="Font.Size.Title1">34</sys:Double>
     <sys:Double x:Key="Font.Size.Title2">20</sys:Double>
     <sys:Double x:Key="Font.Size.Title3">18</sys:Double>
     <sys:Double x:Key="Font.Size.Title4">16</sys:Double>
-    <!--正文-->
+    <!--  正文  -->
     <sys:Double x:Key="Font.Size.Body1">18</sys:Double>
     <sys:Double x:Key="Font.Size.Body2">16</sys:Double>
     <sys:Double x:Key="Font.Size.Body3">14</sys:Double>
     <sys:Double x:Key="Font.Size.Body4">12</sys:Double>
-    <!--标注-->
+    <!--  标注  -->
     <sys:Double x:Key="Font.Size.Captions1">16</sys:Double>
     <sys:Double x:Key="Font.Size.Captions2">14</sys:Double>
     <sys:Double x:Key="Font.Size.Captions3">12</sys:Double>

+ 180 - 9
TeamAAS-VM/Resources/Languages/Lang.Designer.cs

@@ -906,15 +906,6 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
-        /// <summary>
-        ///   查找类似  X  的本地化字符串。
-        /// </summary>
-        public static string X {
-            get {
-                return ResourceManager.GetString("X", resourceCulture);
-            }
-        }
-        
         /// <summary>
         ///   查找类似 X坐标: 的本地化字符串。
         /// </summary>
@@ -1302,6 +1293,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 保存的CSV文件路径 的本地化字符串。
+        /// </summary>
+        public static string 保存的CSV文件路径 {
+            get {
+                return ResourceManager.GetString("保存的CSV文件路径", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 保存脚本 的本地化字符串。
         /// </summary>
@@ -1860,6 +1860,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 启用 MES 的本地化字符串。
+        /// </summary>
+        public static string 启用_MES {
+            get {
+                return ResourceManager.GetString("启用 MES", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 启用二次定位相机 的本地化字符串。
         /// </summary>
@@ -3012,6 +3021,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 拍照结果 的本地化字符串。
+        /// </summary>
+        public static string 拍照结果 {
+            get {
+                return ResourceManager.GetString("拍照结果", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 持续时长 的本地化字符串。
         /// </summary>
@@ -3300,6 +3318,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 时间 的本地化字符串。
+        /// </summary>
+        public static string 时间 {
+            get {
+                return ResourceManager.GetString("时间", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 是否保存 的本地化字符串。
         /// </summary>
@@ -3309,6 +3336,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 是否保存CSV文件 的本地化字符串。
+        /// </summary>
+        public static string 是否保存CSV文件 {
+            get {
+                return ResourceManager.GetString("是否保存CSV文件", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 是否保存Feeder? 的本地化字符串。
         /// </summary>
@@ -3327,6 +3363,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 是否保存ppid 的本地化字符串。
+        /// </summary>
+        public static string 是否保存ppid {
+            get {
+                return ResourceManager.GetString("是否保存ppid", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 是否保存产品[{0}]? 的本地化字符串。
         /// </summary>
@@ -3399,6 +3444,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 是否保存键盘格JMP数据 的本地化字符串。
+        /// </summary>
+        public static string 是否保存键盘格JMP数据 {
+            get {
+                return ResourceManager.GetString("是否保存键盘格JMP数据", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 是否关闭软件? 的本地化字符串。
         /// </summary>
@@ -3444,6 +3498,24 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 是否启用两次产品编号 的本地化字符串。
+        /// </summary>
+        public static string 是否启用两次产品编号 {
+            get {
+                return ResourceManager.GetString("是否启用两次产品编号", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   查找类似 是否启用键盘相邻键保存差值 的本地化字符串。
+        /// </summary>
+        public static string 是否启用键盘相邻键保存差值 {
+            get {
+                return ResourceManager.GetString("是否启用键盘相邻键保存差值", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 是否开始测试? 的本地化字符串。
         /// </summary>
@@ -4002,6 +4074,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 检测结果为1 的本地化字符串。
+        /// </summary>
+        public static string 检测结果为1 {
+            get {
+                return ResourceManager.GetString("检测结果为1", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 检测重复点位并剔除重复点位 的本地化字符串。
         /// </summary>
@@ -4218,6 +4299,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 流线 的本地化字符串。
+        /// </summary>
+        public static string 流线 {
+            get {
+                return ResourceManager.GetString("流线", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 测试 的本地化字符串。
         /// </summary>
@@ -4236,6 +4326,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 测量数据 的本地化字符串。
+        /// </summary>
+        public static string 测量数据 {
+            get {
+                return ResourceManager.GetString("测量数据", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 添加 的本地化字符串。
         /// </summary>
@@ -4371,6 +4470,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 生产 的本地化字符串。
+        /// </summary>
+        public static string 生产 {
+            get {
+                return ResourceManager.GetString("生产", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 生产排班 的本地化字符串。
         /// </summary>
@@ -5055,6 +5163,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 良率 的本地化字符串。
+        /// </summary>
+        public static string 良率 {
+            get {
+                return ResourceManager.GetString("良率", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 节点头 的本地化字符串。
         /// </summary>
@@ -5073,6 +5190,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 虚拟SN 的本地化字符串。
+        /// </summary>
+        public static string 虚拟SN {
+            get {
+                return ResourceManager.GetString("虚拟SN", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 行 的本地化字符串。
         /// </summary>
@@ -5352,6 +5478,42 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 设备列表 的本地化字符串。
+        /// </summary>
+        public static string 设备列表 {
+            get {
+                return ResourceManager.GetString("设备列表", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   查找类似 设备名称 的本地化字符串。
+        /// </summary>
+        public static string 设备名称 {
+            get {
+                return ResourceManager.GetString("设备名称", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   查找类似 设备描述 的本地化字符串。
+        /// </summary>
+        public static string 设备描述 {
+            get {
+                return ResourceManager.GetString("设备描述", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   查找类似 设备编号 的本地化字符串。
+        /// </summary>
+        public static string 设备编号 {
+            get {
+                return ResourceManager.GetString("设备编号", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 设定参数 的本地化字符串。
         /// </summary>
@@ -5370,6 +5532,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 详情 的本地化字符串。
+        /// </summary>
+        public static string 详情 {
+            get {
+                return ResourceManager.GetString("详情", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 请填写产品名称并选择对应模板! 的本地化字符串。
         /// </summary>

+ 61 - 4
TeamAAS-VM/Resources/Languages/Lang.en.resx

@@ -469,7 +469,7 @@
     <value>Current Products</value>
   </data>
   <data name="产品编号" xml:space="preserve">
-    <value>Product No</value>
+    <value>Product No.</value>
   </data>
   <data name="当前产品总产量" xml:space="preserve">
     <value>Current Total Product Output</value>
@@ -1152,9 +1152,6 @@
   <data name="行X列" xml:space="preserve">
     <value>Row X Column: </value>
   </data>
-  <data name="X" xml:space="preserve">
-    <value> X </value>
-  </data>
   <data name="修改名称" xml:space="preserve">
     <value>Edit name</value>
   </data>
@@ -2139,4 +2136,64 @@
   <data name="设备信息" xml:space="preserve">
     <value>Device Info</value>
   </data>
+  <data name="时间" xml:space="preserve">
+    <value>Time</value>
+  </data>
+  <data name="测量数据" xml:space="preserve">
+    <value>Measurement Data</value>
+  </data>
+  <data name="拍照结果" xml:space="preserve">
+    <value>Photo Result</value>
+  </data>
+  <data name="详情" xml:space="preserve">
+    <value>Details</value>
+  </data>
+  <data name="良率" xml:space="preserve">
+    <value>Yield Rate</value>
+  </data>
+  <data name="虚拟SN" xml:space="preserve">
+    <value>Virtual SN</value>
+  </data>
+  <data name="检测结果为1" xml:space="preserve">
+    <value>Detection Result is 1</value>
+  </data>
+  <data name="设备列表" xml:space="preserve">
+    <value>Device List</value>
+  </data>
+  <data name="设备编号" xml:space="preserve">
+    <value>Device No.</value>
+  </data>
+  <data name="设备名称" xml:space="preserve">
+    <value>Device Name</value>
+  </data>
+  <data name="设备描述" xml:space="preserve">
+    <value>Device Description</value>
+  </data>
+  <data name="启用 MES" xml:space="preserve">
+    <value>Enable MES</value>
+  </data>
+  <data name="是否启用两次产品编号" xml:space="preserve">
+    <value>Enable Twice Product No. Input</value>
+  </data>
+  <data name="是否保存键盘格JMP数据" xml:space="preserve">
+    <value>Save Keyboard Grid JMP Data</value>
+  </data>
+  <data name="是否保存CSV文件" xml:space="preserve">
+    <value>Save CSV File</value>
+  </data>
+  <data name="是否保存ppid" xml:space="preserve">
+    <value>Save PPID</value>
+  </data>
+  <data name="是否启用键盘相邻键保存差值" xml:space="preserve">
+    <value>Enable Saving Difference Value of Adjacent Keyboard Keys</value>
+  </data>
+  <data name="保存的CSV文件路径" xml:space="preserve">
+    <value>Saved CSV File Path</value>
+  </data>
+  <data name="生产" xml:space="preserve">
+    <value>production</value>
+  </data>
+  <data name="流线" xml:space="preserve">
+    <value>streamline</value>
+  </data>
 </root>

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

@@ -469,7 +469,7 @@
     <value>現在の製品</value>
   </data>
   <data name="产品编号" xml:space="preserve">
-    <value>品番号</value>
+    <value>品番号</value>
   </data>
   <data name="当前产品总产量" xml:space="preserve">
     <value>現在の総製品出力</value>
@@ -1152,9 +1152,6 @@
   <data name="行X列" xml:space="preserve">
     <value>X列目: </value>
   </data>
-  <data name="X" xml:space="preserve">
-    <value> X </value>
-  </data>
   <data name="修改名称" xml:space="preserve">
     <value>名前を変更してください</value>
   </data>
@@ -2022,13 +2019,45 @@
   <data name="请选择要启用的光源通道" xml:space="preserve">
     <value>有効にするライトチャンネルを選択してください</value>
   </data>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="是否控制光源通道亮灭" xml:space="preserve">
+    <value>光源チャンネルのオン/オフを制御するかどうか</value>
+  </data>
+  <data name="CameraBrand_opt" xml:space="preserve">
+    <value>Opt Camera Viewer </value>
+  </data>
+  <data name="相机焦距评价" xml:space="preserve">
+    <value>カメラ焦点距離定格</value>
+  </data>
+  <data name="示教起点" xml:space="preserve">
+    <value>出発点を教えてください</value>
+  </data>
+  <data name="示教终点" xml:space="preserve">
+    <value>ティーチングエンドポイント</value>
+  </data>
+  <data name="CameraBrand_SSZN" xml:space="preserve">
+    <value>ディープ3 D </value>
+  </data>
   <data name="执行起始点" xml:space="preserve">
     <value>実行開始ポイント</value>
   </data>
   <data name="执行终点" xml:space="preserve">
     <value>実行エンドポイント</value>
   </data>
+  <data name="相机曝光设置失败" xml:space="preserve">
+    <value>カメラの露出設定に失敗しました</value>
+  </data>
+  <data name="相机增益设置失败" xml:space="preserve">
+    <value>カメラゲインの設定に失敗しました</value>
+  </data>
+  <data name="开始采集图像" xml:space="preserve">
+    <value>画像のキャプチャを始めましょう</value>
+  </data>
+  <data name="开始运行视觉工具" xml:space="preserve">
+    <value>ビジュアルツールの実行を開始してください</value>
+  </data>
+  <data name="执行相机取图并执行视觉工具组时出错" xml:space="preserve">
+    <value>カメラの図面の実行とビジュアルツールセットの実行中にエラーが発生しました</value>
+  </data>
   <data name="示教终點" xml:space="preserve">
     <value>ティーチングエンドポイント</value>
   </data>
@@ -2044,6 +2073,12 @@
   <data name="ProcedureSaveImagePathModel_Month_Day_Formula_ProductSN_Time" xml:space="preserve">
     <value>MM/DD/レシピ名/商品SN/商品SN + TIME </value>
   </data>
+  <data name="抛料数" xml:space="preserve">
+    <value>鋳物の数</value>
+  </data>
+  <data name="NG数量" xml:space="preserve">
+    <value>NG数量</value>
+  </data>
   <data name="是否移除扫码枪" xml:space="preserve">
     <value>スキャナーガンを取り外すかどうか</value>
   </data>
@@ -2071,73 +2106,94 @@
   <data name="扫码枪接收信息时出错" xml:space="preserve">
     <value>スキャナーからのメッセージの受信中にエラーが発生しました</value>
   </data>
+  <data name="运行过度点" xml:space="preserve">
+    <value>ポイントを駆け抜けろ</value>
+  </data>
+  <data name="是否运行过度点" xml:space="preserve">
+    <value>トランジションポイントを実行するかどうか</value>
+  </data>
+  <data name="过度点旋转" xml:space="preserve">
+    <value>過度のポイントローテーション</value>
+  </data>
+  <data name="是否运行过度点旋转" xml:space="preserve">
+    <value>過度のポイントローテーションを実行するかどうか</value>
+  </data>
+  <data name="是否运行到过度点位" xml:space="preserve">
+    <value>超過点まで走るかどうか</value>
+  </data>
+  <data name="是否运行到过度点旋转位" xml:space="preserve">
+    <value>超点回転ビットまで走るかどうか</value>
+  </data>
   <data name="采集图像完成用时0ms" xml:space="preserve">
     <value>取得画像完了時間0 ms </value>
   </data>
   <data name="视觉静态精度分析" xml:space="preserve">
     <value>視覚的静的精度分析</value>
   </data>
+  <data name="CameraBrand_IKap" xml:space="preserve">
+    <value>CameraBrandIKap</value>
+  </data>
   <data name="设备信息" xml:space="preserve">
     <value>デバイス情報</value>
   </data>
-  <data name="是否控制光源通道亮灭" xml:space="preserve">
-    <value>光源チャンネルのオン/オフを制御するかどうか</value>
+  <data name="时间" xml:space="preserve">
+    <value>時間</value>
   </data>
-  <data name="CameraBrand_opt" xml:space="preserve">
-    <value>Opt Camera Viewer </value>
+  <data name="测量数据" xml:space="preserve">
+    <value>測定データ</value>
   </data>
-  <data name="相机焦距评价" xml:space="preserve">
-    <value>カメラ焦点距離定格</value>
+  <data name="拍照结果" xml:space="preserve">
+    <value>撮影結果</value>
   </data>
-  <data name="示教起点" xml:space="preserve">
-    <value>出発点を教えてください</value>
+  <data name="详情" xml:space="preserve">
+    <value>詳細</value>
   </data>
-  <data name="示教终点" xml:space="preserve">
-    <value>ティーチングエンドポイント</value>
+  <data name="良率" xml:space="preserve">
+    <value>良品率</value>
   </data>
-  <data name="CameraBrand_SSZN" xml:space="preserve">
-    <value>ディープ3 D </value>
+  <data name="虚拟SN" xml:space="preserve">
+    <value>仮想SN</value>
   </data>
-  <data name="相机曝光设置失败" xml:space="preserve">
-    <value>カメラの露出設定に失敗しました</value>
+  <data name="检测结果为1" xml:space="preserve">
+    <value>検出結果が1</value>
   </data>
-  <data name="相机增益设置失败" xml:space="preserve">
-    <value>カメラゲインの設定に失敗しました</value>
+  <data name="设备列表" xml:space="preserve">
+    <value>デバイスリスト</value>
   </data>
-  <data name="开始采集图像" xml:space="preserve">
-    <value>画像のキャプチャを始めましょう</value>
+  <data name="设备编号" xml:space="preserve">
+    <value>デバイス番号</value>
   </data>
-  <data name="开始运行视觉工具" xml:space="preserve">
-    <value>ビジュアルツールの実行を開始してください</value>
+  <data name="设备名称" xml:space="preserve">
+    <value>デバイス名</value>
   </data>
-  <data name="执行相机取图并执行视觉工具组时出错" xml:space="preserve">
-    <value>カメラの図面の実行とビジュアルツールセットの実行中にエラーが発生しました</value>
+  <data name="设备描述" xml:space="preserve">
+    <value>デバイス説明</value>
   </data>
-  <data name="抛料数" xml:space="preserve">
-    <value>鋳物の数</value>
+  <data name="启用 MES" xml:space="preserve">
+    <value>MESを有効にする</value>
   </data>
-  <data name="NG数量" xml:space="preserve">
-    <value>NG数量</value>
+  <data name="是否启用两次产品编号" xml:space="preserve">
+    <value>製品番号を2回入力する機能を有効にするか</value>
   </data>
-  <data name="运行过度点" xml:space="preserve">
-    <value>ポイントを駆け抜けろ</value>
+  <data name="是否保存键盘格JMP数据" xml:space="preserve">
+    <value>キーボードグリッドのJMPデータを保存するか</value>
   </data>
-  <data name="是否运行过度点" xml:space="preserve">
-    <value>トランジションポイントを実行するかどうか</value>
+  <data name="是否保存CSV文件" xml:space="preserve">
+    <value>CSVファイルを保存するか</value>
   </data>
-  <data name="过度点旋转" xml:space="preserve">
-    <value>過度のポイントローテーション</value>
+  <data name="是否保存ppid" xml:space="preserve">
+    <value>ppidを保存するか</value>
   </data>
-  <data name="是否运行过度点旋转" xml:space="preserve">
-    <value>過度のポイントローテーションを実行するかどうか</value>
+  <data name="是否启用键盘相邻键保存差值" xml:space="preserve">
+    <value>キーボード隣接キーの差分値を保存する機能を有効にするか</value>
   </data>
-  <data name="是否运行到过度点位" xml:space="preserve">
-    <value>超過点まで走るかどうか</value>
+  <data name="保存的CSV文件路径" xml:space="preserve">
+    <value>保存するCSVファイルのパス</value>
   </data>
-  <data name="是否运行到过度点旋转位" xml:space="preserve">
-    <value>超点回転ビットまで走るかどうか</value>
+  <data name="生产" xml:space="preserve">
+    <value>生産</value>
   </data>
-  <data name="CameraBrand_IKap" xml:space="preserve">
-    <value>CameraBrandIKap</value>
+  <data name="流线" xml:space="preserve">
+    <value>流線</value>
   </data>
 </root>

+ 60 - 3
TeamAAS-VM/Resources/Languages/Lang.resx

@@ -1245,9 +1245,6 @@
   <data name="行X列" xml:space="preserve">
     <value>行 X 列: </value>
   </data>
-  <data name="X" xml:space="preserve">
-    <value> X </value>
-  </data>
   <data name="修改名称" xml:space="preserve">
     <value>修改名称</value>
   </data>
@@ -2267,4 +2264,64 @@
     <value>设备信息</value>
     <comment>设备信息</comment>
   </data>
+  <data name="时间" xml:space="preserve">
+    <value>时间</value>
+  </data>
+  <data name="测量数据" xml:space="preserve">
+    <value>测量数据</value>
+  </data>
+  <data name="拍照结果" xml:space="preserve">
+    <value>拍照结果</value>
+  </data>
+  <data name="详情" xml:space="preserve">
+    <value>详情</value>
+  </data>
+  <data name="良率" xml:space="preserve">
+    <value>良率</value>
+  </data>
+  <data name="虚拟SN" xml:space="preserve">
+    <value>虚拟SN</value>
+  </data>
+  <data name="检测结果为1" xml:space="preserve">
+    <value>检测结果为1</value>
+  </data>
+  <data name="设备列表" xml:space="preserve">
+    <value>设备列表</value>
+  </data>
+  <data name="设备编号" xml:space="preserve">
+    <value>设备编号</value>
+  </data>
+  <data name="设备名称" xml:space="preserve">
+    <value>设备名称</value>
+  </data>
+  <data name="设备描述" xml:space="preserve">
+    <value>设备描述</value>
+  </data>
+  <data name="启用 MES" xml:space="preserve">
+    <value>启用 MES</value>
+  </data>
+  <data name="是否启用两次产品编号" xml:space="preserve">
+    <value>是否启用两次产品编号</value>
+  </data>
+  <data name="是否保存键盘格JMP数据" xml:space="preserve">
+    <value>是否保存键盘格JMP数据</value>
+  </data>
+  <data name="是否保存CSV文件" xml:space="preserve">
+    <value>是否保存CSV文件</value>
+  </data>
+  <data name="是否保存ppid" xml:space="preserve">
+    <value>是否保存ppid</value>
+  </data>
+  <data name="是否启用键盘相邻键保存差值" xml:space="preserve">
+    <value>是否启用键盘相邻键保存差值</value>
+  </data>
+  <data name="保存的CSV文件路径" xml:space="preserve">
+    <value>保存的CSV文件路径</value>
+  </data>
+  <data name="生产" xml:space="preserve">
+    <value>生产</value>
+  </data>
+  <data name="流线" xml:space="preserve">
+    <value>流线</value>
+  </data>
 </root>

+ 60 - 3
TeamAAS-VM/Resources/Languages/Lang.vi.resx

@@ -1152,9 +1152,6 @@
   <data name="行X列" xml:space="preserve">
     <value>Hàng X Cột:</value>
   </data>
-  <data name="X" xml:space="preserve">
-    <value>X</value>
-  </data>
   <data name="修改名称" xml:space="preserve">
     <value>Sửa đổi tên</value>
   </data>
@@ -2139,4 +2136,64 @@
   <data name="设备信息" xml:space="preserve">
     <value>Thông tin thiết bị</value>
   </data>
+  <data name="时间" xml:space="preserve">
+    <value>Thời gian</value>
+  </data>
+  <data name="测量数据" xml:space="preserve">
+    <value>Dữ liệu đo lường</value>
+  </data>
+  <data name="拍照结果" xml:space="preserve">
+    <value>Kết quả chụp ảnh</value>
+  </data>
+  <data name="详情" xml:space="preserve">
+    <value>Chi tiết</value>
+  </data>
+  <data name="良率" xml:space="preserve">
+    <value>Tỷ lệ sản phẩm tốt</value>
+  </data>
+  <data name="虚拟SN" xml:space="preserve">
+    <value>SN ảo</value>
+  </data>
+  <data name="检测结果为1" xml:space="preserve">
+    <value>Kết quả phát hiện là 1</value>
+  </data>
+  <data name="设备列表" xml:space="preserve">
+    <value>Danh sách thiết bị</value>
+  </data>
+  <data name="设备编号" xml:space="preserve">
+    <value>Mã thiết bị</value>
+  </data>
+  <data name="设备名称" xml:space="preserve">
+    <value>Tên thiết bị</value>
+  </data>
+  <data name="设备描述" xml:space="preserve">
+    <value>Mô tả thiết bị</value>
+  </data>
+  <data name="启用 MES" xml:space="preserve">
+    <value>Bật MES</value>
+  </data>
+  <data name="是否启用两次产品编号" xml:space="preserve">
+    <value>Có bật chức năng nhập mã sản phẩm hai lần không</value>
+  </data>
+  <data name="是否保存键盘格JMP数据" xml:space="preserve">
+    <value>Có lưu dữ liệu JMP của lưới bàn phím không</value>
+  </data>
+  <data name="是否保存CSV文件" xml:space="preserve">
+    <value>Có lưu tệp CSV không</value>
+  </data>
+  <data name="是否保存ppid" xml:space="preserve">
+    <value>Có lưu ppid không</value>
+  </data>
+  <data name="是否启用键盘相邻键保存差值" xml:space="preserve">
+    <value>Có bật chức năng lưu giá trị hiệu của các phím liền kề bàn phím không</value>
+  </data>
+  <data name="保存的CSV文件路径" xml:space="preserve">
+    <value>Đường dẫn tệp CSV đã lưu</value>
+  </data>
+  <data name="生产" xml:space="preserve">
+    <value>sản xuất</value>
+  </data>
+  <data name="流线" xml:space="preserve">
+    <value>đường dòng</value>
+  </data>
 </root>

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

@@ -1152,9 +1152,6 @@
   <data name="行X列" xml:space="preserve">
     <value>行X 列: </value>
   </data>
-  <data name="X" xml:space="preserve">
-    <value> X </value>
-  </data>
   <data name="修改名称" xml:space="preserve">
     <value>修改名稱</value>
   </data>
@@ -2022,13 +2019,45 @@
   <data name="请选择要启用的光源通道" xml:space="preserve">
     <value>請選擇要啟用的光源通道</value>
   </data>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="是否控制光源通道亮灭" xml:space="preserve">
+    <value>是否控制光源通道亮滅</value>
+  </data>
+  <data name="CameraBrand_opt" xml:space="preserve">
+    <value>奧普特(OPT Camera Viewer)</value>
+  </data>
+  <data name="相机焦距评价" xml:space="preserve">
+    <value>相機焦距評價</value>
+  </data>
+  <data name="示教起点" xml:space="preserve">
+    <value>示教起點</value>
+  </data>
+  <data name="示教终点" xml:space="preserve">
+    <value>示教終點</value>
+  </data>
+  <data name="CameraBrand_SSZN" xml:space="preserve">
+    <value>深視3D</value>
+  </data>
   <data name="执行起始点" xml:space="preserve">
     <value>執行起點</value>
   </data>
   <data name="执行终点" xml:space="preserve">
     <value>執行終點</value>
   </data>
+  <data name="相机曝光设置失败" xml:space="preserve">
+    <value>相機曝光設定失敗</value>
+  </data>
+  <data name="相机增益设置失败" xml:space="preserve">
+    <value>相機增益設定失敗</value>
+  </data>
+  <data name="开始采集图像" xml:space="preserve">
+    <value>開始採集影像</value>
+  </data>
+  <data name="开始运行视觉工具" xml:space="preserve">
+    <value>開始運行視覺工具</value>
+  </data>
+  <data name="执行相机取图并执行视觉工具组时出错" xml:space="preserve">
+    <value>執行相機取圖並執行視覺工具組時出錯</value>
+  </data>
   <data name="示教终點" xml:space="preserve">
     <value>示教終點</value>
   </data>
@@ -2044,6 +2073,12 @@
   <data name="ProcedureSaveImagePathModel_Month_Day_Formula_ProductSN_Time" xml:space="preserve">
     <value>年月/日/配方名/產品SN/產品SN+時間</value>
   </data>
+  <data name="抛料数" xml:space="preserve">
+    <value>拋料數</value>
+  </data>
+  <data name="NG数量" xml:space="preserve">
+    <value>NG數量</value>
+  </data>
   <data name="是否移除扫码枪" xml:space="preserve">
     <value>是否移除掃碼槍</value>
   </data>
@@ -2071,73 +2106,94 @@
   <data name="扫码枪接收信息时出错" xml:space="preserve">
     <value>掃碼槍接收訊息時發生錯誤</value>
   </data>
+  <data name="运行过度点" xml:space="preserve">
+    <value>運行過度點</value>
+  </data>
+  <data name="是否运行过度点" xml:space="preserve">
+    <value>是否運行過度點</value>
+  </data>
+  <data name="过度点旋转" xml:space="preserve">
+    <value>過度點旋轉</value>
+  </data>
+  <data name="是否运行过度点旋转" xml:space="preserve">
+    <value>是否運行過度點旋轉</value>
+  </data>
+  <data name="是否运行到过度点位" xml:space="preserve">
+    <value>是否運行到過度點位</value>
+  </data>
+  <data name="是否运行到过度点旋转位" xml:space="preserve">
+    <value>是否運行到過度點旋轉位</value>
+  </data>
   <data name="采集图像完成用时0ms" xml:space="preserve">
     <value>擷取影像完成用時0ms</value>
   </data>
   <data name="视觉静态精度分析" xml:space="preserve">
     <value>視覺靜態精度分析</value>
   </data>
+  <data name="CameraBrand_IKap" xml:space="preserve">
+    <value>CameraBrandIKap</value>
+  </data>
   <data name="设备信息" xml:space="preserve">
     <value>設備資訊</value>
   </data>
-  <data name="是否控制光源通道亮灭" xml:space="preserve">
-    <value>是否控制光源通道亮滅</value>
+  <data name="时间" xml:space="preserve">
+    <value>時間</value>
   </data>
-  <data name="CameraBrand_opt" xml:space="preserve">
-    <value>奧普特(OPT Camera Viewer)</value>
+  <data name="测量数据" xml:space="preserve">
+    <value>測量數據</value>
   </data>
-  <data name="相机焦距评价" xml:space="preserve">
-    <value>相機焦距評價</value>
+  <data name="拍照结果" xml:space="preserve">
+    <value>拍照結果</value>
   </data>
-  <data name="示教起点" xml:space="preserve">
-    <value>示教起點</value>
+  <data name="详情" xml:space="preserve">
+    <value>詳情</value>
   </data>
-  <data name="示教终点" xml:space="preserve">
-    <value>示教終點</value>
+  <data name="良率" xml:space="preserve">
+    <value>良率</value>
   </data>
-  <data name="CameraBrand_SSZN" xml:space="preserve">
-    <value>深視3D</value>
+  <data name="虚拟SN" xml:space="preserve">
+    <value>虛擬SN</value>
   </data>
-  <data name="相机曝光设置失败" xml:space="preserve">
-    <value>相機曝光設定失敗</value>
+  <data name="检测结果为1" xml:space="preserve">
+    <value>檢測結果為1</value>
   </data>
-  <data name="相机增益设置失败" xml:space="preserve">
-    <value>相機增益設定失敗</value>
+  <data name="设备列表" xml:space="preserve">
+    <value>設備列表</value>
   </data>
-  <data name="开始采集图像" xml:space="preserve">
-    <value>開始採集影像</value>
+  <data name="设备编号" xml:space="preserve">
+    <value>設備編號</value>
   </data>
-  <data name="开始运行视觉工具" xml:space="preserve">
-    <value>開始運行視覺工具</value>
+  <data name="设备名称" xml:space="preserve">
+    <value>設備名稱</value>
   </data>
-  <data name="执行相机取图并执行视觉工具组时出错" xml:space="preserve">
-    <value>執行相機取圖並執行視覺工具組時出錯</value>
+  <data name="设备描述" xml:space="preserve">
+    <value>設備描述</value>
   </data>
-  <data name="抛料数" xml:space="preserve">
-    <value>拋料數</value>
+  <data name="启用 MES" xml:space="preserve">
+    <value>啟用 MES</value>
   </data>
-  <data name="NG数量" xml:space="preserve">
-    <value>NG數量</value>
+  <data name="是否启用两次产品编号" xml:space="preserve">
+    <value>是否啟用兩次產品編號</value>
   </data>
-  <data name="运行过度点" xml:space="preserve">
-    <value>運行過度點</value>
+  <data name="是否保存键盘格JMP数据" xml:space="preserve">
+    <value>是否保存鍵盤格JMP數據</value>
   </data>
-  <data name="是否运行过度点" xml:space="preserve">
-    <value>是否運行過度點</value>
+  <data name="是否保存CSV文件" xml:space="preserve">
+    <value>是否保存CSV文件</value>
   </data>
-  <data name="过度点旋转" xml:space="preserve">
-    <value>過度點旋轉</value>
+  <data name="是否保存ppid" xml:space="preserve">
+    <value>是否保存ppid</value>
   </data>
-  <data name="是否运行过度点旋转" xml:space="preserve">
-    <value>是否運行過度點旋轉</value>
+  <data name="是否启用键盘相邻键保存差值" xml:space="preserve">
+    <value>是否啟用鍵盤相鄰鍵保存差值</value>
   </data>
-  <data name="是否运行到过度点位" xml:space="preserve">
-    <value>是否運行到過度點位</value>
+  <data name="保存的CSV文件路径" xml:space="preserve">
+    <value>保存的CSV文件路徑</value>
   </data>
-  <data name="是否运行到过度点旋转位" xml:space="preserve">
-    <value>是否運行到過度點旋轉位</value>
+  <data name="生产" xml:space="preserve">
+    <value>生産</value>
   </data>
-  <data name="CameraBrand_IKap" xml:space="preserve">
-    <value>CameraBrandIKap</value>
+  <data name="流线" xml:space="preserve">
+    <value>流線</value>
   </data>
 </root>

+ 7 - 14
TeamAAS-VM/Resources/Styles/DefaultColors.xaml

@@ -1,15 +1,8 @@
-<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
-    <SolidColorBrush x:Key="DefaultBackground"
-                     Color="#424242" />
-    <SolidColorBrush x:Key="DefaultFore"
-                     Color="#F0F0F0" />
-    <SolidColorBrush x:Key="DefaultNavigationCheckedBackground"
-                     Color="Transparent" />
-    <SolidColorBrush x:Key="DefaultNavigationCheckedFore"
-                     Color="#50ac52" />
-    <SolidColorBrush x:Key="DefaultNavigationUnCheckedBackground"
-                     Color="Transparent" />
-    <SolidColorBrush x:Key="DefaultNavigationUnCheckedFore"
-                     Color="#424242" />
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <SolidColorBrush x:Key="DefaultBackground" Color="#424242" />
+    <SolidColorBrush x:Key="DefaultFore" Color="#F0F0F0" />
+    <SolidColorBrush x:Key="DefaultNavigationCheckedBackground" Color="Transparent" />
+    <SolidColorBrush x:Key="DefaultNavigationCheckedFore" Color="#50ac52" />
+    <SolidColorBrush x:Key="DefaultNavigationUnCheckedBackground" Color="Transparent" />
+    <SolidColorBrush x:Key="DefaultNavigationUnCheckedFore" Color="#424242" />
 </ResourceDictionary>

+ 6 - 1
TeamAAS-VM/Services/ProductService.cs

@@ -542,6 +542,7 @@ namespace TeamAAS_VP.Services
                 foreach (var prc in camera.ProcedureModels)
                 {
                     if (prc.ToolBlock != null) continue;
+
                     string prcPath = Path.Combine(dir, camera.Camera, prc.Name + ".vpp");
 
                     prc.ToolBlock = _vppCache.GetOrAdd(prcPath, path =>
@@ -578,9 +579,13 @@ namespace TeamAAS_VP.Services
                     foreach (var prc in camera.ProcedureModels)
                     {
                         if (prc.ToolBlock != null) continue;
+
                         string prcPath = Path.Combine(dir, camera.Camera, prc.Name + ".vpp");
                         temp = prcPath;
-                        prc.ToolBlock = CogSerializer.LoadObjectFromFile(prcPath) as CogToolBlock;
+                        prc.ToolBlock = _vppCache.GetOrAdd(prcPath, path =>
+                        {
+                            return CogSerializer.LoadObjectFromFile(path) as CogToolBlock;
+                        });
                     }
                 }
             }

+ 10 - 9
TeamAAS-VM/Services/RemoteCommandService.cs

@@ -2029,11 +2029,11 @@ namespace TeamAAS_VP.Services
                                 // 定义颜色映射
                                 var colors = new[]
                                 {
-                            Scalar.Red,      // NG1 - 红色
-                            Scalar.Green,    // NG2 - 绿色
-                            Scalar.Blue,     // NG3 - 蓝色
-                            Scalar.Yellow    // NG4 - 黄色
-                        };
+                                    Scalar.Red,      // NG1 - 红色
+                                    Scalar.Green,    // NG2 - 绿色
+                                    Scalar.Blue,     // NG3 - 蓝色
+                                    Scalar.Yellow    // NG4 - 黄色
+                                };
 
                                 foreach (var det in results)
                                 {
@@ -2091,7 +2091,7 @@ namespace TeamAAS_VP.Services
                                 }
 
                                 // 关键:这里转成彩色 ICogImage
-                                var yoloColorCogImage = ImageHelper.MatConvertICogImage(image2);
+                                var yoloColorCogImage = ImageHelper.MatConvertICogImage(image2,true);
 
                                 // 模板检测如果需要原图,可以用 imges[0]
                                 // 如果你希望模板也拿 YOLO 画框图,就用 yoloColorCogImage
@@ -2133,7 +2133,8 @@ namespace TeamAAS_VP.Services
                                     Id = procedure.DisplayId,
                                     DisplayName = procedure.DisplayName,
 
-                                    Image = OriginyoloColorCogImage,
+                                    // 显示和保存用 YOLO 彩色图
+                                    Image = yoloColorCogImage,
 
                                     Graphic = outputCollection["Graphic"].Value as CogGraphicCollection,
                                     Record = record,
@@ -2154,8 +2155,7 @@ namespace TeamAAS_VP.Services
                                     Id = procedure.DisplayId,
                                     DisplayName = procedure.DisplayName,
 
-                                    // 显示和保存用 YOLO 彩色图
-                                    Image = yoloColorCogImage,
+                                    Image = OriginyoloColorCogImage,
 
                                     Graphic = outputCollection["Graphic"].Value as CogGraphicCollection,
                                     Record = record,
@@ -2171,6 +2171,7 @@ namespace TeamAAS_VP.Services
                                     Is3DModel = is3dmodel,
                                 });
 
+
                             }
 
                         }

+ 27 - 5
TeamAAS-VM/ViewModels/HomeViewModel.cs

@@ -175,6 +175,14 @@ namespace TeamAAS_VP.ViewModels
             set { SetProperty(ref _LockResults, value); }
         }
 
+        private bool _IsAllowEdit = false;
+
+        public bool IsAllowEdit
+        {
+            get { return _IsAllowEdit; }
+            set { SetProperty(ref _IsAllowEdit, value); }
+        }
+
         #endregion
 
         #region 命令
@@ -382,7 +390,14 @@ namespace TeamAAS_VP.ViewModels
 
         private void LoginChange(Models.User user)
         {
-            
+            if (user.userPart == Enums.UserPart.Operator)
+            {
+                IsAllowEdit = false;
+            }
+            else
+            {
+                IsAllowEdit = true;
+            }
         }
 
         /// <summary>
@@ -390,8 +405,8 @@ namespace TeamAAS_VP.ViewModels
         /// </summary>
         async void ExecuteResetCounterCommand()
         {
-            var currentproduct = _productService.GetCurrentProduct();
-            if (currentproduct == null) return;
+            var currentProduct = _productService.GetCurrentProduct();
+            if (currentProduct == null) return;
             var view = new ShowMessage(Lang.计数清零, Lang.是否重置当前产品的计数);
             //show the dialog
             var result = await DialogHost.Show(view, "RootDialog", null, null, null);
@@ -400,7 +415,7 @@ namespace TeamAAS_VP.ViewModels
                 if (((bool)result))
                 {
                     isCanExecute = false;
-                    await _systemDatabaseService.ResetProductionAsync(currentproduct.Name);
+                    await _systemDatabaseService.ResetProductionAsync(currentProduct.Name);
                     isCanExecute = true;
                 }
             }
@@ -506,7 +521,14 @@ namespace TeamAAS_VP.ViewModels
         /// <exception cref="NotImplementedException"></exception>
         public async void OnNavigatedTo(NavigationContext navigationContext)
         {
-
+            if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator || _systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Engineer)
+            {
+                IsAllowEdit = false;
+            }
+            else
+            {
+                IsAllowEdit = true;
+            }
             try
             {
                 ProductList = new ObservableCollection<ProductModel>(_productService.GetAllProducts());

+ 5 - 5
TeamAAS-VM/ViewModels/MainWindowViewModel.cs

@@ -69,7 +69,7 @@ namespace TeamAAS_VP.ViewModels
         /// 工程师和管理员权限的无操作超时时长。
         /// 超过该时长后自动切回操作员权限。
         /// </summary>
-        private TimeSpan PermissionIdleTimeout = TimeSpan.FromMinutes(0.5);
+        private TimeSpan PermissionIdleTimeout = TimeSpan.FromMinutes(1);
 
         /// <summary>
         /// 权限空闲检测计时器。
@@ -266,10 +266,10 @@ namespace TeamAAS_VP.ViewModels
             // 1. 读取配置参数
             _configService.LoadAll();
 
-            //if (_regionManager != null && _configService.GetSystemConfiguration().PermissionIdleTimeout > 0)
-            //{
-            //    PermissionIdleTimeout = TimeSpan.FromMinutes(_configService.GetSystemConfiguration().PermissionIdleTimeout);
-            //}
+            if (_regionManager != null && _configService.GetSystemConfiguration().PermissionIdleTimeout > 0)
+            {
+                PermissionIdleTimeout = TimeSpan.FromMinutes(_configService.GetSystemConfiguration().PermissionIdleTimeout);
+            }
             // 2. 加载校准
             _calibrationService.LoadAll();
 

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

@@ -18,6 +18,7 @@ using TeamAAS_VP.Core;
 using TeamAAS_VP.Events;
 using TeamAAS_VP.Interfaces;
 using TeamAAS_VP.Models;
+using TeamAAS_VP.Models.Product;
 using TeamAAS_VP.Resources.Languages;
 using TeamAAS_VP.Services;
 
@@ -305,6 +306,11 @@ namespace TeamAAS_VP.ViewModels.Product
             try
             {
                 SelectProduct = navigationContext.Parameters.GetValue<ProductModel>("SelectProduct");
+                if (SelectProduct.GlobalParamListCollection == null)
+                {
+                    SelectProduct.GlobalParamListCollection = new ObservableCollection<ProductGlobalParam>();
+                }
+
                 ProcedureModels = new ObservableCollection<ProcedureModel>();
                 foreach (var item in SelectProduct.CameraProcedures)
                 {

+ 27 - 1
TeamAAS-VM/ViewModels/Product/VisionDynamicAccuracyAnalyzerViewModel.cs

@@ -244,6 +244,18 @@ namespace TeamAAS_VP.ViewModels.Product
             set { SetProperty(ref _MoveSpeed, value); }
         }
 
+        private int _MoveCount = 1000;
+        /// <summary>
+        /// 设置批次点数
+        /// </summary>
+        public int MoveCount
+        {
+            get { return _MoveCount; }
+            set { SetProperty(ref _MoveCount, value); }
+        }
+
+
+
         private double _CycleTime;
         /// <summary>
         /// 单次的时长
@@ -414,7 +426,15 @@ namespace TeamAAS_VP.ViewModels.Product
                 DateTime startTime = DateTime.Now;
                 //为机器人设置移动速度
                 await Robot.CalibParameAsync(new PickInfo(), MoveSpeed, 0, false, 0, 0);
-                
+
+
+                // 优先针对已知的 SSZNCamera 类型直接调用
+                if (Camera is TeamAAS_VP.Core.Cameras.SSZNCamera sszn)
+                {
+                    sszn.CameraRevFinish = false;
+                    sszn.SetBatchPoints(MoveCount);
+                }
+
                 //移动机器人至A点
                 bool isSuccess1 = await Robot.CalibMotionAsync(PointA, null);
                 //if (!isSuccess1)
@@ -490,6 +510,12 @@ namespace TeamAAS_VP.ViewModels.Product
                 //为机器人设置移动速度
                 await Robot.CalibParameAsync(new PickInfo(), MoveSpeed, 0, false, 0, 0);
 
+                // 优先针对已知的 SSZNCamera 类型直接调用
+                if (Camera is TeamAAS_VP.Core.Cameras.SSZNCamera sszn)
+                {
+                    sszn.CameraRevFinish = false;
+                    sszn.SetBatchPoints(MoveCount);
+                }
                 while (CurrentProgress < RepeatCount)
                 {
                     if (_cts.Token.IsCancellationRequested)

+ 9 - 8
TeamAAS-VM/Views/HomeView.xaml

@@ -77,7 +77,7 @@
                             <TextBlock DockPanel.Dock="Top"
                                        FontWeight="Bold"
                                        FontSize="{DynamicResource Font.Size.Body3}"
-                                       Text="拍照结果:" />
+                                       Text="{lex:Loc 拍照结果}" />
                             <DataGrid x:Name="lockResultGrid"
                                       ItemsSource="{Binding LockResults}"
                                       AutoGenerateColumns="False"
@@ -96,15 +96,15 @@
                                                         Binding="{Binding PhotoName}"
                                                         Width="auto"
                                                         IsReadOnly="True" />
-                                    <DataGridTextColumn Header="产品编号"
+                                    <DataGridTextColumn Header="{lex:Loc 产品编号}"
                                                         Binding="{Binding PhotoCode}"
                                                         Width="auto"
                                                         IsReadOnly="True" />
-                                    <DataGridTextColumn Header="时间"
+                                    <DataGridTextColumn Header="{lex:Loc 时间}"
                                                         Binding="{Binding Timestamp, StringFormat={}{0:G}}"
                                                         Width="auto"
                                                         IsReadOnly="True" />
-                                    <DataGridTextColumn Header="测量数据"
+                                    <DataGridTextColumn Header="{lex:Loc 测量数据}"
                                                         Binding="{Binding ResultData}"
                                                         Width="auto"
                                                         IsReadOnly="True" />
@@ -120,7 +120,7 @@
                     Binding="{Binding LockTorque}"
                     Width="auto"
                     IsReadOnly="True" />-->
-                                    <DataGridTemplateColumn Header="拍照结果"
+                                    <DataGridTemplateColumn Header="{lex:Loc 拍照结果}"
                                                             Width="auto"
                                                             IsReadOnly="True">
                                         <DataGridTemplateColumn.CellTemplate>
@@ -160,7 +160,7 @@
                                             </DataTemplate>
                                         </DataGridTemplateColumn.CellTemplate>
                                     </DataGridTemplateColumn>
-                                    <DataGridTextColumn Header="详情"
+                                    <DataGridTextColumn Header="{lex:Loc 详情}"
                                                         Binding="{Binding Detail}"
                                                         Width="auto"
                                                         IsReadOnly="True" />
@@ -420,7 +420,7 @@
                                VerticalAlignment="Center"
                                Margin="10,0" />
                 </StackPanel>
-                <CheckBox Grid.Row="2"
+                <!--<CheckBox Grid.Row="2"
                           VerticalAlignment="Bottom"
                           Margin=" 120,3"
                           HorizontalAlignment="Right"
@@ -433,7 +433,7 @@
                           HorizontalAlignment="Right"
                           Content="检测结果为1"
                           IsEnabled="{Binding IsRunning, Converter={StaticResource InvertBooleanConverter}}"
-                          IsChecked="{Binding IsResultTrue, Mode=TwoWay, Converter={StaticResource InvertBooleanConverter}}" Width="98" />
+                          IsChecked="{Binding IsResultTrue, Mode=TwoWay, Converter={StaticResource InvertBooleanConverter}}" Width="98" />-->
                 <Button Grid.Row="2"
                         Content="{lex:Loc 计数清零}"
                         VerticalAlignment="Bottom"
@@ -441,6 +441,7 @@
                         HorizontalAlignment="Right"
                         materialDesign:ButtonAssist.CornerRadius="10"
                         Style="{StaticResource MaterialDesignRaisedButton}"
+                        IsEnabled="{Binding IsAllowEdit}"
                         Command="{Binding ResetCounterCommand}" />
             </Grid>
             <Border Grid.Row="1"

+ 3 - 3
TeamAAS-VM/Views/MainWindowView.xaml

@@ -127,13 +127,13 @@
                 VerticalAlignment="Center"
                 FontWeight="Bold"/>
                         <materialDesign:Card HorizontalAlignment="Center" VerticalAlignment="Center" Margin="50,10" Background="{Binding management.RunModelBackground}" >
-                            <TextBlock Text="生产" FontSize="22" Margin="8" />
+                            <TextBlock Text="{lex:Loc 生产}" FontSize="22" Margin="8" />
                         </materialDesign:Card >
                         <materialDesign:Card HorizontalAlignment="Center" VerticalAlignment="Center" Margin="20,10" Background="{Binding management.ManualModeBackground}" >
-                            <TextBlock Text="调机" FontSize="22" Margin="8"/>
+                            <TextBlock Text="{lex:Loc 调试}" FontSize="22" Margin="8"/>
                         </materialDesign:Card>
                         <materialDesign:Card HorizontalAlignment="Center" VerticalAlignment="Center" Margin="50,10" Background="{Binding management.ClearModeBackground}" >
-                            <TextBlock Text="流线" FontSize="22" Margin="8" />
+                            <TextBlock Text="{lex:Loc 流线}" FontSize="22" Margin="8" />
                         </materialDesign:Card>
                     </StackPanel>
 

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

@@ -1754,6 +1754,31 @@
                                             </DataTemplate>
                                         </DataGridTemplateColumn.CellEditingTemplate>
                                     </DataGridTemplateColumn>
+                                    <!--启用深度学习-->
+                                    <DataGridTemplateColumn Header="启用启用深度学习"
+                                                    MinWidth="60"
+                                                    Width="Auto">
+                                        <DataGridTemplateColumn.CellTemplate>
+                                            <DataTemplate>
+                                                <TextBlock Text="{Binding AiVision, StringFormat={}{0:F0}}"
+                                                    HorizontalAlignment="Center"
+                                                    VerticalAlignment="Center" />
+                                            </DataTemplate>
+                                        </DataGridTemplateColumn.CellTemplate>
+                                        <DataGridTemplateColumn.CellEditingTemplate>
+                                            <DataTemplate>
+                                                <mah:NumericUpDown Value="{Binding AiVision, 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="2D相机1视觉流程"
                                         MinWidth="150"

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

@@ -73,7 +73,7 @@
                                    x:Name="DrawerHost"
                                    IsEnabled="{Binding IsAllowEdit}">
             <materialDesign:DrawerHost.RightDrawerContent>
-                <uControl:ParameterEdit x:Name="parameterEdit"/>
+                <uControl:ParameterEdit x:Name="parameterEdit" GlobalParamListCollection="{Binding SelectProduct.GlobalParamListCollection}"/>
             </materialDesign:DrawerHost.RightDrawerContent>
 
             <Grid>

+ 0 - 17
TeamAAS-VM/Views/Product/ProductParams.xaml.cs

@@ -1,6 +1,4 @@
 using System.Windows.Controls;
-using TeamAAS_VP.Models.Product;
-using TeamAAS_VP.ViewModels.Product;
 
 namespace TeamAAS_VP.Views.Product
 {
@@ -9,24 +7,9 @@ namespace TeamAAS_VP.Views.Product
     /// </summary>
     public partial class ProductParams : UserControl
     {
-        ProductParamsViewModel VM;
         public ProductParams()
         {
             InitializeComponent();
-            VM = DataContext as ProductParamsViewModel;
-            this.Loaded += ProductParams_Loaded;
-        }
-
-        private void ProductParams_Loaded(object sender, System.Windows.RoutedEventArgs e)
-        {
-            if (VM != null)
-            {
-                if (VM.SelectProduct.GlobalParamListCollection==null)
-                {
-                    VM.SelectProduct.GlobalParamListCollection = new System.Collections.ObjectModel.ObservableCollection<ProductGlobalParam>();
-                }
-                this.parameterEdit.GlobalParamListCollection = VM.SelectProduct.GlobalParamListCollection;
-            }
         }
     }
 }

+ 20 - 7
TeamAAS-VM/Views/Product/VisionDynamicAccuracyAnalyzer.xaml

@@ -278,6 +278,7 @@
                                     <ColumnDefinition Width="*" />
                                     <ColumnDefinition Width="*" />
                                     <ColumnDefinition Width="*" />
+                                    <ColumnDefinition Width="*" />
                                 </Grid.ColumnDefinitions>
 
                                 <!-- 重复次数 -->
@@ -308,15 +309,27 @@
                                 </StackPanel>
 
                                 <StackPanel Grid.Column="2"
-Margin="10,0,0,0">
+                                              Margin="10,0,0,0">
                                     <TextBlock Text="垂直步进距离(ms):" />
                                     <uControl:myNumericUpDowm MinWidth="100"
-                  Interval="0.1"
-                  Maximum="10"
-                  Minimum="-10"
-                  StringFormat="{}{0:N3} mm"
-                  Value="{Binding Distance,Mode=TwoWay}"
-                  Margin="10,0" />
+                                               Interval="0.1"
+                                               Maximum="10"
+                                               Minimum="-10"
+                                               StringFormat="{}{0:N3} mm"
+                                               Value="{Binding Distance,Mode=TwoWay}"
+                                               Margin="10,0" />
+                                </StackPanel>
+                                <StackPanel Grid.Column="3"
+                                            Margin="10,0,0,0">
+                                    <TextBlock Text="设置批次点数:" />
+                                    <mah:NumericUpDown Value="{Binding MoveCount, Mode=TwoWay}"
+                                                       Minimum="1"
+                                                       Maximum="1000000"
+                                                       d:Value="50"
+                                                       TextAlignment="Center"
+                                                       HorizontalContentAlignment="Center"
+                                                       HorizontalAlignment="Stretch"
+                                                       IsEnabled="{Binding IsRunning, Converter={StaticResource InvertBooleanConverter}}" />
                                 </StackPanel>
                             </Grid>
 

+ 10 - 10
TeamAAS-VM/Views/SettingView.xaml

@@ -643,7 +643,7 @@
 
                                 <TextBlock Grid.Row="0"
                                Grid.Column="0"
-                               Text="设备编号:"
+                               Text="{lex:Loc 设备编号}"
                                HorizontalAlignment="Right"
                                VerticalAlignment="Center" />
                                 <TextBlock Grid.Row="0"
@@ -654,7 +654,7 @@
 
                                 <TextBlock Grid.Row="1"
                                Grid.Column="0"
-                               Text="设备名称:"
+                               Text="{lex:Loc 设备名称}"
                                HorizontalAlignment="Right"
                                VerticalAlignment="Center" />
                                 <TextBox Grid.Row="1"
@@ -664,7 +664,7 @@
 
                                 <TextBlock Grid.Row="2"
                                Grid.Column="0"
-                               Text="设备描述:"
+                               Text="{lex:Loc 设备描述}"
                                HorizontalAlignment="Right"
                                VerticalAlignment="Center" />
                                 <TextBox Grid.Row="2"
@@ -754,7 +754,7 @@
 
                                 <TextBlock Grid.Row="11"
                                Grid.Column="0"
-                               Text="启用 MES:"
+                               Text="{lex:Loc 启用 MES}"
                                HorizontalAlignment="Right"
                                VerticalAlignment="Center" />
                                 <CheckBox Grid.Row="11"
@@ -767,32 +767,32 @@
                              Orientation="Horizontal">
                                 <CheckBox Grid.Row="12"
                               Grid.Column="1"
-                              Content="是否启用两次产品编号"
+                              Content="{lex:Loc 是否启用两次产品编号}"
                               IsChecked="{Binding SelectDeviceInfo.EnableDoubleMes, Mode=TwoWay}"
                               Margin="6,2" />
                                 <CheckBox Grid.Row="12"
                                         Grid.Column="1"
-                                          Content="是否保存键盘格JMP数据"
+                                          Content="{lex:Loc 是否保存键盘格JMP数据}"
                                           IsChecked="{Binding SelectDeviceInfo.SaveCsvJmp, Mode=TwoWay}"
                                           Margin="6,2" />
                                 </StackPanel>
                                 <StackPanel Grid.Row="13"
                                 Grid.Column="1"
                                 Orientation="Horizontal">
-                                    <CheckBox Content="是否保存CSV文件"
+                                    <CheckBox Content="{lex:Loc 是否保存CSV文件}"
                                   IsChecked="{Binding SelectDeviceInfo.SaveCsv, Mode=TwoWay}"
                                   Command="{Binding CheckStatusCommand}"
                                   Margin="6,2" />
-                                    <CheckBox Content="是否保存ppid"
+                                    <CheckBox Content="{lex:Loc 是否保存ppid}"
                                   IsChecked="{Binding SelectDeviceInfo.SaveCsvPPID, Mode=TwoWay}"
                                   Margin="6,2" />
-                                    <CheckBox Content="是否启用键盘相邻键保存差值"
+                                    <CheckBox Content="{lex:Loc 是否启用键盘相邻键保存差值}"
                                   IsChecked="{Binding SelectDeviceInfo.SaveCsvkeyData, Mode=TwoWay}"
                                   Margin="6,2"/>
                                 </StackPanel>
                                 <TextBlock Grid.Row="14"
                                Grid.Column="0"
-                               Text="保存的CSV文件路径:"
+                               Text="{lex:Loc 保存的CSV文件路径}"
                                HorizontalAlignment="Right"
                                VerticalAlignment="Center" />
                                 <DockPanel HorizontalAlignment="Stretch"