通信协议—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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud跨服务远程调用

随着项目的使用者越来越多&#xff0c;项目承担的压力也会越来越大&#xff0c;为了让我们的项目能服务更多的使用者&#xff0c;我们不得不需要把我们的单体项目拆分成多个微服务&#xff0c;就比如把一个商城系统拆分成用户系统&#xff0c;商品系统&#xff0c;订单系统&…

从设备匠心到啤酒体验的全方位指南

从小型手工酿酒坊到大型现代化生产线&#xff0c;我们在经营之前&#xff0c;每一套设备的选择都是基于对精酿啤酒市场需求的洞察和自身品牌的定位。无论是追求传统风味的复刻&#xff0c;还是创新口味的实验&#xff0c;设备的灵活性与可控性都是决定成品能否达到预期的关键。…

【SpringCloud】创建新工程

前言 本文使用的是jdk17&#xff0c;mysql8。 以下用两个服务做演示&#xff1a; 订单服务&#xff1a;提供订单ID&#xff0c;获取订单详细信息。 商品服务&#xff1a;提供商品ID&#xff0c;获取商品详细信息。 对于订单服务和商品服务分别建立数据库&#xff1a; -- 订单服…

一款不写代码的开源爬虫工具!!【送源码】

爬虫&#xff0c;也被称为网络爬虫或网络蜘蛛&#xff0c;是一种自动化的网络机器人&#xff0c;其主要功能是按照一定的规则&#xff0c;自动浏览互联网并从网页中提取信息。 作为一个开发人员&#xff0c;相信大家都尝试过写一些爬虫&#xff0c;合理的利用一些爬虫工具&…

【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 35&#xff0c;连休两天~ 题目详情 [134] 加油站 题目描述 134 加油站 解题思路 前提&#xff1a;数组 思路&#xff1a;全局贪心算法&#xff1a;最小累加剩余汽油为负数&#xff0c;说明…

博客没人看啊?我分析是这些原因

1.封面 主题封面还是个性化封面&#xff1f;主题封面对系列化很友好&#xff0c;如下图左&#xff1a; 在目录中什么主题一目了然&#xff0c;个性化封面在目录中就略显杂乱。但是通过观察CSDN主页发现热榜文章清一色个性化封面。如果使文字封面就会显得很无聊。 所以从提高浏…

Orange_Pi_AIpro运行蜂鸟RISC-V仿真

Orange_Pi_AIpro运行蜂鸟RISC-V仿真 突发奇想&#xff0c;试一试Orange Pi AIpro上运行蜂鸟RISC-V的仿真。 准备 默认已经有一个Orange Pi AIpro&#xff0c;并且对设备进行一定的初始化配置&#xff0c;可以参考上一篇博文开源硬件初识——Orange Pi AIpro&#xff08;8T&a…

零代码本地搭建AI大模型,详细教程!普通电脑也能流畅运行,中文回答速度快,回答质量高

这篇教程主要解决&#xff1a; 1). 有些读者朋友&#xff0c;电脑配置不高&#xff0c;比如电脑没有配置GPU显卡&#xff0c;还想在本地使用AI&#xff1b; 2). Llama3回答中文问题欠佳&#xff0c;想安装一个回答中文问题更强的AI大模型。 3). 想成为AI开发者&#xff0c;开…

运行时类型识别RTTI(typeid dynamic_cast)和虚函数机制的关系

1.typeid 2.dynamic_cast 指针类型决定了可以操作的内存范围大小 子类指针转化为父类类型的指针的一般是合法的&#xff1a; 父类的指针类型转化为子类类型指针&#xff0c;超过合法操作范围&#xff0c;不安全 两种转换&#xff1a;编译期的转换&#xff0c;运行时的转化 编译…

【Java】图书管理系统-控制台输出

