Browse Source

Simulator LP3 Update

Intern01 1 year ago
parent
commit
60e9a04892

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

@@ -372,6 +372,7 @@ namespace Venus_MainPages.ViewModels
             EFEMModules.Add(EFEMModule.LLB);
             EFEMModules.Add(EFEMModule.LP1);
             EFEMModules.Add(EFEMModule.LP2);
+            EFEMModules.Add(EFEMModule.LP3);
             EFEMModules.Add(EFEMModule.Aligner1);
             OnModuleChange("Pick");
             OnModuleChange("Place");

+ 1 - 1
Venus/Venus_MainPages/Views/OperationOverView.xaml

@@ -342,7 +342,7 @@
                 <local:WaferAssociationUnit   WAInfo="{Binding LP2WaferAssociation}"/>
             </TabPanel>
             <TabPanel Canvas.Left="900"  Canvas.Top="140" Visibility="{Binding ElementName=JobRadioButton3,Path=IsChecked,Converter={StaticResource boolToVisibility2}}" >
-                <local:WaferAssociationUnit                    WAInfo="{Binding LP1WaferAssociation}"/>
+                <local:WaferAssociationUnit                    WAInfo="{Binding LP3WaferAssociation}"/>
             </TabPanel>
 
 

+ 6 - 0
Venus/Venus_RT/Backends/FSM.xaml

@@ -60,6 +60,12 @@
         <TextBlock Grid.Row="3" Grid.Column="3" Text="{Binding LP2LastMsg}" />
         <TextBlock Grid.Row="3" Grid.Column="5" Text="{Binding LP2State}" />
         
+        <!--LP3-->
+        <TextBlock Grid.Row="3" Grid.Column="0" Text="LP3" />
+        <TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding LP3PrevState}" />
+        <TextBlock Grid.Row="3" Grid.Column="3" Text="{Binding LP3LastMsg}" />
+        <TextBlock Grid.Row="3" Grid.Column="5" Text="{Binding LP3State}" />
+        
         <!--PMA-->
         <TextBlock Grid.Row="4" Grid.Column="0" Text="PMA" />
         <TextBlock Grid.Row="4" Grid.Column="1" Text="{Binding PMAPrevState}"/>

+ 10 - 1
Venus/Venus_RT/Backends/FSM.xaml.cs

@@ -209,7 +209,7 @@ namespace Venus_RT.Backends
         [Subscription("LP1.FsmLastMessage")]
         public string LP1LastMsg { get; set; }
 
-        //LP1
+        //LP2
         [Subscription("LP2.FsmPrevState")]
         public string LP2PrevState { get; set; }
 
@@ -219,6 +219,15 @@ namespace Venus_RT.Backends
         [Subscription("LP2.FsmLastMessage")]
         public string LP2LastMsg { get; set; }
 
+        //LP3
+        [Subscription("LP3.FsmPrevState")]
+        public string LP3PrevState { get; set; }
+
+        [Subscription("LP3.FsmState")]
+        public string LP3State { get; set; }
+
+        [Subscription("LP3.FsmLastMessage")]
+        public string LP3LastMsg { get; set; }
         // PMA
         [Subscription("PMA.FsmPrevState")]
         public string PMAPrevState { get; set; }

+ 3 - 0
Venus/Venus_RT/Config/ClusterGemModel.xml

@@ -90,6 +90,9 @@
 		<SVID id="20001" valueType="Ascii" logicalName="LP2.SlotMap" value="" units="" description=" " eventTrigger=" " />
 		<SVID id="20002" valueType="U4" logicalName="LP2.CassettePresent" value="" units="" description=" " eventTrigger=" " />
 		<SVID id="20003" valueType="U4" logicalName="LP2.IsWaferProtrude" value="" units="" description=" " eventTrigger=" " />
