Prechádzať zdrojové kódy

添加点检和批头计数

徐孝锋 9 mesiacov pred
rodič
commit
0680e97ddd

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

@@ -36,6 +36,7 @@ using TeamAAS_VP.ViewModels.Product;
 using TeamAAS_VP.Views;
 using TeamAAS_VP.Views.Calibration;
 using TeamAAS_VP.Views.DebugMod;
+using TeamAAS_VP.Views.Home;
 using TeamAAS_VP.Views.Product;
 using TeamAAS_VP.Views.Setting;
 using TeamAAS_VP.Views.User;
@@ -180,6 +181,8 @@ namespace TeamAAS_VP
             containerRegistry.RegisterDialog<LightChannelList>();
             containerRegistry.RegisterDialog<AutoCorrectLockPoint>();
             containerRegistry.RegisterDialog<ImageDisplay>();
+            containerRegistry.RegisterDialog<TorqueCheck>();
+            containerRegistry.RegisterDialog<SetAlarmValue>();
             //**************************************************************************************
 
             // 注册 SQLSugar 客户端(单例模式)

+ 10 - 0
TeamAAS-VM/Core/FilePath.cs

@@ -61,5 +61,15 @@ namespace TeamAAS_VP.Core
         /// 后台脚本存放文件夹
         /// </summary>
         public static string BackgroundScriptPath = "..//Background Script";
+
+        /// <summary>
+        /// 扭力点检参数
+        /// </summary>
+        public static string TorqueCheckPath = "..//Config//TorqueCheckParam.cfg";
+
+        /// <summary>
+        /// 数量参数
+        /// </summary>
+        public static string NumberStatisticsPath = "..//Config//NumberStatisticsParam.cfg";
     }
 }

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

@@ -31,6 +31,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Documents;
+using System.Windows.Forms;
 using System.Windows.Interop;
 using System.Windows.Media;
 using System.Windows.Media.Media3D;
@@ -56,6 +57,7 @@ using TouchSocket.Sockets;
 using static MaterialDesignThemes.Wpf.Theme.ToolBar;
 using static Org.BouncyCastle.Math.EC.ECCurve;
 using static System.Windows.Forms.AxHost;
+using Timer = System.Threading.Timer;
 
 namespace TeamAAS_VP.Core
 {
@@ -82,7 +84,6 @@ namespace TeamAAS_VP.Core
         #endregion
 
         #region 属性
-
         private ObservableCollection<ShowRender> _Renders;
 
         /// <summary>
@@ -159,6 +160,20 @@ namespace TeamAAS_VP.Core
 
         public Dictionary<string, object> BackupObject { get; set; } = new Dictionary<string, object>();
 
+        /// <summary>
+        /// 扭力测量仪
+        /// </summary>
+        public Signal signalTest { get; set; }
+
+        private NumberStatistics _NumStatistics;
+        /// <summary>
+        /// 数量(批头、吸嘴、供料器)
+        /// </summary>
+        public NumberStatistics NumStatistics
+        {
+            get { return _NumStatistics; }
+            set { SetProperty(ref _NumStatistics, value); }
+        }
         #endregion
 
         #region 命令
@@ -184,12 +199,42 @@ namespace TeamAAS_VP.Core
             _calibrationService = calibrationService;
             yieldtimer = new Timer(DoYieldTime, null, 10000, 1000);
             Renders = new ObservableCollection<ShowRender>();
-            _configService = configService;
             _productService = productService;
             _remoteCommandService = remoteCommandService;
             _systemDatabaseService = systemDatabaseService;
             _lightManagerService = lightManagerService;
+            signalTest = new Signal();
+        }
+
+        #region 读取配置参数
+        public void ReadConfig()
+        {
+            ReadNumber();
+        }
+        /// <summary>
+        /// 读取数量配置
+        /// </summary>
+        public void ReadNumber()
+        {
+            try
+            {
+                if (File.Exists(FilePath.NumberStatisticsPath))
+                {
+                    NumStatistics = FileHelper.ReadJsonFile<NumberStatistics>(FilePath.NumberStatisticsPath);
+                }
+                else
+                {
+                    NumStatistics = new NumberStatistics();
+                    FileHelper.WriteJsonFile(NumStatistics, FilePath.NumberStatisticsPath);
+                }
+            }
+            catch (Exception ex)
+            {
+                NumStatistics = new NumberStatistics();
+                LogHelper.WriteLogError("加载数量配置文件时出错!", ex);
+            }
         }
+        #endregion
 
         #region 初始化硬件模块
 
@@ -552,8 +597,6 @@ namespace TeamAAS_VP.Core
             }
         }
 
-        
-
         #endregion
 
         #region 机器人指令执行
@@ -1414,6 +1457,19 @@ namespace TeamAAS_VP.Core
                             });
                             await _systemDatabaseService.RecordLockResultAsync(lockResult);
                             await plc.WriteNodeAsync(addressConfig.In_WorkDone.Address, (Int16)0);
+
+                            //电批吸嘴报警
+                            NumStatistics.HeaderNum++;//批头数量
+                            NumStatistics.NozzleNum++;//吸嘴数量
+                            FileHelper.WriteJsonFile(NumStatistics, FilePath.NumberStatisticsPath);
+                            if (NumStatistics.HeaderNum < NumStatistics.HeaderAlarmValue)
+                            {
+                                System.Windows.MessageBox.Show("Electric Screwdriver Alarm!", "Alarm", MessageBoxButton.OK, MessageBoxImage.Warning);
+                            }
+                            if (NumStatistics.NozzleNum < NumStatistics.NozzleAlarmValue)
+                            {
+                                System.Windows.MessageBox.Show("Nozzle Alarm!", "Alarm", MessageBoxButton.OK, MessageBoxImage.Warning);
+                            }
                         }
                         else
                         {
@@ -1505,8 +1561,23 @@ namespace TeamAAS_VP.Core
                         {
                             SendTaskMessage($"螺丝供料器...", MessageLevel.Info);
                             await plc.WriteNodeAsync(addressConfig.In_PickINC.Address, (Int16)0);
+
+                            var feeders = _configService.GetRemainingCountByFeederNumber(state);
+                            if (state == 1)
+                            {
+                                NumStatistics.Feeder1Num = feeders;
+                            }
+                            else if (state == 2)
+                            {
+                                NumStatistics.Feeder2Num = feeders;
+                            }
+                            FileHelper.WriteJsonFile(NumStatistics, FilePath.NumberStatisticsPath);
+                            var res = _configService.CheckAlarm(state);
+                            if (res)
+                            {
+                                System.Windows.MessageBox.Show("Screw feeder alarm!", "Alarm", MessageBoxButton.OK, MessageBoxImage.Warning);
+                            }
                         }
-                        
                     }
                 }
             }

+ 182 - 0
TeamAAS-VM/Core/Signal.cs

