|
|
@@ -1,5 +1,7 @@
|
|
|
-using NPOI.OpenXml4Net.OPC.Internal;
|
|
|
+using MathNet.Numerics;
|
|
|
+using NPOI.OpenXml4Net.OPC.Internal;
|
|
|
using NPOI.SS.Formula.Functions;
|
|
|
+using OxyPlot;
|
|
|
using Prism.Commands;
|
|
|
using Prism.Events;
|
|
|
using Prism.Ioc;
|
|
|
@@ -7,17 +9,24 @@ using Prism.Mvvm;
|
|
|
using Prism.Services.Dialogs;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
+using System.Collections.ObjectModel;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Windows;
|
|
|
+using TeamAAS_VP.Controls;
|
|
|
using TeamAAS_VP.Core;
|
|
|
+using TeamAAS_VP.Core.PLCs;
|
|
|
+using TeamAAS_VP.Core.ScrewDriver;
|
|
|
+using TeamAAS_VP.Data;
|
|
|
using TeamAAS_VP.Enums;
|
|
|
using TeamAAS_VP.Events;
|
|
|
using TeamAAS_VP.Interfaces;
|
|
|
using TeamAAS_VP.Models;
|
|
|
+using TeamAAS_VP.Models.PLC;
|
|
|
+using TeamAAS_VP.Models.Torque;
|
|
|
using TeamAAS_VP.Resources.Languages;
|
|
|
using TeamAAS_VP.Services;
|
|
|
using FileHelper = TeamAAS_VP.Core.FileHelper;
|
|
|
@@ -26,12 +35,18 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
{
|
|
|
public class TorqueCheckViewModel : BindableBase, IDialogAware
|
|
|
{
|
|
|
+ // 点检扭矩参数存放日志地址
|
|
|
+ public static readonly string CheckTorqueConfigurationPath = "..//Log//ScrewFeedersConfiguration.cfg";
|
|
|
IEventAggregator _eventAggregator;
|
|
|
IConfigService _configService;
|
|
|
IContainerProvider _container;
|
|
|
IRobotService _robotService;
|
|
|
+ IPlcService _plcService;
|
|
|
+ TorqueService _torqueService;
|
|
|
+ float Value { get; set; } = 0;
|
|
|
|
|
|
#region 属性
|
|
|
+
|
|
|
private Management _management;
|
|
|
public Management management
|
|
|
{
|
|
|
@@ -81,15 +96,17 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private TorqueTest _tc = new TorqueTest();
|
|
|
- public TorqueTest Tc
|
|
|
+ private float _Z_Distance;
|
|
|
+
|
|
|
+ public float Z_Distance
|
|
|
{
|
|
|
- get { return _tc; }
|
|
|
- set { SetProperty(ref _tc, value); }
|
|
|
+ get { return _Z_Distance; }
|
|
|
+ set { SetProperty(ref _Z_Distance, value); }
|
|
|
}
|
|
|
|
|
|
- private double _torqueValue;
|
|
|
- public double torqueValue
|
|
|
+
|
|
|
+ private float _torqueValue;
|
|
|
+ public float TorqueValue
|
|
|
{
|
|
|
get { return _torqueValue; }
|
|
|
set { SetProperty(ref _torqueValue, value); }
|
|
|
@@ -135,6 +152,56 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
get { return _FontColor; }
|
|
|
set { SetProperty(ref _FontColor, value); }
|
|
|
}
|
|
|
+
|
|
|
+ private int _SelectedIndex;
|
|
|
+ public int SelectedIndex
|
|
|
+ {
|
|
|
+ get { return _SelectedIndex; }
|
|
|
+ set { SetProperty(ref _SelectedIndex, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private ObservableCollection<PlcPoint_Torque> _Points = new ObservableCollection<PlcPoint_Torque>();
|
|
|
+ /// <summary>
|
|
|
+ /// 点位集合
|
|
|
+ /// </summary>
|
|
|
+ public ObservableCollection<PlcPoint_Torque> Points
|
|
|
+ {
|
|
|
+ get { return _Points; }
|
|
|
+ set { SetProperty(ref _Points, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private TorqueProduceModel _AllProductParameter = new TorqueProduceModel();
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 所有产品的参数信息
|
|
|
+ /// </summary>
|
|
|
+ public TorqueProduceModel AllProductParameter
|
|
|
+ {
|
|
|
+ get { return _AllProductParameter; }
|
|
|
+ set { SetProperty(ref _AllProductParameter, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+ private PlcPoint_Torque _selectedPointInDataGrid;
|
|
|
+ public PlcPoint_Torque SelectedPointInDataGrid
|
|
|
+ {
|
|
|
+ get { return _selectedPointInDataGrid; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref _selectedPointInDataGrid, value);
|
|
|
+ // 可以同步到 SelectPoint 属性
|
|
|
+ SelectedPoint = value;
|
|
|
+ AllProductParameter.TorquePoints = _Points;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private PlcPoint_Torque _SelectedPoint;
|
|
|
+ public PlcPoint_Torque SelectedPoint
|
|
|
+ {
|
|
|
+ get { return _SelectedPoint; }
|
|
|
+ set { SetProperty(ref _SelectedPoint, value); }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region 命令
|
|
|
@@ -142,6 +209,10 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
public DelegateCommand CancelCommand =>
|
|
|
_CancelCommand ?? (_CancelCommand = new DelegateCommand(ExecuteCancelCommand));
|
|
|
|
|
|
+ private DelegateCommand _LoadedCommand;
|
|
|
+ public DelegateCommand LoadedCommand =>
|
|
|
+ _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
|
|
|
+
|
|
|
private DelegateCommand _ConfirmCommand;
|
|
|
public DelegateCommand ConfirmCommand =>
|
|
|
_ConfirmCommand ?? (_ConfirmCommand = new DelegateCommand(ExecuteConfirmCommand));
|
|
|
@@ -166,17 +237,37 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
public DelegateCommand WorkCommand =>
|
|
|
_WorkCommand ?? (_WorkCommand = new DelegateCommand(ExecuteWorkCommand));
|
|
|
|
|
|
+ private DelegateCommand _AddPointCommand;
|
|
|
+ public DelegateCommand AddPointCommand =>
|
|
|
+ _AddPointCommand ?? (_AddPointCommand = new DelegateCommand(ExecuteAddPointCommand));
|
|
|
+
|
|
|
+ private DelegateCommand _SavePointsCommand;
|
|
|
+ public DelegateCommand SavePointsCommand =>
|
|
|
+ _SavePointsCommand ?? (_SavePointsCommand = new DelegateCommand(ExecuteSavePointsCommand));
|
|
|
+
|
|
|
+ private DelegateCommand _DeletePointCommand;
|
|
|
+ public DelegateCommand DeletePointCommand =>
|
|
|
+ _DeletePointCommand ?? (_DeletePointCommand = new DelegateCommand(ExecuteDeletePointCommand, CanExecuteDeletePointCommand).ObservesProperty(() => SelectedPointInDataGrid));
|
|
|
+
|
|
|
#endregion
|
|
|
|
|
|
#region 方法
|
|
|
- public TorqueCheckViewModel(IEventAggregator ea, IConfigService configService, IContainerProvider container, IRobotService robotService)
|
|
|
+
|
|
|
+ public TorqueCheckViewModel(IEventAggregator ea, IConfigService configService, TorqueService torqueService,
|
|
|
+ IContainerProvider container, IRobotService robotService, IPlcService plcService)
|
|
|
{
|
|
|
_eventAggregator = ea;
|
|
|
_configService = configService;
|
|
|
_container = container;
|
|
|
_robotService = robotService;
|
|
|
+ _plcService = plcService;
|
|
|
+ _torqueService = torqueService;
|
|
|
management = _container.Resolve<Management>();
|
|
|
}
|
|
|
+ bool CanExecuteDeletePointCommand()
|
|
|
+ {
|
|
|
+ return SelectedPointInDataGrid != null;
|
|
|
+ }
|
|
|
|
|
|
void ExecuteCancelCommand()
|
|
|
{
|
|
|
@@ -294,81 +385,140 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
+ if (SelectedPoint == null)
|
|
|
+ {
|
|
|
+ MessageBox.Show("请选择示教点位");
|
|
|
+ return;
|
|
|
+ }
|
|
|
var curpos = await Robot.GetRobotPosAsync();
|
|
|
- Tc.Xpoint = curpos.X;
|
|
|
- Tc.Ypoint = curpos.Y;
|
|
|
- Tc.Zpoint = curpos.Z;
|
|
|
- FileHelper.WriteJsonFile(Tc, FilePath.TorqueCheckPath);
|
|
|
+ SelectedPoint.X_Position = curpos.X;
|
|
|
+ SelectedPoint.Y_Position = curpos.Y;
|
|
|
+ SelectedPoint.Z_Position_Start = curpos.Z;
|
|
|
+ //SelectedPoint.Z_Position_Stop = curpos.Z - (float)this.Z_Distance;
|
|
|
+ SelectedPoint.Z_Position_Stop = 0;
|
|
|
+
|
|
|
+ AllProductParameter.TorqueValue = this.TorqueValue;
|
|
|
+ AllProductParameter.TorquePoints = Points;
|
|
|
+
|
|
|
+ FileHelper.WriteJsonFile(AllProductParameter, FilePath.TorqueCheckPath);
|
|
|
_eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 });
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 修改
|
|
|
/// </summary>
|
|
|
- void ExecuteModifyCommand()
|
|
|
+ async void ExecuteModifyCommand()
|
|
|
{
|
|
|
if (MessageBox.Show($"确认要修改扭力阈值吗?", "修改", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
- Tc.TorqueValue = torqueValue;
|
|
|
- FileHelper.WriteJsonFile(Tc, FilePath.TorqueCheckPath);
|
|
|
+
|
|
|
+ var res = FileHelper.ReadJsonFile<TorqueProduceModel>(FilePath.TorqueCheckPath);
|
|
|
+
|
|
|
+ res.TorqueValue = this.TorqueValue;
|
|
|
+
|
|
|
+ FileHelper.WriteJsonFile(res, FilePath.TorqueCheckPath);
|
|
|
_eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 0.4 });
|
|
|
}
|
|
|
|
|
|
- void ExecuteWorkCommand()
|
|
|
+ async void ExecuteWorkCommand()
|
|
|
{
|
|
|
+ if (!File.Exists(FilePath.TorqueCheckPath))
|
|
|
+ {
|
|
|
+ MessageBox.Show("还未示教,请先示教");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (Robot == null || !Robot.IsConnected)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (MessageBox.Show($"确认要进行点检吗?", "执行点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
try
|
|
|
{
|
|
|
- MoveRobot();
|
|
|
- Thread.Sleep(500);
|
|
|
- DisplayResult();
|
|
|
+ if (await MoveRobot())
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
LogHelper.WriteLogError("执行点检时出错!", ex);
|
|
|
}
|
|
|
}
|
|
|
- public async void MoveRobot()
|
|
|
- {
|
|
|
- if (!File.Exists(FilePath.TorqueCheckPath))
|
|
|
- {
|
|
|
- MessageBox.Show("还未示教,请先示教");
|
|
|
- return;
|
|
|
- }
|
|
|
- var res = FileHelper.ReadJsonFile<TorqueTest>(FilePath.TorqueCheckPath);
|
|
|
|
|
|
- var point = new RPoint()
|
|
|
- {
|
|
|
- X = (float)res.Xpoint,
|
|
|
- Y = (float)res.Ypoint,
|
|
|
- Z = (float)res.Zpoint,
|
|
|
- };
|
|
|
- if (Robot == null || !Robot.IsConnected) return;
|
|
|
+ /// <summary>
|
|
|
+ /// 点检扭矩总体流程
|
|
|
+ /// </summary>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task<bool> MoveRobot()
|
|
|
+ {
|
|
|
+ var Plc_Point = FileHelper.ReadJsonFile<TorqueProduceModel>(FilePath.TorqueCheckPath);
|
|
|
+ PlcAddressConfig addressConfig = _configService.GetPlcAddresses();
|
|
|
+ OpcUaClientPLC plc = _plcService.GetPlcByNumber(addressConfig.PlcNo) as OpcUaClientPLC;
|
|
|
try
|
|
|
{
|
|
|
- //确认要执行该点位的该运动指令吗
|
|
|
- if (MessageBox.Show($"确认要进行点检吗?", "执行点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
|
|
|
+ if (Plc_Point == null || addressConfig == null || plc == null)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //切换手动模式
|
|
|
+ if (await plc.WriteNodeAsync<bool>(addressConfig.OP_AutoManual.Address, false))
|
|
|
{
|
|
|
- return;
|
|
|
+ //回设置的零点
|
|
|
+ if (await _torqueService.Safety_Position_Async(Robot, plc, addressConfig, Plc_Point))
|
|
|
+ {
|
|
|
+ //执行抛螺丝动作
|
|
|
+ if (await _torqueService.Throw_Screw_Async(Robot, plc, addressConfig, Plc_Point))
|
|
|
+ {
|
|
|
+ //执行取螺丝动作
|
|
|
+ if (await _torqueService.Pick_Screw_Async(Robot, plc, addressConfig, Plc_Point))
|
|
|
+ {
|
|
|
+ //执行锁螺丝点位操作
|
|
|
+ if (await _torqueService.Screw_Torque_Async(Robot, plc, addressConfig, Plc_Point))
|
|
|
+ {
|
|
|
+ //获取电批结果并显示曲线
|
|
|
+ if (await WatchAsync(plc, addressConfig))
|
|
|
+ {
|
|
|
+ await DisplayResult();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ MessageBox.Show("未获取到电批结果"); return false;
|
|
|
+ }
|
|
|
+ MessageBox.Show("执行锁螺丝点位操作失败"); return false;
|
|
|
+ }
|
|
|
+ MessageBox.Show("执行取螺丝动作失败"); return false;
|
|
|
+ }
|
|
|
+ MessageBox.Show("执行抛螺丝动作失败"); return false;
|
|
|
+ }
|
|
|
+ MessageBox.Show("执行回安全点失败"); return false;
|
|
|
}
|
|
|
- await Robot.JumpAsync(point, 0);
|
|
|
+ MessageBox.Show("点检失败");return false;
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
LogHelper.WriteLogError("执行点检移动时出错!", ex);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ await _torqueService.Safety_Position_Async(Robot, plc, addressConfig, Plc_Point);
|
|
|
}
|
|
|
}
|
|
|
- public void DisplayResult()
|
|
|
+
|
|
|
+ public async Task DisplayResult()
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
+ Thread.Sleep(100);
|
|
|
TValue = management.SignalValue;
|
|
|
double tvalue = double.Parse(TValue.Split(' ')[0]);
|
|
|
- PValue = $"{management.Value} N.m";
|
|
|
- double pvalue = management.Value;
|
|
|
- SubValue = $"{Math.Abs(tvalue - pvalue)} N.m";
|
|
|
+ double pvalue = Value;
|
|
|
+ PValue = $"{Math.Round(pvalue, 3)} kgf.cm";
|
|
|
+ SubValue = $"{Math.Round(Math.Abs(tvalue - pvalue), 3)} kgf.cm";
|
|
|
double sub = Math.Abs(tvalue - pvalue);
|
|
|
|
|
|
var res = FileHelper.ReadJsonFile<TorqueTest>(FilePath.TorqueCheckPath);
|
|
|
@@ -387,7 +537,7 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if (sub <= torqueValue)
|
|
|
+ if (sub <= TorqueValue)
|
|
|
{
|
|
|
FontColor = "Green";
|
|
|
Result = "OK";
|
|
|
@@ -404,6 +554,50 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
LogHelper.WriteLogError("执行点检显示时出错!", ex);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ public void Save_Torque_Parameter()
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task<bool> WatchAsync(OpcUaClientPLC plc, PlcAddressConfig addressConfig)
|
|
|
+ {
|
|
|
+ Thread.Sleep(100);
|
|
|
+ object oking = null;
|
|
|
+ object nging = null;
|
|
|
+ int count = 0;
|
|
|
+
|
|
|
+ while (count++ < 10)
|
|
|
+ {
|
|
|
+ oking = plc.ReadNode(addressConfig.Screw_OK.Address);
|
|
|
+ nging = plc.ReadNode(addressConfig.Screw_NG.Address);
|
|
|
+
|
|
|
+ if (oking != null && nging != null)
|
|
|
+ {
|
|
|
+ bool okin = (bool)oking; bool ngin = (bool)nging;
|
|
|
+ //电批OKNG
|
|
|
+ if (okin || ngin)
|
|
|
+ {
|
|
|
+ //获取电批结果
|
|
|
+ bool isSucced = management.ScrewDriver.GetData();
|
|
|
+ LockResult lockResult = new LockResult();
|
|
|
+ lockResult.LockTurns = (float)management.ScrewDriver.Truns;
|
|
|
+ lockResult.LockTorque = (float)management.ScrewDriver.TorqueValue;
|
|
|
+ lockResult.WaveDatas = management.ScrewDriver.WaveDatas;
|
|
|
+ App.Current.Dispatcher.Invoke(() =>
|
|
|
+ {
|
|
|
+ _eventAggregator.GetEvent<LockFinishNotification>().Publish(lockResult);
|
|
|
+ });
|
|
|
+ //await _systemDatabaseService.RecordLockResultAsync(lockResult);
|
|
|
+ await plc.WriteNodeAsync(addressConfig.In_WorkDone.Address, (Int16)0);
|
|
|
+
|
|
|
+ Value = lockResult.LockTorque;
|
|
|
+ await plc.WriteNodeAsync(addressConfig.Check_ScrewTorque.Address, false);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
#endregion
|
|
|
|
|
|
public string Title { get; set; } = "扭力点检";
|
|
|
@@ -427,14 +621,14 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
var res = FileHelper.ReadJsonFile<TorqueTest>(FilePath.TorqueCheckPath);
|
|
|
if (res != null)
|
|
|
{
|
|
|
- res.TorqueValue = torqueValue;
|
|
|
+ res.TorqueValue = TorqueValue;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
MessageBox.Show("还未示教,请先示教");
|
|
|
}
|
|
|
}
|
|
|
- catch (Exception ex)
|
|
|
+ catch (Exception)
|
|
|
{
|
|
|
MessageBox.Show("还未示教,请先示教");
|
|
|
}
|
|
|
@@ -454,5 +648,70 @@ namespace TeamAAS_VP.ViewModels.Home
|
|
|
Robot.EnterDebugMode = true;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private void ExecuteLoadedCommand()
|
|
|
+ {
|
|
|
+ var res = FileHelper.ReadJsonFile<TorqueProduceModel>(FilePath.TorqueCheckPath);
|
|
|
+ this.Points = res.TorquePoints;
|
|
|
+ this.TorqueValue = res.TorqueValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ #region 添加点位与删除点位
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 增加点位
|
|
|
+ /// </summary>
|
|
|
+ private void ExecuteAddPointCommand()
|
|
|
+ {
|
|
|
+ //添加点位
|
|
|
+ Points.Add(new PlcPoint_Torque()
|
|
|
+ {
|
|
|
+ Number = Points.Count + 1,
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 移除点位
|
|
|
+ /// </summary>
|
|
|
+ private void ExecuteDeletePointCommand()
|
|
|
+ {
|
|
|
+ if (SelectedPoint == null)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 确认删除
|
|
|
+ if (MessageBox.Show(Lang.确认要删除选中的点位吗, Lang.删除点位, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ int removedIndex = Points.IndexOf(SelectedPoint);
|
|
|
+ Points.Remove(SelectedPoint);
|
|
|
+ //重新编号
|
|
|
+ for (int i = 0; i < Points.Count; i++)
|
|
|
+ {
|
|
|
+ Points[i].Number = i + 1;
|
|
|
+ }
|
|
|
+ // adjust selection
|
|
|
+ if (Points.Count > 0)
|
|
|
+ {
|
|
|
+ int newIndex = Math.Min(removedIndex, Points.Count - 1);
|
|
|
+ SelectedPointInDataGrid = Points[newIndex];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SelectedPointInDataGrid = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ private void ExecuteSavePointsCommand()
|
|
|
+ {
|
|
|
+ AllProductParameter.TorqueValue = this.TorqueValue;
|
|
|
+ AllProductParameter.TorquePoints = Points;
|
|
|
+
|
|
|
+ FileHelper.WriteJsonFile(AllProductParameter, FilePath.TorqueCheckPath);
|
|
|
+ MessageBox.Show("参数保存成功");
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
}
|