+    <SVID id="30001" valueType="Ascii" logicalName="LP3.SlotMap" value="" units="" description=" " eventTrigger=" " />
+    <SVID id="30002" valueType="U4" logicalName="LP3.CassettePresent" value="" units="" description=" " eventTrigger=" " />
+    <SVID id="30003" valueType="U4" logicalName="LP3.IsWaferProtrude" value="" units="" description=" " eventTrigger=" " />
 		<SVID id="430001" valueType="Ascii" logicalName="PMA.IoPressureMeter.PressureMeterChamber.Feedback" value="" units="" description=" " eventTrigger=" " />
 		<SVID id="430002" valueType="Ascii" logicalName="PMA.IoThrottleValve.ThrottleValve.TVPosition" value="" units="" description=" " eventTrigger=" " />
 		<SVID id="430003" valueType="Ascii" logicalName="PMA.IoThrottleValve.ThrottleValve.TVPositionSetPoint" value="" units="" description=" " eventTrigger=" " />

+ 1 - 0
Venus/Venus_RT/Devices/EFEM/EfemMessage.cs

@@ -326,6 +326,7 @@ namespace Venus_RT.Devices.YASKAWA
             [ModuleName.LLB]      = "LLLB",
             [ModuleName.LP1]      = "P1",
             [ModuleName.LP2]      = "P2",
+            [ModuleName.LP3]      = "P3",
             [ModuleName.PMA]      = "LLA",
             [ModuleName.PMB]      = "LLB",
             [ModuleName.Aligner1] = "ALIGN3",

+ 46 - 0
Venus/Venus_RT/Devices/EFEM/Loadport.cs

@@ -887,85 +887,115 @@ namespace Venus_RT.Devices.EFEM
             private const string Port2TagDataWrite = "Port2TagDataWrite";
             private const string Port2WriteTagDataFailed = "Port2WriteTagDataFailed";
 
+            private const string Port3LoadComplete = "Port3LoadComplete";
+            private const string Port3LoadFailed = "Port3LoadFailed";
+            private const string Port3UnloadComplete = "Port3UnloadComplete";
+            private const string Port3UnloadFailed = "Port3UnloadFailed";
+
+            private const string Port3Clamped = "Port3Clamped";
+            private const string Port3Unclamped = "Port3Unclamped";
+            private const string Port3IDRead = "Port3IDRead";
+            private const string Port3ReadIDFailed = "Port3ReadIDFailed";
+            private const string Port3IDWrite = "Port3IDWrite";
+            private const string Port3WriteIDFailed = "Port3WriteIDFailed";
+            private const string Port3TagDataRead = "Port3TagDataRead";
+            private const string Port3ReadTagDataFailed = "Port3ReadTagDataFailed";
+            private const string Port3TagDataWrite = "Port3TagDataWrite";
+            private const string Port3WriteTagDataFailed = "Port3WriteTagDataFailed";
             private Dictionary<ModuleName, string> PortLoadComplete = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1LoadComplete},
             {ModuleName.LP2, Port2LoadComplete},
+            {ModuleName.LP3, Port3LoadComplete},
         };
 
             private Dictionary<ModuleName, string> PortLoadFailed = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1LoadFailed},
             {ModuleName.LP2, Port2LoadFailed},
+            {ModuleName.LP3, Port3LoadFailed},
         };
 
             private Dictionary<ModuleName, string> PortUnloadComplete = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1UnloadComplete},
             {ModuleName.LP2, Port2UnloadComplete},
+            {ModuleName.LP3, Port3UnloadComplete},
         };
 
             private Dictionary<ModuleName, string> PortUnloadFailed = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1UnloadFailed},
             {ModuleName.LP2, Port2UnloadFailed},
+            {ModuleName.LP3, Port3UnloadFailed},
         };
             private Dictionary<ModuleName, string> PortClamped = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1Clamped},
             {ModuleName.LP2, Port2Clamped},
+            {ModuleName.LP3, Port3Clamped},
         };
             private Dictionary<ModuleName, string> PortUnclamped = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1Unclamped},
             {ModuleName.LP2, Port2Unclamped},
