| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*
- * Copyright (c) 2006-2022, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2019-06-21 flybreak first version
- */
- #include <rtthread.h>
- #include "mb.h"
- #include "user_mb_app.h"
- #ifdef PKG_MODBUS_SLAVE_SAMPLE
- #define SLAVE_ADDR MB_SAMPLE_SLAVE_ADDR
- #define PORT_NUM MB_SLAVE_USING_PORT_NUM
- #define PORT_BAUDRATE MB_SLAVE_USING_PORT_BAUDRATE
- #else
- #define SLAVE_ADDR 0x01
- #define PORT_NUM 2
- #define PORT_BAUDRATE 115200
- #endif
- #define PORT_PARITY MB_PAR_EVEN
- #define MB_POLL_THREAD_PRIORITY 10
- #define MB_SEND_THREAD_PRIORITY RT_THREAD_PRIORITY_MAX - 1
- #define MB_POLL_CYCLE_MS 200
- extern USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS];
- static void send_thread_entry(void *parameter)
- {
- USHORT *usRegHoldingBuf;
- usRegHoldingBuf = usSRegHoldBuf;
- rt_base_t level;
- while (1)
- {
- /* Test Modbus Master */
- level = rt_hw_interrupt_disable();
- usRegHoldingBuf[3] = (USHORT)(rt_tick_get() / 100);
- rt_hw_interrupt_enable(level);
- rt_thread_mdelay(1000);
- }
- }
- static void mb_slave_poll(void *parameter)
- {
- if (rt_strstr(parameter, "RTU"))
- {
- #ifdef PKG_MODBUS_SLAVE_RTU
- eMBInit(MB_RTU, SLAVE_ADDR, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);
- #else
- rt_kprintf("Error: Please open RTU mode first");
- #endif
- }
- else if (rt_strstr(parameter, "ASCII"))
- {
- #ifdef PKG_MODBUS_SLAVE_ASCII
- eMBInit(MB_ASCII, SLAVE_ADDR, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);
- #else
- rt_kprintf("Error: Please open ASCII mode first");
- #endif
- }
- else if (rt_strstr(parameter, "TCP"))
- {
- #ifdef PKG_MODBUS_SLAVE_TCP
- eMBTCPInit(0);
- #else
- rt_kprintf("Error: Please open TCP mode first");
- #endif
- }
- else
- {
- rt_kprintf("Error: unknown parameter");
- }
- eMBEnable();
- while (1)
- {
- eMBPoll();
- rt_thread_mdelay(MB_POLL_CYCLE_MS);
- }
- }
- static int mb_slave_sample(int argc, char **argv)
- {
- static rt_uint8_t is_init = 0;
- rt_thread_t tid1 = RT_NULL, tid2 = RT_NULL;
- if (is_init > 0)
- {
- rt_kprintf("sample is running\n");
- return -RT_ERROR;
- }
- if (argc < 2)
- {
- rt_kprintf("Usage: mb_slave_sample RTU/ASCII/TCP\n");
- return -1;
- }
- tid1 = rt_thread_create("md_s_poll", mb_slave_poll, argv[1], 1024, MB_POLL_THREAD_PRIORITY, 10);
- if (tid1 != RT_NULL)
- {
- rt_thread_startup(tid1);
- }
- else
- {
- goto __exit;
- }
- tid2 = rt_thread_create("md_s_send", send_thread_entry, RT_NULL, 512, MB_SEND_THREAD_PRIORITY, 10);
- if (tid2 != RT_NULL)
- {
- rt_thread_startup(tid2);
- }
- else
- {
- goto __exit;
- }
- is_init = 1;
- return RT_EOK;
- __exit:
- if (tid1)
- rt_thread_delete(tid1);
- if (tid2)
- rt_thread_delete(tid2);
- return -RT_ERROR;
- }
- MSH_CMD_EXPORT(mb_slave_sample, run a modbus slave sample);
|