Browse Source

update boat ui speed limit

jiangjy 1 month ago
parent
commit
440a1c13e6

+ 68 - 2
Furnace/FurnaceRT/Config/System.sccfg

@@ -416,8 +416,8 @@
 			<config default="30" name="TP6" description="TP6 time out" max="999" min="0" paramter="" tag="" unit="s" type="Integer" />
 		</configs>
 	</configs>
-	
-	
+
+
 	<configs name="ScheduleMaintenance"  visible="false">
 	</configs>
 	<configs name="Minics">
@@ -538,6 +538,72 @@
 		<config default="1" name="RunToRunNumber" description="Run To Run Number" max="10000" min="1" paramter="" tag="" unit="次" type="Integer" />
 		<config default="false" name="RunToRunMode" description="Run To Run Mode" max="" min="" paramter="" tag="" unit=""  type="Bool" />
 
+		<configs name="ActionCommandStocker">
+			<configs name="Stocker1">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker2">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker3">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker4">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker5">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker6">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker7">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker8">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker9">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker10">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker11">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker12">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker13">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker14">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker15">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+			<configs name="Stocker16">
+				<config default="0" name="Pick" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+				<config default="0" name="Place" description="" max="999" min="1" paramter="" tag="" unit="s" type="Integer" />
+			</configs>
+		</configs>
 	</configs>
 
 

+ 65 - 37
Furnace/FurnaceRT/Devices/IoFurnaceMotor.cs

@@ -6,6 +6,7 @@ using Aitex.Core.RT.Log;
 using Aitex.Core.RT.OperationCenter;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.Util;
+using DocumentFormat.OpenXml.Spreadsheet;
 using FurnaceRT.Equipments.Boats;
 using FurnaceRT.Equipments.Systems;
 using MECF.Framework.Common.Equipment;
@@ -249,6 +250,7 @@ namespace FurnaceRT.Devices
                 return _diServoOn.Value;
             }
         }
+
         #endregion
 
         public IoFurnaceMotor(string module, XmlElement node, string ioModule = "")