+            {ModuleName.LP3, Port3Unclamped},
         };
             private Dictionary<ModuleName, string> PortIDRead = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1IDRead},
             {ModuleName.LP2, Port2IDRead},
+            {ModuleName.LP3, Port3IDRead},
         };
             private Dictionary<ModuleName, string> PortReadIDFailed = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1ReadIDFailed},
             {ModuleName.LP2, Port2ReadIDFailed},
+            {ModuleName.LP3, Port3ReadIDFailed},
         };
             private Dictionary<ModuleName, string> PortIDWrite = new Dictionary<ModuleName, string>()
             {
                 {ModuleName.LP1, Port1IDWrite},
                 {ModuleName.LP2, Port2IDWrite},
+                {ModuleName.LP3, Port3IDWrite},
             };
             private Dictionary<ModuleName, string> PortWriteIDFailed = new Dictionary<ModuleName, string>()
             {
                 {ModuleName.LP1, Port1WriteIDFailed},
                 {ModuleName.LP2, Port2WriteIDFailed},
+                {ModuleName.LP3, Port3WriteIDFailed},
             };
 
             private Dictionary<ModuleName, string> PortTagDataRead = new Dictionary<ModuleName, string>()
             {
                 {ModuleName.LP1, Port1TagDataRead},
                 {ModuleName.LP2, Port2TagDataRead},
+                 {ModuleName.LP3, Port3TagDataRead},
             };
             private Dictionary<ModuleName, string> PortReadTagDataFailed = new Dictionary<ModuleName, string>()
             {
                 {ModuleName.LP1, Port1ReadTagDataFailed},
                 {ModuleName.LP2, Port2ReadTagDataFailed},
+                {ModuleName.LP3, Port3ReadTagDataFailed},
             };
             private Dictionary<ModuleName, string> PortTagDataWrite = new Dictionary<ModuleName, string>()
             {
                 {ModuleName.LP1, Port1TagDataWrite},
                 {ModuleName.LP2, Port2TagDataWrite},
+                {ModuleName.LP3, Port3TagDataWrite},
             };
             private Dictionary<ModuleName, string> PortWriteTagDataFailed = new Dictionary<ModuleName, string>()
             {
                 {ModuleName.LP1, Port1WriteTagDataFailed},
                 {ModuleName.LP2, Port2WriteTagDataFailed},
+                {ModuleName.LP3, Port3WriteTagDataFailed},
             };
 
             private Dictionary<ModuleName, string> PortId = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, "1"},
             {ModuleName.LP2, "2"},
+            {ModuleName.LP3, "3"},
         };
 
             public LoadPortFACallback()
@@ -1001,6 +1031,22 @@ namespace Venus_RT.Devices.EFEM
                 EV.Subscribe(new EventItem("Event", Port2ReadTagDataFailed, Port2ReadTagDataFailed));
                 EV.Subscribe(new EventItem("Event", Port2TagDataWrite, Port2TagDataWrite));
                 EV.Subscribe(new EventItem("Event", Port2WriteTagDataFailed, Port2WriteTagDataFailed));
+
+                EV.Subscribe(new EventItem("Event", Port3LoadComplete, Port3LoadComplete));
+                EV.Subscribe(new EventItem("Event", Port3LoadFailed, Port3LoadFailed));
+                EV.Subscribe(new EventItem("Event", Port3UnloadComplete, Port3UnloadComplete));
+                EV.Subscribe(new EventItem("Event", Port3UnloadFailed, Port3UnloadFailed));
+
+                EV.Subscribe(new EventItem("Event", Port3Clamped, Port3Clamped));
+                EV.Subscribe(new EventItem("Event", Port3Unclamped, Port3Unclamped));
+                EV.Subscribe(new EventItem("Event", Port3IDRead, Port3IDRead));
+                EV.Subscribe(new EventItem("Event", Port3ReadIDFailed, Port3ReadIDFailed));
+                EV.Subscribe(new EventItem("Event", Port3IDWrite, Port3IDWrite));
+                EV.Subscribe(new EventItem("Event", Port3WriteIDFailed, Port3WriteIDFailed));
+                EV.Subscribe(new EventItem("Event", Port3TagDataRead, Port3TagDataRead));
+                EV.Subscribe(new EventItem("Event", Port3ReadTagDataFailed, Port3ReadTagDataFailed));
+                EV.Subscribe(new EventItem("Event", Port3TagDataWrite, Port3TagDataWrite));
+                EV.Subscribe(new EventItem("Event", Port3WriteTagDataFailed, Port3WriteTagDataFailed));
             }
 
             public void LoadComplete(Loadport lp)

