123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using System.Xml;
- using Aitex.Core.Common;
- using Aitex.Core.RT.DataCenter;
- using Aitex.Core.RT.Device;
- using Aitex.Core.RT.Device.Unit;
- using Aitex.Core.RT.Event;
- using Aitex.Core.RT.Fsm;
- using Aitex.Core.RT.Log;
- using Aitex.Core.RT.OperationCenter;
- using Aitex.Core.RT.RecipeCenter;
- using Aitex.Core.RT.Routine;
- using Aitex.Core.RT.SCCore;
- using Aitex.Core.Util;
- using Aitex.Core.Utilities;
- using FurnaceRT.Equipments.Boats;
- using FurnaceRT.Equipments.CarrierRobots;
- using FurnaceRT.Equipments.FIMSs;
- using FurnaceRT.Equipments.LPs;
- using FurnaceRT.Equipments.PMs;
- using FurnaceRT.Equipments.PMs.RecipeExecutions;
- using FurnaceRT.Equipments.Stockers;
- using FurnaceRT.Equipments.WaferRobots;
- using MECF.Framework.Common.Equipment;
- using MECF.Framework.Common.SubstrateTrackings;
- using MECF.Framework.RT.Core.Applications;
- using MECF.Framework.RT.Core.IoProviders;
- namespace FurnaceRT.Equipments.Systems
- {
- public partial class EquipmentManager
- {
- private CarrierRobotModule _cassetteRobotModule;
- private WaferRobotModule _waferRobotModule;
- private LoadPortModule _lp1Module;
- private LoadPortModule _lp2Module;
- private LoadPortModule _lp3Module;
- private LoadPortModule _lp4Module;
- private FIMSModule _fims1Module;
- private FIMSModule _fims2Module;
- private BoatModule _boatModule;
- private RD_TRIG _pauseTrig = new RD_TRIG();
- private IoSensor _sensorEMSTP;
- private IoSensor _sensorEnableTP;
- private IoSensor _sensorPort1LockUnlock;
- private IoSensor _sensorPort2LockUnlock;
- private IoSensor _sensorBuzzerOff;
- private IoSensor _sensorIn;
- private IoSensor _sensorOut;
- private IoSensor _sensorMECHIlkReset;
- private IoSensor _sensorTXPauseFront;
- private IoSensor _sensorELVPauseFront;
- private IoSensor _sensorTXPauseBack;
- private IoSensor _sensorELVPauseBack;
- private IoTrigger _trigPort1LockUnlockLight;
- private IoTrigger _trigPort2LockUnlockLight;
- private IoTrigger _trigBuzzerOffLight;
- private IoTrigger _trigCassetteInLight;
- private IoTrigger _trigCassetteOutLight;
- private IoTrigger _trigMECHIlkResetLight;
- private IoTrigger _trigTXPauseFrontLight;
- private IoTrigger _trigELVPauseFrontLight;
- private IoTrigger _trigTXPauseBackLight;
- private IoTrigger _trigELVPauseBackLight;
- private int _TXPauseTrigCount = 0;
- private int _ELVPauseTrigCount = 0;
- private PeriodicJob _monitorInCommandJob;
- private List<IoSensor> _inCommandLst;
- private Dictionary<string, RD_TRIG> _inCommandTirgs = new Dictionary<string, RD_TRIG>();
- protected virtual void InitModules()
- {
- for (int i = 1; i <= 30; i++)
- {
- if (SC.ContainsItem($"System.SetUp.IsStocker{i}Installed") && SC.GetValue<bool>($"System.SetUp.IsStocker{i}Installed"))
- {
- var module = ModuleHelper.Converter($"Stocker{i}");
- var stocker = new StockerModule(module);
- Modules[module] = stocker;
- }
- }
- Modules[ModuleName.PM1] = new PMModule(ModuleName.PM1);
- if (SC.GetValue<bool>($"System.SetUp.IsLP1Installed"))
- {
- _lp1Module = new LoadPortModule(ModuleName.LP1);
- Modules[ModuleName.LP1] = _lp1Module;
- }
- if (SC.GetValue<bool>($"System.SetUp.IsLP2Installed"))
- {
- _lp2Module = new LoadPortModule(ModuleName.LP2);
- Modules[ModuleName.LP2] = _lp2Module;
- }
- if (SC.GetValue<bool>($"System.SetUp.IsLP3Installed"))
- {
- _lp3Module = new LoadPortModule(ModuleName.LP3);
- Modules[ModuleName.LP3] = _lp3Module;
- }
- if (SC.GetValue<bool>($"System.SetUp.IsLP4Installed"))
- {
- _lp4Module = new LoadPortModule(ModuleName.LP4);
- Modules[ModuleName.LP4] = _lp4Module;
- }
- _cassetteRobotModule = new CarrierRobotModule(ModuleName.CarrierRobot);
- Modules[ModuleName.CarrierRobot] = _cassetteRobotModule;
- _waferRobotModule = new WaferRobotModule(ModuleName.WaferRobot);
- Modules[ModuleName.WaferRobot] = _waferRobotModule;
- if (SC.GetValue<bool>($"System.SetUp.IsFIMS1Installed"))
- {
- _fims1Module = new FIMSModule(ModuleName.FIMS1);
- Modules[ModuleName.FIMS1] = _fims1Module;
- }
- if (SC.GetValue<bool>($"System.SetUp.IsFIMS2Installed"))
- {
- _fims2Module = new FIMSModule(ModuleName.FIMS2);
- Modules[ModuleName.FIMS2] = _fims2Module;
- }
- _boatModule = new BoatModule(ModuleName.Boat);
- Modules[ModuleName.Boat] = _boatModule;
- foreach (var modulesValue in Modules.Values)
- {
- modulesValue.Initialize();
- }
- //_monitorInCommandJob = new PeriodicJob(50, ModulesOnTimer, "Modules monitor thread", true);
- }
- private bool ModulesOnTimer()
- {
- return true;
- foreach (var item in _inCommandLst)
- {
- if (item == null)
- continue;
- if (!_inCommandTirgs.ContainsKey(item.Name))
- {
- _inCommandTirgs.Add(item.Name, new RD_TRIG());
- }
- _inCommandTirgs[item.Name].CLK = item.Value;
- }
- if ((_inCommandTirgs.ContainsKey(_sensorTXPauseFront?.Name) && _inCommandTirgs[_sensorTXPauseFront?.Name].R) ||
- (_inCommandTirgs.ContainsKey(_sensorTXPauseBack?.Name) && _inCommandTirgs[_sensorTXPauseBack?.Name].R))
- {
- _TXPauseTrigCount++;
- if (_TXPauseTrigCount % 2 == 1)
- {
- _trigTXPauseFrontLight?.SetTrigger(true, out _);
- _trigTXPauseBackLight?.SetTrigger(true, out _);
- _cassetteRobotModule.CarrierRobotDevice.SetPauseResume(true);
- _waferRobotModule.WaferRobotDevice.SetPauseResume(true);
- _fims1Module.FIMSDevice.SetPauseResume(true);
- _fims2Module.FIMSDevice.SetPauseResume(true);
- }
- else
- {
- _trigTXPauseFrontLight?.SetTrigger(false, out _);
- _trigTXPauseBackLight?.SetTrigger(false, out _);
- _cassetteRobotModule.CarrierRobotDevice.SetPauseResume(false);
- _waferRobotModule.WaferRobotDevice.SetPauseResume(false);
- _fims1Module.FIMSDevice.SetPauseResume(false);
- _fims2Module.FIMSDevice.SetPauseResume(false);
- }
- }
- if ((_inCommandTirgs.ContainsKey(_sensorELVPauseFront?.Name) && _inCommandTirgs[_sensorELVPauseFront?.Name].R) ||
- (_inCommandTirgs.ContainsKey(_sensorELVPauseBack?.Name) && _inCommandTirgs[_sensorELVPauseBack?.Name].R))
- {
- _ELVPauseTrigCount++;
- if (_ELVPauseTrigCount % 2 == 1)
- {
- _trigELVPauseFrontLight?.SetTrigger(true, out _);
- _trigELVPauseBackLight?.SetTrigger(true, out _);
- _boatModule.ZAxisDevice.SetPauseResume(true);
- _boatModule.RAxisDevice.SetPauseResume(true);
- }
- else
- {
- _trigELVPauseFrontLight?.SetTrigger(false, out _);
- _trigELVPauseBackLight?.SetTrigger(false, out _);
- _boatModule.ZAxisDevice.SetPauseResume(false);
- _boatModule.RAxisDevice.SetPauseResume(false);
- }
- }
- foreach (var modulesValue in Modules.Values)
- {
- if (modulesValue != null)
- modulesValue.Monitor();
- }
- return true;
- }
- protected virtual void InitDevices()
- {
- _sensorEMSTP = DEVICE.GetDevice<IoSensor>($"System.SensorEMSTP");
- _sensorEnableTP = DEVICE.GetDevice<IoSensor>($"System.SensorEnableTP");
- _sensorPort1LockUnlock = DEVICE.GetDevice<IoSensor>($"System.SensorPort1LockUnlock");
- _sensorPort2LockUnlock = DEVICE.GetDevice<IoSensor>($"System.SensorPort2LockUnlock");
- _sensorBuzzerOff = DEVICE.GetDevice<IoSensor>($"System.SensorBuzzerOff");
- _sensorIn = DEVICE.GetDevice<IoSensor>($"System.SensorIn");
- _sensorOut = DEVICE.GetDevice<IoSensor>($"System.SensorOut");
- _sensorMECHIlkReset = DEVICE.GetDevice<IoSensor>($"System.SensorMECHIlkReset");
- _sensorTXPauseFront = DEVICE.GetDevice<IoSensor>($"System.SensorTXPauseFront");
- _sensorELVPauseFront = DEVICE.GetDevice<IoSensor>($"System.SensorELVPauseFront");
- _sensorTXPauseBack = DEVICE.GetDevice<IoSensor>($"System.SensorTXPauseBack");
- _sensorELVPauseBack = DEVICE.GetDevice<IoSensor>($"System.SensorELVPauseBack");
- _trigPort1LockUnlockLight = DEVICE.GetDevice<IoTrigger>($"System.TrigPort1LockUnlockLight");
- _trigPort2LockUnlockLight = DEVICE.GetDevice<IoTrigger>($"System.TrigPort2LockUnlockLight");
- _trigBuzzerOffLight = DEVICE.GetDevice<IoTrigger>($"System.TrigBuzzerOffLight");
- _trigCassetteInLight = DEVICE.GetDevice<IoTrigger>($"System.TrigCassetteInLight");
- _trigCassetteOutLight = DEVICE.GetDevice<IoTrigger>($"System.TrigCassetteOutLight");
- _trigMECHIlkResetLight = DEVICE.GetDevice<IoTrigger>($"System.TrigMECHIlkResetLight");
- _trigTXPauseFrontLight = DEVICE.GetDevice<IoTrigger>($"System.TrigTXPauseFrontLight");
- _trigELVPauseFrontLight = DEVICE.GetDevice<IoTrigger>($"System.TrigELVPauseFrontLight");
- _trigTXPauseBackLight = DEVICE.GetDevice<IoTrigger>($"System.TrigTXPauseBackLight");
- _trigELVPauseBackLight = DEVICE.GetDevice<IoTrigger>($"System.TrigELVPauseBackLight");
- if (_trigTXPauseFrontLight != null && _trigTXPauseFrontLight.Value)
- _TXPauseTrigCount = 1;
- if (_trigELVPauseFrontLight != null && _trigELVPauseFrontLight.Value)
- _ELVPauseTrigCount = 1;
- _inCommandLst = new List<IoSensor>()
- {
- _sensorEMSTP,
- _sensorEnableTP,
- _sensorPort1LockUnlock,
- _sensorPort2LockUnlock,
- _sensorBuzzerOff,
- _sensorIn,
- _sensorOut,
- _sensorMECHIlkReset,
- _sensorTXPauseFront,
- _sensorELVPauseFront,
- _sensorTXPauseBack,
- _sensorELVPauseBack,
- };
- this.OnDeviceAlarmStateChanged += OnModuleDeviceAlarmStateChanged;
- }
- public bool GetJobRecipeInfor(string jobRecipeName, out string processRecipe, out string layoutRecipe, out int coolTimeSec, out string reason)
- {
- processRecipe = "";
- layoutRecipe = "";
- reason = "";
- coolTimeSec = 0;
- string abortRecipeName = SC.ContainsItem("System.Recipe.Abort Recipe") ? SC.GetStringValue("System.Recipe.Abort Recipe") : string.Empty;
- if (string.IsNullOrEmpty(abortRecipeName))
- {
- reason = $"Load abort recipe failed, recipe file is null";
- return false;
- }
- if (!RecipeParser.Parse(abortRecipeName, ModuleName.PM1.ToString(), out var abortRecipeHead, out var abortRecipeSteps, out reason, "Abort"))
- {
- reason = $"Load abort recipe {abortRecipeName} failed, {reason}";
- return false;
- }
- var module = "PM1";
- var processType = SC.GetStringValue("System.Recipe.SupportedJobType");
- var prefixPath = $"Furnace\\{processType}";
- var recipeContent = RecipeFileManager.Instance.LoadRecipe(prefixPath, jobRecipeName, false);
- if (string.IsNullOrEmpty(recipeContent))
- {
- reason = $"{prefixPath}\\{jobRecipeName} is empty, please confirm the file is valid.";
- return false;
- }
- var doc = new XmlDocument();
- doc.LoadXml(recipeContent);
- var nodeModule = doc.SelectSingleNode($"Aitex/TableRecipeData/Module[@Name='{module}']/Step");
- XmlElement stepNode = nodeModule as XmlElement;
- if (nodeModule == null)
- {
- reason = $"{prefixPath}\\{jobRecipeName} is empty, please confirm the file is valid.";
- return false;
- }
- var strCoolTime = "";
- foreach (XmlAttribute att in stepNode.Attributes)
- {
- switch (att.Name)
- {
- case "ProcessRecipe":
- processRecipe = att.Value;
- break;
- case "LayoutRecipe":
- layoutRecipe = att.Value;
- break;
- case "CoolTime":
- strCoolTime = att.Value;
- break;
- }
- }
- if (!string.IsNullOrEmpty(strCoolTime))
- {
- if (System.Text.RegularExpressions.Regex.Match(strCoolTime, @"[a-zA-Z]").Success)
- {
- if (SC.ContainsItem($"PM1.RecipeEditParameter.CoolTime.{strCoolTime}"))
- {
- var time = DateTime.Parse(SC.GetStringValue($"PM1.RecipeEditParameter.CoolTime.{strCoolTime}"));
- coolTimeSec = time.Second + time.Minute * 60 + time.Hour * 3600;
- }
- else
- {
- reason = $"Configuration does not contains cool time config {strCoolTime}";
- return false;
- }
- }
- else
- {
- if (DateTime.TryParse(strCoolTime, out DateTime time))
- {
- coolTimeSec = time.Second + time.Minute * 60 + time.Hour * 3600;
- }
- else if (Int32.TryParse(strCoolTime, out int timeInSec))
- {
- coolTimeSec = timeInSec;
- }
- else
- {
- reason = $"Cool time {strCoolTime} is invalid";
- return false;
- }
- }
- }
- return true;
- }
- }
- }
|