PufRotationAxisInterLock.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Log;
  4. using MECF.Framework.Common.Equipment;
  5. using MECF.Framework.Common.Utilities;
  6. using CyberX8_RT.Devices.AXIS;
  7. using CyberX8_RT.Devices.Loader;
  8. using CyberX8_RT.Devices.TransPorter;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. namespace CyberX8_RT.Devices.PUF
  15. {
  16. public class PufRotationAxisInterLock : IAxisInterLock
  17. {
  18. #region 常量
  19. private const string IS_DOOR_OPENED = "IsDoorOpened";
  20. #endregion
  21. #region 内部变量
  22. private JetAxisBase _loaderTransporterGantryAxis;
  23. private JetAxisBase _axis;
  24. #endregion
  25. #region 属性
  26. /// <summary>
  27. /// 模块名称
  28. /// </summary>
  29. public string Module { get { return _axis.Module; } }
  30. /// <summary>
  31. /// 子模块名称
  32. /// </summary>
  33. public string Name { get { return _axis.Name; } }
  34. #endregion
  35. /// <summary>
  36. /// 构造函数
  37. /// </summary>
  38. /// <param name="Module"></param>
  39. /// <param name="name"></param>
  40. public PufRotationAxisInterLock(JetAxisBase axis)
  41. {
  42. _axis = axis;
  43. }
  44. /// <summary>
  45. /// 加载LoaderTransporter Gantry轴
  46. /// </summary>
  47. private void GetLoaderTransporterGantryAxis()
  48. {
  49. if(_loaderTransporterGantryAxis==null)
  50. {
  51. _loaderTransporterGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Transporter2}.Gantry");
  52. }
  53. }
  54. /// <summary>
  55. /// GotoPosition检验条件
  56. /// </summary>
  57. /// <param name="station"></param>
  58. /// <returns></returns>
  59. /// <exception cref="NotImplementedException"></exception>
  60. public bool CheckGotoPosition(string station)
  61. {
  62. if (!_axis.IsHomed)
  63. {
  64. LOG.WriteLog(eEvent.ERROR_PUF_NOT_HOME, $"{Module}.{Name}", "axis is not homed, Cannot execute GotoSavedPosition");
  65. return false;
  66. }
  67. if (!AxisManager.Instance.CheckModuleAxisSwitchOn(Module, Name))
  68. {
  69. return false;
  70. }
  71. JetAxisBase flipAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Flip");
  72. if (flipAxis.IsRun)
  73. {
  74. LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "flip is running, Cannot execute GotoSavedPosition");
  75. return false;
  76. }
  77. JetAxisBase verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
  78. if (verticalAxis.IsRun)
  79. {
  80. LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "vertical is running, Cannot execute GotoSavedPosition");
  81. return false;
  82. }
  83. double verticalPosition = verticalAxis.MotionData.MotorPosition;
  84. bool loaderInstalled = ModuleHelper.IsInstalled(ModuleName.Loader1);
  85. JetAxisBase loaderRotationAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Loader1}.Rotation");
  86. double loaderRotationPosition = loaderInstalled?loaderRotationAxis.MotionData.MotorPosition:0;
  87. bool loaderTransporterInstalled = ModuleHelper.IsInstalled(ModuleName.Transporter2);
  88. if(loaderTransporterInstalled)
  89. {
  90. GetLoaderTransporterGantryAxis();
  91. }
  92. if (verticalAxis.CheckPositionIsInStation(verticalPosition, "Park"))//vertical轴在Park位置,Loader transporter在Loader右侧,Rotation轴可以GotoSavedPosition
  93. {
  94. if (loaderTransporterInstalled&&_loaderTransporterGantryAxis.JudgeCompareTargetStation("Loader","Right"))//LoaderTransPorter在Loader的右侧(位置不在Loader),Rotation轴可以GotoSavedPosition
  95. {
  96. return true;
  97. }
  98. else if (!loaderTransporterInstalled)
  99. {
  100. return true;
  101. }
  102. else
  103. {
  104. LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "loader transporter axis is in loader station, Cannot execute GotoSavedPosition");
  105. return false;
  106. }
  107. }
  108. else if (verticalAxis.CheckPositionIsEmpty(verticalPosition))
  109. {
  110. LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"vertical axis {verticalPosition} is empty, Cannot execute GotoSavedPosition");
  111. return false;
  112. }
  113. else//Vertical轴在Park以外的位置
  114. {
  115. if (!loaderInstalled)
  116. {
  117. return true;
  118. }
  119. else if (loaderRotationAxis == null || loaderRotationAxis.CheckPositionIsEmpty(loaderRotationPosition))
  120. {
  121. LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"loader rotation axis {loaderRotationPosition} is empty, Cannot execute GotoSavedPosition");
  122. return false;
  123. }
  124. else if (loaderRotationAxis.CheckPositionIsInStation(loaderRotationPosition, "TRNPA"))//loader1 rotation轴在TRNPA,Rotation轴只可以在Robot和Park位置
  125. {
  126. string selectedItem = station;
  127. if (selectedItem.EndsWith("Park") || selectedItem.EndsWith("Robot"))
  128. {
  129. return true;
  130. }
  131. else
  132. {
  133. LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "vertical can only goto Park or Robot station");
  134. return false;
  135. }
  136. }
  137. else if (loaderRotationAxis.CheckPositionIsInStation(loaderRotationPosition,"LOADA"))//loader1 rotation轴在LOADA,同时Loader1 门已经打开,Rotation轴不可以去Park和Robot位置
  138. {
  139. string selectedItem = station;
  140. LoaderSideDevice loaderSideDevice = LoadLoaderSideDevice();
  141. if(loaderSideDevice==null)
  142. {
  143. return true;
  144. }
  145. if (loaderSideDevice.SideData.DoorLowerUnlocked||loaderSideDevice.SideData.DoorUpperUnlocked)
  146. {
  147. if (selectedItem.EndsWith("Park") || selectedItem.EndsWith("Robot"))
  148. {
  149. LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "loader door open,rotation cannot goto Park or Robot station");
  150. return false;
  151. }
  152. else
  153. {
  154. return true;
  155. }
  156. }
  157. else
  158. {
  159. return true;
  160. }
  161. }
  162. else
  163. {
  164. return true;
  165. }
  166. }
  167. }
  168. /// <summary>
  169. /// 获取Loader Side设备
  170. /// </summary>
  171. /// <returns></returns>
  172. private LoaderSideDevice LoadLoaderSideDevice()
  173. {
  174. if(Module==ModuleName.PUF1.ToString())
  175. {
  176. return DEVICE.GetDevice<LoaderSideDevice>($"{ModuleName.Loader1}.SideA");
  177. }
  178. else
  179. {
  180. return DEVICE.GetDevice<LoaderSideDevice>($"{ModuleName.Loader1}.SideB");
  181. }
  182. }
  183. }
  184. }