Bläddra i källkod

kepler2200/Kepler2300 添加FDC 功能

lixiang 11 månader sedan
förälder
incheckning
17ae6db63c

+ 5 - 5
Venus/Framework/UICore/DeviceControl/AITSignalTower.xaml

@@ -27,7 +27,7 @@
                     <Setter Property="Image.Opacity"  Value="0.2"/>
                     <Style.Triggers>
                         <DataTrigger Binding="{Binding ElementName=signalTower,Path=IsRedLightOn}"  Value="True">
-                            <Setter Property="Image.Opacity"  Value="0.7"/>
+                            <Setter Property="Image.Opacity"  Value="0.8"/>
                         </DataTrigger>
                     </Style.Triggers>
                 </Style>
@@ -43,7 +43,7 @@
             </Image.Effect>
             <Image.Style>
                 <Style>
-                    <Setter Property="Image.Opacity"  Value="0.3"/>
+                    <Setter Property="Image.Opacity"  Value="0.35"/>
                     <Style.Triggers>
                         <DataTrigger Binding="{Binding ElementName=signalTower,Path=IsYellowLightOn}"  Value="True">
                             <Setter Property="Image.Opacity"  Value="1"/>
@@ -62,7 +62,7 @@
             </Image.Effect>
             <Image.Style>
                 <Style>
-                    <Setter Property="Image.Opacity"  Value="0.3"/>
+                    <Setter Property="Image.Opacity"  Value="0.35"/>
                     <Style.Triggers>
                         <DataTrigger Binding="{Binding ElementName=signalTower,Path=IsGreenLightOn}"  Value="True">
                             <Setter Property="Image.Opacity"  Value="1"/>
@@ -81,7 +81,7 @@
             </Image.Effect>
             <Image.Style>
                 <Style>
-                    <Setter Property="Image.Opacity"  Value="0.3"/>
+                    <Setter Property="Image.Opacity"  Value="0.35"/>
                     <Style.Triggers>
                         <DataTrigger Binding="{Binding ElementName=signalTower,Path=IsBlueLightOn}"  Value="True">
                             <Setter Property="Image.Opacity"  Value="1"/>
@@ -100,7 +100,7 @@
             </Image.Effect>
             <Image.Style>
                 <Style>
-                    <Setter Property="Image.Opacity"  Value="0.3"/>
+                    <Setter Property="Image.Opacity"  Value="0.35"/>
                     <Style.Triggers>
                         <DataTrigger Binding="{Binding ElementName=signalTower,Path=IsBuzzerOn}"  Value="True">
                             <Setter Property="Image.Opacity"  Value="1"/>

+ 41 - 42
Venus/Venus_RT/Modules/PMs/Fdc.cs

@@ -1,12 +1,7 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Diagnostics;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.Xml;
 using Aitex.Core.RT.DataCenter;
-using Aitex.Core.RT.Log;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.Util;
 using MECF.Framework.Common.CommonData;
@@ -34,7 +29,7 @@ namespace Venus_RT.Modules.PMs
 
         private int _delayTime;
 
-        private Dictionary<string, string> _setpointDataMap = new Dictionary<string, string>();
+        //private Dictionary<string, string> _setpointDataMap = new Dictionary<string, string>();
 
         public Fdc(string module)
         {
@@ -43,15 +38,15 @@ namespace Venus_RT.Modules.PMs
             _module = module;
         }
 
