Browse Source

1.增加单臂,双臂,Ignore Ionizer error, gas1~5 warning range and time ,双轴伺服pos diff 配置
2.增加DI_Lift_Servo_Group_Current_Pos_DIff_Alarm报警信号以及AO_Lift_Servo_Group_ABS_POS_Diff 信号默认值设置
3.模拟器相应的修改

JET-YDB\JET-YANGDB 3 weeks ago
parent
commit
ef6f73344e

BIN
VirgoRT/Config/DeviceModelVirgo.xml


BIN
VirgoRT/Config/Interlock.Virgo.xml


+ 24 - 1
VirgoRT/Config/System.sccfg

@@ -73,10 +73,11 @@
 
 	
 		<config default="4" name="EfemType" nameView="EFEM Type" description="EFEM type,1=Future 2=Jet 3=Brooks 4=BeamSUNWAY" max="300" min="1" paramter="" tag="" unit="" type="Integer" />
-
+    <config default="1" name="EfemRobotArmType" nameView="EFEM robot arm type" description="EFEM robot arm type,1=Double arm 2=Single arm" max="300" min="1" paramter="" tag="" unit="" type="Integer" />
 		<config default="false" name="AutoUnlockAfterUnload" nameView="auto unlock after unload" description="auto unlock after unload" max="" min="" paramter="" tag="" unit="" type="Bool" />
 
 		<config default="false" name="IgnoreWaterFlowError" nameView="Ignore water flow alarm" description="Ignore water flow alarm" max="" min="" paramter="" tag="" unit="" type="Bool" />
+    <config default="false" name="IgnoreIonizerError" nameView="Ignore Ionizer alarm" description="Ignore Ionizer alarm" max="" min="" paramter="" tag="" unit="" type="Bool" />
 		<config default="false" name ="VerifyWaferExistenceAtferRetract" nameView="Auto Verify Wafer existance after retract robot arm" description="Auto Verify Wafer existance after retract robot arm" max="" min="" paramter="" tag="" unit="" type="Bool" visible="false"/>
 
 		<config default="40" name="DelayTimeBeforeLiftDown" nameView="Delay Time before lift down" description="Delay Time before lift down" max="600" min="0" paramter="" tag="" unit="second" type="Integer" />
@@ -274,6 +275,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="MfcGas2" nameView="MFC Gas2" >
 			<config default="true" name="Enable" nameView="Enable" description="Enable gas 2 or not" tag="" unit="" type="Bool" />
@@ -285,6 +288,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="MfcGas3" nameView="MFC Gas3" >
 			<config default="true" name="Enable" nameView="Enable" description="Enable gas 3 or not" tag="" unit="" type="Bool" />
@@ -296,6 +301,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="MfcGas4" nameView="MFC Gas4" >
 			<config default="true" name="Enable" nameView="Enable" description="Enable gas 4 or not" tag="" unit="" type="Bool" />
@@ -307,6 +314,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="Mfc Enable Alarm" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="Mfc Alarm Range" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="Mfc Alarm Time" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="MfcGas5" nameView="MFC Gas5" >
 			<config default="true" name="Enable" nameView="Enable" description="Enable gas 5 or not" tag="" unit="" type="Bool" />
@@ -318,6 +327,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="Mfc Enable Alarm" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="Mfc Alarm Range" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="Mfc Alarm Time" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="Pump" nameView="Pump" >
 			<config default="30" name="LeakRate" nameView="Leak Rate" description="" max="756000" min="0" paramter="" tag="" unit="mTorrPerMin" type="Double" />
@@ -498,6 +509,7 @@
       <config default="0" name="Position1" nameView="Lift Servo Position1" description="Lift Servo Position1" max="1000" min="-100"  paramter="" tag="" unit="mm" type="Double" />
       <config default="0" name="Position2" nameView="Lift Servo Position2" description="Lift Servo Position2" max="1000" min="-100"  paramter="" tag="" unit="mm" type="Double" />
       <config default="0" name="Position3" nameView="Lift Servo Position3" description="Lift Servo Position3" max="1000" min="-100"  paramter="" tag="" unit="mm" type="Double" />
