ProcessTransporterGantryAxisInterLock.cs 6.8 KB

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