0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

libmodbus情景分析

瑞萨MCU小百科 来源:瑞萨MCU小百科 2024-11-25 14:29 次阅读

11.3libmodbus情景分析

以“modbus_write_bits”函数为例,分析下图的执行流程:

9ca80230-aae2-11ef-93f3-92fbcf53809c.png

11.3.1

初始化

1. 主设备初始化

主设备程序先调用“modbus_new_rtu”函数,仅仅是分配一个modbus结构体,在里面记录要使用的串口设备、参数

左右滑动查看完整内容

modbus_t *
modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bi
t);

再调用“modbus_set_slave”,是设置“要访问哪个从设备”。每当访问不同地址的设备之前,都应该调用这个函数。

最后调用“modbus_connect”函数,这个函数只是打开串口、设置串口参数,并没有跟从设备进行数据交互。

2. 从设备初始化

从设备的初始化,跟主设备类似,不过多了使用“modbus_mapping_new_start_address”函数创建寄存器 buffer。

modbus_mapping_t结构体如下定义:

左右滑动查看完整内容

typedef struct _modbus_mapping_t {
 int nb_bits;
 int start_bits;
 int nb_input_bits;
 int start_input_bits;
 int nb_input_registers;
 int start_input_registers;
 int nb_registers;
 int start_registers;
 uint8_t *tab_bits;
 uint8_t *tab_input_bits;
 uint16_t *tab_input_registers;
 uint16_t *tab_registers;
} modbus_mapping_t;

它被用来描述DI、DO、AI、AO四类寄存器。以DO寄存器为例,这个结构体里有3个成员:

①nb_bits:DO寄存器个数。

②start_bits:DO寄存器起始寄存器地址。

③tab_bits:指向一个“uint8_t”类型的数组,里面每个数组项表示一个DO寄存器,这个数组大小为nb_bits。数组中第0项,对应第“start_bits”个DO寄存器。

“modbus_mapping_new_start_address”函数原型

如下:

左右滑动查看完整内容

/* Allocates 4 arrays to store bits, input bits, registers and inputs
 registers. The pointers are stored in modbus_mapping structure.
 The modbus_mapping_new_start_address() function shall return the new allocated
 structure if successful. Otherwise it shall return NULL and set errno to
 ENOMEM. */
modbus_mapping_t *modbus_mapping_new_start_address(unsigned int start_bits,
 unsigned int nb_bits,
 unsigned int start_input_bits,
 unsigned int nb_input_bits,
 unsigned int start_registers,
 unsigned int nb_registers,
 unsigned int start_input_registers,
 unsigned int nb_input_registers);

假设从设备执行了如下代码:

左右滑动查看完整内容