+      <config default="0" name="PosDiff" nameView="Lift Servo Pos Diff" description="Lift Servo Pos Diff" max="5" min="0"  paramter="" tag="" unit="mm" type="Double" />
     </configs>
     <configs name="TriStateLiftPin4" nameView="Double Group TriState LiftPin Setting" visible="true">
       <config default="5" name="AutoSpeed" nameView="Lift Servo Auto speed" description="Lift Servo Auto speed" max="100" min="0"  paramter="" tag="" unit="mm/s" type="Double" />
@@ -681,6 +693,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="MfcGas2" nameView="MFC Gas2" >
 			<config default="true" name="Enable" nameView="Enable" description="Enable gas 2 or not" tag="" unit="" type="Bool" />
@@ -692,6 +706,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="MfcGas3" nameView="MFC Gas3" >
 			<config default="true" name="Enable" nameView="Enable" description="Enable gas 3 or not" tag="" unit="" type="Bool" />
@@ -703,6 +719,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="MfcGas4" nameView="MFC Gas4" >
 			<config default="true" name="Enable" nameView="Enable" description="Enable gas 4 or not" tag="" unit="" type="Bool" />
@@ -714,6 +732,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="MFC Enable Alarm" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="MFC Alarm Range" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="MFC Alarm Time" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="MfcGas5" nameView="MFC Gas5" >
 			<config default="true" name="Enable" nameView="Enable" description="Enable gas 5 or not" tag="" unit="" type="Bool" />
@@ -725,6 +745,8 @@
 			<config default="true" name="MfcEnableAlarm" nameView="MFC Enable Alarm" description="MFC Enable Alarm" max="1" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="10" name="MfcAlarmRange" nameView="MFC Alarm Range" description="MFC Alarm Range" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
 			<config default="10" name="MfcAlarmTime" nameView="MFC Alarm Time" description="MFC Alarm Time" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
+      <config default="10" name="MfcWarningRange" nameView="MFC Warning Range" description="" max="200" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+      <config default="10" name="MfcWarningTime" nameView="MFC Warning Time" description="" max="60" min="0" paramter="" tag="" unit="second" type="Integer" />
 		</configs>
 		<configs name="Pump" nameView="Pump" >
 			<config default="30" name="LeakRate" nameView="Leak Rate" description="" max="756000" min="0" paramter="" tag="" unit="mTorrPerMin" type="Double" />
@@ -906,6 +928,7 @@
       <config default="0" name="Position1" nameView="Lift Servo Position1" description="Lift Servo Position1" max="1000" min="-100"  paramter="" tag="" unit="mm" type="Double" />
       <config default="0" name="Position2" nameView="Lift Servo Position2" description="Lift Servo Position2" max="1000" min="-100"  paramter="" tag="" unit="mm" type="Double" />
       <config default="0" name="Position3" nameView="Lift Servo Position3" description="Lift Servo Position3" max="1000" min="-100"  paramter="" tag="" unit="mm" type="Double" />
+      <config default="0" name="PosDiff" nameView="Lift Servo Pos Diff" description="Lift Servo Pos Diff" max="5" min="0"  paramter="" tag="" unit="mm" type="Double" />
     </configs>
     <configs name="TriStateLiftPin4" nameView="Double Group TriState LiftPin Setting" visible="true">
       <config default="5" name="AutoSpeed" nameView="Lift Servo Auto speed" description="Lift Servo Auto speed" max="100" min="0"  paramter="" tag="" unit="mm/s" type="Double" />

+ 2 - 2
VirgoRT/Config/_ioDefineVirgo.xml

@@ -144,7 +144,7 @@
     <DI_ITEM Index="140" Name="DI_Lift_Servo_2_Over_Software_Alarm" Addr="W28.12" Device=""  Note="0=Normal, 1=Alarm  伺服驱动-1设置软限位超出报警" />
     <DI_ITEM Index="141" Name="" />
     <DI_ITEM Index="142" Name="" />
-    <DI_ITEM Index="143" Name="" />
+    <DI_ITEM Index="143" Name="DI_Lift_Servo_Group_Current_Pos_DIff_Alarm" Addr="W28.15" Device=""  Note="0=Normal, 1=Alarm" />
     <DI_ITEM Index="144" Name="DI_Substrate_Heat_PID_AT_Star_FB" Addr="W29.00" Device="" />
     <DI_ITEM Index="145" Name="DI_Substrate_Heat_PID_AT_Stop_FB" Addr="W29.01" Device="" />
     <DI_ITEM Index="146" Name="DI_CHB_Heat_PID_AT_Star_FB" Addr="W29.02" Device="" />
