Browse Source

boat load/unload卡控氧气浓度

jiangjy 2 weeks ago
parent
commit
6daf4330b2

+ 5 - 0
Furnace/FurnaceRT/Config/System.sccfg

@@ -4693,6 +4693,9 @@
 				<config default="true" name="EAxisInhibitEnable"  description="E Axis Inhibit Enable" max="0" min="0" paramter="" tag="" unit="" type="Bool"/>
 				<config default="true" name="FoupInhibitEnable"  description="Foup Inhibit Enable When boatloading" max="0" min="0" paramter="" tag="" unit="" type="Bool"/>
 				<config default="true" name="TransferRoomO2DensityKeepEnable"  description="LA O2 Density Keep boatloading Enable" max="0" min="0" paramter="" tag="" unit="" type="Bool"/>
+				<config default="0"    name="LAO2CheckSV" description=" LA O2 CheckSV" max="999999" min="0" paramter="" tag="" unit="s" type="Double" />
+
+
 			</configs>
 			<configs  visible="false" name="FoupInhibit">
 				<config default="true" name="FoupInhibitEnable"  description="Foup Inhibit Enable After BoatLoad" max="0" min="0" paramter="" tag="" unit="" type="Bool"/>
@@ -4704,6 +4707,8 @@
 				<config default="true" name="EAxisInhibitEnable"  description="E Axis Inhibit Enable" max="0" min="0" paramter="" tag="" unit="" type="Bool"/>
 				<config default="true" name="FoupInhibitEnable"  description="Foup Inhibit Enable When boatUnloading" max="0" min="0" paramter="" tag="" unit="" type="Bool"/>
 				<config default="true" name="TransferRoomO2DensityKeepEnable"  description="LA O2 Density Keep boatloading Enable" max="0" min="0" paramter="" tag="" unit="" type="Bool"/>
+				<config default="0"    name="LAO2CheckSV" description=" LA O2 CheckSV" max="999999" min="0" paramter="" tag="" unit="s" type="Double" />
+
 			</configs>
 			<configs visible="false" name="WaferCooling">
 				<config default="true" name="FoupInhibitEnable"  description="Foup Inhibit Enable When Wafer Cooling" max="0" min="0" paramter="" tag="" unit="" type="Bool"/>

+ 2 - 1
Furnace/FurnaceRT/Equipments/Boats/BoatModule.cs

@@ -24,6 +24,7 @@ using Aitex.Core.Util;
 using MECF.Framework.Common.Device.Bases;
 using Aitex.Core.RT.Log;
 using FurnaceRT.Devices;
+using FurnaceRT.Equipments.PMs;
 
 namespace FurnaceRT.Equipments.Boats
 {
@@ -538,7 +539,7 @@ namespace FurnaceRT.Equipments.Boats
 
             return ret == Result.DONE;
         }
-
+    
         public bool CheckPrepareMove(out string reason, bool isNeedCheckShutter = true)
         {
             reason = string.Empty;

+ 116 - 4
Furnace/FurnaceRT/Equipments/Boats/BoatMove.cs

@@ -19,6 +19,11 @@ using FurnaceRT.Equipments.Systems;
 using static Aitex.Core.RT.Device.Unit.IoBoat;
 using System.Diagnostics;
 using FurnaceRT.Devices;
+using FurnaceRT.Equipments.PMs;
+using MECF.Framework.Common.Tolerance;
+using MECF.Framework.Common.CommonData.SorterDefines;
+using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
+using Aitex.Core.RT.Log;
 
 namespace FurnaceRT.Equipments.Boats
 {
@@ -34,8 +39,8 @@ namespace FurnaceRT.Equipments.Boats
             SetBoatRAxisMoveStop,
             SetBoatInterval,
             CheckPrepareMove,
-            Loop,
-            EndLoop,
+            Load,
+            Unload,
             Delay1,
             Delay2,
             Delay3,
@@ -53,7 +58,7 @@ namespace FurnaceRT.Equipments.Boats
         private string _command;
         private string _position;
         private float _speed;
-
+        private FilterChecker _filterChecker = new FilterChecker();
         public BoatMove(BoatModule boatModule)
         {
             _boatModule = boatModule;
@@ -110,6 +115,7 @@ namespace FurnaceRT.Equipments.Boats
                 }
 
             }
+            _filterChecker.CheckInterval = 1;
 
             Notify($"Start");
             return Result.RUN;
@@ -141,7 +147,7 @@ namespace FurnaceRT.Equipments.Boats
                     case "boatcap2":
                         AutoShutterOpen((int)RoutineStep.AutoShutterOpen, true, _shutterTimeout);
 
-                        //CheckPrepareMove((int)RoutineStep.CheckPrepareMove, 2);
+                        CheckBoatLoadO2Desity((int)RoutineStep.Load, _zAxisTimeout);
 
                         var position = (BoatPosition)Enum.Parse(typeof(BoatPosition), _position);
 
@@ -151,6 +157,8 @@ namespace FurnaceRT.Equipments.Boats
                     case "boatloaderhome":
                         AutoShutterOpen((int)RoutineStep.AutoShutterOpen, true, _shutterTimeout);
 
+                        CheckBoatUnLoadO2Desity((int)RoutineStep.Unload, _zAxisTimeout);
+
                         //CheckPrepareMove((int)RoutineStep.CheckPrepareMove, 2);
 
                         position = (BoatPosition)Enum.Parse(typeof(BoatPosition), _position);
@@ -190,6 +198,110 @@ namespace FurnaceRT.Equipments.Boats
             Notify("Finished");
             return Result.DONE;
         }
