浏览代码

1. 修复Match主键多次subscribe的报错
2. 修复伺服LiftPin空报警的bug
3. 增加BiasMatch在手动模式下兼容revtec match
4. 增加对createjob中空sequence文件的检查
5. 增加Load前延迟,通过VCE下配置项WaitBeforeLoad自由配置
6. 增加对Plus版VCE的指令解析和动作增加
7. 增加对Metis和200v+腔体混跑的支持,recipe文件按照IsPlus分开

zhouhr 2 月之前
父节点
当前提交
aa78f3d05e

+ 1 - 1
FrameworkLocal/Common/RecipeCenter/DefaultRecipeFileContext.cs

@@ -21,7 +21,7 @@ namespace MECF.Framework.Common.RecipeCenter
             {
                 string recipeSchema = PathManager.GetCfgDir() + $@"\Recipe\{chamberType}\RecipeFormat.xml";
 
-                if (SC.GetValue<bool>($"System.IsPlus"))
+                if (SC.GetValue<bool>($"{chamberType}.IsPlus"))
                     recipeSchema = PathManager.GetCfgDir() + @"\Recipe\JetVirgoPM\Process\RecipeFormatPlus.xml";
 
                 XmlDocument xmlDom = new XmlDocument();

+ 4 - 4
FrameworkLocal/RTEquipmentLibrary/Unit/IoLiftPin.cs

@@ -393,10 +393,10 @@ namespace Aitex.Core.RT.Device.Unit
                 NoDuplicatedAlarm($"Lift Pin DI-{_diServoAlarm.Index} 伺服驱动器报警");
             }
 
-            if (_diCCWLimitSensorAlarm.Value)
-            {
-                NoDuplicatedAlarm($"Lift Pin DI-{_diCCWLimitSensorAlarm.Index}  CCW Limit sensor 报警");
-            }
+            //if (_diCCWLimitSensorAlarm.Value)
+            //{
+            //    NoDuplicatedAlarm($"Lift Pin DI-{_diCCWLimitSensorAlarm.Index}  CCW Limit sensor 报警");
+            //}
 
             if (_diOverSoftwareLimitAlarm.Value)
             {

+ 60 - 0
JetVirgoPM/Devices/JetDualPM.cs

@@ -106,6 +106,8 @@ namespace JetVirgoPM.Devices
         private readonly RfPowerBase _GeneratorBias2;
         private readonly RfMatchBase _Match1;
         private readonly RfMatchBase _Match2;
+        private readonly RfMatchBase _BiasMatch1;
+        private readonly RfMatchBase _BiasMatch2;
         private readonly PumpBase _MainPump;
         private readonly ChillerBase _Chiller1;
         private readonly ChillerBase _Chiller2;
@@ -515,6 +517,40 @@ namespace JetVirgoPM.Devices
                 _GeneratorBias2 = DEVICE.GetDevice<CometRF>($"{Module}.{VirgoDevice.BiasRf2}");
             }
 
