Browse Source

synchronous x12 bug solution to x8

chenzk 1 month ago
parent
commit
2a4870d3c3

+ 0 - 1
CyberX8_MainPages/Views/DepRecipeView.xaml

@@ -62,7 +62,6 @@
                     <ColumnDefinition/>
                 </Grid.ColumnDefinitions>
                 <Button Grid.Column="0" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
-                <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
             </Grid>
 
             <GroupBox Header="Total Time" Grid.Row="1" HorizontalAlignment="Left" Margin="40,0,0,0" Width="200">

+ 0 - 1
CyberX8_MainPages/Views/HvdRecipeView.xaml

@@ -80,7 +80,6 @@
                     <ColumnDefinition/>
                 </Grid.ColumnDefinitions>
                 <Button Grid.Column="0" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
-                <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
             </Grid>
 
         </Grid>

+ 0 - 1
CyberX8_MainPages/Views/PwtRecipeView.xaml

@@ -97,7 +97,6 @@
                     <ColumnDefinition/>
                 </Grid.ColumnDefinitions>
                 <Button Grid.Column="0" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
-                <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
             </Grid>
 
         </Grid>

+ 0 - 1
CyberX8_MainPages/Views/QdrRecipeView.xaml

@@ -60,7 +60,6 @@
                     <ColumnDefinition/>
                 </Grid.ColumnDefinitions>
                 <Button Grid.Column="0" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
-                <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
             </Grid>
         </Grid>
 

+ 0 - 1
CyberX8_MainPages/Views/RdsRecipeView.xaml

@@ -60,7 +60,6 @@
                         <ColumnDefinition/>
                     </Grid.ColumnDefinitions>
                     <Button Grid.Column="0" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
-                    <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
                 </Grid>
 
             </Grid>

+ 5 - 6
CyberX8_MainPages/Views/ResRecipeView.xaml

@@ -61,7 +61,6 @@
                         <ColumnDefinition/>
                     </Grid.ColumnDefinitions>
                     <Button Grid.Column="0" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
-                    <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
                 </Grid>
 
             </Grid>
@@ -195,11 +194,11 @@
                                         <Grid.ColumnDefinitions>
                                             <ColumnDefinition Width="220"></ColumnDefinition>
                                         </Grid.ColumnDefinitions>
-                                        <UserControls:GroupTextBoxControl Grid.Column="0" Grid.Row="0" Title="Error High" Unit="℃" MinValue="20" MaxValue="64" IntValue="{Binding Recipe.TemperatureErrorHigh,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureErrorHigh],Mode=TwoWay}" Width="220"/>
-                                        <UserControls:GroupTextBoxControl Grid.Column="0" Grid.Row="1" Title="Warning High" Unit="℃" MinValue="20" MaxValue="62" IntValue="{Binding Recipe.TemperatureWarningHigh,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureWarningHigh],Mode=TwoWay}" Width="220"/>
-                                        <UserControls:GroupTextBoxControl Grid.Column="0" Grid.Row="2" Title="Set Point" Unit="℃" MinValue="20" MaxValue="60" IntValue="{Binding Recipe.TemperatureSetPoint,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureSetPoint],Mode=TwoWay}" Width="220"/>
-                                        <UserControls:GroupTextBoxControl Grid.Column="0" Grid.Row="3" Title="Warning Low" Unit="℃" MinValue="18" MaxValue="60" IntValue="{Binding Recipe.TemperatureWarningLow,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureWarningLow],Mode=TwoWay}" Width="220"/>
-                                        <UserControls:GroupTextBoxControl Grid.Column="0" Grid.Row="4" Title="Error Low" Unit="℃" MinValue="16" MaxValue="60" IntValue="{Binding Recipe.TemperatureErrorLow,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureErrorLow],Mode=TwoWay}" Width="220"/>
+                                        <UserControls:GroupDigitalBoxControl Grid.Column="0" Grid.Row="0" Title="Error High" Unit="℃" MinValue="20" MaxValue="64" DigitalValue="{Binding Recipe.TemperatureErrorHigh,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureErrorHigh],Mode=TwoWay}" Width="220"/>
+                                        <UserControls:GroupDigitalBoxControl Grid.Column="0" Grid.Row="1" Title="Warning High" Unit="℃" MinValue="20" MaxValue="62" DigitalValue="{Binding Recipe.TemperatureWarningHigh,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureWarningHigh],Mode=TwoWay}" Width="220"/>
+                                        <UserControls:GroupDigitalBoxControl Grid.Column="0" Grid.Row="2" Title="Set Point" Unit="℃" MinValue="20" MaxValue="60" DigitalValue="{Binding Recipe.TemperatureSetPoint,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureSetPoint],Mode=TwoWay}" Width="220"/>
+                                        <UserControls:GroupDigitalBoxControl Grid.Column="0" Grid.Row="3" Title="Warning Low" Unit="℃" MinValue="18" MaxValue="60" DigitalValue="{Binding Recipe.TemperatureWarningLow,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureWarningLow],Mode=TwoWay}" Width="220"/>
+                                        <UserControls:GroupDigitalBoxControl Grid.Column="0" Grid.Row="4" Title="Error Low" Unit="℃" MinValue="16" MaxValue="60" DigitalValue="{Binding Recipe.TemperatureErrorLow,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[TemperatureErrorLow],Mode=TwoWay}" Width="220"/>
 
                                     </Grid>
                                 </GroupBox>

