using Aitex.Core.Common; using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.UI.Control; using CyberX8_Core; using MECF.Framework.Common.Beckhoff.ModuleIO; using MECF.Framework.Common.IOCore; using MECF.Framework.Common.Routine; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace CyberX8_RT.Devices.SRD { public class SrdCommonFlipperRoutine : RoutineBase, IRoutine { #region 常量 private const string FLIPPERS_IN_100 = "FlippersIn100"; private const string FLIPPERS_IN_150 = "FlippersIn150"; private const string FLIPPERS_IN_200 = "FlippersIn200"; #endregion private enum FlipperStep { Flipper, Delay, CheckFlipperStatus, End } #region 内部变量 private bool _flipperIn; private int _waferSize = 200; private SrdCommonDevice _srdCommon; private int _timeout = 3000; #endregion /// /// 构造函数 /// /// public SrdCommonFlipperRoutine(string module) : base(module) { } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(FlipperStep.Flipper, FlipperPosition, _delay_1ms) .DelayIf(FlipperStep.Delay, !_flipperIn, 500) .Run(FlipperStep.CheckFlipperStatus, NullFun, CheckFlipperOutEndStatus, _timeout) .End(FlipperStep.End, NullFun, 100); return Runner.Status; } public RState Start(params object[] objs) { if (objs.Length < 2) return RState.Failed; _flipperIn = (bool)objs[0]; _waferSize = (int)objs[1]; _srdCommon = DEVICE.GetDevice($"{Module}.Common"); if (_flipperIn) { return Runner.Start(Module, "Flippers In"); } else { return Runner.Start(Module, "Flippers Out"); } } /// /// Flipper Position /// /// private bool FlipperPosition() { string variableName; switch (_waferSize) { case 100: variableName = FLIPPERS_IN_100; break; case 150: variableName = FLIPPERS_IN_150; break; case 200: variableName = FLIPPERS_IN_200; break; default: NotifyError(eEvent.ERR_SRD, $"Wafer Size {_waferSize} is invalid", 0); return false; } string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{variableName}"); return IOModuleManager.Instance.WriteIoValue(ioName, _flipperIn); } /// /// CheckFlipperOutStatus /// /// private bool CheckFlipperOutEndStatus() { bool result = false; switch (_waferSize) { case 100: result = _flipperIn ? (!_srdCommon.CommonData.Flipper1Out100Status && !_srdCommon.CommonData.Flipper2Out100Status && !_srdCommon.CommonData.Flipper3Out100Status) : (_srdCommon.CommonData.Flipper1Out100Status && _srdCommon.CommonData.Flipper2Out100Status && _srdCommon.CommonData.Flipper3Out100Status); break; case 150: result = _flipperIn ? (!_srdCommon.CommonData.Flipper1Out150Status && !_srdCommon.CommonData.Flipper2Out150Status && !_srdCommon.CommonData.Flipper3Out150Status) : (_srdCommon.CommonData.Flipper1Out150Status && _srdCommon.CommonData.Flipper2Out150Status && _srdCommon.CommonData.Flipper3Out150Status); break; case 200: result = _flipperIn ? (!_srdCommon.CommonData.Flipper1Out200Status && !_srdCommon.CommonData.Flipper2Out200Status && !_srdCommon.CommonData.Flipper3Out200Status) : (_srdCommon.CommonData.Flipper1Out200Status && _srdCommon.CommonData.Flipper2Out200Status && _srdCommon.CommonData.Flipper3Out200Status); break; default: NotifyError(eEvent.WARN_SRD, $"Wafer Size {_waferSize} is invalid", 0); result = false; break; } return result; } } }