概述

最近想给网关机增加一个modbus_tcp子站(slave),本来准备自己写一个,了解了一下开源库libmodbus觉得相当不错。

  • 采用C语言开发,支持跨平台,Linux, Mac OS X, FreeBSD, QNX and Win32。与Qt开发的程序可以完美结合
  • 支持TCP、RTU两种模式,支持Slave和Monster
  • 支持多联机,采用的select模式,性能各方面肯定没问题
  • 有完善的说明文档 官方文档

安装编译

直接在github或者官网下载,官网见上面,我选择的是3.1.6版本,编译环境是Windows系统,编译器是VS2010

  1. 打开根目录下的说明README.md,上面写着各个平台的编译方法,Windows编译是打开src/win32 下面的文件,
To compile under Windows, install [MinGW](http://www.mingw.org/) and MSYS then
select the common packages (gcc, automake, libtool, etc). The directory
*./src/win32/* contains a Visual C project.
  1. 用VS2010打开工程文件,会提示升级,直接编译会失败,提示找不到config.h文件;
  2. 在win32目录有一个编译说明,上面说明了怎么生成config.h文件。在当前目录找到configure.js文件,双击就生成config文件了,再编译就好了。
config.h and ../modbus-version.h are generated using configure.js.Runcscript configure.js
orwscript configure.js
ordouble click configure.js to generate these files.
  1. 其他平台的编译类似,看编译说明。当然也可以直接把源文件添加到工程

使用说明

下面以modbus-tcp-slave为例,来说明libmodbus的用法。框中的第一个是能支持多个连接的模式,采用的select模式,第二个是单连接,其他的用法都一样。下面以bandwidth-server-one.c为例进行说明。

2. 应用库的时候,记得要添加socket的库,在头文件前面添加下面的语句

#pragma comment(lib,"ws2_32.lib")
  1. 几个重要的函数
#include <stdio.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <errno.h>#include <modbus.h>#pragma comment(lib,"ws2_32.lib")#if defined(_WIN32)
#define close closesocket
#endifenum {TCP,RTU
};int main(int argc, char *argv[])
{int s = -1;modbus_t *ctx = NULL;modbus_mapping_t *mb_mapping = NULL;         //寄存器管理int rc;int use_backend;/* TCP */if (argc > 1) {if (strcmp(argv[1], "tcp") == 0) {use_backend = TCP;} else if (strcmp(argv[1], "rtu") == 0) {use_backend = RTU;} else {printf("Usage:\n  %s [tcp|rtu] - Modbus client to measure data bandwidth\n\n", argv[0]);exit(1);}} else {/* By default */use_backend = TCP;}if (use_backend == TCP) {ctx = modbus_new_tcp("127.0.0.1", 1502);    //监听端口,默认是502s = modbus_tcp_listen(ctx, 1);modbus_tcp_accept(ctx, &s);} else {ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);modbus_set_slave(ctx, 1);modbus_connect(ctx);}//这个要重点关注,设置寄存器和线圈的个数,起始地址为0,//如果不想从0开始,可以用这个方法modbus_mapping_new_start_addressmb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,MODBUS_MAX_READ_REGISTERS, 0);if (mb_mapping == NULL) {fprintf(stderr, "Failed to allocate the mapping: %s\n",modbus_strerror(errno));modbus_free(ctx);return -1;}//modbus的数据收发for(;;) {uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];rc = modbus_receive(ctx, query);if (rc > 0) {modbus_reply(ctx, query, rc, mb_mapping);} else if (rc  == -1) {/* Connection closed by the client or error */break;}}printf("Quit the loop: %s\n", modbus_strerror(errno));modbus_mapping_free(mb_mapping);if (s != -1) {close(s);}/* For RTU, skipped by TCP (no TCP connect) */modbus_close(ctx);modbus_free(ctx);return 0;
}
  1. 如何与应用结合。modbus_mapping_t 结构体里面存储了所有的寄存器和线圈,只需要将应用的值更新到里面就可以,通过读取保持寄存器就可以获取Monster写入的值。
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;

libmodbus 开发说明相关推荐

  1. 【嵌入式】Libmodbus之TCP模式Master端程序示例

    00. 目录 文章目录 00. 目录 01. TCP模式Master开发流程 02. 读写单个线圈程序示例 03. 读写多个线圈程序示例 04. 读写单个保持寄存器程序示例 05. 读写多个保持寄存器 ...

  2. 【嵌入式】Libmodbus之RTU模式Master端程序示例

    00. 目录 文章目录 00. 目录 01. 软件开发流程 02. 获取版本信息 03. 读写单个线圈程序示例 04. 读写多个线圈程序示例 05. 读写单个保持寄存器程序示例 06. 读写多个保持寄 ...

  3. 【嵌入式】Libmodbus源码分析(二)-常用接口函数分析

    00. 目录 文章目录 00. 目录 01. modbus常用接口函数概述 02. modbus辅助接口函数 03. modbus功能接口函数 04. modbus数据处理 05. 附录 01. mo ...

  4. imx6ull交叉编译libmodbus

    目录 版本和开发环境说明 操作步骤 源码的修改 开放串口发送任意数据的API 轮询modbus接收数据时不阻塞 项目代码示例 版本和开发环境说明 libmodbus的官网上面有源码与文档,建议从上面获 ...

  5. java知识体系介绍

    国内最牛七星级团队马士兵.高淇等11位十年开发经验专家录制 目 录 百战程序员Java1573题 2百战程序员介绍 3JavaSE编程基础 9第一章 初识Java 9阶段项目课程1 11第二章 数据类 ...

  6. 【modbus】libmodbus库的移植与使用

    一.源码下载 1.libmodbus官网     http://libmodbus.org/download/ 2.选择长期稳定版本libmodbus-3.0.6.tar.gz     下载链接:ht ...

  7. 【嵌入式】Libmodbus下载和编译详解

    00. 目录 文章目录 00. 目录 01. Modbus开源库概述 02. Libmodbus下载 03. Libmodbus源码结构 04. Visual Studio2019编译Libmodbu ...

  8. modbus调试工具 linux,linux libmodbus的移植

    1.前言 Modbus是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成.其系统结构既包括硬件.亦包括软件.它可应用于各种数据采集和过程监控. 2.移植步骤 第 ...

  9. 移植安装ModBus到ARM开发板

    1.libmodbus官网 2.下载 二.交叉编译 1.解压 2.创建安装目录 3.进入解压的目录 4.配置编译选项 5.编译 6.安装 7.生成动态链接库 三.移植到ARM开发板 1.复制文件到AR ...

  10. libmodbus协议栈4—— 总结

    通过前面三篇文章,基本上可以了解基于libmodbus库的开发流程,而libmodbus比较牛的地方,不仅仅可以实现modbus RTU的支持,它还支持modbus TCP,而且由于采用了所谓的后端函 ...

最新文章

  1. 亚马逊首席技术官预测2021年将改变世界的八大技术趋势
  2. Ubuntu中安装DiscuzX2
  3. 使用String 的 intern做锁提高并发能力
  4. libmysqld_dev linux,Linux下python玩转MySQLdb
  5. 听说你做IT的,帮我做个网站呗!
  6. 宁波大学2020计算机技术复试线,宁波大学2020年硕士研究生复试分数线
  7. python对数组分类_有效地从字典Python中对数组进行分类
  8. 脚本录制软件python 按键精灵 tc_GitHub - yang-dongxu/KeymouseGo: 类似按键精灵的鼠标键盘录制和自动化操作...
  9. 计算机上自带的打字游戏,完美运行金山打字通2016(包括自带的小游戏)
  10. CSS练习中|无序列表中,<li>的小黑点如何替换为图片(菜鸡趣味学习,细节到每一步)
  11. linux装回windows系统,装linux后怎样装回windows?(Linux系统清除Grub的几种方法)
  12. AutoCAD块属性提取
  13. linux下的网络·环境部署
  14. Qt 中 Q_OBJECT 宏及 moc_*.cpp文件
  15. Python3_函数相关基础知识
  16. UE4 材质 溶解材质
  17. 思科模拟器入门基础-静态路由
  18. cad指示箭头快捷键命令_CAD箭头引注快捷键是什么?
  19. [Jzoj] 2197. 三核苷酸
  20. html5+css3布局尝试

热门文章

  1. 无源滤波器和有源滤波器有什么区别?-道合顺大数据infinigo
  2. 设计模式-行为型软件设计模式(二)
  3. uniapp开发微信公众号(支付宝支付)
  4. 新装主机测试性能软件,装机必看 如何快速测试电脑性能?
  5. 虚断、虚短及同相放大与反相放大
  6. ubuntu1804下txt文件乱码问题
  7. 【已解决】ipa降级教学 苹果旧版APP下载
  8. 华硕aura完全卸载_更快,更信仰,华硕RTX 2070电竞显卡
  9. 教你ogg怎么转mp3格式
  10. 业务如何驱动技术发展