打印
[N32G45x]

【N32G457】MODBUS测试

[复制链接]
585|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

modbus在工业仪表领域应用十分广泛,利用串口实现十分方便。移植modbus主要是按照规则实现串口数据收发及定时管理,本测试使用软件定时,方便实现多通道MODBUS。
文件列表如下:


modbus测试应用程序:
void modbus_task(const void *argv)
{
        mb_cmd_buff_type mcmd;

        mb_obj_init(&mb.obj01);
        //slave config
        mb01_Init(MB_RTU_SLAVE, mb_baud_tab[MB_BAUD_115200], MB_PAR_NONE);
        mb.obj01.slave_id = 1;
        mb.obj01.os_event_send = mb_os_send;
        mb.obj01.os_event_base = 1 << 4;
        mb.obj01.rtu_length_cut = 1;       
       
        mb_obj_init(&mb.obj02);
        //slave config
        mb02_Init(MB_RTU_SLAVE, mb_baud_tab[MB_BAUD_115200], MB_PAR_NONE);
        mb.obj02.slave_id = 1;
        mb.obj02.os_event_send = mb_os_send;
        mb.obj02.os_event_base = 1 << 4;
        mb.obj02.rtu_length_cut = 1;

        mb_obj_init(&mb.obj06);

        //master config
        mb06_Init(MB_RTU_MASTER, mb_baud_tab[MB_BAUD_115200], MB_PAR_NONE);
        mb.obj06.slave_id = 1;
        mb.obj06.rtu_master_delay_set = 3;
        mb.obj06.rcv_end_handle_comp = rcv_end_handle_comp;
        mb.obj06.os_event_send = mb_os_send;
        mb.obj06.os_event_base = 2 << 4;
        mb.obj06.rtu_length_cut = 1;

        //cmd config
        mcmd.device_id = 0;
        mcmd.cmd = FUN_CODE_READ_COILS;
        mcmd.dat = mb_tst.pv_w;
        mcmd.dat_addr = 0;
        mcmd.amount = 48;
        mcmd.call_back = 0;
        mb.obj06.api->stc_cmd_req(0, &mcmd);

        mcmd.cmd = FUN_CODE_READ_DISCRETE;
        mb.obj06.api->stc_cmd_req(1, &mcmd);

        mcmd.cmd = FUN_CODE_W_R_MULTIPLE_REG;
        mb.obj06.api->stc_cmd_req(2, &mcmd);

        mcmd.cmd = FUN_CODE_W_R_MULTIPLE_REG;
        mb.obj06.api->stc_cmd_req(3, &mcmd);

        mcmd.cmd = FUN_CODE_WRITE_MULTIPLE_REG;
        mb.obj06.api->stc_cmd_req(4, &mcmd);

        mcmd.cmd = FUN_CODE_WRITE_MULTIPLE_COIL;
        mb_tst.pv_w[0] = 0;
        mb.obj06.api->stc_cmd_req(5, &mcmd);

        //task handle
        for (;;)
        {
                rt_err_t os_err;
                rt_uint32_t event;
               
                // wait modbus event
                os_err = rt_event_recv(os_obj.eid_modbus, 0xFFFF, RT_EVENT_FLAG_OR, 1000, &event);

                (void)event;
                (void)os_err;
               
                mb_poll(&mb.obj01);
               
                mb_poll(&mb.obj02);

                mb_poll(&mb.obj06);

                mb_tst.obj_size = sizeof(mb.obj06);
        }
}
熟悉STM32的小伙伴使用NATION MCU比较容易上手,虽然NATION的库风格和STM的HAL库差别巨大,但寄存器结构基本一致,不会有太大障碍。
对于串口来说就是收发中断,收发状态,收发数据三项,具体可参见附件port文件,此处不再赘述。

板载UART1配置为从机,可以直接连接电脑测试:



附上测试工程:
software.rar (3.14 MB)

使用特权

评论回复
沙发
麻花油条| | 2022-2-8 11:11 | 只看该作者
感谢楼主分享

使用特权

评论回复
板凳
单片小菜| | 2022-2-8 16:25 | 只看该作者
感谢楼主的分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

328

帖子

2

粉丝