自动传盘流程添加

This commit is contained in:
Han Qiang Qiang 2024-06-13 18:13:59 +08:00
parent b4362b2345
commit e1b62ee617
29 changed files with 286 additions and 53 deletions

View File

@ -560,7 +560,7 @@
<SicMultipleServos classType="Aitex.Core.RT.Device.Devices.SicMultipleServo" assembly="MECF.Framework.RT.EquipmentLibrary">
<SicMultipleServo id="PMServo" module="" display="PMServo" schematicId="PMServo" unit="" aioType="float"
aiActualSpeed="AI_SpindleActualSpeed" aiActualCurrent="AI_ActualCurrent" aiAccSpeed="AI_ActualspeedACC" aiDecSpeed="AI_ActualspeedDEC" aiServoCurrentPosition="AI_SpindleCurrentPosition"
aoAccSpeedSetPoint="AO_SpindleAcc" aoDecSpeedSetPoint="AO_SpindleDec"
aoAccSpeedSetPoint="AO_SpindleAcc" aoDecSpeedSetPoint="AO_SpindleDec" aoSpindleJogSpeed="AO_SpindleJogSpeed"
aoSpindleSpeedSet="AO_SpindleSpeedSet" aoSpindleLoadAngle="AO_SpindleLoadAngle" aoSpindleUnloadAngle="AO_SpindleUnloadAngle"
diServoReady="DI_SpindleHome" diServoEnable="DI_SpindleEnable" diServoHome="DI_SpindleHome" diServoPositionComplete="DI_SpindlePositionComplete" diServoError="DI_ServoDriverFaultSW" diSpindleMoveComplete="DI_SpindleMoveComplete"
diSpindleJogAcc="DI_SpindleJogAcc" diSpindleJogDec="DI_SpindleJogDec"

View File

@ -29,12 +29,12 @@
<DI_ITEM Index="26" Name="DI_PSUFlow" BufferOffset="26" Addr="26" Description=""/>
<DI_ITEM Index="27" Name="DI_InletTotalFlowLowSW" BufferOffset="27" Addr="27" Description="" />
<DI_ITEM Index="28" Name="DI_InletTotalFlowHighSW" BufferOffset="28" Addr="28" Description="" />
<DI_ITEM Index="29" Name="DI_InletTotalTempHighSW" BufferOffset="29" Addr="29" Description="????????????????????????????????????????????" />
<DI_ITEM Index="29" Name="DI_InletTotalTempHighSW" BufferOffset="29" Addr="29" Description="" />
<DI_ITEM Index="30" Name="DI_PMH2DetectorSW" BufferOffset="30" Addr="30" Description="" />
<DI_ITEM Index="31" Name="DI_GBHCLDetectorSW" BufferOffset="31" Addr="31" Description="" />
<DI_ITEM Index="32" Name="DI_GBExhaustDPSW" BufferOffset="32" Addr="32" Description="" />
<DI_ITEM Index="33" Name="DI_GBDoorClosed" BufferOffset="33" Addr="33" Description="" />
<DI_ITEM Index="34" Name="DI_H2Pressure2SW" BufferOffset="34" Addr="34" Description="" />
<DI_ITEM Index="35" Name="DI_GasPipeTempCtrlAlarm" BufferOffset="35" Addr="35" Description="" />
<DI_ITEM Index="36" Name="DI_DryPump1Alarm" BufferOffset="36" Addr="36" Description="" />
<DI_ITEM Index="37" Name="DI_DryPump2Alarm" BufferOffset="37" Addr="37" Description="" />

View File

@ -33,7 +33,7 @@
<DI_ITEM Index="31" Name="DI_GBHCLDetectorSW" BufferOffset="31" Addr="31" Description="" />
<DI_ITEM Index="32" Name="DI_GBExhaustDPSW" BufferOffset="32" Addr="32" Description="" />
<DI_ITEM Index="33" Name="DI_GBDoorClosed" BufferOffset="33" Addr="33" Description="" />
<DI_ITEM Index="34" Name="DI_H2Pressure2SW" BufferOffset="34" Addr="34" Description="" />
<DI_ITEM Index="35" Name="DI_GasPipeTempCtrlAlarm" BufferOffset="35" Addr="35" Description="" />
<DI_ITEM Index="36" Name="DI_DryPump1Alarm" BufferOffset="36" Addr="36" Description="" />
<DI_ITEM Index="37" Name="DI_DryPump2Alarm" BufferOffset="37" Addr="37" Description="" />