+ 1 - 0
Venus/Venus_RT/FAs/FaManager.cs

@@ -40,6 +40,7 @@ namespace Venus_RT.HostWrapper
         {
             {"1", ModuleName.LP1},
             {"2", ModuleName.LP2},
+            {"3", ModuleName.LP3},
         };
 
         public void Initialize()

+ 36 - 0
Venus/Venus_RT/Modules/Autotransfer_LP_FA.cs

@@ -57,69 +57,93 @@ namespace Venus_RT.Modules
         private const string Port2SequenceSelectFailed = "Port2SequenceSelectFailed";
         private const string Port2JobWaferStart = "Port2JobWaferStart";
         private const string Port2JobWaferEnd = "Port2JobWaferEnd";
+
+        private const string Port3JobStarted = "Port3JobStarted";
+        private const string Port3JobStopped = "Port3JobStopped";
+        private const string Port3JobPaused = "Port3JobPaused";
+        private const string Port3JobResumed = "Port3JobResumed";
+        private const string Port3JobAborted = "Port3JobAborted";
+        private const string Port3JobFinished = "Port3JobFinished";
+        private const string Port3JobFailed = "Port3JobFailed";
+        private const string Port3SequenceSelected = "Port3SequenceSelected";
+        private const string Port3SequenceSelectFailed = "Port3SequenceSelectFailed";
+        private const string Port3JobWaferStart = "Port3JobWaferStart";
+        private const string Port3JobWaferEnd = "Port3JobWaferEnd";
         private Dictionary<ModuleName, string> PortJobWaferStart = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobWaferStart},
             {ModuleName.LP2, Port2JobWaferStart},
+            {ModuleName.LP3, Port3JobWaferStart},
         };
 
         private Dictionary<ModuleName, string> PortJobWaferEnd = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobWaferEnd},
             {ModuleName.LP2, Port2JobWaferEnd},
+            {ModuleName.LP3, Port3JobWaferEnd},
         };
 
         private Dictionary<ModuleName, string> PortJobStarted = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobStarted},
             {ModuleName.LP2, Port2JobStarted},
+            {ModuleName.LP3, Port3JobStarted},
         };
 
         private Dictionary<ModuleName, string> PortJobStopped = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobStopped},
             {ModuleName.LP2, Port2JobStopped},
+             {ModuleName.LP3, Port3JobStopped},
         };
         private Dictionary<ModuleName, string> PortJobPaused = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobPaused},
             {ModuleName.LP2, Port2JobPaused},
+            {ModuleName.LP3, Port3JobPaused},
         };
         private Dictionary<ModuleName, string> PortJobResumed = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobResumed},
             {ModuleName.LP2, Port2JobResumed},
+            {ModuleName.LP3, Port3JobResumed},
         };
         private Dictionary<ModuleName, string> PortJobAborted = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobAborted},
             {ModuleName.LP2, Port2JobAborted},
+            {ModuleName.LP3, Port3JobAborted},
         };
         private Dictionary<ModuleName, string> PortJobFinished = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobFinished},
             {ModuleName.LP2, Port2JobFinished},