@@ -355,7 +355,7 @@
 		<AO_ITEM Index="43" Name="" />
 		<AO_ITEM Index="44" Name="" />
     <AO_ITEM Index="45" Name="AO_Lift_Servo_Work_Mode" Addr="D1090" Device="" />
-    <AO_ITEM Index="46" Name="" />
+    <AO_ITEM Index="46" Name="AO_Lift_Servo_Group_ABS_POS_Diff" Addr="D1092" Device="" />
     <AO_ITEM Index="47" Name="" />
     <AO_ITEM Index="48" Name="" />
     <AO_ITEM Index="49" Name="" />

+ 14 - 6
VirgoRT/Devices/EFEM/Efem.cs

@@ -673,9 +673,13 @@ namespace VirgoRT.Devices.EFEM
                         }
                         if (!baData1[1])   // Bit[1] ON=Normal, OFF=Abnormal
                         {
-                            EV.Notify(EFEMIonizerAlarm);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM Ionizer compressed air error");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
+                            if (!SC.ContainsItem("EFEM.IgnoreIonizerError") ||
+                               !SC.GetValue<bool>("EFEM.IgnoreIonizerError"))
+                            {
+                                EV.Notify(EFEMIonizerAlarm);
+                                EV.PostAlarmLog(Module.ToString(), "EFEM Ionizer compressed air error");
+                                Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
+                            }
                         }
                         if (!baData1[2])   // Bit[2] ON=Normal, OFF=Abnormal
                         {
@@ -685,9 +689,13 @@ namespace VirgoRT.Devices.EFEM
                         }
                         if (!baData1[4])   // Bit[4] ON=Normal, OFF=Abnormal
                         {
-                            EV.Notify(EFEMFlowGaugeSensorError);
-                            EV.PostAlarmLog(Module.ToString(), "EFEM Flow gauge sensor error");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
+                            if (!SC.ContainsItem("EFEM.IgnoreWaterFlowError") ||
+                               !SC.GetValue<bool>("EFEM.IgnoreWaterFlowError"))
+                            {
+                                EV.Notify(EFEMFlowGaugeSensorError);
+                                EV.PostAlarmLog(Module.ToString(), "EFEM Flow gauge sensor error");
+                                Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
+                            } 
                         }
                         if (!baData1[5])   // Bit[5] ON=Normal, OFF=Abnormal
                         {

+ 36 - 2
VirgoRT/Devices/EFEM/EfemAction.cs

@@ -549,9 +549,9 @@ namespace VirgoRT.Devices.YASKAWA
         {
             this.Status = ActionStatus.Completed;
             //000/111 upperArmWafer, lowerArmWafer, alignerWafer1, alignerWafer2,  coolingwafer1,coolingwafer2
-            if (data.Length != 6 )
+            if (data.Length < 6 )
             {
-                LOG.Write($"EFEM Track wafer present return invalid value, {data}, should be 6 characters");
+                LOG.Write($"EFEM Track wafer present return invalid value, {data}, less then 6 characters");
                 return;
             }
 
@@ -651,6 +651,40 @@ namespace VirgoRT.Devices.YASKAWA
                 }
             }
 
+            if(data.Length > 6)
+            {
+                if (data[6] == '1')
+                {
+                    if (WaferManager.Instance.CheckNoWafer(ModuleName.Buffer, 0))
+                    {
+                        WaferManager.Instance.CreateWafer(ModuleName.Buffer, 0, WaferStatus.Normal);
+                    }
+                }
+                else
+                {
+                    if (WaferManager.Instance.CheckHasWafer(ModuleName.Buffer, 0))
+                    {
+                        EV.PostWarningLog(Module.ToString(), $" {ModuleName.Buffer} slot 1 has wafer information, while EFEM return empty, manually delete if really no wafer");
+                    }
+                }
+            }
+            if (data.Length > 7)
+            {
+                if (data[7] == '1')
+                {
+                    if (WaferManager.Instance.CheckNoWafer(ModuleName.Buffer, 1))
+                    {
+                        WaferManager.Instance.CreateWafer(ModuleName.Buffer, 1, WaferStatus.Normal);
+                    }
+                }
+                else
+                {
+                    if (WaferManager.Instance.CheckHasWafer(ModuleName.Buffer, 1))
+                    {
+                        EV.PostWarningLog(Module.ToString(), $" {ModuleName.Buffer} slot 2 has wafer information, while EFEM return empty, manually delete if really no wafer");
+                    }
+                }
+            }
         }
     }
 

