214 lines
8.9 KiB
C#
214 lines
8.9 KiB
C#
using MainShell.Common;
|
||
using MainShell.DeviceMaintance.Model;
|
||
using MainShell.Hardware;
|
||
using MainShell.Motion;
|
||
using MainShell.Parameter;
|
||
using MainShell.ParaSetting.Model;
|
||
using MaxwellFramework.Core.Attributes;
|
||
using MaxwellFramework.Core.Interfaces;
|
||
using MW.WorkFlow;
|
||
using MwFramework.ManagerService;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace MainShell.Process
|
||
{
|
||
[Singleton]
|
||
public class NeedleZCalibrationService
|
||
{
|
||
private const double Precision = 0.001;
|
||
|
||
private readonly HardwareManager _hardwareManager;
|
||
private readonly SafeAxisMotion _safeAxisMotion;
|
||
private readonly IParamList _paramList;
|
||
private readonly IDeviceIoMonitorService _deviceIoMonitorService;
|
||
|
||
public NeedleZCalibrationService(HardwareManager hardwareManager, SafeAxisMotion safeAxisMotion, IParameterManager parameterManager, IDeviceIoMonitorService deviceIoMonitorService)
|
||
{
|
||
_hardwareManager = hardwareManager ?? throw new ArgumentNullException(nameof(hardwareManager));
|
||
_safeAxisMotion = safeAxisMotion ?? throw new ArgumentNullException(nameof(safeAxisMotion));
|
||
_paramList = parameterManager as IParamList;
|
||
_deviceIoMonitorService = deviceIoMonitorService ?? throw new ArgumentNullException(nameof(deviceIoMonitorService));
|
||
}
|
||
|
||
public NeedleZCalibrationExecutionContext GetExecutionContext(int? inputTouchCount, bool? inputAutoRaiseZ1)
|
||
{
|
||
NeedleCalibrationSetting needleCalibrationSetting = _paramList?.GetParameter<NeedleCalibrationSetting>();
|
||
EquipmentParaSysSetting equipmentParaSysSetting = _paramList?.GetParameter<EquipmentParaSysSetting>();
|
||
return CreateExecutionContext(needleCalibrationSetting, equipmentParaSysSetting, inputTouchCount, inputAutoRaiseZ1);
|
||
}
|
||
|
||
public NeedleZCalibrationExecutionContext CreateExecutionContext(NeedleCalibrationSetting needleCalibrationSetting, EquipmentParaSysSetting equipmentParaSysSetting, int? inputTouchCount, bool? inputAutoRaiseZ1)
|
||
{
|
||
ValidateCalibrationSetting(needleCalibrationSetting);
|
||
|
||
NeedleZCalibrationItem item = needleCalibrationSetting.NeedleZCalibrationItem;
|
||
ValidateCalibrationItem(item);
|
||
|
||
int touchCount = Math.Max(1, inputTouchCount ?? item.NeedleTouchCount);
|
||
bool autoRaiseZ1 = inputAutoRaiseZ1 ?? true;
|
||
double safeHeight = ResolveSafeHeight(equipmentParaSysSetting);
|
||
|
||
return new NeedleZCalibrationExecutionContext(needleCalibrationSetting, item, touchCount, autoRaiseZ1, safeHeight);
|
||
}
|
||
|
||
public async Task<double> ExecuteSingleTouchAsync(bool autoRaiseZ1, CancellationToken cancellationToken)
|
||
{
|
||
return await ExecuteSingleTouchAsync(autoRaiseZ1, cancellationToken, null);
|
||
}
|
||
|
||
public async Task<double> ExecuteSingleTouchAsync(bool autoRaiseZ1, CancellationToken cancellationToken, Action<double> onResult)
|
||
{
|
||
NeedleZCalibrationExecutionContext executionContext = GetExecutionContext(1, autoRaiseZ1);
|
||
IReadOnlyList<double> results = await ExecuteCalibrationAsync(executionContext, null, cancellationToken, onResult);
|
||
if (results == null || results.Count == 0)
|
||
{
|
||
throw new InvalidOperationException("<22><><EFBFBD>ζԵ<CEB6>δ<EFBFBD><CEB4><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD>");
|
||
}
|
||
|
||
return results[0];
|
||
}
|
||
|
||
public async Task<IReadOnlyList<double>> ExecuteCalibrationAsync(NeedleZCalibrationExecutionContext executionContext, ActivityControl activityControl, CancellationToken cancellationToken, Action<double> onResult)
|
||
{
|
||
if (executionContext == null)
|
||
{
|
||
throw new ArgumentNullException(nameof(executionContext));
|
||
}
|
||
|
||
List<double> results = new List<double>();
|
||
for (int i = 0; i < executionContext.TouchCount; i++)
|
||
{
|
||
await CheckControlAsync(activityControl, cancellationToken);
|
||
double result = await ExecuteSingleCalibrationAsync(executionContext, activityControl, cancellationToken);
|
||
results.Add(result);
|
||
onResult?.Invoke(result);
|
||
}
|
||
|
||
if (executionContext.AutoRaiseZ1)
|
||
{
|
||
await CheckControlAsync(activityControl, cancellationToken);
|
||
_safeAxisMotion.MoveAbs(_hardwareManager.Axis_Z1, executionContext.Item.Z1StartPosition, cancellationToken);
|
||
}
|
||
|
||
return results;
|
||
}
|
||
|
||
private async Task<double> ExecuteSingleCalibrationAsync(NeedleZCalibrationExecutionContext executionContext, ActivityControl activityControl, CancellationToken cancellationToken)
|
||
{
|
||
bool foundSignal = false;
|
||
double start = executionContext.Item.Z1StartPosition;
|
||
double end = start - executionContext.Item.Z1DropMaxPosition;
|
||
|
||
await CheckControlAsync(activityControl, cancellationToken);
|
||
_safeAxisMotion.MoveAbs(_hardwareManager.Axis_Z1, start, cancellationToken);
|
||
|
||
while (Math.Abs(end - start) > Precision)
|
||
{
|
||
await CheckControlAsync(activityControl, cancellationToken);
|
||
double mid = (start + end) / 2.0;
|
||
if (mid < executionContext.SafeHeight)
|
||
{
|
||
throw new InvalidOperationException(string.Format("Ŀ<><C4BF>λ<EFBFBD><CEBB>[{0}]<5D><><EFBFBD><EFBFBD>Z1<5A>Ե<EFBFBD><D4B5><EFBFBD>ȫ<EFBFBD>߶<EFBFBD>[{1}]<5D><><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>", mid, executionContext.SafeHeight));
|
||
}
|
||
|
||
_safeAxisMotion.MoveAbs(_hardwareManager.Axis_Z1, mid, cancellationToken);
|
||
if (IsToolSetterTriggered())
|
||
{
|
||
end = mid;
|
||
foundSignal = true;
|
||
}
|
||
else
|
||
{
|
||
start = mid;
|
||
}
|
||
}
|
||
|
||
if (!foundSignal)
|
||
{
|
||
throw new InvalidOperationException("<22>ڷ<EFBFBD>Χ<EFBFBD><CEA7>δ<EFBFBD>ҵ<EFBFBD><D2B5>Ե<EFBFBD><D4B5>źţ<C5BA><C5A3>Ե<EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>\r\n<><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2>ź<EFBFBD>״̬<D7B4><CCAC>");
|
||
}
|
||
|
||
return _hardwareManager.Axis_Z1.State != null ? _hardwareManager.Axis_Z1.State.ActualPos : _hardwareManager.Axis_Z1.GetPositionImmediate();
|
||
}
|
||
|
||
private static async Task CheckControlAsync(ActivityControl activityControl, CancellationToken cancellationToken)
|
||
{
|
||
cancellationToken.ThrowIfCancellationRequested();
|
||
if (activityControl == null)
|
||
{
|
||
return;
|
||
}
|
||
|
||
activityControl.CancellationToken.ThrowIfCancellationRequested();
|
||
await activityControl.CheckPauseAsync();
|
||
cancellationToken.ThrowIfCancellationRequested();
|
||
activityControl.CancellationToken.ThrowIfCancellationRequested();
|
||
}
|
||
|
||
private bool IsToolSetterTriggered()
|
||
{
|
||
return _deviceIoMonitorService.IsPointOn(DeviceIoNames.Stage.ToolSetterSignal);
|
||
}
|
||
private static void ValidateCalibrationSetting(NeedleCalibrationSetting needleCalibrationSetting)
|
||
{
|
||
if (needleCalibrationSetting == null || needleCalibrationSetting.NeedleZCalibrationItem == null)
|
||
{
|
||
throw new InvalidOperationException("δ<><CEB4>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ͷ<EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||
}
|
||
}
|
||
|
||
private static void ValidateCalibrationItem(NeedleZCalibrationItem item)
|
||
{
|
||
if (item == null)
|
||
{
|
||
throw new ArgumentNullException(nameof(item));
|
||
}
|
||
|
||
if (item.Z1Speed <= 0)
|
||
{
|
||
throw new InvalidOperationException("Z1<5A>ٶȱ<D9B6><C8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>");
|
||
}
|
||
|
||
if (item.Z1DropMaxPosition <= 0)
|
||
{
|
||
throw new InvalidOperationException("Z1<5A>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>");
|
||
}
|
||
}
|
||
|
||
private static double ResolveSafeHeight(EquipmentParaSysSetting equipmentParaSysSetting)
|
||
{
|
||
if (equipmentParaSysSetting == null || equipmentParaSysSetting.SafeParaSysItem == null)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
return equipmentParaSysSetting.SafeParaSysItem.NeedleCalibSafeHeight;
|
||
}
|
||
}
|
||
|
||
public class NeedleZCalibrationExecutionContext
|
||
{
|
||
public NeedleZCalibrationExecutionContext(NeedleCalibrationSetting needleCalibrationSetting, NeedleZCalibrationItem item, int touchCount, bool autoRaiseZ1, double safeHeight)
|
||
{
|
||
NeedleCalibrationSetting = needleCalibrationSetting ?? throw new ArgumentNullException(nameof(needleCalibrationSetting));
|
||
Item = item ?? throw new ArgumentNullException(nameof(item));
|
||
TouchCount = touchCount;
|
||
AutoRaiseZ1 = autoRaiseZ1;
|
||
SafeHeight = safeHeight;
|
||
}
|
||
|
||
public NeedleCalibrationSetting NeedleCalibrationSetting { get; private set; }
|
||
|
||
public NeedleZCalibrationItem Item { get; private set; }
|
||
|
||
public int TouchCount { get; private set; }
|
||
|
||
public bool AutoRaiseZ1 { get; private set; }
|
||
|
||
public double SafeHeight { get; private set; }
|
||
}
|
||
}
|