modbus_params.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include "at32f403a_407.h"
  2. #include "modbus_params.h"
  3. #include "settings_api.h"
  4. #include "io.h"
  5. #include "uptime.h"
  6. #include "rtc.h"
  7. #include <string.h>
  8. mb_param_t mb_param[MB_PARAM_MAX];
  9. uint32_t rtc_sinhro;
  10. void get_time(uint8_t* buf, uint8_t size);
  11. void get_din_mode(uint8_t* buf, uint8_t size);
  12. //
  13. void mb_init_params(void)
  14. {
  15. uint16_t index = 0;
  16. uint16_t addr = 0;
  17. mb_param[index].reg = 0x0100;
  18. mb_param[index].size = 1;
  19. mb_param[index].param = (uint8_t*)&input_state_bit; // Текущее состояние входа
  20. mb_param[index].set = NULL;
  21. mb_param[index].get = NULL;
  22. mb_param[index].check_handler = mb_check_dummy;
  23. index++;
  24. // Счетчики импульсов. Регистры 0x0102 - 0x0111
  25. addr = 0x0102;
  26. for (int i = 0; i < DI_NUMBER; i++)
  27. {
  28. input_cnt[i] = i;
  29. mb_param[index].reg = addr;
  30. mb_param[index].size = 2;
  31. mb_param[index].param = (uint8_t*)&input_cnt[i]; // Счетчик ипульсов
  32. mb_param[index].set = NULL;
  33. mb_param[index].get = NULL;
  34. mb_param[index].check_handler = mb_check_dummy;
  35. addr += 2;
  36. index++;
  37. }
  38. mb_param[index].reg = 0x0120;
  39. mb_param[index].size = 1;
  40. mb_param[index].param = (uint8_t*)&settings.mode_bits; // Режим работы входов
  41. mb_param[index].set = NULL;
  42. mb_param[index].get = NULL;
  43. mb_param[index].check_handler = mb_check_dummy;
  44. index++;
  45. // TODO Пока дублируем
  46. mb_param[index].reg = 0x0122;
  47. mb_param[index].size = 1;
  48. mb_param[index].param = (uint8_t*)&settings.norm_state_bits; // Нормальное состояние входов
  49. mb_param[index].set = NULL;
  50. mb_param[index].get = NULL;
  51. mb_param[index].check_handler = mb_check_dummy;
  52. index++;
  53. }
  54. // Возвращает размер параметра в регистрах
  55. bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size)
  56. {
  57. for (uint16_t i = 0; i < MB_PARAM_MAX; i++)
  58. {
  59. if (mb_param[i].reg == reg)
  60. {
  61. *index = i;
  62. *size = mb_param[i].size;
  63. return true;
  64. }
  65. }
  66. return false;
  67. }
  68. //
  69. mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index)
  70. {
  71. uint8_t *ptr = mb_param[index].param;
  72. // Если параметр только для чтения
  73. if (mb_param[index].check_handler == NULL)
  74. return MB_NO_ACTION;
  75. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  76. {
  77. *ptr = buf[2*mb_param[index].size - 1 - i];
  78. ptr++;
  79. }
  80. /*
  81. if (mb_param[index].check_handler != NULL)
  82. mb_param[index].check_handler();
  83. */
  84. mb_param[index].check_handler();
  85. if (mb_param[index].set != NULL)
  86. return mb_param[index].set();
  87. else
  88. return MB_NO_ACTION;
  89. /*
  90. if (mb_param[index].f_activity)
  91. return mb_param[index].set_handler();
  92. else
  93. return MB_NO_ACTION;
  94. */
  95. }
  96. //
  97. void mb_get_param(uint8_t *buf, uint16_t index)
  98. {
  99. uint8_t *ptr;
  100. if (mb_param[index].get != NULL) {
  101. mb_param[index].get(buf, mb_param[index].size);
  102. return;
  103. }
  104. ptr = mb_param[index].param + 2*mb_param[index].size - 1;
  105. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  106. {
  107. *buf = *ptr;
  108. buf++;
  109. ptr--;
  110. }
  111. }
  112. // -------------------------------------------------------------------------- //
  113. // Чтение параметров
  114. // -------------------------------------------------------------------------- //
  115. void get_time(uint8_t* buf, uint8_t size)
  116. {
  117. uint32_t rtc_unix = RTC_GetUnixTime();
  118. uint8_t *ptr = (uint8_t*)&rtc_unix + 2*size - 1;
  119. for (uint16_t i = 0; i < 2*size; i++)
  120. {
  121. *buf = *ptr;
  122. buf++;
  123. ptr--;
  124. }
  125. }
  126. //
  127. void get_din_mode(uint8_t* buf, uint8_t size)
  128. {
  129. }
  130. // -------------------------------------------------------------------------- //
  131. // Установка параметров
  132. // -------------------------------------------------------------------------- //
  133. //
  134. mb_delay_action_t set_din_mode(void)
  135. {
  136. return MB_NO_ACTION;
  137. }
  138. //
  139. mb_delay_action_t mb_set_time(void)
  140. {
  141. TM_RTC_SetDataTimeUnix(rtc_sinhro);
  142. return MB_NO_ACTION;
  143. }
  144. // -------------------------------------------------------------------------- //
  145. // Проверка параметров //
  146. // -------------------------------------------------------------------------- //
  147. //
  148. void mb_check_dummy(void)
  149. {
  150. }