View File

@ -24,7 +24,7 @@ namespace SicModules.EFEMs.Routines
* 8.
*/
private LoadRotationHomeOffsetRoutine _loadRotationHomeRoutine = new LoadRotationHomeOffsetRoutine();
private LoadRotationHomeRoutine _loadRotationHomeRoutine = new LoadRotationHomeRoutine();
private EfemSlitValveRoutine _efemSlitValveOpenRoutine = new EfemSlitValveRoutine();
private EfemSlitValveRoutine _efemSlitValveCloseRoutine = new EfemSlitValveRoutine();
private LoadLockLiftRoutine _loadLockLiftDown = new LoadLockLiftRoutine();

View File

@ -27,7 +27,7 @@ namespace SicModules.EFEMs.Routines
private LoadLockClawRoutine _loadLockClaw = new LoadLockClawRoutine();
private LoadLockClawRoutine _loadLockClawOpen= new LoadLockClawRoutine();
private LoadRotationHomeOffsetRoutine _loadRotationHomeRoutine = new LoadRotationHomeOffsetRoutine();
private LoadRotationHomeRoutine _loadRotationHomeRoutine = new LoadRotationHomeRoutine();
//private AlignerAlignRoutine _alignRoutine = new AlignerAlignRoutine();

View File

@ -38,7 +38,7 @@ namespace SicModules.LLs
Cooling,
Separating,
Grouping,
RotationHomeOffset,
RotationHome,
}
public enum MSG
@ -62,7 +62,7 @@ namespace SicModules.LLs
ToInit,
Separate,
Group,
RelativeHomeOffset,
RelativeHome,
}
@ -152,7 +152,7 @@ namespace SicModules.LLs
private LoadLockGroupRoutine _loadLockGroupRoutine;
private LoadSeparateRoutine _loadSeparateRoutine;
private LoadRotationHomeOffsetRoutine _loadRotationHomeOffsetRoutine;
private LoadRotationHomeRoutine _loadRotationHomeRoutine;
public LoadLockModule(ModuleName module) : base(1)
@ -202,7 +202,7 @@ namespace SicModules.LLs
_prepareTransferRoutine = new LoadLockPrepareTransferRoutine(module);
_loadLockGroupRoutine = new LoadLockGroupRoutine(module);
_loadSeparateRoutine = new LoadSeparateRoutine(module);
_loadRotationHomeOffsetRoutine = new LoadRotationHomeOffsetRoutine();
_loadRotationHomeRoutine = new LoadRotationHomeRoutine();
}
private void InitDevice()
@ -271,9 +271,9 @@ namespace SicModules.LLs
Transition(STATE.Grouping, MSG.Abort, FsmAbortTask, STATE.Idle);
//LoadRotationHome
Transition(STATE.Idle, MSG.RelativeHomeOffset, FsmStartRelativeHomeOffset, STATE.RotationHomeOffset);
Transition(STATE.RotationHomeOffset, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
Transition(STATE.RotationHomeOffset, MSG.Abort, FsmAbortTask, STATE.Idle);
Transition(STATE.Idle, MSG.RelativeHome, FsmStartRelativeHome, STATE.RotationHome);
Transition(STATE.RotationHome, FSM_MSG.TIMER, FsmMonitorTask, STATE.Idle);
Transition(STATE.RotationHome, MSG.Abort, FsmAbortTask, STATE.Idle);
}
private void InitOp()
@ -283,6 +283,11 @@ namespace SicModules.LLs
return CheckToPostMessage((int)MSG.Home);
});
OP.Subscribe($"{Name}.Rotation.Home", (string cmd, object[] args) =>
{
return CheckToPostMessage((int)MSG.RelativeHome);
});
OP.Subscribe($"{Name}.Pump", (string cmd, object[] args) =>
{
return CheckToPostMessage((int)MSG.Pump);
@ -333,7 +338,7 @@ namespace SicModules.LLs
OP.Subscribe($"{Name}.RotationRelativeHomeOffset", (string cmd, object[] args) =>
{
return CheckToPostMessage((int)MSG.RelativeHomeOffset);
return CheckToPostMessage((int)MSG.RelativeHome);
});
OP.Subscribe($"{Name}.Abort", (string cmd, object[] args) =>
@ -567,9 +572,9 @@ namespace SicModules.LLs
// return false;
// return ret == Result.RUN;
//}
private bool FsmStartRelativeHomeOffset(object[] param)
private bool FsmStartRelativeHome(object[] param)
{
Result ret = StartRoutine(_loadRotationHomeOffsetRoutine);
Result ret = StartRoutine(_loadRotationHomeRoutine);
if (ret == Result.FAIL || ret == Result.DONE)
return false;
return ret == Result.RUN;
@ -623,6 +628,14 @@ namespace SicModules.LLs
return (int)FSM_MSG.NONE;
}
public override int InvokeRotationHome()
{
if (CheckToPostMessage((int)MSG.RelativeHome))
return (int)MSG.RelativeHome;
return (int)FSM_MSG.NONE;
}
public override int InvokePurge(params object[] objs)
{
if (CheckToPostMessage((int)MSG.Purge,objs))

View File

@ -51,7 +51,7 @@ namespace SicModules.LLs
public abstract bool CheckWaferPlaced();
public abstract bool CheckTrayPlaced();
public abstract int InvokeRotationHome();
public abstract int InvokeCooling(int time);
public abstract int InvokeVent();
public abstract int InvokePump();

View File

@ -14,11 +14,13 @@ namespace SicModules.LLs.Routines
CloseV79,
CloseV83,
CloseV84,
ServoOnRotation
RotationHome
}
private int _homeTimeout;
private LoadRotationHomeRoutine _loadRotationHomeOffsetRoutine=new();
public LoadHomeRoutine(ModuleName module)
{
Module = module.ToString();
@ -43,8 +45,7 @@ namespace SicModules.LLs.Routines
CloseLoadVent((int)RoutineStep.CloseV79);
CloseFastPump((int)RoutineStep.CloseV83);
CloseSlowPump((int)RoutineStep.CloseV84);
ServoOnRotation((int)RoutineStep.ServoOnRotation);
ExecuteRoutine((int)RoutineStep.RotationHome, _loadRotationHomeOffsetRoutine);
LoadLockDevice.AutoCreatWafer();
}
catch (RoutineBreakException)

View File

@ -50,7 +50,7 @@ namespace SicModules.LLs.Routines
private bool _isSimulator = false;
private bool _enableCCDCheck = false;
private bool _enableDistanceSensorCheck = false;
private LoadRotationHomeOffsetRoutine _loadRotationHomeRoutine = new LoadRotationHomeOffsetRoutine();
private LoadRotationHomeRoutine _loadRotationHomeRoutine = new LoadRotationHomeRoutine();
Result MoveOneCircleResult;
Result CCDCheckResult;

View File

@ -5,7 +5,7 @@ using SicModules.LLs.Routines.Base;
namespace SicModules.LLs.Routines
{
public class LoadRotationHomeOffsetRoutine : LoadLockBaseRoutine
public class LoadRotationHomeRoutine : LoadLockBaseRoutine
{
enum RoutineStep
{
@ -25,7 +25,7 @@ namespace SicModules.LLs.Routines
private LoadLockTrayClawRoutine _trayClamp = new LoadLockTrayClawRoutine();
private LoadLockTrayClawRoutine _trayUnClamp = new LoadLockTrayClawRoutine();
public LoadRotationHomeOffsetRoutine()
public LoadRotationHomeRoutine()
{
Name = "Home";
}
@ -63,8 +63,8 @@ namespace SicModules.LLs.Routines
RotationServoOn((int)RoutineStep.RotationServoOn, 3);
MoveRelativeHome((int)RoutineStep.MoveRelativeHome, 10);
TimeDelay((int)RoutineStep.TimeDelay2, 3);
WaitLoadRotationDone((int)RoutineStep.WaitMoveDone, 60);
//TimeDelay((int)RoutineStep.TimeDelay2, 3);
//WaitLoadRotationDone((int)RoutineStep.WaitMoveDone, 60);
//取消Offset
//MoveLoadRotationHomeOffset((int)RoutineStep.MoveHomeOffset, _homeOffset, 10);

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.props" Condition="Exists('$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Import Project="$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.props" Condition="Exists('$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@ -124,7 +124,7 @@
<Compile Include="LLs\Routines\LoadLockTrayAlignerRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockTrayClawRoutine.cs" />
<Compile Include="LLs\Routines\LoadLockVentRoutine.cs" />
<Compile Include="LLs\Routines\LoadRotationHomeOffsetRoutine.cs" />
<Compile Include="LLs\Routines\LoadRotationHomeRoutine.cs" />
<Compile Include="LLs\Routines\LoadSeparateRoutine.cs" />
<Compile Include="LLs\SicLoadLock.cs" />
<Compile Include="PMs\PM1.cs" />
@ -296,12 +296,12 @@
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.props')" Text="$([System.String]::Format('$(ErrorText)', 'Properties\GitVersion.MsBuild.props'))" />
<Error Condition="!Exists('$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.targets')" Text="$([System.String]::Format('$(ErrorText)', 'Properties\GitVersion.MsBuild.targets'))" />
</Target>
<Import Project="$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.targets" Condition="Exists('$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.props')" Text="$([System.String]::Format('$(ErrorText)', 'Properties\GitVersion.MsBuild.props'))" />
<Error Condition="!Exists('$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.targets')" Text="$([System.String]::Format('$(ErrorText)', 'Properties\GitVersion.MsBuild.targets'))" />
</Target>
<Import Project="$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.targets" Condition="Exists('$(SolutionDir)BuildTools\GitVersion\GitVersion.MsBuild.targets')" />
</Project>

View File

@ -61,6 +61,8 @@ namespace SicModules.TMs.Routines.Base
private IoLift4 _loadLift;
private IoLift4 _unLoadLift;
protected SicMultipleServo _sicServo;
public TMBaseRoutine() : base(ModuleName.TM.ToString())
{
_robot = DEVICE.GetDevice<SicTMRobot>($"{ModuleName.TMRobot}.{ModuleName.TMRobot}");
@ -1399,6 +1401,40 @@ namespace SicModules.TMs.Routines.Base
throw (new RoutineBreakException());
}
}
protected void RobotGotoAndWait(int id, RobotBaseDevice robot, ModuleName source, int slot, RobotArmEnum hand, int timeout,bool re,bool down)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
Notify($"Goto {source} {slot + 1} use {(hand == RobotArmEnum.Blade1 ? "Blade1" : "Blade2")}");
List<object> para = new List<object>() { "GoTo", hand, source, slot, true, true };
if (!robot.GoTo(para.ToArray()))
{
robot.IsBusy = false;
return false;
}
return true;
},
() => !robot.IsBusy,
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
Stop($"Goto failed, error {robot.ErrorCode}");
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT) //timeout
{
Stop(string.Format("timeout, can not complete in {0} seconds", timeout));
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void CheckRobotReady(int id, RobotBaseDevice robot, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
@ -1854,5 +1890,69 @@ namespace SicModules.TMs.Routines.Base
throw (new RoutineBreakException());
}
}
protected void WaitSicServoLoadAngleRun(int id, float speed, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
if (_sicServo != null)
{
_sicServo.LoadAngleRun(speed);
}
return true;
}, () =>
{
return _sicServo.SpindleMoveComplete;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{Module} sic servo load angle run timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
protected void WaitSicServoUnloadAngleRun(int id, float speed, int timeout)
{
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
{
if (_sicServo != null)
{
_sicServo.UnloadAngleRun(speed);
}
return true;
}, () =>
{
return _sicServo.SpindleMoveComplete;
},
timeout * 1000);
if (ret.Item1)
{
if (ret.Item2 == Result.FAIL)
{
throw (new RoutineFaildException());
}
else if (ret.Item2 == Result.TIMEOUT)
{
Stop($"{Module} sic servo unload angle run timeout, over {timeout} seconds");
throw (new RoutineFaildException());
}
else
throw (new RoutineBreakException());
}
}
}
}

View File

@ -6,6 +6,7 @@ using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using SicModules.LLs.Routines;
using SicModules.TMs.Routines.Base;
namespace SicModules.TMs.Routines
@ -24,7 +25,7 @@ namespace SicModules.TMs.Routines
Pick,
QueryOffset,
TrayUnClamp1,
Extend,
Handoff,
HandoffDelay,
@ -53,11 +54,15 @@ namespace SicModules.TMs.Routines
Delay2,
VceMoveToSlot,
RobotGotoNotWait,
RobotGotoPmLowAndWait,
RobotGotoPmHighAndWait,
SicServoUnloadAngleRun,
CheckRobotReady,
CheckTransferPrepared,
SetConfinementRingUp,
TimeDelay1,
TimeDelay2,
TimeDelay3,
TimeDelay20,
TimeDelay50,
}
@ -67,13 +72,15 @@ namespace SicModules.TMs.Routines
private RobotArmEnum _blade;
private int _pickTimeout;
private bool _autoHand;
private float _sicServoUnloadAngle;
private bool _requestAWCData;
private SicTM _tm;
private TMSlitValveRoutine _openSlitValveRoutine = new TMSlitValveRoutine();
private TMSlitValveRoutine _closeSlitValveRoutine = new TMSlitValveRoutine();
private LoadLockTrayClawRoutine _trayUnClamp = new LoadLockTrayClawRoutine();
private bool _pmPostTrasferEnableHeat = true;
public TMRobotPickRoutine()
@ -104,7 +111,7 @@ namespace SicModules.TMs.Routines
_target = source;
_targetSlot = sourceSlot;
_blade = blade;
_trayUnClamp.Init(false);
_openSlitValveRoutine.Init(source.ToString(), true, _pmPostTrasferEnableHeat);
_closeSlitValveRoutine.Init(source.ToString(), false, _pmPostTrasferEnableHeat);
}
@ -263,9 +270,20 @@ namespace SicModules.TMs.Routines
SetRobotExtendToDO((int)RoutineStep.SetRobortExtendToDo, _target, 2);
CheckRobotReady((int)RoutineStep.CheckRobotReady, RobotDevice, _pickTimeout);
if (_target == ModuleName.Load || _target == ModuleName.LoadLock)//放Load前打开夹爪
{
ExecuteRoutine((int)RoutineStep.TrayUnClamp1, _trayUnClamp); //夹爪打开
}
if (ModuleHelper.IsPm(_target))//机械手去腔体更改机械手逻辑
{
Pick((int)RoutineStep.Pick, RobotDevice, _target, _targetSlot, _blade, _pickTimeout);
RobotGotoAndWait((int)RoutineStep.RobotGotoPmLowAndWait, RobotDevice, _target, _targetSlot, _blade, 60, false, true);//先到低位
RobotGotoAndWait((int)RoutineStep.RobotGotoPmHighAndWait, RobotDevice, _target, _targetSlot, _blade, 60, false, false);//再到低位
TimeDelay((int)RoutineStep.TimeDelay3, 3);
//等磁流体开始旋转释放Tray盘
WaitSicServoUnloadAngleRun((int)RoutineStep.SicServoUnloadAngleRun, _sicServoUnloadAngle, 20);//机械手到达高位开始旋转释放Tray盘
}
else//别的模块保持机械手逻辑不变
{

View File

@ -1,10 +1,12 @@
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Device.Devices;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots;
using SicModules.LLs.Routines;
using SicModules.TMs.Routines.Base;
@ -49,15 +51,20 @@ namespace SicModules.TMs.Routines
Delay2,
VceMoveToSlot,
RobotGotoNotWait,
RobotGotoPmLowAndWait,
RobotGotoPmHighAndWait,
WaitSicServoLoadAngleRun,
PrepareTransferNotWait,
CheckRobotReady,
CheckTransferPrepared,
LoadRatation,
TrayClamp,
TrayUnClamp,
TrayUnClamp1,
TrayUnClamp2,
TimeDelay1,
TimeDelay2,
TimeDelay3,
TimeDelay4,
SuspectorCheck
}
@ -67,6 +74,8 @@ namespace SicModules.TMs.Routines
private int _placeTimeout;
private bool _requestAWCData;
private float _sicServoLoadAngleRun;
private bool _autoHand;
private TMSlitValveRoutine _openSlitValveRoutine = new TMSlitValveRoutine();
private TMSlitValveRoutine _closeSlitValveRoutine = new TMSlitValveRoutine();
@ -151,6 +160,11 @@ namespace SicModules.TMs.Routines
return Result.FAIL;
}
if (ModuleHelper.IsPm(_target))
{
_sicServo = DEVICE.GetDevice<SicMultipleServo>($"{_target}.PMServo");
}
//顶针必须在低位
//if (_target == ModuleName.LoadLock || _target == ModuleName.Load)
//{
@ -246,9 +260,20 @@ namespace SicModules.TMs.Routines
SetRobotExtendToDO((int)RoutineStep.SetRobortExtendToDo, _target, 2);
CheckRobotReady((int)RoutineStep.CheckRobotReady, RobotDevice, _placeTimeout);
if (_target == ModuleName.Load || _target == ModuleName.LoadLock)//放Load前打开夹爪
{
ExecuteRoutine((int)RoutineStep.TrayUnClamp1, _trayUnClamp); //夹爪打开
}
if (ModuleHelper.IsPm(_target))//机械手去腔体更改机械手逻辑
{
Place((int)RoutineStep.Place, RobotDevice, _target, _targetSlot, _blade, _placeTimeout);
RobotGotoAndWait((int)RoutineStep.RobotGotoPmLowAndWait, RobotDevice, _target, _targetSlot, _blade, _placeTimeout,false,true);//先到低位
RobotGotoAndWait((int)RoutineStep.RobotGotoPmHighAndWait, RobotDevice, _target, _targetSlot, _blade, _placeTimeout, false, false);//到高位等待伺服旋转
TimeDelay((int)RoutineStep.TimeDelay4, 3);
WaitSicServoLoadAngleRun((int)RoutineStep.WaitSicServoLoadAngleRun, _sicServoLoadAngleRun,50);//机械手到高位磁流体旋转锁紧Tray盘
//等磁流体开始旋转固定Tray盘
}
else//别的模块保持机械手逻辑不变
{
@ -272,9 +297,11 @@ namespace SicModules.TMs.Routines
if (_target == ModuleName.Load || _target == ModuleName.LoadLock)
{
//对中
ExecuteRoutine((int)RoutineStep.TrayClamp, _trayClamp); //夹爪关闭
TimeDelay((int)RoutineStep.TimeDelay3, 1);//延迟1s
ExecuteRoutine((int)RoutineStep.TrayUnClamp, _trayUnClamp); //夹爪打开
ExecuteRoutine((int)RoutineStep.TrayUnClamp2, _trayUnClamp); //夹爪打开
//ExecuteRoutine((int)RoutineStep.LoadRatation, loadRotationHomeRoutine);
}

View File

@ -64,7 +64,7 @@ namespace SicModules.TMs.Routines
private IoValve PMToTm_V70;
private IoPressure _pmPT1;
private IoConfinementRing _confinementRing;
private SicMultipleServo _sicServo;
private IoInterLock _pmIoInterLock;
private IoTC _tc1;
@ -97,6 +97,8 @@ namespace SicModules.TMs.Routines
private int _tmV77DelayTime = 5;
private double _tmMfcFlow = 10;
private bool _pmPostTrasferNeedEnableHeat = true;
private bool _preTransferPSUEnable = false;
private bool _preTransferSCREnable = false;
@ -330,7 +332,6 @@ namespace SicModules.TMs.Routines
if (_paramIsOpen)//开腔体闸板阀时候的相关操作
{
SetPreTransfer((int)RoutineStep.SetPmPreTrasfer, _rotationStopTimeout);//旋转停止,加热停止
WaitPVTempratureBelowSet((int)RoutineStep.WaitPVTempBelowSet, 600);
ExecuteRoutine((int)RoutineStep.ChamberBalance, _balanceRoutine);
@ -879,7 +880,7 @@ namespace SicModules.TMs.Routines
throw (new RoutineBreakException());
}
}
private void WaitTempratureBelow900(int id, int timeout)
{

View File

@ -15,6 +15,7 @@ using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Jobs;
using MECF.Framework.Common.Schedulers;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.UnLoad;
using SicRT.Equipments.Schedulers;
using SicRT.Modules.Schedulers;
@ -1541,7 +1542,9 @@ namespace SicRT.Modules
{
if (_load.CheckWaferNeedProcess(0))
{
//添加夹爪动作
//添加夹爪动作和边缘对位
_load.RotationHome();
_load.Purge(_load.GetWaferPurgeCount(0), _load.GetWaferPumpDelayTime(0));

View File

@ -151,9 +151,21 @@ namespace SicRT.Scheduler
}
public void Cl()
/// <summary>
/// 夹爪动作,然后寻边
/// </summary>
/// <returns></returns>
public bool RotationHome()
{
_entityTaskToken = _ll.InvokeRotationHome();
if (_entityTaskToken != (int)FSM_MSG.NONE)
{
_task = TaskType.Purge;
_purged = true;
LogTaskStart(_task, $"{Module} purge for new job");
return true;
}
return false;
}
public bool Purge(params object[] objs)

View File

@ -32,12 +32,12 @@
<DI_ITEM Index="26" Name="DI_PSUFlow" BufferOffset="26" Addr="26" Description=""/>
<DI_ITEM Index="27" Name="DI_InletTotalFlowLowSW" BufferOffset="27" Addr="27" Description="" />
<DI_ITEM Index="28" Name="DI_InletTotalFlowHighSW" BufferOffset="28" Addr="28" Description="" />
<DI_ITEM Index="29" Name="DI_InletTotalTempHighSW" BufferOffset="29" Addr="29" Description="????????????????????????????????????????????" />
<DI_ITEM Index="29" Name="DI_InletTotalTempHighSW" BufferOffset="29" Addr="29" Description="" />
<DI_ITEM Index="30" Name="DI_PMH2DetectorSW" BufferOffset="30" Addr="30" Description="" />
<DI_ITEM Index="31" Name="DI_GBHCLDetectorSW" BufferOffset="31" Addr="31" Description="" />
<DI_ITEM Index="32" Name="DI_GBExhaustDPSW" BufferOffset="32" Addr="32" Description="" />
<DI_ITEM Index="33" Name="DI_GBDoorClosed" BufferOffset="33" Addr="33" Description="" />
<DI_ITEM Index="34" Name="DI_H2Pressure2SW" BufferOffset="34" Addr="34" Description="" />
<DI_ITEM Index="35" Name="DI_GasPipeTempCtrlAlarm" BufferOffset="35" Addr="35" Description="" />
<DI_ITEM Index="36" Name="DI_DryPump1Alarm" BufferOffset="36" Addr="36" Description="" />
<DI_ITEM Index="37" Name="DI_DryPump2Alarm" BufferOffset="37" Addr="37" Description="" />

View File

@ -18,7 +18,7 @@
d:Background="#91b0cd"
d:DesignHeight="800"
d:DesignWidth="1920"
lex:LocalizeDictionary.DesignCulture="."
lex:LocalizeDictionary.DesignCulture="en"
lex:ResxLocalizationProvider.DefaultAssembly="Sicentury.Localization"
lex:ResxLocalizationProvider.DefaultDictionary="lang_common"
mc:Ignorable="d">
@ -871,7 +871,7 @@
<RowDefinition Height="32" />
<RowDefinition Height="32" />
<RowDefinition Height="32" />
<RowDefinition Height="32" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="90" />
@ -1322,6 +1322,63 @@
</StackPanel>
</Border>
<Border
Grid.Row="6"
Padding="5,1,0,1"
Background="{DynamicResource Table_BG_Title}"
BorderBrush="{DynamicResource Table_BD}"
BorderThickness="1,0,1,1">
<TextBlock
VerticalAlignment="Center"
lex:ResxLocalizationProvider.DefaultDictionary="lang_tmview"
FontFamily="Arial"
FontSize="12"
Foreground="{DynamicResource FG_Black}"
Text="Rotation"
TextWrapping="Wrap" />
</Border>
<Border
Grid.Row="6"
Grid.Column="1"
Padding="5,1,0,1"
Background="{DynamicResource Table_BG_Content}"
BorderBrush="{DynamicResource Table_BD}"
BorderThickness="0,0,0,1">
<TextBlock
VerticalAlignment="Center"
FontFamily="Arial"
FontSize="12"
Foreground="{DynamicResource FG_Black}"
Text="{Binding LLPressureDisplay, StringFormat=\{0:F1\}}"
TextAlignment="Center"
TextWrapping="Wrap" />
</Border>
<Border
Grid.Row="6"
Grid.Column="2"
Padding="5,1,0,1"
Background="{DynamicResource Table_BG_Content}"
BorderBrush="{DynamicResource Table_BD}"
BorderThickness="0,0,0,1">
<Button
Width="120"
Height="25"
Margin="10,0"
HorizontalAlignment="Left"
Content="RotationHome"
IsEnabled="{Binding IsLLEnableManualOperation}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="Home">
<cal:Parameter Value="LoadLock.Rotation" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Border>
</Grid>
<Grid Margin="10,10" Visibility="{Binding IsUnLoadInstalled, Converter={StaticResource BoolVisibilityConverter}}">

View File

@ -939,6 +939,7 @@ namespace SicUI.Client.Models.Platform.TM
TMProvider.Instance.Home(module);
}
}
public void Pump(string module)
{
TMProvider.Instance.Pump(module);

Binary file not shown.