sample_mb_slave.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * Copyright (c) 2006-2018, 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 "user_mb_app.h"
  13. #ifdef PKG_MODBUS_SLAVE_SAMPLE
  14. #define SLAVE_ADDR MB_SAMPLE_SLAVE_ADDR
  15. #define PORT_NUM MB_SLAVE_USING_PORT_NUM
  16. #define PORT_BAUDRATE MB_SLAVE_USING_PORT_BAUDRATE
  17. #else
  18. #define SLAVE_ADDR 0x01
  19. #define PORT_NUM 2
  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_POLL_CYCLE_MS 200
  26. extern USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS];
  27. static void send_thread_entry(void *parameter)
  28. {
  29. USHORT *usRegHoldingBuf;
  30. usRegHoldingBuf = usSRegHoldBuf;
  31. rt_base_t level;
  32. while (1)
  33. {
  34. /* Test Modbus Master */
  35. level = rt_hw_interrupt_disable();
  36. usRegHoldingBuf[3] = (USHORT)(rt_tick_get() / 100);
  37. rt_hw_interrupt_enable(level);
  38. rt_thread_mdelay(1000);
  39. }
  40. }
  41. static void mb_slave_poll(void *parameter)
  42. {
  43. if (rt_strstr(parameter, "RTU"))
  44. {
  45. #ifdef PKG_MODBUS_SLAVE_RTU
  46. eMBInit(MB_RTU, SLAVE_ADDR, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);
  47. #else
  48. rt_kprintf("Error: Please open RTU mode first");
  49. #endif
  50. }
  51. else if (rt_strstr(parameter, "ASCII"))
  52. {
  53. #ifdef PKG_MODBUS_SLAVE_ASCII
  54. eMBInit(MB_ASCII, SLAVE_ADDR, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);
  55. #else
  56. rt_kprintf("Error: Please open ASCII mode first");
  57. #endif
  58. }
  59. else if (rt_strstr(parameter, "TCP"))
  60. {
  61. #ifdef PKG_MODBUS_SLAVE_TCP
  62. eMBTCPInit(0);
  63. #else
  64. rt_kprintf("Error: Please open TCP mode first");
  65. #endif
  66. }
  67. else
  68. {
  69. rt_kprintf("Error: unknown parameter");
  70. }
  71. eMBEnable();
  72. while (1)
  73. {
  74. eMBPoll();
  75. rt_thread_mdelay(MB_POLL_CYCLE_MS);
  76. }
  77. }
  78. static int mb_slave_samlpe(int argc, char **argv)
  79. {
  80. static rt_uint8_t is_init = 0;
  81. rt_thread_t tid1 = RT_NULL, tid2 = RT_NULL;
  82. if (is_init > 0)
  83. {
  84. rt_kprintf("sample is running\n");
  85. return -RT_ERROR;
  86. }
  87. if (argc < 2)
  88. {
  89. rt_kprintf("Usage: mb_slave_samlpe RTU/ASCII/TCP\n");
  90. return -1;
  91. }
  92. tid1 = rt_thread_create("md_s_poll", mb_slave_poll, argv[1], 1024, MB_POLL_THREAD_PRIORITY, 10);
  93. if (tid1 != RT_NULL)
  94. {
  95. rt_thread_startup(tid1);
  96. }
  97. else
  98. {
  99. goto __exit;
  100. }
  101. tid2 = rt_thread_create("md_s_send", send_thread_entry, RT_NULL, 512, MB_SEND_THREAD_PRIORITY, 10);
  102. if (tid2 != RT_NULL)
  103. {
  104. rt_thread_startup(tid2);
  105. }
  106. else
  107. {
  108. goto __exit;
  109. }
  110. is_init = 1;
  111. return RT_EOK;
  112. __exit:
  113. if (tid1)
  114. rt_thread_delete(tid1);
  115. if (tid2)
  116. rt_thread_delete(tid2);
  117. return -RT_ERROR;
  118. }
  119. MSH_CMD_EXPORT(mb_slave_samlpe, run a modbus slave sample);