@@ -0,0 +1,182 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.IO.Ports;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using TouchSocket.SerialPorts;
+
+namespace TeamAAS_VP.Core
+{
+    /// <summary>
+    /// 扭力测量仪
+    /// </summary>
+    public class Signal
+    {
+        //public static List<TouchSocket.SerialPorts.SerialPortClient> sp = new List<TouchSocket.SerialPorts.SerialPortClient>();
+        SerialPortClient client;
+        public static string BGSignalConfigPath = "..//Config//扭力测量仪配置文件.json";
+        SignalRS232Config _bGModbus;
+        public static string com;
+        public static string baudRate = "9600";
+        public static int parity = 0;
+        public static string dataBits = "8";
+        public static string stopBites = "1";
+        public static int readTimeOut = 1000;
+        public static bool isopen;
+
+        private static SerialPort sp = new SerialPort();
+        public async Task InitSignal()
+        {
+            if (File.Exists(BGSignalConfigPath))
+            {
+                try
+                {
+                    var res = FileHelper.ReadJsonFile<SignalRS232Config>(BGSignalConfigPath);
+                    if (res != null)
+                    {
+                        foreach (var port in res.PortName)
+                        {
+                            com = port;
+                            OpenSerial(port, baudRate, parity, dataBits, stopBites, readTimeOut);
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    LogHelper.WriteLogError("读取后台ModbusTCP通讯文件时出错!", ex);
+                }
+            }
+            else
+            {
+                _bGModbus = new SignalRS232Config();
+                _bGModbus.PortName.Add("COM4");
+                FileHelper.WriteJsonFile(_bGModbus, BGSignalConfigPath);
+            }
+        }
+        private static bool OpenSerial(string strPortName, string strBaudRate, int parity, string strDataBits, string strStopBits, int ReadTimeout)
+        {
+            try
+            {
+                sp.PortName = strPortName;
+                sp.BaudRate = int.Parse(strBaudRate);
+                sp.DataBits = int.Parse(strDataBits);
+                sp.StopBits = (StopBits)int.Parse(strStopBits);
+                sp.ReadTimeout = ReadTimeout;
+                sp.Parity = (Parity)parity;
+                sp.Open();
+                return isopen = true;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("扭力测量仪连接失败", ex);
+                return isopen = false;
+            }
+        }
+
+        public static string SerialPortSendAndRecive(string strPortName, string strBaudRate, int parity, string strDataBits, string strStopBits, int ReadTimeout, string Sendstring)
+        {
+            try
+            {
+                if (isopen)
+                {
+                    string result = SendAndRecive(Sendstring);
+                    return result;
+                }
+                return "Open SerialPort Fail";
+            }
+            catch (Exception ex)
+            {
+                return "Send Fail" + ex.Message;
+            }
+        }
+
+        private static string SendAndRecive(string str)
+        {
+            try
+            {
+                byte[] array = strToHexByte(str.Trim());
+                sp.Write(array, 0, array.Length);
+                Thread.Sleep(100);
+                int bytesToRead = sp.BytesToRead;
+                byte[] array2 = new byte[bytesToRead];
+                sp.Read(array2, 0, bytesToRead);
+                string text = byteToHexStr(array2);
+                return text;
+
+            }
+            catch (Exception ex)
+            {
+                return "EOROR" + ex.Message;
+            }
+        }
+        public static string byteToHexStr(byte[] bytes)
+        {
+            string text = "";
+            if (bytes != null)
+            {
+                for (int i = 0; i < bytes.Length; i++)
+                {
+                    text = text + bytes[i].ToString("X2") + " ";
+                }
+            }
+
+            return text;
+        }
+        private static byte[] strToHexByte(string hexString)
+        {
+            hexString = hexString.Replace(" ", "");
+            if (hexString.Length % 2 != 0)
+            {
+                hexString += " ";
+            }
+
+            byte[] array = new byte[hexString.Length / 2];
+            for (int i = 0; i < array.Length; i++)
+            {
+                array[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""), 16);
+            }
+
+            return array;
+        }
+
+        public double SendAndReceive()
+        {
+            try
+            {
+                var data = SerialPortSendAndRecive(com, baudRate, parity, dataBits, stopBites, readTimeOut, "01 04 00 00 00 01 31 CA");
+                if (data == "Open SerialPort Fail")
+                {
+                    MessageBox.Show("扭力测量仪连接失败");
+                }
+                else if (data.Contains("Send Fail"))
+                {
+                    MessageBox.Show("扭力测量发送数据失败");
+                }
+                string[] parts = data.Split(' ');
+                string mystr = string.Join(" ", parts, 3, 4);
+                string hex = mystr.Replace(" ", ""); // 16 进制字符串
+                int decimalValue = Convert.ToInt32(hex, 16); // 转换为 10 进制整数
+                double response = decimalValue / 100.0;
+                return response;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("扭力测量仪接收信息时出错!", ex);
+                return 0;
+            }
+        }
+    }
+    public class SignalRS232Config
+    {
+        public ObservableCollection<string> PortName { get; set; }
+        public SignalRS232Config()
+        {
+            PortName = new ObservableCollection<string>();
+        }
+    }
+}

+ 5 - 0
TeamAAS-VM/Interfaces/IConfigService.cs

@@ -466,5 +466,10 @@ namespace TeamAAS_VP.Interfaces
         /// 记录一次螺丝供料器批次更换记录(写入数据库)。
         /// </summary>
         Task RecordScrewFeederBatchAsync(ScrewFeederBatchRecord record);
+
+        /// <summary>
+        /// 检查剩余螺丝是否报警
+        /// </summary>
+        bool CheckAlarm(int feederNumber);
     }
 }

+ 76 - 0
TeamAAS-VM/Models/NumberStatistics.cs

@@ -0,0 +1,76 @@
+using Prism.Mvvm;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TeamAAS_VP.Models
+{
+    /// <summary>
+    /// 数量(批头、吸嘴、供料器)
+    /// </summary>
+    public class NumberStatistics:BindableBase
+    {
+        private int _NozzleNum;
+        /// <summary>
+        /// 吸嘴数量
+        /// </summary>
+        public int NozzleNum
+        {
+            get { return _NozzleNum; }
+            set { SetProperty(ref _NozzleNum, value); }
+        }
+
+        private int _HeaderNum;
+        /// <summary>
+        /// 批头数量
+        /// </summary>
+        public int HeaderNum
+        {
+            get { return _HeaderNum; }
+            set { SetProperty(ref _HeaderNum, value); }
+        }
+
+        private int _Feeder1Num;
+        /// <summary>
+        /// 供料器1数量
+        /// </summary>
+        public int Feeder1Num
+        {
+            get { return _Feeder1Num; }
+            set { SetProperty(ref _Feeder1Num, value); }
+        }
+
+        private int _Feeder2Num;
+        /// <summary>
+        /// 供料器2数量
+        /// </summary>
+        public int Feeder2Num
+        {
+            get { return _Feeder2Num; }
+            set { SetProperty(ref _Feeder2Num, value); }
+        }
+
+        private int _NozzleAlarmValue;
+        /// <summary>
+        /// 吸嘴报警值
+        /// </summary>
+        public int NozzleAlarmValue
+        {
+            get { return _NozzleAlarmValue; }
+            set { SetProperty(ref _NozzleAlarmValue, value); }
+        }
+
+        private int _HeaderAlarmValue;
+        /// <summary>
+        /// 批头报警值
+        /// </summary>
+        public int HeaderAlarmValue
+        {
+            get { return _HeaderAlarmValue; }
+            set { SetProperty(ref _HeaderAlarmValue, value); }
+        }
+    }
+}

+ 19 - 0
TeamAAS-VM/Models/TorqueCheck.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TeamAAS_VP.Models
+{
+    /// <summary>
+    /// 扭力点检参数
+    /// </summary>
+    public class TorqueCheck
+    {
+        public double Xpoint { get; set; }
+        public double Ypoint { get; set; }
+        public double Zpoint { get; set; }
+        public double TorqueValue { get; set; }
+    }
+}

+ 19 - 0
TeamAAS-VM/Models/TorqueTest.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TeamAAS_VP.Models
+{
+    /// <summary>
+    /// 扭力点检参数
+    /// </summary>
+    public class TorqueTest
+    {
+        public double Xpoint { get; set; }
+        public double Ypoint { get; set; }
+        public double Zpoint { get; set; }
+        public double TorqueValue { get; set; }
+    }
+}

+ 136 - 1
TeamAAS-VM/Resources/Languages/Lang.Designer.cs

