From 0bbe361ab7586a5c01b17a55fc98c3b498c491c8 Mon Sep 17 00:00:00 2001 From: Tyrone CT Date: Tue, 21 Jan 2025 18:35:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E4=BA=9B=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CapMachine.Wpf/App.xaml.cs | 7 +- .../Converts/BoolFinishStrConvert.cs | 29 ++++ CapMachine.Wpf/Models/ComEnum.cs | 5 + .../Models/State/MachineRunState.cs | 38 ++++- CapMachine.Wpf/Models/SysExdBoolInfo.cs | 39 +++++ CapMachine.Wpf/Models/Tag/QuickTag.cs | 12 +- .../ProPars/ProParsSongZhiHelper.cs | 10 ++ CapMachine.Wpf/Services/CanDriveService.cs | 14 +- CapMachine.Wpf/Services/ConfigService.cs | 7 +- CapMachine.Wpf/Services/LinDriveService.cs | 15 +- .../Services/MachineRtDataService.cs | 150 +++++++++++++----- CapMachine.Wpf/Services/SysRunService.cs | 9 +- .../ViewModels/CANConfigViewModel.cs | 9 +- .../ViewModels/DialogEditProViewModel.cs | 14 +- CapMachine.Wpf/ViewModels/FooterViewModel.cs | 4 +- .../ViewModels/LinConfigViewModel.cs | 9 +- CapMachine.Wpf/ViewModels/MonitorViewModel.cs | 50 +++++- .../ViewModels/ProConfigViewModel.cs | 23 +-- CapMachine.Wpf/Views/CANConfigView.xaml | 2 +- CapMachine.Wpf/Views/DialogEditProView.xaml | 74 ++++++--- CapMachine.Wpf/Views/FooterView.xaml | 91 +++++++++++ CapMachine.Wpf/Views/MonitorView.xaml | 24 ++- CapMachine.Wpf/Views/ProConfigView.xaml | 2 +- 23 files changed, 536 insertions(+), 101 deletions(-) create mode 100644 CapMachine.Wpf/Converts/BoolFinishStrConvert.cs create mode 100644 CapMachine.Wpf/Models/SysExdBoolInfo.cs diff --git a/CapMachine.Wpf/App.xaml.cs b/CapMachine.Wpf/App.xaml.cs index e476066..b55b988 100644 --- a/CapMachine.Wpf/App.xaml.cs +++ b/CapMachine.Wpf/App.xaml.cs @@ -98,7 +98,7 @@ namespace CapMachine.Wpf //containerRegistry.RegisterSingleton(); //containerRegistry.RegisterSingleton(); - containerRegistry.RegisterSingleton(); + containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); ////注册设备服务 @@ -109,7 +109,7 @@ namespace CapMachine.Wpf containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); - + containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); @@ -211,7 +211,6 @@ namespace CapMachine.Wpf //appStart.CreateShell(); - //#region 初版 //Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN"); @@ -262,7 +261,7 @@ namespace CapMachine.Wpf //给当前的全局异常捕捉服务使用 LogService = ContainerLocator.Container.Resolve(); - LogService.Error("ex.ToString()"); + LogService.Error("Start-->OnInitialized"); base.OnInitialized(); //#endregion diff --git a/CapMachine.Wpf/Converts/BoolFinishStrConvert.cs b/CapMachine.Wpf/Converts/BoolFinishStrConvert.cs new file mode 100644 index 0000000..3184b12 --- /dev/null +++ b/CapMachine.Wpf/Converts/BoolFinishStrConvert.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace CapMachine.Wpf.Converts +{ + /// + /// Bool到完成字符串转换 + /// + public class BoolFinishStrConvert : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null) + return null; + + return (bool)value == true ? "完成" : "无"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return value; + } + } +} diff --git a/CapMachine.Wpf/Models/ComEnum.cs b/CapMachine.Wpf/Models/ComEnum.cs index e075a00..8f7b3e9 100644 --- a/CapMachine.Wpf/Models/ComEnum.cs +++ b/CapMachine.Wpf/Models/ComEnum.cs @@ -53,6 +53,11 @@ namespace CapMachine.Wpf.Models /// 字节 /// Byte = 0, + + /// + /// 字节 + /// + Bool = 4, } /// diff --git a/CapMachine.Wpf/Models/State/MachineRunState.cs b/CapMachine.Wpf/Models/State/MachineRunState.cs index 924f635..21fa9ea 100644 --- a/CapMachine.Wpf/Models/State/MachineRunState.cs +++ b/CapMachine.Wpf/Models/State/MachineRunState.cs @@ -20,7 +20,7 @@ namespace CapMachine.Wpf.Models /// /// 实例化 /// - public MachineRunState(string name, IEventAggregator eventAggregator, ConfigService configService) + public MachineRunState(string name, IEventAggregator eventAggregator, ConfigService configService, CanDriveService canDriveService, LinDriveService linDriveService) { Name = name; EventAggregator = eventAggregator; @@ -29,7 +29,7 @@ namespace CapMachine.Wpf.Models } - private string _RunStateMsg="等待"; + private string _RunStateMsg = "等待"; /// /// 运行状态 /// @@ -39,10 +39,27 @@ namespace CapMachine.Wpf.Models set { _RunStateMsg = value; RaisePropertyChanged(); } } + private bool _IsRunState; + /// + /// 是否运行状态 + /// + public bool IsRunState + { + get { return _IsRunState; } + set { _IsRunState = value; RaisePropertyChanged(); } + } + + + private bool _IsProLoad; /// /// PLC程序是否下载 /// - public bool IsProLoad { get; set; } + public bool IsProLoad + { + get { return _IsProLoad; } + set { _IsProLoad = value; RaisePropertyChanged(); } + } + /// /// 状态机 @@ -320,22 +337,33 @@ namespace CapMachine.Wpf.Models Console.WriteLine($"{Name}-StopExitCall"); } + /// + /// 进入停止状态 + /// private void StopEntryCall() { RunStateMsg = "停止"; Console.WriteLine($"{Name}-StopEntryCall"); + + } private void RunExitCall() { + //退出运行状态 + IsRunState = false; Console.WriteLine($"{Name}-RunExitCall"); } + /// + /// 进入运行状态 + /// private void RunEntryCall() { RunStateMsg = "运行"; Console.WriteLine($"{Name}-RunEntryCall"); - + //进入运行状态 + IsRunState = true; } private void AlarmExitCall() @@ -376,5 +404,7 @@ namespace CapMachine.Wpf.Models public string Name { get; set; } public IEventAggregator EventAggregator { get; } public ConfigService ConfigService { get; } + public CanDriveService CanDriveService { get; } + public LinDriveService LinDriveService { get; } } } diff --git a/CapMachine.Wpf/Models/SysExdBoolInfo.cs b/CapMachine.Wpf/Models/SysExdBoolInfo.cs new file mode 100644 index 0000000..c212f9f --- /dev/null +++ b/CapMachine.Wpf/Models/SysExdBoolInfo.cs @@ -0,0 +1,39 @@ +using CapMachine.Wpf.Models.Tag; +using HslCommunication.Profinet.Siemens; +using Prism.Mvvm; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CapMachine.Wpf.Models +{ + /// + /// 布尔的拓展信息 + /// + public class SysExdBoolInfo:BindableBase + { + public SysExdBoolInfo(SiemensS7Net siemensS7Net) + { + QuickTags = new List() + { + new QuickTag(siemensS7Net) { Name = "开始状态", Group = "状态", Unit = "", ValueAddress = "V40.0", Precision = 0, ValueType = ComEnum.DataType.Bool, ByteLength = 1 }, + }; + + StartRunStateQuickTag = QuickTags.Find(a=>a.Name== "开始状态")!; + + } + + + /// + /// 快速标签 + /// + public List QuickTags { get; set; } + + /// + /// 开始运行状态标签 + /// + public QuickTag StartRunStateQuickTag { get; set; } + } +} diff --git a/CapMachine.Wpf/Models/Tag/QuickTag.cs b/CapMachine.Wpf/Models/Tag/QuickTag.cs index c263533..2ddce24 100644 --- a/CapMachine.Wpf/Models/Tag/QuickTag.cs +++ b/CapMachine.Wpf/Models/Tag/QuickTag.cs @@ -47,14 +47,19 @@ namespace CapMachine.Wpf.Models.Tag private object? _Value; /// /// 实时值 + /// 这样会不会导致内存泄露 /// public object? Value { get { return _Value; } set { - _Value = value; - ValueStr = value?.ToString(); + if (!value.Equals(_Value) ) + { + _Value = value; + RaisePropertyChanged(); + ValueStr = value?.ToString(); + } } } @@ -81,6 +86,9 @@ namespace CapMachine.Wpf.Models.Tag case DataType.Byte: Value = SiemensS7Net.ByteTransform.TransByte(value!.Content, 0); break; + case DataType.Bool: + Value = SiemensS7Net.ByteTransform.TransBool(value!.Content, 0); + break; default: break; } diff --git a/CapMachine.Wpf/ProPars/ProParsSongZhiHelper.cs b/CapMachine.Wpf/ProPars/ProParsSongZhiHelper.cs index 5e2e2f4..3db1da9 100644 --- a/CapMachine.Wpf/ProPars/ProParsSongZhiHelper.cs +++ b/CapMachine.Wpf/ProPars/ProParsSongZhiHelper.cs @@ -198,6 +198,16 @@ namespace CapMachine.Wpf.ProPars //siemensS7NetStance.Write(); } + /// + /// 循环次数下载给PLC + /// + /// + /// + public static void LoadProCycleToPlc(SiemensS7Net siemensS7NetStance,int Cycle) + { + siemensS7NetStance.Write("VW230", (short)Cycle); + } + /// /// 单步骤程序解析 /// 单步骤里面包括多个仪表参数的配置信息 diff --git a/CapMachine.Wpf/Services/CanDriveService.cs b/CapMachine.Wpf/Services/CanDriveService.cs index 1ddec9b..42fd28c 100644 --- a/CapMachine.Wpf/Services/CanDriveService.cs +++ b/CapMachine.Wpf/Services/CanDriveService.cs @@ -143,9 +143,21 @@ namespace CapMachine.Wpf.Services { SpeedCanCmdData.SignalCmdValue = SpeedData; } + //if (EnableCanCmdData != null) + //{ + // EnableCanCmdData.SignalCmdValue = 1; + //} + } + + /// + /// 更新压缩机使能数据 + /// + /// + public void UpdateCapEnableCmdData(bool IsEnable) + { if (EnableCanCmdData != null) { - EnableCanCmdData.SignalCmdValue = 1; + EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; } } diff --git a/CapMachine.Wpf/Services/ConfigService.cs b/CapMachine.Wpf/Services/ConfigService.cs index 2a41798..6b0348f 100644 --- a/CapMachine.Wpf/Services/ConfigService.cs +++ b/CapMachine.Wpf/Services/ConfigService.cs @@ -118,10 +118,15 @@ namespace CapMachine.Wpf.Services } } + private bool _IsExpInfoOk; /// /// 试验信息是否OK /// - public bool IsExpInfoOk { get; set; } + public bool IsExpInfoOk + { + get { return _IsExpInfoOk; } + set { _IsExpInfoOk = value; RaisePropertyChanged(); } + } ///// ///// 当前的试验信息 diff --git a/CapMachine.Wpf/Services/LinDriveService.cs b/CapMachine.Wpf/Services/LinDriveService.cs index 08063a1..1763f4b 100644 --- a/CapMachine.Wpf/Services/LinDriveService.cs +++ b/CapMachine.Wpf/Services/LinDriveService.cs @@ -141,9 +141,22 @@ namespace CapMachine.Wpf.Services { SpeedLinCmdData.SignalCmdValue = SpeedData; } + //if (EnableLinCmdData != null) + //{ + // EnableLinCmdData.SignalCmdValue = 1; + //} + } + + + /// + /// 更新压缩机使能数据 + /// + /// + public void UpdateCapEnableCmdData(bool IsEnable) + { if (EnableLinCmdData != null) { - EnableLinCmdData.SignalCmdValue = 1; + EnableLinCmdData.SignalCmdValue = IsEnable ? 1 : 0; } } diff --git a/CapMachine.Wpf/Services/MachineRtDataService.cs b/CapMachine.Wpf/Services/MachineRtDataService.cs index 70ac9e8..7c3fe62 100644 --- a/CapMachine.Wpf/Services/MachineRtDataService.cs +++ b/CapMachine.Wpf/Services/MachineRtDataService.cs @@ -6,10 +6,6 @@ using CapMachine.Wpf.Models.Tag; using CapMachine.Wpf.PrismEvent; using HslCommunication; using HslCommunication.Profinet.Siemens; -using ImTools; -using Microsoft.Extensions.Caching.Memory; -using NPOI.HSSF.Record.Chart; -using NPOI.SS.Formula.Atp; using Prism.Events; using Prism.Mvvm; using System; @@ -81,6 +77,11 @@ namespace CapMachine.Wpf.Services /// public SysExdInfo CurSysExdInfo { get; set; } + /// + /// 布尔拓展信息 + /// + public SysExdBoolInfo SysExdBoolInfos { get; set; } + ///// ///// Tag数据集合 ///// @@ -708,7 +709,7 @@ namespace CapMachine.Wpf.Services SVAddress = "", MVAddress = "", IsMeter = false, - Precision = 1, + Precision = 1000, DecimalPoint = 2, Samp = 1, ValueType = typeof(short), @@ -820,9 +821,9 @@ namespace CapMachine.Wpf.Services ListHandSwitchData = new List() { new HandSwitchData(){Name="自动",ActionAddress="M0.0",StateAddress="M0.0" }, - new HandSwitchData(){Name="抽真空",ActionAddress="M0.1",StateAddress="M0.1" }, - new HandSwitchData(){Name="复位",ActionAddress="M0.2",StateAddress="M0.2" }, - new HandSwitchData(){Name="消音",ActionAddress="M0.3",StateAddress="M0.3" }, + new HandSwitchData(){Name="抽真空",ActionAddress="M0.1",StateAddress="V15.2" }, + //new HandSwitchData(){Name="复位",ActionAddress="M0.2",StateAddress="M0.2" },放到上侧的按钮区域了 + //new HandSwitchData(){Name="消音",ActionAddress="M0.3",StateAddress="M0.3" },放到上侧的按钮区域了 new HandSwitchData(){Name="HV电源",ActionAddress="M1.1",StateAddress="Q0.1" }, new HandSwitchData(){Name="HV启动",ActionAddress="M1.2",StateAddress="Q0.6" }, new HandSwitchData(){Name="LV电源",ActionAddress="M1.3",StateAddress="Q0.2" }, @@ -866,7 +867,7 @@ namespace CapMachine.Wpf.Services //拓展的参数信息 CurSysExdInfo = new SysExdInfo(SiemensDrive); - + SysExdBoolInfos = new SysExdBoolInfo(SiemensDrive); //PubRtDataStart(); } @@ -958,21 +959,44 @@ namespace CapMachine.Wpf.Services } } + /// /// 程序暂停 + /// 取反 /// /// public bool SysPause() { - var Result = SiemensDrive.Write("M0.6", true); - if (Result.IsSuccess) + var StateResult = SiemensDrive.ReadBool("M0.6"); + if (StateResult.IsSuccess) { - return true; - } - else - { - return false; + if (StateResult.Content == true) + { + var Result = SiemensDrive.Write("M0.6", false); + if (Result.IsSuccess) + { + return true; + } + else + { + return false; + } + } + else + { + var Result = SiemensDrive.Write("M0.6", true); + if (Result.IsSuccess) + { + return true; + } + else + { + return false; + } + } } + + return false; } #endregion @@ -1069,6 +1093,11 @@ namespace CapMachine.Wpf.Services /// private OperateResult OperateResultAlarm { get; set; } + /// + /// CAP的使能状态 + /// + private OperateResult OperateResultCapEnable { get; set; } + /// /// 时间诊断 /// @@ -1155,18 +1184,18 @@ namespace CapMachine.Wpf.Services break; } } - else if(itemTag.Value.NameNoUnit == "通讯母线电压") + else if (itemTag.Value.NameNoUnit == "通讯母线电压") { switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin) { case CanLinEnum.Can: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)CanDriveService.GetDbcSpeedValueBySpeedName("通讯母线电压")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(CanDriveService.GetDbcValueByName("通讯母线电压") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; case CanLinEnum.Lin: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)LinDriveService.GetLdfSpeedValueBySpeedName("通讯母线电压")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(LinDriveService.GetLdfValueByName("通讯母线电压") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; default: @@ -1179,12 +1208,12 @@ namespace CapMachine.Wpf.Services { case CanLinEnum.Can: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)CanDriveService.GetDbcSpeedValueBySpeedName("通讯母线电流")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(CanDriveService.GetDbcValueByName("通讯母线电流") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; case CanLinEnum.Lin: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)LinDriveService.GetLdfSpeedValueBySpeedName("通讯母线电流")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(LinDriveService.GetLdfValueByName("通讯母线电流") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; default: @@ -1197,12 +1226,12 @@ namespace CapMachine.Wpf.Services { case CanLinEnum.Can: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)CanDriveService.GetDbcSpeedValueBySpeedName("通讯相电流")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(CanDriveService.GetDbcValueByName("通讯相电流") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; case CanLinEnum.Lin: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)LinDriveService.GetLdfSpeedValueBySpeedName("通讯相电流")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(LinDriveService.GetLdfValueByName("通讯相电流") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; default: @@ -1215,12 +1244,12 @@ namespace CapMachine.Wpf.Services { case CanLinEnum.Can: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)CanDriveService.GetDbcSpeedValueBySpeedName("通讯功率")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(CanDriveService.GetDbcValueByName("通讯功率") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; case CanLinEnum.Lin: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)LinDriveService.GetLdfSpeedValueBySpeedName("通讯功率")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(LinDriveService.GetLdfValueByName("通讯功率") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; default: @@ -1233,12 +1262,12 @@ namespace CapMachine.Wpf.Services { case CanLinEnum.Can: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)CanDriveService.GetDbcSpeedValueBySpeedName("通讯芯片温度")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(CanDriveService.GetDbcValueByName("通讯芯片温度") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; case CanLinEnum.Lin: //通信转速 Dbc中间配置名称的转速数据读取出来 给PLC - SiemensDrive.Write(itemTag.Value.PVAddress, (short)LinDriveService.GetLdfSpeedValueBySpeedName("通讯芯片温度")); + SiemensDrive.Write(itemTag.Value.PVAddress, (short)(LinDriveService.GetLdfValueByName("通讯芯片温度") * itemTag.Value.Precision)); //itemTag.Value.EngPvValue = 0; break; default: @@ -1300,8 +1329,23 @@ namespace CapMachine.Wpf.Services //在运行时,更新速度的SV的值 if (itemTag.Value.Name == "转速[rpm]" && SysRunService.MachineRunState1.RunStateMsg == "运行") { - //更新SV的速度值 - CanDriveService.UpdateSpeedCmdData(TagManger.GetTagByName(itemTag.Value.Name)!.EngSvValue); + switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin) + { + case CanLinEnum.Can: + //获取PLC的SV数据 更新SV的速度值到压缩机 + CanDriveService.UpdateSpeedCmdData(itemTag!.Value.EngSvValue); + //itemTag.Value.EngPvValue = 0; + break; + case CanLinEnum.Lin: + //获取PLC的SV数据 更新SV的速度值到压缩机 + LinDriveService.UpdateSpeedCmdData(itemTag!.Value.EngSvValue); + //itemTag.Value.EngPvValue = 0; + break; + default: + break; + } + ////更新SV的速度值 + //CanDriveService.UpdateSpeedCmdData(TagManger.GetTagByName(itemTag.Value.Name)!.EngSvValue); } } else @@ -1356,6 +1400,25 @@ namespace CapMachine.Wpf.Services if (item.StateOperateResult.IsSuccess) { item.State = item.StateOperateResult.Content; + //根据PLC得到执行的步骤数据,更新到CAN和LIN的数据 + if (item.Name!.Equals("使能")) + { + switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin) + { + case CanLinEnum.Can: + //获取PLC的使能状态,更新到CAN的使能状态 + CanDriveService.UpdateCapEnableCmdData(item.State); + //itemTag.Value.EngPvValue = 0; + break; + case CanLinEnum.Lin: + //获取PLC的使能状态,更新到LIN的使能状态 + LinDriveService.UpdateCapEnableCmdData(item.State); + //itemTag.Value.EngPvValue = 0; + break; + default: + break; + } + } } } @@ -1365,6 +1428,11 @@ namespace CapMachine.Wpf.Services itemQuickTag.OperateResultSource = SiemensDrive.Read(itemQuickTag.ValueAddress, itemQuickTag.ByteLength); } CurSysExdInfo.SumRunTime(); + //布尔拓展信息的展示 + foreach (var itemQuickTag in SysExdBoolInfos.QuickTags) + { + itemQuickTag.OperateResultSource = SiemensDrive.Read(itemQuickTag.ValueAddress, itemQuickTag.ByteLength); + } } catch (Exception ex) @@ -1374,7 +1442,7 @@ namespace CapMachine.Wpf.Services } DiagnosticsTime.Stop(); - ConfigService.PlcCycleTime = (int)DiagnosticsTime.Elapsed.TotalMilliseconds-300; + ConfigService.PlcCycleTime = (int)DiagnosticsTime.Elapsed.TotalMilliseconds - 300; //Console.WriteLine($"扫描时间:{DiagnosticsTime.Elapsed.TotalMilliseconds.ToString()}"); } }); @@ -1394,21 +1462,21 @@ namespace CapMachine.Wpf.Services try { await Task.Delay(1000); - _EventAggregator.GetEvent().Publish(new List() - { - new Models.ChartRtValue(){Name="EVA风量",Value=random.NextDouble()*100,Unit="℃"}, - new Models.ChartRtValue(){Name="中间轴转速",Value=random.NextDouble()*100,Unit="℃"}, - new Models.ChartRtValue(){Name="加热电力",Value=random.NextDouble()*100,Unit="℃"}, - new Models.ChartRtValue(){Name="加湿电力",Value=random.NextDouble()*100,Unit="℃"}, - new Models.ChartRtValue(){Name="EMPCV电流",Value=random.NextDouble()*100,Unit="℃"}, - new Models.ChartRtValue(){Name="INJ压力",Value=random.NextDouble()*100,Unit="℃"}, - new Models.ChartRtValue(){Name="冷媒流量",Value=random.NextDouble()*100,Unit="℃"}, - }); + //_EventAggregator.GetEvent().Publish(new List() + //{ + // new Models.ChartRtValue(){Name="EVA风量",Value=random.NextDouble()*100,Unit="℃"}, + // new Models.ChartRtValue(){Name="中间轴转速",Value=random.NextDouble()*100,Unit="℃"}, + // new Models.ChartRtValue(){Name="加热电力",Value=random.NextDouble()*100,Unit="℃"}, + // new Models.ChartRtValue(){Name="加湿电力",Value=random.NextDouble()*100,Unit="℃"}, + // new Models.ChartRtValue(){Name="EMPCV电流",Value=random.NextDouble()*100,Unit="℃"}, + // new Models.ChartRtValue(){Name="INJ压力",Value=random.NextDouble()*100,Unit="℃"}, + // new Models.ChartRtValue(){Name="冷媒流量",Value=random.NextDouble()*100,Unit="℃"}, + //}); } catch (Exception ex) { - var dd = 1; + } } diff --git a/CapMachine.Wpf/Services/SysRunService.cs b/CapMachine.Wpf/Services/SysRunService.cs index a38a417..5b842a4 100644 --- a/CapMachine.Wpf/Services/SysRunService.cs +++ b/CapMachine.Wpf/Services/SysRunService.cs @@ -14,7 +14,7 @@ namespace CapMachine.Wpf.Services /// public class SysRunService : BindableBase { - public SysRunService(IEventAggregator eventAggregator,ConfigService configService) + public SysRunService(IEventAggregator eventAggregator,ConfigService configService,CanDriveService canDriveService,LinDriveService linDriveService) { // 创建一个定时器,设置间隔时间为2000毫秒(即2秒) CurTimer = new System.Timers.Timer(5000); @@ -26,7 +26,9 @@ namespace CapMachine.Wpf.Services EventAggregator = eventAggregator; ConfigService = configService; - MachineRunState1 = new MachineRunState("M1", EventAggregator, ConfigService); + CanDriveService = canDriveService; + LinDriveService = linDriveService; + MachineRunState1 = new MachineRunState("M1", EventAggregator, ConfigService,canDriveService,linDriveService); } @@ -36,7 +38,6 @@ namespace CapMachine.Wpf.Services public MachineRunState MachineRunState1 { get; set; } - private void CurTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e) { CurDateTime = DateTime.Now; @@ -63,5 +64,7 @@ namespace CapMachine.Wpf.Services /// public IEventAggregator EventAggregator { get; } public ConfigService ConfigService { get; } + public CanDriveService CanDriveService { get; } + public LinDriveService LinDriveService { get; } } } diff --git a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs index 5b0d018..5b2c0dd 100644 --- a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs +++ b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs @@ -827,8 +827,13 @@ namespace CapMachine.Wpf.ViewModels { //打开连接 CanDriveService.ToomossCanDrive.StartCanDrive(); - //系统使用了CAN - ConfigService.CanLinRunStateModel.CurSysSelectedCanLin = CanLinEnum.Can; + //成功后状态显示 + if (CanDriveService.ToomossCanDrive.OpenState) + { + //系统使用了CAN + ConfigService.CanLinRunStateModel.CurSysSelectedCanLin = CanLinEnum.Can; + } + //CAN DBC配置 有DBC配置的话,则直接加载DBC信息 if (!string.IsNullOrEmpty(SelectCanLinConfigPro.CANConfigExd.DbcPath)) { diff --git a/CapMachine.Wpf/ViewModels/DialogEditProViewModel.cs b/CapMachine.Wpf/ViewModels/DialogEditProViewModel.cs index 33cf417..7e5df5d 100644 --- a/CapMachine.Wpf/ViewModels/DialogEditProViewModel.cs +++ b/CapMachine.Wpf/ViewModels/DialogEditProViewModel.cs @@ -22,6 +22,16 @@ namespace CapMachine.Wpf.ViewModels set { name = value; RaisePropertyChanged(); } } + private int _ProRepeat; + /// + /// 程序的循环次数 + /// + public int ProRepeat + { + get { return _ProRepeat; } + set { _ProRepeat = value; RaisePropertyChanged(); } + } + private DelegateCommand saveCmd; /// /// 保存命令 @@ -56,7 +66,8 @@ namespace CapMachine.Wpf.ViewModels DialogParameters pars = new DialogParameters { - { "Name", Name } + { "Name", Name }, + { "ProRepeat", ProRepeat } }; RaiseRequestClose(new DialogResult(ButtonResult.OK, pars)); @@ -97,6 +108,7 @@ namespace CapMachine.Wpf.ViewModels public override void OnDialogOpened(IDialogParameters parameters) { Name = parameters.GetValue("Name"); + ProRepeat= parameters.GetValue("ProRepeat"); } } diff --git a/CapMachine.Wpf/ViewModels/FooterViewModel.cs b/CapMachine.Wpf/ViewModels/FooterViewModel.cs index 4222513..3e065bb 100644 --- a/CapMachine.Wpf/ViewModels/FooterViewModel.cs +++ b/CapMachine.Wpf/ViewModels/FooterViewModel.cs @@ -15,12 +15,12 @@ namespace CapMachine.Wpf.ViewModels DataRecordService = dataRecordService; ConfigService = configService; MachineRtDataService = machineRtDataService; - SysService = sysService; + SysRunService = sysService; } public DataRecordService DataRecordService { get; } public ConfigService ConfigService { get; } public MachineRtDataService MachineRtDataService { get; } - public SysRunService SysService { get; } + public SysRunService SysRunService { get; } } } diff --git a/CapMachine.Wpf/ViewModels/LinConfigViewModel.cs b/CapMachine.Wpf/ViewModels/LinConfigViewModel.cs index f8fb10e..ff64529 100644 --- a/CapMachine.Wpf/ViewModels/LinConfigViewModel.cs +++ b/CapMachine.Wpf/ViewModels/LinConfigViewModel.cs @@ -818,8 +818,13 @@ namespace CapMachine.Wpf.ViewModels { //打开连接 LinDriveService.ToomossLinDrive.StartLinDrive(); - //系统使用了LIN - ConfigService.CanLinRunStateModel.CurSysSelectedCanLin = CanLinEnum.Lin; + //成功后状态显示 + if (LinDriveService.ToomossLinDrive.OpenState) + { + //系统使用了LIN + ConfigService.CanLinRunStateModel.CurSysSelectedCanLin = CanLinEnum.Lin; + } + //LIN LDF配置 有LDF配置的话,则直接加载LDF信息 if (!string.IsNullOrEmpty(SelectCanLinConfigPro.LINConfigExd.LdfPath)) { diff --git a/CapMachine.Wpf/ViewModels/MonitorViewModel.cs b/CapMachine.Wpf/ViewModels/MonitorViewModel.cs index 9ad8bdb..9b671a6 100644 --- a/CapMachine.Wpf/ViewModels/MonitorViewModel.cs +++ b/CapMachine.Wpf/ViewModels/MonitorViewModel.cs @@ -11,6 +11,7 @@ using Prism.Events; using Prism.Services.Dialogs; using System.Collections.ObjectModel; using System.Windows.Controls.Primitives; +using static CapMachine.Wpf.Models.ComEnum; namespace CapMachine.Wpf.ViewModels { @@ -26,7 +27,7 @@ namespace CapMachine.Wpf.ViewModels /// /// public MonitorViewModel(ConfigService configService, IEventAggregator eventAggregator, - DataRecordService dataRecordService, SysRunService sysRunService, AlarmService alarmService,PPCService pPCService, + DataRecordService dataRecordService, SysRunService sysRunService, AlarmService alarmService, PPCService pPCService,CanDriveService canDriveService,LinDriveService linDriveService, MachineRtDataService machineRtDataService, IDialogService dialogService) { ConfigService = configService; @@ -36,6 +37,8 @@ namespace CapMachine.Wpf.ViewModels SysRunServer = sysRunService; AlarmService = alarmService; PPCService = pPCService; + CanDriveService = canDriveService; + LinDriveService = linDriveService; MachineRtDataService = machineRtDataService; DialogService = dialogService; TagManager = MachineRtDataService.TagManger; @@ -71,6 +74,8 @@ namespace CapMachine.Wpf.ViewModels public SysRunService SysRunServer { get; } public AlarmService AlarmService { get; } public PPCService PPCService { get; } + public CanDriveService CanDriveService { get; } + public LinDriveService LinDriveService { get; } public MachineRtDataService MachineRtDataService { get; } public IDialogService DialogService { get; } public List ListChartRtValue { get; set; } = new List() @@ -230,17 +235,60 @@ namespace CapMachine.Wpf.ViewModels this.SysRunServer.MachineRunState1.FireEnd(); DataRecordService.EndRecord(); + + //结束运行的时候,需要将压缩机的速度值设置为0 + switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin) + { + case CanLinEnum.Can: + //获取PLC的SV数据 更新SV的速度值到压缩机 + CanDriveService.UpdateSpeedCmdData(0); + //itemTag.Value.EngPvValue = 0; + break; + case CanLinEnum.Lin: + //获取PLC的SV数据 更新SV的速度值到压缩机 + LinDriveService.UpdateSpeedCmdData(0); + //itemTag.Value.EngPvValue = 0; + break; + default: + break; + } + + break; case "复位": MachineRtDataService.SysReset(); this.SysRunServer.MachineRunState1.FireReset(); DataRecordService.EndRecord(); + + //结束运行的时候,需要将压缩机的速度值设置为0 + switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin) + { + case CanLinEnum.Can: + //获取PLC的SV数据 更新SV的速度值到压缩机 + CanDriveService.UpdateSpeedCmdData(0); + //itemTag.Value.EngPvValue = 0; + break; + case CanLinEnum.Lin: + //获取PLC的SV数据 更新SV的速度值到压缩机 + LinDriveService.UpdateSpeedCmdData(0); + //itemTag.Value.EngPvValue = 0; + break; + default: + break; + } + break; case "消音": MachineRtDataService.SysMute(); + //ShowDialogExpInfo(); + break; + case "暂停": + + MachineRtDataService.SysPause(); + //ShowDialogExpInfo(); break; case "试验信息": diff --git a/CapMachine.Wpf/ViewModels/ProConfigViewModel.cs b/CapMachine.Wpf/ViewModels/ProConfigViewModel.cs index bf819fe..74c32b4 100644 --- a/CapMachine.Wpf/ViewModels/ProConfigViewModel.cs +++ b/CapMachine.Wpf/ViewModels/ProConfigViewModel.cs @@ -389,23 +389,26 @@ namespace CapMachine.Wpf.ViewModels } //弹窗 - DialogService.ShowDialog("DialogEditProView", new DialogParameters() { { "Name", SelectedProgramSeg.Name } }, (par) => + DialogService.ShowDialog("DialogEditProView", new DialogParameters() { { "Name", SelectedProgramSeg.Name }, { "ProRepeat", SelectedProgramSeg.ProRepeat } }, (par) => { if (par.Result == ButtonResult.OK) { //程序名称 var ReturnValue = par.Parameters.GetValue("Name"); - //查询是否重复 - var count = FreeSql.Select().Where(a => a.Name == ReturnValue).Count(); - if (count > 0) - { - MessageBox.Show("名称已经存在了"); - return; - } + var ReturnProRepeat = par.Parameters.GetValue("ProRepeat"); + + ////查询是否重复,可能只更改了次数,所以不再校验名称是否改变 + //var count = FreeSql.Select().Where(a => a.Name == ReturnValue).Count(); + //if (count > 0) + //{ + // MessageBox.Show("名称已经存在了"); + // return; + //} //开始修改 var InsertedData = FreeSql.Update() .Set(a => a.Name, ReturnValue) + .Set(a => a.ProRepeat, ReturnProRepeat) .Where(a => a.Id == SelectedProgramSeg.Id) .ExecuteUpdated(); @@ -2355,7 +2358,8 @@ namespace CapMachine.Wpf.ViewModels { //执行程序的步骤集合数据 ReturnPlcParsData = ProParsSongZhiHelper.GetPlcParsData(FindData.ProSteps, FindData.ProRepeat); - + //把次数给PLC,那么此时应该是最后一个程序给PLC了 + ProParsSongZhiHelper.LoadProCycleToPlc(MachineRtDataService.SiemensDrive, FindData.ProRepeat); } } @@ -2365,6 +2369,7 @@ namespace CapMachine.Wpf.ViewModels ReturnPlcParsData = ProParsSongZhiHelper.LoadPlcCellAddress(ReturnPlcParsData); ProParsSongZhiHelper.LoadDataToPLC(MachineRtDataService.SiemensDrive, ReturnPlcParsData); + //下载完成的话,则标记状态 SysRunService.MachineRunState1.IsProLoad = true; } diff --git a/CapMachine.Wpf/Views/CANConfigView.xaml b/CapMachine.Wpf/Views/CANConfigView.xaml index 8db8f8e..5d5b52e 100644 --- a/CapMachine.Wpf/Views/CANConfigView.xaml +++ b/CapMachine.Wpf/Views/CANConfigView.xaml @@ -933,7 +933,7 @@ - + diff --git a/CapMachine.Wpf/Views/DialogEditProView.xaml b/CapMachine.Wpf/Views/DialogEditProView.xaml index 7b0b5a6..5beb729 100644 --- a/CapMachine.Wpf/Views/DialogEditProView.xaml +++ b/CapMachine.Wpf/Views/DialogEditProView.xaml @@ -14,31 +14,63 @@ - - + - + Orientation="Horizontal"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +