Selaa lähdekoodia

git-svn-id: http://10.4.3.168:50001/svn/Furnace@31 dbcde07d-dcf5-c148-8a84-ac3097b7778e

Zhangjian 5 kuukautta sitten
vanhempi
commit
079988d4a3

+ 2 - 2
Branch/NTP02/FrameworkLocal/RTEquipmentLibrary/HardwareUnits/Robots/HRC100Robots/GM201LVPRobot/GM201LVPRobot.cs

@@ -141,7 +141,7 @@ namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.HRC100Robots.G
             Wafer
         }
         private Dictionary<string, string> _moduleAssociateStationDic;
-        public Dictionary<string, string> ModuleAssociateStationDic
+        public override Dictionary<string, string> ModuleAssociateStationDic
         {
             get
             {
@@ -552,7 +552,7 @@ namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.HRC100Robots.G
                 DATA.Subscribe($"{Name}.IsWaferPresenceOnBlade5", () => IsWaferPresenceOnBlade5);
             }
 
-            DATA.Subscribe($"{Name}.TPStatus", () => _tpStatus.Value);
+            DATA.Subscribe($"{Name}.TPStatus", () => _tpStatus != null && _tpStatus.Value);
             DATA.Subscribe($"{Name}.CurrentExtensionPosition", () => CurrentExtensionPosition);
             DATA.Subscribe($"{Name}.CurrentThetaPosition", () => CurrentThetaPosition);
 

+ 1 - 1
Branch/NTP02/FrameworkLocal/RTEquipmentLibrary/HardwareUnits/Robots/RobotBase/RobotBase.cs

@@ -62,7 +62,7 @@ namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase
         public ModuleName BladeTarget { get; set; }
         public ModuleName Blade1Target { get; set; }
         public ModuleName Blade2Target { get; set; }
-
+        public virtual Dictionary<string, string> ModuleAssociateStationDic { get; set; }
         public BladePostureEnum Blade1Posture { get; set; } = BladePostureEnum.Degree0;
 
         public BladePostureEnum Blade1ActionPosture { get; set; }

+ 12 - 2
Branch/NTP02/FrameworkLocal/RTEquipmentLibrary/Unit/IoTrigger.cs

@@ -9,6 +9,7 @@ namespace Aitex.Core.RT.Device.Unit
         private DIAccessor _diFeedback = null;
         private DOAccessor _doTrigger = null;
         private AOAccessor _aoTrigger = null;
+        private AIAccessor _aiFeedback = null;
         public DOAccessor DoTrigger => _doTrigger;
 
         public IoTrigger(string module, XmlElement node, string ioModule = "")
@@ -21,8 +22,7 @@ namespace Aitex.Core.RT.Device.Unit
             _diFeedback = ParseDiNode("diFeedback", node, ioModule);
             _doTrigger = ParseDoNode("doTrigger", node, ioModule);
             _aoTrigger = ParseAoNode("aoTrigger", node, ioModule);
-
-
+            _aiFeedback = ParseAiNode("aiFeedback", node, ioModule);
         }
 
         public bool Value
@@ -51,6 +51,16 @@ namespace Aitex.Core.RT.Device.Unit
                 return 0f;
             }
         }