modbus_mapping_t *mb_mapping;
mb_mapping = modbus_mapping_new_start_address(0,
 4, /* DO, 4 个寄存器 */
 0,
 3, /* DI, 3 个寄存器 */
 0, 
 2, /* AO, 2 个寄存器 */
 0,
 1; /* AI, 1 个寄存器 */

将会分配出如下结构体:

9cd4fa60-aae2-11ef-93f3-92fbcf53809c.png

modbus传输的本质,就是读写上图中4个数组。

11.3.2

主设备发送请求

主设备调用“modbus_write_bits”函数,想写若干个DO寄存器,比如:

左右滑动查看完整内容

01 uint8_t buf[2] = {1, 0};
02 int rc = modbus_write_bits(ctx, 0, 2, buf);

根据Modbus RTU协议,它必定执行如下操作:

①构造数据包

②通过串口发送数据包

③等待、读取回复

对于上述代码,数据包的内容如下:

9cf61e70-aae2-11ef-93f3-92fbcf53809c.png

1. 先构造包头

函数调用关系如下:

9cfccbd0-aae2-11ef-93f3-92fbcf53809c.png

2. 再构造数据

代码如下:

9d0a64f2-aae2-11ef-93f3-92fbcf53809c.png

3. 计算检验码

在发送数据包的函数里,先计算检验码,代码如下:

9d25de9e-aae2-11ef-93f3-92fbcf53809c.png

4. 发送数据包

前面构造好了数据包,发送就比较简单:调用write函数进行发送即可。代码如下:

9d3135aa-aae2-11ef-93f3-92fbcf53809c.png

11.3.3

从设备接收请求

从设备的程序一直在等待主机发来的消息,示例代码如下:

9d449f14-aae2-11ef-93f3-92fbcf53809c.png

“modbus_receive”函数内部实现为:

①使用select机制,逐个读取字符

②根据读到的字符,分辨还需要读多少数据

1. 读取单个字符

函数调用关系如下:

9d4cf434-aae2-11ef-93f3-92fbcf53809c.png

2. 判断还需要读取多少数据

从设备读取主设备发来的请求包时,步骤为:

①先读取“功能码”

②再根据功能码判断后续要的包头数据还剩多少,读取包头

③最后根据包头数据解析要读多少数据,读取数据。

流程如下图所示:

9d58f090-aae2-11ef-93f3-92fbcf53809c.png

确定第1个阶段数据长度的代码如下:

9d75852a-aae2-11ef-93f3-92fbcf53809c.png

读到功能码后,根据功能码计算剩下的包头的数据:

9d8dfa6a-aae2-11ef-93f3-92fbcf53809c.png

读到完整的包头后,计算剩下的数据长度:

9d9d0442-aae2-11ef-93f3-92fbcf53809c.png

3. 判断数据完整性

就是根据校验码判断数据是否有错误,代码如下:

9dc86a4c-aae2-11ef-93f3-92fbcf53809c.png

11.3.4

从设备回应

从设备接收到请求后,调用如下函数进行处理、回应:

9dd553f6-aae2-11ef-93f3-92fbcf53809c.png

在“modbus_reply”函数内部,它会:

①对于写请求:把请求包中的数据解析出入,填入 mb_mapping中对应的寄存器buffer;

②对于读请求:从mb_mapping中对应的寄存器buffer取出数据;

③构造回复包,发送给主设备。

本情景分析中,主设备调用“modbus_write_bits”函数,想写两个DO寄存器,比如:

左右滑动查看完整内容

01 uint8_t buf[2] = {1, 0};
02 int rc = modbus_write_bits(ctx, 0, 2, buf);

从设备使用“modbus_reply”函数处理。

1. 根据请求包设置寄存器buffer

代码如下:

9df04e9a-aae2-11ef-93f3-92fbcf53809c.png

2. 构造回复包

对于“写多个DO寄存器”的请求,它的回复包格式如下:

9e1f1a18-aae2-11ef-93f3-92fbcf53809c.png

下面的代码,构造的回复包里含有上图1、2的信息(在发送回复包时才构造校验码):

9e31e6c0-aae2-11ef-93f3-92fbcf53809c.png

3. 发送回复包

最后,从设备发送回复包:

9e3d09ba-aae2-11ef-93f3-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MODBUS
    +关注

    关注

    28

    文章

    1765

    浏览量

    76851
  • MPU
    MPU
    +关注

    关注

    0

    文章

    349

    浏览量

    48739
  • 函数
    +关注

    关注

    3

    文章

    4309

    浏览量

    62449
  • LibModbus
    +关注

    关注

    0

    文章

    8

    浏览量

    7247

原文标题:libmodbus情景分析 - RZ MPU工业控制教程连载(39)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    第6章_libmodbus使用

    libmodbus是一个免费的跨平台支持RTU和TCP的Modbus库,遵循LGPL V2.1+协议。libmodbus支持Linux、Mac Os X、FreeBSD、QNX和Windows等
    的头像 发表于 06-29 14:36 2111次阅读
    第6章_<b class='flag-5'>libmodbus</b>使用

    情景分析-ARM内核、不错的ARM内核资料

    情景分析-ARM内核、不错的ARM内核资料
    发表于 05-21 23:42

    Linux内核情景分析 非扫描版

    珍藏资料放送Linux内核情景分析非扫描版
    发表于 03-12 20:10

    【图书分享】《Linux内核源代码情景分析

    本帖最后由 小Z 于 2014-3-21 14:06 编辑 书名:《Linux内核源代码情景分析》目录:附件:
    发表于 03-19 15:16

    Linux内核情景分析_上下全集高清版pdf

    国内Linux内核分析经典书籍-Linux内核源代码情景分析(上下全集卷).pdf需要的自行下载
    发表于 11-15 16:41

    Linux内核源代码情景分析

    Linux内核源代码情景分析
    发表于 03-03 10:19

    libmodbus使用ubuntu系统

    libmodbus使用ubuntu系统使用libmodbusarm-linux使用libmodbus解压安装移植编译modbus从机模拟ubuntu系统使用libmodbusubuntu系统可以直接
    发表于 11-04 07:57

    基于select操作的libmodbus

    libmodbus库从软件包里启用, libmodbus是基于select操作的,依赖于文件系统和libc,需要在rt-thread中开启对应的支持。一开始以为作为主站时,有函数可以自动的指定读取
    发表于 01-11 08:13

    Linux内核源代码情景分析(上册)浙江大学

    本书着重于对LINUX系统最新版本(2.4.0)内核源代码进行情景描述和情景分析. 上册共6章.
    发表于 06-10 14:40 0次下载
    Linux内核源代码<b class='flag-5'>情景</b><b class='flag-5'>分析</b>(上册)浙江大学

    Linux内核源代码情景分析(下册)浙江大学

    本书着重于对LINUX系统最新版本(2.4.0)内核源代码进行情景描述和情景分析. 上册共3章.
    发表于 06-10 14:43 0次下载

    JFFS2源代码情景分析

    jiffs2 源代码情景分析 简单明白 适合初学者
    发表于 02-23 15:50 14次下载

    Linux内核源代码情景分析(全册高清带书签)

    Linux内核源代码情景分析(全册高清带书签)
    发表于 01-14 15:20 60次下载

    Linux内核源代码情景分析(全册高清带书签)pdf下载

    Linux内核源代码情景分析需要的拿走吧
    发表于 01-04 16:57 9次下载

    libmodbus之嵌入式Linux使用及测试

    libmodbus使用ubuntu系统使用libmodbusarm-linux使用libmodbus解压安装移植编译modbus从机模拟ubuntu系统使用libmodbusubuntu系统可以直接
    发表于 11-01 16:57 15次下载
    <b class='flag-5'>libmodbus</b>之嵌入式Linux使用及测试

    libmodbus源码框架分析

    libmodbus作为一个优秀且免费开源的跨平台支持RTU 和 TCP模式的Modbus开发库,非常值得大家借鉴和学习。本章对libmodbus源代码进行阅读和分析
    的头像 发表于 11-21 13:47 185次阅读
    <b class='flag-5'>libmodbus</b>源码框架<b class='flag-5'>分析</b>