You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
4.4 KiB

  1. #include "modbus_processer.h"
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. /***********************485rx**************************/
  5. //接收到了多少数据
  6. volatile uint16_t s_modbus_uart_rx_off = 0;
  7. //当前是否正在处理接收到的数据
  8. volatile bool s_modbus_uart_rx_buf_is_processing = false;
  9. /***********************485tx**************************/
  10. static modbus_processer_t* g_processer;
  11. #define GET_UINT16(uint8) (uint16_t)(((uint16_t)((uint8)[0]) << 8) + (uint8)[1])
  12. void modbus_processer_init(modbus_processer_t* processer) { g_processer = processer; }
  13. void modbus_processer_push_data(uint8_t rxdata) {
  14. if (!s_modbus_uart_rx_buf_is_processing) {
  15. if (s_modbus_uart_rx_off < g_processer->modbus_processer_rx_buf_size) {
  16. g_processer->modbus_processer_rx_buf[s_modbus_uart_rx_off] = rxdata;
  17. s_modbus_uart_rx_off++;
  18. }
  19. }
  20. }
  21. ModbusFunctionCode modbus_get_function_code(modbus_processer_context_t* context) { //
  22. return context->tx->functionCode;
  23. }
  24. void modbus_set_tx_reg_03(modbus_processer_context_t* context, uint16_t regoff, uint16_t regdata) {
  25. uint16_t off = regoff - context->rx->d.O03.startreg;
  26. ModbusCreateTx_setReg(g_processer->modbus_processer_tx_buf, g_processer->modbus_processer_tx_buf_size, off, //
  27. regdata);
  28. }
  29. uint16_t modbus_get_reg_10(modbus_processer_context_t* context, uint16_t regoff) {
  30. uint16_t off = regoff - context->rx->d.O10.startreg;
  31. uint8_t* data = context->rx->d.O10.reg;
  32. if ((off + 1) * 2 <= context->rx->d.O10.bytenum) {
  33. uint16_t u16 = GET_UINT16(&data[off * 2]);
  34. return u16;
  35. } else {
  36. uint16_t u16 = data[off * 2];
  37. return u16;
  38. }
  39. }
  40. bool modbus_if_register_exists_03(modbus_processer_context_t* context, uint16_t regoff) {
  41. uint16_t startreg = context->rx->d.O03.startreg;
  42. uint16_t endreg = context->rx->d.O03.startreg + context->rx->d.O03.numreg;
  43. return regoff >= startreg && regoff < endreg;
  44. }
  45. bool modbus_if_register_exists_10(modbus_processer_context_t* context, uint16_t regoff) {
  46. uint16_t startreg = context->rx->d.O10.startreg;
  47. uint16_t endreg = context->rx->d.O10.startreg + context->rx->d.O10.numreg;
  48. return regoff >= startreg && regoff < endreg;
  49. }
  50. void modbus_send_03(modbus_processer_context_t* context, ModbusStatus modbus_status) {
  51. uint16_t sendlegth = 0;
  52. if (modbus_status == Modbus_OK) {
  53. context->tx->functionCode = context->rx->functionCode;
  54. context->tx->deviceId = g_processer->modbus_device_id;
  55. context->tx->d.O10.regnum = context->rx->d.O10.numreg;
  56. context->tx->d.O10.startreg = context->rx->d.O10.startreg;
  57. //构造回执,并发送
  58. ModbusCreateTxData(g_processer->modbus_processer_tx_buf, g_processer->modbus_processer_tx_buf_size, &sendlegth, context->tx);
  59. g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth);
  60. } else {
  61. //构造异常包并发送
  62. ModbusCreateExceptionData(g_processer->modbus_processer_tx_buf, //
  63. g_processer->modbus_processer_tx_buf_size, //
  64. &sendlegth, //
  65. g_processer->modbus_device_id, //
  66. context->rx->functionCode, //
  67. modbus_status);
  68. g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth);
  69. }
  70. }
  71. void modbus_send_10(modbus_processer_context_t* context, ModbusStatus modbus_status) {
  72. uint16_t sendlegth = 0;
  73. if (modbus_status == Modbus_OK) {
  74. context->tx->functionCode = context->rx->functionCode;
  75. context->tx->deviceId = g_processer->modbus_device_id;
  76. context->tx->d.O10.regnum = context->rx->d.O10.numreg;
  77. context->tx->d.O10.startreg = context->rx->d.O10.startreg;
  78. //构造回执,并发送
  79. ModbusCreateTxData(g_processer->modbus_processer_tx_buf, g_processer->modbus_processer_tx_buf_size, &sendlegth, context->tx);
  80. g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth);
  81. } else {
  82. //构造异常包并发送
  83. ModbusCreateExceptionData(g_processer->modbus_processer_tx_buf, //
  84. g_processer->modbus_processer_tx_buf_size, //
  85. &sendlegth, //
  86. g_processer->modbus_device_id, //
  87. context->rx->functionCode, //
  88. modbus_status);
  89. g_processer->tx(g_processer->modbus_processer_tx_buf, sendlegth);
  90. }
  91. }