+ 0 - 1
CyberX8_MainPages/Views/SequenceRecipeView.xaml

@@ -116,7 +116,6 @@
                     <ColumnDefinition/>
                 </Grid.ColumnDefinitions>
                 <Button Grid.Column="0" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
-                <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
             </Grid>
             <Grid Grid.Row="3">
                 <Grid.RowDefinitions>

+ 0 - 1
CyberX8_MainPages/Views/SrdRecipeView.xaml

@@ -110,7 +110,6 @@
                     <ColumnDefinition/>
                 </Grid.ColumnDefinitions>
                 <Button Grid.Column="0" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
-                <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
             </Grid>
             <Grid Grid.Row="2">
                 <Grid.ColumnDefinitions>

+ 2 - 1
CyberX8_RT/Config/System.sccfg

@@ -452,7 +452,7 @@
 		<config default="35.0" name="FillingStartedDelta" nameView="FillingStartedDelta" description="water level substract start water level is over delta means filling water normal" max="100" min="0" paramter="" tag="" unit="" type="Double"/>
 		<config default="20" name="ConcurrentFillTimeSeconds" nameView="ConcurrentFillTimeSeconds" description="QDR Concurrent Fill Time" max="60" min="1" paramter="" tag="" unit="s" type="Integer"/>
 		<config default="2" name="ClampCycleTimeSeconds" nameView="ClampCycleTimeSeconds" description="Clamp cycle time seconds" max="60" min="1" paramter="" tag="" unit="s" type="Double"/>
-		<config default="3" name="NumberClampCyclesToComplete" nameView="NumberClampCyclesToComplete" description="Clamp cycle counts" max="60" min="1" paramter="" tag="" unit="" type="Integer"/>
+		<config default="3" name="NumberClampCyclesToComplete" nameView="NumberClampCyclesToComplete" description="Clamp cycle counts" max="60" min="0" paramter="" tag="" unit="" type="Integer"/>
 		<config default="120" name="PickupDelayWarningSeconds" nameView="PickupDelayWarningSeconds" description="Wait transporter goto QDR to pickup Wafer Shuttle" max="500" min="1" paramter="" tag="" unit="s" type="Integer"/>
 		<config default="10" name="PickTimeSeconds" nameView="PickTimeSeconds" description="Time taken to pick up from cell" max="100000" min="0" paramter="" tag="" unit="s" type="Integer"/>
 		<config default="10" name="PlaceTimeSeconds" nameView="PlaceTimeSeconds" description="Time taken to place down to cell" max="100000" min="0" paramter="" tag="" unit="s" type="Integer"/>
@@ -461,6 +461,7 @@
 		<config default="5" name="NominalCheckFillWaterTimeSeconds" nameView="NominalCheckFillWaterTimeSeconds" description="Time delay to check water is filling" max="100000" min="0" paramter="" tag="" unit="s" type="Integer"/>
 		<config default="10" name="NominalCheckFillFullTimeSeconds" nameView="NominalCheckFillFullTimeSeconds" description="Time delay to check water is full" max="100000" min="0" paramter="" tag="" unit="s" type="Integer"/>
 		<config default="false" name="KeepWaferShuttleWetUntilTransfer" nameView="KeepWaferShuttleWetUntilTransfer" description="whether or not to execute keepwet action" max="" min="" paramter="" tag="" unit="s" type="Bool"/>
