modbus_params.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #include "at32f403a_407.h"
  2. #include "modbus_params.h"
  3. #include "io.h"
  4. #include <string.h>
  5. mb_param_t mb_param[MB_PARAM_MAX];
  6. //
  7. void mb_init_params(void)
  8. {
  9. mb_param[0].reg = 0x0100;
  10. mb_param[0].size = 1;
  11. mb_param[0].param = (uint8_t*)&input_state[0];
  12. mb_param[0].set_handler = NULL;
  13. mb_param[0].check_handler = mb_check_dummy;
  14. mb_param[1].reg = 0x0101;
  15. mb_param[1].size = 1;
  16. mb_param[1].param = (uint8_t*)&input_state[1];
  17. mb_param[1].set_handler = NULL;
  18. mb_param[1].check_handler = mb_check_dummy;
  19. mb_param[2].reg = 0x0102;
  20. mb_param[2].size = 1;
  21. mb_param[2].param = (uint8_t*)&input_state[2];
  22. mb_param[2].set_handler = NULL;
  23. mb_param[2].check_handler = mb_check_dummy;
  24. mb_param[3].reg = 0x0103;
  25. mb_param[3].size = 1;
  26. mb_param[3].param = (uint8_t*)&input_state[3];
  27. mb_param[3].set_handler = NULL;
  28. mb_param[3].check_handler = mb_check_dummy;
  29. mb_param[4].reg = 0x0104;
  30. mb_param[4].size = 1;
  31. mb_param[4].param = (uint8_t*)&input_state[4];
  32. mb_param[4].set_handler = NULL;
  33. mb_param[4].check_handler = mb_check_dummy;
  34. mb_param[5].reg = 0x0105;
  35. mb_param[5].size = 1;
  36. mb_param[5].param = (uint8_t*)&input_state[5];
  37. mb_param[5].set_handler = NULL;
  38. mb_param[5].check_handler = mb_check_dummy;
  39. mb_param[6].reg = 0x0106;
  40. mb_param[6].size = 1;
  41. mb_param[6].param = (uint8_t*)&input_state[6];
  42. mb_param[6].set_handler = NULL;
  43. mb_param[6].check_handler = mb_check_dummy;
  44. mb_param[7].reg = 0x0107;
  45. mb_param[7].size = 1;
  46. mb_param[7].param = (uint8_t*)&input_state[7];
  47. mb_param[7].set_handler = NULL;
  48. mb_param[7].check_handler = mb_check_dummy;
  49. }
  50. // Возвращает размер параметра в регистрах
  51. bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size)
  52. {
  53. for (uint16_t i = 0; i < MB_PARAM_MAX; i++)
  54. {
  55. if (mb_param[i].reg == reg)
  56. {
  57. *index = i;
  58. *size = mb_param[i].size;
  59. return true;
  60. }
  61. }
  62. return false;
  63. }
  64. //
  65. mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index)
  66. {
  67. uint8_t *ptr = mb_param[index].param;
  68. // Если параметр только для чтения
  69. if (mb_param[index].check_handler == NULL)
  70. return MB_NO_ACTION;
  71. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  72. {
  73. *ptr = buf[2*mb_param[index].size - 1 - i];
  74. ptr++;
  75. }
  76. /*
  77. if (mb_param[index].check_handler != NULL)
  78. mb_param[index].check_handler();
  79. */
  80. mb_param[index].check_handler();
  81. if (mb_param[index].set_handler != NULL)
  82. return mb_param[index].set_handler();
  83. else
  84. return MB_NO_ACTION;
  85. /*
  86. if (mb_param[index].f_activity)
  87. return mb_param[index].set_handler();
  88. else
  89. return MB_NO_ACTION;
  90. */
  91. }
  92. //
  93. void mb_get_param(uint8_t *buf, uint16_t index)
  94. {
  95. uint8_t *ptr = mb_param[index].param + 2*mb_param[index].size - 1;
  96. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  97. {
  98. *buf = *ptr;
  99. buf++;
  100. ptr--;
  101. }
  102. }
  103. //
  104. uint8_t mb_get_info(uint8_t *buf)
  105. {
  106. char id_str[9] = {0};
  107. char model[6] = {0};
  108. uint32_t id_word;
  109. uint8_t ret = 0; // длина пакета
  110. uint8_t len;
  111. len = strlen("Hello world");
  112. *buf++ = len;
  113. strcpy(buf, "Hello world");
  114. buf += len;
  115. ret = 1 + len;
  116. #if 0
  117. // ------------------------------------------------------------------- //
  118. // Model
  119. // ------------------------------------------------------------------- //
  120. sprintf(model, "%u", sys_settings.model);
  121. len = strlen(model);
  122. *buf++ = len; // Model len
  123. memcpy(buf, model, len);
  124. buf += len;
  125. ret = 1 + len;
  126. // ------------------------------------------------------------------- //
  127. // FW version
  128. // ------------------------------------------------------------------- //
  129. *buf++ = 8; // FW version len
  130. memcpy(buf, sys_settings.fw_version, 8);
  131. buf += 8;
  132. ret += 9;
  133. // ------------------------------------------------------------------- //
  134. // Stm ID
  135. // ------------------------------------------------------------------- //
  136. *buf++ = 24; // STM ID len
  137. id_word = HAL_GetUIDw0();
  138. sprintf(id_str, "%08X", id_word);
  139. len = strlen(id_str);
  140. memcpy(buf, id_str, len);
  141. buf += len;
  142. ret += len;
  143. memset(id_str, 0, 9);
  144. id_word = HAL_GetUIDw1();
  145. sprintf(id_str, "%08X", id_word);
  146. len = strlen(id_str);
  147. memcpy(buf, id_str, len);
  148. buf += len;
  149. ret += len;
  150. memset(id_str, 0, 9);
  151. id_word = HAL_GetUIDw2();
  152. sprintf(id_str, "%08X", id_word);
  153. len = strlen(id_str);
  154. memcpy(buf, id_str, len);
  155. buf += len;
  156. ret += len;
  157. // ------------------------------------------------------------------- //
  158. // Серийник
  159. // ------------------------------------------------------------------- //
  160. id_word = sys_settings.serial;
  161. sprintf(id_str, "%u", id_word);
  162. len = strlen(id_str);
  163. *buf++ = len;
  164. memcpy(buf, id_str, len);
  165. ret += len;
  166. #endif
  167. return ret;
  168. }
  169. // -------------------------------------------------------------------------- //
  170. // Проверка параметров //
  171. // -------------------------------------------------------------------------- //
  172. //
  173. void mb_check_dummy(void)
  174. {
  175. }