modbus_params.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  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 "input.h"
  8. #include "output.h"
  9. #include "log.h"
  10. #include <string.h>
  11. mb_param_t mb_param[MB_PARAM_MAX];
  12. uint32_t rtc_sinhro;
  13. uint16_t psw; // Пароль для установки системных настроек
  14. bool psw_ok = false;
  15. void get_time(uint8_t* buf, uint8_t size);
  16. void get_din_mode(uint8_t* buf, uint8_t size);
  17. void get_log_entries_number(uint8_t* buf, uint8_t size);
  18. void get_archive_entries_number(uint8_t* buf, uint8_t size);
  19. //
  20. void mb_init_params(void)
  21. {
  22. uint16_t index = 0;
  23. uint16_t addr = 0;
  24. mb_param[index].reg = 0x0100;
  25. mb_param[index].size = 1;
  26. mb_param[index].param = (uint8_t*)&input_state_bit; // Текущее состояние входа
  27. mb_param[index].set = NULL;
  28. mb_param[index].get = NULL;
  29. mb_param[index].check_handler = mb_check_dummy;
  30. index++;
  31. // Счетчики импульсов. Регистры 0x0102 - 0x0111
  32. addr = 0x0102;
  33. for (int i = 0; i < DI_NUMBER; i++)
  34. {
  35. mb_param[index].reg = addr;
  36. mb_param[index].size = 2;
  37. mb_param[index].param = (uint8_t*)&input_cnt[i]; // Счетчик ипульсов
  38. mb_param[index].set = NULL;
  39. mb_param[index].get = NULL;
  40. mb_param[index].check_handler = mb_check_dummy;
  41. addr += 2;
  42. index++;
  43. }
  44. // Режим работы входов
  45. mb_param[index].reg = 0x0120;
  46. mb_param[index].size = 1;
  47. mb_param[index].param = (uint8_t*)&settings.di_mode_bits;
  48. mb_param[index].set = mb_set_din_mode;
  49. mb_param[index].get = NULL;
  50. mb_param[index].check_handler = mb_check_dummy;
  51. index++;
  52. // Нормальное состояние входов
  53. mb_param[index].reg = 0x0122;
  54. mb_param[index].size = 1;
  55. mb_param[index].param = (uint8_t*)&settings.di_norm_state_bits;
  56. mb_param[index].set = NULL;
  57. mb_param[index].get = NULL;
  58. mb_param[index].check_handler = mb_check_dummy;
  59. index++;
  60. // Счетчики импульсов. Регистры 0x0102 - 0x0111
  61. addr = 0x0124;
  62. for (int i = 0; i < DI_NUMBER; i++)
  63. {
  64. mb_param[index].reg = addr;
  65. mb_param[index].size = 1;
  66. mb_param[index].param = (uint8_t*)&settings.di_debounce[i]; // Счетчик ипульсов
  67. mb_param[index].set = NULL;
  68. mb_param[index].get = NULL;
  69. mb_param[index].check_handler = mb_check_dummy;
  70. addr++;
  71. index++;
  72. }
  73. // Текущее состояние выходов
  74. mb_param[index].reg = 0x0200;
  75. mb_param[index].size = 1;
  76. mb_param[index].param = (uint8_t*)&output_state_bit;
  77. mb_param[index].set = mb_set_do;
  78. mb_param[index].get = NULL;
  79. mb_param[index].check_handler = mb_check_dummy;
  80. index++;
  81. // Режим работы выходов
  82. mb_param[index].reg = 0x0202;
  83. mb_param[index].size = 1;
  84. mb_param[index].param = (uint8_t*)&output_mode_bit;
  85. mb_param[index].set = mb_set_do_mode;
  86. mb_param[index].get = NULL;
  87. mb_param[index].check_handler = mb_check_dummy;
  88. index++;
  89. // Состояние выходов в безопасном режиме
  90. mb_param[index].reg = 0x0203;
  91. mb_param[index].size = 1;
  92. mb_param[index].param = (uint8_t*)&settings.do_save_bits;
  93. mb_param[index].set = mb_set_do;
  94. mb_param[index].get = NULL;
  95. mb_param[index].check_handler = mb_check_dummy;
  96. index++;
  97. // Заполнение PWM. Регистры 0x0210 - 0x0217
  98. addr = 0x0210;
  99. for (int i = 0; i < DO_NUMBER; i++)
  100. {
  101. mb_param[index].reg = addr;
  102. mb_param[index].size = 1;
  103. mb_param[index].param = (uint8_t*)&output_pwm[i]; // Счетчик ипульсов
  104. mb_param[index].set = mb_set_do;
  105. mb_param[index].get = NULL;
  106. mb_param[index].check_handler = mb_check_dummy;
  107. addr++;
  108. index++;
  109. }
  110. // Заполнение PWM в безопасном режиме. Регистры 0x0220 - 0x0227
  111. addr = 0x0220;
  112. for (int i = 0; i < DO_NUMBER; i++)
  113. {
  114. mb_param[index].reg = addr;
  115. mb_param[index].size = 1;
  116. mb_param[index].param = (uint8_t*)&output_pwm_save[i]; // Счетчик ипульсов
  117. mb_param[index].set = mb_set_do;
  118. mb_param[index].get = NULL;
  119. mb_param[index].check_handler = mb_check_dummy;
  120. addr++;
  121. index++;
  122. }
  123. // Период PWM. Регистры 0x0220 - 0x0227
  124. addr = 0x0230;
  125. for (int i = 0; i < DO_NUMBER; i++)
  126. {
  127. mb_param[index].reg = addr;
  128. mb_param[index].size = 1;
  129. mb_param[index].param = (uint8_t*)&output_pwm_period[i]; // Счетчик ипульсов
  130. mb_param[index].set = mb_set_do;
  131. mb_param[index].get = NULL;
  132. mb_param[index].check_handler = mb_check_dummy;
  133. addr++;
  134. index++;
  135. }
  136. // Период PWM. Регистры 0x0220 - 0x0227
  137. addr = 0x0240;
  138. for (int i = 0; i < DO_NUMBER; i++)
  139. {
  140. mb_param[index].reg = addr;
  141. mb_param[index].size = 1;
  142. mb_param[index].param = (uint8_t*)&output_pwm_period_save[i]; // Счетчик ипульсов
  143. mb_param[index].set = mb_set_do;
  144. mb_param[index].get = NULL;
  145. mb_param[index].check_handler = mb_check_dummy;
  146. addr++;
  147. index++;
  148. }
  149. // Журналы/рахивы
  150. // Емкость журнала (максимальная)
  151. mb_param[index].reg = 0x0900;
  152. mb_param[index].size = 1;
  153. mb_param[index].param = (uint8_t*)&log_entries_capacity; //
  154. mb_param[index].set = NULL;
  155. mb_param[index].get = NULL;
  156. mb_param[index].check_handler = mb_check_dummy;
  157. index++;
  158. // Текущее количество записей в журнале
  159. mb_param[index].reg = 0x0901;
  160. mb_param[index].size = 1;
  161. mb_param[index].param = NULL; //
  162. mb_param[index].set = NULL;
  163. mb_param[index].get = get_log_entries_number;
  164. mb_param[index].check_handler = mb_check_dummy;
  165. index++;
  166. // Емкость архива (максимальная)
  167. mb_param[index].reg = 0x0902;
  168. mb_param[index].size = 1;
  169. mb_param[index].param = (uint8_t*)&archive_entries_capacity; //
  170. mb_param[index].set = NULL;
  171. mb_param[index].get = NULL;
  172. mb_param[index].check_handler = mb_check_dummy;
  173. index++;
  174. // Текущее количество записей в архиве
  175. mb_param[index].reg = 0x0903;
  176. mb_param[index].size = 1;
  177. mb_param[index].param = NULL; //
  178. mb_param[index].set = NULL;
  179. mb_param[index].get = get_archive_entries_number;
  180. mb_param[index].check_handler = mb_check_dummy;
  181. index++;
  182. // ---------------------------------------------------------------------- //
  183. // Системные настройки
  184. // ---------------------------------------------------------------------- //
  185. // Пароль
  186. mb_param[index].reg = 0x008A;
  187. mb_param[index].size = 1;
  188. mb_param[index].param = (uint8_t*)&psw; //
  189. mb_param[index].set = mb_password;
  190. mb_param[index].get = NULL;
  191. mb_param[index].check_handler = mb_check_dummy;
  192. index++;
  193. }
  194. // Возвращает размер параметра в регистрах
  195. bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size)
  196. {
  197. for (uint16_t i = 0; i < MB_PARAM_MAX; i++)
  198. {
  199. if (mb_param[i].reg == reg)
  200. {
  201. *index = i;
  202. *size = mb_param[i].size;
  203. return true;
  204. }
  205. }
  206. return false;
  207. }
  208. //
  209. mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index)
  210. {
  211. uint8_t *ptr = mb_param[index].param;
  212. // Если параметр только для чтения
  213. if (mb_param[index].check_handler == NULL)
  214. return MB_NO_ACTION;
  215. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  216. {
  217. *ptr = buf[2*mb_param[index].size - 1 - i];
  218. ptr++;
  219. }
  220. /*
  221. if (mb_param[index].check_handler != NULL)
  222. mb_param[index].check_handler();
  223. */
  224. mb_param[index].check_handler();
  225. if (mb_param[index].set != NULL)
  226. return mb_param[index].set();
  227. else
  228. return MB_NO_ACTION;
  229. /*
  230. if (mb_param[index].f_activity)
  231. return mb_param[index].set_handler();
  232. else
  233. return MB_NO_ACTION;
  234. */
  235. }
  236. //
  237. void mb_get_param(uint8_t *buf, uint16_t index)
  238. {
  239. uint8_t *ptr;
  240. if (mb_param[index].get != NULL) {
  241. mb_param[index].get(buf, mb_param[index].size);
  242. return;
  243. }
  244. ptr = mb_param[index].param + 2*mb_param[index].size - 1;
  245. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  246. {
  247. *buf = *ptr;
  248. buf++;
  249. ptr--;
  250. }
  251. }
  252. // -------------------------------------------------------------------------- //
  253. // Чтение параметров
  254. // -------------------------------------------------------------------------- //
  255. void get_time(uint8_t* buf, uint8_t size)
  256. {
  257. uint32_t rtc_unix = RTC_GetUnixTime();
  258. uint8_t *ptr = (uint8_t*)&rtc_unix + 2*size - 1;
  259. for (uint16_t i = 0; i < 2*size; i++)
  260. {
  261. *buf = *ptr;
  262. buf++;
  263. ptr--;
  264. }
  265. }
  266. //
  267. void get_din_mode(uint8_t* buf, uint8_t size)
  268. {
  269. }
  270. //
  271. void get_log_entries_number(uint8_t* buf, uint8_t size)
  272. {
  273. uint16_t capacity = log_capacity();
  274. SWAP_16(buf, capacity);
  275. }
  276. //
  277. void get_archive_entries_number(uint8_t* buf, uint8_t size)
  278. {
  279. uint16_t capacity = log_arch_capacity();
  280. SWAP_16(buf, capacity);
  281. }
  282. // -------------------------------------------------------------------------- //
  283. // Установка параметров
  284. // -------------------------------------------------------------------------- //
  285. //
  286. mb_delay_action_t mb_set_din_mode(void)
  287. {
  288. in_set();
  289. return MB_NO_ACTION;
  290. }
  291. //
  292. mb_delay_action_t mb_set_do(void)
  293. {
  294. //do_set();
  295. do_set_common();
  296. return MB_NO_ACTION;
  297. }
  298. //
  299. mb_delay_action_t mb_set_do_mode(void)
  300. {
  301. do_set_mode();
  302. return MB_NO_ACTION;
  303. }
  304. //
  305. mb_delay_action_t mb_set_time(void)
  306. {
  307. TM_RTC_SetDataTimeUnix(rtc_sinhro);
  308. return MB_NO_ACTION;
  309. }
  310. //
  311. mb_delay_action_t mb_password(void)
  312. {
  313. if (psw != MB_PASSWORD)
  314. return MB_PAS_ERR;
  315. else {
  316. if (psw_ok == false) {
  317. psw_ok = true;
  318. return MB_PAS_OK;
  319. }
  320. else
  321. return MB_NO_ACTION;
  322. }
  323. }
  324. // -------------------------------------------------------------------------- //
  325. // Проверка параметров //
  326. // -------------------------------------------------------------------------- //
  327. //
  328. void mb_check_dummy(void)
  329. {
  330. }