@@ -436,28 +438,37 @@ namespace FurnaceRT.Devices
         {
             if (_diMoving.Value || _diHoming.Value)
             {
-                List<bool> chunks = new List<bool> { _diM0.Value, _diM1.Value, _diM2.Value, _diM3.Value, _diM4.Value, _diM5.Value };
-                chunks.Reverse();
+                return GetRAxisSpeed();
+            }
+            return 0f;
+        }
+        private float GetRAxisSpeed()
+        {
 
-                string binaryString = "";
-                foreach (bool chunk in chunks)
-                {
-                    binaryString += chunk ? "1" : "0";
-                }
+            List<bool> chunks = new List<bool> { _diM0.Value, _diM1.Value, _diM2.Value, _diM3.Value, _diM4.Value, _diM5.Value };
+            chunks.Reverse();
 
-                int intValue = Convert.ToInt32(binaryString, 2);
+            string binaryString = "";
+            foreach (bool chunk in chunks)
+            {
+                binaryString += chunk ? "1" : "0";
+            }
+
+            int intValue = Convert.ToInt32(binaryString, 2);
 
-                if (intValue >= 8 && intValue <= 47)
+            if (intValue >= 8 && intValue <= 47)
+            {
+                decimal standardSpeed = 0.1M;
+                for (int i = 8; i < intValue; i++)
                 {
-                    decimal standardSpeed = 0.1M;
-                    for (int i = 8; i < intValue; i++)
-                    {
-                        standardSpeed += 0.1M;
-                    }
-                    return (float)standardSpeed;
+                    standardSpeed += 0.1M;
                 }
+                return (float)standardSpeed;
+            }
+            else
+            {
+                return 0f;
             }
-            return 0f;
         }
         private float GetAxisSpeed()
         {
@@ -664,6 +675,27 @@ namespace FurnaceRT.Devices
                     break;
 
                 case State.Rotating:
+                    //if (_timer.GetElapseTime() >= 100)
+                    //{
+                    //    var currSpeed = GetRAxisSpeed();
+                    //    if (!_doMove.Value && _setSpeed == (float)(currSpeed))
+                    //    {
+                    //        _doCCW.SetValue(!_isCW, out _);
+                    //        _doCW.SetValue(_isCW, out _);
+                    //        _doMove.SetValue(true, out _);
+                    //        SC.SetItemValue(_scServoMoveSpeed.PathName, _setSpeed);
+                    //    }
+                    //    else
+                    //    {
+                    //        if (_timer.GetElapseTime() >= resetTime && !_doMove.Value && _setSpeed != (float)(currSpeed))
+                    //        {
+                    //            EV.PostAlarmLog($"{Module}", $"{Name} Motor Rotating timeout");
+                    //            _doMove.SetValue(false, out _);
+                    //            _state = State.Idle;
+                    //        }
+                    //    }
+                    //}
+
                     break;
 
                 default:
@@ -754,27 +786,19 @@ namespace FurnaceRT.Devices
                     break;
                 case "CW":
                     _state = State.Rotating;
-                    _doMove.SetPulseValue(true, resetTime);
-                    //ServoMoveSpeedSet = speed > 0 ? speed : (float)_scServoMoveSpeed.DoubleValue;
                     SetRotateSpeed(speed);
                     _doCCW.SetValue(false, out _);
                     _doCW.SetValue(true, out _);
                     SC.SetItemValue(_scServoMoveSpeed.PathName, speed);
+                    _doMove.SetPulseValue(true, resetTime);
                     break;
                 case "CCW":
                     _state = State.Rotating;
-                    _doMove.SetPulseValue(true, resetTime);
-                    //ServoMoveSpeedSet = speed > 0 ? speed : (float)_scServoMoveSpeed.DoubleValue;
                     SetRotateSpeed(speed);
-                    _doCW.SetValue(false, out _);
                     _doCCW.SetValue(true, out _);
+                    _doCW.SetValue(false, out _);
                     SC.SetItemValue(_scServoMoveSpeed.PathName, speed);
-                    break;
-                case "Rotate":
-                    _state = State.Rotating;
-                    ServoMovePositionSet = 0;
                     _doMove.SetPulseValue(true, resetTime);
-                    _timer.Start(0);
                     break;
 
             }
@@ -784,11 +808,12 @@ namespace FurnaceRT.Devices
 
         private void SetRotateSpeed(float speed)
         {
+            var value = Math.Round(speed, 3, MidpointRounding.AwayFromZero);
             decimal standardSpeed = 0.1M;
             bool enterSplit = false;
             for (int i = 8; i <= 47; i++)
             {
-                decimal compareSpeed = Convert.ToDecimal(speed);
+                decimal compareSpeed = Convert.ToDecimal(value);
                 if (Decimal.Compare(compareSpeed, standardSpeed) > 0)
                 {
                     standardSpeed = standardSpeed + 0.1M;
@@ -808,17 +833,20 @@ namespace FurnaceRT.Devices
                 _doM1.SetValue(chunks[1], out _);
                 _doM2.SetValue(chunks[2], out _);
                 _doM3.SetValue(chunks[3], out _);
-                _doM4.SetValue(false, out _);
-                _doM5.SetValue(false, out _);
-                if (chunks.Count == 5)
-                {
-                    _doM4.SetValue(chunks[4], out _);
-                    _doM5.SetValue(false, out _);
-                }
-                if (chunks.Count == 6)
+                switch (chunks.Count)
                 {
-                    _doM4.SetValue(chunks[4], out _);
-                    _doM5.SetValue(chunks[5], out _);
+                    case 5:
+                        _doM4.SetValue(chunks[4], out _);
+                        _doM5.SetValue(false, out _);
+                        break;
+                    case 6:
+                        _doM4.SetValue(chunks[4], out _);
+                        _doM5.SetValue(chunks[5], out _);
+                        break;
+                    default:
+                        _doM4.SetValue(false, out _);
+                        _doM5.SetValue(false, out _);
+                        break;
                 }
                 return;
             }

+ 6 - 0
Furnace/FurnaceRT/Equipments/CarrierRobots/CarrierRobotPick.cs

@@ -251,6 +251,12 @@ namespace FurnaceRT.Equipments.CarrierRobots
 
                     SetLPLoad((int)RoutineStep.SetLPLoad, _source, _timeout);
                 }
+                if (_source == ModuleName.LP3 || _source == ModuleName.LP4)
+                {
+                    Goto((int)RoutineStep.Goto, _source, _sourceSlot, _blade, true, _timeout);
+
+                    CheckGotoFinish((int)RoutineStep.CheckGotoFinish, _source, _timeout);
+                }
 
                 if (_cassetteRobotModule.TrigActionCommand != null)
                     SetRobotActionCommand((int)RoutineStep.SetRobotActionCommand, _source, _timeout);

+ 6 - 0
Furnace/FurnaceRT/Equipments/CarrierRobots/CarrierRobotPlace.cs

@@ -250,6 +250,12 @@ namespace FurnaceRT.Equipments.CarrierRobots
 
                     SetLPLoad((int)RoutineStep.SetLPLoad, _destination, _timeout);
                 }
