modbus_params.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "at32f403a_407.h"
  2. #include "modbus_params.h"
  3. #include <string.h>
  4. mb_param_t mb_param[MB_PARAM_MAX];
  5. //
  6. void mb_init_params(void)
  7. {
  8. uint16_t foo = 12345;
  9. mb_param[0].reg = 0x0100;
  10. mb_param[0].size = 1;
  11. mb_param[0].param = (uint8_t*)&foo;
  12. mb_param[0].set_handler = NULL;
  13. mb_param[0].check_handler = mb_check_dummy;
  14. }
  15. // Возвращает размер параметра в регистрах
  16. bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size)
  17. {
  18. for (uint16_t i = 0; i < MB_PARAM_MAX; i++)
  19. {
  20. if (mb_param[i].reg == reg)
  21. {
  22. *index = i;
  23. *size = mb_param[i].size;
  24. return true;
  25. }
  26. }
  27. return false;
  28. }
  29. //
  30. mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index)
  31. {
  32. uint8_t *ptr = mb_param[index].param;
  33. // Если параметр только для чтения
  34. if (mb_param[index].check_handler == NULL)
  35. return MB_NO_ACTION;
  36. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  37. {
  38. *ptr = buf[2*mb_param[index].size - 1 - i];
  39. ptr++;
  40. }
  41. /*
  42. if (mb_param[index].check_handler != NULL)
  43. mb_param[index].check_handler();
  44. */
  45. mb_param[index].check_handler();
  46. if (mb_param[index].set_handler != NULL)
  47. return mb_param[index].set_handler();
  48. else
  49. return MB_NO_ACTION;
  50. /*
  51. if (mb_param[index].f_activity)
  52. return mb_param[index].set_handler();
  53. else
  54. return MB_NO_ACTION;
  55. */
  56. }
  57. //
  58. void mb_get_param(uint8_t *buf, uint16_t index)
  59. {
  60. uint8_t *ptr = mb_param[index].param + 2*mb_param[index].size - 1;
  61. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  62. {
  63. *buf = *ptr;
  64. buf++;
  65. ptr--;
  66. }
  67. }
  68. // -------------------------------------------------------------------------- //
  69. // Проверка параметров //
  70. // -------------------------------------------------------------------------- //
  71. //
  72. void mb_check_dummy(void)
  73. {
  74. }