+            //=========================================================================================
+            //srf1 match revtec
+            if (SC.GetValue<bool>($"{mod}.match1.EnableMatch") &&
+                SC.GetValue<int>($"{mod}.match1.CommunicationType") == (int)CommunicationType.Ethernet &&
+                SC.GetValue<int>($"{mod}.match1.MFG") == (int)MatchMFG.RevTec)
+            {
+                _Match1 = DEVICE.GetDevice<RevtechMatch>($"{Module}.{VirgoDevice.Match1}");
+            }
+
+            //srf2 match revtec
+            if (SC.GetValue<bool>($"{mod}.match2.EnableMatch") &&
+                SC.GetValue<int>($"{mod}.match2.CommunicationType") == (int)CommunicationType.Ethernet &&
+                SC.GetValue<int>($"{mod}.match2.MFG") == (int)MatchMFG.RevTec)
+            {
+                _Match2 = DEVICE.GetDevice<RevtechMatch>($"{Module}.{VirgoDevice.Match2}");
+            }
+
+            //brf1 match revtec
+            if (SC.GetValue<bool>($"{mod}.BiasRf1Match.EnableMatch") &&
+                SC.GetValue<int>($"{mod}.BiasRf1Match.CommunicationType") == (int)CommunicationType.Ethernet &&
+                SC.GetValue<int>($"{mod}.BiasRf1Match.MFG") == (int)MatchMFG.RevTec)
+            {
+                _BiasMatch1 = DEVICE.GetDevice<RevtechMatch>($"{Module}.BiasRf1Match");
+            }
+
+            //brf2 match revtec
+            if (SC.GetValue<bool>($"{mod}.BiasRf2Match.EnableMatch") &&
+                SC.GetValue<int>($"{mod}.BiasRf2Match.CommunicationType") == (int)CommunicationType.Ethernet &&
+                SC.GetValue<int>($"{mod}.BiasRf2Match.MFG") == (int)MatchMFG.RevTec)
+            {
+                _BiasMatch2 = DEVICE.GetDevice<RevtechMatch>($"{Module}.BiasRf2Match");
+            }
+            //=========================================================================================
+
             // RS232 AdTec match
             if (SC.GetValue<int>($"{mod}.match1.CommunicationType") == (int)CommunicationType.RS232 &&
                 SC.GetValue<int>($"{mod}.match1.MFG") == (int)MatchMFG.AdTec)
@@ -1325,6 +1361,12 @@ namespace JetVirgoPM.Devices
 
         public bool GeneratorBias1SetMatchMode(bool val)
         {
+            if (_BiasMatch1 != null)
+            {
+                _BiasMatch1.SetMatchMode(val ? EnumRfMatchTuneMode.Auto.ToString() : EnumRfMatchTuneMode.Manual.ToString(), out _);
+                return true;
+            }
+
             if (_GeneratorBias1 == null) return false;
             string reason = string.Empty;
             _GeneratorBias1.SetMatchingAutoMode(val, out reason);
@@ -1333,6 +1375,12 @@ namespace JetVirgoPM.Devices
 
         public bool GeneratorBias2SetMatchMode(bool val)
         {
+            if (_BiasMatch2 != null)
+            {
+                _BiasMatch2.SetMatchMode(val ? EnumRfMatchTuneMode.Auto.ToString(): EnumRfMatchTuneMode.Manual.ToString(), out _);
+                return true;
+            }
+
             if (_GeneratorBias2 == null) return false;
             string reason = string.Empty;
             _GeneratorBias2.SetMatchingAutoMode(val, out reason);
@@ -1357,6 +1405,12 @@ namespace JetVirgoPM.Devices
 
         public bool SetBias1MatchPosition(float c1, float c2)
         {
+            if (_BiasMatch1 != null)
+            {
+                _BiasMatch1.SetMatchPosition(c1,c2,out _);
+                return true;
+            }
+
             if (_GeneratorBias1 == null) return false;
             string reason = string.Empty;
             _GeneratorBias1.SetMatchPosition(c1, c2, out reason);
@@ -1365,6 +1419,12 @@ namespace JetVirgoPM.Devices
 
         public bool SetBias2MatchPosition(float c1, float c2)
         {
+            if (_BiasMatch2 != null)
+            {
+                _BiasMatch2.SetMatchPosition(c1, c2, out _);
+                return true;
+            }
+
             if (_GeneratorBias2 == null) return false;
             string reason = string.Empty;
             _GeneratorBias2.SetMatchPosition(c1, c2, out reason);

+ 1 - 1
JetVirgoPM/Devices/RevtechMatch.cs

@@ -146,7 +146,7 @@ namespace JetVirgoPM.Devices
             DATA.Subscribe($"{Module}.{Name}.Vpp", () => Vpp);
             DATA.Subscribe($"{Module}.{Name}.DCBias", () => DCBias);
 
-            DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
+            //DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
 
 
 

+ 8 - 8
JetVirgoPM/JetVirgoPMDeviceManager.cs

@@ -113,7 +113,7 @@ namespace JetVirgoPM
                 }
             }
 
-            //srf1 match1 adtec
+            //srf1 match adtec
             if (SC.GetValue<bool>($"{module}.match1.EnableMatch") &&
                 SC.GetValue<int>($"{module}.match1.CommunicationType") == (int)CommunicationType.RS232 &&
                 SC.GetValue<int>($"{module}.match1.MFG") == (int)MatchMFG.AdTec)
@@ -121,7 +121,7 @@ namespace JetVirgoPM
                 device.AddCustomModuleDevice(new AdTecMatch(module, "match1"));
             }
 
-            //srf2 match2 adtec
+            //srf2 match adtec
             if (SC.GetValue<bool>($"{module}.match2.EnableMatch") &&
                 SC.GetValue<int>($"{module}.match2.CommunicationType") == (int)CommunicationType.RS232 &&
                 SC.GetValue<int>($"{module}.match2.MFG") == (int)MatchMFG.AdTec)
@@ -129,7 +129,7 @@ namespace JetVirgoPM
                 device.AddCustomModuleDevice(new AdTecMatch(module, "match2"));
             }
 
