TubeHorizontalController.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #include "stdafx.h"
  2. #include "TubeHorizontalController.h"
  3. #include "ICommunicateEntity.h"
  4. #include "IOInterfaceMapper.h"
  5. #include "IServoDrive.h"
  6. using namespace DIOS::Dev::Detail::MachineryECOM;
  7. const float PULSE_DUTYCYCLE_MIN = 0.2f;
  8. const float PULSE_DUTYCYCLE_MAX = 0.95f;
  9. const float PULSE_DUTYCYCLE_DEF = 0.7f;
  10. TubeHorizontalController::TubeHorizontalController()
  11. :m_communicate(nullptr),
  12. m_driveNumber(-1),
  13. m_pulseInOneCircle(0),
  14. m_pulseDutyCycle(PULSE_DUTYCYCLE_DEF),
  15. m_servo(nullptr)
  16. {
  17. }
  18. TubeHorizontalController::~TubeHorizontalController()
  19. {
  20. }
  21. std::string TubeHorizontalController::CLASSID()
  22. {
  23. return "8120C155-F0C6-4e1b-ADD9-E403A099EE91";
  24. }
  25. void TubeHorizontalController::Initialize(const std::string &name)
  26. {
  27. SetName(name);
  28. }
  29. void TubeHorizontalController::AttachServoDrive(IServoDrive *servodrive)
  30. {
  31. m_servo = servodrive;
  32. }
  33. void TubeHorizontalController::SetPulseOneCircle(unsigned short pulseonecircle)
  34. {
  35. m_pulseInOneCircle = pulseonecircle;
  36. if (m_servo)
  37. {
  38. RS232_PARAM param;
  39. if (m_servo->MakePulseOnCirclePacket(pulseonecircle, param.rs485))
  40. {
  41. DoWrite485(param);
  42. }
  43. }
  44. }
  45. void TubeHorizontalController::SetPulseDutyCycle(float dutyCycle)
  46. {
  47. m_pulseDutyCycle = dutyCycle;
  48. if (dutyCycle < PULSE_DUTYCYCLE_MIN || dutyCycle > PULSE_DUTYCYCLE_MAX)
  49. {
  50. m_pulseDutyCycle = PULSE_DUTYCYCLE_DEF;
  51. }
  52. }
  53. void TubeHorizontalController::OnCommunicationEstablished(ICommunicateEntity *communicate)
  54. {
  55. m_communicate = communicate;
  56. if (!m_communicate)
  57. {
  58. return;
  59. }
  60. InitializeServo();
  61. }
  62. void TubeHorizontalController::StopMove()
  63. {
  64. GPIO_DO_PARAM pwmparam;
  65. pwmparam.active_level = 0x00;
  66. m_communicate->GPIO_DO_Ctrl(OP_WRITE, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_NONE, pwmparam);
  67. //ServoOn(FALSE);
  68. }
  69. void TubeHorizontalController::Move(int direction, int steps, int pwmperiod, float pulseDutyCycle)
  70. {
  71. SetDirection(direction);
  72. if (pulseDutyCycle < PULSE_DUTYCYCLE_MIN || pulseDutyCycle > PULSE_DUTYCYCLE_MAX)
  73. {
  74. pulseDutyCycle = m_pulseDutyCycle;
  75. }
  76. GPIO_DO_PARAM pwmparam;
  77. pwmparam.pwm_step.pwmstep_int = (int)steps;
  78. pwmparam.peroid.pwmperiod_short = (unsigned short)pwmperiod;
  79. pwmparam.effective.pwmperiod_short = (unsigned short)(pwmperiod * pulseDutyCycle);
  80. pwmparam.output_mode = (unsigned char)GOM_PWM;
  81. pwmparam.active_level = 0x01;
  82. m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_SET_PWM_DELETE, pwmparam);
  83. m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_SET_MODE, pwmparam);
  84. ServoOn(TRUE);
  85. if (!IsBrakeOpening())
  86. {
  87. if (gmotionLog) gmotionLog->Error("[TubeHorizontalController::Move][Brak is not opening, no pwm will be sent]");
  88. return;
  89. }
  90. //速度规划
  91. //int dectotal = m_pulseInOneCircle / 2;
  92. //if (steps <= dectotal)
  93. //{
  94. // m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_SET_PWM_PARAM_TABLE, pwmparam);
  95. //}
  96. //else
  97. //{
  98. // int decstep1 = 2 * dectotal / 3;
  99. // int decstep2 = dectotal / 3;
  100. // int decperiod1 = 3 * pwmperiod / 2;
  101. // int decperiod2 = 3 * pwmperiod;
  102. // pwmparam.pwm_step.pwmstep_int = steps - dectotal;
  103. // m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_SET_PWM_PARAM_TABLE, pwmparam);
  104. // pwmparam.pwm_step.pwmstep_int = decstep1;
  105. // pwmparam.peroid.pwmperiod_short = (unsigned short)decperiod1;
  106. // pwmparam.effective.pwmperiod_short = (unsigned short)(decperiod1 * pulseDutyCycle);
  107. // m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_SET_PWM_PARAM_TABLE, pwmparam);
  108. // pwmparam.pwm_step.pwmstep_int = decstep2;
  109. // pwmparam.peroid.pwmperiod_short = (unsigned short)decperiod2;
  110. // pwmparam.effective.pwmperiod_short = (unsigned short)(decperiod2 * pulseDutyCycle);
  111. // m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_SET_PWM_PARAM_TABLE, pwmparam);
  112. //}
  113. m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_SET_PWM_PARAM_TABLE, pwmparam);
  114. m_communicate->GPIO_DO_Ctrl(OP_WRITE, (GPIO_DO_ID)m_communicateInterfaceID, DO_ATTR_NONE, pwmparam);
  115. }
  116. void TubeHorizontalController::SetServoStatus(int svostatus)
  117. {
  118. ServoOn(svostatus != 0);
  119. }
  120. void TubeHorizontalController::InitializeServo()
  121. {
  122. if (m_servo)
  123. {
  124. RS232_PARAM params;
  125. if (m_servo->MakeServoOnEnablePacket(params.rs485))
  126. {
  127. DoWrite485(params);
  128. }
  129. ServoOn(FALSE);
  130. }
  131. }
  132. void TubeHorizontalController::ClearServoDriveWarning()
  133. {
  134. RS232_PARAM param;
  135. if (m_servo && m_servo->MakeClearWarningPacket(param.rs485))
  136. {
  137. DoWrite485(param);
  138. }
  139. }
  140. void TubeHorizontalController::ServoOn(BOOL servoon)
  141. {
  142. if (m_servo)
  143. {
  144. RS232_PARAM params;
  145. if (m_servo->MakeServoOnPacket(servoon, params.rs485))
  146. {
  147. DoWrite485(params);
  148. }
  149. else
  150. {
  151. if (m_functionIds.find(ID_TUBE_HORIZONTAL_SERVO_ON) != m_functionIds.end()
  152. && m_functionIds[ID_TUBE_HORIZONTAL_SERVO_ON] > 0)
  153. {
  154. GPIO_DO_PARAM doparam;
  155. doparam.active_level = servoon ? 0x1 : 0x0;
  156. m_communicate->GPIO_DO_Ctrl(OP_WRITE, (GPIO_DO_ID)m_functionIds[ID_TUBE_HORIZONTAL_SERVO_ON], DO_ATTR_NONE, doparam);
  157. }
  158. }
  159. }
  160. }
  161. void TubeHorizontalController::SetDirection(int direction)
  162. {
  163. GPIO_DO_PARAM oriparam;
  164. oriparam.active_level = (direction > 0) ? 0x1 : 0x0;
  165. m_communicate->GPIO_DO_Ctrl(OP_WRITE, (GPIO_DO_ID)m_functionIds[ID_TUBE_HORIZONTAL_DIRECTION], DO_ATTR_NONE, oriparam);
  166. }
  167. void TubeHorizontalController::DoWrite485(RS232_PARAM &param)
  168. {
  169. m_communicate->RS232_Ctrl(OP_WRITE, (RS232_ID)m_functionIds[ID_RS232], RS232_ATTR_NONE, param);
  170. Sleep(300);
  171. }
  172. bool TubeHorizontalController::IsBrakeOpening()
  173. {
  174. bool bRes = false;
  175. GPIO_DI_PARAM params;
  176. params.input_mode = GIM_DIGITAL;
  177. params.active_level = 0x0;
  178. if (IOInterfaceMapper::ID_TUBE_HORIZONTAL_BRAKE > 0)
  179. {
  180. for (int i = 0; i < 10; i++)
  181. {
  182. m_communicate->GPIO_DI_Ctrl(OP_READ, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_HORIZONTAL_BRAKE, DI_ATTR_NONE, params);
  183. if (params.active_level == 1) //1:刹车松开 0:刹车闭合
  184. {
  185. bRes = true;
  186. break;
  187. }
  188. Sleep(50);
  189. }
  190. }
  191. else
  192. {
  193. bRes = true;
  194. }
  195. return bRes;
  196. }