You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.8 KiB

12 months ago
  1. #include "preportional_valve_ctrl.hpp"
  2. #include "transmit_disfection_protocol/transmit_disfection_protocol.hpp"
  3. using namespace iflytop;
  4. using namespace zscanprotocol;
  5. #define WORK_STATE_REG 0x0000
  6. #define CTRL_STATE_REG 0x0001
  7. #define POS_STATE_REG 0x0013
  8. #define OVERTIME 30
  9. #define TAG "PreportionalValveCtrl"
  10. void PreportionalValveCtrl::initialize(UART_HandleTypeDef* huart) { m_modbusBlockHost.initialize(huart); }
  11. int32_t PreportionalValveCtrl::writeReg06(uint8_t slaveAddr, uint16_t regAddr, uint16_t regVal) {
  12. // 重发三次
  13. for (size_t i = 0; i < 3; i++) {
  14. int32_t err = m_modbusBlockHost.writeReg06(slaveAddr, regAddr, regVal, OVERTIME);
  15. if (err == 0) return 0;
  16. }
  17. return err::kerr_subdevice_offline;
  18. }
  19. int32_t PreportionalValveCtrl::readReg03(uint8_t slaveAddr, uint16_t regAddr, uint16_t* regVal) {
  20. // 重发三次
  21. for (size_t i = 0; i < 3; i++) {
  22. int32_t err = m_modbusBlockHost.readReg03(slaveAddr, regAddr, regVal, OVERTIME);
  23. if (err == 0) return 0;
  24. }
  25. return err::kerr_subdevice_offline;
  26. }
  27. int32_t PreportionalValveCtrl::setValvePos(int32_t valueid, int32_t pos) { //
  28. int32_t ret = 0;
  29. if (valueid > 255 || valueid < 1) {
  30. return err::kerr_invalid_param;
  31. }
  32. ret = writeReg06(valueid, CTRL_STATE_REG, pos);
  33. if (!ret) return err::kerr_subdevice_offline;
  34. m_last_set_valve_ticket = HAL_GetTick();
  35. m_targetpos[valueid] = pos;
  36. return 0;
  37. }
  38. int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) {
  39. int32_t ret = 0;
  40. if (valueid > 255 || valueid < 1) {
  41. return err::kerr_invalid_param;
  42. }
  43. uint16_t pos16 = 0;
  44. ret = readReg03(valueid, POS_STATE_REG, &pos16);
  45. if (!ret) return err::kerr_subdevice_offline;
  46. *pos = pos16;
  47. return 0;
  48. }
  49. int32_t PreportionalValveCtrl::getValveOrderPos(int32_t valueid, int32_t* pos) {
  50. int32_t ret = 0;
  51. if (valueid > 255 || valueid < 1) {
  52. return err::kerr_invalid_param;
  53. }
  54. uint16_t pos16 = 0;
  55. ret = readReg03(valueid, CTRL_STATE_REG, &pos16);
  56. if (!ret) return err::kerr_subdevice_offline;
  57. *pos = pos16;
  58. return 0;
  59. }
  60. int32_t PreportionalValveCtrl::isBusy(int32_t valueid, int32_t* busy) {
  61. #if 1
  62. int32_t orderpos = 0;
  63. int32_t pos = 0;
  64. int32_t err = 0;
  65. #if 0
  66. err = getValveOrderPos(valueid, &orderpos);
  67. if (err != 0) return err;
  68. #endif
  69. orderpos = m_targetpos[valueid];
  70. err = getValvePos(valueid, &pos);
  71. if (err != 0) return err;
  72. if (abs(m_targetpos[valueid] - pos) <= 11) {
  73. *busy = 0;
  74. } else {
  75. *busy = 1;
  76. }
  77. return 0;
  78. #endif
  79. }
  80. int32_t PreportionalValveCtrl::getValveWorkState(int32_t valueid, int32_t* state) {
  81. int32_t ret = 0;
  82. if (valueid > 255 || valueid < 1) {
  83. return err::kerr_invalid_param;
  84. }
  85. uint16_t state16 = 0;
  86. ret = readReg03(valueid, WORK_STATE_REG, &state16);
  87. if (!ret) return err::kerr_subdevice_offline;
  88. *state = state16;
  89. return 0;
  90. }