-            //brf1 match1 adtec
+            //brf1 match adtec
             if (SC.GetValue<bool>($"{module}.BiasRf1Match.EnableMatch") &&
                 SC.GetValue<int>($"{module}.BiasRf1Match.CommunicationType") == (int)CommunicationType.RS232 &&
                 SC.GetValue<int>($"{module}.BiasRf1Match.MFG") == (int)MatchMFG.AdTec)
@@ -137,7 +137,7 @@ namespace JetVirgoPM
                 device.AddCustomModuleDevice(new AdTecMatch(module, "BiasRf1Match"));
             }
 
-            //brf2 match2 adtec
+            //brf2 match adtec
             if (SC.GetValue<bool>($"{module}.BiasRf2Match.EnableMatch") &&
                 SC.GetValue<int>($"{module}.BiasRf2Match.CommunicationType") == (int)CommunicationType.RS232 &&
                 SC.GetValue<int>($"{module}.BiasRf2Match.MFG") == (int)MatchMFG.AdTec)
@@ -145,7 +145,7 @@ namespace JetVirgoPM
                 device.AddCustomModuleDevice(new AdTecMatch(module, "BiasRf2Match"));
             }
 
-            //srf1 match1 revtec
+            //srf1 match revtec
             if (SC.GetValue<bool>($"{module}.match1.EnableMatch") &&
                 SC.GetValue<int>($"{module}.match1.CommunicationType") == (int)CommunicationType.Ethernet &&
                 SC.GetValue<int>($"{module}.match1.MFG") == (int)MatchMFG.RevTec)
@@ -153,7 +153,7 @@ namespace JetVirgoPM
                 device.AddCustomModuleDevice(new RevtechMatch(module, "match1"));
             }
 
-            //srf2 match2 revtec
+            //srf2 match revtec
             if (SC.GetValue<bool>($"{module}.match2.EnableMatch") &&
                 SC.GetValue<int>($"{module}.match2.CommunicationType") == (int)CommunicationType.Ethernet &&
                 SC.GetValue<int>($"{module}.match2.MFG") == (int)MatchMFG.RevTec)
@@ -161,7 +161,7 @@ namespace JetVirgoPM
                 device.AddCustomModuleDevice(new RevtechMatch(module, "match2"));
             }
 
-            //brf1 match1 revtec
+            //brf1 match revtec
             if (SC.GetValue<bool>($"{module}.BiasRf1Match.EnableMatch") &&
                 SC.GetValue<int>($"{module}.BiasRf1Match.CommunicationType") == (int)CommunicationType.Ethernet &&
                 SC.GetValue<int>($"{module}.BiasRf1Match.MFG") == (int)MatchMFG.RevTec)
@@ -169,7 +169,7 @@ namespace JetVirgoPM
                 device.AddCustomModuleDevice(new RevtechMatch(module, "BiasRf1Match"));
             }
 
