Browse Source

添加buffer轴 速度限制及其速度设定入口

jiangjy 1 month ago
parent
commit
9ee45a9dbd

+ 8 - 8
Furnace/FurnaceRT/Config/IO/ELK/_ioDefinePM.xml

@@ -474,14 +474,14 @@
 		<DI_ITEM Index="1905" Name="DI_MachinePause" BufferOffset="1905" Addr="D119.1" Description="Machine pause" />
 		<DI_ITEM Index="1906" Name="DI_OperatorAccessHandOffLeft" BufferOffset="1906" Addr="D119.2" Description="Operator access-hand off left" />
 		<DI_ITEM Index="1907" Name="DI_OperatorAccessHandOffRight" BufferOffset="1907" Addr="D119.3" Description="Operator access-hand off right" />
-		<DI_ITEM Index="1908" Name="DI_FOUPRobotPedantMode" BufferOffset="1908" Addr="D119.4" Description="Foup robot each axis HP signal" />
-		<DI_ITEM Index="1909" Name="DI_FOUPRobotEachHandWaferStatus" BufferOffset="1909" Addr="D119.5" Description="Foup robot station access signal" />
-		<DI_ITEM Index="1910" Name="DI_FOUPRobotAlarmSignal" BufferOffset="1910" Addr="D119.6" Description="Foup robot pedant mode" />
-		<DI_ITEM Index="1911" Name="DI_FOUPRobotFoupOnRobotCheck" BufferOffset="1911" Addr="D119.7" Description="Foup robot each hand wafer status" />
-		<DI_ITEM Index="1912" Name="DI_FOUPRobotAxisZHomePosition" BufferOffset="1912" Addr="D119.8" Description="Foup robot alarm signal" />
-		<DI_ITEM Index="1913" Name="DI_FOUPRobotAxisYHomePosition" BufferOffset="1913" Addr="D119.9" Description="Foup robot reserve DI1" />
-		<DI_ITEM Index="1914" Name="DI_FOUPRobotAxisRHomePosition" BufferOffset="1914" Addr="D119.10" Description="Foup robot reserve DI2" />
-		<DI_ITEM Index="1915" Name="DI_FOUPRobotRunning" BufferOffset="1915" Addr="D119.11" Description="Foup robot reserve DI3" />
+		<DI_ITEM Index="1908" Name="DI_FOUPRobotPedantMode" BufferOffset="1908" Addr="D119.4" Description="FOUP Robot Pedant Mode" />
+		<DI_ITEM Index="1909" Name="DI_FOUPRobotEachHandWaferStatus" BufferOffset="1909" Addr="D119.5" Description="FOUP Robot Each Hand Wafer Status" />
+		<DI_ITEM Index="1910" Name="DI_FOUPRobotAlarmSignal" BufferOffset="1910" Addr="D119.6" Description="Foup robot alarm signal" />
+		<DI_ITEM Index="1911" Name="DI_FOUPRobotFoupOnRobotCheck" BufferOffset="1911" Addr="D119.7" Description="FOUP Robot Foup On Robot Check" />
+		<DI_ITEM Index="1912" Name="DI_FOUPRobotAxisZHomePosition" BufferOffset="1912" Addr="D119.8" Description="FOUP Robot Axis Z Home Position" />
+		<DI_ITEM Index="1913" Name="DI_FOUPRobotAxisYHomePosition" BufferOffset="1913" Addr="D119.9" Description="FOUP Robot Axis Y Home Position" />
+		<DI_ITEM Index="1914" Name="DI_FOUPRobotAxisRHomePosition" BufferOffset="1914" Addr="D119.10" Description="FOUP Robot Axis R Home Position" />
+		<DI_ITEM Index="1915" Name="DI_FOUPRobotRunning" BufferOffset="1915" Addr="D119.11" Description="FOUP Robot Running" />
 		<DI_ITEM Index="1916" Name="DI_FOUPRobotWithinBufferLayer1Area" BufferOffset="1916" Addr="D119.12" Description="FOUP Robot Within Buffer Layer1 Area" />
 		<DI_ITEM Index="1917" Name="DI_FOUPRobotWithinBufferLayer2Area" BufferOffset="1917" Addr="D119.13" Description="FOUP Robot Within Buffer Layer2 Area" />
 		<DI_ITEM Index="1918" Name="DI_FOUPRobotWithinBufferLayer3Area" BufferOffset="1918" Addr="D119.14" Description="FOUP Robot Within Buffer Layer3 Area" />

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

@@ -755,7 +755,8 @@
 		<config default="0" name="Position8" description="Position8" max="100000" min="-100000" paramter="" tag="" unit="" type="Double"  visible="false"/>
 		<config default="0" name="Position9" description="Position9" max="100000" min="-100000" paramter="" tag="" unit="" type="Double"  visible="false"/>
 		<config default="0" name="Position10" description="Position10" max="100000" min="-100000" paramter="" tag="" unit="" type="Double"  visible="false"/>
-		<config default="0" name="MoveSpeed" description="MoveSpeed" max="100000" min="-100000" paramter="" tag="" unit="" type="Double"  visible="false"/>
+		<config default="10" name="MoveSpeed" description="MoveSpeed" max="1000" min="0" paramter="" tag="" unit="" type="Double"  visible="false"/>
+		<config default="900" name="BufferAxisLimitSpeed" description="BufferAxisLimitSpeed" max="1000" min="0" paramter="" tag="" unit="" type="Double"  visible="false"/>
 	</configs>
 
 	<configs name="PM1" display="Parameter">

+ 12 - 1
Furnace/FurnaceRT/Devices/IoBufferMotor.cs

@@ -73,7 +73,7 @@ namespace FurnaceRT.Devices
         protected AOAccessor _aoSpeed;
         protected AOAccessor _aoAcc;
         protected AOAccessor _aoDec;
-
+        protected SCConfigItem _scBufferRotationSpeed;
         protected SCConfigItem _scMoveTimeout;
 
         protected DeviceTimer _timer = new DeviceTimer();
@@ -244,6 +244,7 @@ namespace FurnaceRT.Devices
             _aoDec = ParseAoNode("aoDec", node, ioModule);
 
             _scMoveTimeout = ParseScNode("scMoveTimeout", node, ioModule, $"{scRootPath}.MotionTimeout");
+            _scBufferRotationSpeed = ParseScNode("scBufferRotationSpeed", node, ioModule, $"{scRootPath}.MoveSpeed");
 
             if (_doServoOn != null)
                 _doServoOn.Value = true;
@@ -251,7 +252,14 @@ namespace FurnaceRT.Devices
             _thread = new PeriodicJob(50, OnTimer, Name);
             _thread.Start();
         }
+        private void InitSCAOData()
+        {
+
+            if (_scBufferRotationSpeed != null && _aoSpeed != null)
+                _aoSpeed.FloatValue = (float)_scBufferRotationSpeed.DoubleValue;
 
+
+        }
         public virtual bool Initialize()
         {
             DATA.Subscribe($"{Module}.{Name}.CurrentPosition", () => _aiRealPosition != null ? (_isFloatAioType ? _aiRealPosition.FloatValue : _aiRealPosition.Value) : 0);
@@ -326,6 +334,7 @@ namespace FurnaceRT.Devices
                 ServoStop();
                 return true;
             });
+            InitSCAOData();
             return true;
         }
 
@@ -434,6 +443,7 @@ namespace FurnaceRT.Devices
             ResetDO();
 
             _state = State.Moving;
+            InitSCAOData();
             _doMove.SetValue(true, out _);
             _timer.Start(0);
             return true;
@@ -450,6 +460,7 @@ namespace FurnaceRT.Devices
         {
             ResetDO();
             _doStop.SetPulseValue(true, 1000);
+            _doMove.SetValue(false, out _);
             _state = State.Idle;
         }
         protected void ResetDO()

+ 23 - 2
Furnace/FurnaceUI/Views/Maintenances/BufferRobotView.xaml

@@ -18,6 +18,7 @@
                     <RowDefinition Height="35"/>
                     <RowDefinition Height="35"/>
                     <RowDefinition Height="35"/>
+                    <RowDefinition Height="35"/>
                     <RowDefinition Height="115"/>
                 </Grid.RowDefinitions>
                 <Grid.ColumnDefinitions>
@@ -95,8 +96,28 @@
                         </Button>
                     </StackPanel>
                 </Border>
-
-                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.ColumnSpan="4" Padding="45,0,0,0">
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Title}" Grid.Row="5" Grid.Column="0" Padding="10,1,0,1">
+                    <TextBlock Text="Move Speed(mm/min)" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="14"  VerticalAlignment="Center" />
+                </Border>
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column="1">
+                    <TextBlock Text="{Binding BufferAxisMoveSpeed, StringFormat={}{0:f2}}" TextWrapping="Wrap" Foreground="{DynamicResource FG_Black}" FontSize="14"  VerticalAlignment="Center" HorizontalAlignment="Center"/>
+                </Border>
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="0,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="5" Grid.Column ="2" Grid.ColumnSpan="3" Padding="5,1">
+                    <StackPanel   Orientation="Horizontal"  >
+                        <TextBox Text="{Binding BufferAxisMoveSpeed,Mode=OneTime}" x:Name="tbMoveSpeed" HorizontalContentAlignment="Center" Width="90" Height="30" Tag="Number"></TextBox>
+                        <Button Content="Save" Width="80" Height="30" Margin="10,0,10,0">
+                            <i:Interaction.Triggers>
+                                <i:EventTrigger EventName="Click">
+                                    <cal:ActionMessage MethodName="BufferSaveValue">
+                                        <cal:Parameter Value="MoveSpeed" />
+                                        <cal:Parameter Value="{Binding ElementName=tbMoveSpeed}" />
+                                    </cal:ActionMessage>
+                                </i:EventTrigger>
+                            </i:Interaction.Triggers>
+                        </Button>
+                    </StackPanel>
+                </Border>
+                <Border BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_Content}" Grid.Row="6" Grid.ColumnSpan="4" Padding="45,0,0,0">
                     <StackPanel   Orientation="Horizontal" Margin="35,0,0,0" >
                         <Button Content="Servo On" Width="92" Height="30" Margin="22,-70,10,0"  IsEnabled="{Binding IsSystemStaus}">
                             <i:Interaction.Triggers>

+ 55 - 0
Furnace/FurnaceUI/Views/Maintenances/BufferRobotViewModel.cs

@@ -1,6 +1,10 @@
 using Aitex.Core.Util;
+using Caliburn.Micro.Core;
+using Caliburn.Micro;
 using FurnaceUI.Models;
+using FurnaceUI.Views.Operations;
 using MECF.Framework.Common.DataCenter;
+using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.OperationCenter;
 using System;
 using System.Collections.Generic;
@@ -8,6 +12,8 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Controls;
+using OpenSEMI.ClientBase;
+
 
 namespace FurnaceUI.Views.Maintenances
 {
@@ -43,6 +49,8 @@ namespace FurnaceUI.Views.Maintenances
             }
         }
 
+        public double BufferAxisMoveSpeed { get; set; }
+        public double BufferAxisLimitSpeed { get; set; }
         private string _selectedTargetPosition;
         public string SelectedTargetPosition
         {
@@ -53,6 +61,37 @@ namespace FurnaceUI.Views.Maintenances
                 NotifyOfPropertyChange(nameof(SelectedTargetPosition));
             }
         }
+        private BufferRobotView _view;
+        protected override void OnViewLoaded(object view)
+        {
+            base.OnViewLoaded(view);
+            _view = view as BufferRobotView;
+            
+            BufferAxisLimitSpeed = (double)QueryDataClient.Instance.Service.GetConfig($"BufferServo.BufferAxisLimitSpeed");
+
+        }
+        private void InitData()
+        {
+            BufferAxisMoveSpeed = (double)QueryDataClient.Instance.Service.GetConfig($"BufferServo.MoveSpeed");
+        }
+        protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)
+        {
+            InitData();
+            if (_view != null)
+            {
+                var rsetValueBool = double.TryParse(_view?.tbMoveSpeed.Text, out double setZValue);
+                if (!rsetValueBool)
+                    _view.tbMoveSpeed.Text = "0";
+
+
+                if (!string.IsNullOrEmpty(_view?.tbMoveSpeed.Text) && rsetValueBool && setZValue > BufferAxisLimitSpeed)
+                {
+                    _view.tbMoveSpeed.Text = "0";
+                    DialogBox.ShowWarning($"Max Move Speed is {BufferAxisLimitSpeed}");
+                }
+             
+            }
+        }
 
         private Dictionary<string, string> _targetPositionDic = new Dictionary<string, string>()
         {
@@ -97,7 +136,23 @@ namespace FurnaceUI.Views.Maintenances
         {
             InvokeClient.Instance.Service.DoOperation($"{target}", $"{isOn}");
         }
+        public void BufferSaveValue(object obj, object tb)
+        {
+            switch (obj)
+            {
+             
+                case "MoveSpeed":
+                    var setValue = double.Parse((tb as TextBox)?.Text);
+                    if (setValue > BufferAxisLimitSpeed)
+                    {
+                        DialogBox.ShowWarning($"Max MoveSpeed is {BufferAxisLimitSpeed}");
+                        break;
+                    }
+                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"BufferServo.{obj}", (tb as TextBox)?.Text);
+                    break;
+            }
 
+        }
         public void Stop(object target)
         {
             InvokeClient.Instance.Service.DoOperation($"{target}.ServoStop");

+ 32 - 24
Furnace/FurnaceUI/Views/Operations/TransferMain/SelfCheckViewModel.cs

@@ -20,7 +20,7 @@ using FurnaceUI.Views.Maintenances;
 
 namespace FurnaceUI.Views.Operations
 {
-    
+
     public class SelfCheckViewModel : FurnaceUIViewModelBase
     {
 
@@ -644,7 +644,7 @@ namespace FurnaceUI.Views.Operations
         {
             get
             {
-                return IsManagerPermission&&(RtStatus == "Idle" || RtStatus == "AutoIdle");
+                return IsManagerPermission && (RtStatus == "Idle" || RtStatus == "AutoIdle");
             }
         }
         public bool PM1Installed { get; set; }
@@ -1197,8 +1197,16 @@ namespace FurnaceUI.Views.Operations
             if (ModuleManager.ModuleInfos.ContainsKey("WaferRobot"))
             {
                 WaferInfo[] waferInfos = ModuleManager.ModuleInfos["WaferRobot"].WaferManager.Wafers.ToArray();
-                WaferRobotWafer1 = waferInfos[0];
-                WaferRobotWafer2 = waferInfos[1];
+                if (waferInfos.Count() > 0)
+                {
+                    WaferRobotWafer1 = waferInfos[0];
+
+                }
+                if (waferInfos.Count() > 1)
+                {
+                    WaferRobotWafer2 = waferInfos[1];
+
+                }
             }
             var isLoadPortPosition = (string)QueryDataClient.Instance.Service.GetConfig("LoadPort.LoadPortPosition");
             if (isLoadPortPosition == "Upper")
@@ -1391,7 +1399,7 @@ namespace FurnaceUI.Views.Operations
                         lpViewModel.LP3BorderVisibility = false;
                         lpViewModel.LP4BorderVisibility = false;
                         lpViewModel.TabSelectIndex = 0;
-                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel,this, null, "LP1 Manual");
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel, this, null, "LP1 Manual");
                     }
                     break;
                 case "LP2":
@@ -1401,8 +1409,8 @@ namespace FurnaceUI.Views.Operations
                         lpViewModel.LP2BorderVisibility = true;
                         lpViewModel.LP3BorderVisibility = false;
                         lpViewModel.LP4BorderVisibility = false;
-                        lpViewModel.TabSelectIndex =1;
-                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel,this, null, "LP2 Manual");
+                        lpViewModel.TabSelectIndex = 1;
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel, this, null, "LP2 Manual");
                     }
                     break;
                 case "LP3":
@@ -1413,7 +1421,7 @@ namespace FurnaceUI.Views.Operations
                         lpViewModel.LP3BorderVisibility = true;
                         lpViewModel.LP4BorderVisibility = false;
                         lpViewModel.TabSelectIndex = 2;
-                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel,this, null, "LP3 Manual");
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel, this, null, "LP3 Manual");
                     }
                     break;
                 case "LP4":
@@ -1424,17 +1432,17 @@ namespace FurnaceUI.Views.Operations
                         lpViewModel.LP3BorderVisibility = false;
                         lpViewModel.LP4BorderVisibility = true;
                         lpViewModel.TabSelectIndex = 3;
-                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel,this, null, "LP4 Manual");
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(lpViewModel, this, null, "LP4 Manual");
                     }
                     break;
                 case "FIMS1":
                 case "FIMS2":
                     {
                         FIMSSensorViewModel fimsSensorViewModel = new FIMSSensorViewModel();
-                        (windowManager as WindowManager)?.ShowDialogWithTitle(fimsSensorViewModel,this, null, "FIMS Manual");
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(fimsSensorViewModel, this, null, "FIMS Manual");
                     }
                     break;
-                
+
                 default:
                     break;
             }
@@ -1447,36 +1455,36 @@ namespace FurnaceUI.Views.Operations
                 case "SMIFA":
                     {
                         SMIFViewModel smifViewModel = new SMIFViewModel();
-                        (windowManager as WindowManager)?.ShowDialogWithTitle(smifViewModel,this, null, "SMIF Status");
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(smifViewModel, this, null, "SMIF Status");
                     }
                     break;
                 case "SMIFB":
                     {
                         SMIFViewModel smifViewModel = new SMIFViewModel();
-                        (windowManager as WindowManager)?.ShowDialogWithTitle(smifViewModel,this, null, "SMIF Status");
+                        (windowManager as WindowManager)?.ShowDialogWithTitle(smifViewModel, this, null, "SMIF Status");
                     }
                     break;
                 case "CassetteRobot":
                     CassetteRobotViewModel cassetteRobotViewModel = new CassetteRobotViewModel();
                     cassetteRobotViewModel.SystemName = "SMIFA";
-                    (windowManager as WindowManager)?.ShowDialogWithTitle(cassetteRobotViewModel,this, null, "CassetteRobot Status");
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(cassetteRobotViewModel, this, null, "CassetteRobot Status");
                     break;
                 case "WaferRobot":
                     WaferRobotViewModel waferRobotViewModel = new WaferRobotViewModel();
-                    (windowManager as WindowManager)?.ShowDialogWithTitle(waferRobotViewModel,this, null, "WaferRobot Status");
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(waferRobotViewModel, this, null, "WaferRobot Status");
                     break;
                 case "Stage":
                     StageSensorViewModel stageSensorViewModel = new StageSensorViewModel();
-                    (windowManager as WindowManager)?.ShowDialogWithTitle(stageSensorViewModel,this, null, "Stage Status");
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(stageSensorViewModel, this, null, "Stage Status");
                     break;
                 case "Stocker":
                     StockerSensorViewModel stockerSensorViewModel = new StockerSensorViewModel();
-                    (windowManager as WindowManager)?.ShowDialogWithTitle(stockerSensorViewModel,this, null, "Stocker Status");
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(stockerSensorViewModel, this, null, "Stocker Status");
                     break;
                 case "Boat":
                     BoatSensorViewModel boatSensorViewModel = new BoatSensorViewModel();
-                    (windowManager as WindowManager)?.ShowDialogWithTitle(boatSensorViewModel,this, null, "Boat Status");
-                    break;                
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(boatSensorViewModel, this, null, "Boat Status");
+                    break;
                 default:
                     break;
             }
@@ -1506,7 +1514,7 @@ namespace FurnaceUI.Views.Operations
         {
             var windowManager = IoC.Get<IWindowManager>();
             BoatModifyViewModel boatModifyViewModel = new BoatModifyViewModel(ModuleName.PM1.ToString());
-            (windowManager as WindowManager)?.ShowDialogWithTitle(boatModifyViewModel,this, null, "Boat Wafer");
+            (windowManager as WindowManager)?.ShowDialogWithTitle(boatModifyViewModel, this, null, "Boat Wafer");
         }
         public void PopupModule(string module)
         {
@@ -1515,15 +1523,15 @@ namespace FurnaceUI.Views.Operations
             {
                 case "Init":
                     SelfCheckInitViewModel shelfCheckInitViewModel = new SelfCheckInitViewModel();
-                    (windowManager as WindowManager)?.ShowDialogWithTitle(shelfCheckInitViewModel,this, null, "Init");
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(shelfCheckInitViewModel, this, null, "Init");
                     break;
                 case "ManualOperation":
                     SelfCheckManualOperationViewModel shelfCheckManualOperationViewModel = new SelfCheckManualOperationViewModel();
-                    (windowManager as WindowManager)?.ShowDialogWithTitle(shelfCheckManualOperationViewModel,this, null, "Manual Operation");
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(shelfCheckManualOperationViewModel, this, null, "Manual Operation");
                     break;
                 case "Modify":
                     SelfCheckModifyViewModel shelfCheckModifyViewModel = new SelfCheckModifyViewModel();
-                    (windowManager as WindowManager)?.ShowDialogWithTitle(shelfCheckModifyViewModel,this, null, "Modify");
+                    (windowManager as WindowManager)?.ShowDialogWithTitle(shelfCheckModifyViewModel, this, null, "Modify");
                     break;
                     //case "SensorStatus":
                     //    SensorsViewModel sensorsViewModel = new SensorsViewModel();
@@ -1536,7 +1544,7 @@ namespace FurnaceUI.Views.Operations
         {
             var windowManager = IoC.Get<IWindowManager>();
             RobotCommandViewModel robotCommandViewModel = new RobotCommandViewModel();
-            (windowManager as WindowManager)?.ShowDialogWithTitle(robotCommandViewModel,this, null, "Modify");
+            (windowManager as WindowManager)?.ShowDialogWithTitle(robotCommandViewModel, this, null, "Modify");
         }
         public void CloseCmd()
         {