通信协议—Modbus

news2024/11/26 17:41:45

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 JavaScript笔记(精简版)

系列文章目录 文章目录 系列文章目录第一章 JavaScript简介&#xff1a;1.1 特点&#xff1a;1.2 JavaScript与Java的区别1.3 JavaScript不能做什么1.4 JavaScript组成 第二章 JavaScript必备基础知识JavaScript代码调试方式 一、变量2.1.1 变量的命名规则&#xff1a;2.1.2 变…

03-appium环境配置和启动参数设置

参考文章&#xff1a;https://blog.csdn.net/lovedingd/article/details/110949993 一、appium介绍 Appium是一个开源、跨平台的自动化测试框架&#xff0c;支持Android、IOS等平台&#xff0c;同时也支持多语言&#xff0c;比如&#xff1a;Java、Python等。 Appiumu通过扩展…

【内存管理之C语言数组】

1.栈空间上的C数组 糟糕的可用性&#xff0c;但是你将在遗留代码中见到它们 相同类型的对象的内存块 大小必须是常量表达式 第一个元素索引为0 2.指针和C数组 更奇怪的是&#xff1a;数组标识符退化为指向第一个元素的指针 3.访问数组 4.堆空间上的C数组 相同类型的对象的内…

transformer模型首次体验代码

前言 首先是安装python&#xff0c;更新pip源到清华源。安装transformer pip install transformer安装jupyter lab&#xff0c;也简单一行 pip install jupyterlab现在不想用anaconda了&#xff0c;因为国内没有源了&#xff0c;国外的又慢。直接用pip吧。 然后开始体验之旅…

Go TOKEN机制与跨域处理方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

深入浅出 Qt 中 QListView 的设计思想,并掌握大规模、高性能列表的实现方法

在大规模列表控件的显示需求中&#xff0c;必须解决2个问题才能获得较好的性能&#xff1a; 第一就是数据存在哪里&#xff0c; 避免出现数据的副本。第二就是如何展示Item&#xff0c;如何复用或避免创建大量的Item控件。 在QListView体系里&#xff0c;QAbstractListModel解…

大数据实训项目(小麦种子)-02、实训项目整体功能介绍与演示

文章目录 前言界面及功能描述实现功能描述技术选型界面展示首页界面功能1&#xff1a;HDFS&#xff0c;选择文件上传文件详细步骤 功能2&#xff1a;MapReduce预处理数据功能3&#xff1a;Hbase存储小麦种子数据并查询前10条记录功能4&#xff1a;Hive分析原始csv文件数据并ech…

Linux C编译器从零开发二

自定义分词器 test.c #include <ctype.h> #include <stdarg.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h>typedef enum {TK_PUNCT, // PunctuatorsTK_NUM, // Numeric literalsTK_EOF, // …

基于flask的网站如何使用https加密通信-问题记录

文章目录 项目场景&#xff1a;问题1问题描述原因分析解决步骤解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景&#xff1a; 项目场景&#xff1a;基于flask的网站使用https加密通信一文中遇到的问题记录 问题1 问题描述 使用下面的命令生成自签名的SSL/TLS证书和…

BUUCTF---[MRCTF2020]你能看懂音符吗

1、下载附件&#xff0c;是一个压缩包&#xff0c;解压&#xff0c;发现解压失败 2、用winhex分析文件&#xff0c;发现文件头不对 3、将文件头改为&#xff1a;52617221&#xff0c;保存 4、解压得到word 5、在文档发现下面内容 6、根据题目的描述&#xff0c;将音乐字符解码…

Docker部署MaxKB 知识库(提高问答命中率)

前言 上一篇文章简单的介绍了下MaxKB&#xff0c;这一篇文章就讲如何部署MaxKB。 MaxKB实现逻辑也比较简单&#xff0c;如下图。 安装 修改Docker镜像源 由于不可抗力&#xff0c;部分源已经无法使用&#xff0c;需要修改以下的源地址来拉取镜像。如果是linux&#xff0c;…

深度学习(PyTorch)批注理解,建议边学可以边看这个笔记

前言 动手学习深度学习&#xff0c;内容丰富&#xff0c;但是对于初学者有很多晦涩难懂的地方&#xff0c;我将日常更新这篇文章以截图的形式&#xff0c;每天高强度学习四五个小时&#xff0c;精力缺乏&#xff0c;我认为&#xff0c;如果想学习这个深度学习&#xff0c;你需…

人工智能GPU互联技术分析,芯片巨头UALink向英伟达NVLink开战

芯片巨头组团&#xff0c;向英伟达NVLink开战 八大科技巨头——AMD、博通、思科、Google、惠普企业、英特尔、Meta及微软——联合推出UALink&#xff08;Ultra Accelerator Link&#xff09;技术&#xff0c;为人工智能数据中心网络设定全新互联标准。此举旨在打破Nvidia的市场…

LoginGUI.java

LoginGUI.java 完成效果如下图&#xff1a; CODE Summary: This code sets up a login GUI using Swing. It defines a LoginGUI class extending JFrame. The constructor initializes the GUI components and sets up event listeners. The event_login method handles…

TCP三次握手的过程

一、什么是TCP TCP是面向连接的、可靠的、基于字节流的传输层通信协议。 二、TCP的头部格式 序列号:在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过SYN包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解…

分数计算 初级题目

今天继续更题。今天的题目是《第五单元 分数的加减法》初级题目。 定位&#xff1a;题目较为初级&#xff0c;适合预习 参考答案&#xff1a;CACCADACAABACBBCDBCB

shell编程基础(第18篇:更多的文件操作命令介绍)

前言 对于文件来说&#xff0c;除了它的文件内容之外&#xff0c;就是对其文件本身的操作&#xff0c;比如我们想要重命名文件、移动文件、复制文件、已经获取文件所在目录&#xff0c;文件名等操作&#xff0c;今天一起学习更多的文件操作相关的命令 basename 用于获取文件名…

2024年【N2观光车和观光列车司机】考试技巧及N2观光车和观光列车司机模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N2观光车和观光列车司机考试技巧参考答案及N2观光车和观光列车司机考试试题解析是安全生产模拟考试一点通题库老师及N2观光车和观光列车司机操作证已考过的学员汇总&#xff0c;相对有效帮助N2观光车和观光列车司机模…

第12章.STM32标准库简介

目录 0. 《STM32单片机自学教程》专栏 12.1 CMSIS 标准 12.2 STM32标准库文件结构 12.2.1 主结构 12.2.2 Libraries固件库文件 CMSIS文件夹 1.core_cm3.c&core_cm3.h 2.startup启动文件 3.Stm32f10x.h 4.system_stm32f10x.c&system_stm32f10…

微前端乾坤方案

微前端乾坤方案 了解乾坤 官方文档 介绍 qiankun 是一个基于 single-spa 的微前端实现库&#xff0c;旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。 qiankun 的核心设计理念 &#x1f944; 简单 由于主应用微应用都能做到技术栈无关&#xff0c;qiankun 对…