+ 3 - 0
VirgoRT/Devices/IODevices/IoTriStateLift2.cs

@@ -50,6 +50,7 @@ namespace VirgoRT.Devices
         private readonly AOAccessor _aoAutoSpeed;
         private readonly AOAccessor _aoManualSpeed;
         private readonly AOAccessor _aoAccDecSpeedTime;
+        private readonly AOAccessor _aoPosDiff;
         private readonly AOAccessor _aoDecTime;
         private readonly AOAccessor _aoSoftUpLimit;
         private readonly AOAccessor _aoSoftDownLimit;
@@ -157,6 +158,7 @@ namespace VirgoRT.Devices
             _aoSoftUpLimit = ParseAoNode("aoSoftUpLimit", node, ioModule);
             _aoSoftDownLimit = ParseAoNode("aoSoftDownLimit", node, ioModule);
             _aoAccDecSpeedTime = ParseAoNode("aoAccDecSpeedTime", node, ioModule);
+            _aoPosDiff = ParseAoNode("aoPosDiff", node, ioModule);
         }
 
         private void updatePinCfg()
@@ -179,6 +181,7 @@ namespace VirgoRT.Devices
             _updateItem("Position1", _aoSetP1);
             _updateItem("Position2", _aoSetP2);
             _updateItem("Position3", _aoSetP3);
+            _updateItem("PosDiff", _aoPosDiff);
 
         }
         public bool GoPosition(Position position)

+ 1 - 1
VirgoRT/Modules/ManualTransfer.cs

@@ -67,7 +67,7 @@ namespace VirgoRT.Modules
                 return Result.FAIL;
             }
 
-            Hand blade = WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 0) ? Hand.Blade1 : Hand.Blade2;
+            Hand blade = (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 0) && SC.GetValue<bool>("EFEM.EfemRobot.LowerBladeEnable")) ? Hand.Blade1 : Hand.Blade2;
             if (source == ModuleName.EfemRobot)
                 blade = ss == 0 ? Hand.Blade1 : Hand.Blade2;
             else if (target == ModuleName.EfemRobot)

+ 8 - 8
VirgoSimulator/Config/_ioDefineVirgo.xml

@@ -144,13 +144,13 @@
     <DI_ITEM Index="140" Name="DI_Lift_Servo_2_Over_Software_Alarm" Addr="W28.12" Device=""  Note="0=Normal, 1=Alarm  伺服驱动-1设置软限位超出报警" />
     <DI_ITEM Index="141" Name="" />
     <DI_ITEM Index="142" Name="" />
-    <DI_ITEM Index="143" Name="" />
-    <DI_ITEM Index="144" Name="DI_Substrate_Heat_PID_AT_Star_Fb" Addr="W29.00" Device="" />
-    <DI_ITEM Index="145" Name="DI_Substrate_Heat_PID_AT_Stop_Fb" Addr="W29.01" Device="" />
-    <DI_ITEM Index="146" Name="DI_CHB_Heat_PID_AT_Star_Fb" Addr="W29.02" Device="" />
-    <DI_ITEM Index="147" Name="DI_CHB_Heat_PID_AT_Stop_Fb" Addr="W29.03" Device="" />
-    <DI_ITEM Index="148" Name="DI_Forline_Heat_PID_AT_Star_Fb" Addr="W29.04" Device="" />
-    <DI_ITEM Index="149" Name="DI_Forline_Heat_PID_AT_Stop_Fb" Addr="W29.05" Device="" />
+    <DI_ITEM Index="143" Name="DI_Lift_Servo_Group_Current_Pos_DIff_Alarm" Addr="W28.15" Device=""  Note="0=Normal, 1=Alarm" />
+    <DI_ITEM Index="144" Name="DI_Substrate_Heat_PID_AT_Star_FB" Addr="W29.00" Device="" />
+    <DI_ITEM Index="145" Name="DI_Substrate_Heat_PID_AT_Stop_FB" Addr="W29.01" Device="" />
+    <DI_ITEM Index="146" Name="DI_CHB_Heat_PID_AT_Star_FB" Addr="W29.02" Device="" />
+    <DI_ITEM Index="147" Name="DI_CHB_Heat_PID_AT_Stop_FB" Addr="W29.03" Device="" />
+    <DI_ITEM Index="148" Name="DI_Foreline_Heat_PID_AT_Star_FB" Addr="W29.04" Device="" />
+    <DI_ITEM Index="149" Name="DI_Foreline_Heat_PID_AT_Stop_FB" Addr="W29.05" Device="" />
     <DI_ITEM Index="150" Name="" />
     <DI_ITEM Index="151" Name="" />
     <DI_ITEM Index="152" Name="DI_Substrate_Heat_PID_AT_Running" Addr="W29.08" Device="" />