+        public float AIValue
+        {
+            get
+            {
+                if (_aiFeedback != null)
+                    return _aiFeedback.FloatValue;
+
+                return 0f;
+            }
+        }
         public bool SetPulseTrigger(bool value, out string reason)
         {
             reason = "";

+ 1 - 0
Branch/NTP02/Furnace/FurnaceRT/Config/IO/NTP02/DeviceModelPM.xml

@@ -1088,6 +1088,7 @@
 		<IoTrigger id="TrigVGUnitConversion" display="" schematicId="" unit="" doTrigger="DO_VGUnitConversion"/>
 		<IoTrigger id="TrigHeaterAllEnable" display="" schematicId="" unit="" aoTrigger="AO_HeaterAllEnable"/>
 		<IoTrigger id="TrigGasLineHeaterMemoryChange" display="" schematicId="" unit="" aoTrigger="AO_GasLineHeaterMemoryChange"/>
+		<IoTrigger id="TrigFOUPRobotActionCommand" display="" schematicId="" unit="" aoTrigger="AO_FOUPRobotActionCommand" aiFeedback="AI_FOUPRobotActionCommand"/>
 	</IoTriggers>
 	<IoSignalTowers  assembly="FurnaceRT" classType="FurnaceRT.Equipments.Systems.FurnaceSignalTower">
 		<IoSignalTower module="System" id ="SignalTower" display="Signal Tower" schematicId=""

+ 2 - 0
Branch/NTP02/Furnace/FurnaceRT/Config/IO/NTP02/_ioDefinePM.xml

@@ -2198,6 +2198,7 @@
       <AI_ITEM Index="2121" Name="AI_APCController10CH" BufferOffset="2121" Addr="D9242" Description="CH(air pressure exhaust threshold value 1) for Process Controller 10" />
       <AI_ITEM Index="2122" Name="AI_APCController0CL" BufferOffset="2122" Addr="D9244" Description="CL(air pressure exhaust threshold value 2) for Process Controller 10" />
       <AI_ITEM Index="2123" Name="AI_APCController10Offset" BufferOffset="2123" Addr="D9246" Description="OFFSET for Pocess Controller 10" />
+      <AI_ITEM Index="2150" Name="AI_FOUPRobotActionCommand" BufferOffset="2150" Addr="D9300" Description="FOUP Robot Action Command" />
     </Ana_In>
     <Ana_Out>
       <AO_ITEM Index="0" Name="AO_RFPowerSet" BufferOffset="0" Addr="D10000" Description="RF power set" />
@@ -3241,5 +3242,6 @@
       <AO_ITEM Index="1691" Name="AO_ExchangeFOUPTOFOUPWaitTime" BufferOffset="1691" Addr="D13382" Description="Exchange_FOUP_TO_FOUP_Wait_Time" />
       <AO_ITEM Index="1692" Name="AO_LAO2CheckSV" BufferOffset="1692" Addr="D13384" Description="LA_O2_Check_SV" />
       <AO_ITEM Index="1693" Name="AO_FOUPO2CheckSV" BufferOffset="1693" Addr="D13386" Description="FOUP_O2_Check_SV" />
+      <AO_ITEM Index="2000" Name="AO_FOUPRobotActionCommand" BufferOffset="2000" Addr="D14000" Description="FOUP Robot Action Command" />
     </Ana_Out>
   </IO_DEFINE>

+ 1 - 0
Branch/NTP02/Furnace/FurnaceRT/Equipments/CarrierRobots/CarrierRobotHome.cs

@@ -93,6 +93,7 @@ namespace FurnaceRT.Equipments.CarrierRobots
                 return Result.FAIL;
             }
 
+            _cassetteRobotModule.ResetRobotActionCommand();
             Notify("Finished");
             return Result.DONE;
         }

+ 55 - 0
Branch/NTP02/Furnace/FurnaceRT/Equipments/CarrierRobots/CarrierRobotModuleDevice.cs