+        private void CheckBoatUnLoadO2Desity(int id, int timeout)
+        {
+            var reason = "";
+            Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
+            {
+                Notify($"Check Boat UnLoad O2Desity");
+                return true;
+            }, () =>
+            {
+                var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
+
+                if (!pm.IsProcessing)
+                {
+                    LOG.Info($"boat Unload Check O2Desity,IsProcessing={pm.IsProcessing}");
+                    return true;
+                }
+                var isCheckO2Enbale = pm.GetBoatUnLoadCheckO2DensityConfig();
+                if (!isCheckO2Enbale)
+                    return true;
+
+                var o2LimtData = pm.GetBoatUnLoadLAO2CheckSV();
+                _filterChecker.Monitor(pm.GetN2PurgeUnder20PPMStatus(o2LimtData));
+                if (_filterChecker.Trig)
+                {
+                    pm.IsWait = false;
+                    LOG.Info($"boat Check O2Desity,boatUnLoad TransferRoomO2DensityCheckEnable={isCheckO2Enbale},LA LimtData={o2LimtData},Wait BoatUnLoad。A");
+                    _filterChecker.Restart();
+                    return true;
+                }
+                pm.IsWait = true;
+                return false; ;
+
+
+            }, timeout * 1000);
+
+            if (ret.Item1)
+            {
+                if (ret.Item2 == Result.FAIL)
+                {
+                    throw (new RoutineFaildException());
+                }
+                else if (ret.Item2 == Result.TIMEOUT) //timeout
+                {
+                    _boatModule.BoatZAxisMoveFailedForInterlock.Set($"CheckO2Desity timeout={timeout}");
+                    throw (new RoutineFaildException());
+                }
+                else
+                    throw (new RoutineBreakException());
+            }
+        }
+
+        private void CheckBoatLoadO2Desity(int id, int timeout)
+        {
+            var reason = "";
+            Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
+            {
+                Notify($"Check O2");
+                return true;
+            }, () =>
+            {
+                var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
+
+                if (!pm.IsProcessing)
+                {
+                    LOG.Info($"boat load Check O2Desity,IsProcessing={pm.IsProcessing}");
+                    return true;
+                }
+
+                var isCheckO2Enbale = pm.GetBoatLoadCheckO2DensityConfig();
+                if (!isCheckO2Enbale)
+                    return true;
+
+                var o2LimtData = pm.GetBoatLoadLAO2CheckSV();
+                _filterChecker.Monitor(pm.GetN2PurgeUnder20PPMStatus(o2LimtData));
+                if (_filterChecker.Trig)
+                {
+                    pm.IsWait = false;
+                    _filterChecker.Restart();
+                    LOG.Info($"boat load Check O2Desity,boatLoad TransferRoomO2DensityCheckEnable={isCheckO2Enbale},LA LimtData={o2LimtData},Wait BoatLoad。A");
+                    return true;
+                }
+             
+                pm.IsWait = true;
+                return false; ;
+
+
+            }, timeout * 1000);
+
+            if (ret.Item1)
+            {
+                if (ret.Item2 == Result.FAIL)
+                {
+                    throw (new RoutineFaildException());
+                }
+                else if (ret.Item2 == Result.TIMEOUT) //timeout
+                {
+                    _boatModule.BoatZAxisMoveFailedForInterlock.Set($"CheckO2Desity timeout={timeout}");
+                    throw (new RoutineFaildException());
+                }
+                else
+                    throw (new RoutineBreakException());
+            }
+        }
+
         private void CheckPrepareMove(int id, int timeout)
         {
             var reason = "";

+ 1 - 4
Furnace/FurnaceRT/Equipments/Jobs/AutoTransfer.cs

@@ -6648,10 +6648,7 @@ namespace FurnaceRT.Equipments.Jobs
                     }
                 }
                 var asd = CheckChargeFinished(pj, pm.Module);