-            //brf2 match2 revtec
+            //brf2 match revtec
             if (SC.GetValue<bool>($"{module}.BiasRf2Match.EnableMatch") &&
                 SC.GetValue<int>($"{module}.BiasRf2Match.CommunicationType") == (int)CommunicationType.Ethernet &&
                 SC.GetValue<int>($"{module}.BiasRf2Match.MFG") == (int)MatchMFG.RevTec)

+ 1 - 1
JetVirgoPM/PMs/RecipeExecutors/JetVirgoPMRecipeFileContext.cs

@@ -21,7 +21,7 @@ namespace JetVirgoPM.PMs.RecipeExecutors
             {
                 string recipeSchema = PathManager.GetCfgDir() + $@"\Recipe\JetVirgoPM\Process\RecipeFormat.xml";
 
-                if (SC.GetValue<bool>($"System.IsPlus"))
+                if (SC.GetValue<bool>($"{chamberType}.IsPlus"))
                     recipeSchema = PathManager.GetCfgDir() + @"\Recipe\JetVirgoPM\Process\RecipeFormatPlus.xml";
 
                 XmlDocument xmlDom = new XmlDocument();

+ 1 - 1
JetVirgoPM/PMs/RecipeExecutors/Recipe.cs

@@ -40,7 +40,7 @@ namespace JetVirgoPM.PMs.RecipeExecutors
                 
                 string recipeSchema = PathManager.GetCfgDir() + @"\Recipe\JetVirgoPM\Process\RecipeFormat.xml";
 
-                if (SC.GetValue<bool>($"System.IsPlus"))
+                if (SC.GetValue<bool>($"{chamberId}.IsPlus"))
                     recipeSchema = PathManager.GetCfgDir() + @"\Recipe\JetVirgoPM\Process\RecipeFormatPlus.xml";
 
                 rcpFormatDoc.Load(recipeSchema);

+ 6 - 5
Mars/EfemDualRT/Config/System.sccfg

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <root system="EfemDual">
   <configs name="System" display="">
-    <config default="false" name="IsPlus"  description="Is Plus System" max="0" min="0" paramter="" tag="" unit="" type="Bool"  />
     <config default="true" name="IsSimulatorMode" description="Is Simulator Mode" max="" min="" paramter="" tag="" unit="" type="Bool" />
     <config default="true" name="IsATMMode" description="Is ATM Mode" max="" min="" paramter="" tag="" unit="" type="Bool" />
     <config default="true" name="OnlineNeedPressureControl" description="Online Need Pressure Control" max="" min="" paramter="" tag="" unit="" type="Bool" />
@@ -215,7 +214,8 @@
     <config default="30" name="LeakRate" description="Leak Rate" max="756000" min="0" paramter="" tag="" unit="mTorrPerMin" type="Double" />
     <config default="25" name="SlotNumber" nameView="VCE SlotNumber" description="槽位个数" max="99" min="0" paramter="" tag="" unit="" type="Integer" />
     <config default="0" name="MFCWriteMode" nameView="MFCWriteMode" description=" 0:Flow; 1:Percent" max="1" min="0" paramter="" tag="" unit="" type="Integer" />
-
+    <config default="60" name="WaitBeforeLoad" nameView="WaitBeforeLoad" description="Load动作执行前等待" max="600" min="0" paramter="" tag="" unit="s" type="Integer" />
+    
     <configs name="SMIF" nameView="SMIF" >
       <config default="1" name="Manufacturer" nameView="Manufacturer" description="厂商, 1:Fortrend;" max="2" min="1" paramter="" tag="" unit="" type="Integer" />
       <config default="1" name="CommunicationType" nameView="Communication Type" description="0:Analogue; 1:RS232; 2:Ethernet" max="10" min="0" paramter="" tag="" unit="" type="Integer" />
@@ -246,6 +246,7 @@
     <config default="30" name="LeakRate" description="Leak Rate" max="756000" min="0" paramter="" tag="" unit="mTorrPerMin" type="Double" />
     <config default="25" name="SlotNumber" nameView="VCE SlotNumber" description="槽位个数" max="99" min="0" paramter="" tag="" unit="" type="Integer" />
     <config default="0" name="MFCWriteMode" nameView="MFCWriteMode" description=" 0:Flow; 1:Percent" max="1" min="0" paramter="" tag="" unit="" type="Integer" />
+    <config default="60" name="WaitBeforeLoad" nameView="WaitBeforeLoad" description="Load动作执行前等待" max="600" min="0" paramter="" tag="" unit="s" type="Integer" />
 
     <configs name="SMIF" nameView="SMIF" >
       <config default="1" name="Manufacturer" nameView="Manufacturer" description="厂商, 1:Fortrend;" max="2" min="1" paramter="" tag="" unit="" type="Integer" />
@@ -610,7 +611,7 @@
 
 
   <configs name="PMA">
-    <config default="false" name="IsPlus"  description="Is Plus PM" max="0" min="0" paramter="" tag="" unit="" type="Bool"  />
+    <config default="true" name="IsPlus"  description="Is Plus PM" max="0" min="0" paramter="" tag="" unit="" type="Bool"  />
     <config default="30" name="HomeTimeout" description="Home Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer" />
     <config default="30" name="PostTransferTimeout" description="PostTransfer Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer" />
     <config default="30" name="PrepareTransferTimeout" description="PrepareTransfer Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer"  />
@@ -1027,7 +1028,7 @@
     </configs>
   </configs>
   <configs name="PMB">
-    <config default="false" name="IsPlus"  description="Is Plus PM" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
+    <config default="true" name="IsPlus"  description="Is Plus PM" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
     <config default="30" name="HomeTimeout" description="Home Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer" />
     <config default="30" name="PostTransferTimeout" description="PostTransfer Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer" />
     <config default="30" name="PrepareTransferTimeout" description="PrepareTransfer Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer"  />
@@ -1443,7 +1444,7 @@
     </configs>
   </configs>
   <configs name="PMC">
-    <config default="false" name="IsPlus"  description="Is Plus PM" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
+    <config default="true" name="IsPlus"  description="Is Plus PM" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
     <config default="30" name="HomeTimeout" description="Home Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer" />
     <config default="30" name="PostTransferTimeout" description="PostTransfer Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer" />
     <config default="30" name="PrepareTransferTimeout" description="PrepareTransfer Timeout" max="300" min="1" paramter="" tag="" unit="s" type="Integer"  />

+ 77 - 1
Mars/EfemDualRT/ReleaseNotes.txt

@@ -4,8 +4,84 @@
 					 EfemDual 系统更新历史记录
 
 ---------------------------------------------------------------------------------
+2024-08-12 version 2.1.8.0
+1. 修复选片错位的bug。
+2.增加自定义左右lotname功能。
 
+2024-08-05 version 2.1.7.0
+1.修复无法正常跑片的bug,增加水漏报警文字描述。
+2.修改autotransfer中createjob的参数解析以支持eap传参,同步修改界面中传参,修复交叉放片无法跑片的问题,修复CheckModuleMatch部分无法正常检测左右放片的问题。
 
-2020-11-29 version 1.0.0.0
+2024-08-01 version 2.1.6.0
+1.完成新的eap load功能(即客户提出的load时候port id分开,两个CST两次load指令).
+
+2024-07-22 version 2.1.5.0
+1. 增加一个VCE对于两个LotID的支持,缺省默认采用jobId,修改原先的lotname,先采用","分割用于UI中分割左右cassette的lotid
+2. 修复startcj重复插入导致的数据库插入失败从而引发的一连串数据库失联问题.
+3. 修复cyclemode下无法进行cycle的问题,对比后发现是在CompleteCJAndShowDialog中增加了processjob相关wafer清除导致问题.
+4. 修复WafeHistory中模糊查询lotname无法生效的问题.
+5.根据新的S2F49格式完成PPSelect功能的调整,修复CreateJob parameter loadport参数,解决seq与loadport不一致的问题.
+
+2024-06-28 version 2.1.4.0
+1.加了EquipmentOffline事件;修复了Recipe Job相应的事件;增加了JobWaferStart和JobWaferEnd事件.
+2.修复JobFinish Wafer count的问题.
+
+2024-06-21 version 2.1.3.0 
+1.增加完成一个controljob以后弹框提示,按照泓浒的最新定义修改recipe扫片结果的提示。
+2.update secsgem dll for modify local/remote state.
+3.增加Cassette Present信号的LOG输出, 增加了Cassette arrive和Cassette Remove Eap事件,增加了Loadad,Unloaded,slot Map 事件.修复了Load和Unload PortId数据问题.
+
+2024-06-4 version 2.1.2.0
+1.增加TM pump前检查对VCE Outer和InnerDoor同时打开情况下的检查.
+2.删除Halt,泓浒Robot Halt会导致设备下电 无法急刹,增加autorunning下abort后提示操作员TM做初始化,增加VCE在主界面的CurrentSlot显示,去除非必要的log提示。
+3.增加cassette arrive动画和相关信号.
+
+2024-05-27 version 2.1.1.0
+1.offline改为红色显示。
+2.修复软件启动后 online退出默认fast pump动画打开(实际不开)的bug,继续尝试修复获取VCEOuterDoorLOCKED的信号。
+3.取消VAC中不开启softpump。增加基于命名规范区分Clean与Process,用于EF开启的判定,凡包含PreJob,PreClean,PostJob,PostClean都未clean,打RF无需checkwafer。
+4.修复PMC processhistory不显示的bug,增加vce job的online检测,修改prejob的处理方案,preclean的是否有必要打现取决于最后一次process(非postclean时间)。
+2024-05-25 version 2.1.0.0
+
+1.修复PM做完PreClean不做sequence的bug,原因是原先需要所有PM Online方可将job置为Excuting。
+2.修复一遍cycle后wafer颜色不对的bug导致的cycle只进行一次的问题。
+
+2024-05-24 version 2.0.9.0
+1.去除了EAP去运行时的一些日志记录,防止EAP log持续刷新。
+2.PM infomation页面显示为Temp,根据是否使用Chiller来显示使用的是heater温度还是Chiller温度。
+3.修复PM中单片wafer,两腔都射频的问题.
+4.RobotHome中增加CheckLoad及查询CheckLoad结果流程.
+5.pump中如果是VAC状态,PMPump将不会开启SoftPump,unload先GotoLP再Vent.
+6.增加TM VCE PM Online/Offline的状态区分显示.Offline显示为淡红色。
+7.VCE开门状态下 Z轴动作或pump的拦截 基于门阀LOCKED信号判断.
+
+2024-05-16 version 2.0.8.0 
+1.增加 cooling => pm => cooling的sequence Cycle支持.
+
+2024-05-13 version 2.0.7.0
+1.Configuration SaveALL按钮可用。
+2.PMA/PMB  gas 动画补充。
+3.Overviews界面 Load/Unload 状态切换灰明变化。
+4.没有wafer不能recipe后得PM状态不切换为recipeprocess。
+5.修复AWC错误后不报警的问题,修改触发的ErrorCode,灯塔显示更新。(等待实际机台测试)
+
+2024-05-10 version 2.0.6.0
+1. 在Abort按钮点击后,不再切换为AutoIdle状态,而是切换为idle状态。
+2. 修复TM,VCE PM报警后ERROR灯不亮,buzzer不响的问题。(等待实际机台测试各种场景)
+3. SmartTag文本框根据config配置进行visible or invisible。
+4. VCE Goto差1的问题,显示VCE Goto输入为下拉框。
+5. CycleMode下,information显示,否则不显示, ATMMode模式下显示。
+6. 显示TM VCEA VCEB腔体压力。
+7. 手动拖片,TMOnline提示,Cannot Start transfer as TM.
+8. System Abort中执行VCE执行, VCE Abort后进入Init状态 强制必须进行Home操作。
+9. Mapping后清除wafer中的数据,以解决没能unload情况下的,wafer进入腔体不进行工艺运行的问题。
+10. 增加TM传片失败后将System置为ERROR。
+
+2024-05-09 version 2.0.5.0
+1.减少数据库中部分非必要项的写入.
+2. 更换SecsGem相应的dll类库.
+3.EAP连接后亮蓝灯。
+
+2020-11-29 version 2.0.0.0
 1.初始版本
  

+ 6 - 0
Mars/EfemDualSchedulerLib/SequenceInfoHelper.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Xml;
+using Aitex.Core.RT.Event;
 using Aitex.Core.RT.Log;
 using Aitex.Core.RT.RecipeCenter;
 using MECF.Framework.Common.Equipment;
@@ -213,6 +214,11 @@ namespace EfemDualSchedulerLib
                     return null;
                 }
             }
