using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Core.Util;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.SubstrateTrackings;
using PunkHPX8_Core;
using PunkHPX8_RT.Devices.AXIS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PunkHPX8_RT.Modules.PlatingCell
{
public class RotationBiDirectionRoutine : RoutineBase, IRoutine
{
private enum BiDirectionStep
{
StartBiDirection,
LoopStart,
LoopStartRotation,
LoopRotationWait,
LoopStopRotation,
LoopCheckStopRotation,
LoopUpdateRemain1,
LoopReverseRotationStart,
LoopReverseRotationWait,
LooPStopRevserseRotation,
LoopCheckStopReverseRotation,
LoopUpdateRemain2,
LoopEnd,
StartRemainRotation,
RemainRotationDelay,
StopRemainRotation,
CheckStopRemainRotation,
End
}
#region 常量
private const int TARGETPOSITION = 10 * 60 * 60 * 100 * 6; //转速100rmp转10个小时的目的地
private const int SPEED_RATIO = 1;
#endregion
#region 内部变量
///
/// rotation axis
///
private JetAxisBase _rotationAxis;
///
/// 运行过程总时间
///
private int _rotationTime;
///
/// 转向频率
///
private int _frequency;
///
/// 速度,单位rpm
///
private int _speed;
///
/// 单步电镀过程中电机需要转向的次数
///
private int _reverseTimes;
///
/// 反转次数整除以外的时间
///
private int _extralTime;
///
/// 剩余反转次数
///
private int _remainTimes;
///
/// monitor部分的循环次数
///
private int _cycleCount;
#endregion
///
/// 构造函数
///
///
public RotationBiDirectionRoutine(string module) : base(module)
{
}
///
/// 中止
///
public void Abort()
{
Runner.Stop("Manual Abort");
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(BiDirectionStep.StartBiDirection, NullFun, _delay_1ms)
.LoopStart(BiDirectionStep.LoopStart, "Rotation Bi-Direction Step Start", _cycleCount, NullFun, _delay_1ms)
.LoopRunIf(BiDirectionStep.LoopStartRotation, _cycleCount > 0,() => { return StratRotation(true); }, _delay_1ms)
.LoopDelayIf(BiDirectionStep.LoopRotationWait, _cycleCount > 0, _frequency * 1000)
.LoopRunIf(BiDirectionStep.LoopStopRotation, _cycleCount > 0, _rotationAxis.StopPositionOperation,_delay_1ms)
.LoopRunIfWithStopStatus(BiDirectionStep.LoopCheckStopRotation, _cycleCount > 0, CheckRotationPositionStatus, CheckRotationPositionRunStop)
.LoopRunIf(BiDirectionStep.LoopUpdateRemain1, _cycleCount > 0, UpdateRemain, _delay_1ms)
.LoopRunIf(BiDirectionStep.LoopReverseRotationStart, _remainTimes != 0, () => { return StratRotation(false); }, _delay_1ms)
.LoopDelayIf(BiDirectionStep.LoopReverseRotationWait, _remainTimes != 0, _frequency * 1000)
.LoopRunIf(BiDirectionStep.LooPStopRevserseRotation, _remainTimes != 0, _rotationAxis.StopPositionOperation, _delay_1ms)
.LoopRunIfWithStopStatus(BiDirectionStep.LoopCheckStopReverseRotation, _remainTimes != 0, CheckRotationPositionStatusWithStateupdate, CheckRotationPositionRunStop)
//.LoopRunIf(BiDirectionStep.LoopUpdateRemain2, _remainTimes != 0,UpdateRemain, _delay_1ms)
.LoopEnd(BiDirectionStep.LoopEnd, NullFun, _delay_1ms)
//剩余旋转时间(如果翻转次数是偶数,则正转,否则反转)
.RunIf(BiDirectionStep.StartRemainRotation, _extralTime !=0, () => { return _reverseTimes % 2 == 0 ? StratRotation(true): StratRotation(false); }, _delay_1ms)
.DelayIf(BiDirectionStep.RemainRotationDelay, _extralTime != 0, _extralTime * 1000)
.RunIf(BiDirectionStep.StopRemainRotation, _extralTime != 0, _rotationAxis.StopPositionOperation, _delay_1ms)
.WaitWithStopConditionIf(BiDirectionStep.CheckStopRemainRotation, _extralTime != 0, CheckRotationPositionStatus, CheckRotationPositionRunStop)
.End(BiDirectionStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
private bool UpdateRemain()
{
_remainTimes--;
return true;
}
///
/// rotation开始旋转
///
///
private bool StratRotation(bool isforwardRotate)
{
bool result = false;
if (isforwardRotate)
{
result = _rotationAxis.ProfilePosition(TARGETPOSITION, _speed * SPEED_RATIO * 6, 0, 0);
}
else
{
result = _rotationAxis.ProfilePosition(-TARGETPOSITION, _speed * SPEED_RATIO * 6, 0, 0);
}
if (!result)
{
NotifyError(eEvent.ERR_PLATINGCELL, "Start Rotation is failed", 0);
return false;
}
return true;
}
///
/// 检验Rotation移动状态
///
///
private bool CheckRotationPositionStatus()
{
return _rotationAxis.Status == RState.End;
}
///
/// 检验Rotation移动状态(带状态更新)
///
///
private bool CheckRotationPositionStatusWithStateupdate()
{
bool result = _rotationAxis.Status == RState.End;
if (result)
{
UpdateRemain();
}
return result;
}
///
/// 检验Rotation是否运动失败
///
///
private bool CheckRotationPositionRunStop()
{
return _rotationAxis.Status == RState.Failed || _rotationAxis.Status == RState.Timeout;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_rotationTime = (int)objs[0]; //单位s
_frequency = (int)objs[1]; //单位s
_speed = (int)objs[2]; //单位rmp
if(_frequency > _rotationTime)
{
NotifyError(eEvent.ERR_PLATINGCELL, "frequency can not large than rotation time", 0);
return RState.Failed;
}
_reverseTimes = _rotationTime / _frequency;
if(_reverseTimes % 2 == 0)
{
_cycleCount = _reverseTimes / 2;
}
else
{
_cycleCount = _reverseTimes / 2 + 1;
}
_remainTimes = _reverseTimes;
_extralTime = _rotationTime % _frequency;
_rotationAxis = DEVICE.GetDevice($"{Module}.Rotation");
return Runner.Start(Module, "Start Bi-Direction rotation");
}
}
}