@@ -32,13 +32,16 @@ namespace FurnaceRT.Equipments.CarrierRobots
     {
         private List<AlarmEventItem> _triggeredAlarmList = new List<AlarmEventItem>();
         private int _alarmNumber;
+        public IoTrigger TrigActionCommand => _trigActionCommand;
         public RobotBaseDevice CarrierRobotDevice { get; set; }
         public IoBufferMotor BufferDevice { get; set; }
         private IoTrigger _trigAlarmReset;
+        private IoTrigger _trigActionCommand;
         private IoAlarmSignal _alarmSignaRobotAlarm;
         private R_TRIG _alarmSignaRobotAlarmTrig = new R_TRIG();
         public IoDoor DoorDevice { get; set; }
         public IoAlarmSignal AlarmSignaFOUPRobotTPStatusWarning { get; set; }
+        private Dictionary<string, int> _actionCommand;
 
         public void InitDevice()
         {
@@ -48,10 +51,38 @@ namespace FurnaceRT.Equipments.CarrierRobots
             AlarmSignaFOUPRobotTPStatusWarning = DEVICE.GetDevice<IoAlarmSignal>($"PM1.AlarmSignaFOUPRobotTPStatusWarning");
             _alarmSignaRobotAlarm = DEVICE.GetDevice<IoAlarmSignal>($"PM1.AlarmSignaFOUPRobotAlarm");
             _trigAlarmReset = DEVICE.GetDevice<IoTrigger>($"PM1.TrigFOUPRobotAlarmReset");
+            _trigActionCommand = DEVICE.GetDevice<IoTrigger>($"PM1.TrigFOUPRobotActionCommand");
             CarrierManager.Instance.SubscribeLocation(Module, 1, SC.GetValue<int>("System.CassetteSlotCount"));
             WaferManager.Instance.SubscribeLocation(Module, SC.GetValue<int>("System.CassetteSlotCount"));
             this.OnDeviceAlarmStateChanged += OnModuleDeviceAlarmStateChanged;
             CarrierRobotDevice.OnDeviceAlarmStateChanged += OnModuleDeviceAlarmStateChanged;
+            _actionCommand = new Dictionary<string, int>()
+            {
+                {"C01.Pick",1 },
+                {"C01.Place",2 },
+                {"C02.Pick",3 },
+                {"C02.Place",4 },
+                {"C03.Pick",5 },
+                {"C03.Place",6 },
+                {"C04.Pick",7 },
+                {"C04.Place",8 },
+                {"C05.Pick",9 },
+                {"C05.Place",10 },
+                {"C06.Pick",11 },
+                {"C06.Place",12 },
+                {"C07.Pick",13 },
+                {"C07.Place",14 },
+                {"C08.Pick",15 },
+                {"C08.Place",16 },
+                {"C09.Pick",17 },
+                {"C09.Place",18 },
+                {"C10.Pick",19 },
+                {"C10.Place",20 },
+                {"C11.Pick",21 },
+                {"C11.Place",22 },
+                {"C12.Pick",23 },
+                {"C12.Place",24 },
+            };
         }
         public void OnModuleDeviceAlarmStateChanged(string deviceId, AlarmEventItem alarmItem)
         {
@@ -142,5 +173,29 @@ namespace FurnaceRT.Equipments.CarrierRobots
             int.TryParse(module.Replace("Stocker", ""), out int target);
             return (int)(BufferDevice.ServoMovePositionSet + 0.00001) == target && BufferDevice.TargetPositionFb == target;
         }
+        public void SetRobotActionCommand(ModuleName traget, EnumTransferType transferType)
+        {
+            if (!CarrierRobotDevice.ModuleAssociateStationDic.ContainsKey(traget.ToString()))
+                return;
+
+            var station = CarrierRobotDevice.ModuleAssociateStationDic[traget.ToString()];
+            if(!_actionCommand.ContainsKey($"{station}.{transferType}"))
+                return;
+            _trigActionCommand.SetAOTrigger(_actionCommand[$"{station}.{transferType}"], out _);
+        }
+        public bool CheckRobotActionCommand(ModuleName traget, EnumTransferType transferType)
+        {
+            if (!CarrierRobotDevice.ModuleAssociateStationDic.ContainsKey(traget.ToString()))
+                return false;
+
+            var station = CarrierRobotDevice.ModuleAssociateStationDic[traget.ToString()];
+            if (!_actionCommand.ContainsKey($"{station}.{transferType}"))
+                return false;
+            return Math.Abs( _trigActionCommand.AIValue - _actionCommand[$"{station}.{transferType}"]) < 0.001;
+        }
+        public void ResetRobotActionCommand()
+        {
+            _trigActionCommand?.SetAOTrigger(0, out _);
+        }
     }
 }

+ 37 - 0
Branch/NTP02/Furnace/FurnaceRT/Equipments/CarrierRobots/CarrierRobotPick.cs

@@ -23,6 +23,7 @@ namespace FurnaceRT.Equipments.CarrierRobots
         enum RoutineStep
         {
             SetBufferTargetPosition,
+            SetRobotActionCommand,
             SetBufferMoveTo,
             Delay,
             Goto,
@@ -210,6 +211,7 @@ namespace FurnaceRT.Equipments.CarrierRobots
         }
         public void Abort()
         {
+            _cassetteRobotModule.ResetRobotActionCommand();
             _cassetteRobotModule.Stop();
             (Singleton<EquipmentManager>.Instance.Modules[_source] as ITransferTarget)?.NoteTransferStop(ModuleHelper.Converter(_cassetteRobotModule.Module), _blade, _sourceSlot, EnumTransferType.Pick);
         }
@@ -222,6 +224,9 @@ namespace FurnaceRT.Equipments.CarrierRobots
                 if (_cassetteRobotModule.CarrierRobotDevice.IsPause)
                     return Result.RUN;
 