@@ -355,7 +355,7 @@
     <AO_ITEM Index="43" Name="" />
     <AO_ITEM Index="44" Name="" />
     <AO_ITEM Index="45" Name="AO_Lift_Servo_Work_Mode" Addr="D1090" Device="" />
-    <AO_ITEM Index="46" Name="" />
+    <AO_ITEM Index="46" Name="AO_Lift_Servo_Group_ABS_POS_Diff" Addr="D1092" Device="" />
     <AO_ITEM Index="47" Name="" />
     <AO_ITEM Index="48" Name="" />
     <AO_ITEM Index="49" Name="" />

+ 8 - 0
VirgoSimulator/Instances/SimulatorSystem.cs

@@ -266,6 +266,8 @@ namespace VirgoSimulator.Instances
             if (IO.DO[$"{mod}.DO_Lift_Servo_Group_Go_Position1"].Value)
             {
                 IO.DI[$"{mod}.DI_Lift_Virtual_Servo_Origin_Complete"].Value = false;
+                IO.DI[$"{mod}.DI_Lift_Servo_1_Servo_Origin_Complete"].Value = false;
+                IO.DI[$"{mod}.DI_Lift_Servo_2_Servo_Origin_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_1_Complete"].Value = true;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_2_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_3_Complete"].Value = false;
@@ -273,6 +275,8 @@ namespace VirgoSimulator.Instances
             if (IO.DO[$"{mod}.DO_Lift_Servo_Group_Go_Position2"].Value)
             {
                 IO.DI[$"{mod}.DI_Lift_Virtual_Servo_Origin_Complete"].Value = false;
+                IO.DI[$"{mod}.DI_Lift_Servo_1_Servo_Origin_Complete"].Value = false;
+                IO.DI[$"{mod}.DI_Lift_Servo_2_Servo_Origin_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_1_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_2_Complete"].Value = true;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_3_Complete"].Value = false;
@@ -280,6 +284,8 @@ namespace VirgoSimulator.Instances
             if (IO.DO[$"{mod}.DO_Lift_Servo_Group_Go_Position3"].Value)
             {
                 IO.DI[$"{mod}.DI_Lift_Virtual_Servo_Origin_Complete"].Value = false;
+                IO.DI[$"{mod}.DI_Lift_Servo_1_Servo_Origin_Complete"].Value = false;
+                IO.DI[$"{mod}.DI_Lift_Servo_2_Servo_Origin_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_1_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_2_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_3_Complete"].Value = true;
@@ -288,6 +294,8 @@ namespace VirgoSimulator.Instances
             if (IO.DO[$"{mod}.DO_Lift_Servo_Group_Origin"].Value)
             {
                 IO.DI[$"{mod}.DI_Lift_Virtual_Servo_Origin_Complete"].Value = true;
+                IO.DI[$"{mod}.DI_Lift_Servo_1_Servo_Origin_Complete"].Value = true;
+                IO.DI[$"{mod}.DI_Lift_Servo_2_Servo_Origin_Complete"].Value = true;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_1_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_2_Complete"].Value = false;
                 IO.DI[$"{mod}.DI_Lift_Servo_Group_Go_Pos_3_Complete"].Value = false;