LoaderTransPorterGantryAxisInterLock.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.OperationCenter;
  4. using Aitex.Core.RT.SCCore;
  5. using MECF.Framework.Common.Beckhoff.Station;
  6. using MECF.Framework.Common.DataCenter;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.Layout;
  9. using CyberX8_Core;
  10. using CyberX8_RT.Devices.AXIS;
  11. using CyberX8_RT.Devices.AXIS.Yaskawa;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. using Aitex.Core.RT.Device;
  18. using MECF.Framework.Common.ToolLayout;
  19. using MECF.Framework.Common.Utilities;
  20. using MECF.Framework.Common.WaferHolder;
  21. namespace CyberX8_RT.Devices.TransPorter
  22. {
  23. public class LoaderTransPorterGantryAxisInterLock : IAxisInterLock
  24. {
  25. #region 常量
  26. private const int TRANSPORTER_BOX_LENGTH = 85;
  27. #endregion
  28. #region 内部变量
  29. private JetAxisBase _axis;
  30. #endregion
  31. #region 属性
  32. /// <summary>
  33. /// 模块名称
  34. /// </summary>
  35. public string Module { get { return _axis.Module; } }
  36. /// <summary>
  37. /// 子模块名称
  38. /// </summary>
  39. public string Name { get { return _axis.Name; } }
  40. #endregion
  41. /// <summary>
  42. /// 栣函数
  43. /// </summary>
  44. /// <param name="moduleName"></param>
  45. /// <param name="name"></param>
  46. public LoaderTransPorterGantryAxisInterLock(JetAxisBase axis)
  47. {
  48. _axis = axis;
  49. OP.Subscribe($"{Module}.{Name}.{MotionOperation.SaveWithModifyLayout}", SaveWithModifyLayoutOperation);
  50. }
  51. /// <summary>
  52. /// GotoPosition条件检验
  53. /// </summary>
  54. /// <param name="station"></param>
  55. /// <returns></returns>
  56. /// <exception cref="NotImplementedException"></exception>
  57. public bool CheckGotoPosition(string station)
  58. {
  59. if (!AxisManager.Instance.CheckModuleAxisSwitchOn(Module, Name))
  60. {
  61. return false;
  62. }
  63. JetAxisBase elevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Elevator");
  64. if (elevatorAxis != null)
  65. {
  66. if (elevatorAxis.IsRun)
  67. {
  68. LOG.WriteLog(eEvent.ERR_AXIS, Module, "Elevator Axis is Run");
  69. return false;
  70. }
  71. }
  72. if (WaferHolderManager.Instance.HasWaferHolder(Module.ToString()))
  73. {
  74. double elevatorPosition = elevatorAxis.MotionData.MotorPosition;
  75. if (elevatorAxis.CheckPositionIsInStation(elevatorPosition, "Up"))
  76. {
  77. return true;
  78. }
  79. else
  80. {
  81. LOG.WriteLog(eEvent.ERR_AXIS, Module, $"{Module} has Wafer Shuttle,Elevator {elevatorPosition} is not in Up");
  82. }
  83. }
  84. return true;
  85. }
  86. /// <summary>
  87. /// 保存操作
  88. /// </summary>
  89. /// <param name="cmd"></param>
  90. /// <param name="args"></param>
  91. /// <returns></returns>
  92. private bool SaveWithModifyLayoutOperation(string cmd, object[] args)
  93. {
  94. string str = $"{Module}.{Name}.{args[0]}";
  95. bool result = _axis.SaveOperation(cmd, new object[] { str, args[1] });
  96. if (result)
  97. {
  98. string cellId = args[0].ToString();
  99. string cellName=CellItemManager.Instance.GetModuleNameByCellId(cellId);
  100. if (!string.IsNullOrEmpty(cellName))
  101. {
  102. ProcessLayoutCellItem item = ProcessLayoutManager.Instance.GetProcessLayoutCellItemByName(cellId);
  103. if (item == null)
  104. {
  105. return true;
  106. }
  107. int transporterLayoutHorizontalDistance = SC.GetValue<int>("Transporter.TransporterLayoutHorizontalDistance");
  108. int loaderPosition = SC.GetValue<int>("Transporter.TransporterLayoutLoaderPosition");
  109. int biasDistanceBetweenLoaderAndProcess = SC.GetValue<int>("Transporter.BiasDistanceBetweenLoaderAndProcess");
  110. BeckhoffStationAxis loaderTransporterAxis = BeckhoffStationLocationManager.Instance.GetStationAxis(ModuleName.Transporter2.ToString(), "Gantry", 0);
  111. BeckhoffStationAxis processTransporterAxis = BeckhoffStationLocationManager.Instance.GetStationAxis(ModuleName.Transporter1.ToString(), "Gantry", 0);
  112. var calculateResult = CalculateTransporterHorizontal(loaderTransporterAxis, processTransporterAxis);
  113. double distance = calculateResult.max -biasDistanceBetweenLoaderAndProcess - calculateResult.min;
  114. double _ratio = distance / transporterLayoutHorizontalDistance;
  115. int cellPosition = (int)Math.Round((loaderPosition + (_axis.MotionData.MotorPosition - calculateResult.min) / _ratio), 0);
  116. item.Left = cellPosition;
  117. if(item.Type=="Cell")
  118. {
  119. item.Left -= (item.Width/2-5);
  120. }
  121. try
  122. {
  123. ProcessLayoutManager.Instance.SaveProcessLayout();
  124. }
  125. catch (Exception ex)
  126. {
  127. LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"Save Layout exception {ex.Message}");
  128. }
  129. }
  130. return true;
  131. }
  132. else
  133. {
  134. return false;
  135. }
  136. }
  137. /// <summary>
  138. /// 计算Tansporter水平最大值最小值
  139. /// </summary>
  140. /// <param name="loaderTransporterAxis"></param>
  141. /// <param name="processTransporterAxis"></param>
  142. /// <returns></returns>
  143. private (double max, double min) CalculateTransporterHorizontal(BeckhoffStationAxis loaderTransporterAxis, BeckhoffStationAxis processTransporterAxis)
  144. {
  145. double max = 0;
  146. double min = 0;
  147. foreach (Station item in loaderTransporterAxis.Stations)
  148. {
  149. double position = double.Parse(item.Position);
  150. if (position > max)
  151. {
  152. max = position;
  153. }
  154. if (position < min)
  155. {
  156. min = position;
  157. }
  158. }
  159. foreach (Station item in processTransporterAxis.Stations)
  160. {
  161. double position = double.Parse(item.Position);
  162. if (position > max)
  163. {
  164. max = position;
  165. }
  166. if (position < min)
  167. {
  168. min = position;
  169. }
  170. }
  171. return (max, min);
  172. }
  173. }
  174. }