+            else
+            {
+                EV.PostAlarmLog("Sequence",$"cannot get SequenceFile:{seqFile}");
+                return null;
+            }
 
             return info;
         }

+ 11 - 0
Mars/EfemDualSchedulerLib/VCEDualAutoTransfer.cs

@@ -658,6 +658,15 @@ namespace EfemDualSchedulerLib
                     pj.SlotWafers = seqSlotWafers[seqs[i]];
                     pj.SetState(EnumProcessJobState.Queued);
 
+                    if (pj.Sequence == null)
+                    {
+                        EV.PostInfoLog(LogSource, $"seqence name is not valid");
+                        lotId.ForEach(x => {
+                            _faCallback.JobCreateFailed(module, x, jobId, "");
+                        });
+                        return false;
+                    }
+
                     if (!CheckSequencePmReady(pj.Sequence, null, out _, out reason))
                     {
                         EV.PostInfoLog(LogSource, $"no valid chamber for the {reason}");
@@ -2871,6 +2880,8 @@ namespace EfemDualSchedulerLib
 
             _VceModules[cj.Module].ForEach(wafer => wafer = MovingStatus.Waiting);
 
+            _cycleState = RState.End;
+
             return true;
         }
 

+ 21 - 7
Mars/JetMainframe/Devices/HongHuVCE.cs

