Files
CapMachine/CapMachine.Wpf/ViewModels/MonitorViewModel.cs
2025-06-23 20:17:07 +08:00

755 lines
26 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using CapMachine.Core;
using CapMachine.Shared.Controls;
using CapMachine.Wpf.Dtos;
using CapMachine.Wpf.Models;
using CapMachine.Wpf.Models.Tag;
using CapMachine.Wpf.PrismEvent;
using CapMachine.Wpf.Services;
using ImTools;
using Prism.Commands;
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
{
public class MonitorViewModel : NavigationViewModel
{
/// <summary>
/// 实例化函数
/// </summary>
/// <param name="configService"></param>
/// <param name="eventAggregator"></param>
/// <param name="dataRecordService"></param>
/// <param name="sysRunService"></param>
/// <param name="machineRtDataService"></param>
/// <param name="dialogService"></param>
public MonitorViewModel(ConfigService configService, IEventAggregator eventAggregator,
DataRecordService dataRecordService, SysRunService sysRunService, AlarmService alarmService, PPCService pPCService, CanDriveService canDriveService, LinDriveService linDriveService,
ProRuntimeService proRuntimeService,
MachineRtDataService machineRtDataService, IDialogService dialogService)
{
ConfigService = configService;
//事件服务
_EventAggregator = eventAggregator;
DataRecordService = dataRecordService;
SysRunServer = sysRunService;
AlarmService = alarmService;
PPCService = pPCService;
CanDriveService = canDriveService;
LinDriveService = linDriveService;
ProRuntimeService = proRuntimeService;
MachineRtDataService = machineRtDataService;
DialogService = dialogService;
TagManager = MachineRtDataService.TagManger;
_EventAggregator.GetEvent<ChartRtEvent>().Subscribe(GetChartRtEvent);
_EventAggregator.GetEvent<ProRunEvent>().Subscribe(GetProRunEvent);
//赋值实例化
ListHandSwitchData = MachineRtDataService.ListHandSwitchData;
//ListTag = new ObservableCollection<ITag>(TagManager.DicTags.Values.ToList());
RefreshListTag();
ListMeterTag = TagManager.DicTags.Values.Where(a => a.Group == "程序").OrderBy(a => a.Id).ToList();
SpeedTag = TagManager.DicTags.GetValueOrDefault("转速[rpm]");
ExPressTag = TagManager.DicTags.GetValueOrDefault("排气压力[BarA]");
ExTempTag = TagManager.DicTags.GetValueOrDefault("排气温度[℃]");
InhPressTag = TagManager.DicTags.GetValueOrDefault("吸气压力[BarA]");
InhTempTag = TagManager.DicTags.GetValueOrDefault("吸气温度[℃]");
Cond1TempT4Tag = TagManager.DicTags.GetValueOrDefault("COND1入口温度T4[℃]");
VRVTag = TagManager.DicTags.GetValueOrDefault("冷媒流量[kg/h]");
LubeFlowTag = TagManager.DicTags.GetValueOrDefault("润滑油流量[kg/h]");
Cond2TempTag = TagManager.DicTags.GetValueOrDefault("COND2温度[℃]");
TxvFrPressP3Tag = TagManager.DicTags.GetValueOrDefault("阀前压力P3[BarA]");
TxvFrTempT3Tag = TagManager.DicTags.GetValueOrDefault("阀前温度T3[℃]");
SubcoolingTag = TagManager.DicTags.GetValueOrDefault("过冷度[K]");
ComCapBusVolTag = TagManager.DicTags.GetValueOrDefault("通讯母线电压[V]");
ComCapBusCurTag = TagManager.DicTags.GetValueOrDefault("通讯母线电流[A]");
ComCapPwTag = TagManager.DicTags.GetValueOrDefault("通讯功率[W]");
//OS2TempTag = TagManager.DicTags.GetValueOrDefault("吸气混合器温度[℃]");
//TxvFrTempTag = TagManager.DicTags.GetValueOrDefault("膨胀阀前温度[℃]");
//TxvFrPressTag = TagManager.DicTags.GetValueOrDefault("膨胀阀前压力[BarA]");
//Cond1TempTag = TagManager.DicTags.GetValueOrDefault("冷凝器出口水温[℃]");
//CondInTempTag = TagManager.DicTags.GetValueOrDefault("冷凝器进口温度[℃]");
}
public ConfigService ConfigService { get; }
private IEventAggregator _EventAggregator { get; set; }
public DataRecordService DataRecordService { get; }
public SysRunService SysRunServer { get; }
public AlarmService AlarmService { get; }
public PPCService PPCService { get; }
public CanDriveService CanDriveService { get; }
public LinDriveService LinDriveService { get; }
public ProRuntimeService ProRuntimeService { get; }
public MachineRtDataService MachineRtDataService { get; }
public IDialogService DialogService { get; }
public List<ChartRtValue> ListChartRtValue { get; set; } = new List<ChartRtValue>()
{
new ChartRtValue(){ Name="温度",Value=12.3,Unit="℃"},
new ChartRtValue(){ Name="压力",Value=12.3,Unit="bar"},
new ChartRtValue(){ Name="湿度",Value=12.3,Unit="%"},
};
private List<string> _FilterGroups = new List<string> { "程序", "采集", "压缩机", "计算" };
/// <summary>
/// 动态过滤(支持运行时更改过滤条件)
/// </summary>
public List<string> FilterGroups
{
get => _FilterGroups;
set
{
_FilterGroups = value;
RaisePropertyChanged();
RefreshListTag(); // 更新ListTag
}
}
/// <summary>
/// 动态过滤ListTag支持运行时更改过滤条件
/// </summary>
private void RefreshListTag()
{
ListTag = new ObservableCollection<ITag>(
TagManager.DicTags.Values.Where(tag =>
FilterGroups.Contains(tag.Group) || FilterGroups.Count == 0
).OrderBy(a => a.Id).ToList()
);
}
private ObservableCollection<ITag> _ListTag;
/// <summary>
/// 标签集合信息
/// </summary>
public ObservableCollection<ITag> ListTag
{
get { return _ListTag; }
set { _ListTag = value; RaisePropertyChanged(); }
}
private List<ITag> _ListMeterTag;
/// <summary>
/// 标签集合信息 仪表的参数
/// </summary>
public List<ITag> ListMeterTag
{
get { return _ListMeterTag; }
set { _ListMeterTag = value; RaisePropertyChanged(); }
}
/// <summary>
/// 标签中心
/// </summary>
public TagManager TagManager { get; set; }
//// <summary>
///// 手自动切换集合数据
///// </summary>
public List<HandSwitchData> ListHandSwitchData { get; set; }
/// <summary>
/// 复位标签
/// </summary>
public HandSwitchData ResetTag { get; set; }
/// <summary>
/// 消音标签
/// </summary>
public HandSwitchData MuteTag { get; set; }
#region
/// <summary>
/// 转速标签
/// </summary>
public ITag SpeedTag { get; set; }
/// <summary>
/// 排气压力
/// </summary>
public ITag ExPressTag { get; set; }
/// <summary>
/// 排气温度
/// </summary>
public ITag ExTempTag { get; set; }
/// <summary>
/// 吸气压力
/// </summary>
public ITag InhPressTag { get; set; }
/// <summary>
/// 吸气温度
/// </summary>
public ITag InhTempTag { get; set; }
/// <summary>
/// 通讯母线电压
/// </summary>
public ITag ComCapBusVolTag { get; set; }
/// <summary>
/// 通讯母线电流
/// </summary>
public ITag ComCapBusCurTag { get; set; }
/// <summary>
/// 通讯功率
/// </summary>
public ITag ComCapPwTag { get; set; }
/// <summary>
/// 吸气混合器温度
/// </summary>
public ITag OS2TempTag { get; set; }
/// <summary>
/// 膨胀阀前温度
/// </summary>
public ITag TxvFrTempTag { get; set; }
/// <summary>
/// 膨胀阀前压力
/// </summary>
public ITag TxvFrPressTag { get; set; }
/// <summary>
/// 冷凝器出口水温
/// </summary>
public ITag Cond1TempT4Tag { get; set; }
/// <summary>
/// 冷媒流量
/// </summary>
public ITag VRVTag { get; set; }
/// <summary>
/// 润滑油流量
/// </summary>
public ITag LubeFlowTag { get; set; }
/// <summary>
/// COND2温度
/// </summary>
public ITag Cond2TempTag { get; set; }
/// <summary>
/// 阀前压力P3
/// </summary>
public ITag TxvFrPressP3Tag { get; set; }
/// <summary>
/// 阀前温度T3[℃]
/// </summary>
public ITag TxvFrTempT3Tag { get; set; }
/// <summary>
/// 过冷度[K]
/// </summary>
public ITag SubcoolingTag { get; set; }
/// <summary>
/// 冷凝器进口温度
/// </summary>
public ITag CondInTempTag { get; set; }
#endregion
private DelegateCommand<string> _OperCmd;
/// <summary>
/// 操作指令你
/// </summary>
public DelegateCommand<string> OperCmd
{
set
{
_OperCmd = value;
}
get
{
if (_OperCmd == null)
{
_OperCmd = new DelegateCommand<string>((p) => OperCmdCall(p));
}
return _OperCmd;
}
}
/// <summary>
/// 操作指令执行方法
/// </summary>
/// <exception cref="NotImplementedException"></exception>
private void OperCmdCall(string Par)
{
switch (Par)
{
case "开始":
//查看是否处于自动的状态,否则无法开始
if (ListHandSwitchData.FindFirst(a=>a.Name== "自动")!=null && ListHandSwitchData.FindFirst(a => a.Name == "自动").State==false)
{
System.Windows.MessageBox.Show("需要在【自动】的情况下进行开始操作");
return;
}
//状态机运行 用状态机的状态判断逻辑
if (this.ProRuntimeService.MachineRunState1.FireStart())
{
//程序步骤执行开始运行
ProRuntimeService.StartProRun();
//运行 一些PLC的状态写入
MachineRtDataService.SysStart();
//开始记录数据
DataRecordService.StartRecord();
}
break;
case "结束":
//状态机结束 用状态机的状态判断逻辑
if (this.ProRuntimeService.MachineRunState1.FireEnd())
{
//程序步骤执行结束运行
ProRuntimeService.EndProRun();
//结束 一些PLC的状态写入
MachineRtDataService.SysEnd();
//结束记录数据
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 "复位":
//复位 一些PLC的状态写入
MachineRtDataService.SysReset();
////状态机 复位 用状态机的状态判断逻辑
//if (this.ProRuntimeService.MachineRunState1.FireReset())
//{
// //程序步骤执行结束运行
// ProRuntimeService.EndProRun();
// //复位 一些PLC的状态写入
// MachineRtDataService.SysReset();
// //结束记录数据
// 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 "暂停":
//状态机 暂停 用状态机的状态判断逻辑
if (this.ProRuntimeService.MachineRunState1.FirePause())
{
//程序步骤执行暂停运行
ProRuntimeService.PauseProRun();
//暂停 一些PLC的状态写入
MachineRtDataService.SysPause();
}
break;
case "继续":
//状态机 继续 用状态机的状态判断逻辑
if (this.ProRuntimeService.MachineRunState1.FireContinue())
{
//程序步骤执行继续运行
ProRuntimeService.ContinueProRun();
//继续 一些PLC的状态写入
MachineRtDataService.SysContinue();
}
//ShowDialogExpInfo();
break;
case "试验信息":
ShowDialogExpInfo();
break;
case "SuperHeatCool":
//ShowSuperHeatCool();
break;
default:
break;
}
}
/// <summary>
/// 程序运行的状态
/// 来自于程序的自动调度执行
/// </summary>
/// <param name="msg"></param>
/// <exception cref="NotImplementedException"></exception>
private void GetProRunEvent(ProRunEventMsg msg)
{
switch (msg.Msg)
{
case "执行完毕":
OperCmdCall("结束");
break;
default:
break;
}
}
private DelegateCommand<object> _AutoHandCmd;
/// <summary>
/// 操作指令你
/// </summary>
public DelegateCommand<object> AutoHandCmd
{
set
{
_AutoHandCmd = value;
}
get
{
if (_AutoHandCmd == null)
{
_AutoHandCmd = new DelegateCommand<object>((p) => AutoHandCmdCall(p));
}
return _AutoHandCmd;
}
}
/// <summary>
/// 操作指令执行方法
/// </summary>
/// <exception cref="NotImplementedException"></exception>
private void AutoHandCmdCall(object Par)
{
if (Par != null && Par is Meter)
{
//True-手动False-自动
var MeterControl = (Meter)Par;
Console.WriteLine($"{MeterControl.MeterName}-{MeterControl.AutoHandState}");
//
foreach (var item in TagManager.DicTags)
{
//用无单位的比较
if (item.Value.NameNoUnit == MeterControl.MeterName)
{
if (TagManager.TryGetShortControlTagByName(item.Value.Name, out ShortControlTag? shortControlTag))
{
if (!string.IsNullOrEmpty(shortControlTag!.MVAutoHandModel.Address))
{
var Result = MachineRtDataService.SiemensDrive.Write(shortControlTag!.MVAutoHandModel.Address, MeterControl.AutoHandState == true ? (short)1 : (short)0);
}
}
break;
}
}
}
}
private DelegateCommand<object> _ExdCmd;
/// <summary>
/// 拓展操作指令
/// </summary>
public DelegateCommand<object> ExdCmd
{
set
{
_ExdCmd = value;
}
get
{
if (_ExdCmd == null)
{
_ExdCmd = new DelegateCommand<object>((p) => ExdCmdCall(p));
}
return _ExdCmd;
}
}
/// <summary>
/// 操作指令执行方法
/// </summary>
/// <exception cref="NotImplementedException"></exception>
private void ExdCmdCall(object Par)
{
if (Par != null && Par is Meter)
{
//
var MeterControl = (Meter)Par;
//Console.WriteLine($"{MeterControl.MeterName}-{MeterControl.AutoHandState}");
if (!MeterControl.MeterName.Contains("PTC功率")) return;
//弹窗
DialogService.ShowDialog("DialogMeterExdView", new DialogParameters() { { "MeterCmdMsg", new MeterCmdMsg() { Name = MeterControl.MeterName, Par = "SV2" } } }, (par) =>
{
if (par.Result == ButtonResult.OK)
{
//试验信息
var ListChartTabGroupDto = par.Parameters.GetValue<ExpInfoDto>("ReturnValue");
}
else if (par.Result == ButtonResult.Cancel)
{
//取消
}
});
}
}
private DelegateCommand<object> _HandValueCmd;
/// <summary>
/// 手动给值
/// </summary>
public DelegateCommand<object> HandValueCmd
{
set
{
_HandValueCmd = value;
}
get
{
if (_HandValueCmd == null)
{
_HandValueCmd = new DelegateCommand<object>((p) => HandValueCmdCall(p));
}
return _HandValueCmd;
}
}
/// <summary>
/// 手动给值执行方法
/// </summary>
/// <exception cref="NotImplementedException"></exception>
private void HandValueCmdCall(object Par)
{
if (Par != null && Par is MeterChannelValue)
{
var ChannelValue = (MeterChannelValue)Par;
Console.WriteLine($"{ChannelValue.Name}-{ChannelValue.Value}-{ChannelValue.Type}");
//
foreach (var item in TagManager.DicTags)
{
//用无单位的比较
if (item.Value.NameNoUnit == ChannelValue.Name)
{
switch (ChannelValue.Type)
{
case "MV"://10的倍率
if (TagManager.TryGetMVModel(item.Value.Name, out MeterValueAttrCell? MvcontrolAttrCell))
{
if (!string.IsNullOrEmpty(MvcontrolAttrCell!.Address))
{
var Result = MachineRtDataService.SiemensDrive.Write(MvcontrolAttrCell!.Address, (short)((double)ChannelValue.Value * 10));
break;
}
}
break;
case "SV":
if (TagManager.TryGetSVModel(item.Value.Name, out MeterValueAttrCell? sVcontrolAttrCell))
{
if (!string.IsNullOrEmpty(sVcontrolAttrCell!.Address))
{
var Result = MachineRtDataService.SiemensDrive.Write(sVcontrolAttrCell!.Address, (short)((double)ChannelValue.Value * item.Value.Precision));
break;
}
}
break;
default:
break;
}
}
}
}
}
private int _HandValueParameter = 80;
/// <summary>
/// 手动的值,直接和控件绑定,初始的时候用,也可以用做更新采集的数据到界面上
/// 当前是所有的控件都绑定的
/// </summary>
public int HandValueParameter
{
get { return _HandValueParameter; }
set { _HandValueParameter = value; RaisePropertyChanged(); }
}
private DelegateCommand<object> _HandEnableCmd;
/// <summary>
/// 阀门的手自动切换
/// </summary>
public DelegateCommand<object> HandEnableCmd
{
set
{
_HandEnableCmd = value;
}
get
{
if (_HandEnableCmd == null)
{
_HandEnableCmd = new DelegateCommand<object>((p) => HandEnableCmdCall(p));
}
return _HandEnableCmd;
}
}
/// <summary>
/// 操作指令执行方法
/// </summary>
/// <exception cref="NotImplementedException"></exception>
private void HandEnableCmdCall(object Par)
{
if (Par != null && Par is ToggleButton)
{
var ControlData = Par as ToggleButton;
var Name = ControlData.ToolTip;
var Data = ControlData.IsChecked;
//ToDo cmd
var FindData = ListHandSwitchData.FirstOrDefault(a => a.Name == Name);
if (FindData != null)
{
if (Name == "自动")
{
//手动切换是可以自由的切换,不受限制
//ToDo
Console.WriteLine($"{FindData.Name}-{FindData.ActionAddress}-{FindData.StateAddress}-{Data}");
var Result = MachineRtDataService.SiemensDrive.Write(FindData.ActionAddress, (bool)Data);
if (Result.IsSuccess)
{
}
}
else
{
//其他的手自动切换受条件过滤处理
if (!MachineRtDataService.AutoHandSwtichConditionState.IsCanSwitch)
{
System.Windows.MessageBox.Show("当前的切换需要在【手动】和【无报警】的情况下进行");
return;
}
//满足条件进行操作只进行True操作,PLC会处理的
Console.WriteLine($"{FindData.Name}-{FindData.ActionAddress}-{FindData.StateAddress}-{Data}");
var Result = MachineRtDataService.SiemensDrive.Write(FindData.ActionAddress, true);
if (Result.IsSuccess)
{
}
}
//FindData.State = false;
}
}
}
/// <summary>
/// 试验信息弹窗
/// </summary>
private void ShowDialogExpInfo()
{
//弹窗
DialogService.ShowDialog("DialogExpInfoView", new DialogParameters() { { "Name", "" } }, (par) =>
{
if (par.Result == ButtonResult.OK)
{
//试验信息
var ListChartTabGroupDto = par.Parameters.GetValue<ExpInfoDto>("ReturnValue");
}
else if (par.Result == ButtonResult.Cancel)
{
//取消
}
});
}
/// <summary>
/// 获取曲线的实时值
/// 数据是发布过来
/// </summary>
/// <param name="value"></param>
/// <exception cref="NotImplementedException"></exception>
private void GetChartRtEvent(List<ChartRtValue> RtData)
{
//ListChartRtValue = RtData;
}
}
}