+                if (_destination == ModuleName.LP3 || _destination == ModuleName.LP4)
+                {
+                    Goto((int)RoutineStep.Goto, _destination, _destinationSlot, _blade, false, _timeout);
+
+                    CheckGotoFinish((int)RoutineStep.CheckGotoFinish, _destination, _timeout);
+                }
 
                 if (_cassetteRobotModule.TrigActionCommand != null)
                     SetRobotActionCommand((int)RoutineStep.SetRobotActionCommand, _destination, _timeout);

+ 6 - 6
Furnace/FurnaceSimulator/Instances/SimulatorSystem.cs

@@ -916,12 +916,12 @@ namespace FurnaceSimulator.Instances
                 IO.DI[$"{module}.DI_BoatRAxisHomeDone"].Value = true;
                 _rAxisHomeTimer.Stop();
             }
-            IO.DI[$"{module}.DI_BoatRAxisM0"].Value = IO.DO[$"{module}.DO_BoatRAxisM0"].Value;
-            IO.DI[$"{module}.DI_BoatRAxisM1"].Value = IO.DO[$"{module}.DO_BoatRAxisM1"].Value;
-            IO.DI[$"{module}.DI_BoatRAxisM2"].Value = IO.DO[$"{module}.DO_BoatRAxisM2"].Value;
-            IO.DI[$"{module}.DI_BoatRAxisM3"].Value = IO.DO[$"{module}.DO_BoatRAxisM3"].Value;
-            IO.DI[$"{module}.DI_BoatRAxisM4"].Value = IO.DO[$"{module}.DO_BoatRAxisM4"].Value;
-            IO.DI[$"{module}.DI_BoatRAxisM5"].Value = IO.DO[$"{module}.DO_BoatRAxisM5"].Value;
+            //IO.DI[$"{module}.DI_BoatRAxisM0"].Value = IO.DO[$"{module}.DO_BoatRAxisM0"].Value;
+            //IO.DI[$"{module}.DI_BoatRAxisM1"].Value = IO.DO[$"{module}.DO_BoatRAxisM1"].Value;
+            //IO.DI[$"{module}.DI_BoatRAxisM2"].Value = IO.DO[$"{module}.DO_BoatRAxisM2"].Value;
+            //IO.DI[$"{module}.DI_BoatRAxisM3"].Value = IO.DO[$"{module}.DO_BoatRAxisM3"].Value;
+            //IO.DI[$"{module}.DI_BoatRAxisM4"].Value = IO.DO[$"{module}.DO_BoatRAxisM4"].Value;
+            //IO.DI[$"{module}.DI_BoatRAxisM5"].Value = IO.DO[$"{module}.DO_BoatRAxisM5"].Value;
             IO.DI[$"{module}.DI_BoatRAxisHomeBusy"].Value = IO.DO[$"{module}.DO_BoatRAxisHomeCmd"].Value;
             IO.DI[$"{module}.DI_BoatRAxisRotationBusy"].Value = IO.DO[$"{module}.DO_BoatRAxisRotationForward"].Value || IO.DO[$"{module}.DO_BoatRAxisRotationReverse"].Value;
         }

+ 3 - 1
Furnace/FurnaceUI/Views/Maintenances/BoatRobotView.xaml