@@ -19,7 +19,7 @@ namespace TeamAAS_VP.Resources.Languages {
     // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
     // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
     // (以 /str 作为命令选项),或重新生成 VS 项目。
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
     public class Lang {
@@ -1167,6 +1167,24 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 供料器1 的本地化字符串。
+        /// </summary>
+        public static string 供料器1 {
+            get {
+                return ResourceManager.GetString("供料器1", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   查找类似 供料器2 的本地化字符串。
+        /// </summary>
+        public static string 供料器2 {
+            get {
+                return ResourceManager.GetString("供料器2", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 供料的Blob最小面积 的本地化字符串。
         /// </summary>
@@ -1275,6 +1293,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 修改 的本地化字符串。
+        /// </summary>
+        public static string 修改 {
+            get {
+                return ResourceManager.GetString("修改", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 修改IP 的本地化字符串。
         /// </summary>
@@ -1815,6 +1842,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 吸嘴 的本地化字符串。
+        /// </summary>
+        public static string 吸嘴 {
+            get {
+                return ResourceManager.GetString("吸嘴", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 吸真空 的本地化字符串。
         /// </summary>
@@ -2319,6 +2355,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 差值 的本地化字符串。
+        /// </summary>
+        public static string 差值 {
+            get {
+                return ResourceManager.GetString("差值", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 已关闭! 的本地化字符串。
         /// </summary>
@@ -2832,6 +2877,51 @@ 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>
+        public static string 批头吸嘴计数清零 {
+            get {
+                return ResourceManager.GetString("批头吸嘴计数清零", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 拍照NG! 的本地化字符串。
         /// </summary>
@@ -4191,6 +4281,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 电批测量值 的本地化字符串。
+        /// </summary>
+        public static string 电批测量值 {
+            get {
+                return ResourceManager.GetString("电批测量值", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 登录 的本地化字符串。
         /// </summary>
@@ -4794,6 +4893,15 @@ namespace TeamAAS_VP.Resources.Languages {
             }
         }
         
+        /// <summary>
+        ///   查找类似 螺丝供料器 的本地化字符串。
+        /// </summary>
+        public static string 螺丝供料器 {
+            get {
+                return ResourceManager.GetString("螺丝供料器", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   查找类似 行 的本地化字符串。
         /// </summary>
@@ -5073,6 +5181,33 @@ 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>

+ 42 - 0
TeamAAS-VM/Resources/Languages/Lang.en.resx

@@ -2019,4 +2019,46 @@
   <data name="请选择要启用的光源通道" xml:space="preserve">
     <value>Please select a light channel to enable</value>
   </data>
+  <data name="扭力点检" xml:space="preserve">
+    <value>Torque Inspection</value>
+  </data>
+  <data name="修改" xml:space="preserve">
+    <value>modify</value>
+  </data>
+  <data name="批头" xml:space="preserve">
+    <value>Screwdriver bit</value>
+  </data>
+  <data name="吸嘴" xml:space="preserve">
+    <value>Nozzle</value>
+  </data>
+  <data name="供料器1" xml:space="preserve">
+    <value>Feeder1</value>
+  </data>
+  <data name="供料器2" xml:space="preserve">
+    <value>Feeder2</value>
+  </data>
+  <data name="扭力阈值" xml:space="preserve">
+    <value>Torque threshold</value>
+  </data>
+  <data name="扭力测量仪值" xml:space="preserve">
+    <value>Torque meter reading</value>
+  </data>
+  <data name="差值" xml:space="preserve">
+    <value>Difference</value>
+  </data>
+  <data name="电批测量值" xml:space="preserve">
+    <value>Electric screwdriver torque reading</value>
+  </data>
+  <data name="批头吸嘴计数清零" xml:space="preserve">
+    <value>Bit/Nozzle Counter Reset</value>
+  </data>
+  <data name="设置批头吸嘴报警值" xml:space="preserve">
+    <value>Set Bit/Nozzle Alarm Value</value>
+  </data>
+  <data name="设置批头报警值" xml:space="preserve">
+    <value>Set Bit Alarm Value</value>
+  </data>
+  <data name="设置吸嘴报警值" xml:space="preserve">
+    <value>Set Nozzle Alarm Value</value>
+  </data>
 </root>

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

@@ -2019,4 +2019,46 @@
   <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="供料器1" xml:space="preserve">
+    <value>フィーダー1</value>
+  </data>
+  <data name="供料器2" xml:space="preserve">
+    <value>フィーダー2</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>
 </root>

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

@@ -2123,4 +2123,46 @@
   <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="供料器1" xml:space="preserve">
+    <value>供料器1</value>
+  </data>
+  <data name="供料器2" xml:space="preserve">
+    <value>供料器2</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>
 </root>

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

@@ -2019,4 +2019,46 @@
   <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="供料器1" xml:space="preserve">
+    <value>供料器1</value>
+  </data>
+  <data name="供料器2" xml:space="preserve">
+    <value>供料器2</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>
 </root>

+ 15 - 0
TeamAAS-VM/Services/ConfigService.cs

@@ -1235,6 +1235,21 @@ namespace TeamAAS_VP.Services
                 // ignore any error creating/recording the batch record
             }
         }
+
+        /// <summary>
+        /// ¼ì²éÊ£ÓàÂÝË¿ÊÇ·ñ±¨¾¯
+        /// </summary>
+        public bool CheckAlarm(int feederNumber)
+        {
+            lock (_sync)
+            {
+                var f = ScrewFeeders.FirstOrDefault(s => s.FeederNumber == feederNumber);
+                if (f == null) return false;
+                // check alarm
+                CheckAndTriggerLowLevelAlarm(f);
+                return f.IsLowLevelAlarmActive;
+            }
+        }
         #endregion
 
         /// <summary>

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

@@ -526,9 +526,14 @@
     <Compile Include="Controls\FeederSystemParam.xaml.cs">
       <DependentUpon>FeederSystemParam.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Core\Signal.cs" />
     <Compile Include="Events\MainTabSwitchNotification.cs" />
     <Compile Include="Models\Feeder\ScrewFeederInfo.cs" />
+    <Compile Include="Models\NumberStatistics.cs" />
     <Compile Include="Models\ScrewFeederBatchRecord.cs" />
+    <Compile Include="Models\TorqueTest.cs" />
+    <Compile Include="ViewModels\Home\SetAlarmValueViewModel.cs" />
+    <Compile Include="ViewModels\Home\TorqueCheckViewModel.cs" />
     <Compile Include="ViewModels\Product\ImageDisplayViewModel.cs" />
     <Compile Include="ViewModels\Setting\AddScrewFeederViewModel.cs" />
     <Compile Include="ViewModels\Statistics\LockResultRecoredQueryViewModel.cs" />
@@ -924,9 +929,15 @@
     <Compile Include="Views\DebugView.xaml.cs">
       <DependentUpon>DebugView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\Home\SetAlarmValue.xaml.cs">
+      <DependentUpon>SetAlarmValue.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\Home\ShowVisionRender.xaml.cs">
       <DependentUpon>ShowVisionRender.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\Home\TorqueCheck.xaml.cs">
+      <DependentUpon>TorqueCheck.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\ProductsView.xaml.cs">
       <DependentUpon>ProductsView.xaml</DependentUpon>
     </Compile>
@@ -1234,10 +1245,18 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\Home\SetAlarmValue.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\Home\ShowVisionRender.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\Home\TorqueCheck.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\MainWindowView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>

+ 99 - 0
TeamAAS-VM/ViewModels/Home/SetAlarmValueViewModel.cs

@@ -0,0 +1,99 @@
+using Prism.Commands;
+using Prism.Mvvm;
+using Prism.Services.Dialogs;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TeamAAS_VP.Core;
+using TeamAAS_VP.Models;
+
+namespace TeamAAS_VP.ViewModels.Home
+{
+    public class SetAlarmValueViewModel : BindableBase, IDialogAware
+    {
+        #region 属性
+        private int _BitAlarmValue;
+        public int BitAlarmValue
+        {
+            get { return _BitAlarmValue; }
+            set { SetProperty(ref _BitAlarmValue, value); }
+        }
+
+        private int _NozzleAlarmValue;
+        public int NozzleAlarmValue
+        {
+            get { return _NozzleAlarmValue; }
+            set { SetProperty(ref _NozzleAlarmValue, value); }
+        }
+
+        private NumberStatistics _NumStatistics = new NumberStatistics();
+        /// <summary>
+        /// 数量(批头、吸嘴、供料器)
+        /// </summary>
+        public NumberStatistics NumStatistics
+        {
+            get { return _NumStatistics; }
+            set { SetProperty(ref _NumStatistics, value); }
+        }
+        #endregion
+
+        #region 命令
+        private DelegateCommand _ConfirmCommand;
+        public DelegateCommand ConfirmCommand =>
+            _ConfirmCommand ?? (_ConfirmCommand = new DelegateCommand(ExecuteConfirmCommand));
+
+        private DelegateCommand _CancelCommand;
+        public DelegateCommand CancelCommand =>
+            _CancelCommand ?? (_CancelCommand = new DelegateCommand(ExecuteCancelCommand));
+
+        #endregion
+
+        void ExecuteCancelCommand()
+        {
+            IDialogParameters parameters = new DialogParameters();
+            RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel, parameters));
+        }
+        void ExecuteConfirmCommand()
+        {
+            NumStatistics.NozzleAlarmValue = NozzleAlarmValue;
+            NumStatistics.HeaderAlarmValue = BitAlarmValue;
+            FileHelper.WriteJsonFile(NumStatistics, FilePath.NumberStatisticsPath);
+            IDialogParameters parameters = new DialogParameters();
+            RequestClose?.Invoke(new DialogResult(ButtonResult.OK, parameters));
+        }
+
+
+        public string Title => "Set Bit/Nozzle Alarm Value";
+
+        public event Action<IDialogResult> RequestClose;
+
+        public bool CanCloseDialog()
+        {
+            return true;
+        }
+
+        public void OnDialogClosed()
+        {
+            
+        }
+
+        public void OnDialogOpened(IDialogParameters parameters)
+        {
+            try
+            {
+                var res = FileHelper.ReadJsonFile<NumberStatistics>(FilePath.NumberStatisticsPath);
+                if (res != null)
+                {
+                    BitAlarmValue = res.HeaderAlarmValue;
+                    NozzleAlarmValue = res.NozzleAlarmValue;
+                }
+            }
+            catch (Exception)
+            {
+
+            }
+        }
+    }
+}

+ 374 - 0
TeamAAS-VM/ViewModels/Home/TorqueCheckViewModel.cs

@@ -0,0 +1,374 @@
+using NPOI.OpenXml4Net.OPC.Internal;
+using NPOI.SS.Formula.Functions;
+using Prism.Commands;
+using Prism.Events;
+using Prism.Ioc;
+using Prism.Mvvm;
+using Prism.Services.Dialogs;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using TeamAAS_VP.Core;
+using TeamAAS_VP.Events;
+using TeamAAS_VP.Interfaces;
+using TeamAAS_VP.Models;
+using TeamAAS_VP.Resources.Languages;
+using TeamAAS_VP.Services;
+using FileHelper = TeamAAS_VP.Core.FileHelper;
+
+namespace TeamAAS_VP.ViewModels.Home
+{
+    public class TorqueCheckViewModel : BindableBase, IDialogAware
+    {
+        IEventAggregator _eventAggregator;
+        IConfigService _configService;
+        IContainerProvider _container;
+
+        #region 属性
+        private Management _management;
+        public Management management
+        {
+            get { return _management; }
+            set { SetProperty(ref _management, value); }
+        }
+
+        private bool CanExecute
+        {
+            get
+            {
+                // 命令可执行仅当机器人可执行且已选择点位
+                if (Robot != null && Robot.IsConnected && Robot.CanExecute)
+                {
+                    return true;
+                }
+                return false;
+            }
+        }
+
+        private IRobot _Robot;
+        public IRobot Robot
+        {
+            get { return _Robot; }
+            set { SetProperty(ref _Robot, value); }
+        }
+
+        private double _Distance = 1;
+        public double Distance
+        {
+            get { return _Distance; }
+            set
+            {
+                SetProperty(ref _Distance, value);
+                try
+                {
+                    if (Robot == null)
+                    {
+                        return;
+                    }
+                    _configService.UpdateRobotStepDistance(Robot.Id, value);
+                }
+                catch (Exception)
+                {
+
+                }
+            }
+        }
+
+        private TorqueTest _tc = new TorqueTest();
+        public TorqueTest Tc
+        {
+            get { return _tc; }
+            set { SetProperty(ref _tc, value); }
+        }
+
+        private double _torqueValue;
+        public double torqueValue
+        {
+            get { return _torqueValue; }
+            set { SetProperty(ref _torqueValue, value); }
+        }
+
+        private double _TValue;
+        public double TValue
+        {
+            get { return _TValue; }
+            set 
+            { 
+                SetProperty(ref _TValue, value);
+                SubValue = TValue - PValue;
+            }
+        }
+
+        private double _PValue;
+        public double PValue
+        {
+            get { return _PValue; }
+            set 
+            { 
+                SetProperty(ref _PValue, value);
+                SubValue = TValue - PValue;
+            }
+        }
+
+        private double _SubValue;
+        public double SubValue
+        {
+            get { return _SubValue; }
+            set { SetProperty(ref _SubValue, value); }
+        }
+
+        private string _Result;
+        public string Result
+        {
+            get { return _Result; }
+            set { SetProperty(ref _Result, value); }
+        }
+
+        private string _FontColor;
+        public string FontColor
+        {
+            get { return _FontColor; }
+            set { SetProperty(ref _FontColor, value); }
+        }
+        #endregion
+
+        #region 命令
+        private DelegateCommand _CancelCommand;
+        public DelegateCommand CancelCommand =>
+            _CancelCommand ?? (_CancelCommand = new DelegateCommand(ExecuteCancelCommand));
+
+        private DelegateCommand _ConfirmCommand;
+        public DelegateCommand ConfirmCommand =>
+            _ConfirmCommand ?? (_ConfirmCommand = new DelegateCommand(ExecuteConfirmCommand));
+
+        private DelegateCommand<string> _MotorCommand;
+        public DelegateCommand<string> MotorCommand =>
+            _MotorCommand ?? (_MotorCommand = new DelegateCommand<string>(ExecuteMotorCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+        private DelegateCommand<object> _JogCommand;
+        public DelegateCommand<object> JogCommand =>
+             _JogCommand ?? (_JogCommand = new DelegateCommand<object>(ExecuteJogCommand).ObservesCanExecute(() => CanExecute).ObservesProperty(() => Robot).ObservesProperty(() => Robot.CanExecute));
+
+        private DelegateCommand _TechPointCommand;
+        public DelegateCommand TechPointCommand =>
+            _TechPointCommand ?? (_TechPointCommand = new DelegateCommand(ExecuteTechPointCommand));
+
+        private DelegateCommand _ModifyCommand;
+        public DelegateCommand ModifyCommand =>
+            _ModifyCommand ?? (_ModifyCommand = new DelegateCommand(ExecuteModifyCommand));
+
+        private DelegateCommand _WorkCommand;
+        public DelegateCommand WorkCommand =>
+            _WorkCommand ?? (_WorkCommand = new DelegateCommand(ExecuteWorkCommand));
+
+        #endregion
+
+        #region 方法
+        public TorqueCheckViewModel(IEventAggregator ea, IConfigService configService,IContainerProvider container)
+        {
+            _eventAggregator = ea;
+            _configService = configService;
+            _container = container;
+            management = _container.Resolve<Management>();
+        }
+
+        void ExecuteCancelCommand()
+        {
+            IDialogParameters parameters = new DialogParameters();
+            RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel, parameters));
+        }
+
+        void ExecuteConfirmCommand()
+        {
+            IDialogParameters parameters = new DialogParameters();
+            RequestClose?.Invoke(new DialogResult(ButtonResult.OK, parameters));
+        }
+
+        /// <summary>
+        /// 电机
+        /// </summary>
+        /// <param name="obj"></param>
+        private async void ExecuteMotorCommand(string obj)
+        {
+            if (Robot == null || !Robot.IsConnected) return;
+            try
+            {
+                await Robot.MotorAsync(Convert.ToBoolean(obj));
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 });
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("机器人点击操作时出错!", ex);
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
+            }
+        }
+
+        /// <summary>
+        /// 点动
+        /// </summary>
+        /// <param name="obj"></param>
+        private async void ExecuteJogCommand(object obj)
+        {
+            if (Robot == null || !Robot.IsConnected) return;
+            try
+            {
+                var items = ((string)obj).Split(':');
+                //如果移动距离大于10mm,则提示用户确认
+                double distance = double.Parse(items[1]);
+                if (Math.Abs(distance) >= 10)
+                {
+                    if (MessageBox.Show($"确认要点动距离 {distance} mm 吗?", "确认点动", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
+                    {
+                        return;
+                    }
+                }
+
+                Robot.Timeout = 6000000;
+
+                switch (items[0])
+                {
+                    case "X+":
+                        await Robot.JogAsync("X", distance);
+                        break;
+                    case "X-":
+                        await Robot.JogAsync("X", -distance);
+                        break;
+                    case "Y+":
+                        await Robot.JogAsync("Y", distance);
+                        break;
+                    case "Y-":
+                        await Robot.JogAsync("Y", -distance);
+                        break;
+                    case "Z+":
+                        await Robot.JogAsync("Z", distance);
+                        break;
+                    case "Z-":
+                        await Robot.JogAsync("Z", -distance);
+                        break;
+                    case "U+":
+                        await Robot.JogAsync("U", distance);
+                        break;
+                    case "U-":
+                        await Robot.JogAsync("U", -distance);
+                        break;
+                    case "V+":
+                        await Robot.JogAsync("V", distance);
+                        break;
+                    case "V-":
+                        await Robot.JogAsync("V", -distance);
+                        break;
+                    case "W+":
+                        await Robot.JogAsync("W", distance);
+                        break;
+                    case "W-":
+                        await Robot.JogAsync("W", -distance);
+                        break;
+                    default:
+                        break;
+                }
+                Robot.Timeout = 5000;
+
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 });
+
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("机器人点位-机器人点动时出错", ex);
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
+            }
+        }
+
+        /// <summary>
+        /// 示教点位
+        /// </summary>
+        async void ExecuteTechPointCommand()
+        {
+            //弹窗用户是否确认要示教该点位
+            if (MessageBox.Show($"确认要示教点位吗?", "示教点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
+            {
+                return;
+            }
+
+            var curpos = await Robot.GetRobotPosAsync();
+            Tc.Xpoint = curpos.X;
+            Tc.Ypoint = curpos.Y;
+            Tc.Zpoint = curpos.Z;
+            FileHelper.WriteJsonFile(Tc, FilePath.TorqueCheckPath);
+            _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 });
+        }
+
+        /// <summary>
+        /// 修改
+        /// </summary>
+        void ExecuteModifyCommand()
+        {
+            if (MessageBox.Show($"确认要修改扭力阈值吗?", "修改", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
+            {
+                return;
+            }
+            Tc.TorqueValue = torqueValue;
+            FileHelper.WriteJsonFile(Tc, FilePath.TorqueCheckPath);
+            _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 0.4 });
+        }
+
+        void ExecuteWorkCommand()
+        {
+            try
+            {
+                TValue = management.signalTest.SendAndReceive();
+                if (Result=="OK")
+                {
+                    FontColor = "Green";
+                    Result = "OK";
+                }
+                else
+                {
+                    FontColor = "Red";
+                    Result = "NG";
+                }
+            }
+            catch (Exception)
+            {
+
+            }
+        }
+        #endregion
+
+        public string Title { get; set; } = "扭力点检";
+
+        public event Action<IDialogResult> RequestClose;
+
+        public bool CanCloseDialog()
+        {
+            return true;
+        }
+
+        public void OnDialogClosed()
+        {
+
+        }
+
+        public void OnDialogOpened(IDialogParameters parameters)
+        {
+            try
+            {
+                var res = FileHelper.ReadJsonFile<TorqueTest>(FilePath.TorqueCheckPath);
+                if (res != null)
+                {
+                    res.TorqueValue = torqueValue;
+                }
+                else
+                {
+                    MessageBox.Show("还未示教,请先示教");
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show("还未示教,请先示教");
+            }
+        }
+    }
+}

+ 77 - 2
TeamAAS-VM/ViewModels/HomeViewModel.cs

@@ -10,6 +10,7 @@ using Prism.Events;
 using Prism.Ioc;
 using Prism.Mvvm;
 using Prism.Regions;
+using Prism.Services.Dialogs;
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
@@ -29,6 +30,7 @@ using TeamAAS_VP.Resources.Languages;
 using TeamAAS_VP.Services;
 using TeamAAS_VP.ViewModels.DebugMod;
 using TeamAAS_VP.Views.DebugMod;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
 
 namespace TeamAAS_VP.ViewModels
 {
@@ -40,6 +42,7 @@ namespace TeamAAS_VP.ViewModels
         IConfigService _configService;
         IRemoteCommandService _remoteCommandService;
         ISystemDatabaseService _systemDatabaseService;
+        IDialogService _dialogService;
 
         #region 属性
 
@@ -145,6 +148,12 @@ 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 命令
@@ -165,6 +174,19 @@ namespace TeamAAS_VP.ViewModels
         private DelegateCommand<string> _CopyCommand;
         public DelegateCommand<string> CopyCommand =>
             _CopyCommand ?? (_CopyCommand = new DelegateCommand<string>(ExecuteCopyCommand));
+
+        private DelegateCommand _TorqueInspectionCommand;
+        public DelegateCommand TorqueInspectionCommand =>
+            _TorqueInspectionCommand ?? (_TorqueInspectionCommand = new DelegateCommand(ExecuteTorqueInspectionCommand));
+
+        private DelegateCommand _NozzleCounterResetCommand;
+        public DelegateCommand NozzleCounterResetCommand =>
+            _NozzleCounterResetCommand ?? (_NozzleCounterResetCommand = new DelegateCommand(ExecuteNozzleCounterResetCommand));
+
+        private DelegateCommand _SetAlarmValueCommand;
+        public DelegateCommand SetAlarmValueCommand =>
+            _SetAlarmValueCommand ?? (_SetAlarmValueCommand = new DelegateCommand(ExecuteSetAlarmValueCommand));
+
         #endregion
 
         #region 事件
@@ -172,10 +194,11 @@ namespace TeamAAS_VP.ViewModels
         #endregion
 
         public HomeViewModel(IEventAggregator ea, IContainerProvider container, IProductService productService, IConfigService configService, IRemoteCommandService remoteCommandService
-            , ISystemDatabaseService systemDatabaseService)
+            , ISystemDatabaseService systemDatabaseService,IDialogService dialogService)
         {
             _eventAggregator = ea;
             _container = container;
+            _dialogService = dialogService;
             _productService = productService;
             LoadedCommand = new DelegateCommand(OnLoad);
             _eventAggregator.GetEvent<TaskMessageNotification>().Subscribe(AddMessageInvoke);
@@ -218,6 +241,15 @@ namespace TeamAAS_VP.ViewModels
             }
             InitLockCurvePlotModel();
             isFirst = false;
+
+            if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator)
+            {
+                IsAllowEdit = false;
+            }
+            else
+            {
+                IsAllowEdit = true;
+            }
         }
 
         async void ExecuteLoadProductCommand(ProductModel product)
@@ -253,6 +285,20 @@ namespace TeamAAS_VP.ViewModels
             Clipboard.SetText(textToCopy);
         }
 
+        void ExecuteTorqueInspectionCommand()
+        {
+            _dialogService.ShowDialog("TorqueCheck", rst =>
+            {
+                //对话框关闭之后的回调函数,可以在这解析结果。
+                ButtonResult result1 = rst.Result;
+
+                if (result1 == ButtonResult.OK)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 1 });
+                }
+            });
+        }
+
         /// <summary>
         /// 添加消息至消息队列
         /// </summary>
@@ -342,7 +388,14 @@ namespace TeamAAS_VP.ViewModels
 
         private void LoginChange(Models.User user)
         {
-            
+            if (user.userPart == Enums.UserPart.Operator)
+            {
+                IsAllowEdit = false;
+            }
+            else
+            {
+                IsAllowEdit = true;
+            }
         }
 
         /// <summary>
@@ -440,6 +493,28 @@ namespace TeamAAS_VP.ViewModels
             }));
 
         }
+
+
+        void ExecuteSetAlarmValueCommand()
+        {
+            _dialogService.ShowDialog("SetAlarmValue", rst =>
+            {
+                //对话框关闭之后的回调函数,可以在这解析结果。
+                ButtonResult result1 = rst.Result;
+
+                if (result1 == ButtonResult.OK)
+                {
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 1 });
+                }
+            });
+        }
+        void ExecuteNozzleCounterResetCommand()
+        {
+            management.NumStatistics.NozzleNum = 0;
+            management.NumStatistics.HeaderNum = 0;
+            FileHelper.WriteJsonFile(management.NumStatistics, FilePath.NumberStatisticsPath);
+            _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 1 });
+        }
         #endregion
 
         #region 继承

+ 14 - 4
TeamAAS-VM/ViewModels/MainWindowViewModel.cs

@@ -159,7 +159,7 @@ namespace TeamAAS_VP.ViewModels
                 LogHelper.WriteLogError("Database initialization failed during application startup", ex);
             }
 
-            
+
         }
 
         #region 方法
@@ -167,7 +167,7 @@ namespace TeamAAS_VP.ViewModels
         string lastNavigationName = string.Empty;
         private void NavigationVoid(string obj)
         {
-            if(!string.IsNullOrEmpty(lastNavigationName))
+            if (!string.IsNullOrEmpty(lastNavigationName))
             {
                 if (lastNavigationName == obj)
                 {
@@ -283,7 +283,7 @@ namespace TeamAAS_VP.ViewModels
             currentUser = Guid.NewGuid();
             Status.Add(new StatusInfo(currentUser, $"{Lang.当前用户}:{_systemDatabaseService.GetCurrentUser().UserName}[{_systemDatabaseService.GetCurrentUser().userPart.ToString()}]", new SolidColorBrush(Colors.White)));
 
-            var _= Application.Current.Dispatcher.BeginInvoke(new Action(() => { _dialogService.ShowDialog("UProgressBar", rst => { }); }));
+            var _ = Application.Current.Dispatcher.BeginInvoke(new Action(() => { _dialogService.ShowDialog("UProgressBar", rst => { }); }));
 
             _ = App.Current.Dispatcher.BeginInvoke(new Action(() =>
             {
@@ -352,7 +352,7 @@ namespace TeamAAS_VP.ViewModels
             {
                 _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.加载所有产品}...", Value = curvalue });
             }));
-             await _productService.InitializeAsync();
+            await _productService.InitializeAsync();
 
             //-------------------SETP 9: 开启服务器监听-----------------------------------------------------------------------
             curvalue += 1;
@@ -378,6 +378,16 @@ namespace TeamAAS_VP.ViewModels
             }));
             management.InitBackgroundcript();
 
+
+            //-------------------SETP 12: 开启扭力测量仪-----------------------------------------------------------------------
+            curvalue += 1;
+            _ = App.Current.Dispatcher.BeginInvoke(new Action(() =>
+            {
+                _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在开启}...", Value = curvalue });
+            }));
+            await management.signalTest.InitSignal();
+            management.ReadConfig();
+
             //当前日期
             CurrentTime = Guid.NewGuid();
             Status.Add(new StatusInfo(CurrentTime, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), new SolidColorBrush(Colors.White)));

+ 4 - 4
TeamAAS-VM/ViewModels/SettingViewModel.cs

@@ -414,7 +414,7 @@ namespace TeamAAS_VP.ViewModels
         public DelegateCommand SaveScrewFeedersCommand =>
             _SaveScrewFeedersCommand ?? (_SaveScrewFeedersCommand = new DelegateCommand(ExecuteSaveScrewFeedersCommand));
 
-       
+
         #endregion
 
         #region 事件
@@ -1040,7 +1040,7 @@ namespace TeamAAS_VP.ViewModels
 
                         try
                         {
-                            param=_configService.AddOrUpdateScrewFeeder(param);
+                            param = _configService.AddOrUpdateScrewFeeder(param);
                             // 直接添加对话框返回的对象(也可以根据需要映射字段)
                             ScrewFeederList.Add(param);
                         }
@@ -1498,7 +1498,7 @@ namespace TeamAAS_VP.ViewModels
                     sysConfig.FixedCameraPickNum = FixedCameraPickNum;
                     sysConfig.FixedCameraPutNum = FixedCameraPutNum;
                     sysConfig.FixedCameracheckNum = FixedCameracheckNum;
-                    sysConfig.ScrewTeachNum= ScrewTeachNum;
+                    sysConfig.ScrewTeachNum = ScrewTeachNum;
 
                     _configService.SaveSystemConfiguration(sysConfig);
                     await management.WriteSystemParameterToPlcAsync(sysConfig);
@@ -1506,7 +1506,7 @@ namespace TeamAAS_VP.ViewModels
                 }
                 catch (Exception ex)
                 {
-                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg =ex.Message, Duration = 1 });
+                    _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
                 }
             }
         }

