using System; using System.Collections.Generic; using System.Diagnostics; 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.OperationCenter; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using Aitex.Core.Utilities; using Aitex.Sorter.Common; using MECF.Framework.Common.Alarms; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Event; using MECF.Framework.Common.Schedulers; using MECF.Framework.Common.SubstrateTrackings; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robot; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase; namespace FurnaceRT.Equipments.WaferRobots { public partial class WaferRobotModule { public RobotBaseDevice WaferRobotDevice { get; set; } private List _triggeredAlarmList = new List(); private int _alarmNumber; public IoAlarmSignal AlarmSignaRobotTPStatusWarning { get; set; } private IoTrigger _trigAlarmReset; private IoAlarmSignal _alarmSignaRobotAlarm; private R_TRIG _alarmSignaRobotAlarmTrig = new R_TRIG(); public void InitDevice() { WaferRobotDevice = DEVICE.GetDevice($"{ModuleName.WaferRobot}"); AlarmSignaRobotTPStatusWarning = DEVICE.GetDevice($"PM1.AlarmSignaWaferRobotTPStatusWarning"); _alarmSignaRobotAlarm = DEVICE.GetDevice($"PM1.AlarmSignaWaferRobotAlarm"); _trigAlarmReset = DEVICE.GetDevice($"PM1.TrigWaferRobotAlarmReset"); WaferManager.Instance.SubscribeLocation($"{ModuleName.WaferRobot}", 5); this.OnDeviceAlarmStateChanged += OnModuleDeviceAlarmStateChanged; WaferRobotDevice.OnDeviceAlarmStateChanged += OnModuleDeviceAlarmStateChanged; } public void OnModuleDeviceAlarmStateChanged(string deviceId, AlarmEventItem alarmItem) { if (alarmItem.IsTriggered) { EventLevel level = alarmItem.Level; _triggeredAlarmList.Add(alarmItem); if (level == EventLevel.Alarm) { try { EV.PostAlarmLog(Module, alarmItem); } catch (Exception ex) { EV.WriteEvent(ex.Message.ToString()); } int count = 0; var alarms = EV.GetAlarmEvent(); foreach (var alarm in alarms) { if (alarm.Level == EventLevel.Alarm && alarm.Source == Name) count++; } if (_alarmNumber != count && count != 0) { PostMsg(MSG.Error); } _alarmNumber = count; } else { EV.PostWarningLog(Module, alarmItem); } } else { } } public void SetCassetteRobotReset() { WaferRobotDevice.RobotReset(); } public bool SetWaferRobotHome(out string reason) { reason = string.Empty; return WaferRobotDevice.HomeModule(null); } public bool SetSpeed(int speed, out string reason) { reason = string.Empty; return WaferRobotDevice.SetSpeed("SetSpeed", speed); } public bool RequestWaferPresent(Hand hand, out string reason) { reason = string.Empty; RobotArmEnum arm = hand == Hand.Blade1 ? RobotArmEnum.Blade1 : RobotArmEnum.Blade2; List paras = new List() { "CurrentStatus", arm }; return WaferRobotDevice.ReadParameter(paras.ToArray()); } public bool RobotPick(ModuleName target, int targetSlot, Hand hand, out string reason) { reason = string.Empty; RobotArmEnum arm = hand == Hand.Blade1 ? RobotArmEnum.Blade1 : RobotArmEnum.Both; return WaferRobotDevice.Pick(arm, target.ToString(), targetSlot); } public bool RobotPlace(ModuleName target, int targetSlot, Hand hand, out string reason) { reason = string.Empty; RobotArmEnum arm = hand == Hand.Blade1 ? RobotArmEnum.Blade1 : RobotArmEnum.Both; return WaferRobotDevice.Place(arm, target.ToString(), targetSlot); } public bool RobotMap(ModuleName target, Hand hand, out string reason) { reason = string.Empty; return WaferRobotDevice.WaferMapping(target, out reason); } public void Stop() { WaferRobotDevice.Stop(); } } }