+                if(_cassetteRobotModule.TrigActionCommand != null)
+                    SetRobotActionCommand((int)RoutineStep.SetRobotActionCommand, _source, _timeout);
+
                 CheckBeforePick((int)RoutineStep.CheckBeforePick, _source, _sourceSlot, _blade);
 
                 if (ModuleHelper.IsBufferStocker(_source))
@@ -259,15 +264,47 @@ namespace FurnaceRT.Equipments.CarrierRobots
             }
             catch (RoutineFaildException ex)
             {
+                _cassetteRobotModule.ResetRobotActionCommand();
                 (Singleton<EquipmentManager>.Instance.Modules[_source] as ITransferTarget)?.NoteTransferStop(ModuleHelper.Converter(_cassetteRobotModule.Module), _blade, _sourceSlot, EnumTransferType.Pick);
                 return Result.FAIL;
             }
 
+            _cassetteRobotModule.ResetRobotActionCommand();
             (Singleton<EquipmentManager>.Instance.Modules[_source] as ITransferTarget)?.NoteTransferStop(ModuleHelper.Converter(_cassetteRobotModule.Module), _blade, _sourceSlot, EnumTransferType.Pick);
             Notify("Finished");
             return Result.DONE;
         }
+        private void SetRobotActionCommand(int id, ModuleName source, int timeout)
+        {
+            _routineStep = (RoutineStep)Enum.Parse(typeof(RoutineStep), id.ToString());
+            Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
+            {
+                Notify($"Set robot action command target position {source}");
+
+                _cassetteRobotModule.SetRobotActionCommand(source, EnumTransferType.Pick);
 
+                return true;
+            }, () =>
+            {
+                return _cassetteRobotModule.CheckRobotActionCommand(source, EnumTransferType.Pick);
+            }, timeout * 1000);
+
+            if (ret.Item1)
+            {
+                if (ret.Item2 == Result.FAIL)
+                {
+                    _cassetteRobotModule.PickCassetteFailAlarm.Set($"pick from {source} failed for robot action command interlock");
+                    throw (new RoutineFaildException());
+                }
+                else if (ret.Item2 == Result.TIMEOUT) //timeout
+                {
+                    _cassetteRobotModule.PickCassetteTimeoutAlarm.Set($"timeout over {timeout} seconds");
+                    throw (new RoutineFaildException());
+                }
+                else
+                    throw (new RoutineBreakException());
+            }
+        }
         private void SetBufferTargetPosition(int id, ModuleName source, int timeout)
         {
             _routineStep = (RoutineStep)Enum.Parse(typeof(RoutineStep), id.ToString());

+ 38 - 0
Branch/NTP02/Furnace/FurnaceRT/Equipments/CarrierRobots/CarrierRobotPlace.cs

@@ -23,6 +23,7 @@ namespace FurnaceRT.Equipments.CarrierRobots
         enum RoutineStep
         {
             SetBufferTargetPosition,
+            SetRobotActionCommand,
             SetBufferMoveTo,
             Delay,
             Goto,
@@ -211,6 +212,7 @@ namespace FurnaceRT.Equipments.CarrierRobots
 
         public void Abort()
         {
+            _cassetteRobotModule.ResetRobotActionCommand();
             _cassetteRobotModule.Stop();
             (Singleton<EquipmentManager>.Instance.Modules[_destination] as ITransferTarget)?.NoteTransferStop(ModuleHelper.Converter(_cassetteRobotModule.Module), _blade, _destinationSlot, EnumTransferType.Place);
         }
@@ -223,6 +225,9 @@ namespace FurnaceRT.Equipments.CarrierRobots
                 if (_cassetteRobotModule.CarrierRobotDevice.IsPause)
                     return Result.RUN;
 
+                if (_cassetteRobotModule.TrigActionCommand != null)
+                    SetRobotActionCommand((int)RoutineStep.SetRobotActionCommand, _destination, _timeout);
+
                 CheckBeforePlace((int)RoutineStep.CheckBeforePlace, _destination, _destinationSlot, _blade);
 
                 if (ModuleHelper.IsBufferStocker(_destination))
@@ -260,15 +265,48 @@ namespace FurnaceRT.Equipments.CarrierRobots
             }
             catch (RoutineFaildException ex)
             {
+                _cassetteRobotModule.ResetRobotActionCommand();
                 (Singleton<EquipmentManager>.Instance.Modules[_destination] as ITransferTarget)?.NoteTransferStop(ModuleHelper.Converter(_cassetteRobotModule.Module), _blade, _destinationSlot, EnumTransferType.Place);
                 return Result.FAIL;
             }
 
+            _cassetteRobotModule.ResetRobotActionCommand();
             (Singleton<EquipmentManager>.Instance.Modules[_destination] as ITransferTarget)?.NoteTransferStop(ModuleHelper.Converter(_cassetteRobotModule.Module), _blade, _destinationSlot, EnumTransferType.Place);
 
             Notify("Finished");
             return Result.DONE;
         }
