百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

开源库libmodbus的用法

csdh11 2025-01-06 12:02 5 浏览

概述

最近想给网关机增加一个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

  • 打开根目录下的说明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.
  • 用VS2010打开工程文件,会提示升级,直接编译会失败,提示找不到config.h文件;
  • 在win32目录有一个编译说明,上面说明了怎么生成config.h文件。在当前目录找到configure.js文件,双击就生成config文件了,再编译就好了。
config.h and ../modbus-version.h are generated using configure.js.

Run
    cscript configure.js
or
    wscript configure.js
or
   double click configure.js to generate these files.
  • 其他平台的编译类似,看编译说明。当然也可以直接把源文件添加到工程

使用说明

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

  • 应用库的时候,记得要添加socket的库,在头文件前面添加下面的语句
#pragma comment(lib,"ws2_32.lib")
  • 几个重要的函数
#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
#endif

enum {
    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);    //监听端口,默认是502
        s = 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_address
    mb_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;
}

  • 如何与应用结合。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;

相关推荐

魔兽争霸3:在DOTA还没有火的时候,它曾经是最流行的魔兽RPG地图

《魔兽争霸3》素来被称之为宝藏级的游戏,因为它几乎全身都是宝。单人战役、对战模式、RPG地图都各自拥有大量玩家。它之所以能够长盛不衰,各种魔兽RPG地图发挥着居功至伟的作用。《忍者村大战》《守卫剑阁》...

魔兽世界的地图有多大,大到让你不相信自己的眼睛

魔兽世界的地图有多大,大到让你不相信自己的眼睛第一次开始玩魔兽世界的小伙伴在进入游戏后,会惊叹于游戏地图的巨大,现在魔兽世界开了9.0后,地图总共有多大呢,让我们来研究一下。魔兽世界每一次大版本更新都...

《魔兽世界:军团再临》世界地图公布 破碎群岛坐标确认

因为之前的世界地图上未显示破碎群岛的坐标,所以总有新手玩家会询问如何到达破碎群岛,即便是去过的老玩家也只是知道它就在大漩涡东南方。不过,在今日的《魔兽世界》7.0测试服更新补丁后,110级新地图“破碎...

魔兽世界:战士挺直腰杆,爬塔单刷更简单,就是动作有些不雅

前言:魔兽世界暗影国度刚上线,坦克、狂暴战、武器战,战士三系皆宣布报废,不论是副本还是团本全都没有了战士的身影。战士在整个暗影界都遭到了排挤,除非是有几个好基友,还能打打M本,要不然真的跟玩单机差不多...

回忆杀,最全魔兽争霸秘籍整理!你最常用的是哪个?

魔兽争霸3是暴雪于2002年7月推出的经典即时战略游戏,目前游戏已经推出了重置版,重置版虽然饱受玩家诟病,但是热度却着实不低。即时战略游戏上手难度其实比较大,魔兽争霸想要上手玩家必须做到一心二用,双线...

魔兽世界:23C限时DHT给你详解每一个大秘境坦克思路

作者:NGA-Elucidatee大家好,我是Elucidate,朋友基本都喊我大E。在8.3版本第三周,我发布了一篇帖子,做了一个8.3版本的DHT心得分享和各类指引。拖了这么长的时间才出来第二篇,...

「默契于心」魔兽争霸3:混乱武林·快速入门攻略讲解

1、了解地图(单独攻略讲解)魔兽争霸Ⅲ有很多种游戏模式:联机对战、RPG等模式。RPG模式是很多玩家喜欢玩的模式,RPG模式地图包括防守、TD塔防等。作为TD塔防最经典的地图之一莫过于混乱武林,自04...

桥梁专家:钢结构桥比混凝土桥易涡振 以后出现涡振可能性会提高

“以后我国桥梁出现涡振现象的可能性会提高,涡振不可能完全消除,就是大小的问题。”同济大学桥梁与结构抗风研究室主任朱乐东昨天在接受央视新闻记者采访时作出上述表态。朱乐东解释说,钢结构的桥容易发生涡振,混...

软件架构、框架、模式、模块、组件、插件、中间件一文打尽

一、架构软件架构(softwarearchitecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。软件架构是一个系统的草图。软件体系结构是构建计算机软件实践的基础。也称为软件体...

99%的工程人都不知道的钢结构计算软件!无需安装打开即用

99%的工程人都不知道的钢结构计算软件,16个钢结构计算小软件,无需安装打开即用,输入数值就能得出结果,省时省力高效快捷.钢结构计算软件文末有领的方式H型钢截面计算...

给电子工程师们安利一款特别好用的结构外形设计软件SolidWorks

作为一名软件和硬件都懂的嵌入式工程师,设计一个电路,用PCB绘图软件PowerPCB、AltiumDesigner绘制出电路板,然后再用C语言编译软件比如Keil、IAR编制出控制程序。最后再焊接调试...

头颅外伤七年后内耳结构消失 专家:警惕外伤致聋

发生头颅外伤七年后,患者刘叔(化名)的内耳结构竟然消失了!首届“广州实力中青年医生”、中山大学附属第一医院(下称“中山一院”)耳鼻咽喉科耳专科吴旋主任医师介绍,30%~50%的头颅外伤患者会出现耳聋,...

头颅外伤七年后内耳结构消失?专家:警惕外伤致聋

发生头颅外伤七年后,患者刘叔(化名)的内耳结构竟然消失了!首届“广州实力中青年医生”、中山大学附属第一医院(下称“中山一院”)耳鼻咽喉科耳专科吴旋主任医师介绍,30%~50%的头颅外伤患者会出现耳聋,...

智能结构仿真软件AIFEM 2024R1新版本功能介绍

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件,助力用户解决固体结构的静力学、动力学、振动、热力学、拓扑优化等实际工程问题。软件针对传统仿真软件前处理操作繁琐耗时、求解速度慢、后处理自动化程度...

Tekla 2023钢结构设计软件安装教程附下载方法

Tekla2023能够快速创建各种复杂的钢结构三维模型,支持从简单的梁、柱到复杂的桁架、网架等结构的建模。可以通过参数化建模功能,快速修改构件的尺寸、形状和位置,提高建模效率。还可导入.skp、.i...