-        public void Reset()
+        public void Reset(List<string> names)
         {
             _lstItems.Clear();
-            _setpointDataMap.Clear();
+            //_setpointDataMap.Clear();
 
 
-            string groupName = SC.GetStringValue("System.FDC.DataGroupName");
-            if (string.IsNullOrEmpty(groupName))
-                groupName = "Process";
+            //string groupName = SC.GetStringValue("System.FDC.DataGroupName");
+            //if (string.IsNullOrEmpty(groupName))
+            //    groupName = "Process";
 
             int interval = SC.GetValue<int>("System.FDC.SampleInterval");
             if (interval < 50)
@@ -61,20 +56,20 @@ namespace Venus_RT.Modules.PMs
             if (_delayTime < 0)
                 _delayTime = 10;
 
-            var content = TypedConfigManager.Instance.GetTypedConfigContent("DataGroup", "");
+            //var content = TypedConfigManager.Instance.GetTypedConfigContent("DataGroup", "");
 
-            XmlDocument xmlContent = new XmlDocument();
-            xmlContent.LoadXml(content);
+            //XmlDocument xmlContent = new XmlDocument();
+            //xmlContent.LoadXml(content);
 
-            var items = xmlContent.SelectNodes($"DataGroupConfig/DataGroup[@name='{groupName}']/DataItem");
+            //var items = xmlContent.SelectNodes($"DataGroupConfig/DataGroup[@name='{groupName}']/DataItem");
 
-            foreach (var item in items)
+            foreach (var item in names)
             {
-                var node = item as XmlElement;
+                //var node = item as XmlElement;
 
-                string name = node.GetAttribute("name");
+                string name = item;
 
-                if (!string.IsNullOrEmpty(name) && name.StartsWith($"{_module}.") && (_lstItems.FirstOrDefault(x => x.Name == name) == null))
+                if (!string.IsNullOrEmpty(name) && name.StartsWith($"{_module}."))
                 {
                     var dataType = Singleton<DataManager>.Instance.GetDataType(name);
                     if (dataType == typeof(double) || dataType == typeof(float) ||
@@ -91,45 +86,49 @@ namespace Venus_RT.Modules.PMs
 
 
 
-            var fdcMap = xmlContent.SelectNodes($"DataGroupConfig/DataGroup[@name='Fdc']/DataItem");
+            //var fdcMap = xmlContent.SelectNodes($"DataGroupConfig/DataGroup[@name='Fdc']/DataItem");
 
-            foreach (var item in fdcMap)
-            {
-                var node = item as XmlElement;
+            //foreach (var item in fdcMap)
+            //{
+            //    var node = item as XmlElement;
 
-                string name = node.GetAttribute("name");
+            //    string name = node.GetAttribute("name");
 
-                if (!string.IsNullOrEmpty(name) && name.StartsWith($"{_module}.") && (_lstItems.FirstOrDefault(x => x.Name == name) != null))
-                {
-                    string controlName = node.GetAttribute("control_name");
+            //    if (!string.IsNullOrEmpty(name) && name.StartsWith($"{_module}.") && (_lstItems.FirstOrDefault(x => x.Name == name) != null))
+            //    {
+            //        string controlName = node.GetAttribute("control_name");
 
-                    if (!string.IsNullOrEmpty(controlName))
-                        _setpointDataMap[name] = controlName;
-                }
-            }
+            //        if (!string.IsNullOrEmpty(controlName))
+            //            _setpointDataMap[name] = controlName;
+            //    }
+            //}
 
 
             _monitorThread.ChangeInterval(interval);
         }
 
         //pair: controlname - setpoint value
-        public void Start(Dictionary<string, string> setpointControlData)
+        public void Start(params float[] floats)
         {
             ClearPreviousData();
 
-            foreach (var fdcDataItem in _lstItems)
+            for (int i = 0; i < floats.Length; i++)
             {
-                if (!_setpointDataMap.ContainsKey(fdcDataItem.Name))
-                    continue;
+                _lstItems[i].SetPoint = floats[i];
+            }
+            //foreach (var fdcDataItem in _lstItems)
+            //{
+            //    if (!_setpointDataMap.ContainsKey(fdcDataItem.Name))
+            //        continue;
 
-                if (!setpointControlData.ContainsKey(_setpointDataMap[fdcDataItem.Name]))
-                    continue;
+            //    if (!setpointControlData.ContainsKey(_setpointDataMap[fdcDataItem.Name]))
+            //        continue;
 
-                if (!float.TryParse(setpointControlData[_setpointDataMap[fdcDataItem.Name]], out float floatValue))
-                    continue;
+            //    if (!float.TryParse(setpointControlData[_setpointDataMap[fdcDataItem.Name]], out float floatValue))
+            //        continue;
 
-                fdcDataItem.SetPoint = floatValue;
-            }
+            //    fdcDataItem.SetPoint = floatValue;
+            //}
 
             _delaytimer.Restart();
 

+ 58 - 9
Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs

@@ -297,19 +297,47 @@ namespace Venus_RT.Modules.PMs
             //}
             _faCallback.RecipeStart(_chamber.Module.ToString(), recipeName);
             WaferManager.Instance.UpdateWaferProcessStatus(Module, 0, EnumWaferProcessStatus.InProcess);
-            _fdc.Reset();
+            switch (_jetChamber)
+            {
+                case JetChamber.Kepler2200A:
+                case JetChamber.Kepler2200B:             
+                    List<string> kepler2200Names = new List<string>();
+                    kepler2200Names.Add($"{Module}.MfcGas1.FeedBack");
+                    kepler2200Names.Add($"{Module}.MfcGas2.FeedBack");
+                    kepler2200Names.Add($"{Module}.MfcGas3.FeedBack");
+                    kepler2200Names.Add($"{Module}.MfcGas4.FeedBack");
+                    kepler2200Names.Add($"{Module}.MfcGas5.FeedBack");
+                    kepler2200Names.Add($"{Module}.MfcGas6.FeedBack");
+                    kepler2200Names.Add($"{Module}.Rf.ForwardPower");                
+                    _fdc.Reset(kepler2200Names);
+                    break;
+
+                case JetChamber.Kepler2300:
+                    List<string> kepler2300Names = new List<string>();
+                    kepler2300Names.Add($"{Module}.MfcGas1.FeedBack");
+                    kepler2300Names.Add($"{Module}.MfcGas2.FeedBack");
+                    kepler2300Names.Add($"{Module}.MfcGas3.FeedBack");
+                    kepler2300Names.Add($"{Module}.MfcGas4.FeedBack");
+                    kepler2300Names.Add($"{Module}.MfcGas5.FeedBack");
+                    kepler2300Names.Add($"{Module}.MfcGas6.FeedBack");
+                    kepler2300Names.Add($"{Module}.MfcGas7.FeedBack");
+                    kepler2300Names.Add($"{Module}.MfcGas8.FeedBack");
+                    kepler2300Names.Add($"{Module}.Rf.ForwardPower");
+                    _fdc.Reset(kepler2300Names);
+                    break;
+            }
             return Runner.Start(Module, Name);
         }
         public RState Monitor()
         {
             Runner
-                  .Run(ProcessStep.PreparePressure, PreparePressure, IsPressureReady)
-                  .Run(ProcessStep.PrepareTemperature, PrepareTemp, IsTempReady)
-                  .RunIf(ProcessStep.RunChuckRecipe, needchuck, StartChuckRecipe, CheckRecipeDone, 5 * 60 * 60 * 1000)
-                  .RunIf(ProcessStep.RunProcessRecipe, needprocess, StartProcessRecipe, CheckRecipeDone, 5 * 60 * 60 * 1000)
-                  .RunIf(ProcessStep.RunDechuckRecipe, needdechuck, StartDechuckRecipe, CheckRecipeDone, 5 * 60 * 60 * 1000)
-                  .RunIf(ProcessStep.RunCleanRecipe, needclean, StartCleanRecipe, CheckRecipeDone, 5 * 60 * 60 * 1000)
-                  .End(ProcessStep.End, ProcessDone, _delay_1s);
+                  .Run(ProcessStep.PreparePressure,    PreparePressure,   IsPressureReady)
+                  .Run(ProcessStep.PrepareTemperature, PrepareTemp,       IsTempReady)
+                  .RunIf(ProcessStep.RunChuckRecipe,   needchuck,         StartChuckRecipe, CheckRecipeDone, 5 * 60 * 60 * 1000)
+                  .RunIf(ProcessStep.RunProcessRecipe, needprocess,       StartProcessRecipe, CheckRecipeDone, 5 * 60 * 60 * 1000)
+                  .RunIf(ProcessStep.RunDechuckRecipe, needdechuck,       StartDechuckRecipe, CheckRecipeDone, 5 * 60 * 60 * 1000)
+                  .RunIf(ProcessStep.RunCleanRecipe,   needclean,         StartCleanRecipe, CheckRecipeDone, 5 * 60 * 60 * 1000)
+                  .End(ProcessStep.End,                ProcessDone,       _delay_1s);
 
             return Runner.Status;
         }
@@ -378,7 +406,26 @@ namespace Venus_RT.Modules.PMs
 
             ProcessDataRecorder.StepStart(RecipeId, _currentRecipe.Steps[_currentStep].StepNo, $"{Module}:{_currentRecipe.Header.Name}:{_currentRecipe.Steps[_currentStep].Description}", _currentRecipe.Steps[_currentStep].Time);
             _stepTime.Restart();
+            switch (_jetChamber)
+            {
+                case JetChamber.Kepler2200A:
+                    var kepler2200AGasSetPoints = _currentRecipe.Steps[_currentStep].LstUnit[1] as Kepler2200GasControlUnit;
+                    var kepler2200ARFSetPoints = _currentRecipe.Steps[_currentStep].LstUnit[3] as TCPUnit;
+                    _fdc.Start(kepler2200AGasSetPoints.Gas1, kepler2200AGasSetPoints.Gas2, kepler2200AGasSetPoints.Gas3, kepler2200AGasSetPoints.Gas4, kepler2200AGasSetPoints.Gas5, kepler2200AGasSetPoints.Gas6, kepler2200ARFSetPoints.RFPower);
+                    break;
+                case JetChamber.Kepler2200B:
+                    var kepler2200BGasSetPoints = _currentRecipe.Steps[_currentStep].LstUnit[1] as Kepler2200GasControlUnit;
+                    var kepler2200BRFSetPoints = _currentRecipe.Steps[_currentStep].LstUnit[4] as TCPUnit;
+                    _fdc.Start(kepler2200BGasSetPoints.Gas1, kepler2200BGasSetPoints.Gas2, kepler2200BGasSetPoints.Gas3, kepler2200BGasSetPoints.Gas4, kepler2200BGasSetPoints.Gas5, kepler2200BGasSetPoints.Gas6, kepler2200BRFSetPoints.RFPower);
+                    break;
+                case JetChamber.Kepler2300:
+                    var kepler2300GasSetPoints = _currentRecipe.Steps[_currentStep].LstUnit[3] as GasControlUnit;
+                    var kepler2300RFSetPoints = _currentRecipe.Steps[_currentStep].LstUnit[1] as TCPUnit;
+                    var kepler2300BiasRFSetPoints = _currentRecipe.Steps[_currentStep].LstUnit[2] as BiasUnit;
 
+                    _fdc.Start(kepler2300GasSetPoints.Gas1, kepler2300GasSetPoints.Gas2, kepler2300GasSetPoints.Gas3, kepler2300GasSetPoints.Gas4, kepler2300GasSetPoints.Gas5, kepler2300GasSetPoints.Gas6, kepler2300GasSetPoints.Gas7, kepler2300GasSetPoints.Gas8,kepler2300RFSetPoints.RFPower,kepler2300BiasRFSetPoints.BiasRFPower);
+                    break;
+            }
             var state = _currentRecipe.Steps[_currentStep].Start();
             LOG.Write(eEvent.INFO_PROCESS, Module, $"Recipe:{CurrentRunningRecipe} Step{_currentStep + 1} Start");
             _faCallback.RecipeStepStart(Module.ToString(), CurrentRunningRecipe, _currentStep);
@@ -513,7 +560,7 @@ namespace Venus_RT.Modules.PMs
                     _currentStep++;
                     LOG.Write(eEvent.INFO_PROCESS, Module, $"Recipe:{CurrentRunningRecipe} Step{_currentStep} End");
                     ProcessDataRecorder.StepStart(RecipeId, _currentRecipe.Steps[_currentStep].StepNo, $"{Module}:{_currentRecipe.Header.Name}:{_currentRecipe.Steps[_currentStep].Description}", _currentRecipe.Steps[_currentStep].Time);
-                    ProcessDataRecorder.StepEnd(RecipeId, _currentRecipe.Steps[_currentStep].StepNo, _fdc.DataList);
+                    ProcessDataRecorder.StepEnd(RecipeId, _currentRecipe.Steps[_currentStep].StepNo-1, _fdc.DataList);
                     _faCallback.RecipeStepEnd(Module.ToString(), CurrentRunningRecipe, _currentStep);
                     return StartNewStep() != RState.Running;
                 }
@@ -560,11 +607,13 @@ namespace Venus_RT.Modules.PMs
                     ProcessDataRecorder.RecordPrecess(RecipeId, RecipeStartTime, RecipeEndTime, _currentRecipe.Header.Name, result, WaferId, _chamber.Name, LotID, SlotID, _currentRecipe.Header.Type.ToString());
                     break;
             }