+ 94 - 0
TeamAAS-VM/Views/Home/SetAlarmValue.xaml

@@ -0,0 +1,94 @@
+<UserControl x:Class="TeamAAS_VP.Views.Home.SetAlarmValue"
+             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" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:TeamAAS_VP.Views.Home"
+             mc:Ignorable="d" 
+             xmlns:prism="http://prismlibrary.com/"
+             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+             xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
+             xmlns:sys="clr-namespace:System;assembly=mscorlib"
+             xmlns:enums="clr-namespace:TeamAAS_VP.Enums"
+             xmlns:uControl="clr-namespace:TeamAAS_VP.Controls"
+             xmlns:convert="clr-namespace:TeamAAS_VP.ValueConverter"
+             xmlns:valRules="clr-namespace:TeamAAS_VP.Identity"
+             xmlns:validationRule="clr-namespace:TeamAAS_VP.ValidationRules"
+             xmlns:ext="clr-namespace:TeamAAS_VP.Extension"
+             xmlns:lex="http://wpflocalizeextension.codeplex.com"
+             xmlns:vm="clr-namespace:TeamAAS_VP.ViewModels.Home"
+             lex:LocalizeDictionary.DesignCulture="zh-CN"
+             lex:ResxLocalizationProvider.DefaultAssembly="TeamAAS-VP"
+             lex:ResxLocalizationProvider.DefaultDictionary="Lang"
+             d:Background="White"
+             d:DataContext="{d:DesignInstance Type=vm:SetAlarmValueViewModel}"
+             prism:ViewModelLocator.AutoWireViewModel="True"
+             FontFamily="{DynamicResource DefaultFont}">
+    <Grid HorizontalAlignment="Center">
+        <Grid.RowDefinitions>
+            <RowDefinition />
+            <RowDefinition />
+            <RowDefinition />
+            <RowDefinition />
+        </Grid.RowDefinitions>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition />
+            <ColumnDefinition />
+        </Grid.ColumnDefinitions>
+        <TextBlock Text="{lex:Loc 设置批头吸嘴报警值}"
+                   FontSize="20" 
+                   HorizontalAlignment="Center"
+                   Margin="50,30"
+                   Grid.ColumnSpan="2"/>
+
+        <TextBlock Text="{lex:Loc 设置批头报警值}"
+                   FontSize="14"
+                   HorizontalAlignment="Right"
+                   Margin="10"
+                   Grid.Row="1"
+                   Grid.Column="0"/>
+
+        <TextBlock Text="{lex:Loc 设置吸嘴报警值}"
+                   FontSize="14"
+                   HorizontalAlignment="Right"
+                   Margin="10"
+                   Grid.Row="2"
+                   Grid.Column="0" />
+
+        <TextBox Text="{Binding BitAlarmValue}"
+                 FontSize="14"
+                 HorizontalAlignment="Left"
+                 Margin="10"
+                 Grid.Row="1"
+                 Grid.Column="1"
+                 Width="100"/>
+
+        <TextBox Text="{Binding NozzleAlarmValue}"
+                 FontSize="14"
+                 HorizontalAlignment="Left"
+                 Margin="10"
+                 Grid.Row="2"
+                 Grid.Column="1"
+                 Width="100" />
+
+        <StackPanel Orientation="Horizontal"
+                    Margin="10,3"
+                    HorizontalAlignment="Right"
+                    Grid.Row="3"
+                    Grid.ColumnSpan="2">
+            <Button Content="{lex:Loc 确定}"
+                    VerticalContentAlignment="Center"
+                    materialDesign:ButtonAssist.CornerRadius="10"
+                    Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                    Command="{Binding ConfirmCommand}"
+                    Margin="10,3" />
+            <Button Content="{lex:Loc 取消}"
+                    VerticalContentAlignment="Center"
+                    materialDesign:ButtonAssist.CornerRadius="10"
+                    Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                    Command="{Binding CancelCommand}"
+                    Margin="10,3" />
+        </StackPanel>
+
+    </Grid>
+</UserControl>

