first commit for chrg
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
# 示例代码说明
|
||||
|
||||
## 运行方法
|
||||
|
||||
### 配置工程
|
||||
|
||||
使用 Freemodbus 软件包示例代码,需要在 RT-Thread 的包管理器中选择它,并根据需要进行配置,具体路径如下:
|
||||
|
||||
```
|
||||
RT-Thread online packages
|
||||
IoT - internet of things --->
|
||||
[*] FreeModbus: Modbus master and slave stack --->
|
||||
[*] Master mode --->
|
||||
[*] Enable RTU master mode
|
||||
[*] Enable master sample
|
||||
(1) Test slave device address
|
||||
(2) uart number used by master sample, e.g. 2 means uart2
|
||||
(115200) uart baudrate used by master sample
|
||||
[*] Slave mode --->
|
||||
[*] Enable RTU slave mode
|
||||
[ ] Enable ASCII slave mode
|
||||
[ ] Use Contorl Pin
|
||||
[*] Enable slave sample
|
||||
(1) Slave device address
|
||||
(2) uart number used by slave sample, e.g. 2 means uart2
|
||||
(115200) uart baudrate used by slave sample
|
||||
```
|
||||
|
||||
添加示例代码到工程中,并编译下载之后,可以在控制台中看到这两个命令,分别是 Modbus 主机和从机的示例代码。要看代码运行的效果还需要 PC 端 Modbus Poll 和 Modbus slave 这两个软件的配合。
|
||||
|
||||

|
||||
|
||||
### 运行主机示例
|
||||
|
||||
首先下载安装和主机示例代码配合的 Modbus slave 软件。
|
||||
|
||||
然后,在命令行输入 `mb_master_sample` 命令就可以运行主机的示例代码。
|
||||
|
||||
运行之后,打开 Modbus slave 软件,点击菜单“Setup”中“Slave Definition.. F2”进行参数设置。
|
||||
|
||||

|
||||
|
||||
点击菜单“Connection”中“Connect.. F3”进行连接。弹出连接对话框,根据具体情况配置:
|
||||
|
||||

|
||||
|
||||
连接成功,可以看到寄存器列表中的第 2、3个寄存器的数值在不断变化。
|
||||
|
||||

|
||||
|
||||
### 运行从机示例
|
||||
|
||||
从机的运行示例和主机相差不大,只是 PC 端配合调试的软件,换成 Modbus Poll 即可。不再赘述。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 暂无
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 76 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 9.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.3 KiB |
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* 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 "mb_m.h"
|
||||
|
||||
#ifdef PKG_MODBUS_MASTER_SAMPLE
|
||||
#define SLAVE_ADDR MB_SAMPLE_TEST_SLAVE_ADDR
|
||||
#define PORT_NUM MB_MASTER_USING_PORT_NUM
|
||||
#define PORT_BAUDRATE MB_MASTER_USING_PORT_BAUDRATE
|
||||
#else
|
||||
#define SLAVE_ADDR 0x01
|
||||
#define PORT_NUM 3
|
||||
#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_SEND_REG_START 2
|
||||
#define MB_SEND_REG_NUM 2
|
||||
|
||||
#define MB_POLL_CYCLE_MS 500
|
||||
|
||||
static void send_thread_entry(void *parameter)
|
||||
{
|
||||
eMBMasterReqErrCode error_code = MB_MRE_NO_ERR;
|
||||
rt_uint16_t error_count = 0;
|
||||
USHORT data[MB_SEND_REG_NUM] = {0};
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* Test Modbus Master */
|
||||
data[0] = (USHORT)(rt_tick_get() / 10);
|
||||
data[1] = (USHORT)(rt_tick_get() % 10);
|
||||
|
||||
error_code = eMBMasterReqWriteMultipleHoldingRegister(SLAVE_ADDR, /* salve address */
|
||||
MB_SEND_REG_START, /* register start address */
|
||||
MB_SEND_REG_NUM, /* register total number */
|
||||
data, /* data to be written */
|
||||
RT_WAITING_FOREVER); /* timeout */
|
||||
|
||||
/* Record the number of errors */
|
||||
if (error_code != MB_MRE_NO_ERR)
|
||||
{
|
||||
error_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void mb_master_poll(void *parameter)
|
||||
{
|
||||
eMBMasterInit(MB_RTU, PORT_NUM, PORT_BAUDRATE, PORT_PARITY);
|
||||
eMBMasterEnable();
|
||||
|
||||
while (1)
|
||||
{
|
||||
eMBMasterPoll();
|
||||
rt_thread_mdelay(MB_POLL_CYCLE_MS);
|
||||
}
|
||||
}
|
||||
|
||||
static int mb_master_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;
|
||||
}
|
||||
tid1 = rt_thread_create("md_m_poll", mb_master_poll, RT_NULL, 512, MB_POLL_THREAD_PRIORITY, 10);
|
||||
if (tid1 != RT_NULL)
|
||||
{
|
||||
rt_thread_startup(tid1);
|
||||
}
|
||||
else
|
||||
{
|
||||
goto __exit;
|
||||
}
|
||||
|
||||
tid2 = rt_thread_create("md_m_send", send_thread_entry, RT_NULL, 512, MB_SEND_THREAD_PRIORITY - 2, 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_master_sample, run a modbus master sample);
|
||||
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* 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);
|
||||
Reference in New Issue
Block a user