using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Log; using Aitex.Core.RT.OperationCenter; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Beckhoff.Station; using MECF.Framework.Common.DataCenter; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Layout; using CyberX8_Core; using CyberX8_RT.Devices.AXIS; using CyberX8_RT.Devices.AXIS.Yaskawa; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aitex.Core.RT.Device; using MECF.Framework.Common.ToolLayout; using MECF.Framework.Common.Utilities; using MECF.Framework.Common.WaferHolder; namespace CyberX8_RT.Devices.TransPorter { public class LoaderTransPorterGantryAxisInterLock : IAxisInterLock { #region 常量 private const int TRANSPORTER_BOX_LENGTH = 85; #endregion #region 内部变量 private JetAxisBase _axis; #endregion #region 属性 /// /// 模块名称 /// public string Module { get { return _axis.Module; } } /// /// 子模块名称 /// public string Name { get { return _axis.Name; } } #endregion /// /// 栣函数 /// /// /// public LoaderTransPorterGantryAxisInterLock(JetAxisBase axis) { _axis = axis; OP.Subscribe($"{Module}.{Name}.{MotionOperation.SaveWithModifyLayout}", SaveWithModifyLayoutOperation); } /// /// GotoPosition条件检验 /// /// /// /// public bool CheckGotoPosition(string station) { if (!AxisManager.Instance.CheckModuleAxisSwitchOn(Module, Name)) { return false; } JetAxisBase elevatorAxis = DEVICE.GetDevice($"{Module}.Elevator"); if (elevatorAxis != null) { if (elevatorAxis.IsRun) { LOG.WriteLog(eEvent.ERR_AXIS, Module, "Elevator Axis is Run"); return false; } } if (WaferHolderManager.Instance.HasWaferHolder(Module.ToString())) { double elevatorPosition = elevatorAxis.MotionData.MotorPosition; if (elevatorAxis.CheckPositionIsInStation(elevatorPosition, "Up")) { return true; } else { LOG.WriteLog(eEvent.ERR_AXIS, Module, $"{Module} has Wafer Shuttle,Elevator {elevatorPosition} is not in Up"); } } return true; } /// /// 保存操作 /// /// /// /// private bool SaveWithModifyLayoutOperation(string cmd, object[] args) { string str = $"{Module}.{Name}.{args[0]}"; bool result = _axis.SaveOperation(cmd, new object[] { str, args[1] }); if (result) { string cellId = args[0].ToString(); string cellName=CellItemManager.Instance.GetModuleNameByCellId(cellId); if (!string.IsNullOrEmpty(cellName)) { ProcessLayoutCellItem item = ProcessLayoutManager.Instance.GetProcessLayoutCellItemByName(cellId); if (item == null) { return true; } int transporterLayoutHorizontalDistance = SC.GetValue("Transporter.TransporterLayoutHorizontalDistance"); int loaderPosition = SC.GetValue("Transporter.TransporterLayoutLoaderPosition"); int biasDistanceBetweenLoaderAndProcess = SC.GetValue("Transporter.BiasDistanceBetweenLoaderAndProcess"); BeckhoffStationAxis loaderTransporterAxis = BeckhoffStationLocationManager.Instance.GetStationAxis(ModuleName.Transporter2.ToString(), "Gantry", 0); BeckhoffStationAxis processTransporterAxis = BeckhoffStationLocationManager.Instance.GetStationAxis(ModuleName.Transporter1.ToString(), "Gantry", 0); var calculateResult = CalculateTransporterHorizontal(loaderTransporterAxis, processTransporterAxis); double distance = calculateResult.max -biasDistanceBetweenLoaderAndProcess - calculateResult.min; double _ratio = distance / transporterLayoutHorizontalDistance; int cellPosition = (int)Math.Round((loaderPosition + (_axis.MotionData.MotorPosition - calculateResult.min) / _ratio), 0); item.Left = cellPosition; if(item.Type=="Cell") { item.Left -= (item.Width/2-5); } try { ProcessLayoutManager.Instance.SaveProcessLayout(); } catch (Exception ex) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"Save Layout exception {ex.Message}"); } } return true; } else { return false; } } /// /// 计算Tansporter水平最大值最小值 /// /// /// /// private (double max, double min) CalculateTransporterHorizontal(BeckhoffStationAxis loaderTransporterAxis, BeckhoffStationAxis processTransporterAxis) { double max = 0; double min = 0; foreach (Station item in loaderTransporterAxis.Stations) { double position = double.Parse(item.Position); if (position > max) { max = position; } if (position < min) { min = position; } } foreach (Station item in processTransporterAxis.Stations) { double position = double.Parse(item.Position); if (position > max) { max = position; } if (position < min) { min = position; } } return (max, min); } } }