Bläddra i källkod

1.添加TM Simulator
2.优化TM 功能

lixiang 1 år sedan
förälder
incheckning
b96ac701fb

+ 4 - 3
Venus/Venus_Core/ProcessUnitDefine.cs

@@ -29,6 +29,9 @@ namespace Venus_Core
     public partial class PressureByPressureModeUnit : ProcessUnitBase
     {
         public string UnitName { get; set; } = "PressureModeUnit";
+
+        public PressureUnitMode PressureUnitMode { get; set; }
+
         public int StartPressure { get; set; } = 10;
         public int ValvePositionPreset { get; set; } = 10;
 
@@ -36,11 +39,9 @@ namespace Venus_Core
        
         public int TargetPressure { get; set; } = 20;
         public int HoldTime { get; set; } = 1000;
-
-        //public bool EnableRamp { get; set; }
         public int StartPosition { get; set; } = 10;
         public int TargetPosition { get; set; } = 100;
-        //public int HoldTime { get; set; } = 10000;
+
 
 
         public event PropertyChangedEventHandler PropertyChanged;

+ 0 - 1
Venus/Venus_Core/Recipe.cs

@@ -286,7 +286,6 @@ namespace Venus_Core
             get { return m_CycleNumber;}
             set { m_CycleNumber = value; InvokePropertyChanged("CycleNumber"); }
         }
-        public PressureUnitMode PressureUnitMode { get; set; }
 
         private ObservableCollection<Object> lstUnit = new ObservableCollection<Object>();
         public ObservableCollection<Object> LstUnit

+ 2 - 0
Venus/Venus_MainPages/ViewModels/EfemViewModel.cs

@@ -6,6 +6,7 @@ using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.OperationCenter;
 using MECF.Framework.Common.Schedulers;
 using OpenSEMI.ClientBase;
+using OpenSEMI.Ctrlib.Controls;
 using Prism.Commands;
 using Prism.Mvvm;
 using System;
@@ -727,6 +728,7 @@ namespace Venus_MainPages.ViewModels
         {
             InvokeClient.Instance.Service.DoOperation($"TM.{obj.ModuleName}ESlitDoor.{obj?.IsOpen}");
         }
+       
         #endregion
 
     }

BIN
Venus/Venus_RT/Config/DeviceModelVenus_MF.xml


+ 2 - 0
Venus/Venus_RT/Config/System.sccfg

@@ -111,6 +111,8 @@
 
 		<config default="1" name="TMRobotType" nameView="TM Robot Type" description="TM 类型,1=SIASUN新松 2==Brooks" max="10" min="1" paramter="" tag="" unit="" type="Integer" />
 
+		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="" max="30000" min="0" paramter="" tag="" unit="s" type="Integer" />
+
 		<config default="1" name="LLAStationNumber" nameView="LLA Station Number" description="LLA Station Number" max="99" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="2" name="LLBStationNumber" nameView="LLB Station Number" description="LLB Station Number" max="99" min="0" paramter="" tag="" unit="" type="Integer" />
 		<config default="3" name="PMAStationNumber" nameView="PMA Station Number" description="PMA Station Number" max="99" min="0" paramter="" tag="" unit="" type="Integer" />

+ 36 - 3
Venus/Venus_RT/Devices/TM/JetTM.cs

@@ -323,7 +323,24 @@ namespace Venus_RT.Devices
             switch (mod)
             {
                 case ModuleName.TM:
-                    _TMSoftVentValve.TurnValve(bOn, out string _);
+                    _TMFastVentValve.TurnValve(bOn, out string _);
+                    break;
+                case ModuleName.LLA:
+                    _LLAVentValve.TurnValve(bOn, out string _);
+                    break;
+                case ModuleName.LLB:
+                    _LLBVentValve.TurnValve(bOn, out string _);
+                    break;
+            }
+        }
+
+        public void TurnFastVentValve(ModuleName mod, bool bOn)
+        {
+            _TMN2Valve.TurnValve(bOn, out string _);
+            switch (mod)
+            {
+                case ModuleName.TM:
+                    _TMFastVentValve.TurnValve(bOn, out string _);
                     break;
                 case ModuleName.LLA:
                     _LLAVentValve.TurnValve(bOn, out string _);
@@ -334,14 +351,30 @@ namespace Venus_RT.Devices
             }
         }
 
-      
+        public void TurnSoftVentValve(ModuleName mod, bool bOn)
+        {
+            _TMN2Valve.TurnValve(bOn, out string _);
+            switch (mod)
+            {
+                case ModuleName.TM:
+                    _TMSoftVentValve.TurnValve(bOn, out string _);
+                    break;
+                case ModuleName.LLA:
+                    _LLAPurgeValve.TurnValve(bOn, out string _);
+                    break;
+                case ModuleName.LLB:
+                    _LLBPurgeValve.TurnValve(bOn, out string _);
+                    break;
+            }
+        }
 
         public void TurnPurgeValve(ModuleName mod, bool bOn)
         {
             switch(mod)
             {
                 case ModuleName.TM:
-                    _TMPurgeValve.TurnValve(bOn, out string _);
+                    //_TMPurgeValve.TurnValve(bOn, out string _);
+                    _TMFastVentValve.TurnValve(bOn, out string _);
                     break;
                 case ModuleName.LLA:
                     _LLAPurgeValve.TurnValve(bOn, out string _);

+ 43 - 9
Venus/Venus_RT/Modules/PMs/ProcessDefine.cs

@@ -63,11 +63,24 @@ namespace Venus_RT.Modules.PMs
         private RState PressureByPressureModeUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as PressureByPressureModeUnit;
-            if (Chamber.SetPVPressure(ProcessUnit.StartPressure))
+
+            if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure)
             {
-                return RState.Running;
+                if (Chamber.SetPVPressure(ProcessUnit.StartPressure))
+                {
+                    return RState.Running;
+                }
+            }
+            else if (ProcessUnit.PressureUnitMode == PressureUnitMode.Valve)
+            {
+                if (Chamber.SetPVPostion(ProcessUnit.StartPosition))
+                { 
+                    return RState.Running;
+                }
             }
 
+             
+
             return RState.Failed;
         }
 
@@ -76,16 +89,34 @@ namespace Venus_RT.Modules.PMs
             var ProcessUnit = unit as PressureByPressureModeUnit;
             if(ProcessUnit.EnableRamp)
             {
-                if (Chamber.SetPVPressure(ProcessUnit.StartPressure + (int)((ProcessUnit.TargetPressure - ProcessUnit.StartPressure) * step.RampFactor())))
-                    return RState.Running;
-                else
-                    return RState.Failed;
+                if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure)
+                {
+                    if (Chamber.SetPVPressure(ProcessUnit.StartPressure + (int)((ProcessUnit.TargetPressure - ProcessUnit.StartPressure) * step.RampFactor())))
+                        return RState.Running;
+                    else
+                        return RState.Failed;
+                }
+                else if (ProcessUnit.PressureUnitMode == PressureUnitMode.Valve)
+                {
+                    if (Chamber.SetPVPressure(ProcessUnit.StartPosition + (int)((ProcessUnit.TargetPosition - ProcessUnit.StartPosition) * step.RampFactor())))
+                        return RState.Running;
+                    else
+                        return RState.Failed;
+                }
             }
 
-            if(step.Type == StepType.Stable && Chamber.ChamberPressure == ProcessUnit.StartPressure)
+            if (ProcessUnit.PressureUnitMode == PressureUnitMode.Pressure)
+            {
+                if (step.Type == StepType.Stable && Chamber.ChamberPressure == ProcessUnit.StartPressure)
+                {
+                    return RState.End;
+                }
+            }
+            else if (ProcessUnit.PressureUnitMode == PressureUnitMode.Valve)
             {
                 return RState.End;
             }
+               
 
             return RState.Running;
         }
@@ -95,10 +126,11 @@ namespace Venus_RT.Modules.PMs
 
         }
 
+        #region Valve Mode已取消,合并到压力模式
         private RState PressureByValveModeUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as PressureByValveModeUnit;
-            if(Chamber.SetPVPostion(ProcessUnit.StartPosition))
+            if (Chamber.SetPVPostion(ProcessUnit.StartPosition))
             {
                 return RState.Running;
             }
@@ -108,7 +140,7 @@ namespace Venus_RT.Modules.PMs
         private RState PressureByValveModeUnit_Check(ProcessUnitBase unit, RecipeStep step)
         {
             var ProcessUnit = unit as PressureByValveModeUnit;
-            if(ProcessUnit.EnableRamp)
+            if (ProcessUnit.EnableRamp)
             {
                 if (Chamber.SetPVPostion(ProcessUnit.StartPosition + (int)((ProcessUnit.TargetPosition - ProcessUnit.StartPosition) * step.RampFactor())))
                     return RState.Running;
@@ -123,6 +155,8 @@ namespace Venus_RT.Modules.PMs
         {
 
         }
+        #endregion
+
 
         private RState TCPUnit_Start(ProcessUnitBase unit, RecipeStep step)
         {

+ 3 - 3
Venus/Venus_RT/Modules/TM/MFVentRoutine.cs

@@ -58,7 +58,7 @@ namespace Venus_RT.Modules.TM
         private bool OpenSoftVentValve()
         {
             _JetTM.TurnN2Valve(true);
-            _JetTM.TurnPurgeValve(Module, true);
+            _JetTM.TurnSoftVentValve(Module, true);
             return true;
         }
         private bool IsSoftVentEnd()
@@ -67,9 +67,9 @@ namespace Venus_RT.Modules.TM
         }
         private bool SwitchFastVentValve()
         {
-            _JetTM.TurnPurgeValve(Module, false);
+            _JetTM.TurnSoftVentValve(Module, false);
 
-            _JetTM.TurnVentValve(Module, true);
+            _JetTM.TurnFastVentValve(Module, true);
             return true;
         }
         private bool OpenVentValve()

+ 4 - 4
Venus/Venus_Simulator/Config/_ioDefineVenus_MF.xml

@@ -150,10 +150,10 @@
 		<DO_ITEM Index="25" Name="DO_LLB_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.09" />
 		<DO_ITEM Index="26" Name="DO_Water_Valve_Relay" Device="" Addr="w1.10" Note="PC to PLC  w1.10  ON开启冷却水,DO-26在满足DI-03 ON条件下置ON。" />
 		<DO_ITEM Index="27" Name="" Device="" Addr="w1.11" />
-		<DO_ITEM Index="28" Name="DO_PMA_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.12" />
-		<DO_ITEM Index="29" Name="DO_PMB_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.13" />
-		<DO_ITEM Index="30" Name="DO_PMC_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.14" />
-		<DO_ITEM Index="31" Name="DO_PMD_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.15" />
+		<DO_ITEM Index="28" Name="DO_PMA_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.12" Note="SMALL SIZE WAFER 置ON,BIG SIZE WAFER 置OFF."/>
+		<DO_ITEM Index="29" Name="DO_PMB_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.13" Note="SMALL SIZE WAFER 置ON,BIG SIZE WAFER 置OFF."/>
+		<DO_ITEM Index="30" Name="DO_PMC_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.14" Note="SMALL SIZE WAFER 置ON,BIG SIZE WAFER 置OFF."/>
+		<DO_ITEM Index="31" Name="DO_PMD_BIG_SMALL_SIZE_WAFER_CHECK" Device="" Addr="w1.15" Note="SMALL SIZE WAFER 置ON,BIG SIZE WAFER 置OFF."/>
 		<DO_ITEM Index="32" Name="" />
 		<DO_ITEM Index="33" Name="" />
 		<DO_ITEM Index="34" Name="" />

+ 159 - 0
Venus/Venus_Simulator/Instances/SimulatorSystem.cs

@@ -394,6 +394,7 @@ namespace Venus_Simulator.Instances
                 ChangeTime(ModuleName.TM);
 
                 MonitorMFSlitDoor();
+                MonitorMFPressure();
 
 
             }
@@ -986,7 +987,165 @@ namespace Venus_Simulator.Instances
 
         }
 
+        void MonitorMFPressure()
+        {
+
+            string LLA_AI_ChamberPressure = "AI_LLA_CHB_Pressure";
+            string LLB_AI_ChamberPressure = "AI_LLB_CHB_Pressure";
+            string TM_AI_ChamberPressure  = "AI_TM_CHB_Pressure";
+
+
+            ModuleName mod = ModuleName.TM;
+
+            DOAccessor LLA_fast_pump_vlv = IO.DO[$"{mod}.DO_Fast_Pumping_Valve_LLA"];
+            DOAccessor LLA_soft_pump_vlv = IO.DO[$"{mod}.DO_Soft_Pumping_Valve_LLA"];
+
+            DOAccessor LLB_fast_pump_vlv = IO.DO[$"{mod}.DO_Fast_Pumping_Valve_LLB"];
+            DOAccessor LLB_soft_pump_vlv = IO.DO[$"{mod}.DO_Soft_Pumping_Valve_LLB"];
+
+            DOAccessor TM_fast_pump_vlv = IO.DO[$"{mod}.DO_Fast_Pumping_Valve_TM"];
+            DOAccessor TM_soft_pump_vlv = IO.DO[$"{mod}.DO_Soft_Pumping_Valve_TM"];
+
+            DOAccessor LLA_fast_Vent_vlv = IO.DO[$"{mod}.DO_Vent_Valve_LLA"];
+            DOAccessor LLA_soft_Vent_vlv = IO.DO[$"{mod}.DO_Purge_Valve_LLA"];
+
+            DOAccessor LLB_fast_Vent_vlv = IO.DO[$"{mod}.DO_Vent_Valve_LLB"];
+            DOAccessor LLB_soft_Vent_vlv = IO.DO[$"{mod}.DO_Purge_Valve_LLB"];
+
+            DOAccessor TM_fast_Vent_vlv = IO.DO[$"{mod}.DO_Fast_Vent_Valve_TM"];
+            DOAccessor TM_soft_Vent_vlv = IO.DO[$"{mod}.DO_Soft_Vent_Valve_TM"];
+
+            float getAiValue_LLA_ChamberPressure = GetAiValue($"{mod}.{LLA_AI_ChamberPressure}");
+            float getAiValue_LLB_ChamberPressure = GetAiValue($"{mod}.{LLB_AI_ChamberPressure}");
+            float getAiValue_TM_ChamberPressure = GetAiValue($"{mod}.{TM_AI_ChamberPressure}");
+
+
+
+            if (LLA_fast_pump_vlv.Value || LLA_soft_pump_vlv.Value)
+            {
+                if ( getAiValue_LLA_ChamberPressure > 10000)
+                {
+                    SetAiValue($"{mod}.{LLA_AI_ChamberPressure}", GetAiValue($"{mod}.{LLA_AI_ChamberPressure}") - 30000);
+                }
+                else if (getAiValue_LLA_ChamberPressure <= 10000)
+                {                   
+                    SetAiValue($"{mod}.{LLA_AI_ChamberPressure}", GetAiValue($"{mod}.{LLA_AI_ChamberPressure}") - 1500);
+                }              
+            }
+
+            if (LLB_fast_pump_vlv.Value || LLB_soft_pump_vlv.Value)
+            {
+                if (getAiValue_LLB_ChamberPressure > 10000)
+                {
+                    SetAiValue($"{mod}.{LLB_AI_ChamberPressure}", GetAiValue($"{mod}.{LLB_AI_ChamberPressure}") - 30000);
+                }
+                else if (getAiValue_LLB_ChamberPressure <= 10000)
+                {
+                    SetAiValue($"{mod}.{LLB_AI_ChamberPressure}", GetAiValue($"{mod}.{LLB_AI_ChamberPressure}") - 1500);
+                }
+            }
+
+            if (TM_fast_pump_vlv.Value || TM_soft_pump_vlv.Value)
+            {
+                if (getAiValue_TM_ChamberPressure > 10000)
+                {
+                    SetAiValue($"{mod}.{TM_AI_ChamberPressure}", GetAiValue($"{mod}.{TM_AI_ChamberPressure}") - 30000);
+                }
+                else if (getAiValue_TM_ChamberPressure <= 10000)
+                {
+                    SetAiValue($"{mod}.{TM_AI_ChamberPressure}", GetAiValue($"{mod}.{TM_AI_ChamberPressure}") - 1500);
+                }
+            }
+
+
+            if (LLA_fast_Vent_vlv.Value || LLA_soft_Vent_vlv.Value)
+            {
+                if (getAiValue_LLA_ChamberPressure > 10000)
+                {
+                    SetAiValue($"{mod}.{LLA_AI_ChamberPressure}", GetAiValue($"{mod}.{LLA_AI_ChamberPressure}") + 30000);
+                }
+                else if (getAiValue_LLA_ChamberPressure <= 10000)
+                {
+                    SetAiValue($"{mod}.{LLA_AI_ChamberPressure}", GetAiValue($"{mod}.{LLA_AI_ChamberPressure}") + 1500);
+                }
+            }
+
+            if (LLB_fast_Vent_vlv.Value || LLB_soft_Vent_vlv.Value)
+            {
+                if (getAiValue_LLB_ChamberPressure > 10000)
+                {
+                    SetAiValue($"{mod}.{LLB_AI_ChamberPressure}", GetAiValue($"{mod}.{LLB_AI_ChamberPressure}") + 30000);
+                }
+                else if (getAiValue_LLB_ChamberPressure <= 10000)
+                {
+                    SetAiValue($"{mod}.{LLB_AI_ChamberPressure}", GetAiValue($"{mod}.{LLB_AI_ChamberPressure}") + 1500);
+                }
+            }
+
+
+            if (TM_fast_Vent_vlv.Value || TM_soft_Vent_vlv.Value)
+            {
+                if (getAiValue_TM_ChamberPressure > 10000)
+                {
+                    SetAiValue($"{mod}.{TM_AI_ChamberPressure}", GetAiValue($"{mod}.{TM_AI_ChamberPressure}") + 30000);
+                }
+                else if (getAiValue_TM_ChamberPressure <= 10000)
+                {
+                    SetAiValue($"{mod}.{TM_AI_ChamberPressure}", GetAiValue($"{mod}.{TM_AI_ChamberPressure}") + 1500);
+                }
+            }
+
+            getAiValue_LLA_ChamberPressure = GetAiValue($"{mod}.{LLA_AI_ChamberPressure}");
 
+            if (getAiValue_LLA_ChamberPressure > ATM_PRESSURE)
+            {
+                SetAiValue($"{mod}.{LLA_AI_ChamberPressure}", ATM_PRESSURE);
+            }
+            else if (getAiValue_LLA_ChamberPressure < 20)
+            {
+                SetAiValue($"{mod}.{LLA_AI_ChamberPressure}", 20);
+            }
+
+            getAiValue_LLB_ChamberPressure = GetAiValue($"{mod}.{LLB_AI_ChamberPressure}");
+
+            if (getAiValue_LLB_ChamberPressure > ATM_PRESSURE)
+            {
+                SetAiValue($"{mod}.{LLB_AI_ChamberPressure}", ATM_PRESSURE);
+            }
+            else if (getAiValue_LLB_ChamberPressure < 20)
+            {
+                SetAiValue($"{mod}.{LLB_AI_ChamberPressure}", 20);
+            }
+
+            getAiValue_TM_ChamberPressure = GetAiValue($"{mod}.{TM_AI_ChamberPressure}");
+
+            if (getAiValue_TM_ChamberPressure > ATM_PRESSURE)
+            {
+                SetAiValue($"{mod}.{TM_AI_ChamberPressure}", ATM_PRESSURE);
+            }
+            else if (getAiValue_TM_ChamberPressure < 20)
+            {
+                SetAiValue($"{mod}.{TM_AI_ChamberPressure}", 20);
+            }
+
+            // ATM switch
+            IO.DI[$"{mod}.DI_TM_ATM_Switch"].Value = GetAiValue($"{mod}.{TM_AI_ChamberPressure}") > ATM_THRESHOLD;
+
+            // VAC switch
+            IO.DI[$"{mod}.DI_TM_VAC_Switch"].Value = GetAiValue($"{mod}.{TM_AI_ChamberPressure}") < VAC_SW_PRESSURE;
+
+            // ATM switch
+            IO.DI[$"{mod}.DI_LLA_ATM_Switch"].Value = GetAiValue($"{mod}.{LLA_AI_ChamberPressure}") > ATM_THRESHOLD;
+
+            // VAC switch
+            IO.DI[$"{mod}.DI_LLA_VAC_Switch"].Value = GetAiValue($"{mod}.{LLA_AI_ChamberPressure}") < VAC_SW_PRESSURE;
+
+            // ATM switch
+            IO.DI[$"{mod}.DI_LLB_ATM_Switch"].Value = GetAiValue($"{mod}.{LLB_AI_ChamberPressure}") > ATM_THRESHOLD;
+
+            // VAC switch
+            IO.DI[$"{mod}.DI_LLB_VAC_Switch"].Value = GetAiValue($"{mod}.{LLB_AI_ChamberPressure}") < VAC_SW_PRESSURE;
+        }
 
         void SetAiValue(string name, float value)
         {

+ 6 - 2
Venus/Venus_Themes/UserControls/EFEMFrontView.xaml

@@ -8,10 +8,13 @@
              xmlns:cal="http://www.caliburn.org"     
              xmlns:ctrl="http://OpenSEMI.Ctrlib.com/presentation" x:Name="robotFrontView">
     <Grid x:Name="EFEM" HorizontalAlignment="Center" VerticalAlignment="Center">
+        
         <Grid.RowDefinitions>
             <RowDefinition Height="Auto"/>
             <RowDefinition />
         </Grid.RowDefinitions>
+        <Canvas x:Name="canvas"  PreviewDrop="Canvas_Drop" AllowDrop="True" Background="Transparent" Grid.RowSpan="2"/>
+
         <TextBlock Text="{Binding ElementName=robotFrontView,Path=Title}" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" VerticalAlignment="Center" HorizontalAlignment="Center">
             <TextBlock.Style>
                 <Style>
@@ -48,7 +51,7 @@
                     </Grid.ColumnDefinitions>
                     <TextBlock Text="Upper" FontFamily="Arial" FontSize="12" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,7,0,10"/>
                     <StackPanel Grid.Column="1" VerticalAlignment="Center" Margin="0,0,5,0">
-                        <ctrl:Slot ViewType="Front" Cursor="Hand" x:Name="EFEMUpper" DataContext="{ Binding ElementName=robotFrontView,Path=UnitData.WaferManager.Wafers[1]}" WaferStatus="{Binding WaferStatus}" SlotID="{Binding SlotID}" ModuleID="{Binding ModuleID}" SourceName="{Binding SourceName}" HorizontalAlignment="Center" VerticalAlignment="Top" SlotMouseButtonDown="Slot_SlotMouseButtonDown">
+                        <ctrl:Slot ViewType="Front" AllowDrop="True" Cursor="Hand" x:Name="EFEMUpper" DataContext="{ Binding ElementName=robotFrontView,Path=UnitData.WaferManager.Wafers[1]}" WaferStatus="{Binding WaferStatus}" SlotID="{Binding SlotID}" ModuleID="{Binding ModuleID}" SourceName="{Binding SourceName}" HorizontalAlignment="Center" VerticalAlignment="Top" SlotMouseButtonDown="Slot_SlotMouseButtonDown" WaferTransferStarted="Slot_WaferTransferStarted">
 
                         </ctrl:Slot>
                         <Rectangle Width="30" Height="3" Fill="{DynamicResource FOUP_PathBG}" Margin="0,2,0,0"  RadiusX="0.5" RadiusY="0.5">
@@ -59,7 +62,7 @@
                     </StackPanel>
                     <TextBlock Grid.Row="1" Text="Lower" FontFamily="Arial" FontSize="12" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,10,0,7"/>
                     <StackPanel Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" Margin="0,0,5,0">
-                        <ctrl:Slot ViewType="Front" Cursor="Hand" x:Name="EFEMLower" DataContext="{Binding UnitData.WaferManager.Wafers[0],RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" WaferStatus="{Binding WaferStatus}" SlotID="{Binding SlotID}" ModuleID="{Binding ModuleID}" SourceName="{Binding SourceName}" HorizontalAlignment="Center" VerticalAlignment="Top" SlotMouseButtonDown="Slot_SlotMouseButtonDown">
+                        <ctrl:Slot ViewType="Front" AllowDrop="True" Cursor="Hand" x:Name="EFEMLower" DataContext="{Binding UnitData.WaferManager.Wafers[0],RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" WaferStatus="{Binding WaferStatus}" SlotID="{Binding SlotID}" ModuleID="{Binding ModuleID}" SourceName="{Binding SourceName}" HorizontalAlignment="Center" VerticalAlignment="Top" WaferTransferStarted="Slot_WaferTransferStarted">
        
                         </ctrl:Slot>
                         <Rectangle Width="30" Height="3" Fill="{DynamicResource FOUP_PathBG}" Margin="0,2,0,0"  RadiusX="0.5" RadiusY="0.5">
@@ -72,6 +75,7 @@
                 </Grid>
             </Grid>
         </Border>
+
     </Grid>
 
 </UserControl>

+ 26 - 1
Venus/Venus_Themes/UserControls/EFEMFrontView.xaml.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -59,6 +60,30 @@ namespace Venus_Themes.UserControls
         {
             VenusGlobalEvents.OnSlotRightClickChanged(sender as Slot);
         }
-        #endregion  
+        private void Canvas_Drop(object sender, DragEventArgs e)
+        {
+            var data = e.Data.GetData(typeof(string));
+            Button btn = new Button();
+            btn.Content = data;
+            canvas.Children.Add(btn);
+
+            var point = e.GetPosition(canvas);
+
+            Canvas.SetLeft(btn, point.X);
+            Canvas.SetTop(btn, point.Y);
+
+            Debug.WriteLine("Canvas_Drop");
+        }
+        #endregion
+
+        private void EFEMUpper_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+        {
+            var test = sender as Slot;
+            DragDrop.DoDragDrop(test, "test", DragDropEffects.Copy);
+        }
+        private void Slot_WaferTransferStarted(object sender, DragDropEventArgs e)
+        {
+
+        }
     }
 }

+ 1 - 1
Venus/Venus_Themes/UserControls/FOUPFrontView.xaml

@@ -57,7 +57,7 @@
                                                     <DropShadowEffect Direction="270" BlurRadius="0" ShadowDepth="1"/>
                                                 </Rectangle.Effect>
                                             </Rectangle>
-                                            <controls:Slot ViewType="Front"  WaferStatus="{Binding WaferStatus}" SlotID="{Binding SlotID}" ModuleID="{Binding ModuleID}" SourceName="{Binding SourceName}" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,4,0,0" SlotMouseButtonDown="Slot_SlotMouseButtonDown">
+                                            <controls:Slot ViewType="Front"  WaferStatus="{Binding WaferStatus}" SlotID="{Binding SlotID}" ModuleID="{Binding ModuleID}" SourceName="{Binding SourceName}" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,4,0,0" SlotMouseButtonDown="Slot_SlotMouseButtonDown" WaferTransferStarted="Slot_WaferTransferStarted">
                                                 <!--<i:Interaction.Triggers>
                                                     <i:EventTrigger EventName="SlotMouseButtonDown">
                                                         <cal:ActionMessage MethodName="OnMouseUp">

+ 5 - 0
Venus/Venus_Themes/UserControls/FOUPFrontView.xaml.cs

@@ -39,5 +39,10 @@ namespace Venus_Themes.UserControls
         {
             VenusGlobalEvents.OnSlotRightClickChanged(sender as Slot);
         }
+
+        private void Slot_WaferTransferStarted(object sender, DragDropEventArgs e)
+        {
+
+        }
     }
 }