-                if (asd)
-                {
-
-                }
+           
                 if (isNeedProcess && asd && pj.ProcessingState != EnumProcessingState.Processing &&
                     pmModule.CheckStandbyCondition() && pm.IsAvailable)
                 {

+ 32 - 1
Furnace/FurnaceRT/Equipments/PMs/PMN2Purge.cs

@@ -9,6 +9,7 @@ using DocumentFormat.OpenXml.Packaging;
 using DocumentFormat.OpenXml.Spreadsheet;
 using FurnaceRT.Devices;
 using FurnaceRT.Equipments.PMs.Devices;
+using FurnaceRT.Equipments.Systems;
 using FurnaceRT.Extraction;
 using MECF.Framework.Common.CommonData.SorterDefines;
 using MECF.Framework.Common.Equipment;
@@ -547,7 +548,7 @@ namespace FurnaceRT.Equipments.PMs
         }
         private bool CheckN2PurgePhase1()
         {
-            return ((int)ConcentrationO2.Value >= _n2PurgeData) && GetLADoorOpenStatus()&& CheckIsLASide();
+            return ((int)ConcentrationO2.Value >= _n2PurgeData) && GetLADoorOpenStatus() && CheckIsLASide();
         }
         private bool CheckN2PurgePhase2()
         {
@@ -906,6 +907,34 @@ namespace FurnaceRT.Equipments.PMs
         {
             return SC.ContainsItem("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable") ? SC.GetValue<bool>("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable") : false;
         }
+
+        public bool GetBoatLoadCheckO2DensityConfig()
+        {
+            return SC.ContainsItem("PM1.N2Purge.BoatLoad.TransferRoomO2DensityCheckEnable") ? SC.GetValue<bool>("PM1.N2Purge.BoatLoad.TransferRoomO2DensityCheckEnable") : false;
+        }
+
+        public bool GetBoatUnLoadCheckO2DensityConfig()
+        {
+            return SC.ContainsItem("PM1.N2Purge.BoatUnLoad.TransferRoomO2DensityCheckEnable") ? SC.GetValue<bool>("PM1.N2Purge.BoatUnLoad.TransferRoomO2DensityCheckEnable") : false;
+        }
+
+        public bool GetBoatUnLoadEAxisInhibitEnableConfig()
+        {
+            return SC.ContainsItem("PM1.N2Purge.BoatUnLoad.EAxisInhibitEnable") ? SC.GetValue<bool>("PM1.N2Purge.BoatUnLoad.EAxisInhibitEnable") : false;
+        }
+
+        public bool GetBoatLoadEAxisInhibitEnableConfig()
+        {
+            return SC.ContainsItem("PM1.N2Purge.BoatLoad.EAxisInhibitEnable") ? SC.GetValue<bool>("PM1.N2Purge.BoatLoad.EAxisInhibitEnable") : false;
+        }
+        public double GetBoatUnLoadLAO2CheckSV()
+        {
+            return SC.ContainsItem("PM1.N2Purge.BoatUnLoad.LAO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.BoatUnLoad.LAO2CheckSV") : 20;
+        }
+        public double GetBoatLoadLAO2CheckSV()
+        {
+            return SC.ContainsItem("PM1.N2Purge.BoatLoad.LAO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.BoatLoad.LAO2CheckSV") : 20;
+        }
         public double GetWaferDisChargeLAO2CheckSV()
         {
             return SC.ContainsItem("PM1.N2Purge.WaferDisCharge.LAO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.WaferDisCharge.LAO2CheckSV") : 20;
@@ -925,5 +954,7 @@ namespace FurnaceRT.Equipments.PMs
         }
 
 
+   
+
     }
 }

