using Common; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Heisig.HMI.AdsManager; using InfineonHMI.Common; using InfineonHMI.Model; using Microsoft.Win32; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Printing; using System.Runtime.InteropServices.JavaScript; using System.Windows; using System.Windows.Automation; using System.Windows.Input; using System.Xml.Linq; using TwinCAT.PlcOpen; namespace InfineonHMI; public sealed partial class ReceipePageVM : ObservableValidator, IDisposable { #region Properties private AdsManager _adsManager; private int maxFlowNodes = 10; private int maxTrayPositions = 20; private int maxEtcherRobotPositions = 20; private bool flowreceipeCollectionChanged = false; private bool trayPositionsCollectionChanged = false; private bool etcherRobotStepsCollectionChanged = false; private void NewData(object? sender, PropertyChangedEventArgs e) { if ( CameraProgramsVm.IsChanged || ChucksVm.IsChanged || GripperVm.IsChanged || DiameterVm.IsChanged || ThicknessVm.IsChanged || RestingTimeHotplateVm.IsChanged || TargetTemperatureHotplateVm.IsChanged || RestingTimeCoolplateVm.IsChanged || TargetTemperatureCoolplateVm.IsChanged || PermissibleBeamParamDeviationsVm.IsChanged || TimeIntervallBeamCheckVm.IsChanged || RadialPosLowerWaterJetVm.IsChanged || ChuckRpmVm.IsChanged || HvmaxTestCurrentVm.IsChanged || Hvn2PrePurgeTimeVm.IsChanged || HvnumRetriesVm.IsChanged || HvpolarityVm.IsChanged || HvrampTimeVm.IsChanged || HvtestFrequencyVm.IsChanged || HvTestOkCurrentVm.IsChanged || HvTestOkVoltageVm.IsChanged || HvtestTemperatureVm.IsChanged || HvtestVoltageVm.IsChanged || HvtestPressureN2Vm.IsChanged || FlowStationsVm.IsChanged || FlowReceipe.IsChanged|| trayPositionsCollectionChanged || etcherRobotStepsCollectionChanged || flowreceipeCollectionChanged) { DataSendToPlc = false; DataSaved = false; } } [ObservableProperty] private ObservableCollection trayPositions; [ObservableProperty] private ParamControlIntVm cameraProgramsVm = new(); [ObservableProperty] private ParamControlIntVm chucksVm = new(); [ObservableProperty] private ParamControlIntVm gripperVm = new(); [ObservableProperty] private ParamControlFloatVm permissibleBeamParamDeviationsVm = new(); [ObservableProperty] private ParamControlFloatVm diameterVm = new(); [ObservableProperty] private ParamControlFloatVm thicknessVm = new(); [ObservableProperty] private ParamControlFloatVm timeIntervallBeamCheckVm = new(); [ObservableProperty] private ParamControlFloatVm restingTimeHotplateVm = new(); [ObservableProperty] private ParamControlFloatVm targetTemperatureHotplateVm = new(); [ObservableProperty] private ParamControlFloatVm restingTimeCoolplateVm = new(); [ObservableProperty] private ParamControlFloatVm targetTemperatureCoolplateVm = new(); [ObservableProperty] private ParamControlFloatVm hvtestVoltageVm = new(); [ObservableProperty] private ParamControlFloatVm hvmaxTestCurrentVm = new(); [ObservableProperty] private ParamControlFloatVm hvrampTimeVm = new(); [ObservableProperty] private ParamControlFloatVm hvtestFrequencyVm = new(); [ObservableProperty] private ParamControlIntVm hvpolarityVm = new(); [ObservableProperty] private ParamControlFloatVm hvtestPressureN2Vm = new(); [ObservableProperty] private ParamControlFloatVm hvn2PrePurgeTimeVm = new(); [ObservableProperty] private ParamControlIntVm hvnumRetriesVm = new(); [ObservableProperty] private ParamControlFloatVm hvtestTemperatureVm = new(); [ObservableProperty] private ParamControlFloatVm hvTestOkVoltageVm = new(); [ObservableProperty] private ParamControlFloatVm hvTestOkCurrentVm = new(); [ObservableProperty] private ParamControlIntVm numberRobotPositionsVm = new(); [ObservableProperty] private ParamControlFloatVm chuckRpmVm = new(); [ObservableProperty] private ObservableCollection etcherRobotSteps; [ObservableProperty] private ParamControlFloatVm radialPosLowerWaterJetVm = new(); [ObservableProperty] private ParamControlIntVm flowNodeCountVm = new(); [ObservableProperty] private bool dataSaved; [ObservableProperty] private bool dataSendToPlc; #endregion Properties #region FlowReceipe [ObservableProperty] private FlowStationsViewModelBase flowStationsVm = new (); [ObservableProperty] private FlowReceipe flowReceipe = new(); // [ObservableProperty] private ObservableCollection flowReceipeEntries; [RelayCommand] public void AddFlowReceipeEntry() { var nodeid = FlowReceipe.FlowReceipeEntries.Count; FlowReceipe.FlowReceipeEntries.Add(new FlowReceipeEntry { NodeId = nodeid, MaxRetries = 0, NextNodeFail = -1, NextNodeSuccess = -1, NextNodeRetry = -1, Priority = 100, Station = FlowStationsVm.FlowStations[0] }); if (FlowReceipe.FlowReceipeEntries.Count >= maxFlowNodes) { CanAddFlowReceipeEntry = false; } if (FlowReceipe.FlowReceipeEntries.Count > 0) { CanRemoveFlowReceipeEntry = true; } } private void addFlowReceipeEntry(FlowReceipeEntry fre) { var nodeid = FlowReceipe.FlowReceipeEntries.Count; FlowReceipe.FlowReceipeEntries.Add(new FlowReceipeEntry { NodeId = nodeid, MaxRetries = fre.MaxRetries, NextNodeFail = fre.NextNodeFail, NextNodeSuccess = fre.NextNodeSuccess, NextNodeRetry = fre.NextNodeRetry, Priority = fre.Priority, Station = new StationEntry(fre.Station.EStation, fre.Station.SName) }); } [RelayCommand] public void RemoveFlowReceipeEntry() { FlowReceipe.FlowReceipeEntries.Remove(SelectedFlowReceipeEntry); var receipes = new ObservableCollection(FlowReceipe.FlowReceipeEntries); FlowReceipe.FlowReceipeEntries.Clear(); foreach (var receipe in receipes) addFlowReceipeEntry(receipe); if (FlowReceipe.FlowReceipeEntries.Count < maxFlowNodes) { CanAddFlowReceipeEntry = true; } if (FlowReceipe.FlowReceipeEntries.Count > 0) { CanRemoveFlowReceipeEntry = true; } else { CanRemoveFlowReceipeEntry = false; } } [RelayCommand] public void FlowReceipeEntryUp() { var selectedIndex = FlowReceipe.FlowReceipeEntries.IndexOf(SelectedFlowReceipeEntry); if (selectedIndex == 0) return; FlowReceipe.FlowReceipeEntries.Move(selectedIndex, selectedIndex - 1); var receipes = new ObservableCollection(FlowReceipe.FlowReceipeEntries); FlowReceipe.FlowReceipeEntries.Clear(); foreach (var receipe in receipes) addFlowReceipeEntry(receipe); } [RelayCommand] public void FlowReceipeEntryDown() { var selectedIndex = FlowReceipe.FlowReceipeEntries.IndexOf(SelectedFlowReceipeEntry); if (selectedIndex >= FlowReceipe.FlowReceipeEntries.Count) return; FlowReceipe.FlowReceipeEntries.Move(selectedIndex, selectedIndex + 1); var receipes = new ObservableCollection(FlowReceipe.FlowReceipeEntries); FlowReceipe.FlowReceipeEntries.Clear(); foreach (var receipe in receipes) addFlowReceipeEntry(receipe); } [ObservableProperty] private bool canAddFlowReceipeEntry; [ObservableProperty] private bool canRemoveFlowReceipeEntry; [ObservableProperty] private FlowReceipeEntry selectedFlowReceipeEntry; #endregion Flowreceipe #region Trayposition [ObservableProperty] private TrayPosition selectedTrayPosition; [ObservableProperty] private bool canAddTrayPosition; [ObservableProperty] private bool canRemoveTrayPosition; [RelayCommand] public void AddTrayPosition() { var posId = TrayPositions.Count; TrayPositions.Add(new TrayPosition { PosId = posId, PosX = 0.0f, PosY = 0.0f, }); if (TrayPositions.Count >= maxTrayPositions) { CanAddTrayPosition = false; } if (TrayPositions.Count > 0) { CanRemoveTrayPosition = true; } } private void addTrayPosition(TrayPosition trayPos) { var posId = TrayPositions.Count; TrayPositions.Add(new TrayPosition { PosId = posId, PosX = trayPos.PosX, PosY = trayPos.PosY }); } [RelayCommand] public void RemoveTrayPosition() { TrayPositions.Remove(SelectedTrayPosition); var positions = new ObservableCollection(TrayPositions); TrayPositions.Clear(); foreach (var position in positions) addTrayPosition(position); if (TrayPositions.Count < maxTrayPositions) { CanAddTrayPosition = true; } if (TrayPositions.Count > 0) { CanRemoveTrayPosition = true; } else { CanRemoveTrayPosition = false; } } [RelayCommand] public void TrayPositionUp() { var selectedIndex = TrayPositions.IndexOf(SelectedTrayPosition); if (selectedIndex == 0) return; TrayPositions.Move(selectedIndex, selectedIndex - 1); var positions = new ObservableCollection(TrayPositions); TrayPositions.Clear(); foreach (var pos in positions) addTrayPosition(pos); } [RelayCommand] public void TrayPositionDown() { var selectedIndex = TrayPositions.IndexOf(SelectedTrayPosition); if (selectedIndex >= TrayPositions.Count) return; TrayPositions.Move(selectedIndex, selectedIndex + 1); var positions = new ObservableCollection(TrayPositions); TrayPositions.Clear(); foreach (var pos in positions) addTrayPosition(pos); } #endregion Traypositions #region EtcherRobotPositions [ObservableProperty] private EtcherRobotStepData selectedEtchRobotStep; [ObservableProperty] private bool canAddEtchRobotStep; [ObservableProperty] private bool canRemoveEtchRobotStep; [RelayCommand] public void AddEtchRobotStep() { EtcherRobotSteps.Add(new EtcherRobotStepData() { PosX = 0.0f, PosY = 0.0f, PosZ = 0.0f, MoveSpeed = 0.0f, AngleAlpha = 0.0f, WaterFromAbove = false, WaterFromBelow = false, Medium = 0, Delay = 0.0f }); if (EtcherRobotSteps.Count >= maxEtcherRobotPositions) { CanAddEtchRobotStep = false; } if (EtcherRobotSteps.Count > 0) { CanRemoveEtchRobotStep = true; } } private void addEtchRobotStep(EtcherRobotStepData etchStep) { var posId = EtcherRobotSteps.Count; EtcherRobotSteps.Add(new EtcherRobotStepData() { PosX = etchStep.PosX, PosY = etchStep.PosY, PosZ = etchStep.PosZ, MoveSpeed = etchStep.MoveSpeed, AngleAlpha = etchStep.AngleAlpha, WaterFromAbove = etchStep.WaterFromAbove, WaterFromBelow = etchStep.WaterFromBelow, Medium = etchStep.Medium, Delay = etchStep.Delay }); } [RelayCommand] public void RemoveEtchRobotStep() { EtcherRobotSteps.Remove(SelectedEtchRobotStep); var steps = new ObservableCollection(EtcherRobotSteps); EtcherRobotSteps.Clear(); foreach (var step in steps) addEtchRobotStep(step); if (EtcherRobotSteps.Count < maxEtcherRobotPositions) { CanAddEtchRobotStep = true; } if (EtcherRobotSteps.Count > 0) { CanRemoveEtchRobotStep = true; } else { CanRemoveEtchRobotStep = false; } } [RelayCommand] public void EtchRobotStepUp() { var selectedIndex = EtcherRobotSteps.IndexOf(SelectedEtchRobotStep); if (selectedIndex == 0) return; EtcherRobotSteps.Move(selectedIndex, selectedIndex - 1); var steps = new ObservableCollection(EtcherRobotSteps); EtcherRobotSteps.Clear(); foreach (var step in steps) addEtchRobotStep(step); } [RelayCommand] public void EtchRobotStepDown() { var selectedIndex = EtcherRobotSteps.IndexOf(SelectedEtchRobotStep); if (selectedIndex >= EtcherRobotSteps.Count) return; EtcherRobotSteps.Move(selectedIndex, selectedIndex + 1); var steps = new ObservableCollection(EtcherRobotSteps); EtcherRobotSteps.Clear(); foreach (var step in steps) addEtchRobotStep(step); } #endregion #region Commands private void AcceptChanges() { CameraProgramsVm.AcceptChanges(); ChucksVm.AcceptChanges(); GripperVm.AcceptChanges(); DiameterVm.AcceptChanges(); ThicknessVm.AcceptChanges(); RestingTimeHotplateVm.AcceptChanges(); TargetTemperatureHotplateVm.AcceptChanges(); RestingTimeCoolplateVm.AcceptChanges(); TargetTemperatureCoolplateVm.AcceptChanges(); PermissibleBeamParamDeviationsVm.AcceptChanges(); TimeIntervallBeamCheckVm.AcceptChanges(); RadialPosLowerWaterJetVm.AcceptChanges(); ChuckRpmVm.AcceptChanges(); HvmaxTestCurrentVm.AcceptChanges(); Hvn2PrePurgeTimeVm.AcceptChanges(); HvnumRetriesVm.AcceptChanges(); HvpolarityVm.AcceptChanges(); HvrampTimeVm.AcceptChanges(); HvtestFrequencyVm.AcceptChanges(); HvTestOkCurrentVm.AcceptChanges(); HvTestOkVoltageVm.AcceptChanges(); HvtestTemperatureVm.AcceptChanges(); HvtestVoltageVm.AcceptChanges(); HvtestPressureN2Vm.AcceptChanges(); FlowReceipe.AcceptChanges(); } [RelayCommand] public void DiscardChanges() { CameraProgramsVm.DiscardChanges(); ChucksVm.DiscardChanges(); GripperVm.DiscardChanges(); DiameterVm.DiscardChanges(); ThicknessVm.DiscardChanges(); RestingTimeHotplateVm.DiscardChanges(); TargetTemperatureHotplateVm.DiscardChanges(); RestingTimeCoolplateVm.DiscardChanges(); TargetTemperatureCoolplateVm.DiscardChanges(); PermissibleBeamParamDeviationsVm.DiscardChanges(); TimeIntervallBeamCheckVm.DiscardChanges(); RadialPosLowerWaterJetVm.DiscardChanges(); ChuckRpmVm.DiscardChanges(); HvmaxTestCurrentVm.DiscardChanges(); Hvn2PrePurgeTimeVm.DiscardChanges(); HvnumRetriesVm.DiscardChanges(); HvpolarityVm.DiscardChanges(); HvrampTimeVm.DiscardChanges(); HvtestFrequencyVm.DiscardChanges(); HvTestOkCurrentVm.DiscardChanges(); HvTestOkVoltageVm.DiscardChanges(); HvtestTemperatureVm.DiscardChanges(); HvtestVoltageVm.DiscardChanges(); HvtestPressureN2Vm.DiscardChanges(); FlowReceipe.DiscardChanges(); } [RelayCommand] public void WriteToPlc() { SendDataToPLC(); DataSendToPlc = true; } [RelayCommand] public void LoadFromPlc() { ReadDataFromPLC(); DataSendToPlc = true; } [RelayCommand] public void ReadReceipeFile() { var dlg = new OpenFileDialog(); if (dlg.ShowDialog() != true) return; var dto = new ReceipeDto(); dto.Read(dlg.FileName); GetDto(dto); DataSaved = true; AcceptChanges(); } [RelayCommand] public void WriteReceipeFile() { var dlg = new SaveFileDialog(); if (dlg.ShowDialog() != true) return; var dto = SetDto(); dto.Write(dlg.FileName); DataSaved = true; AcceptChanges(); } #endregion Commands #region ctor public ReceipePageVM() { // Just for Designer maxFlowNodes = 10; maxEtcherRobotPositions = 10; maxTrayPositions = 10; InitializePropertiesEx(); InitializePropertyChangedMethod(); } public ReceipePageVM(AdsManager adsManager) { _adsManager = adsManager; InitializePropertiesEx(); InitializePropertyChangedMethod(); var val = _adsManager.ReadValue("GVL_Scheduler.MAX_RECIPE_NODES"); maxFlowNodes = (val == null) ? 10 : (int)val; val = _adsManager.ReadValue("GVL_ETCHER.MAX_ROBOT_POS"); maxEtcherRobotPositions = (val == null) ? 10 : (int)val; val = _adsManager.ReadValue("GVL_ETCHER.MAX_ROBOT_POS"); maxTrayPositions = (val == null) ? 10 : (int)val; } private void InitializePropertyChangedMethod() { CameraProgramsVm.PropertyChanged += NewData; ChucksVm.PropertyChanged += NewData; GripperVm.PropertyChanged += NewData; DiameterVm.PropertyChanged += NewData; ThicknessVm.PropertyChanged += NewData; RestingTimeHotplateVm.PropertyChanged += NewData; TargetTemperatureHotplateVm.PropertyChanged += NewData; RestingTimeCoolplateVm.PropertyChanged += NewData; TargetTemperatureCoolplateVm.PropertyChanged += NewData; PermissibleBeamParamDeviationsVm.PropertyChanged += NewData; TimeIntervallBeamCheckVm.PropertyChanged += NewData; RadialPosLowerWaterJetVm.PropertyChanged += NewData; ChuckRpmVm.PropertyChanged += NewData; HvmaxTestCurrentVm.PropertyChanged += NewData; Hvn2PrePurgeTimeVm.PropertyChanged += NewData; HvnumRetriesVm.PropertyChanged += NewData; HvpolarityVm.PropertyChanged += NewData; HvrampTimeVm.PropertyChanged += NewData; HvtestFrequencyVm.PropertyChanged += NewData; HvTestOkCurrentVm.PropertyChanged += NewData; HvTestOkVoltageVm.PropertyChanged += NewData; HvtestTemperatureVm.PropertyChanged += NewData; HvtestVoltageVm.PropertyChanged += NewData; HvtestPressureN2Vm.PropertyChanged += NewData; FlowStationsVm.PropertyChanged += NewData; FlowReceipe.PropertyChanged += NewData; TrayPositions.CollectionChanged += TrayPositionCollectionChangedEvent; EtcherRobotSteps.CollectionChanged += EtcherRobotStepsCollectionChangedEvent; FlowReceipe.FlowReceipeEntries.CollectionChanged += FlowReceipeCollectionChangedEvent; } private void EtcherRobotStepsCollectionChangedEvent(object? obj, NotifyCollectionChangedEventArgs e) { etcherRobotStepsCollectionChanged = true; NewData(obj, new PropertyChangedEventArgs("FlowReceipe")); } private void TrayPositionCollectionChangedEvent(object? obj, NotifyCollectionChangedEventArgs e) { trayPositionsCollectionChanged = true; NewData(obj, new PropertyChangedEventArgs("FlowReceipe")); } private void FlowReceipeCollectionChangedEvent(object? obj, NotifyCollectionChangedEventArgs e) { flowreceipeCollectionChanged = true; NewData(obj, new PropertyChangedEventArgs("FlowReceipe")); } private void InitializePropertiesEx() { FlowStationsVm.FlowStations.Add(new(Stationenum.EINGABE, "Eingabetray")); FlowStationsVm.FlowStations.Add(new(Stationenum.QRCODE, "QR Code Scan")); FlowStationsVm.FlowStations.Add(new(Stationenum.AUSRICHTEN, "Ausrichten")); FlowStationsVm.FlowStations.Add(new(Stationenum.AETZEN, "Ätzstation 1/2")); FlowStationsVm.FlowStations.Add(new(Stationenum.HEIZPLATTE, "Heizplatte")); FlowStationsVm.FlowStations.Add(new(Stationenum.KUEHLPLATTE, "Kühlplatte")); FlowStationsVm.FlowStations.Add(new(Stationenum.HOCHVOLTHEISS, "Hochvolt Heiss")); FlowStationsVm.FlowStations.Add(new(Stationenum.HOCHVOLTKALT, "Hochvolt Kalt")); FlowStationsVm.FlowStations.Add(new(Stationenum.AUSGABE, "Ausgabetray")); FlowStationsVm.FlowStations.Add(new(Stationenum.NIOSTATION, "NIO Station")); TrayPositions = new(); EtcherRobotSteps = new(); FlowReceipe.FlowReceipeEntries = new(); CameraProgramsVm.SName = "Kameraprogramme: "; ChucksVm.SName = "Drehteller: "; GripperVm.SName = "Greifertyp: "; PermissibleBeamParamDeviationsVm.SName = "Max. Strahlabweichung: "; DiameterVm.SName = "Teiledurchmesser: "; ThicknessVm.SName = "Teiledicke: "; TimeIntervallBeamCheckVm.SName = "Intervall Strahlvermessung: "; RestingTimeHotplateVm.SName = "Verweilzeit Heizplatte: "; TargetTemperatureHotplateVm.SName = "Zieltemperatur Heizplatte: "; RestingTimeCoolplateVm.SName = "Verweilzeit Kühlplatte: "; TargetTemperatureCoolplateVm.SName = "Zieltemperatur Kühlplatte"; RadialPosLowerWaterJetVm.SName = "Radial Position Unterwasserstrahl: "; ChuckRpmVm.SName = "Drehzahl: "; HvmaxTestCurrentVm.SName = "HV: Max. Teststrom: "; Hvn2PrePurgeTimeVm.SName = "HV: Vorreinigungszeit: "; HvnumRetriesVm.SName = "HV: Anzahl Wiederholversuche: "; HvpolarityVm.SName = "HV: Polarität (1=Pos, 2=Neg): "; HvrampTimeVm.SName = "HV: Rampenzeit: "; HvtestFrequencyVm.SName = "HV: Testfrequenz: "; HvTestOkCurrentVm.SName = "HV: Teststrom Teil OK"; HvTestOkVoltageVm.SName = "HV: Testspannung Teil OK"; HvtestTemperatureVm.SName = "HV: Testtemperatur: "; HvtestVoltageVm.SName = "HV: Testspannung: "; HvtestPressureN2Vm.SName = "HV: DruckN2: "; FlowReceipe.FlowReceipeEntries = new(); FlowReceipe.FlowReceipeEntries.Add(new FlowReceipeEntry { Priority = 100, Station = FlowStationsVm.FlowStations[0], MaxRetries = 0, NextNodeSuccess = 1, NextNodeRetry = -1, NextNodeFail = -1 }); CanAddTrayPosition = true; CanRemoveTrayPosition = false; CanAddFlowReceipeEntry = true; CanRemoveFlowReceipeEntry = false; CanAddEtchRobotStep = true; CanRemoveEtchRobotStep = false; DataSendToPlc = false; DataSaved = false; } #endregion ctor private ReceipeDto SetDto() { var receipe = new ReceipeDto(); receipe.ReceipeObject.MachineParameters.TrayPositions = new List(TrayPositions); receipe.ReceipeObject.MachineParameters.CameraPrograms = CameraProgramsVm.Value; receipe.ReceipeObject.MachineParameters.Chucks = ChucksVm.Value; receipe.ReceipeObject.MachineParameters.Gripper = GripperVm.Value; receipe.ReceipeObject.MachineParameters.PermissibleBeamParameterDeviations = PermissibleBeamParamDeviationsVm.Value; receipe.ReceipeObject.ProductParameters.Diameter = DiameterVm.Value; receipe.ReceipeObject.ProductParameters.Thickness = ThicknessVm.Value; receipe.ReceipeObject.ProductParameters.TimeIntervallBeamCheck = TimeIntervallBeamCheckVm.Value; receipe.ReceipeObject.ReceipeHotplate.RestingTime = RestingTimeHotplateVm.Value; receipe.ReceipeObject.ReceipeHotplate.TargetTemperature = TargetTemperatureHotplateVm.Value; receipe.ReceipeObject.ReceipeCoolplate.RestingTime = RestingTimeCoolplateVm.Value; receipe.ReceipeObject.ReceipeCoolplate.TargetTemperature = TargetTemperatureCoolplateVm.Value; receipe.ReceipeObject.ReceipeEtcher.NumberRobotPos = (ushort)NumberRobotPositionsVm.Value; receipe.ReceipeObject.ReceipeEtcher.RadialPosLowerWaterJet = RadialPosLowerWaterJetVm.Value; receipe.ReceipeObject.ReceipeEtcher.Rpm = ChuckRpmVm.Value; receipe.ReceipeObject.ReceipeEtcher.RobotStepData = new List(EtcherRobotSteps); receipe.ReceipeObject.ReceipeHvTester.MaximumTestCurrent = HvmaxTestCurrentVm.Value; receipe.ReceipeObject.ReceipeHvTester.N2PrePurgetime = Hvn2PrePurgeTimeVm.Value; receipe.ReceipeObject.ReceipeHvTester.NumRetries = (ushort)HvnumRetriesVm.Value; receipe.ReceipeObject.ReceipeHvTester.Polarity = (ushort)HvpolarityVm.Value; receipe.ReceipeObject.ReceipeHvTester.RampTime = HvrampTimeVm.Value; receipe.ReceipeObject.ReceipeHvTester.TestFrequency = HvtestFrequencyVm.Value; receipe.ReceipeObject.ReceipeHvTester.TestOkCurrent = HvTestOkCurrentVm.Value; receipe.ReceipeObject.ReceipeHvTester.TestOkVoltage = HvTestOkVoltageVm.Value; receipe.ReceipeObject.ReceipeHvTester.TestTemperature = HvtestTemperatureVm.Value; receipe.ReceipeObject.ReceipeHvTester.TestVoltage = HvtestVoltageVm.Value; receipe.ReceipeObject.ReceipeHvTester.TestpressureN2 = HvtestPressureN2Vm.Value; receipe.ReceipeObject.FlowreceipeModel.Nodes = new List(); foreach (var entry in FlowReceipe.FlowReceipeEntries) { var node = new FlowReceipeNode(); node.StationType = (uint)entry.Station.EStation; node.Priority = entry.Priority; node.NextNodeSuccess = entry.NextNodeSuccess; node.NextNodeRetry = entry.NextNodeRetry; node.NextNodeFail = entry.NextNodeFail; node.MaxRetries = entry.MaxRetries; receipe.ReceipeObject.FlowreceipeModel.Nodes.Add(node); } receipe.ReceipeObject.FlowreceipeModel.NodeCount = receipe.ReceipeObject.FlowreceipeModel.Nodes.Count; return receipe; } private void GetDto(ReceipeDto receipe) { TrayPositions = new(receipe.ReceipeObject.MachineParameters.TrayPositions); CameraProgramsVm.Value = receipe.ReceipeObject.MachineParameters.CameraPrograms; ChucksVm.Value = receipe.ReceipeObject.MachineParameters.Chucks; GripperVm.Value = receipe.ReceipeObject.MachineParameters.Gripper; PermissibleBeamParamDeviationsVm.Value = receipe.ReceipeObject.MachineParameters.PermissibleBeamParameterDeviations; DiameterVm.Value = receipe.ReceipeObject.ProductParameters.Diameter; ThicknessVm.Value = receipe.ReceipeObject.ProductParameters.Thickness; TimeIntervallBeamCheckVm.Value = receipe.ReceipeObject.ProductParameters.TimeIntervallBeamCheck; RestingTimeHotplateVm.Value = receipe.ReceipeObject.ReceipeHotplate.RestingTime; TargetTemperatureHotplateVm.Value = receipe.ReceipeObject.ReceipeHotplate.TargetTemperature; RestingTimeCoolplateVm.Value = receipe.ReceipeObject.ReceipeCoolplate.RestingTime; TargetTemperatureCoolplateVm.Value = receipe.ReceipeObject.ReceipeCoolplate.TargetTemperature; NumberRobotPositionsVm.Value = receipe.ReceipeObject.ReceipeEtcher.NumberRobotPos; RadialPosLowerWaterJetVm.Value = receipe.ReceipeObject.ReceipeEtcher.RadialPosLowerWaterJet; ChuckRpmVm.Value = receipe.ReceipeObject.ReceipeEtcher.Rpm; EtcherRobotSteps = new(receipe.ReceipeObject.ReceipeEtcher.RobotStepData); HvmaxTestCurrentVm.Value = receipe.ReceipeObject.ReceipeHvTester.MaximumTestCurrent; Hvn2PrePurgeTimeVm.Value = receipe.ReceipeObject.ReceipeHvTester.N2PrePurgetime; HvnumRetriesVm.Value = receipe.ReceipeObject.ReceipeHvTester.NumRetries; HvpolarityVm.Value = receipe.ReceipeObject.ReceipeHvTester.Polarity; HvrampTimeVm.Value = receipe.ReceipeObject.ReceipeHvTester.RampTime; HvtestFrequencyVm.Value = receipe.ReceipeObject.ReceipeHvTester.TestFrequency; HvTestOkCurrentVm.Value = receipe.ReceipeObject.ReceipeHvTester.TestOkCurrent; HvTestOkVoltageVm.Value = receipe.ReceipeObject.ReceipeHvTester.TestOkVoltage; HvtestTemperatureVm.Value = receipe.ReceipeObject.ReceipeHvTester.TestTemperature; HvtestVoltageVm.Value = receipe.ReceipeObject.ReceipeHvTester.TestVoltage; HvtestPressureN2Vm.Value = receipe.ReceipeObject.ReceipeHvTester.TestpressureN2; FlowReceipe.FlowReceipeEntries.Clear(); foreach (var node in receipe.ReceipeObject.FlowreceipeModel.Nodes) { StationEntry i = new StationEntry(Stationenum.EINGABE, Stationenum.EINGABE.ToString()); var station = FlowStationsVm.FlowStations.First(i => (uint)i.EStation == (uint)node.StationType); AddFlowReceipeEntry(); FlowReceipe.FlowReceipeEntries.Last().MaxRetries = node.MaxRetries; FlowReceipe.FlowReceipeEntries.Last().NextNodeRetry = node.NextNodeRetry; FlowReceipe.FlowReceipeEntries.Last().NextNodeFail = node.NextNodeFail; FlowReceipe.FlowReceipeEntries.Last().NextNodeSuccess = node.NextNodeSuccess; FlowReceipe.FlowReceipeEntries.Last().Priority = node.Priority; FlowReceipe.FlowReceipeEntries.Last().Station = station; } FlowNodeCountVm.Value = receipe.ReceipeObject.FlowreceipeModel.NodeCount; } private void SendDataToPLC() { if (_adsManager == null) return; var val = _adsManager.ReadValue("GVL_Scheduler.MAX_RECIPE_NODES"); maxFlowNodes = (val == null) ? 10 : (int)val; ; val = _adsManager.ReadValue("GVL_ETCHER.MAX_ROBOT_POS"); maxEtcherRobotPositions = (val == null) ? 10 : (int)val; val = _adsManager.ReadValue("GVL_ETCHER.MAX_ROBOT_POS"); maxTrayPositions = (val == null) ? 20 : (int)val; for (var i = 0; i < maxTrayPositions && i < TrayPositions.Count; i++) { _adsManager.WriteValue("GVL_SCADA.stMachine.stTray.arPosX[" + i + "]", TrayPositions[i].PosX); _adsManager.WriteValue("GVL_SCADA.stMachine.stTray.arPosY[" + i + "]", TrayPositions[i].PosY); } var trayPosCountToPlc = TrayPositions.Count < maxTrayPositions ? TrayPositions.Count : maxTrayPositions; _adsManager.WriteValue("GVL_SCADA.stMachine.stTray.iPosCnt", trayPosCountToPlc); for (var i = 0; i < maxEtcherRobotPositions && i < EtcherRobotSteps.Count; i++) { _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rPosX", EtcherRobotSteps[i].PosX); _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rPosY", EtcherRobotSteps[i].PosY); _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rPosZ", EtcherRobotSteps[i].PosZ); _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rAngleAlpha", EtcherRobotSteps[i].AngleAlpha); _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rMoveSpeed", EtcherRobotSteps[i].MoveSpeed); _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rDelay", EtcherRobotSteps[i].Delay); _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].uiMedium", EtcherRobotSteps[i].Medium); _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].xWaterFromBelow", EtcherRobotSteps[i].WaterFromBelow); _adsManager.WriteValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].xWaterFromAbove", EtcherRobotSteps[i].WaterFromAbove); } for (var i = 0; (i < maxFlowNodes && i < FlowReceipe.FlowReceipeEntries.Count); i++) { _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].uiPriority", FlowReceipe.FlowReceipeEntries[i].Priority); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].dwReqCap", FlowReceipe.FlowReceipeEntries[i].Station.EStation); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].uiMaxRetries", FlowReceipe.FlowReceipeEntries[i].MaxRetries); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].iNextNodeSuccess", FlowReceipe.FlowReceipeEntries[i].NextNodeSuccess); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].iNextNodeRetry", FlowReceipe.FlowReceipeEntries[i].NextNodeRetry); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].iNextNodeFail", FlowReceipe.FlowReceipeEntries[i].NextNodeFail); } _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterFlowRecipe.uiNodeCnt", FlowNodeCountVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.iCameraprograms", CameraProgramsVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.iChucks", ChucksVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.iGripper", GripperVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.rBeamDeviation", PermissibleBeamParamDeviationsVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.rDiameter", DiameterVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.rThickness", ThicknessVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.rTimeIntervalBeamCheck", TimeIntervallBeamCheckVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHotplate.rRestingTime", RestingTimeHotplateVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHotplate.rTemp", TargetTemperatureHotplateVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeCoolplate.rRestingTime", RestingTimeCoolplateVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeCoolplate.rTemp", TargetTemperatureCoolplateVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeEtcher.uiNumRobotPos", NumberRobotPositionsVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeEtcher.rRadialPosLowerWaterJet", RadialPosLowerWaterJetVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeEtcher.rChuckRPM", ChuckRpmVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestVoltage", HvtestVoltageVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rMaxTestCurrent", HvmaxTestCurrentVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rRampTime", HvrampTimeVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestFrequency", HvtestFrequencyVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.uiPolarity", HvpolarityVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestPresN2", HvtestPressureN2Vm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rN2PrePurgeTime", Hvn2PrePurgeTimeVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.uiNumRetries", HvnumRetriesVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestTemp", HvtestTemperatureVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestOkVoltage", HvTestOkVoltageVm.Value); _adsManager.WriteValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestOkCurrent", HvTestOkCurrentVm.Value); } private void ReadDataFromPLC() { if (_adsManager == null) return; var val = _adsManager.ReadValue("GVL_Scheduler.MAX_RECIPE_NODES"); maxFlowNodes = (val == null) ? 10 : (int)val; ; val = _adsManager.ReadValue("GVL_ETCHER.MAX_ROBOT_POS"); maxEtcherRobotPositions = (val == null) ? 10 : (int)val; val = _adsManager.ReadValue("GVL_ETCHER.MAX_ROBOT_POS"); maxTrayPositions = (val == null) ? 20 : (int)val; TrayPositions = new ObservableCollection(); for (var i = 0; i < maxTrayPositions && i < TrayPositions.Count; i++) { AddTrayPosition(); TrayPositions.Last().PosX = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stTray.arPosX[" + i + "]")); TrayPositions.Last().PosY = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stTray.arPosY[" + i + "]")); } var trayPosCountToPlc = TrayPositions.Count < maxTrayPositions ? TrayPositions.Count : maxTrayPositions; _adsManager.WriteValue("GVL_SCADA.stMachine.stTray.iPosCnt", trayPosCountToPlc); EtcherRobotSteps = new ObservableCollection(); for (var i = 0; i < maxEtcherRobotPositions && i < EtcherRobotSteps.Count; i++) { AddEtchRobotStep(); EtcherRobotSteps.Last().PosX = GetFloat(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rPosX")); EtcherRobotSteps.Last().PosY = GetFloat(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rPosY")); EtcherRobotSteps.Last().PosZ = GetFloat(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rPosZ")); EtcherRobotSteps.Last().AngleAlpha = GetFloat(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rAngleAlpha")); EtcherRobotSteps.Last().MoveSpeed = GetFloat(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rMoveSpeed")); EtcherRobotSteps.Last().Delay = GetFloat(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].rDelay")); EtcherRobotSteps.Last().Medium =GetUShort(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].uiMedium")); EtcherRobotSteps.Last().WaterFromBelow = GetBool(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].xWaterFromBelow")); EtcherRobotSteps.Last().WaterFromAbove = GetBool(_adsManager.ReadValue("GVL_SCADA.stRecipeEtcher.stRobotStepData[" + i + "].xWaterFromAbove")); } for (var i = 0; (i < maxFlowNodes && i < FlowReceipe.FlowReceipeEntries.Count); i++) { var stationFromPlc = GetUInt32(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].dwReqCap")); var station = FlowStationsVm.FlowStations.First(i => (uint)i.EStation == stationFromPlc); AddFlowReceipeEntry(); FlowReceipe.FlowReceipeEntries.Last().MaxRetries = GetUShort(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].uiMaxRetries")); FlowReceipe.FlowReceipeEntries.Last().NextNodeRetry = GetUShort(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].iNextNodeRetry")); FlowReceipe.FlowReceipeEntries.Last().NextNodeFail = GetUShort(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].iNextNodeFail")); FlowReceipe.FlowReceipeEntries.Last().NextNodeSuccess = GetUShort(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].iNextNodeSuccess")); FlowReceipe.FlowReceipeEntries.Last().Priority = GetUShort(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterFlowRecipe.astNodes[" + i + "].uiPriority")); FlowReceipe.FlowReceipeEntries.Last().Station = station; } FlowNodeCountVm.Value = GetInt(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterFlowRecipe.uiNodeCnt")); CameraProgramsVm.Value = GetInt(_adsManager.ReadValue("GVL_SCADA.stMachine.iCameraprograms")); ChucksVm.Value = GetInt(_adsManager.ReadValue("GVL_SCADA.stMachine.iChucks")); GripperVm.Value = GetInt(_adsManager.ReadValue("GVL_SCADA.stMachine.iGripper")); PermissibleBeamParamDeviationsVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.rBeamDeviation")); DiameterVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.rDiameter" )); ThicknessVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.rThickness")); TimeIntervallBeamCheckVm.Value=GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.rTimeIntervalBeamCheck")); RestingTimeHotplateVm.Value=GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHotplate.rRestingTime")); TargetTemperatureHotplateVm.Value=GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHotplate.rTemp")); RestingTimeCoolplateVm.Value=GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeCoolplate.rRestingTime")); TargetTemperatureCoolplateVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeCoolplate.rTemp" )); NumberRobotPositionsVm.Value = GetInt(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeEtcher.uiNumRobotPos")); RadialPosLowerWaterJetVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeEtcher.rRadialPosLowerWaterJet")); ChuckRpmVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeEtcher.rChuckRPM")); HvtestVoltageVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestVoltage")); HvmaxTestCurrentVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rMaxTestCurrent")); HvrampTimeVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rRampTime")); HvtestFrequencyVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestFrequency")); HvpolarityVm.Value = GetInt(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.uiPolarity")); HvtestPressureN2Vm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestPresN2")); Hvn2PrePurgeTimeVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rN2PrePurgeTime")); HvnumRetriesVm.Value = GetInt(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.uiNumRetries")); HvtestTemperatureVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestTemp")); HvTestOkVoltageVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestOkVoltage")); HvTestOkCurrentVm.Value = GetFloat(_adsManager.ReadValue("GVL_SCADA.stMachine.stMasterRecipeHVTest.rTestOkCurrent")); } #region helperMethods private short GetShort(object? value) { if (value != null) return (short)value; return -1; } private uint GetUInt32(object? value) { if (value != null) return (uint)value; return 0; } private int GetInt(object? value) { if (value != null) return (int)value; return 0; } private UInt16 GetUShort(object? value) { if (value != null) return (UInt16)value; return 0; } private bool GetBool(object? value) { if (value != null) return (bool)value; return false; } private float GetFloat(object? value) { if (value != null) return (float)value; return -1; } #endregion helperMethods public void Dispose() { } }