PufDistanceSensor.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.OperationCenter;
  5. using Aitex.Core.RT.SCCore;
  6. using MECF.Framework.Common.Beckhoff.AxisProvider;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.TwinCat;
  9. using MECF.Framework.RT.Core.Equipments;
  10. using CyberX8_RT.Devices.AXIS;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using MECF.Framework.Common.IOCore;
  17. namespace CyberX8_RT.Devices.PUF
  18. {
  19. public class PufDistanceSensor : BaseDevice, IDevice
  20. {
  21. #region 常量
  22. private const string STUCK_WAFER_300_OFFSET = "CheckStuckWafer300_Offset_mm";
  23. private const string STUCK_WAFER_300_DISTANCE_OFFSET1 = "CheckStuckWafer300_DistanceOffset1";
  24. private const string STUCK_WAFER_300_DISTANCE_OFFSET2 = "CheckStuckWafer300_DistanceOffset2";
  25. private const string STUCK_WAFER_300_ACCELERATION = "CheckStuckWafer300_Acceleration_mm_sec_sec";
  26. private const string STUCK_WAFER_300_DECELERATION = "CheckStuckWafer300_Deceleration_mm_sec_sec";
  27. private const string STUCK_WAFER_300_SPEED = "CheckStuckWafer300_Speed_mm_sec";
  28. private const string STUCK_WAFER_300_TORQUE_LIMIT = "CheckStuckWafer300_TorqueLimit_Percent";
  29. private const string STUCK_WAFER_200_OFFSET = "CheckStuckWafer200_Offset_mm";
  30. private const string STUCK_WAFER_200_DISTANCE_OFFSET1 = "CheckStuckWafer200_DistanceOffset1";
  31. private const string STUCK_WAFER_200_DISTANCE_OFFSET2 = "CheckStuckWafer200_DistanceOffset2";
  32. private const string STUCK_WAFER_200_ACCELERATION = "CheckStuckWafer200_Acceleration_mm_sec_sec";
  33. private const string STUCK_WAFER_200_DECELERATION = "CheckStuckWafer200_Deceleration_mm_sec_sec";
  34. private const string STUCK_WAFER_200_SPEED = "CheckStuckWafer200_Speed_mm_sec";
  35. private const string STUCK_WAFER_200_TORQUE_LIMIT = "CheckStuckWafer200_TorqueLimit_Percent";
  36. private const string DISTANCE_SENSOR1="DistanceSensor1";
  37. private const string DISTANCE_SENSOR2 = "DistanceSensor2";
  38. private const string DISTANCE_OFFSET1 = "DistanceOffset1";
  39. private const string DISTANCE_OFFSET2 = "DistanceOffset2";
  40. private const double STANDARD = 100;
  41. #endregion
  42. #region 内部变量
  43. //动态变量主要是用于calibrate显示
  44. private double _dynamicOffset1 = 0;
  45. private double _dynamicOffset2 = 0;
  46. //执行过程中主要用于以下两个变量
  47. private double _offset1 = 0;
  48. private double _offset2 = 0;
  49. /// <summary>
  50. /// 比例因子
  51. /// </summary>
  52. private double _verticalScaleFactor = 0;
  53. /// <summary>
  54. /// 垂直轴
  55. /// </summary>
  56. private JetAxisBase _verticalAxis;
  57. /// <summary>
  58. /// distance sensor1
  59. /// </summary>
  60. private double _distanceSensor1;
  61. /// <summary>
  62. /// distance sensor2
  63. /// </summary>
  64. private double _distanceSensor2;
  65. /// <summary>
  66. ///
  67. /// </summary>
  68. private double _torquelimit;
  69. /// <summary>
  70. /// Distance sensor阈值
  71. /// </summary>
  72. private double _checkStuckWafer_DistanceSensorThreshold_mm;
  73. #endregion
  74. /// <summary>
  75. /// 构造函数
  76. /// </summary>
  77. /// <param name="moduleName"></param>
  78. public PufDistanceSensor(string moduleName): base(moduleName,"DistanceSensor", "DistanceSensor", "DistanceSensor")
  79. {
  80. BeckhoffProviderAxis verticalBeckhoffProviderAxis = BeckhoffAxisProviderManager.Instance.GetAxisProvider($"{Module}.Vertical");
  81. if (verticalBeckhoffProviderAxis != null)
  82. {
  83. _verticalScaleFactor = verticalBeckhoffProviderAxis.ScaleFactor;
  84. }
  85. LoadConfigParameter();
  86. _dynamicOffset1 = _offset1;
  87. _dynamicOffset2 = _offset2;
  88. _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{moduleName}.Vertical");
  89. }
  90. /// <summary>
  91. /// 初始化
  92. /// </summary>
  93. /// <returns></returns>
  94. public bool Initialize()
  95. {
  96. InitializeData();
  97. SubscribeValueAction();
  98. return true;
  99. }
  100. /// <summary>
  101. /// 订阅变量数值发生变化
  102. /// </summary>
  103. private void SubscribeValueAction()
  104. {
  105. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", DISTANCE_SENSOR1, UpdateVariableValue);
  106. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", DISTANCE_SENSOR2, UpdateVariableValue);
  107. }
  108. /// 更新变量数值
  109. /// </summary>
  110. /// <param name="variable"></param>
  111. /// <param name="value"></param>
  112. private void UpdateVariableValue(string variable, object value)
  113. {
  114. if (variable == $"{DISTANCE_SENSOR1}")
  115. {
  116. _distanceSensor1 = (double)value;
  117. }
  118. else if (variable == $"{DISTANCE_SENSOR2}")
  119. {
  120. _distanceSensor2 = (double)value;
  121. }
  122. }
  123. /// <summary>
  124. /// 初始化数据
  125. /// </summary>
  126. private void InitializeData()
  127. {
  128. DATA.Subscribe($"{Module}.{DISTANCE_OFFSET1}", () => _dynamicOffset1, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  129. DATA.Subscribe($"{Module}.{DISTANCE_OFFSET2}", () => _dynamicOffset2, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  130. DATA.Subscribe($"{Module}.{DISTANCE_SENSOR1}", () => _distanceSensor1, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  131. DATA.Subscribe($"{Module}.{DISTANCE_SENSOR2}", () => _distanceSensor2, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  132. }
  133. /// <summary>
  134. /// 保存参数
  135. /// </summary>
  136. /// <param name="offset1"></param>
  137. /// <param name="offset2"></param>
  138. public void SaveConfig(double offset1,double offset2)
  139. {
  140. _dynamicOffset1=offset1;
  141. _dynamicOffset2=offset2;
  142. SC.SetItemValue($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET1}", offset1);
  143. SC.SetItemValue($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET2}", offset2);
  144. }
  145. /// <summary>
  146. /// 获取尺寸放大后的数据
  147. /// </summary>
  148. /// <param name="value"></param>
  149. /// <returns></returns>
  150. private int GetAfterScaleData(double value)
  151. {
  152. return (int)Math.Round(value * _verticalScaleFactor, 0);
  153. }
  154. /// <summary>
  155. /// Stick Distance检验结果
  156. /// </summary>
  157. /// <returns></returns>
  158. public bool CheckStickDistanceStatus()
  159. {
  160. LoadConfigParameter();
  161. double inter1 = STANDARD - _distanceSensor1;
  162. double inter2=STANDARD - _distanceSensor2;
  163. if(_verticalAxis.MotionData.ActualTorque>_torquelimit)
  164. {
  165. LOG.WriteLog(eEvent.ERR_PUF, Module, $"Torque {_verticalAxis.MotionData.ActualTorque} is over {_torquelimit}");
  166. return false;
  167. }
  168. double offsetInter1=Math.Abs(_offset1- inter1);
  169. double offsetInter2=Math.Abs(_offset2- inter2);
  170. if(offsetInter1>_checkStuckWafer_DistanceSensorThreshold_mm)
  171. {
  172. LOG.WriteLog(eEvent.ERR_PUF, Module, $"offset bias {offsetInter1} is over {_checkStuckWafer_DistanceSensorThreshold_mm}");
  173. return false;
  174. }
  175. if (offsetInter2 > _checkStuckWafer_DistanceSensorThreshold_mm)
  176. {
  177. LOG.WriteLog(eEvent.ERR_PUF, Module, $"offset bias {offsetInter2} is over {_checkStuckWafer_DistanceSensorThreshold_mm}");
  178. return false;
  179. }
  180. return true;
  181. }
  182. private void LoadConfigParameter()
  183. {
  184. _offset1 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET1}");
  185. _offset2 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET2}");
  186. _torquelimit = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_TORQUE_LIMIT}");
  187. if (SC.ContainsItem($"{Module}.CheckStuckWafer_DistanceSensorThreshold_mm"))
  188. {
  189. _checkStuckWafer_DistanceSensorThreshold_mm = SC.GetValue<double>($"{Module}.CheckStuckWafer_DistanceSensorThreshold_mm");
  190. }
  191. }
  192. public void Monitor()
  193. {
  194. }
  195. public void Reset()
  196. {
  197. }
  198. public void Terminate()
  199. {
  200. }
  201. }
  202. }