+ 28 - 0
TeamAAS-VM/Views/Home/SetAlarmValue.xaml.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace TeamAAS_VP.Views.Home
+{
+    /// <summary>
+    /// SetAlarmValue.xaml 的交互逻辑
+    /// </summary>
+    public partial class SetAlarmValue : UserControl
+    {
+        public SetAlarmValue()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 367 - 0
TeamAAS-VM/Views/Home/TorqueCheck.xaml

@@ -0,0 +1,367 @@
+<UserControl x:Class="TeamAAS_VP.Views.Home.TorqueCheck"
+             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"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:local="clr-namespace:TeamAAS_VP.Views.Home"
+             mc:Ignorable="d"
+             xmlns:prism="http://prismlibrary.com/"
+             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+             xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
+             xmlns:sys="clr-namespace:System;assembly=mscorlib"
+             xmlns:enums="clr-namespace:TeamAAS_VP.Enums"
+             xmlns:uControl="clr-namespace:TeamAAS_VP.Controls"
+             xmlns:convert="clr-namespace:TeamAAS_VP.ValueConverter"
+             xmlns:valRules="clr-namespace:TeamAAS_VP.Identity"
+             xmlns:validationRule="clr-namespace:TeamAAS_VP.ValidationRules"
+             xmlns:ext="clr-namespace:TeamAAS_VP.Extension"
+             xmlns:lex="http://wpflocalizeextension.codeplex.com"
+             xmlns:vm="clr-namespace:TeamAAS_VP.ViewModels.Home"
+             lex:LocalizeDictionary.DesignCulture="zh-CN"
+             lex:ResxLocalizationProvider.DefaultAssembly="TeamAAS-VP"
+             lex:ResxLocalizationProvider.DefaultDictionary="Lang"
+             d:Background="White"
+             d:DataContext="{d:DesignInstance Type=vm:TorqueCheckViewModel}"
+             prism:ViewModelLocator.AutoWireViewModel="True"
+             FontFamily="{DynamicResource DefaultFont}">
+    <b:Interaction.Triggers>
+        <b:EventTrigger EventName="Loaded">
+            <b:InvokeCommandAction Command="{Binding LoadedCommand}" />
+        </b:EventTrigger>
+    </b:Interaction.Triggers>
+
+    <UserControl.Resources>
+        <convert:JogConverter x:Key="JogConverter" />
+    </UserControl.Resources>
+
+    <prism:Dialog.WindowStyle>
+        <Style TargetType="Window">
+            <Setter Property="prism:Dialog.WindowStartupLocation"
+                    Value="CenterScreen" />
+            <!--<Setter Property="WindowChrome.WindowChrome">
+        <Setter.Value>
+            <WindowChrome CaptionHeight="0"
+                          ResizeBorderThickness="1" />
+        </Setter.Value>
+    </Setter>-->
+            <Setter Property="WindowStyle"
+                    Value="None" />
+            <Setter Property="AllowDrop"
+                    Value="True" />
+            <Setter Property="BorderThickness"
+                    Value="0" />
+            <Setter Property="ShowInTaskbar"
+                    Value="False" />
+            <Setter Property="SizeToContent"
+                    Value="WidthAndHeight" />
+            <Setter Property="WindowState"
+                    Value="Normal" />
+            <Setter Property="Topmost"
+                    Value="True" />
+        </Style>
+    </prism:Dialog.WindowStyle>
+
+    <Grid HorizontalAlignment="Center">
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition />
+            <ColumnDefinition />
+        </Grid.ColumnDefinitions>
+        <materialDesign:DrawerHost Grid.Column="0"
+                                   OpenMode="Standard"
+                                   x:Name="DrawerHost"
+                                   IsLeftDrawerOpen="{Binding IsLeftDrawerOpen,Mode=TwoWay}"
+                                   d:IsLeftDrawerOpen="true"
+                                   IsEnabled="{Binding IsAllowEdit}">
+            <materialDesign:DrawerHost.LeftDrawerContent>
+                <Grid Width="auto">
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="*" />
+                        <RowDefinition Height="*" />
+                        <RowDefinition Height="*" />
+                    </Grid.RowDefinitions>
+                    <StackPanel Orientation="Horizontal"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Margin="5">
+                        <Button Content="{lex:Loc 上使能}"
+                                materialDesign:ButtonAssist.CornerRadius="10"
+                                Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                                Command="{Binding DataContext.MotorCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                CommandParameter="True"
+                                Margin="10,0" />
+                        <Button Content="{lex:Loc 下使能}"
+                                Margin="10,0"
+                                materialDesign:ButtonAssist.CornerRadius="10"
+                                Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                                Command="{Binding DataContext.MotorCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                CommandParameter="False" />
+                    </StackPanel>
+
+                    <Grid Grid.Row="1">
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="auto" />
+                            <ColumnDefinition Width="auto" />
+                            <ColumnDefinition Width="auto" />
+                            <ColumnDefinition Width="auto" />
+                        </Grid.ColumnDefinitions>
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="auto" />
+                            <RowDefinition Height="auto" />
+                            <RowDefinition Height="auto" />
+                        </Grid.RowDefinitions>
+                        <Grid.Resources>
+                            <Style TargetType="Button"
+                                   BasedOn="{StaticResource MaterialDesignRaisedDarkButton}">
+                                <Setter Property="Width"
+                                        Value="60" />
+                                <Setter Property="Height"
+                                        Value="60" />
+                                <Setter Property="FontSize"
+                                        Value="13" />
+                                <Setter Property="Padding"
+                                        Value="0" />
+                                <Setter Property="HorizontalAlignment"
+                                        Value="Center" />
+                                <Setter Property="VerticalAlignment"
+                                        Value="Center" />
+                                <Setter Property="Margin"
+                                        Value="2" />
+                                <Setter Property="materialDesign:ButtonAssist.CornerRadius"
+                                        Value="10" />
+                            </Style>
+                        </Grid.Resources>
+                        <Button Grid.Row="1"
+                                Grid.Column="0"
+                                Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=X-}">
+                            <StackPanel Orientation="Vertical">
+                                <materialDesign:PackIcon Kind="ArrowLeftBold"
+                                                         Width="26"
+                                                         Height="26" />
+                                <TextBlock Text="-X"
+                                           HorizontalAlignment="Center" />
+                            </StackPanel>
+                        </Button>
+                        <Button Grid.Row="1"
+                                Grid.Column="2"
+                                Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=X+}">
+                            <StackPanel Orientation="Vertical">
+                                <materialDesign:PackIcon Kind="ArrowRightBold"
+                                                         Width="26"
+                                                         Height="26" />
+                                <TextBlock Text="+X"
+                                           HorizontalAlignment="Center" />
+                            </StackPanel>
+                        </Button>
+                        <Button Grid.Row="0"
+                                Grid.Column="1"
+                                Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Y+}">
+                            <StackPanel Orientation="Vertical">
+                                <materialDesign:PackIcon Kind="ArrowTopBold"
+                                                         Width="26"
+                                                         Height="26" />
+                                <TextBlock Text="+Y"
+                                           HorizontalAlignment="Center" />
+                            </StackPanel>
+                        </Button>
+                        <Button Grid.Row="2"
+                                Grid.Column="1"
+                                Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Y-}">
+                            <StackPanel Orientation="Vertical">
+                                <materialDesign:PackIcon Kind="ArrowBottomBold"
+                                                         Width="26"
+                                                         Height="26" />
+                                <TextBlock Text="-Y"
+                                           HorizontalAlignment="Center" />
+                            </StackPanel>
+                        </Button>
+                        <Button Grid.Row="0"
+                                Grid.Column="3"
+                                Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Z+}">
+                            <StackPanel Orientation="Vertical">
+                                <materialDesign:PackIcon Kind="ArrowTopBold"
+                                                         Width="26"
+                                                         Height="26" />
+                                <TextBlock Text="+Z"
+                                           HorizontalAlignment="Center" />
+                            </StackPanel>
+                        </Button>
+                        <Button Grid.Row="2"
+                                Grid.Column="3"
+                                Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
+                                CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Z-}">
+                            <StackPanel Orientation="Vertical">
+                                <materialDesign:PackIcon Kind="ArrowBottomBold"
+                                                         Width="26"
+                                                         Height="26" />
+                                <TextBlock Text="-Z"
+                                           HorizontalAlignment="Center" />
+                            </StackPanel>
+                        </Button>
+                    </Grid>
+
+                    <Grid Grid.Row="2">
+                        <Grid.RowDefinitions>
+                            <RowDefinition />
+                            <RowDefinition />
+                            <RowDefinition />
+                        </Grid.RowDefinitions>
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition />
+                            <ColumnDefinition />
+                        </Grid.ColumnDefinitions>
+                        <TextBlock VerticalAlignment="Center"
+                                   Margin="5"
+                                   Grid.ColumnSpan="2">
+                            <TextBlock.Text>
+                                <MultiBinding StringFormat="{}CurPos X: {0:F3} mm Y: {1:F3} mm Z: {2:F3} mm">
+                                    <Binding Path="Robot.CurrentPosition.X" />
+                                    <Binding Path="Robot.CurrentPosition.Y" />
+                                    <Binding Path="Robot.CurrentPosition.Z" />
+                                </MultiBinding>
+                            </TextBlock.Text>
+                        </TextBlock>
+
+                        <TextBlock Grid.Row="1"
+                                   Grid.Column="0"
+                                   Text="{lex:Loc 步进距离,Converter={StaticResource StringFormatConverter},ConverterParameter='{}{0}: '}"
+                                   Margin="10"
+                                   VerticalAlignment="Center"
+                                   HorizontalAlignment="Right" />
+                        <uControl:myNumericUpDowm x:Name="txtDistance"
+                                                  Grid.Row="1"
+                                                  Grid.Column="1"
+                                                  MinWidth="100"
+                                                  Value="{Binding DataContext.Distance,RelativeSource={RelativeSource AncestorType={x:Type UserControl}},Mode=TwoWay}"
+                                                  Interval="0.1"
+                                                  Minimum="0"
+                                                  Maximum="100"
+                                                  StringFormat="{}{0:N3} mm"
+                                                  Margin="10"
+                                                  materialDesign:HintAssist.Hint="{lex:Loc 步进距离}" />
+
+
+                        <Button Grid.Row="2"
+                                Grid.ColumnSpan="2"
+                                Content="{lex:Loc 示教}"
+                                Margin="0,10"
+                                HorizontalAlignment="Center"
+                                materialDesign:ButtonAssist.CornerRadius="10"
+                                Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                                Command="{Binding DataContext.TechPointCommand}" />
+                    </Grid>
+                </Grid>
+            </materialDesign:DrawerHost.LeftDrawerContent>
+
+            <Grid Grid.Column="1">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="auto" />
+                    <RowDefinition />
+                    <RowDefinition />
+                    <RowDefinition Height="auto" />
+                    <RowDefinition />
+                    <RowDefinition Height="auto" />
+                </Grid.RowDefinitions>
+                <ToggleButton HorizontalAlignment="Left"
+                              VerticalAlignment="Top"
+                              materialDesign:ToggleButtonAssist.OnContent="{materialDesign:PackIcon Kind=ArrowLeft}"
+                              Content="{materialDesign:PackIcon Kind=ArrowAll}"
+                              Style="{StaticResource MaterialDesignActionToggleButton}"
+                              ToolTip="轴操作"
+                              Margin="5,0"
+                              IsChecked="{Binding IsLeftDrawerOpen,ElementName=DrawerHost}" />
+
+                <StackPanel Orientation="Horizontal"
+                            HorizontalAlignment="Left"
+                            VerticalAlignment="Center"
+                            Grid.Row="1"
+                            Margin="5,2">
+                    <TextBlock Text="{lex:Loc 扭力阈值}"
+                               VerticalAlignment="Center"
+                               Margin="5,2" />
+                    <TextBox Text="{Binding torqueValue}"
+                             VerticalAlignment="Center"
+                             HorizontalAlignment="Center"
+                             Width="80"
+                             Margin="5,2" />
+                    <Button Content="{lex:Loc 修改}"
+                            Margin="15,2"
+                            HorizontalAlignment="Center"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                            Command="{Binding ModifyCommand}" />
+                </StackPanel>
+
+                <Grid Grid.Row="2">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="auto" />
+                        <ColumnDefinition />
+                    </Grid.ColumnDefinitions>
+                    <StackPanel Orientation="Vertical"
+                                HorizontalAlignment="Left"
+                                VerticalAlignment="Center"
+                                Margin="5,2">
+                        <TextBlock Text="{lex:Loc 扭力测量仪值}"
+                                   Margin="5,3,10,3" />
+                        <TextBlock Text="{lex:Loc 电批测量值}"
+                                   Margin="5,3,10,3" />
+                        <TextBlock Text="{lex:Loc 差值}"
+                                   Margin="5,3,10,3" />
+                    </StackPanel>
+                    <StackPanel Orientation="Vertical"
+                                HorizontalAlignment="Left"
+                                VerticalAlignment="Center"
+                                Margin="2"
+                                Grid.Column="1">
+                        <TextBlock Text="{Binding TValue}"
+                                   Margin="3" />
+                        <TextBlock Text="{Binding PValue}"
+                                   Margin="3" />
+                        <TextBlock Text="{Binding SubValue}"
+                                   Margin="3" />
+                    </StackPanel>
+                </Grid>
+
+                <Button Content="{lex:Loc 执行}"
+                        VerticalContentAlignment="Center"
+                        materialDesign:ButtonAssist.CornerRadius="10"
+                        Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                        Command="{Binding WorkCommand}"
+                        Margin="10,5"
+                        Grid.Row="3"/>
+
+                <TextBlock Text="{Binding Result}"
+                           HorizontalAlignment="Center"
+                           VerticalAlignment="Center"
+                           Grid.Row="4"
+                           FontSize="30"
+                           Foreground="{Binding FontColor}" />
+
+                <StackPanel Orientation="Horizontal"
+                            Margin="10,3"
+                            HorizontalAlignment="Right"
+                            Grid.Row="5">
+                    <Button Content="{lex:Loc 确定}"
+                            VerticalContentAlignment="Center"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                            Command="{Binding ConfirmCommand}"
+                            Margin="10,3" />
+                    <Button Content="{lex:Loc 取消}"
+                            VerticalContentAlignment="Center"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Style="{StaticResource MaterialDesignRaisedDarkButton}"
+                            Command="{Binding CancelCommand}"
+                            Margin="10,3" />
+                </StackPanel>
+
+            </Grid>
+
+        </materialDesign:DrawerHost>
+
+    </Grid>
+</UserControl>

