[N32G45x] 【N32G457】MODBUS测试

[复制链接]
908|2
 楼主| aple0807 发表于 2022-1-30 14:33 | 显示全部楼层 |阅读模式

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

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

  4.         mb_obj_init(&mb.obj01);
  5.         //slave config
  6.         mb01_Init(MB_RTU_SLAVE, mb_baud_tab[MB_BAUD_115200], MB_PAR_NONE);
  7.         mb.obj01.slave_id = 1;
  8.         mb.obj01.os_event_send = mb_os_send;
  9.         mb.obj01.os_event_base = 1 << 4;
  10.         mb.obj01.rtu_length_cut = 1;       
  11.        
  12.         mb_obj_init(&mb.obj02);
  13.         //slave config
  14.         mb02_Init(MB_RTU_SLAVE, mb_baud_tab[MB_BAUD_115200], MB_PAR_NONE);
  15.         mb.obj02.slave_id = 1;
  16.         mb.obj02.os_event_send = mb_os_send;
  17.         mb.obj02.os_event_base = 1 << 4;
  18.         mb.obj02.rtu_length_cut = 1;

  19.         mb_obj_init(&mb.obj06);

  20.         //master config
  21.         mb06_Init(MB_RTU_MASTER, mb_baud_tab[MB_BAUD_115200], MB_PAR_NONE);
  22.         mb.obj06.slave_id = 1;
  23.         mb.obj06.rtu_master_delay_set = 3;
  24.         mb.obj06.rcv_end_handle_comp = rcv_end_handle_comp;
  25.         mb.obj06.os_event_send = mb_os_send;
  26.         mb.obj06.os_event_base = 2 << 4;
  27.         mb.obj06.rtu_length_cut = 1;

  28.         //cmd config
  29.         mcmd.device_id = 0;
  30.         mcmd.cmd = FUN_CODE_READ_COILS;
  31.         mcmd.dat = mb_tst.pv_w;
  32.         mcmd.dat_addr = 0;
  33.         mcmd.amount = 48;
  34.         mcmd.call_back = 0;
  35.         mb.obj06.api->stc_cmd_req(0, &mcmd);

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

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

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

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

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

  47.         //task handle
  48.         for (;;)
  49.         {
  50.                 rt_err_t os_err;
  51.                 rt_uint32_t event;
  52.                
  53.                 // wait modbus event
  54.                 os_err = rt_event_recv(os_obj.eid_modbus, 0xFFFF, RT_EVENT_FLAG_OR, 1000, &event);

  55.                 (void)event;
  56.                 (void)os_err;
  57.                
  58.                 mb_poll(&mb.obj01);
  59.                
  60.                 mb_poll(&mb.obj02);

  61.                 mb_poll(&mb.obj06);

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

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


附上测试工程:
software.rar (3.14 MB, 下载次数: 39)
麻花油条 发表于 2022-2-8 11:11 来自手机 | 显示全部楼层
感谢楼主分享
单片小菜 发表于 2022-2-8 16:25 | 显示全部楼层
感谢楼主的分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部