1117 lines
38 KiB
C#
1117 lines
38 KiB
C#
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<TrayPosition> 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<EtcherRobotStepData> 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<FlowReceipeEntry> 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<FlowReceipeEntry>(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<FlowReceipeEntry>(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<FlowReceipeEntry>(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<TrayPosition>(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<TrayPosition>(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<TrayPosition>(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<EtcherRobotStepData>(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<EtcherRobotStepData>(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<EtcherRobotStepData>(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<TrayPosition>(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<EtcherRobotStepData>(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<FlowReceipeNode>();
|
|
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<TrayPosition>();
|
|
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<EtcherRobotStepData>();
|
|
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()
|
|
{
|
|
|
|
}
|
|
} |