+            {ModuleName.LP3, Port3JobFinished},
         };
         private Dictionary<ModuleName, string> PortJobFailed = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1JobFailed},
             {ModuleName.LP2, Port2JobFailed},
+            {ModuleName.LP3, Port3JobFailed},
         };
         private Dictionary<ModuleName, string> PortSequenceSelected = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1SequenceSelected},
             {ModuleName.LP2, Port2SequenceSelected},
+            {ModuleName.LP3, Port3SequenceSelected},
         };
         private Dictionary<ModuleName, string> PortSequenceSelectFailed = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, Port1SequenceSelectFailed},
             {ModuleName.LP2, Port2SequenceSelectFailed},
+            {ModuleName.LP3, Port3SequenceSelectFailed},
         };
 
         private Dictionary<ModuleName, string> PortId = new Dictionary<ModuleName, string>()
         {
             {ModuleName.LP1, "1"},
             {ModuleName.LP2, "2"},
+            {ModuleName.LP3, "3"},
         };
         public SchedulerFACallback()
         {
@@ -146,6 +170,18 @@ namespace Venus_RT.Modules
             FaEvent.AddFaEvent(new PostFAItem("Event", Port2SequenceSelectFailed, Port2SequenceSelectFailed));
             FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobWaferStart, Port2JobWaferStart));
             FaEvent.AddFaEvent(new PostFAItem("Event", Port2JobWaferEnd, Port2JobWaferEnd));
+
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobStarted, Port3JobStarted));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobStopped, Port3JobStopped));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobPaused, Port3JobPaused));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobResumed, Port3JobResumed));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobAborted, Port3JobAborted));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobFinished, Port3JobFinished));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobFailed, Port3JobFailed));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3SequenceSelected, Port3SequenceSelected));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3SequenceSelectFailed, Port3SequenceSelectFailed));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobWaferStart, Port3JobWaferStart));
+            FaEvent.AddFaEvent(new PostFAItem("Event", Port3JobWaferEnd, Port3JobWaferEnd));
         }
         public void JobCreated(ControlJobInfo cj, ProcessJobInfo pj)
         {

+ 57 - 4
Venus/Venus_Simulator/Devices/EfemSimulator.cs

@@ -40,7 +40,7 @@ namespace Venus_Simulator.Devices
 
         public bool _isProtrude1 { get; set; }
         public bool _isProtrude2 { get; set; }
-
+        public bool _isProtrude3 { get; set; }
         public EfemSimulatorServer() : base(13001, -1, "\r", ' ')
         {
             for (int i = 0; i < _slotMap.Length; i++)
@@ -112,7 +112,14 @@ namespace Venus_Simulator.Devices
                 SendLP2Data();
             }
         }
-        
+        internal void SetProtrude3(bool protrude)
+        {
+            if (protrude != _isProtrude3)
+            {
+                _isProtrude3 = protrude;
+                SendLP3Data();
+            }
+        }
 
         private async Task OnWork(string strACK)
         {
@@ -142,13 +149,14 @@ namespace Venus_Simulator.Devices
                 strINF += "/1111111111111110001111111;";
                 break;
             case EfemOperation.Home:
-                string s1 = "EVT:SIGSTAT/P1/00000381/00000000;\rEVT:SIGSTAT/P2/00000381/00000000;\rEVT:SIGSTAT/System/0000FFF7/00000004;\r";
+                string s1 = "EVT:SIGSTAT/P1/00000381/00000000;\rEVT:SIGSTAT/P2/00000381/00000000;\rEVT:SIGSTAT/P3/00000381/00000000;\rEVT:SIGSTAT/System/0000FFF7/00000004;\r";
                 strINF = s1 + strACK.Replace(ACK, "INF");
                 SendSystemData();
                 SendLP1Data();
                 SendLP2Data();
+                SendLP3Data();
                 OnWriteMessage(strACK.Replace(ACK, "INF"));
-                    return;
+                return;
             case EfemOperation.Map:
             case EfemOperation.Load:
                 Match m2 = Regex.Match(strACK, SFOUP);
@@ -192,7 +200,13 @@ namespace Venus_Simulator.Devices
             OnWriteMessage(msg);
         }
 