+            ProcessDataRecorder.StepEnd(RecipeId, _currentRecipe.Steps[_currentStep].StepNo, _fdc.DataList);
             _fdc.Stop();
         }
         private bool ProcessDone()
         {
             _currentRecipe.Steps[_currentStep].End();
+
             _faCallback.RecipeComplete(Module.ToString(), CurrentRunningRecipe);
             RecipeFileManager.Instance.SaveRecipe(Module.ToString(), _currentRecipe.Header.Type.ToString(), _currentRecipe.Header.Name, RecipeUnity.RecipeToString(_currentRecipe),false,false);
             _stepTime.Stop();

+ 2 - 2
Venus/Venus_RT/Venus_RT.csproj

@@ -370,13 +370,13 @@
     <Content Include="Config\EquipmentVariables.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
-    <Content Include="Config\PM\Kepler2200A\Kepler2200AIoDefine.xml">
+    <Content Include="Config\PM\Kepler2200A\Kepler2200ADeviceModel.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
     <Content Include="Config\PM\Kepler2200A\Kepler2200AInterlock.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
-    <Content Include="Config\PM\Kepler2200A\Kepler2200ADeviceModel.xml">
+    <Content Include="Config\PM\Kepler2200A\Kepler2200AIoDefine.xml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
     <Content Include="Config\PM\Kepler2200B\Kepler2200BDeviceModel.xml">