项目原码压缩包在我主页的资源中免费领取。&#xff08;在IDEA中运行&#xff0c;启动类在src -> Main 中运行&#xff09; 图书管理系统 设计一个简单的控制台输出的图书管理系统&#xff0c;我们首先需要明确其基本功能、设计内容以及设计要求。这个系统可以包括以下几个…

解决Windows中端口占用导致服务启动失败

解决Windows中端口占用导致服务启动失败 在cmd窗口中使用netstat -ano | findstr "3306"来查看哪个线程占用了3306端口。 下面的图片里面表示一个pid为5196的进程占用了端口 接着可以在cmd窗口中使用tasklist | findstr "5196" 根据pid查询进程名称 通过…

LVS三种负载均衡模式:NAT、Tunneling和DR的技术对比

1. LVS-NAT 模式的特性 IP使用&#xff1a;RS&#xff08;Real Server&#xff09;应使用私有地址&#xff0c;RS的网关必须指向DIP&#xff08;Director IP&#xff09;。网络范围&#xff1a;DIP和RIP必须在同一个网段内。数据包处理&#xff1a;请求和响应报文都需要经过Di…

[DDR4] DDR1 ~ DDR4 发展史导论

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 内存和硬盘是电脑的左膀右臂&#xff0c; 挑起存储的大梁。因为内存的存取速度超凡地快&#xff0c; 但内存上的数据掉电又会丢失&#xff0c;一直其中缓存的作用&#xff0c;就像是我们的工…

基于System-Verilog的FPGA设计与仿真

一、System-Verilog System Verilog的发展 SystemVerilog 的出现是为了因应日益复杂的数位电路设计和验证需求。虽然Verilog HDL 在早期的数位电路设计中得到了广泛应用&#xff0c;但随着技术的发展和电路复杂度的增加&#xff0c;Verilog HDL 在某些方面已经显得有些不足以满…

线稳源极跟随 线性电源前端降压

功率MOSFET线性电源涉及跟随.ms14 根本原理是Vgs对Id的控制&#xff0c;Vgs越大&#xff0c;Id越大&#xff0c;反之亦然。 观察转移特性曲线&#xff0c;结合接线图可知&#xff0c;电路稳定后&#xff0c;如果负载电阻增大&#xff0c;则Vsgnd增大&#xff0c;由于Vggnd有稳…

【数据挖掘】机器学习中相似性度量方法-余弦相似度

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

在k8s上部署一个简单的应用

部署一个简单的应用 实验目标&#xff1a; 部署一个简单的 web 应用&#xff0c;比如 Nginx 或者一个自定义的 Node.js 应用。 实验步骤&#xff1a; 创建一个 Deployment。创建一个 Service 来暴露应用。验证应用是否可以通过 Service 访问。 今天我们来做一下昨天分享的可…

【TB作品】STM32F102C8T6单片机,PWM发生器

硬件&#xff1a; STM32F102C8T6核心板&#xff0c;按键&#xff0c;0.96 OLED显示屏。 软件&#xff1a; 1、硬件启动触发单片机输出PWM&#xff0c;未触发之前PWM输出为低电平。 2、按键修改PWM的变化模式、变化时间长度、占空比上下限。 3、输出的PWM是固定的10kHZ的。 4、变…

王思聪日本街头在被偶遇

王思聪日本街头再被偶遇&#xff0c;甜蜜约会日常成网友热议焦点近日&#xff0c;有网友在日本街头再次偶遇了“国民老公”王思聪&#xff0c;这次他不仅携带着一位美丽的女友&#xff0c;还展现出了两人之间亲密无间的互动&#xff0c;让不少网友感叹&#xff1a;这真的是每天…

Kafka 如何保证消息顺序及其实现示例

Kafka 如何保证消息顺序及其实现示例 Kafka 保证消息顺序的机制主要依赖于分区&#xff08;Partition&#xff09;的概念。在 Kafka 中&#xff0c;消息的顺序保证是以分区为单位的。下面是 Kafka 如何保证消息顺序的详细解释&#xff1a; ⭕分区内消息顺序 顺序写入&#…