+		<config default="20" name="QDRKeepWetBelowClampWaterLevel" nameView="QDRKeepWetBelowClampWaterLevel" description="QDR KeepWet BelowClamp WaterLevel" max="100" min="0" paramter="" tag="" unit="" type="Double"/>
 	</configs>
 	<configs name="Reservoir" nameView="Reservoir">
 		<config default="0.5" name="LevelHysteresis" nameView="LevelHysteresis" description="level Hysteresis" max="2" min="0" paramter="" tag="" unit="" type="Double"></config>

+ 1 - 1
CyberX8_RT/Modules/Dryer/DryerRunRecipeRoutine.cs

@@ -148,7 +148,7 @@ namespace CyberX8_RT.Modules.Dryer
         private bool CheckPressureWaring()
         {
             double pressure = _device.CommonData.ExhaustPressure;
-            if(pressure > _pressureCheckWarningMMHG)
+            if(pressure > _pressureCheckWarningMMHG && pressure <= _pressureCheckErrorMMHG)
             {
                 string str = $"{pressure} is large than waring pressure {_pressureCheckWarningMMHG}";
                 if (AlarmListManager.Instance.AddWarn(Module, "Exhaust Pressure",str))

+ 12 - 0
CyberX8_RT/Modules/Rinse/RinseEntity.cs

@@ -652,10 +652,22 @@ namespace CyberX8_RT.Modules.Rinse
             RState ret = _keepwetRoutine.Monitor();
             if (ret == RState.End)
             {
+                //导出lotTrack数据
+                LotTrackFileHeaderCommonData headerCommonData = new LotTrackFileHeaderCommonData();
+                if (SC.ContainsItem("System.ToolID")) headerCommonData.ToolID = SC.GetStringValue("System.ToolID");
+                headerCommonData.SoftWareVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
+                RinseLotTrackUtil.ExportRinseLotTrack(Module.ToString(), _keepwetRoutine.RinseLotTrackDatas,
+                    headerCommonData, IsAuto, false);
                 return true;
             }
             if (ret == RState.Failed || ret == RState.Timeout)
             {
+                //导出lotTrack数据
+                LotTrackFileHeaderCommonData headerCommonData = new LotTrackFileHeaderCommonData();
+                if (SC.ContainsItem("System.ToolID")) headerCommonData.ToolID = SC.GetStringValue("System.ToolID");
+                headerCommonData.SoftWareVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
+                RinseLotTrackUtil.ExportRinseLotTrack(Module.ToString(), _keepwetRoutine.RinseLotTrackDatas,
+                    headerCommonData, IsAuto, false);
                 PostMsg(RinseMsg.Error);
             }
             return false;

+ 118 - 9
CyberX8_RT/Modules/Rinse/RinseKeepwetRoutine.cs

@@ -1,5 +1,12 @@
-using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.SCCore;
 using CyberX8_Core;
+using CyberX8_RT.Devices.Facilities;
+using CyberX8_RT.Devices.Resistivity;
+using CyberX8_RT.Devices.Rinse;
+using MECF.Framework.Common.CommonData.Rinse;
 using MECF.Framework.Common.Routine;
 using System;
 using System.Collections.Generic;
@@ -11,15 +18,45 @@ namespace CyberX8_RT.Modules.Rinse
 {
     public class RinseKeepwetRoutine : RoutineBase, IRoutine
     {
+        private const int LOTTRACK_TIME = 1000;
+        private const string DI_WATER_PRESSURE_VALUE = "DiWaterPressure";
         private enum KeepwetStep
         {
-            LoopStart,
-            LoopDelay,
-            LoopEnd,
+            KeepWetStart,
+            KeepWetWait,
+            CloseFillValve,
+            KeepWetSlowDrain,
             End
         }
         #region 内部变量
-        private int _cycleCount = 100;
+        /// <summary>
+        /// 低于Clamp的水位
+        /// </summary>
+        private double _belowClampWaterLevel = 0;
+        /// <summary>
+        /// 设备对象
+        /// </summary>
+        private RinseDevice _device;
+        /// <summary>
+        /// 注满数值
+        /// </summary>
+        private int _sensorReadingFull;
+        /// <summary>
+        /// lock track time
+        /// </summary>
+        private DateTime _lotTackTime = DateTime.Now;
+        /// <summary>
+        /// LotTrack数据
+        /// </summary>
+        private List<RinseLotTrackData> _datas = new List<RinseLotTrackData>();
+        /// <summary>
+        /// LotTrack数据
+        /// </summary>
+        public List<RinseLotTrackData> RinseLotTrackDatas { get { return _datas; } }
+        /// <summary>
+        /// Facilities
+        /// </summary>
+        private SystemFacilities _facilities;
         #endregion
         /// <summary>
         /// 构造函数
@@ -42,10 +79,12 @@ namespace CyberX8_RT.Modules.Rinse
         /// <returns></returns>
         public RState Monitor()
         {
-            Runner.LoopStart(KeepwetStep.LoopStart, "rinse keepwet", _cycleCount, NullFun, _delay_1ms)
-                .LoopDelay(KeepwetStep.LoopDelay, _delay_60s)
-                .LoopEnd(KeepwetStep.LoopEnd, NullFun, _delay_1ms)
-                .End(KeepwetStep.End, NullFun, _delay_1ms);
+            LottrackRecord();
+            Runner.Run(KeepwetStep.KeepWetStart, () => _device.FillValveOn(), _delay_1ms)
+             .Wait(KeepwetStep.KeepWetWait, CheckFillFullStatus)
+             .Wait(KeepwetStep.CloseFillValve, () => _device.FillValveOff(), _delay_1ms)
+             .Wait(KeepwetStep.KeepWetSlowDrain, CheckDrainStatus)
+             .End(KeepwetStep.End, NullFun, _delay_1ms);
             return Runner.Status;
         }
         /// <summary>
@@ -55,7 +94,77 @@ namespace CyberX8_RT.Modules.Rinse
         /// <returns></returns>
         public RState Start(params object[] objs)
         {
+            _belowClampWaterLevel = SC.GetValue<double>("QDR.QDRKeepWetBelowClampWaterLevel");
+            _sensorReadingFull = SC.GetValue<int>("QDR.SensorReadingFull");
+            _device = DEVICE.GetDevice<RinseDevice>(Module);
+            _facilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
+            if (_facilities == null)
+            {
+                LOG.WriteLog(eEvent.ERR_RINSE, Module, "Facility is null");
+                return RState.Failed;
+            }
+            _datas.Clear();
             return Runner.Start(Module, "Start Rinse Keepwet");
         }
+        /// 记录Lottrack
+        /// </summary>
+        private void LottrackRecord()
+        {
+            //记录Lottrack
+            if (DateTime.Now.Subtract(_lotTackTime).TotalMilliseconds >= LOTTRACK_TIME)
+            {
+                AddLotTrackData();
+                _lotTackTime = DateTime.Now;
+            }
+        }
+        /// <summary>
+        /// 检验是否注满
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckFillFullStatus()
+        {
+            double currentWaterLevel = _device.RinseData.WaterLevel;
+            bool result = currentWaterLevel > _sensorReadingFull;
+            return result;
+        }
+
+        /// <summary>
+        /// 检验是否排空
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckDrainStatus()
+        {
+            double currentWaterLevel = _device.RinseData.WaterLevel;
+            bool result = currentWaterLevel < _belowClampWaterLevel;
+            return result;
+        }
+
+        /// <summary>
+        /// 获取Lot Track数据
+        /// </summary>
+        /// <returns></returns>
+        private void AddLotTrackData()
+        {
+            RinseLotTrackData data = new RinseLotTrackData();
+            data.TimeStamp = DateTime.Now;
+            data.WaterLevel = _device.RinseData.WaterLevel;
+            data.DIFillEnabled = _device.RinseData.FillValve;
+            data.DumpEnabled = _device.RinseData.DrainValve;
+            data.WaterPressure = _facilities.GetCommonLimitDataByName(DI_WATER_PRESSURE_VALUE).Value;
+            ResistivityController resistivityController = DEVICE.GetDevice<ResistivityController>(_device.RinseItem.ResistivityID);
+            if (resistivityController != null)
+            {
+                try
+                {
+                    data.Resistivity = double.Parse(resistivityController.ResisitivityValue.Trim());
+                }
+                catch
+                {
+                    data.Resistivity = 0;
+                }
+
+            }
+            _datas.Add(data);
+        }
     }
 }

+ 1 - 8
CyberX8_Themes/UserControls/RecipeControl.xaml.cs

@@ -378,14 +378,7 @@ namespace CyberX8_Themes.UserControls
             }
             else
             {
-                if (RecipeModeValue != SelectedRecipeNode.RecipeLocation)
-                {
-                    MessageBox.Show("Recipe OperationMode is not match!", $"Current Recipe OperationMode is {RecipeModeValue}", MessageBoxButton.OK, MessageBoxImage.Error);
-                }
-                else
-                {
-                    GlobalEvents.OnSwitchFixedTabItem("Recipe", "", _recipeName);
-                }
+                GlobalEvents.OnSwitchFixedTabItem("Recipe", "", _recipeName);
             }
             
         }