+        private void SendLP3Data()
+        {
+            uint data = GetLP3Data1();
 
+            string msg = $"EVT:SIGSTAT/P3/{data:X8}/00000000;";
+            OnWriteMessage(msg);
+        }
         private void SendSystemData()
         {
             uint data = GetSystemData1();
@@ -250,7 +264,17 @@ namespace Venus_Simulator.Devices
             _isPlaced = false;
             SendLP2Data();
         }
+        public void PlaceCarrier3()
+        {
+            _isPlaced = true;
+            SendLP3Data();
+        }
 
+        public void RemoveCarrier3()
+        {
+            _isPlaced = false;
+            SendLP3Data();
+        }
         public void ClearWafer()
         {
             for (int i = 0; i < _slotMap.Length; i++)
@@ -355,7 +379,36 @@ namespace Venus_Simulator.Devices
 
             return data1;
         }
+        private uint GetLP3Data1()
+        {
+            uint data1 = 0x0u;
+
+            data1 |= (_isPlaced ? 0x00000001u : 0x0);
+            data1 |= (!_isPlaced ? 0x00000002u : 0x0);
+
+            switch (WaferSize)
+            {
+                case 3:
+                    //data1 |= 0x00000040u;
+                    data1 |= 0x00000080u;
+                    data1 |= 0x00000100u;
+                    break;
+                case 4:
+                    data1 |= 0x00000040u;
+                    //data1 |= 0x00000080u;
+                    data1 |= 0x00000100u;
+                    break;
+                case 6:
+                    data1 |= 0x00000040u;
+                    data1 |= 0x00000080u;
+                    //data1 |= 0x00000100u;
+                    break;
+            }
+
+            data1 |= (!_isProtrude3) ? 0x00000200u : 0x0;
 
+            return data1;
+        }
 
         private uint GetSystemData1()
         {

+ 8 - 5
Venus/Venus_Simulator/Views/Simu_EfemView.xaml

@@ -19,10 +19,11 @@
         <Canvas  Grid.Row="1"  Width="1200">
             <StackPanel Grid.Row="1" Orientation="Horizontal" Width="1200">
                 <Button Content="Clear Log" Width="100" Height="35"   Command="{Binding ClearLogCommand}"></Button>
-                <CheckBox Content="Cassette Door Open" IsChecked="{Binding DoorOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,10,0,4" Width="150" Height="35" />
+                <CheckBox Content="Cassette Door Open" IsChecked="{Binding DoorOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,10,0,4" Width="180" Height="35" />
                 <CheckBox Content="Maintain" IsChecked="{Binding Maintain, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,10,0,4" Width="150" Height="35" />
                 <CheckBox Content="Protrude1" IsChecked="{Binding Protrude1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,10,0,4" Width="150" Height="35" />
                 <CheckBox Content="Protrude2" IsChecked="{Binding Protrude2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,10,0,4" Width="150" Height="35" />
+                <CheckBox Content="Protrude3" IsChecked="{Binding Protrude3, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="10,10,0,4" Width="150" Height="35" />
             </StackPanel>
 
             <StackPanel Grid.Row="1" Orientation="Horizontal" Width="1300" Canvas.Top="50">
@@ -30,14 +31,16 @@
                 <Button Content="Remove1" Margin="20,6,0,0" Width="100" Height="35"   Command="{Binding Remove1Command}"  ></Button>
                 <Button Content="Place2" Margin="20,6,0,0" Width="100" Height="35"   Command="{Binding Place2Command}"  ></Button>
                 <Button Content="Remove2" Margin="20,6,0,0" Width="100" Height="35"   Command="{Binding Remove2Command}"  ></Button>
-                <ComboBox Width="100" Height="26" ItemsSource="{Binding WaferSizeItems}" SelectedItem="{Binding SelectedWaferSize}" ></ComboBox>
-                <Label Content="{Binding WaferMap}" Width="300"  Height="30"  HorizontalContentAlignment="Center"  Background="LightBlue" BorderThickness="2" Margin="10,60"/>
+                <Button Content="Place3" Margin="20,6,0,0" Width="100" Height="35"   Command="{Binding Place3Command}"  ></Button>
+                <Button Content="Remove3" Margin="20,6,0,0" Width="100" Height="35"   Command="{Binding Remove3Command}"  ></Button>
                 <Button Content="SetAll" Width="100" Height="35"   Command="{Binding SetAllCommand}"  Margin="20,6,0,0"></Button>
                 <Button Content="Random" Width="100" Height="35"   Command="{Binding RandomCommand}" Margin="20,6,0,0"></Button>
                 <Button Content="Clear" Width="100" Height="35"   Command="{Binding ClearCommand}"  Margin="20,6,0,0"></Button>
-
+            </StackPanel >
+            <StackPanel Grid.Row="1" Orientation="Horizontal" Width="500" Canvas.Top="49" HorizontalAlignment="Center" VerticalAlignment="Top" Canvas.Left="350" >
+                <ComboBox Width="100" Height="26" ItemsSource="{Binding WaferSizeItems}" SelectedItem="{Binding SelectedWaferSize}" ></ComboBox>
+                <Label Content="{Binding WaferMap}" Width="300"  Height="30"  HorizontalContentAlignment="Center"  Background="LightBlue" BorderThickness="2" Margin="10,60"/>
             </StackPanel>
-
         </Canvas>
 
         <DataGrid Grid.Row="2" FontSize="16" AutoGenerateColumns="False" CanUserAddRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding TransactionLogItems}"