@@ -121,6 +121,7 @@ namespace JetMainframe.Devices
         private string _currentMsg;
         private VceMessage _currentVceMessage;
         private bool _HasReceiveMsg;
+        private bool _isPlus;
 
         private bool _LeftDoorIsClose = true;
         private bool _RightDoorIsClose = true;
@@ -304,7 +305,7 @@ namespace JetMainframe.Devices
             _status = RState.End;
             _serialport.OnDataChanged += onDataChange;
             _thread = new PeriodicJob(50, fnTimer, moduleName.ToString(), true);
-
+            _isPlus = SC.GetValue<bool>($"{moduleName}.IsPlus");
 
             //CarrierManager.Instance.DeleteCarrier(_moduleName.ToString());
 
@@ -357,7 +358,10 @@ namespace JetMainframe.Devices
                     while (_lstAsciiMsgs.Count > 0)
                     {
                         string _needHandle = _lstAsciiMsgs.First.Value;
-                        HandleSingleMsg(_needHandle);
+                        foreach (string singlemsg in _needHandle.Split('\n'))
+                        {
+                            HandleSingleMsg(_needHandle);
+                        }
                         _lstAsciiMsgs.RemoveFirst();
                     }
                 }
@@ -510,16 +514,26 @@ namespace JetMainframe.Devices
         {
             try
             {
+                EV.PostInfoLog(_moduleName.ToString(), $"检测状态消息{msg}");
                 //BRa,SLbb,CPcc,WPdd,ERe
                 string[] status = msg.Split(',');
                 _currentSlot = Convert.ToInt32(status[4].Substring(2, 2));
-                _LeftDoorIsClose = status[5][2] == 'N';
-                _RightDoorIsClose = status[5][3] == 'N';
+
+                if (_isPlus)
+                {
+                    _LeftDoorIsClose = status[5][2] == 'N';
+                    _RightDoorIsClose = status[5][2] == 'N';
+                }
+                else
+                {
+                    _LeftDoorIsClose = status[5][2] == 'N';
+                    _RightDoorIsClose = status[5][3] == 'N';
+                }
                 EV.PostInfoLog(_moduleName.ToString(), $"检测到目前Slot:{_currentSlot}");
             }
             catch (Exception ex)
             {
-                EV.PostAlarmLog(_moduleName.ToString(), $"解析Door状态非法,{ex.Message}");
+                EV.PostAlarmLog(_moduleName.ToString(), $"解析状态非法,{ex.Message}");
             }
         }
 