+ 1 - 8
CyberX8_Themes/UserControls/RecipeControlMetal.xaml.cs

@@ -357,14 +357,7 @@ namespace CyberX8_Themes.UserControls
             }
             else
             {
-                if (RecipeModeValue != SelectedRecipeNode.RecipeLocation)
-                {
-                    MessageBox.Show("Recipe OperationMode is not match!", $"Current Recipe OperationMode is {RecipeModeValue}", MessageBoxButton.OK, MessageBoxImage.Error);
-                }
-                else
-                {
-                    GlobalEvents.OnSwitchFixedTabItem("Recipe", "", _recipeName);
-                }
+                GlobalEvents.OnSwitchFixedTabItem("Recipe", "", _recipeName);
             }
 
         }

+ 1 - 0
Framework/Common/Log/LogManager.cs

@@ -102,6 +102,7 @@ namespace Aitex.Core.RT.Log
                             if (lastWriteTime < intervalTime)
                             {
                                 File.Delete(info.FullName);
+                                continue;
                             }
                         }
                         if (_isEnableCompressLogFile && info.Extension != ".zip" && lastWriteTime < DateTime.Now.AddDays(-1))

+ 10 - 10
Framework/Common/RecipeCenter/ResRecipe.cs

@@ -34,11 +34,11 @@ namespace MECF.Framework.Common.RecipeCenter
         private int _caFlowRateWarningLow;
         private int _caFlowRateErrorLow;
         private bool _idleFlowEnable;