+ 19 - 10
Furnace/FurnaceUI/Dialog/N2PurgeSelectDialogView.xaml

@@ -1233,8 +1233,12 @@
                             HorizontalAlignment="Center"
                             VerticalAlignment="Center"
                             Orientation="Horizontal">
-                            <Button Margin="0,0,15,0" Content="Enable"/>
-                            <Button Content="Disable"/>
+                            <RadioButton
+         Margin="0,0,15,0"
+         Content="Enable"
+         IsChecked="{Binding BoatLoadTransferRoomO2DensityCheckEnable}"/>
+                            <RadioButton Content="Disable" IsChecked="{Binding BoatLoadTransferRoomO2DensityCheckEnable, Converter={StaticResource InverseBoolConverter}}"/>
+
                         </StackPanel>
                     </Border>
                     <Border
@@ -1539,8 +1543,13 @@
                             HorizontalAlignment="Center"
                             VerticalAlignment="Center"
                             Orientation="Horizontal">
-                            <Button Margin="0,0,15,0" Content="Enable"/>
-                            <Button Content="Disable"/>
+                            <RadioButton
+Margin="0,0,15,0"
+Content="Enable"
+IsChecked="{Binding BoatUnLoadTransferRoomO2DensityCheckEnable}"/>
+                            <RadioButton Content="Disable" IsChecked="{Binding BoatUnLoadTransferRoomO2DensityCheckEnable, Converter={StaticResource InverseBoolConverter}}"/>
+
+
                         </StackPanel>
                     </Border>
                     <Border
@@ -1856,8 +1865,8 @@
                             <RadioButton
                                 Margin="0,0,15,0"
                                 Content="Enable"
-                                IsChecked="{Binding TransferRoomN2PurgeDischargeEnable}"/>
-                            <RadioButton Content="Disable" IsChecked="{Binding TransferRoomN2PurgeDischargeEnable, Converter={StaticResource InverseBoolConverter}}"/>
+                                IsChecked="{Binding WaferDisChargeTransferRoomO2DensityKeepDischargeEnable}"/>
+                            <RadioButton Content="Disable" IsChecked="{Binding WaferDisChargeTransferRoomO2DensityKeepDischargeEnable, Converter={StaticResource InverseBoolConverter}}"/>
                         </StackPanel>
                     </Border>
                     <Border
@@ -1901,8 +1910,8 @@
                             <RadioButton
                                 Margin="0,0,15,0"
                                 Content="Enable"
-                                IsChecked="{Binding TransferRoomO2DensityCheckDischargeEnable}"/>
-                            <RadioButton Content="Disable" IsChecked="{Binding TransferRoomO2DensityCheckDischargeEnable, Converter={StaticResource InverseBoolConverter}}"/>
+                                IsChecked="{Binding WaferDisChargeTransferRoomO2DensityCheckEnable}"/>
+                            <RadioButton Content="Disable" IsChecked="{Binding WaferDisChargeTransferRoomO2DensityCheckEnable, Converter={StaticResource InverseBoolConverter}}"/>
                         </StackPanel>
                     </Border>
                     <Border
@@ -1946,8 +1955,8 @@
                             <RadioButton
                                 Margin="0,0,15,0"
                                 Content="Enable"
-                                IsChecked="{Binding TransferRoomO2DensityKeepDischargeEnable}"/>
-                            <RadioButton Content="Disable" IsChecked="{Binding TransferRoomO2DensityKeepDischargeEnable, Converter={StaticResource InverseBoolConverter}}"/>
+                                IsChecked="{Binding WaferDisChargeTransferRoomO2DensityKeepDischargeEnable}"/>
+                            <RadioButton Content="Disable" IsChecked="{Binding WaferDisChargeTransferRoomO2DensityKeepDischargeEnable, Converter={StaticResource InverseBoolConverter}}"/>
                         </StackPanel>
                     </Border>
                     <Border

+ 50 - 16
Furnace/FurnaceUI/Dialog/N2PurgeSelectDialogViewModel.cs

@@ -313,17 +313,17 @@ namespace FurnaceUI.Client.Dialog
             }
         }
         private bool _fOUPN2PurgeFoupEnterEnable;