+        private void SetRobotActionCommand(int id, ModuleName source, int timeout)
+        {
+            _routineStep = (RoutineStep)Enum.Parse(typeof(RoutineStep), id.ToString());
+            Tuple<bool, Result> ret = ExecuteAndWait(id, () =>
+            {
+                Notify($"Set robot action command target position {source}");
+
+                _cassetteRobotModule.SetRobotActionCommand(source, EnumTransferType.Place);
+
+                return true;
+            }, () =>
+            {
+                return _cassetteRobotModule.CheckRobotActionCommand(source, EnumTransferType.Place);
+            }, timeout * 1000);
+
+            if (ret.Item1)
+            {
+                if (ret.Item2 == Result.FAIL)
+                {
+                    _cassetteRobotModule.PickCassetteFailAlarm.Set($"pick from {source} failed for robot action command interlock");
+                    throw (new RoutineFaildException());
+                }
+                else if (ret.Item2 == Result.TIMEOUT) //timeout
+                {
+                    _cassetteRobotModule.PickCassetteTimeoutAlarm.Set($"timeout over {timeout} seconds");
+                    throw (new RoutineFaildException());
+                }
+                else
+                    throw (new RoutineBreakException());
+            }
+        }
         private void SetBufferTargetPosition(int id, ModuleName source, int timeout)
         {
             _routineStep = (RoutineStep)Enum.Parse(typeof(RoutineStep), id.ToString());

+ 2 - 2
Branch/NTP02/Furnace/FurnaceRT/Properties/AssemblyInfo.cs

@@ -51,5 +51,5 @@ using System.Windows;
 // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 // 方法是按如下所示使用“*”: :
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.0.2.64")]
-[assembly: AssemblyFileVersion("0.0.2.64")]
+[assembly: AssemblyVersion("0.0.2.65")]
+[assembly: AssemblyFileVersion("0.0.2.65")]

+ 3 - 0
Branch/NTP02/Furnace/FurnaceRT/ReleaseNotes.txt

@@ -6,6 +6,7 @@
 					 Furnace 系统更新历史记录
 
 ---------------------------------------------------------------------------------
+2025-1-12 version 0.0.2.65
 1、bug168 文件夹里面的recipe,双击后会展开左右移动
 2、bug169 sibcn不用显示出来gasline模块
 3、bug51 wafer thick界面删掉
@@ -18,6 +19,8 @@
 10、bug56 data charting删的时候报错
 11、ELK中AUX界面点位显示
 12、GasLine添加权限
+13.增加FOUP robot动作前的command写入和检查
+
 2024-11-4 version 0.0.2.64
 1.DPO的状态显示灯根据点位D341.3显示
 2.欧陆通讯增加inerval设定

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 2030 - 2246
Branch/NTP02/Furnace/FurnaceSimulator/Config/_ioDefinePM.xml


+ 1 - 1
Branch/NTP02/Furnace/FurnaceSimulator/Views/PLCView.xaml

@@ -7,7 +7,7 @@
     <TabControl Style="{StaticResource LargeTab}">
         <TabItem Header="Tube">
             <local:SimulatorPlcFloatIOView
-                IoMapFile="ELK\\_ioDefinePM.xml"
+                IoMapFile="_ioDefinePM.xml"
                 Module="PM1"
                 Port="6740"
                 Source="System.PM1"/>

+ 2 - 2
Branch/NTP02/Furnace/FurnaceUI/Properties/AssemblyInfo.cs

@@ -54,5 +54,5 @@ using System.Windows;
 // You can specify all the values or you can default the Build and Revision Numbers 
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.0.2.64")]
-[assembly: AssemblyFileVersion("0.0.2.64")]
+[assembly: AssemblyVersion("0.0.2.65")]
+[assembly: AssemblyFileVersion("0.0.2.65")]