-        private int _temperatureErrorHigh;
-        private int _temperatureErrorLow;
-        private int _temperatureSetPoint;
-        private int _temperatureWarningHigh;
-        private int _temperatureWarningLow;
+        private double _temperatureErrorHigh;
+        private double _temperatureErrorLow;
+        private double _temperatureSetPoint;
+        private double _temperatureWarningHigh;
+        private double _temperatureWarningLow;
 
         private bool _anDIReplenEnable;
         private int  _anDIReplenCurrentRate;
@@ -135,15 +135,15 @@ namespace MECF.Framework.Common.RecipeCenter
         [JsonProperty]
         public bool IdleFlowEnable { get { return _idleFlowEnable; } set { _idleFlowEnable = value; InvokePropertyChanged(nameof(IdleFlowEnable)); } }
         [JsonProperty]
-        public int TemperatureErrorHigh { get { return _temperatureErrorHigh; } set { _temperatureErrorHigh = value; InvokePropertyChanged(nameof(TemperatureErrorHigh)); } }
+        public double TemperatureErrorHigh { get { return _temperatureErrorHigh; } set { _temperatureErrorHigh = value; InvokePropertyChanged(nameof(TemperatureErrorHigh)); } }
         [JsonProperty]
-        public int TemperatureErrorLow { get { return _temperatureErrorLow; } set { _temperatureErrorLow = value; InvokePropertyChanged(nameof(TemperatureErrorLow)); } }
+        public double TemperatureErrorLow { get { return _temperatureErrorLow; } set { _temperatureErrorLow = value; InvokePropertyChanged(nameof(TemperatureErrorLow)); } }
         [JsonProperty]
-        public int TemperatureSetPoint { get { return _temperatureSetPoint; } set { _temperatureSetPoint = value; InvokePropertyChanged(nameof(TemperatureSetPoint)); } }
+        public double TemperatureSetPoint { get { return _temperatureSetPoint; } set { _temperatureSetPoint = value; InvokePropertyChanged(nameof(TemperatureSetPoint)); } }
         [JsonProperty]
-        public int TemperatureWarningHigh { get { return _temperatureWarningHigh; } set { _temperatureWarningHigh = value; InvokePropertyChanged(nameof(TemperatureWarningHigh)); } }
+        public double TemperatureWarningHigh { get { return _temperatureWarningHigh; } set { _temperatureWarningHigh = value; InvokePropertyChanged(nameof(TemperatureWarningHigh)); } }
         [JsonProperty]
-        public int TemperatureWarningLow { get { return _temperatureWarningLow; } set { _temperatureWarningLow = value; InvokePropertyChanged(nameof(TemperatureWarningLow)); } }
+        public double TemperatureWarningLow { get { return _temperatureWarningLow; } set { _temperatureWarningLow = value; InvokePropertyChanged(nameof(TemperatureWarningLow)); } }
 
         [JsonProperty]
         public bool ANDIReplenEnable { get { return _anDIReplenEnable; } set { _anDIReplenEnable = value; InvokePropertyChanged(nameof(ANDIReplenEnable)); } }