-        public bool TransferRoomN2PurgeDischargeEnable
+        public bool WaferDIsChargeTransferRoomN2PurgeDischargeEnable
         {
-            get { return _transferRoomN2PurgeDischargeEnable; }
+            get { return _waferDisChargeTransferRoomN2PurgeDischargeEnable; }
             set
             {
-                _transferRoomN2PurgeDischargeEnable = value;
-                NotifyOfPropertyChange(() => TransferRoomN2PurgeDischargeEnable);
-                InvokeClient.Instance.Service.DoOperation("System.SetConfig", "PM1.N2Purge.WaferDischarge.TransferRoomN2PurgeEnable", _transferRoomN2PurgeDischargeEnable);
+                _waferDisChargeTransferRoomN2PurgeDischargeEnable = value;
+                NotifyOfPropertyChange(() => WaferDIsChargeTransferRoomN2PurgeDischargeEnable);
+                InvokeClient.Instance.Service.DoOperation("System.SetConfig", "PM1.N2Purge.WaferDischarge.TransferRoomN2PurgeEnable", _waferDisChargeTransferRoomN2PurgeDischargeEnable);
             }
         }
-        private bool _transferRoomN2PurgeDischargeEnable;
+        private bool _waferDisChargeTransferRoomN2PurgeDischargeEnable;
 
 
         public bool TransferRoomO2DensityCheckDischargeEnable
@@ -338,17 +338,17 @@ namespace FurnaceUI.Client.Dialog
         }
         private bool _transferRoomO2DensityCheckDischargeEnable;
 
-        public bool TransferRoomO2DensityKeepDischargeEnable
+        public bool WaferDisChargeTransferRoomO2DensityKeepDischargeEnable
         {
-            get { return _transferRoomO2DensityKeepDischargeEnable; }
+            get { return _waferDisChargeTransferRoomO2DensityKeepDischargeEnable; }
             set
             {
-                _transferRoomO2DensityKeepDischargeEnable = value;
-                NotifyOfPropertyChange(() => TransferRoomO2DensityKeepDischargeEnable);
-                InvokeClient.Instance.Service.DoOperation("System.SetConfig", "PM1.N2Purge.WaferDischarge.TransferRoomO2DensityKeepEnable", _transferRoomO2DensityKeepDischargeEnable);
+                _waferDisChargeTransferRoomO2DensityKeepDischargeEnable = value;
+                NotifyOfPropertyChange(() => WaferDisChargeTransferRoomO2DensityKeepDischargeEnable);
+                InvokeClient.Instance.Service.DoOperation("System.SetConfig", "PM1.N2Purge.WaferDischarge.TransferRoomO2DensityKeepEnable", _waferDisChargeTransferRoomO2DensityKeepDischargeEnable);
             }
         }
-        private bool _transferRoomO2DensityKeepDischargeEnable;
+        private bool _waferDisChargeTransferRoomO2DensityKeepDischargeEnable;
 
         public bool FOUPN2PurgeDischargeEnable
         {
@@ -362,6 +362,30 @@ namespace FurnaceUI.Client.Dialog
         }
         private bool _fOUPN2PurgeDischargeEnable;
 
+        public bool BoatLoadTransferRoomO2DensityCheckEnable
+        {
+            get { return _boatLoadTransferRoomO2DensityCheckEnable; }
+            set
+            {
+                _boatLoadTransferRoomO2DensityCheckEnable = value;
+                NotifyOfPropertyChange(() => BoatLoadTransferRoomO2DensityCheckEnable);
+                InvokeClient.Instance.Service.DoOperation("System.SetConfig", "PM1.N2Purge.BoatLoad.TransferRoomO2DensityCheckEnable", _boatLoadTransferRoomO2DensityCheckEnable);
+            }
+        }
+        private bool _boatLoadTransferRoomO2DensityCheckEnable;
+
+
+        public bool BoatUnLoadTransferRoomO2DensityCheckEnable
+        {
+            get { return _boatUnLoadTransferRoomO2DensityCheckEnable; }
+            set
+            {
+                _boatUnLoadTransferRoomO2DensityCheckEnable = value;
+                NotifyOfPropertyChange(() => BoatUnLoadTransferRoomO2DensityCheckEnable);
+                InvokeClient.Instance.Service.DoOperation("System.SetConfig", "PM1.N2Purge.BoatUnLoad.TransferRoomO2DensityCheckEnable", _boatUnLoadTransferRoomO2DensityCheckEnable);
+            }
+        }
+        private bool _boatUnLoadTransferRoomO2DensityCheckEnable;
 
         protected override void OnActivate()
         {
@@ -431,9 +455,9 @@ namespace FurnaceUI.Client.Dialog
                 _fOUPN2PurgeFoupEnterEnable = foupEnterFOUPN2PurgeEnable;
             }
             valueConfig = SystemConfigProvider.Instance.GetValueByName("PM1.N2Purge.WaferDischarge.TransferRoomN2PurgeEnable");
