Ubuntu下手把手教你进行ModBus 通讯采集

一. 安装libmodbus库
首先安装libmodbus库,可以通过包管理器安装,或者通过源代码编译。

包管理器安装:

sudo apt-get install libmodbus-dev

从源代码安装,确保已经安装了git工具:

# 从github上拉取源代码
git clone https://github.com/stephane/libmodbus.git
# 进入到源代码的目录下
cd libmodbus
# 编译并安装,先确保autogen.sh有可执行权限
# 如果没有执行权限先执行
su chmod +x autogen.sh 
# 运行sh脚本生成
./autogen.sh
./configure
# 编译并安装libmidbus库
make
sudo make install

二. 确认安装是否成功

方法一,通过dpkg工具查看是否存在libmodbus库

dpkg -s libmodbus-dev

方法二,检查库路径
默认情况下libmodbus的头文件和库文件位于以下路径:

头文件:/usr/include/modbus.h
库文件:/usr/lib/x86_64-linux-gnu/libmodbus.so

ls /usr/include/modbus.h
ls /usr/lib/x86_64-linux-gnu/libmodbus.so

三、libmodbus使用流程

# 第一步,创建Modbus RTU连接
modbus_t *mb = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
"/dev/ttyUSB0":串口号
9600:          波特率
'N':            校验方式,O(奇校验)/E(偶校验)/N(无校验)
8:             数据位
1:             停止位

# 第二步,设置从机地址
modbus_set_slave(mb, 1);
mb:             第一步创建的modbus对象
1:             设备的从机地址

# 第三步,设置超时时间
modbus_set_response_timeout(mb, &timeout);
timeout:时间结构体
    struct timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;

# 第四步,连接
modbus_connect(mb)

#第五步,采集
modbus_read_registers(mb, 0, 10, tab_reg);
0:           开始采集的起始地址
10:          采集的长度
tab_reg:      保存采集到的数据

四、使用例子

//example.cpp

#include <modbus/modbus.h>
#include <iostream>
#include <stdexcept>

int main() {
    // 创建Modbus RTU连接
    modbus_t *mb = modbus_new_rtu("/dev/ttySUB0", 9600, 'N', 8, 1);
    if (mb == nullptr) {
        std::cerr << "Unable to create the libmodbus context" << std::endl;
        return -1;
    }

    //设置从机地址为1
    if (modbus_set_slave(mb, 1)){
        std::cerr << "Unable to set slave" << std::endl;
        modbus_free(mb);
        return -1;
    }

    // 设置Modbus通信超时
    struct timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    modbus_set_response_timeout(mb, &timeout);

    // 连接Modbus
    if (modbus_connect(mb) == -1) {
        std::cerr << "Unable to connect to the Modbus server" << std::endl;
        modbus_free(mb);
        return -1;
    }

    // 读取保持寄存器(功能代码0x03)
    uint16_t tab_reg[32]; // 存储寄存器数据
    int rc = modbus_read_registers(mb, 0, 10, tab_reg); // 从地址0读取10个寄存器
    if (rc == -1) {
        std::cerr << "Modbus read error" << std::endl;
        modbus_free(mb);
        return -1;
    }

    // 打印读取到的寄存器值
    std::cout << "Read registers:" << std::endl;
    for (int i = 0; i < 10; i++) {
        std::cout << "Register " << i << ": " << tab_reg[i] << std::endl;
    }

    // 写入寄存器(功能代码0x06)
    uint16_t value = 100;
    rc = modbus_write_register(mb, 1, value); // 向地址1写入数据12345
    if (rc == -1) {
        std::cerr << "Modbus write error" << std::endl;
        modbus_free(mb);
        return -1;
    }

    // 关闭连接
    modbus_close(mb);
    modbus_free(mb);

    return 0;
}

五、编译并运行代码
编译时一定要链接libmodbus库,即添加-lmodbus参数,否则编译不过。

# 编译编写好的代码,生成example程序
g++ example.cpp -o example -lmodbus

# 运行example程序
./example

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小龙学IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值