modbus_params.c 4.6 KB

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