@@ -6,6 +6,7 @@
              xmlns:local="clr-namespace:FurnaceUI.Views.Maintenances" 
              xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
              xmlns:cal="http://www.caliburn.org"
+              xmlns:controls="http://OpenSEMI.Ctrlib.com/presentation"
              xmlns:deviceControl="clr-namespace:Aitex.Core.UI.DeviceControl;assembly=MECF.Framework.UI.Core" xmlns:parts="clr-namespace:FurnaceUI.Controls.Parts"
              mc:Ignorable="d" 
              Width="1280" Height="900"
@@ -387,7 +388,8 @@
                 </Border>
                 <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="6" Grid.Column="2" Grid.ColumnSpan="2">
                     <StackPanel   Orientation="Horizontal"  >
-                        <TextBox Text="{Binding RAxisMoveSpeed,Mode=OneTime}" x:Name="tbSetSpeed" HorizontalContentAlignment="Center" Width="90" Height="30" Tag="Number"></TextBox>
+                        <controls:TextBoxEx Grid.Column="1" EditBoxMode="Decimal" KeepDecimals="1"  x:Name="tbSetSpeed" Width="90" Height="30" AllowIsOutOfRangeSaveChange="False"   Text="{Binding RAxisMoveSpeed,Mode=OneTime}" Margin="4,0,4,0" Tag="Number"/>
+
                         <Button Content="Save" Width="80" Height="30" Margin="10,0,10,0">
                             <i:Interaction.Triggers>
                                 <i:EventTrigger EventName="Click">

+ 6 - 5
Furnace/FurnaceUI/Views/Operations/Maintenances/ManualSetView.xaml

@@ -719,15 +719,16 @@
                                                 <ColumnDefinition/>
                                             </Grid.ColumnDefinitions>
                                             <TextBlock Text="Speed1"/>
-                                            <TextBox Grid.Column="1" Text="{Binding Loader3Speed1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0"/>
+                                            <controls:TextBoxEx Grid.Column="1" EditBoxMode="Decimal" AllowIsOutOfRangeSaveChange="False" MinValue="0" MaxValue="{Binding BoatZAxisLimitSpeed,UpdateSourceTrigger=PropertyChanged}"  Text="{Binding Loader3Speed1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0" Tag="Number"/>
                                             <TextBlock Grid.Column="2" Text="mm/min"/>
 
                                             <TextBlock Grid.Row="1" Text="Speed2"/>
-                                            <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Loader3Speed2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0"/>
+                                            <controls:TextBoxEx Grid.Row="1" Grid.Column="1" EditBoxMode="Decimal" AllowIsOutOfRangeSaveChange="False" MinValue="0" MaxValue="{Binding BoatZAxisLimitSpeed,UpdateSourceTrigger=PropertyChanged}"  Text="{Binding Loader3Speed2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0" Tag="Number"/>
+
                                             <TextBlock Grid.Row="1" Grid.Column="2" Text="mm/min"/>
 
                                             <TextBlock Grid.Row="2" Text="Speed3"/>
-                                            <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Loader3Speed3,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0"/>
+                                            <controls:TextBoxEx Grid.Row="2" Grid.Column="1" EditBoxMode="Decimal" AllowIsOutOfRangeSaveChange="False" MinValue="0" MaxValue="{Binding BoatZAxisLimitSpeed,UpdateSourceTrigger=PropertyChanged}"  Text="{Binding Loader3Speed3,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0" Tag="Number"/>
                                             <TextBlock Grid.Row="2" Grid.Column="2" Text="mm/min"/>
                                         </Grid>
 
@@ -742,7 +743,7 @@
                                                 <ColumnDefinition/>
                                             </Grid.ColumnDefinitions>
                                             <TextBlock Text="Speed1"/>
-                                            <TextBox Grid.Column="1" Text="{Binding LoaderSpeed,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0"/>
+                                            <controls:TextBoxEx Grid.Column="1" EditBoxMode="Decimal" AllowIsOutOfRangeSaveChange="False" MinValue="0" MaxValue="{Binding BoatZAxisLimitSpeed,UpdateSourceTrigger=PropertyChanged}"  Text="{Binding LoaderSpeed,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0" Tag="Number"/>
                                             <TextBlock Grid.Column="2" Text="mm/min"/>
                                         </Grid>
 
