123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- using System;
- using System.Collections.Generic;
- using System.Runtime.Serialization;
- using System.Xml;
- using Aitex.Core.RT.Log;
- using Aitex.Core.RT.RecipeCenter;
- using Aitex.Core.RT.SCCore;
- using MECF.Framework.Common.Equipment;
- namespace MECF.Framework.Common.Jobs
- {
- [Serializable]
- [DataContract]
- public class SequenceInfo
- {
- [DataMember]
- public List<SequenceStepInfo> Steps { get; set; }
- [DataMember]
- public string Name { get; set; }
- [DataMember]
- public List<string> SystemRecipeCommands { get; set; } = new List<string>();
- [DataMember]
- public Guid InnerId { get; set; }
- [DataMember]
- public Dictionary<string,string> Modules { get; set; }
-
- public SequenceInfo(string name)
- {
- Name = name;
- InnerId = Guid.NewGuid();
- Steps = new List<SequenceStepInfo>();
- Modules = new Dictionary<string, string>();
- }
- }
- public class SequenceInfoHelper
- {
- public static SequenceInfo GetInfo(string seqFile)
- {
- SequenceInfo info = new SequenceInfo(seqFile);
-
- string content = RecipeFileManager.Instance.GetSequence(seqFile, false);
- if (!string.IsNullOrEmpty(content))
- {
- try
- {
- XmlDocument dom = new XmlDocument();
- dom.LoadXml(content);
- XmlNodeList lstStepNode = dom.SelectNodes("Aitex/TableSequenceData/Step");
- if (lstStepNode == null)
- {
- LOG.Error($"{seqFile} has no step");
- return null;
- }
- foreach (var nodeModelChild in lstStepNode)
- {
- XmlElement nodeStep = nodeModelChild as XmlElement;
- SequenceStepInfo stepInfo = new SequenceStepInfo();
- foreach (XmlAttribute attr in nodeStep.Attributes)
- {
- if (attr.Name == "Position" || attr.Name=="LLSelection" || attr.Name == "PMSelection" || attr.Name == "PMSelection25")
- {
- if (attr.Value == "LL" || attr.Value=="PM")
- continue;
- if (!Enum.TryParse(attr.Value, out ModuleName _))
- continue;
- string[] pos = attr.Value.Split(',');
- if (pos.Length < 1)
- {
- LOG.Error($"{seqFile} Position {attr.Value} can not be empty");
- return null;
- }
- foreach (var po in pos)
- {
- ModuleName module = ModuleHelper.Converter(po);
- if (module == ModuleName.System)
- {
- LOG.Error($"{seqFile} Position {po} not valid");
- return null;
- }
- stepInfo.StepModules.Add(module);
- }
- continue;
- }
- if (attr.Name == "AlignerAngle")
- {
- if (!double.TryParse(attr.Value, out double angle))
- {
- LOG.Error($"{seqFile} AlignAngle {attr.Value} not valid");
- return null;
- }
- stepInfo.AlignAngle = angle;
- continue;
- }
- if ((attr.Name == "Recipe") || (attr.Name == "ProcessRecipe"))
- {
- stepInfo.RecipeName = attr.Value;
- continue;
- }
- stepInfo.StepParameter[attr.Name] = attr.Value;
- }
- info.Steps.Add(stepInfo);
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- return null;
- }
- }
- return info;
- }
- public static SequenceInfo GetWaferFlowInfo(string seqFile)
- {
- SequenceInfo info = new SequenceInfo(seqFile);
- string content = RecipeFileManager.Instance.GetWaferFlowRecipe(seqFile, false);
- if (!string.IsNullOrEmpty(content))
- {
- try
- {
- XmlDocument dom = new XmlDocument();
- dom.LoadXml(content);
- var pmNode = dom.SelectSingleNode($"/Aitex/TableRecipeData/Module[@Name = 'WaferFlow']");
- if (null == pmNode)
- {
- LOG.Error($"Wafer flow recipe {seqFile} 无内容");
- return null;
- }
- var lstStepNode = pmNode.SelectNodes("Step");
- if (lstStepNode == null)
- {
- LOG.Error($"Wafer flow recipe {seqFile} has no step");
- return null;
- }
- for (int i= 0;i<lstStepNode.Count;i++)
- {
- XmlElement nodeStep = lstStepNode[i] as XmlElement;
- SequenceStepInfo stepInfo = new SequenceStepInfo();
- if(i==0||i== lstStepNode.Count-1)
- {
- if (SC.GetStringValue("System.SetUp.Block1.1") != "Reserved")
- stepInfo.StepModules.Add(ModuleName.Cassette1);
- if (SC.GetStringValue("System.SetUp.Block1.2") != "Reserved")
- stepInfo.StepModules.Add(ModuleName.Cassette2);
- if (SC.GetStringValue("System.SetUp.Block1.3") != "Reserved")
- stepInfo.StepModules.Add(ModuleName.Cassette3);
- if (SC.GetStringValue("System.SetUp.Block1.4") != "Reserved")
- stepInfo.StepModules.Add(ModuleName.Cassette4);
- if (SC.GetStringValue("System.SetUp.Block1.5") != "Reserved")
- stepInfo.StepModules.Add(ModuleName.Cassette5);
- info.Steps.Add(stepInfo);
- continue;
- }
- bool validStep = false;
- foreach (XmlAttribute attr in nodeStep.Attributes)
- {
- //ModuleName="2-2 COT,2-1 COT"
- if (attr.Name == "ModuleName")
- {
- if (string.IsNullOrEmpty(attr.Value.ToString()))
- continue;
- string[] pos = attr.Value.Split(',');
- if (pos.Length < 1)
- {
- LOG.Error($"{seqFile} Position {attr.Value} can not be empty");
- return null;
- }
- foreach (var po in pos)
- {
- var modulePara = po.Split(' ');
- if (modulePara.Length < 2)
- {
- LOG.Error($"{seqFile} module name {attr.Value} invalid");
- return null;
- }
- if(!Enum.TryParse($"PM{modulePara[0].Replace("-", "_")}", out ModuleName module))
- {
- continue;
- }
- module = ModuleHelper.Converter($"PM{modulePara[0].Replace("-","_")}");
- if (module == ModuleName.System)
- {
- LOG.Error($"{seqFile} Position PM{modulePara[0].Replace("-", "_")} not valid");
- return null;
- }
- info.Modules[module.ToString()] = modulePara[1].ToString();
- validStep = true;
- stepInfo.StepModules.Add(module);
- }
- }
- if (attr.Name == "TransControl")
- {
- stepInfo.TransferControl = attr.Value;
- }
- if (attr.Name == "RecipeName")
- {
- if (string.IsNullOrEmpty(attr.Value))
- continue;
- //RecipeName="2-2:test,2-1:test"
- //Cot和Dev分别是不同写recipe
- if (attr.Value.Contains(":"))
- {
- string[] moduleRecipes = attr.Value.Split(',');
- if (moduleRecipes.Length < 1)
- {
- LOG.Error($"{seqFile} recipe name {attr.Value} in invalid");
- return null;
- }
- foreach (var moduleRecipe in moduleRecipes)
- {
- var recipePara = moduleRecipe.Split(':');
- if (recipePara.Length < 2)
- {
- LOG.Error($"{seqFile} recipe name {attr.Value} invalid");
- return null;
- }
- ModuleName module = ModuleHelper.Converter($"PM{recipePara[0].Replace("-", "_")}");
- if (module == ModuleName.System)
- {
- LOG.Error($"{seqFile} Position PM{recipePara[0].Replace("-", "_")} not valid");
- return null;
- }
- stepInfo.RecipeNameDic.Add(module.ToString(), recipePara[1]);
- }
- }
- else
- {
- //其他单元一个step共用一个recipe
- stepInfo.RecipeName = attr.Value.ToString();
- }
- }
- //冷热版和ADH的recipe赋值
- if(!string.IsNullOrEmpty(stepInfo.RecipeName))
- {
- foreach(var module in stepInfo.StepModules)
- {
- if(!stepInfo.RecipeNameDic.ContainsKey(module.ToString()))
- {
- stepInfo.RecipeNameDic.Add(module.ToString(), stepInfo.RecipeName);
- }
- }
- }
- stepInfo.StepParameter[attr.Name] = attr.Value;
- }
- if(validStep)
- info.Steps.Add(stepInfo);
- }
- //解析system recipe
- string systemRecipe = dom.SelectSingleNode($"/Aitex/TableRecipeData/Config").Attributes["SystemRecipe"].Value;
-
- if (!string.IsNullOrEmpty(systemRecipe))
- {
- string contentSystemReicpe = RecipeFileManager.Instance.LoadRecipe($"Track\\System", systemRecipe, false);
- if (string.IsNullOrEmpty(contentSystemReicpe))
- {
- LOG.Error($"{systemRecipe} is not a valid system recipe file");
- return null;
- }
- XmlDocument rcpDataDoc = new XmlDocument();
- rcpDataDoc.LoadXml(contentSystemReicpe);
- XmlNode nodeModule = rcpDataDoc.SelectSingleNode($"/Aitex/TableRecipeData/Module[@Name='System']");
- if (nodeModule == null)
- {
- LOG.Error($"{systemRecipe} does not contains step");
- return null;
- }
- XmlNodeList stepNodeList = nodeModule.SelectNodes($"Step");
- for (int i = 0; i < stepNodeList.Count; i++)
- {
- XmlElement stepNode = stepNodeList[i] as XmlElement;
- string moduleIndex= stepNode.Attributes["ModuleName"].Value.Replace("-","_");
- string controlTarget = stepNode.Attributes["ControlTarget"].Value;
- string setValue = stepNode.Attributes["SetValue"].Value;
- string almMax = stepNode.Attributes["AlmMax"].Value;
- string almMin = stepNode.Attributes["AlmMin"].Value;
- string stopMax = stepNode.Attributes["StopMax"].Value;
- string stopMin = stepNode.Attributes["StopMin"].Value;
- var value = $"{moduleIndex}:{controlTarget},{setValue},{almMax},{almMin},{stopMax},{stopMin}";
- info.SystemRecipeCommands.Add(value);
- }
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- return null;
- }
- }
- return info;
- }
- }
- }
|