【C++】开源:libmodbus通信协议库配置使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍libmodbus通信协议库配置使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明

😏1. 项目介绍

官网:https://libmodbus.org/

项目Github地址:https://github.com/stephane/libmodbus

Libmodbus 是一个用于通信协议 Modbus开源 C 语言库。Modbus 是一种常用的工业通信协议,用于在自动化设备之间进行数据交换。Libmodbus 提供了一组函数和工具,使开发者能够轻松地实现 Modbus 通信功能。

以下是 Libmodbus 库的一些主要特点和功能:

1.Modbus 协议支持:Libmodbus 实现了 Modbus 协议的基本功能,包括 Modbus RTU(串行)和 Modbus TCP(以太网)两种通信方式。它支持 Modbus 主机和从机的通信,以及读取和写入 Modbus 寄存器的操作。

2.跨平台支持:Libmodbus 提供了跨平台的支持,可以在多个操作系统上运行,包括 Linux、Windows、macOS 等。

3.简单易用:Libmodbus 提供了简洁的 API,使得开发者能够方便地集成 Modbus 功能到他们的应用程序中。它提供了一组函数,用于建立连接、读写寄存器、处理异常等。

4.多种编程语言支持:虽然 Libmodbus 是一个 C 语言库,但还提供了其他编程语言的绑定,如 Python、Java 等。这使得开发者可以使用他们熟悉的编程语言来使用 Libmodbus。

Libmodbus 是一个广泛使用的 Modbus 库,适用于各种工业自动化和物联网应用。

😊2. 环境配置

下面进行环境配置:

# apt安装
sudo apt install libmodbus-dev
# 编译
g++ -o main main.cpp  -lmodbus

😆3. 使用说明

下面进行使用分析:

Modbus RTU串行读取和写入示例:

#include <iostream>
#include <modbus/modbus.h>int main() {modbus_t* modbusContext;uint16_t readBuffer[64];  // 用于存储读取的数据const int slaveId = 1;    // 从机 IDconst int registerAddress = 0;  // 寄存器地址const int numRegisters = 1;     // 寄存器数量const int coilAddress = 0;  // 线圈地址const int numCoils = 1;     // 线圈数量// 初始化 - 设备号、波特率、校验位、数据位、停止位modbusContext = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);if (modbusContext == nullptr) {std::cerr << "Failed to create Modbus context" << std::endl;return 1;}// 打开 Modbus 连接if (modbus_connect(modbusContext) == -1) {std::cerr << "Modbus connection failed: " << modbus_strerror(errno) << std::endl;modbus_free(modbusContext);return 1;}// 读取寄存器int rc = modbus_read_registers(modbusContext, registerAddress, numRegisters, readBuffer);if (rc == -1) {std::cerr << "Failed to read Modbus registers: " << modbus_strerror(errno) << std::endl;} else {std::cout << "Read value: " << readBuffer[0] << std::endl;}// 写入寄存器const uint16_t writeValue = 1234;rc = modbus_write_register(modbusContext, registerAddress, writeValue);if (rc == -1) {std::cerr << "Failed to write Modbus register: " << modbus_strerror(errno) << std::endl;} else {std::cout << "Write successful" << std::endl;}// 读取线圈状态uint8_t coilStatus;rc = modbus_read_bits(modbusContext, coilAddress, numCoils, &coilStatus);if (rc == -1) {std::cerr << "Failed to read Modbus coils: " << modbus_strerror(errno) << std::endl;} else {std::cout << "Coil value: " << static_cast<int>(coilStatus) << std::endl;}// 写入线圈状态const uint8_t writeValue2 = 1;rc = modbus_write_bit(modbusContext, coilAddress, writeValue2);if (rc == -1) {std::cerr << "Failed to write Modbus coil: " << modbus_strerror(errno) << std::endl;} else {std::cout << "Write successful" << std::endl;}// 关闭 Modbus 连接modbus_close(modbusContext);modbus_free(modbusContext);return 0;
}

Modbus TCP以太网读取写入示例:

#include <iostream>
#include <modbus/modbus.h>int main() {modbus_t* modbusContext;const char* ipAddress = "192.168.1.100"; // Modbus TCP 从机的 IP 地址const int port = 502; // Modbus TCP 端口号const int slaveId = 1; // 从机 IDmodbusContext = modbus_new_tcp(ipAddress, port);if (modbusContext == nullptr) {std::cerr << "Failed to create Modbus context" << std::endl;return 1;}// 打开 Modbus 连接if (modbus_connect(modbusContext) == -1) {std::cerr << "Modbus connection failed: " << modbus_strerror(errno) << std::endl;modbus_free(modbusContext);return 1;}// 读取线圈状态const int coilAddress = 0; // 线圈地址const int numCoils = 1; // 线圈数量uint8_t coilStatus[numCoils];int rc = modbus_read_bits(modbusContext, coilAddress, numCoils, coilStatus);if (rc == -1) {std::cerr << "Failed to read Modbus coils: " << modbus_strerror(errno) << std::endl;} else {std::cout << "Coil value: " << static_cast<int>(coilStatus[0]) << std::endl;}// 写入线圈状态const uint8_t writeValue = 1;rc = modbus_write_bit(modbusContext, coilAddress, writeValue);if (rc == -1) {std::cerr << "Failed to write Modbus coil: " << modbus_strerror(errno) << std::endl;} else {std::cout << "Write successful" << std::endl;}// 关闭 Modbus 连接modbus_close(modbusContext);modbus_free(modbusContext);return 0;
}

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/290193.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器2核4G多少钱?阿里云服务器2核4G配置活动价格详解

