1.修改MOExchange Routine到最新流程
This commit is contained in:
parent
d68e27c4f3
commit
accd89e5f1
|
@ -7,6 +7,7 @@ using Aitex.Core.RT.Event;
|
||||||
using Aitex.Core.RT.Routine;
|
using Aitex.Core.RT.Routine;
|
||||||
using Aitex.Core.RT.SCCore;
|
using Aitex.Core.RT.SCCore;
|
||||||
using MECF.Framework.Common.Equipment;
|
using MECF.Framework.Common.Equipment;
|
||||||
|
using MECF.Framework.Common.Fsm;
|
||||||
using SicModules.PMs.Routines.Base;
|
using SicModules.PMs.Routines.Base;
|
||||||
|
|
||||||
namespace SicModules.PMs.Routines
|
namespace SicModules.PMs.Routines
|
||||||
|
@ -15,77 +16,59 @@ namespace SicModules.PMs.Routines
|
||||||
{
|
{
|
||||||
private enum RoutineStep
|
private enum RoutineStep
|
||||||
{
|
{
|
||||||
SetGroupE,
|
|
||||||
SetGroupK,
|
SetGroupK,
|
||||||
|
SetM7Or10,
|
||||||
SetM7,
|
SetM8Or11,
|
||||||
SetM8,
|
|
||||||
SetM11,
|
|
||||||
SetPc2,
|
|
||||||
|
|
||||||
OpenV73,
|
OpenV73,
|
||||||
CloseV73,
|
|
||||||
SetGroup1,
|
|
||||||
SetGroup11,
|
|
||||||
SetGroup2,
|
|
||||||
SetGroup3,
|
|
||||||
SetGroup4,
|
|
||||||
SetGroup5,
|
|
||||||
SetGroup6,
|
|
||||||
|
|
||||||
StartLoop,
|
StartLoop,
|
||||||
|
OpenGroup1,
|
||||||
|
CloseGroup2,
|
||||||
|
OpenGroup3,
|
||||||
|
CloseGroup3,
|
||||||
|
OpenGroup2,
|
||||||
|
CloseGroup1,
|
||||||
EndLoop,
|
EndLoop,
|
||||||
|
|
||||||
SetM7Default,
|
CloseGroup3_2,
|
||||||
SetM8Default,
|
CloseGroup2_2,
|
||||||
SetPc2Default,
|
OpenGroup1_2,
|
||||||
SetM11Default,
|
CloseV73,
|
||||||
SetGroupV25,
|
SetM7Or10_2,
|
||||||
|
SetM8Or11_2,
|
||||||
|
SetPC2Or3,
|
||||||
|
|
||||||
TimeDelay1,
|
TimeDelay1,
|
||||||
TimeDelay2,
|
TimeDelay2,
|
||||||
TimeDelay3,
|
|
||||||
TimeDelay4,
|
|
||||||
TimeDelay5,
|
|
||||||
TimeDelay6,
|
|
||||||
TimeDelay7,
|
|
||||||
TimeDelay8,
|
|
||||||
TimeDelay9,
|
|
||||||
TimeDelay10,
|
|
||||||
TimeDelay11,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool _isTCS = false; //标记是TMA换源还是TCS换源
|
private bool _isTCS = false; //标记是TMA换源还是TCS换源
|
||||||
private PMModule _pm1Module;
|
private PMModule _pmModule;
|
||||||
private ModuleName moduleName;
|
private ModuleName moduleName;
|
||||||
private IoInterLock _pmIoInterLock;
|
private IoInterLock _pmIoInterLock;
|
||||||
|
|
||||||
private int _IoValueOpenCloseTimeout = 10; //开关超时时间
|
private int _IoValueTimeout = 2; //开关超时时间
|
||||||
private int _loopCount;
|
private int _loopCount;
|
||||||
|
private int _routineTimeOut;
|
||||||
|
|
||||||
private double _OpenTime = 10;
|
private double _OpenTime = 10;
|
||||||
private double _CLoseTime = 10;
|
private double _CLoseTime = 10;
|
||||||
private int _routineTimeOut;
|
|
||||||
|
|
||||||
//默认为TMA换源参数
|
//默认为TMA换源参数
|
||||||
private int mfc7Or10 = 7;
|
private int mfc7Or10 = 7;
|
||||||
private int mfc8Or12 = 8;
|
private int mfc8Or11 = 8;
|
||||||
private int mfc11 = 11;
|
|
||||||
private int pc2Or3 = 2;
|
private int pc2Or3 = 2;
|
||||||
private List<string> _lstGroupV73 = new List<string>() { "V73" };
|
|
||||||
private List<string> _lstGroupV50 = new List<string>() { "V50" };
|
|
||||||
private List<string> _lstGroupV48 = new List<string>() { "V48" };
|
|
||||||
private List<string> _lstGroupV49 = new List<string>() { "V49" };
|
|
||||||
|
|
||||||
private List<string> _lstGroup1 = new List<string>() { "V46","V46s","V73" };
|
private List<string> _lstGroupV73 = new List<string>() { "V73" };
|
||||||
private List<string> _lstGroup2 = new List<string>() { "V46", "V46s" };
|
|
||||||
private List<string> _lstGroup3 = new List<string>() { "V43", "V43s", "V45" };
|
private List<string> _lstGroup1 = new List<string>() { "V49" };
|
||||||
|
private List<string> _lstGroup2 = new List<string>() { "V48", "V48s" };
|
||||||
|
private List<string> _lstGroup3 = new List<string>() { "V50", "V50s" };
|
||||||
|
|
||||||
private Stopwatch _swTimer = new Stopwatch();
|
private Stopwatch _swTimer = new Stopwatch();
|
||||||
public PMExchangeMoRoutine(ModuleName module, PMModule pm1) : base(module, pm1)
|
public PMExchangeMoRoutine(ModuleName module, PMModule pm) : base(module, pm)
|
||||||
{
|
{
|
||||||
moduleName = module;
|
moduleName = module;
|
||||||
_pm1Module = pm1;
|
_pmModule = pm;
|
||||||
Name = "MoExchange";
|
Name = "MoExchange";
|
||||||
_pmIoInterLock = DEVICE.GetDevice<IoInterLock>($"{Module}.PMInterLock");
|
_pmIoInterLock = DEVICE.GetDevice<IoInterLock>($"{Module}.PMInterLock");
|
||||||
}
|
}
|
||||||
|
@ -106,53 +89,52 @@ namespace SicModules.PMs.Routines
|
||||||
{
|
{
|
||||||
Reset();
|
Reset();
|
||||||
|
|
||||||
if (_pm1Module.V69.Status)
|
if (_pmModule.V69.Status)
|
||||||
{
|
{
|
||||||
EV.PostAlarmLog(Module, $"can not Exchange Mo,V69 should be Closed");
|
EV.PostAlarmLog(Module, $"can not Exchange Mo,V69 should be Closed");
|
||||||
return Result.FAIL;
|
return Result.FAIL;
|
||||||
}
|
}
|
||||||
if (_pm1Module.V72.Status)
|
if (_pmModule.V72.Status)
|
||||||
{
|
{
|
||||||
EV.PostAlarmLog(Module, $"can not Exchange Mo,V72 should be Closed");
|
EV.PostAlarmLog(Module, $"can not Exchange Mo,V72 should be Closed");
|
||||||
return Result.FAIL;
|
return Result.FAIL;
|
||||||
}
|
}
|
||||||
if (_pm1Module.V74.Status)
|
if (_pmModule.V74.Status)
|
||||||
{
|
{
|
||||||
EV.PostAlarmLog(Module, $"can not Exchange Mo,V74 should be Closed");
|
EV.PostAlarmLog(Module, $"can not Exchange Mo,V74 should be Closed");
|
||||||
return Result.FAIL;
|
return Result.FAIL;
|
||||||
}
|
}
|
||||||
if (_pm1Module.EPV2.Status)
|
if (_pmModule.EPV2.Status)
|
||||||
{
|
{
|
||||||
EV.PostAlarmLog(Module, $"can not Exchange Mo,EPV2 should be Closed");
|
EV.PostAlarmLog(Module, $"can not Exchange Mo,EPV2 should be Closed");
|
||||||
return Result.FAIL;
|
return Result.FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
_loopCount = SC.GetValue<int>($"PM.{Module}.MoExchange.CycleCount");
|
_loopCount = SC.GetValue<int>($"PM.{Module}.MoExchange.CycleCount");
|
||||||
_OpenTime= SC.GetValue<int>($"PM.{Module}.MoExchange.PumpTime");
|
_OpenTime = SC.GetValue<int>($"PM.{Module}.MoExchange.PumpTime");
|
||||||
_CLoseTime = SC.GetValue<int>($"PM.{Module}.MoExchange.VentTime");
|
_CLoseTime = SC.GetValue<int>($"PM.{Module}.MoExchange.VentTime");
|
||||||
_routineTimeOut = SC.GetValue<int>($"PM.{Module}.MoExchange.RoutineTimeOut");
|
_routineTimeOut = SC.GetValue<int>($"PM.{Module}.MoExchange.RoutineTimeOut");
|
||||||
|
|
||||||
|
|
||||||
//设置TCS换源参数
|
//设置TCS换源参数
|
||||||
if (_isTCS)
|
if (_isTCS)
|
||||||
{
|
{
|
||||||
mfc7Or10 = 10;
|
mfc7Or10 = 10;
|
||||||
mfc8Or12 = 12;
|
mfc8Or11 = 11;
|
||||||
pc2Or3 = 3;
|
pc2Or3 = 3;
|
||||||
|
|
||||||
_lstGroup1 = new List<string>() { "V50"};
|
_lstGroup1 = new List<string>() { "V49" };
|
||||||
_lstGroup2 = new List<string>() { "V48" };
|
_lstGroup2 = new List<string>() { "V48", "V48s" };
|
||||||
_lstGroup3 = new List<string>() { "V49" };
|
_lstGroup3 = new List<string>() { "V50", "V50s" };
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mfc7Or10 = 7;
|
mfc7Or10 = 7;
|
||||||
mfc8Or12 = 8;
|
mfc8Or11 = 8;
|
||||||
pc2Or3 = 2;
|
pc2Or3 = 2;
|
||||||
|
|
||||||
_lstGroup1 = new List<string>() { "V46" };
|
_lstGroup1 = new List<string>() { "V45" };
|
||||||
_lstGroup2 = new List<string>() { "V43" };
|
_lstGroup2 = new List<string>() { "V43", "V43s" };
|
||||||
_lstGroup3 = new List<string>() { "V45" };
|
_lstGroup3 = new List<string>() { "V46", "V46s" };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_pmIoInterLock.SetPMExchangeMoRoutineRunning(true, out string reason))
|
if (!_pmIoInterLock.SetPMExchangeMoRoutineRunning(true, out string reason))
|
||||||
|
@ -160,6 +142,7 @@ namespace SicModules.PMs.Routines
|
||||||
EV.PostAlarmLog(Module, $"can not Exchange Mo,{reason}");
|
EV.PostAlarmLog(Module, $"can not Exchange Mo,{reason}");
|
||||||
return Result.FAIL;
|
return Result.FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
_swTimer.Restart();
|
_swTimer.Restart();
|
||||||
Notify("Start");
|
Notify("Start");
|
||||||
return Result.RUN;
|
return Result.RUN;
|
||||||
|
@ -170,59 +153,63 @@ namespace SicModules.PMs.Routines
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (SC.GetValue<bool>("System.IsATMMode"))
|
|
||||||
{
|
|
||||||
return Result.DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckRoutineTimeOut();
|
CheckRoutineTimeOut();
|
||||||
|
|
||||||
// 关闭E组和K组的阀门
|
//关闭K阀组
|
||||||
SetIoValueByGroup((int)RoutineStep.SetGroupE, IoGroupName.E, false, _IoValueOpenCloseTimeout);
|
SetIoValueByGroup((int)RoutineStep.SetGroupK, IoGroupName.K, false, _IoValueTimeout);
|
||||||
SetIoValueByGroup((int)RoutineStep.SetGroupK, IoGroupName.K, false, _IoValueOpenCloseTimeout);
|
|
||||||
SetIoValueByGroup((int)RoutineStep.SetGroupV25, IoGroupName.V25, true, _IoValueOpenCloseTimeout);
|
|
||||||
|
|
||||||
|
|
||||||
//设定M7,M8 80%,PC2设定Max
|
//设定M7,M8 80%,PC2设定Max
|
||||||
SetMfcValueByPercent((int)RoutineStep.SetM7, mfc7Or10, 80);
|
SetMfcValueByPercent((int)RoutineStep.SetM7Or10, mfc7Or10, 80);
|
||||||
SetMfcValueByPercent((int)RoutineStep.SetM8, mfc8Or12, 80);
|
SetMfcValueByPercent((int)RoutineStep.SetM8Or11, mfc8Or11, 80);
|
||||||
if (_isTCS)
|
|
||||||
{
|
|
||||||
SetMfcValueByPercent((int)RoutineStep.SetM11, mfc11, 80);
|
|
||||||
}
|
|
||||||
SetPCValueByPercent((int)RoutineStep.SetPc2, pc2Or3, 100);
|
|
||||||
|
|
||||||
//打开V73,V46,V46s,保持30s
|
//打开V73
|
||||||
SetIoValueByList((int)RoutineStep.OpenV73, _lstGroupV73, true, _IoValueOpenCloseTimeout);
|
SetIoValueByList((int)RoutineStep.OpenV73, _lstGroupV73, true, _IoValueTimeout);
|
||||||
SetIoValueByList((int)RoutineStep.SetGroup11, _lstGroup1, true, _IoValueOpenCloseTimeout);
|
|
||||||
TimeDelay((int)RoutineStep.TimeDelay1, 30);
|
|
||||||
|
|
||||||
//Loop
|
//循环开始
|
||||||
Loop((int)RoutineStep.StartLoop, _loopCount);
|
Loop((int)RoutineStep.StartLoop, _loopCount);
|
||||||
SetIoValueByList((int)RoutineStep.SetGroup1, _lstGroup1, false, _IoValueOpenCloseTimeout);
|
|
||||||
SetIoValueByList((int)RoutineStep.SetGroup2, _lstGroup2, true, _IoValueOpenCloseTimeout);
|
|
||||||
SetIoValueByList((int)RoutineStep.SetGroup3, _lstGroup3, true, _IoValueOpenCloseTimeout);
|
|
||||||
TimeDelay((int)RoutineStep.TimeDelay2, _OpenTime);
|
|
||||||
|
|
||||||
//SetIoValueByList((int)RoutineStep.SetGroup4, _lstGroup3, false, _IoValueOpenCloseTimeout);
|
//打开Group1
|
||||||
SetIoValueByList((int)RoutineStep.SetGroup5, _lstGroup2, false, _IoValueOpenCloseTimeout);
|
SetIoValueByList((int)RoutineStep.OpenGroup1, _lstGroup1, true, _IoValueTimeout);
|
||||||
SetIoValueByList((int)RoutineStep.SetGroup6, _lstGroup1, true, _IoValueOpenCloseTimeout);
|
|
||||||
TimeDelay((int)RoutineStep.TimeDelay3, _CLoseTime);
|
//关闭Group2
|
||||||
|
SetIoValueByList((int)RoutineStep.CloseGroup2, _lstGroup2, false, _IoValueTimeout);
|
||||||
|
|
||||||
|
//打开Group3
|
||||||
|
SetIoValueByList((int)RoutineStep.OpenGroup3, _lstGroup3, true, _IoValueTimeout);
|
||||||
|
|
||||||
|
TimeDelay((int)RoutineStep.TimeDelay1, _OpenTime);
|
||||||
|
|
||||||
|
//关闭Group3
|
||||||
|
SetIoValueByList((int)RoutineStep.CloseGroup3, _lstGroup3, false, _IoValueTimeout);
|
||||||
|
|
||||||
|
//打开Group2
|
||||||
|
SetIoValueByList((int)RoutineStep.OpenGroup2, _lstGroup2, true, _IoValueTimeout);
|
||||||
|
|
||||||
|
//关闭Group1
|
||||||
|
SetIoValueByList((int)RoutineStep.CloseGroup1, _lstGroup1, false, _IoValueTimeout);
|
||||||
|
|
||||||
|
TimeDelay((int)RoutineStep.TimeDelay2, _CLoseTime);
|
||||||
|
|
||||||
EndLoop((int)RoutineStep.EndLoop);
|
EndLoop((int)RoutineStep.EndLoop);
|
||||||
|
|
||||||
//关闭V73,V46,V46s
|
//关闭Group3
|
||||||
SetIoValueByList((int)RoutineStep.SetGroup6, _lstGroup1, false, _IoValueOpenCloseTimeout);
|
SetIoValueByList((int)RoutineStep.CloseGroup3_2, _lstGroup3, false, _IoValueTimeout);
|
||||||
SetIoValueByList((int)RoutineStep.CloseV73, _lstGroupV73, false, _IoValueOpenCloseTimeout);
|
|
||||||
|
|
||||||
SetMfcValueToDefaultByID((int)RoutineStep.SetM7Default, mfc7Or10);
|
//关闭Group2
|
||||||
SetMfcValueToDefaultByID((int)RoutineStep.SetM8Default, mfc8Or12);
|
SetIoValueByList((int)RoutineStep.CloseGroup2_2, _lstGroup2, false, _IoValueTimeout);
|
||||||
if (_isTCS)
|
|
||||||
{
|
|
||||||
SetMfcValueToDefaultByID((int)RoutineStep.SetM11Default, mfc11);
|
|
||||||
}
|
|
||||||
SetPcToDefault((int)RoutineStep.SetPc2Default, new List<int> { pc2Or3 });
|
|
||||||
|
|
||||||
|
//打开Group1
|
||||||
|
SetIoValueByList((int)RoutineStep.OpenGroup1_2, _lstGroup1, true, _IoValueTimeout);
|
||||||
|
|
||||||
|
//关闭V73
|
||||||
|
SetIoValueByList((int)RoutineStep.CloseV73, _lstGroupV73, true, _IoValueTimeout);
|
||||||
|
|
||||||
|
//设定M7,M8/M10,M11到默认值
|
||||||
|
SetMfcValueToDefaultByID((int)RoutineStep.SetM7Or10_2, mfc7Or10);
|
||||||
|
SetMfcValueToDefaultByID((int)RoutineStep.SetM8Or11_2, mfc8Or11);
|
||||||
|
|
||||||
|
//设置PC2/PC3到默认值
|
||||||
|
SetPcToDefault((int)RoutineStep.SetPC2Or3, new List<int> { pc2Or3 });
|
||||||
}
|
}
|
||||||
catch (RoutineBreakException)
|
catch (RoutineBreakException)
|
||||||
{
|
{
|
||||||
|
@ -248,14 +235,11 @@ namespace SicModules.PMs.Routines
|
||||||
{
|
{
|
||||||
SetRoutineRuningDo();
|
SetRoutineRuningDo();
|
||||||
|
|
||||||
PmDevice.SetIoValue(_lstGroup1,false);
|
_pmModule.SetIoValue(_lstGroup2, false);
|
||||||
PmDevice.SetIoValue(_lstGroup2, false);
|
_pmModule.SetIoValue(_lstGroup3, false);
|
||||||
PmDevice.SetMfcValueToDefault(new List<int> { mfc7Or10 });
|
_pmModule.SetMfcValueToDefault(new List<int> { mfc7Or10 });
|
||||||
PmDevice.SetMfcValueToDefault(new List<int> { mfc8Or12 });
|
_pmModule.SetMfcValueToDefault(new List<int> { mfc8Or11 });
|
||||||
PmDevice.SetMfcValueToDefault(new List<int> { mfc11 });
|
_pmModule.SetPCValueToDefault(new List<int> { pc2Or3 });
|
||||||
PmDevice.SetPCValueToDefault(new List<int> { pc2Or3 });
|
|
||||||
PmDevice.SetRotationServo(0, 0);
|
|
||||||
|
|
||||||
base.Abort();
|
base.Abort();
|
||||||
}
|
}
|
||||||
private void CheckRoutineTimeOut()
|
private void CheckRoutineTimeOut()
|
||||||
|
@ -264,7 +248,7 @@ namespace SicModules.PMs.Routines
|
||||||
{
|
{
|
||||||
if ((int)(_swTimer.ElapsedMilliseconds / 1000) > _routineTimeOut)
|
if ((int)(_swTimer.ElapsedMilliseconds / 1000) > _routineTimeOut)
|
||||||
{
|
{
|
||||||
EV.PostAlarmLog(Module, $"Routine TimeOut! over {_routineTimeOut} s");
|
Notify($"Routine TimeOut! over {_routineTimeOut} s");
|
||||||
throw (new RoutineFaildException());
|
throw (new RoutineFaildException());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,11 +258,11 @@ namespace SicModules.PMs.Routines
|
||||||
{
|
{
|
||||||
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
|
Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
|
||||||
{
|
{
|
||||||
_pm1Module.SetIoValue(lstIo, close);
|
_pmModule.SetIoValue(lstIo, close);
|
||||||
return true;
|
return true;
|
||||||
}, () =>
|
}, () =>
|
||||||
{
|
{
|
||||||
return _pm1Module.CheckIoValue(lstIo, close);
|
return _pmModule.CheckIoValue(lstIo, close);
|
||||||
},
|
},
|
||||||
timeout * 1000);
|
timeout * 1000);
|
||||||
|
|
||||||
|
@ -302,8 +286,8 @@ namespace SicModules.PMs.Routines
|
||||||
Tuple<bool, Result> ret = Execute(id, () =>
|
Tuple<bool, Result> ret = Execute(id, () =>
|
||||||
{
|
{
|
||||||
List<int> lst = new List<int> { mfcID };
|
List<int> lst = new List<int> { mfcID };
|
||||||
_pm1Module.SetMfcModelToNormal(lst);
|
_pmModule.SetMfcModelToNormal(lst);
|
||||||
_pm1Module.SetMfcValueToDefault(lst);
|
_pmModule.SetMfcValueToDefault(lst);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -319,12 +303,12 @@ namespace SicModules.PMs.Routines
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void SetMfcValueByPercent(int id,int mfcID, double percent)
|
private void SetMfcValueByPercent(int id, int mfcID, double percent)
|
||||||
{
|
{
|
||||||
Tuple<bool, Result> ret = Execute(id, () =>
|
Tuple<bool, Result> ret = Execute(id, () =>
|
||||||
{
|
{
|
||||||
_pm1Module.SetMfcModelToNormal(new List<int> { mfcID });
|
_pmModule.SetMfcModelToNormal(new List<int> { mfcID });
|
||||||
_pm1Module.SetMfcValueByPercent(mfcID, percent);
|
_pmModule.SetMfcValueByPercent(mfcID, percent);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -339,12 +323,12 @@ namespace SicModules.PMs.Routines
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetPCValueByPercent(int id,int pcID,double percent)
|
private void SetPCValueByPercent(int id, int pcID, double percent)
|
||||||
{
|
{
|
||||||
Tuple<bool, Result> ret = Execute(id, () =>
|
Tuple<bool, Result> ret = Execute(id, () =>
|
||||||
{
|
{
|
||||||
_pm1Module.SetPcModelToNormal(new List<int> { pcID });
|
_pmModule.SetPcModelToNormal(new List<int> { pcID });
|
||||||
_pm1Module.SetPCValueByPercent(pcID, percent);
|
_pmModule.SetPCValueByPercent(pcID, percent);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
-
|
-
|
||||||
- 新特性
|
- 新特性
|
||||||
- 1.PreProcess时旋转后延时再升隔热罩改到PostTransfer Routine中
|
- 1.PreProcess时旋转后延时再升隔热罩改到PostTransfer Routine中
|
||||||
|
-2.修改MOExchange Routine到最新流程
|
||||||
|
|
||||||
## Version 1.0.5.15
|
## Version 1.0.5.15
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue