sample_mb_master.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-06-21 flybreak first version
  9. */
  10. #include <rtthread.h>
  11. #include "mb.h"
  12. #include "mb_m.h"
  13. #ifdef PKG_MODBUS_MASTER_SAMPLE
  14. #define SLAVE_ADDR MB_SAMPLE_TEST_SLAVE_ADDR
  15. #define PORT_NUM MB_MASTER_USING_PORT_NUM
  16. #define PORT_BAUDRATE MB_MASTER_USING_PORT_BAUDRATE
  17. #else
  18. #define SLAVE_ADDR 0x01
  19. #define PORT_NUM 3
  20. #define PORT_BAUDRATE 115200
  21. #endif
  22. #define PORT_PARITY MB_PAR_EVEN
  23. #define MB_POLL_THREAD_PRIORITY 10
  24. #define MB_SEND_THREAD_PRIORITY RT_THREAD_PRIORITY_MAX - 1
  25. #define MB_SEND_REG_START 2
  26. #define MB_SEND_REG_NUM 2
  27. #define MB_POLL_CYCLE_MS 500
  28. static void send_thread_entry(void *parameter)
  29. {
  30. eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;
  31. rt_uint16_t error_count = 0;
  32. USHORT data[MB_SEND_REG_NUM] = {0};
  33. while (1)
  34. {
  35. /* Test Modbus Master */
  36. data[0] = (USHORT)(rt_tick_get() / 10);
  37. data[1] = (USHORT)(rt_tick_get() % 10);
  38. error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR, /* salve address */
  39. MB_SEND_REG_START, /* register start address */
  40. MB_SEND_REG_NUM, /* register total number */
  41. data, /* data to be written */
  42. RT_WAITING_FOREVER); /* timeout */
  43. /* Record the number of errors */
  44. if (error_code != MB_MRE_NO_ERR)
  45. {
  46. error_count++;
  47. }
  48. }
  49. }
  50. static void mb_master_poll(void *parameter)
  51. {
  52. eMBMasterInit(MB_RTU, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);
  53. eMBMasterEnable();
  54. while (1)
  55. {
  56. eMBMasterPoll();
  57. rt_thread_mdelay(MB_POLL_CYCLE_MS);
  58. }
  59. }
  60. static int mb_master_samlpe(int argc, char **argv)
  61. {
  62. static rt_uint8_t is_init = 0;
  63. rt_thread_t tid1 = RT_NULL, tid2 = RT_NULL;
  64. if (is_init > 0)
  65. {
  66. rt_kprintf("sample is running\n");
  67. return -RT_ERROR;
  68. }
  69. tid1 = rt_thread_create("md_m_poll", mb_master_poll, RT_NULL, 512, MB_POLL_THREAD_PRIORITY, 10);
  70. if (tid1 != RT_NULL)
  71. {
  72. rt_thread_startup(tid1);
  73. }
  74. else
  75. {
  76. goto __exit;
  77. }
  78. tid2 = rt_thread_create("md_m_send", send_thread_entry, RT_NULL, 512, MB_SEND_THREAD_PRIORITY, 10);
  79. if (tid2 != RT_NULL)
  80. {
  81. rt_thread_startup(tid2);
  82. }
  83. else
  84. {
  85. goto __exit;
  86. }
  87. is_init = 1;
  88. return RT_EOK;
  89. __exit:
  90. if (tid1)
  91. rt_thread_delete(tid1);
  92. if (tid2)
  93. rt_thread_delete(tid2);
  94. return -RT_ERROR;
  95. }
  96. MSH_CMD_EXPORT(mb_master_samlpe, run a modbus master sample);