+ 28 - 0
TeamAAS-VM/Views/Home/TorqueCheck.xaml.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace TeamAAS_VP.Views.Home
+{
+    /// <summary>
+    /// TorqueCheck.xaml 的交互逻辑
+    /// </summary>
+    public partial class TorqueCheck : UserControl
+    {
+        public TorqueCheck()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 103 - 15
TeamAAS-VM/Views/HomeView.xaml

@@ -51,7 +51,8 @@
               Grid.Column="1">
             <Grid.RowDefinitions>
                 <RowDefinition Height="60*" />
-                <RowDefinition Height="40*" />
+                <RowDefinition Height="5*" />
+                <RowDefinition Height="35*" />
             </Grid.RowDefinitions>
             <Grid>
                 <Grid.RowDefinitions>
@@ -315,7 +316,6 @@
                     </materialDesign:Card>
                 </Grid>
 
-
                 <StackPanel Grid.Row="2"
                             Orientation="Horizontal"
                             VerticalAlignment="Bottom"
@@ -329,19 +329,107 @@
                                VerticalAlignment="Center"
                                Margin="10,0" />
                 </StackPanel>
-                <Button Grid.Row="2"
-                        Content="{lex:Loc 计数清零}"
-                        VerticalAlignment="Bottom"
-                        Margin=" 10,3"
-                        HorizontalAlignment="Right"
-                        materialDesign:ButtonAssist.CornerRadius="10"
-                        Style="{StaticResource MaterialDesignRaisedButton}"
-                        Command="{Binding ResetCounterCommand}" />
+
+                <StackPanel Grid.Row="2"
+                            Orientation="Horizontal"
+                            VerticalAlignment="Bottom"
+                            HorizontalAlignment="Right"
+                            Margin="10,3">
+                    <Button Content="{lex:Loc 扭力点检}"
+                            Margin="3"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Style="{StaticResource MaterialDesignRaisedButton}"
+                            Command="{Binding TorqueInspectionCommand}"
+                            IsEnabled="{Binding IsAllowEdit}" />
+                    <Button Content="{lex:Loc 计数清零}"
+                            Margin="3"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Style="{StaticResource MaterialDesignRaisedButton}"
+                            Command="{Binding ResetCounterCommand}"
+                            IsEnabled="{Binding IsAllowEdit}" />
+                    <Button Content="{lex:Loc 批头吸嘴计数清零}"
+                            Margin="3"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Style="{StaticResource MaterialDesignRaisedButton}"
+                            Command="{Binding NozzleCounterResetCommand}"
+                            IsEnabled="{Binding IsAllowEdit}" />
+                    <Button Content="{lex:Loc 设置批头吸嘴报警值}"
+                            Margin="3"
+                            materialDesign:ButtonAssist.CornerRadius="10"
+                            Style="{StaticResource MaterialDesignRaisedButton}"
+                            Command="{Binding SetAlarmValueCommand}"
+                            IsEnabled="{Binding IsAllowEdit}" />
+                </StackPanel>
+
             </Grid>
-            <Border Grid.Row="1"
-                    CornerRadius="20"
-                    BorderBrush="#787878"
-                    BorderThickness="1">
+            
+            <materialDesign:Card Grid.Row="1"
+                                 UniformCornerRadius="10"
+                                 BorderBrush="LightGray"
+                                 BorderThickness="1"
+                                 Margin="0,0,0,2">
+                <Grid>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition />
+                        <ColumnDefinition />
+                        <ColumnDefinition />
+                        <ColumnDefinition />
+                    </Grid.ColumnDefinitions>
+
+                    <StackPanel Orientation="Horizontal"
+                                HorizontalAlignment="Left"
+                                VerticalAlignment="Center"
+                                Margin="3">
+                        <TextBlock Text="{lex:Loc 批头}"
+                                   Margin="0,0,10,0"
+                                   FontSize="14" />
+                        <TextBlock Text="{Binding management.NumStatistics.HeaderNum}"
+                                   FontSize="14" />
+                    </StackPanel>
+
+                    <StackPanel Orientation="Horizontal"
+                                HorizontalAlignment="Left"
+                                VerticalAlignment="Center"
+                                Margin="3"
+                                Grid.Column="1">
+                        <TextBlock Text="{lex:Loc 吸嘴}"
+                                   Margin="0,0,10,0"
+                                   FontSize="14" />
+                        <TextBlock Text="{Binding management.NumStatistics.NozzleNum}"
+                                   FontSize="14" />
+                    </StackPanel>
+
+                    <StackPanel Orientation="Horizontal"
+                                HorizontalAlignment="Left"
+                                VerticalAlignment="Center"
+                                Margin="3"
+                                Grid.Column="2">
+                        <TextBlock Text="{lex:Loc 供料器1}"
+                                   Margin="0,0,10,0"
+                                   FontSize="14" />
+                        <TextBlock Text="{Binding management.NumStatistics.Feeder1Num}"
+                                   FontSize="14" />
+                    </StackPanel>
+
+                    <StackPanel Orientation="Horizontal"
+                                HorizontalAlignment="Left"
+                                VerticalAlignment="Center"
+                                Margin="3"
+                                Grid.Column="3">
+                        <TextBlock Text="{lex:Loc 供料器2}"
+                                   Margin="0,0,10,0"
+                                   FontSize="14" />
+                        <TextBlock Text="{Binding management.NumStatistics.Feeder2Num}"
+                                   FontSize="14" />
+                    </StackPanel>
+                </Grid>
+            </materialDesign:Card>
+            
+            <materialDesign:Card Grid.Row="2"
+                                 UniformCornerRadius="10"
+                                 BorderBrush="LightGray"
+                                 BorderThickness="1"
+                                 Margin="0,2,0,0">
                 <DockPanel LastChildFill="True"
                            Margin="10">
                     <TextBlock Text="{lex:Loc 运行信息,Converter={StaticResource StringFormatConverter},ConverterParameter='{}{0}: '}"
@@ -406,7 +494,7 @@
                         </ListView.ItemTemplate>
                     </ListView>
                 </DockPanel>
-            </Border>
+            </materialDesign:Card>
         </Grid>
     </Grid>
 </UserControl>

+ 2 - 1
TeamAAS-VM/Views/SettingView.xaml

@@ -1763,7 +1763,8 @@
                                        Grid.Column="0"
                                        Style="{StaticResource MaterialDesignSubtitle1TextBlock}"
                                        HorizontalAlignment="Right"
-                                       VerticalAlignment="Center" />
+                                       VerticalAlignment="Center"
+                                       Text="是否启用低量报警:"/>
                             <CheckBox Grid.Row="5"
                                       Grid.Column="1"
                                       Margin="10,0"