阿里云服务器2核4G配置是很多个人和一般企业用户的首选云服务器配置&#xff0c;阿里云服务器2核4G的价格并不是一成不变的&#xff0c;而是跟云服务器实例规格、带宽、云盘、地域等因素有关&#xff0c;本文将详细介绍阿里云服务器2核4G配置的价格及相关因素&#xff0c;帮助用…

计算机基础:网络基础

目录 ​​​​​​​一.网线制作 1.制作所需要工具 网线制作标准 ​编辑 2.水晶头使用 3.网线钳使用 4.视频教学 二.集线器、交换机介绍 1.OSI七层模型 2.TCP/IP四层参考模型 3.集线器、交换机。路由器介绍 集线器 交换机 路由器 区别 三.路由器的配置 1.路由器设…

3-高可用-隔离术

隔离是指将系统或资源分割开&#xff0c;系统隔离是为了在系统发生故障时&#xff0c;能限定传播范围和影响范围&#xff0c;即发生故障后不会出现滚雪球效应&#xff0c;从而保证只有出问题的服务不可用&#xff0c;其他服务还是可用的。 比较多的隔离手段有线程隔离、进程隔…

【蓝桥杯一对一保奖辅导】国奖学姐蓝桥杯经验分享

目录 写在前面有关报名费如何准备&#xff1f;看书 /练习 /分类 /总结比赛技巧与指导 写在前面 蓝桥杯对于计算机专业相关的同学来说是非常值得参加的。 蓝桥杯相对于ACM比赛而言获奖难度较小&#xff0c;只要掌握技巧&#xff0c;拿到 省一甚至国奖是比较容易的&#xff0c;但…

移动端手机图片裁剪

移动端手机图片裁剪-遇见你与你分享

华为atlas300安装教程

1、安装包位置&#xff1a; /data/ai_install_packages 2、添加HwHiAiUser用户&#xff1a; groupadd -g 1000 HwHiAiUser useradd -g HwHiAiUser -u 1000 -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash 3、安装驱动&#xff1a; ./Ascend-hdk-310p-npu-driver_6.0.0_l…

我们不可能永远都在救火 ——Scrum中技术债务“偿还”指南

技术债务是指开发人员为了加速软件开发&#xff0c;在应该采用最佳方案时进行了妥协&#xff0c;改用了短期内能加速软件开发的方案&#xff0c;以至于未来给自己带来额外的开发负担。 软件工程师 Ward Cunningham首次将技术的复杂比作为负债。 简单来说&#xff0c;技术债务类…

macOS 开发 - 报错 Expected expression(空格问题)

文章目录 问题尝试解决方式 问题 一个简单的 查找沙盒内文件的代码&#xff0c;编译不通过&#xff0c;很郁闷 尝试 可以肯定 NSBundle 代码这么写没问题&#xff0c;即使重敲还是报错&#xff1b; 换个位置&#xff0c;甚至 mainBundle 都无法提示出来。 重启 Xcode 也无法…

智能优化算法应用:基于瞬态优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于瞬态优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于瞬态优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.瞬态优化算法4.实验参数设定5.算法结果6.…

反网络爬虫的三个阶段

随着网络爬虫的普及和网络攻击的日益复杂&#xff0c;升级网络安全措施成为保护网站和应用程序免受恶意爬虫侵害的必要举措。本文将深入研究反网络爬虫的三个阶段&#xff0c;并详细探讨IP地址过滤的策略&#xff0c;以提升网络的安全性。 第一部分&#xff1a;反网络爬虫的三…

算法-动态规划

动态规划算法 应用场景-背包问题 介绍 动态规划(Dynamic Programming)算法的核心思想是&#xff1a;将大问题划分为小问题进行解决&#xff0c;从而一步步获取最优解的处理算法动态规划算法与分治算法类似&#xff0c;其基本思想也是将待求解问题分解成若干个子问题&#xff0…

MaBatis使用`ResultMap`标签手动映射详解使用

文章目录 MaBatis使用ResultMap标签手动映射详解使用1、MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系&#xff0c;二者不同时无法自动ORM&#xff0c;如下&#xff1a;2、在SQL中使用 as 为查询字段添加列别名&#xff0c;以匹配属性名&#xff1a;但是如果我…