BeckhoffCommonAxis.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.RT.SCCore;
  3. using MECF.Framework.Common.Beckhoff.IOAxis;
  4. using MECF.Framework.Common.CommonData.PUF;
  5. using MECF.Framework.Common.TwinCat;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Reflection;
  10. using System.Text;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. using static Mono.Security.X509.X520;
  14. namespace PunkHPX8_RT.Devices.AXIS
  15. {
  16. public class BeckhoffCommonAxis
  17. {
  18. #region 常量
  19. private const string STATUS_WORD = "StatusWord";
  20. private const string DIGITAL_INPUTS = "DigitalInputs";
  21. private const string CONTROL_WORD = "ControlWord";
  22. private const string MODE_OF_OPERATION = "ModeOfOperation";
  23. protected const string PROFILE_VELOCITY = "ProfileVelocity";
  24. protected const string PROFILE_ACCEL = "ProfileAccel";
  25. protected const string PROFILE_DECEL = "ProfileDecel";
  26. private const string REFERENCE_POSITION = "ReferencePosition";
  27. private const string TARGET_POSITION = "TargetPosition";
  28. private const string ACTUAL_VELOCITY = "Velocity";
  29. private const string ACTUAL_TORQUE = "ActualTorque";
  30. private const string POSITION_ERROR = "PositionError";
  31. private const string MOTOR_POSITION = "MotorPosition";
  32. private const string HOME_OFFSET = "HomeOffset";
  33. private const string HOMING_METHOD = "HomingMethod";
  34. protected const string HOMING_VELOCITY = "HomingVelocity";
  35. protected const string HOMING_VELOCITY_SLOW = "HomingVelocitySlow";
  36. protected const string HOMING_ACCEL = "HomingAccel";
  37. private const string NEGATIVE_TORQUE_LIMIT = "NegativeTorqueLimit";
  38. private const string POSITIVE_TORQUE_LIMIT = "PositiveTorqueLimit";
  39. private const string MANUF_STATUS = "ManufStatus";
  40. private const string SOFTWARE_LIMIT_MINUS = "SoftwareLimitMinus";
  41. private const string SOFTWARE_LIMIT_PLUS = "SoftwareLimitPlus";
  42. #endregion
  43. #region 内部变量
  44. /// <summary>
  45. /// 模块名称
  46. /// </summary>
  47. private string _module;
  48. /// <summary>
  49. /// 名称
  50. /// </summary>
  51. private string _name;
  52. /// <summary>
  53. /// 电机对象
  54. /// </summary>
  55. private JetAxisBase _axis;
  56. /// <summary>
  57. /// coe输出变量集合
  58. /// </summary>
  59. private List<string> _coeOutputs = new List<string>();
  60. /// <summary>
  61. /// coe连接状态
  62. /// </summary>
  63. private bool _coeConnected = false;
  64. /// <summary>
  65. /// beckhoff axis配置
  66. /// </summary>
  67. private BeckhoffAxis _beckhoffAxis;
  68. #endregion
  69. /// <summary>
  70. /// 初始化
  71. /// </summary>
  72. /// <param name="module"></param>
  73. /// <param name="name"></param>
  74. public BeckhoffCommonAxis(string module, string name,JetAxisBase axis)
  75. {
  76. _module = module;
  77. _name = name;
  78. _axis = axis;
  79. }
  80. /// <summary>
  81. /// 初始化COE输出变量集合
  82. /// </summary>
  83. public void InitializeCoeOutputs(BeckhoffAxis beckhoffAxis)
  84. {
  85. _beckhoffAxis= beckhoffAxis;
  86. if (beckhoffAxis != null)
  87. {
  88. foreach (BeckhoffAxisOutput item in beckhoffAxis.Outputs)
  89. {
  90. if (!_coeOutputs.Contains(item.Type) && item.Address.StartsWith("0x"))
  91. {
  92. _coeOutputs.Add(item.Type);
  93. }
  94. }
  95. }
  96. }
  97. /// <summary>
  98. /// 首次写入COE
  99. /// </summary>
  100. public void FirstStartUpWriteCOE(string variable)
  101. {
  102. if (_coeOutputs.Contains(variable))
  103. {
  104. if (!_coeConnected)
  105. {
  106. _coeConnected = true;
  107. StartUpWriteCoeThread();
  108. }
  109. }
  110. }
  111. /// <summary>
  112. /// 启动写COE变量数值线程
  113. /// </summary>
  114. public void StartUpWriteCoeThread()
  115. {
  116. bool isSimulator = SC.GetValue<bool>("System.IsSimulatorMode");
  117. if (!isSimulator)
  118. {
  119. Thread thread = new Thread(new ThreadStart(StartUpWriteCoeVariable));
  120. thread.IsBackground = true;
  121. thread.Start();
  122. }
  123. }
  124. /// <summary>
  125. /// 启动写COE变量数值
  126. /// </summary>
  127. public void StartUpWriteCoeVariable()
  128. {
  129. LOG.WriteLog(eEvent.INFO_AXIS, _module, "start write coe thread");
  130. byte homingMethod = _beckhoffAxis.HomingMethod;
  131. WriteCoeVariable(HOMING_METHOD, homingMethod);
  132. //homing accel
  133. WriteCoeVariable(HOMING_ACCEL, _axis.CalculateDivideAccelerationRatio(_beckhoffAxis.HomingAccelDecel));
  134. //homing speed home switch
  135. WriteCoeVariable(HOMING_VELOCITY, _axis.CalculateMultiplySpeedRatio(_beckhoffAxis.HomingSpeedHomeSwitch));
  136. WriteCoeVariable(HOMING_VELOCITY_SLOW, _axis.CalculateMultiplySpeedRatio(_beckhoffAxis.HomingSpeedEncoderIndex));
  137. WriteCoeVariable(HOME_OFFSET, _beckhoffAxis.HomingOffset);
  138. int negativeTorqueLimit = _beckhoffAxis.NegativeTorqueLimit;
  139. if (negativeTorqueLimit != 0)
  140. {
  141. WriteCoeVariable(NEGATIVE_TORQUE_LIMIT, negativeTorqueLimit);
  142. }
  143. int positiveTorqueLimit = _beckhoffAxis.PositiveTorqueLimit;
  144. if (positiveTorqueLimit != 0)
  145. {
  146. WriteCoeVariable(POSITIVE_TORQUE_LIMIT, positiveTorqueLimit);
  147. }
  148. int softwareForwardLimit = _beckhoffAxis.ForwardSoftwareLimit;
  149. if (softwareForwardLimit != 0)
  150. {
  151. WriteCoeVariable(SOFTWARE_LIMIT_PLUS, softwareForwardLimit);
  152. }
  153. int softReverseLimit = _beckhoffAxis.ReverseSoftwareLimit;
  154. if (softReverseLimit != 0)
  155. {
  156. WriteCoeVariable(SOFTWARE_LIMIT_MINUS, softReverseLimit);
  157. }
  158. //WriteCoeVariable(PROFILE_VELOCITY,CalculateMultiplySpeedRatio(_beckhoffAxis.Speed));
  159. //WriteCoeVariable(PROFILE_ACCEL, CalculateDivideAccelerationRatio(_beckhoffAxis.Acceleration));
  160. //WriteCoeVariable(PROFILE_DECEL,CalculateDivideAccelerationRatio(_beckhoffAxis.Deceleration));
  161. }
  162. /// <summary>
  163. /// 写COE变量数值
  164. /// </summary>
  165. /// <param name="variableName"></param>
  166. /// <param name="value"></param>
  167. private void WriteCoeVariable(string variableName, object value)
  168. {
  169. string str = $"{_module}.{_name}";
  170. if (_coeOutputs.Contains(variableName))
  171. {
  172. bool result = TwincatCoeManager.Instance.WriteVariableValue(str, variableName, value);
  173. if (result)
  174. {
  175. LOG.WriteLog(eEvent.INFO_AXIS, str, $"coe variable {variableName} value {value} success");
  176. }
  177. }
  178. }
  179. /// <summary>
  180. /// 订阅变量
  181. /// </summary>
  182. public void SubscriptionVariable()
  183. {
  184. _axis.AxisSubscribeUpdateVariable(STATUS_WORD);
  185. _axis.AxisSubscribeUpdateVariable(DIGITAL_INPUTS);
  186. _axis.AxisSubscribeUpdateVariable(CONTROL_WORD);
  187. _axis.AxisSubscribeUpdateVariable(MODE_OF_OPERATION);
  188. _axis.AxisSubscribeUpdateVariable(PROFILE_VELOCITY);
  189. _axis.AxisSubscribeUpdateVariable(PROFILE_ACCEL);
  190. _axis.AxisSubscribeUpdateVariable(PROFILE_DECEL);
  191. _axis.AxisSubscribeUpdateVariable(REFERENCE_POSITION);
  192. _axis.AxisSubscribeUpdateVariable(TARGET_POSITION);
  193. _axis.AxisSubscribeUpdateVariable(MOTOR_POSITION);
  194. _axis.AxisSubscribeUpdateVariable(POSITION_ERROR);
  195. _axis.AxisSubscribeUpdateVariable(ACTUAL_TORQUE);
  196. _axis.AxisSubscribeUpdateVariable(ACTUAL_VELOCITY);
  197. _axis.AxisSubscribeUpdateVariable(HOME_OFFSET);
  198. _axis.AxisSubscribeUpdateVariable(HOMING_METHOD);
  199. _axis.AxisSubscribeUpdateVariable(HOMING_VELOCITY);
  200. _axis.AxisSubscribeUpdateVariable(HOMING_VELOCITY_SLOW);
  201. _axis.AxisSubscribeUpdateVariable(POSITIVE_TORQUE_LIMIT);
  202. _axis.AxisSubscribeUpdateVariable(NEGATIVE_TORQUE_LIMIT);
  203. _axis.AxisSubscribeUpdateVariable(HOMING_ACCEL);
  204. _axis.AxisSubscribeUpdateVariable(MANUF_STATUS);
  205. }
  206. /// <summary>
  207. /// 写入控制字
  208. /// </summary>
  209. /// <param name="controlWord"></param>
  210. public bool WriteControlWord(ushort controlWord)
  211. {
  212. return BeckhoffAxisManager.Instance.WriteVariableValue($"{_module}.{_name}.{CONTROL_WORD}", controlWord);
  213. }
  214. /// <summary>
  215. /// 写入ModeOfOperation
  216. /// </summary>
  217. /// <param name="modeOfOperation"></param>
  218. /// <returns></returns>
  219. public bool WriteModeOfMode(AxisModeOfOperation modeOfOperation)
  220. {
  221. return BeckhoffAxisManager.Instance.WriteVariableValue($"{_module}.{_name}.{MODE_OF_OPERATION}", (byte)modeOfOperation);
  222. }
  223. /// <summary>
  224. /// 写变量数值
  225. /// </summary>
  226. /// <param name="variableName"></param>
  227. /// <param name="value"></param>
  228. /// <returns></returns>
  229. public bool WriteVariable(string variableName, object value)
  230. {
  231. return BeckhoffAxisManager.Instance.WriteVariableValue($"{_module}.{_name}.{variableName}", value);
  232. }
  233. }
  234. }