+ 25 - 2
Venus/Venus_Simulator/Views/Simu_EfemView.xaml.cs

@@ -99,7 +99,19 @@ namespace Venus_Simulator.Views
                 _sim.SetProtrude2(_Protrude2);
             }
         }
-
+        private bool _Protrude3;
+        public bool Protrude3
+        {
+            get
+            {
+                return _Protrude3;
+            }
+            set
+            {
+                _Protrude3 = value;
+                _sim.SetProtrude3(_Protrude3);
+            }
+        }
         private EfemSimulatorServer _sim;
 
         public ICommand Place1Command { get; set; }
@@ -107,6 +119,8 @@ namespace Venus_Simulator.Views
         public ICommand Place2Command { get; set; }
         public ICommand Remove2Command { get; set; }
 
+        public ICommand Place3Command { get; set; }
+        public ICommand Remove3Command { get; set; }
         public ICommand ClearCommand { get; set; }
         public ICommand SetAllCommand { get; set; }
         public ICommand RandomCommand { get; set; }
@@ -117,7 +131,8 @@ namespace Venus_Simulator.Views
             Remove1Command = new DelegateCommand<string>(Remove1);
             Place2Command = new DelegateCommand<string>(Place2);
             Remove2Command = new DelegateCommand<string>(Remove2);
-
+            Place3Command = new DelegateCommand<string>(Place3);
+            Remove3Command = new DelegateCommand<string>(Remove3);
             ClearCommand = new DelegateCommand<string>(Clear);
             SetAllCommand = new DelegateCommand<string>(SetAll);
             RandomCommand = new DelegateCommand<string>(RandomGenerateWafer);
@@ -161,7 +176,15 @@ namespace Venus_Simulator.Views
         {
             _sim.PlaceCarrier2();
         }
+        private void Remove3(string obj)
+        {
+            _sim.RemoveCarrier3();
+        }
 
+        private void Place3(string obj)
+        {
+            _sim.PlaceCarrier3();
+        }
         private List<string> _WaferSizeItems = new List<string>() { "Small", "Mid", "Big"};
         public List<string> WaferSizeItems
         {