PufDistanceSensor.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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 int _waferSize = 200;
  53. /// <summary>
  54. /// 加速度
  55. /// </summary>
  56. private double _acceleration = 0;
  57. /// <summary>
  58. /// 减速度
  59. /// </summary>
  60. private double _deceleration = 0;
  61. /// <summary>
  62. /// 速度
  63. /// </summary>
  64. private double _speed = 0;
  65. /// <summary>
  66. /// 距离
  67. /// </summary>
  68. private double _distance = 0;
  69. /// <summary>
  70. /// 比例因子
  71. /// </summary>
  72. private double _verticalScaleFactor = 0;
  73. /// <summary>
  74. /// 垂直轴
  75. /// </summary>
  76. private JetAxisBase _verticalAxis;
  77. /// <summary>
  78. /// distance sensor1
  79. /// </summary>
  80. private double _distanceSensor1;
  81. /// <summary>
  82. /// distance sensor2
  83. /// </summary>
  84. private double _distanceSensor2;
  85. /// <summary>
  86. ///
  87. /// </summary>
  88. private double _torquelimit;
  89. /// <summary>
  90. /// Distance sensor阈值
  91. /// </summary>
  92. private double _checkStuckWafer_DistanceSensorThreshold_mm;
  93. #endregion
  94. /// <summary>
  95. /// 构造函数
  96. /// </summary>
  97. /// <param name="moduleName"></param>
  98. public PufDistanceSensor(string moduleName): base(moduleName,"DistanceSensor", "DistanceSensor", "DistanceSensor")
  99. {
  100. _waferSize = SC.GetValue<int>("System.WaferSize");
  101. BeckhoffProviderAxis verticalBeckhoffProviderAxis = BeckhoffAxisProviderManager.Instance.GetAxisProvider($"{Module}.Vertical");
  102. if (verticalBeckhoffProviderAxis != null)
  103. {
  104. _verticalScaleFactor = verticalBeckhoffProviderAxis.ScaleFactor;
  105. }
  106. LoadConfigParameter();
  107. _dynamicOffset1 = _offset1;
  108. _dynamicOffset2 = _offset2;
  109. _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{moduleName}.Vertical");
  110. }
  111. /// <summary>
  112. /// 初始化
  113. /// </summary>
  114. /// <returns></returns>
  115. public bool Initialize()
  116. {
  117. InitializeData();
  118. SubscribeValueAction();
  119. return true;
  120. }
  121. /// <summary>
  122. /// 订阅变量数值发生变化
  123. /// </summary>
  124. private void SubscribeValueAction()
  125. {
  126. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", DISTANCE_SENSOR1, UpdateVariableValue);
  127. IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", DISTANCE_SENSOR2, UpdateVariableValue);
  128. }
  129. /// 更新变量数值
  130. /// </summary>
  131. /// <param name="variable"></param>
  132. /// <param name="value"></param>
  133. private void UpdateVariableValue(string variable, object value)
  134. {
  135. if (variable == $"{DISTANCE_SENSOR1}")
  136. {
  137. _distanceSensor1 = (double)value;
  138. }
  139. else if (variable == $"{DISTANCE_SENSOR2}")
  140. {
  141. _distanceSensor2 = (double)value;
  142. }
  143. }
  144. /// <summary>
  145. /// 初始化数据
  146. /// </summary>
  147. private void InitializeData()
  148. {
  149. DATA.Subscribe($"{Module}.{DISTANCE_OFFSET1}", () => _dynamicOffset1, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  150. DATA.Subscribe($"{Module}.{DISTANCE_OFFSET2}", () => _dynamicOffset2, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  151. DATA.Subscribe($"{Module}.{DISTANCE_SENSOR1}", () => _distanceSensor1, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  152. DATA.Subscribe($"{Module}.{DISTANCE_SENSOR2}", () => _distanceSensor2, Aitex.Core.Util.SubscriptionAttribute.FLAG.IgnoreSaveDB);
  153. }
  154. /// <summary>
  155. /// 保存参数
  156. /// </summary>
  157. /// <param name="offset1"></param>
  158. /// <param name="offset2"></param>
  159. public void SaveConfig(double offset1,double offset2)
  160. {
  161. _dynamicOffset1=offset1;
  162. _dynamicOffset2=offset2;
  163. if(_waferSize==200)
  164. {
  165. SC.SetItemValue($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET1}", offset1);
  166. SC.SetItemValue($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET2}", offset2);
  167. }
  168. else
  169. {
  170. SC.SetItemValue($"{Module}.{STUCK_WAFER_300_DISTANCE_OFFSET1}", offset1);
  171. SC.SetItemValue($"{Module}.{STUCK_WAFER_300_DISTANCE_OFFSET2}", offset2);
  172. }
  173. }
  174. /// <summary>
  175. /// Stick Distance
  176. /// </summary>
  177. public bool GotoStickDistance()
  178. {
  179. LoadConfigParameter();
  180. return _verticalAxis.ProfilePosition(GetAfterScaleData(_verticalAxis.MotionData.MotorPosition + _distance),GetAfterScaleData(_speed),
  181. GetAfterScaleData(_acceleration),GetAfterScaleData(_deceleration),true);
  182. }
  183. /// <summary>
  184. /// 获取尺寸放大后的数据
  185. /// </summary>
  186. /// <param name="value"></param>
  187. /// <returns></returns>
  188. private int GetAfterScaleData(double value)
  189. {
  190. return (int)Math.Round(value * _verticalScaleFactor, 0);
  191. }
  192. /// <summary>
  193. /// Stick Distance检验结果
  194. /// </summary>
  195. /// <returns></returns>
  196. public bool CheckStickDistanceStatus()
  197. {
  198. LoadConfigParameter();
  199. double inter1 = STANDARD - _distanceSensor1;
  200. double inter2=STANDARD - _distanceSensor2;
  201. if(_verticalAxis.MotionData.ActualTorque>_torquelimit)
  202. {
  203. LOG.WriteLog(eEvent.ERR_PUF, Module, $"Torque {_verticalAxis.MotionData.ActualTorque} is over {_torquelimit}");
  204. return false;
  205. }
  206. double offsetInter1=Math.Abs(_offset1- inter1);
  207. double offsetInter2=Math.Abs(_offset2- inter2);
  208. if(offsetInter1>_checkStuckWafer_DistanceSensorThreshold_mm)
  209. {
  210. LOG.WriteLog(eEvent.ERR_PUF, Module, $"offset bias {offsetInter1} is over {_checkStuckWafer_DistanceSensorThreshold_mm}");
  211. return false;
  212. }
  213. if (offsetInter2 > _checkStuckWafer_DistanceSensorThreshold_mm)
  214. {
  215. LOG.WriteLog(eEvent.ERR_PUF, Module, $"offset bias {offsetInter2} is over {_checkStuckWafer_DistanceSensorThreshold_mm}");
  216. return false;
  217. }
  218. return true;
  219. }
  220. private void LoadConfigParameter()
  221. {
  222. if (_waferSize == 200)
  223. {
  224. _distance = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_OFFSET}");
  225. _offset1 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET1}");
  226. _offset2 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DISTANCE_OFFSET2}");
  227. _acceleration = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_ACCELERATION}");
  228. _deceleration = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_DECELERATION}");
  229. _speed = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_SPEED}");
  230. _torquelimit = SC.GetValue<double>($"{Module}.{STUCK_WAFER_200_TORQUE_LIMIT}");
  231. }
  232. else
  233. {
  234. _distance = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_OFFSET}");
  235. _offset1 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_DISTANCE_OFFSET1}");
  236. _offset2 = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_DISTANCE_OFFSET2}");
  237. _acceleration = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_ACCELERATION}");
  238. _deceleration = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_DECELERATION}");
  239. _speed = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_SPEED}");
  240. _torquelimit = SC.GetValue<double>($"{Module}.{STUCK_WAFER_300_TORQUE_LIMIT}");
  241. }
  242. if (SC.ContainsItem($"{Module}.CheckStuckWafer_DistanceSensorThreshold_mm"))
  243. {
  244. _checkStuckWafer_DistanceSensorThreshold_mm = SC.GetValue<double>($"{Module}.CheckStuckWafer_DistanceSensorThreshold_mm");
  245. }
  246. }
  247. public void Monitor()
  248. {
  249. }
  250. public void Reset()
  251. {
  252. }
  253. public void Terminate()
  254. {
  255. }
  256. }
  257. }