-            if (!string.IsNullOrEmpty(valueConfig) && bool.TryParse(valueConfig, out bool transferRoomN2PurgeDischargeEnable))
+            if (!string.IsNullOrEmpty(valueConfig) && bool.TryParse(valueConfig, out bool waferDischargetransferRoomN2PurgeDischargeEnable))
             {
-                _transferRoomN2PurgeDischargeEnable = transferRoomN2PurgeDischargeEnable;
+                _waferDisChargeTransferRoomN2PurgeDischargeEnable = waferDischargetransferRoomN2PurgeDischargeEnable;
             }
 
             valueConfig = SystemConfigProvider.Instance.GetValueByName("PM1.N2Purge.WaferDischarge.TransferRoomO2DensityCheckEnable");
@@ -442,16 +466,26 @@ namespace FurnaceUI.Client.Dialog
                 _transferRoomO2DensityCheckDischargeEnable = transferRoomO2DensityCheckDischargeEnable;
             }
             valueConfig = SystemConfigProvider.Instance.GetValueByName("PM1.N2Purge.WaferDischarge.TransferRoomO2DensityKeepEnable");
-            if (!string.IsNullOrEmpty(valueConfig) && bool.TryParse(valueConfig, out bool transferRoomO2DensityKeepDischargeEnable))
+            if (!string.IsNullOrEmpty(valueConfig) && bool.TryParse(valueConfig, out bool waferDisChargeTransferRoomO2DensityKeepDischargeEnable))
             {
-                _transferRoomO2DensityKeepDischargeEnable = transferRoomO2DensityKeepDischargeEnable;
+                _waferDisChargeTransferRoomO2DensityKeepDischargeEnable = waferDisChargeTransferRoomO2DensityKeepDischargeEnable;
             }
             valueConfig = SystemConfigProvider.Instance.GetValueByName("PM1.N2Purge.WaferDischarge.FOUPN2PurgeEnable");
             if (!string.IsNullOrEmpty(valueConfig) && bool.TryParse(valueConfig, out bool fOUPN2PurgeDischargeEnable))
             {
                 _fOUPN2PurgeDischargeEnable = fOUPN2PurgeDischargeEnable;
             }
+            valueConfig = SystemConfigProvider.Instance.GetValueByName("PM1.N2Purge.BoatLoad.TransferRoomO2DensityCheckEnable");
+            if (!string.IsNullOrEmpty(valueConfig) && bool.TryParse(valueConfig, out bool boatLoadTransferRoomO2DensityCheckEnable))
+            {
+                _boatLoadTransferRoomO2DensityCheckEnable = boatLoadTransferRoomO2DensityCheckEnable;
+            }
 
+            valueConfig = SystemConfigProvider.Instance.GetValueByName("PM1.N2Purge.BoatUnLoad.TransferRoomO2DensityCheckEnable");
+            if (!string.IsNullOrEmpty(valueConfig) && bool.TryParse(valueConfig, out bool boatUnLoadTransferRoomO2DensityCheckEnable))
+            {
+                _boatUnLoadTransferRoomO2DensityCheckEnable = boatUnLoadTransferRoomO2DensityCheckEnable;
+            }
         }
 
         protected override void OnViewLoaded(object view)

+ 24 - 4
Furnace/FurnaceUI/Views/Parameter/N2PurgeEditView.xaml

@@ -986,7 +986,17 @@
                     Background="{DynamicResource N2_purge_Readybg}"
                     BorderBrush="{DynamicResource Table_BD}"
                     BorderThickness="1,1,0,0">