@@ -851,7 +865,7 @@ namespace JetMainframe.Devices
         {
             if (!CheckVceStatus())
                 return false;
-            _currentVceMessage = new VceMessage { Head = VceMessageHead.Read, Command = VceCommand.RPI };
+            _currentVceMessage = new VceMessage { Head = VceMessageHead.Action, Command = VceCommand.RPI };
             _currentMsg = _currentVceMessage.toString() + _newline;
             _status = RState.Running;
             return _serialport.Write(_currentMsg);
@@ -861,7 +875,7 @@ namespace JetMainframe.Devices
         {
             if (!CheckVceStatus())
                 return false;
-            _currentVceMessage = new VceMessage { Head = VceMessageHead.Read, Command = VceCommand.RPO };
+            _currentVceMessage = new VceMessage { Head = VceMessageHead.Action, Command = VceCommand.RPO };
             _currentMsg = _currentVceMessage.toString() + _newline;
             _status = RState.Running;
             return _serialport.Write(_currentMsg);

+ 10 - 1
Mars/JetMainframe/VCEs/LoadRoutine.cs

@@ -20,6 +20,7 @@ namespace JetMainframe.VCEs
     {
         private enum LoadStep
         {
+            WaitCassette,
             RHandPI,
             CloseOutDoor,
             CheckCassette,
@@ -35,6 +36,7 @@ namespace JetMainframe.VCEs
         IVCE _vce;
         HongHuTM _tm;
         int _timeout;
+        int _waitCassette;
         MFPumpRoutine pumpRoutine;
         ModuleName _module;
 
@@ -48,7 +50,9 @@ namespace JetMainframe.VCEs
 
         public RState Start(params object[] objs)
         {
+            
             _timeout = SC.GetValue<int>($"{Module}.MotionTimeout") * 1000;
+            _waitCassette = SC.GetValue<int>($"{Module}.WaitBeforeLoad")*1000;
             //if vce inner door not close cannot do it as it will pump
 
             switch (_module)
@@ -80,7 +84,9 @@ namespace JetMainframe.VCEs
         {
 
 
-            Runner.Run(LoadStep.RHandPI, RHandPushIn, CheckVceIdle,_timeout)
+            Runner
+                  .Delay(LoadStep.WaitCassette, _waitCassette)
+                  .Run(LoadStep.RHandPI, RHandPushIn, CheckVceIdle,_timeout)
                   .Run(LoadStep.CloseOutDoor, CloseOutDoor, CheckVceIdle, _timeout)
                   .Run(LoadStep.CheckCassette, _vce.ReadCassette, CheckHasCassette,_timeout)
                   .Run(LoadStep.SetCassetteInterlock, CheckCassetteToUseInterlock, CheckVceIdle, _timeout)
@@ -92,6 +98,7 @@ namespace JetMainframe.VCEs
                   .End(LoadStep.NotifyOver, NullFun, 100);
             return Runner.Status;
         }
+        
 
         private bool CheckCassetteToUseInterlock()
         {
@@ -125,6 +132,8 @@ namespace JetMainframe.VCEs
             return _vce.Map();
         }
 
+        //private bool 
+
         private bool RHandPushIn()
         {
             if(SC.GetValue<bool>($"{Module}.IsPlus"))

文件差异内容过多而无法显示
+ 909 - 909
Mars/JetMainframe/VCEs/VCEEntity.cs