@@ -756,7 +757,7 @@
                                                 <ColumnDefinition/>
                                             </Grid.ColumnDefinitions>
                                             <TextBlock Text="Speed1"/>
-                                            <TextBox Grid.Column="1" Text="{Binding LoaderRPM,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0"/>
+                                            <controls:TextBoxEx Grid.Column="1" EditBoxMode="Decimal" KeepDecimals="1" AllowIsOutOfRangeSaveChange="False" MinValue="0" MaxValue="{Binding BoatRAxisLimitSpeed,UpdateSourceTrigger=PropertyChanged}"  Text="{Binding LoaderRPM,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="4,0,4,0" Tag="Number"/>
                                             <TextBlock Grid.Column="2" Text="rpm"/>
                                         </Grid>
                                         <!--<Grid Canvas.Top="45" Canvas.Left="-2">

+ 24 - 0
Furnace/FurnaceUI/Views/Operations/Maintenances/ManualSetViewModel.cs

@@ -669,7 +669,28 @@ namespace FurnaceUI.Views.Recipes
         public bool IsCombinationVisibility => !IsTableVisibility;
         #endregion
 
+        private double _boatZAxisLimitSpeed;
 
+        public double BoatZAxisLimitSpeed
+        {
+            get => _boatZAxisLimitSpeed;
+            set
+            {
+                _boatZAxisLimitSpeed = value;
+                NotifyOfPropertyChange(nameof(BoatZAxisLimitSpeed));
+            }
+        }
+        private double _boatRAxisLimitSpeed;
+
+        public double BoatRAxisLimitSpeed
+        {
+            get => _boatRAxisLimitSpeed;
+            set
+            {
+                _boatRAxisLimitSpeed = value;
+                NotifyOfPropertyChange(nameof(BoatRAxisLimitSpeed));
+            }
+        }
         private bool _noStandbyIsEnabled = false;
         public bool NoStandbyIsEnabled
         {
@@ -814,6 +835,9 @@ namespace FurnaceUI.Views.Recipes
 
             //InvokeClient.Instance.Service.DoOperation($"PM1.SetSensorRecipeOK", "");
             LoadData();
+            BoatZAxisLimitSpeed = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.BoatZAxisLimitSpeed");
+            BoatRAxisLimitSpeed = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatRotationServo.BoatRAxisLimitSpeed");
+
         }
 
 

File diff suppressed because it is too large
+ 7 - 5
Furnace/FurnaceUI/Views/Recipes/RecipeProcessEditView.xaml


+ 24 - 0
Furnace/FurnaceUI/Views/Recipes/RecipeProcessEditViewModel.cs

@@ -124,7 +124,28 @@ namespace FurnaceUI.Views.Recipes
             get { return _CurrentRecipe; }
             set { _CurrentRecipe = value; this.NotifyOfPropertyChange(nameof(CurrentRecipe)); }
         }
+        private double _boatZAxisLimitSpeed;
 
+        public double BoatZAxisLimitSpeed
+        {
+            get => _boatZAxisLimitSpeed;
+            set
+            {
+                _boatZAxisLimitSpeed = value;
+                NotifyOfPropertyChange(nameof(BoatZAxisLimitSpeed));
+            }
+        }
+        private double _boatRAxisLimitSpeed;
+
+        public double BoatRAxisLimitSpeed
+        {
+            get => _boatRAxisLimitSpeed;
+            set
+            {
+                _boatRAxisLimitSpeed = value;
+                NotifyOfPropertyChange(nameof(BoatRAxisLimitSpeed));
+            }
+        }
         private bool _isStandbyChecked;
         public bool IsStandbyChecked
         {
@@ -1244,6 +1265,9 @@ namespace FurnaceUI.Views.Recipes
 
             base.OnViewLoaded(view);
             view1 = (RecipeProcessEditView)view;
+            BoatZAxisLimitSpeed = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.BoatZAxisLimitSpeed");
+            BoatRAxisLimitSpeed = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatRotationServo.BoatRAxisLimitSpeed");
+
         }
 
         protected override void OnActivate()