-                    <TextBox FontSize="20"/>
+                    <TextBox FontSize="20" Tag="Number" Text="{Binding BoatLoadLAO2CheckSV,Mode=OneWay}">
+                        <i:Interaction.Triggers>
+                            <i:EventTrigger EventName="TextChanged">
+                                <cal1:ActionMessage MethodName="SetConfigTextChanged">
+                                    <cal1:Parameter Value="PM1.N2Purge.BoatLoad.LAO2CheckSV"></cal1:Parameter>
+                                    <cal1:Parameter Value="$source"></cal1:Parameter>
+                                    <cal1:Parameter Value="{Binding}"></cal1:Parameter>
+                                </cal1:ActionMessage>
+                            </i:EventTrigger>
+                        </i:Interaction.Triggers>
+                    </TextBox>
                 </Border>
                 <Border
                     Grid.Row="5"
@@ -1239,7 +1249,17 @@
                     Background="{DynamicResource N2_purge_Processbg}"
                     BorderBrush="{DynamicResource Table_BD}"
                     BorderThickness="1,1,0,0">
-                    <TextBox FontSize="20"/>
+                    <TextBox FontSize="20" Tag="Number" Text="{Binding BoatUnLoadLAO2CheckSV,Mode=OneWay}">
+                        <i:Interaction.Triggers>
+                            <i:EventTrigger EventName="TextChanged">
+                                <cal1:ActionMessage MethodName="SetConfigTextChanged">
+                                    <cal1:Parameter Value="PM1.N2Purge.BoatUnLoad.LAO2CheckSV"></cal1:Parameter>
+                                    <cal1:Parameter Value="$source"></cal1:Parameter>
+                                    <cal1:Parameter Value="{Binding}"></cal1:Parameter>
+                                </cal1:ActionMessage>
+                            </i:EventTrigger>
+                        </i:Interaction.Triggers>
+                    </TextBox>
                 </Border>
                 <Border
                     Grid.Row="5"
@@ -1678,7 +1698,7 @@
                     <oxy:PlotView Background="Transparent" Width="auto" Margin="-30,-14,-8,-10" Model="{Binding N2Model}" Panel.ZIndex="1"   />
 
                 </Border>-->
-                <Viewbox
+                <!--<Viewbox
                     Grid.Row="0"
                     Grid.RowSpan="10"
                     Grid.Column="0"
@@ -1708,7 +1728,7 @@
                             Stroke="Blue"
                             StrokeThickness="5"/>
                     </Canvas>
-                </Viewbox>
+                </Viewbox>-->
 
             </Grid>
 

+ 31 - 0
Furnace/FurnaceUI/Views/Parameter/N2PurgeEditViewModel.cs

@@ -257,6 +257,34 @@ namespace FurnaceUI.Views.Parameter
                 NotifyOfPropertyChange("FoupEnterLAO2CheckSV");
             }
         }
+
+
+        private double _boatUnLoadLAO2CheckSV = 0;
+        public double BoatUnLoadLAO2CheckSV
+        {
+            get
+            {
+                return _boatUnLoadLAO2CheckSV;
+            }
+            set
+            {
+                _boatUnLoadLAO2CheckSV = value;
+                NotifyOfPropertyChange("BoatUnLoadLAO2CheckSV");
+            }
+        }
+        private double _boatLoadLAO2CheckSV = 0;
+        public double BoatLoadLAO2CheckSV
+        {
+            get
+            {
+                return _boatLoadLAO2CheckSV;
+            }
+            set
+            {
+                _boatLoadLAO2CheckSV = value;
+                NotifyOfPropertyChange("BoatLoadLAO2CheckSV");
+            }
+        }
         #endregion
         protected override void OnInitialize()
         {
@@ -280,6 +308,9 @@ namespace FurnaceUI.Views.Parameter
 
             FoupEnterFoupO2CheckSV = (double)QueryDataClient.Instance.Service.GetConfig($"PM1.N2Purge.FoupEnter.FOUPO2CheckSV");
             FoupEnterLAO2CheckSV = (double)QueryDataClient.Instance.Service.GetConfig($"PM1.N2Purge.FoupEnter.LAO2CheckSV");
+
+            BoatLoadLAO2CheckSV = (double)QueryDataClient.Instance.Service.GetConfig($"PM1.N2Purge.BoatLoad.LAO2CheckSV");
+            BoatUnLoadLAO2CheckSV = (double)QueryDataClient.Instance.Service.GetConfig($"PM1.N2Purge.BoatUnLoad.LAO2CheckSV");
             //GetO2ModelSpline();
             //GetN2ModelSpline();
         }