using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using HMIToolkit; using TwinCAT.TypeSystem; using Heisig.HMI.AdsManager; namespace InfineonHMI { public sealed partial class UnitDetailsControlVM : ObservableObject, IDisposable { [ObservableProperty] private float rVoltage; [ObservableProperty] private E_COMPONENT_STATUS status; [ObservableProperty] private AnalogValueVM pressureNegolytSegmentInVM; [ObservableProperty] private AnalogValueVM pressureNegolytTankInVM; [ObservableProperty] private AnalogValueVM temperatureNegolytTankInVM; [ObservableProperty] private AnalogValueVM pressurePosolytSegmentInVM; [ObservableProperty] private AnalogValueVM pressurePosolytTankInVM; [ObservableProperty] private AnalogValueVM temperaturePosolytTankInVM; [ObservableProperty] private bool canOpenBothValves; [ObservableProperty] private bool canCloseBothValves; [ObservableProperty] private short feedbackOpenValves; [ObservableProperty] private short feedbackCloseValves; [ObservableProperty] private bool canStartBothPumps; [ObservableProperty] private bool canStopBothPumps; [ObservableProperty] private short feedbackStartPumps; [ObservableProperty] private short feedbackStopPumps; private float _posolytPumpOnSpeed; private float _negolytPumpOnSpeed; private float valveWindowHorizontalPosition; private readonly BinaryValveControlVM _valveNegolytVM; private readonly BinaryValveControlVM _valvePosolytVM; private readonly AnalogMotorControlVM _pumpNegolytVM; private readonly AnalogMotorControlVM _pumpPosolytVM; private BinaryValveWindow? _windowValveNegolyt; private BinaryValveWindow? _windowValvePosolyt; private AnalogMotorWindow? _windowPumpNegolyt; private AnalogMotorWindow? _windowPumpPosolyt; private readonly IAdsManager? _adsManager; private readonly string _variableName; public UnitDetailsControlVM() { Status = E_COMPONENT_STATUS.OFF; rVoltage = 0.0f; _variableName = ""; // Negolyt PressureNegolytSegmentInVM = new AnalogValueVM(); PressureNegolytTankInVM = new AnalogValueVM(); TemperatureNegolytTankInVM = new AnalogValueVM(); _valveNegolytVM = new BinaryValveControlVM(); _pumpNegolytVM = new AnalogMotorControlVM(); _windowValveNegolyt = null; // Posolyt PressurePosolytSegmentInVM = new AnalogValueVM(); PressurePosolytTankInVM = new AnalogValueVM(); TemperaturePosolytTankInVM = new AnalogValueVM(); _valvePosolytVM = new BinaryValveControlVM(); _pumpPosolytVM = new AnalogMotorControlVM(); _windowValvePosolyt = null; valveWindowHorizontalPosition = 10; } public UnitDetailsControlVM(IAdsManager adsManager, string variableName) { _adsManager = adsManager; _variableName = variableName; Status = E_COMPONENT_STATUS.OFF; rVoltage = 0.0f; // Negolyt PressureNegolytSegmentInVM = new AnalogValueVM(_adsManager, _variableName + ".stP21", true); PressureNegolytTankInVM = new AnalogValueVM(_adsManager, _variableName + ".stP22", true); TemperatureNegolytTankInVM = new AnalogValueVM(_adsManager, _variableName + ".stT21", true); _valveNegolytVM = new BinaryValveControlVM(_adsManager, _variableName + ".stNS22"); _valveNegolytVM.OpenButton.FeedbackChanged += OnValveNegolytOpenFeedbackChanged; _valveNegolytVM.CloseButton.FeedbackChanged += OnValveNegolytCloseFeedbackChanged; _valveNegolytVM.OpenButton.ReleaseChanged += OnValveNegolytOpenReleaseChanged; _valveNegolytVM.CloseButton.ReleaseChanged += OnValveNegolytCloseReleaseChanged; _pumpNegolytVM = new AnalogMotorControlVM(_adsManager, _variableName + ".stNS21"); _pumpNegolytVM.StartButton.FeedbackChanged += OnPumpNegolytStartFeedbackChanged; _pumpNegolytVM.StopButton.FeedbackChanged += OnPumpNegolytStopFeedbackChanged; _pumpNegolytVM.StartButton.ReleaseChanged += OnPumpNegolytStartReleaseChanged; _pumpNegolytVM.StopButton.ReleaseChanged += OnPumpNegolytStopReleaseChanged; // Posolyt PressurePosolytSegmentInVM = new AnalogValueVM(_adsManager, _variableName + ".stP11", true); PressurePosolytTankInVM = new AnalogValueVM(_adsManager, _variableName + ".stP12", true); TemperaturePosolytTankInVM = new AnalogValueVM(_adsManager, _variableName + ".stT11", true); _valvePosolytVM = new BinaryValveControlVM(_adsManager, _variableName + ".stNS12"); _valvePosolytVM.OpenButton.FeedbackChanged += OnValvePosolytOpenFeedbackChanged; _valvePosolytVM.CloseButton.FeedbackChanged += OnValvePosolytCloseFeedbackChanged; _valvePosolytVM.OpenButton.ReleaseChanged += OnValvePosolytOpenReleaseChanged; _valvePosolytVM.CloseButton.ReleaseChanged += OnValvePosolytCloseReleaseChanged; _pumpPosolytVM = new AnalogMotorControlVM(_adsManager, _variableName + ".stNS11"); _pumpPosolytVM.StartButton.FeedbackChanged += OnPumpPosolytStartFeedbackChanged; _pumpPosolytVM.StopButton.FeedbackChanged += OnPumpPosolytStopFeedbackChanged; _pumpPosolytVM.StartButton.ReleaseChanged += OnPumpPosolytStartReleaseChanged; _pumpPosolytVM.StopButton.ReleaseChanged += OnPumpPosolytStopReleaseChanged; // Current status _adsManager.Register(_variableName + ".eStatus", StatusChanged); _adsManager.Register(_variableName + ".rVoltage", VoltageChanged); // Configured pump speed for on _adsManager.Register("GVL_CONFIG.rPumpNegolytOnPower", NegolytPumpOnSpeedChanged); _adsManager.Register("GVL_CONFIG.rPumpPosolytOnPower", PosolytPumpOnSpeedChanged); valveWindowHorizontalPosition = 10; } private void NegolytPumpOnSpeedChanged(object? sender, ValueChangedEventArgs e) { _negolytPumpOnSpeed = (float)e.Value; } private void PosolytPumpOnSpeedChanged(object? sender, ValueChangedEventArgs e) { _posolytPumpOnSpeed = (float)e.Value; } private void VoltageChanged(object? sender, ValueChangedEventArgs e) { RVoltage = (float)e.Value; } public void Dispose() { // Dispose all necessary view models // Negolyt PressureNegolytSegmentInVM.Dispose(); PressureNegolytTankInVM.Dispose(); TemperatureNegolytTankInVM.Dispose(); _valveNegolytVM.OpenButton.FeedbackChanged -= OnValveNegolytOpenFeedbackChanged; _valveNegolytVM.CloseButton.FeedbackChanged -= OnValveNegolytCloseFeedbackChanged; _valveNegolytVM.OpenButton.ReleaseChanged -= OnValveNegolytOpenReleaseChanged; _valveNegolytVM.CloseButton.ReleaseChanged -= OnValveNegolytCloseReleaseChanged; _valveNegolytVM.Dispose(); _pumpNegolytVM.Dispose(); // Posolyt PressurePosolytSegmentInVM.Dispose(); PressurePosolytTankInVM.Dispose(); TemperaturePosolytTankInVM.Dispose(); _valvePosolytVM.OpenButton.FeedbackChanged -= OnValvePosolytOpenFeedbackChanged; _valvePosolytVM.CloseButton.FeedbackChanged -= OnValvePosolytCloseFeedbackChanged; _valvePosolytVM.OpenButton.ReleaseChanged -= OnValvePosolytOpenReleaseChanged; _valvePosolytVM.CloseButton.ReleaseChanged -= OnValvePosolytCloseReleaseChanged; _valvePosolytVM.Dispose(); _pumpPosolytVM.Dispose(); // Deregister variables _adsManager?.Deregister(_variableName + ".eStatus", StatusChanged); _adsManager?.Deregister(_variableName + ".rVoltage", VoltageChanged); _adsManager?.Deregister("GVL_CONFIG.rPumpNegolytOnPower", NegolytPumpOnSpeedChanged); _adsManager?.Deregister("GVL_CONFIG.rPumpPosolytOnPower", PosolytPumpOnSpeedChanged); // Destroy windows _windowValveNegolyt?.Close(); _windowValvePosolyt?.Close(); _windowPumpNegolyt?.Close(); _windowPumpPosolyt?.Close(); } private void StatusChanged(object? sender, ValueChangedEventArgs e) { Status = (E_COMPONENT_STATUS)((short)e.Value); } [RelayCommand] private void ShowValveNegolyt() { if (_adsManager != null && _windowValveNegolyt == null) { _windowValveNegolyt = new() { DataContext = _valveNegolytVM }; _windowValveNegolyt.Closed += WindowValveNegolyt_Closed; _windowValveNegolyt.Show(); } } private void WindowValveNegolyt_Closed(object? sender, EventArgs e) { _windowValveNegolyt!.Close(); _windowValveNegolyt = null; } [RelayCommand] private void ShowValvePosolyt() { if (_adsManager != null && _windowValvePosolyt == null) { _windowValvePosolyt = new() { DataContext = _valvePosolytVM }; _windowValvePosolyt.Closed += WindowValvePosolyt_Closed; _windowValvePosolyt.Show(); } } private void WindowValvePosolyt_Closed(object? sender, EventArgs e) { _windowValvePosolyt!.Close(); _windowValvePosolyt = null; } [RelayCommand] public void ShowPumpNegolyt() { if (_adsManager != null && _windowPumpNegolyt == null) { _windowPumpNegolyt = new() { DataContext = _pumpNegolytVM }; _windowPumpNegolyt.Closed += WindowPumpNegolyt_Closed; _windowPumpNegolyt.Show(); } } private void WindowPumpNegolyt_Closed(object? sender, EventArgs e) { _windowPumpNegolyt!.Close(); _windowPumpNegolyt = null; } [RelayCommand] public void ShowPumpPosolyt() { if (_adsManager != null && _windowPumpPosolyt == null) { _windowPumpPosolyt = new() { DataContext = _pumpPosolytVM }; _windowPumpPosolyt.Closed += WindowPumpPosolyt_Closed; _windowPumpPosolyt.Show(); } } [RelayCommand] private void OpenBothValves() { _valveNegolytVM.OpenButton?.ButtonClickedCommand.Execute(null); _valvePosolytVM.OpenButton?.ButtonClickedCommand.Execute(null); } [RelayCommand] private void CloseBothValves() { _valveNegolytVM.CloseButton?.ButtonClickedCommand.Execute(null); _valvePosolytVM.CloseButton?.ButtonClickedCommand.Execute(null); } private void OnValveNegolytOpenFeedbackChanged(object? sender, EventArgs e) { CalculateOpenFeedback(); } private void OnValvePosolytOpenFeedbackChanged(object? sender, EventArgs e) { CalculateOpenFeedback(); } private void CalculateOpenFeedback() { if (_valveNegolytVM?.OpenButton.IFeedback == 1 && _valvePosolytVM?.OpenButton.IFeedback == 1) FeedbackOpenValves = 1; else if (_valveNegolytVM?.OpenButton.IFeedback == 0 && _valvePosolytVM?.OpenButton.IFeedback == 0) FeedbackOpenValves = 0; else FeedbackOpenValves = 2; } private void OnValveNegolytCloseFeedbackChanged(object? sender, EventArgs e) { CalculateCloseFeedback(); } private void OnValvePosolytCloseFeedbackChanged(object? sender, EventArgs e) { CalculateCloseFeedback(); } private void CalculateCloseFeedback() { if (_valveNegolytVM?.CloseButton.IFeedback == 1 && _valvePosolytVM?.CloseButton.IFeedback == 1) FeedbackCloseValves = 1; else if (_valveNegolytVM?.CloseButton.IFeedback == 0 && _valvePosolytVM?.CloseButton.IFeedback == 0) FeedbackCloseValves = 0; else FeedbackCloseValves = 2; } private void OnValveNegolytOpenReleaseChanged(object? sender, EventArgs e) { CalculateOpenRelease(); } private void OnValvePosolytOpenReleaseChanged(object? sender, EventArgs e) { CalculateOpenRelease(); } private void CalculateOpenRelease() { if (_valvePosolytVM == null || _valveNegolytVM == null) return; if (_valveNegolytVM.OpenButton.XRelease && _valvePosolytVM.OpenButton.XRelease) CanOpenBothValves = true; else CanOpenBothValves = false; } private void OnValveNegolytCloseReleaseChanged(object? sender, EventArgs e) { CalculateCloseRelease(); } private void OnValvePosolytCloseReleaseChanged(object? sender, EventArgs e) { CalculateCloseRelease(); } private void CalculateCloseRelease() { if (_valvePosolytVM == null || _valveNegolytVM == null) return; if (_valveNegolytVM.CloseButton.XRelease && _valvePosolytVM.CloseButton.XRelease) CanCloseBothValves = true; else CanCloseBothValves = false; } [RelayCommand] private void StartBothPumps() { if (_adsManager == null || _pumpNegolytVM == null || _pumpPosolytVM == null) return; _pumpNegolytVM.Setpoint.RValue = _negolytPumpOnSpeed; _pumpPosolytVM.Setpoint.RValue = _posolytPumpOnSpeed; _pumpNegolytVM.StartButton?.ButtonClickedCommand.Execute(null); _pumpPosolytVM.StartButton?.ButtonClickedCommand.Execute(null); } [RelayCommand] private void StopBothPumps() { _pumpNegolytVM.StopButton?.ButtonClickedCommand.Execute(null); _pumpPosolytVM.StopButton?.ButtonClickedCommand.Execute(null); } private void CalculateStartRelease() { if (_pumpNegolytVM == null || _pumpPosolytVM == null) return; if (_pumpNegolytVM.StartButton.XRelease && _pumpPosolytVM.StartButton.XRelease) CanStartBothPumps = true; else CanStartBothPumps = false; } private void CalculatStopRelease() { if (_pumpNegolytVM == null || _pumpPosolytVM == null) return; if (_pumpNegolytVM.StopButton.XRelease && _pumpPosolytVM.StopButton.XRelease) CanStopBothPumps = true; else CanStopBothPumps = false; } private void CalculateStartFeedback() { if (_pumpNegolytVM == null || _pumpPosolytVM == null) return; if (_pumpNegolytVM.StartButton.IFeedback == 1 && _pumpPosolytVM.StartButton.IFeedback == 1) FeedbackStartPumps = 1; else if (_pumpNegolytVM.StartButton.IFeedback == 0 && _pumpPosolytVM.StartButton.IFeedback == 0) FeedbackStartPumps = 0; else FeedbackStartPumps = 2; } private void CalculateStopFeedback() { if (_pumpNegolytVM == null || _pumpPosolytVM == null) return; if (_pumpNegolytVM.StopButton.IFeedback == 1 && _pumpPosolytVM.StopButton.IFeedback == 1) FeedbackStopPumps = 1; else if (_pumpNegolytVM.StopButton.IFeedback == 0 && _pumpPosolytVM.StopButton.IFeedback == 0) FeedbackStopPumps = 0; else FeedbackStopPumps = 2; } private void OnPumpPosolytStopReleaseChanged(object? sender, EventArgs e) { CalculatStopRelease(); } private void OnPumpPosolytStartReleaseChanged(object? sender, EventArgs e) { CalculateStartRelease(); } private void OnPumpPosolytStopFeedbackChanged(object? sender, EventArgs e) { CalculateStopFeedback(); } private void OnPumpPosolytStartFeedbackChanged(object? sender, EventArgs e) { CalculateStartFeedback(); } private void OnPumpNegolytStopReleaseChanged(object? sender, EventArgs e) { CalculatStopRelease(); } private void OnPumpNegolytStartReleaseChanged(object? sender, EventArgs e) { CalculateStartRelease(); } private void OnPumpNegolytStopFeedbackChanged(object? sender, EventArgs e) { CalculateStopFeedback(); } private void OnPumpNegolytStartFeedbackChanged(object? sender, EventArgs e) { CalculateStartFeedback(); } private void WindowPumpPosolyt_Closed(object? sender, EventArgs e) { _windowPumpPosolyt!.Close(); _windowPumpPosolyt = null; } } }