modbus_params.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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. mb_param[8].reg = 0x0110;
  50. mb_param[8].size = 2;
  51. mb_param[8].param = (uint8_t*)&input_cnt[0]; // Счетчик ипульсов
  52. mb_param[8].set_handler = NULL;
  53. mb_param[8].check_handler = mb_check_dummy;
  54. mb_param[9].reg = 0x0112;
  55. mb_param[9].size = 2;
  56. mb_param[9].param = (uint8_t*)&input_cnt[0]; // Счетчик ипульсов
  57. mb_param[9].set_handler = NULL;
  58. mb_param[9].check_handler = mb_check_dummy;
  59. mb_param[10].reg = 0x0114;
  60. mb_param[10].size = 2;
  61. mb_param[10].param = (uint8_t*)&input_cnt[0]; // Счетчик ипульсов
  62. mb_param[10].set_handler = NULL;
  63. mb_param[10].check_handler = mb_check_dummy;
  64. mb_param[11].reg = 0x0116;
  65. mb_param[11].size = 2;
  66. mb_param[11].param = (uint8_t*)&input_cnt[0]; // Счетчик ипульсов
  67. mb_param[11].set_handler = NULL;
  68. mb_param[11].check_handler = mb_check_dummy;
  69. mb_param[12].reg = 0x0118;
  70. mb_param[12].size = 2;
  71. mb_param[12].param = (uint8_t*)&input_cnt[0]; // Счетчик ипульсов
  72. mb_param[12].set_handler = NULL;
  73. mb_param[12].check_handler = mb_check_dummy;
  74. mb_param[13].reg = 0x011A;
  75. mb_param[13].size = 2;
  76. mb_param[13].param = (uint8_t*)&input_cnt[0]; // Счетчик ипульсов
  77. mb_param[13].set_handler = NULL;
  78. mb_param[13].check_handler = mb_check_dummy;
  79. mb_param[14].reg = 0x011C;
  80. mb_param[14].size = 2;
  81. mb_param[14].param = (uint8_t*)&input_cnt[0]; // Счетчик ипульсов
  82. mb_param[14].set_handler = NULL;
  83. mb_param[14].check_handler = mb_check_dummy;
  84. mb_param[15].reg = 0x011E;
  85. mb_param[15].size = 2;
  86. mb_param[15].param = (uint8_t*)&input_cnt[0]; // Счетчик ипульсов
  87. mb_param[15].set_handler = NULL;
  88. mb_param[15].check_handler = mb_check_dummy;
  89. }
  90. // Возвращает размер параметра в регистрах
  91. bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size)
  92. {
  93. for (uint16_t i = 0; i < MB_PARAM_MAX; i++)
  94. {
  95. if (mb_param[i].reg == reg)
  96. {
  97. *index = i;
  98. *size = mb_param[i].size;
  99. return true;
  100. }
  101. }
  102. return false;
  103. }
  104. //
  105. mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index)
  106. {
  107. uint8_t *ptr = mb_param[index].param;
  108. // Если параметр только для чтения
  109. if (mb_param[index].check_handler == NULL)
  110. return MB_NO_ACTION;
  111. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  112. {
  113. *ptr = buf[2*mb_param[index].size - 1 - i];
  114. ptr++;
  115. }
  116. /*
  117. if (mb_param[index].check_handler != NULL)
  118. mb_param[index].check_handler();
  119. */
  120. mb_param[index].check_handler();
  121. if (mb_param[index].set_handler != NULL)
  122. return mb_param[index].set_handler();
  123. else
  124. return MB_NO_ACTION;
  125. /*
  126. if (mb_param[index].f_activity)
  127. return mb_param[index].set_handler();
  128. else
  129. return MB_NO_ACTION;
  130. */
  131. }
  132. //
  133. void mb_get_param(uint8_t *buf, uint16_t index)
  134. {
  135. uint8_t *ptr = mb_param[index].param + 2*mb_param[index].size - 1;
  136. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  137. {
  138. *buf = *ptr;
  139. buf++;
  140. ptr--;
  141. }
  142. }
  143. //
  144. uint8_t mb_get_info(uint8_t *buf)
  145. {
  146. char id_str[9] = {0};
  147. char model[6] = {0};
  148. uint32_t id_word;
  149. uint8_t ret = 0; // длина пакета
  150. uint8_t len;
  151. len = strlen("Hello world");
  152. *buf++ = len;
  153. strcpy(buf, "Hello world");
  154. buf += len;
  155. ret = 1 + len;
  156. #if 0
  157. // ------------------------------------------------------------------- //
  158. // Model
  159. // ------------------------------------------------------------------- //
  160. sprintf(model, "%u", sys_settings.model);
  161. len = strlen(model);
  162. *buf++ = len; // Model len
  163. memcpy(buf, model, len);
  164. buf += len;
  165. ret = 1 + len;
  166. // ------------------------------------------------------------------- //
  167. // FW version
  168. // ------------------------------------------------------------------- //
  169. *buf++ = 8; // FW version len
  170. memcpy(buf, sys_settings.fw_version, 8);
  171. buf += 8;
  172. ret += 9;
  173. // ------------------------------------------------------------------- //
  174. // Stm ID
  175. // ------------------------------------------------------------------- //
  176. *buf++ = 24; // STM ID len
  177. id_word = HAL_GetUIDw0();
  178. sprintf(id_str, "%08X", id_word);
  179. len = strlen(id_str);
  180. memcpy(buf, id_str, len);
  181. buf += len;
  182. ret += len;
  183. memset(id_str, 0, 9);
  184. id_word = HAL_GetUIDw1();
  185. sprintf(id_str, "%08X", id_word);
  186. len = strlen(id_str);
  187. memcpy(buf, id_str, len);
  188. buf += len;
  189. ret += len;
  190. memset(id_str, 0, 9);
  191. id_word = HAL_GetUIDw2();
  192. sprintf(id_str, "%08X", id_word);
  193. len = strlen(id_str);
  194. memcpy(buf, id_str, len);
  195. buf += len;
  196. ret += len;
  197. // ------------------------------------------------------------------- //
  198. // Серийник
  199. // ------------------------------------------------------------------- //
  200. id_word = sys_settings.serial;
  201. sprintf(id_str, "%u", id_word);
  202. len = strlen(id_str);
  203. *buf++ = len;
  204. memcpy(buf, id_str, len);
  205. ret += len;
  206. #endif
  207. return ret;
  208. }
  209. // -------------------------------------------------------------------------- //
  210. // Проверка параметров //
  211. // -------------------------------------------------------------------------- //
  212. //
  213. void mb_check_dummy(void)
  214. {
  215. }