欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 通信协议—Modbus

通信协议—Modbus

2025/5/7 12:19:49 来源:https://blog.csdn.net/WXG1011/article/details/139672482  浏览:    关键词:通信协议—Modbus

1、modbus简介

Modbus服务器:接收处理来自客户端的请求,并返回相应的响应;

Modbus客户端:向Modbus服务器发送请求,并接收服务器返回的响应的设备或程序; 

2、modbus poll调试工具下载

modbus poll用于测试和调试Modbus从设备;Modbus Slave用来模拟从站设备,接收主站的命令包,回送数据包。

官网地址 Modbus test and simulation

使用方法参考 Modbus Slave和Modbus Poll的使用说明-CSDN博客 

3、windows系统libmodbus库编译与安装

libmodbus库的编译与安装参考博客 [开源库的使用]libModbus编译及使用_libmodbus库-CSDN博客

注意:根据自己电脑配置,编译对应版本的modbus库,作者第一次编译win32位的,导致拷贝项目中运行时出现库计算机类型“win32”与目标计算机类型“×64”冲突以及无法解析外部链接库的错误。

4、libmodbus库的使用

步骤一:*.h、*.lib、*.dll文件拷贝

将libmodbus-master\src目录下所有.h文件、libmodbus-master\src\win32目录下的config.h文件、编译生成的modbus.dll与modbus.lib文件复制到项目对应文件夹下。

步骤二:导入lib库

QT中配置方式:

VS中配置方式:导入附加库目录及附加依赖项。

 步骤三:libmodbus库的使用

参考链接 Modbus通讯开发随记1——LibModbus库的学习-CSDN博客

从机测试代码:

//----------------从机--------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "modbus.h"int main(int argc, char *argv[]) {int socket = -1;uint8_t *query;modbus_t *mb;int ret;_modbus_mapping_t *mb_mapping;mb = modbus_new_tcp("127.0.0.1", 502);query = (uint8_t *)malloc(MODBUS_TCP_MAX_ADU_LENGTH);//modbus_mapping_new_start_address:分配寄存器阵列if ((mb_mapping = modbus_mapping_new_start_address(0, 0, 0, 0, 15, 3, 0, 0)) == NULL) {modbus_free(mb);printf("new map failed: %s\n", modbus_strerror(errno));return 0;}mb_mapping->tab_registers[0] = 0x1001;mb_mapping->tab_registers[1] = 0x1002;mb_mapping->tab_registers[2] = 0x1003;socket = modbus_tcp_listen(mb, 1);modbus_tcp_accept(mb, &socket);printf("create modbus slave success\n");while (1) {do {/*轮询串口数据*/ret = modbus_receive(mb, query);} while (ret == 0);if (ret > 0) {printf("len=%02d\t", ret);   /*%02d格式限定符,其中0表示变量宽度不足时以0作为填充,2表示显示宽度至少为2,d表示十进制整数*/for (int i = 0; i < ret; ++i)printf("%02x", query[i]);printf("\n");modbus_reply(mb, query, ret, mb_mapping);}else {printf("quit the loop: %s\n", modbus_strerror(errno));break;}}modbus_mapping_free(mb_mapping);modbus_close(mb);free(query);modbus_free(mb);return 0;
}

主机测试代码:

//----------------主机--------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "modbus.h"int main(int argc, char *argv[]) {uint16_t table[3];modbus_t *mt;mt = modbus_new_tcp("127.0.0.1", 502);if (modbus_connect(mt) == -1) {modbus_free(mt);printf("connect failed: %s\n", modbus_strerror(errno));return 0;}while (1) {//modbus_read_registers:读取寄存器数据if (modbus_read_registers(mt, 0X0F, 3, table) == 3)printf("read success: 0x%04x 0x%04x 0x%04x \n", table[0], table[1], table[2]);/*%04x格式限定符,其中0表示变量宽度不足时以0作为填充,4表示显示宽度至少为4,x表示十六进制整数*/else {printf("read error: %s\n", modbus_strerror(errno));break;}for (int i = 0; i < 3; ++i)table[i]++;//modbus_write_registers:写多个寄存器if (modbus_write_registers(mt, 0X0F, 3, table) == 3)printf("write success: 0x%04x 0x%04x 0x%04x \n", table[0], table[1], table[2]);else {printf("write error: %s\n", modbus_strerror(errno));break;}Sleep(1000);}modbus_close(mt);modbus_free(mt);system("pause");return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词