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

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

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

相关文章

Python基础教程(二十):SMTP发送邮件

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

【C语言】assert.h——断言

文章目录 主要内容调试和发布模式使用示例用法总结与注意事项 断言是一种用于在程序执行过程中进行调试的工具&#xff0c;能够帮助开发者验证程序的某些假设是否为真。如果断言失败&#xff0c;程序会终止&#xff0c;并输出一个错误消息&#xff0c;通常包含出错的文件名和行…

13【MySQL必知必会】分组数据(GROUP BY,HAVING)

SQL语句 /*第13章 分组数据关键词&#xff1a;分组数据&#xff0c;GROUP BY&#xff0c;HAVING*/-- 计算供应商ID为1003的产品数量 SELECT COUNT(*) AS num_prods FROM products WHERE vend_id 1003;-- 按供应商ID分组&#xff0c;统计每个供应商的产品数量 SELECT vend_id,…

Linux网络工具:跟踪 TCP 连接的命令tcptrack命令详解

目录 一、概述 二、 用法 1、基本用法 2、选项 三、安装 1、说明 2、Debian 系统中安装 3、centos中安装 &#xff08;1&#xff09;下载源代码 &#xff08;2&#xff09;编译源代码 &#xff08;3&#xff09;安装 四、示例和输出 1. 显示所有 TCP 连接 2. 只跟…

微信监控销售防飞单系统,让你的团队业绩稳如泰山!

团队中偶尔出现的私单、飞单问题而烦恼不已&#xff1f;你是否渴望拥有一个神器&#xff0c;能够实时监控销售过程&#xff0c;确保团队业绩的稳健增长&#xff1f;今天&#xff0c;就让我们一起探索这款神奇的“微信监控销售防飞单系统”&#xff0c;让你的销售团队如虎添翼&a…

React 渲染流程分析

React 页面是由组件组成的&#xff0c;从根组件直到叶组件&#xff0c;内部的组件数通过 Fiber 来保存并触发并发更新。页面的展示分为两部分&#xff0c;首先是初始化&#xff0c;所有组件首次展示&#xff0c;都要进行渲染&#xff0c;之后是更新流程&#xff0c;也就是页面产…

【利用python制作一个小程序生成爱心】

要利用Python制作一个小程序来生成爱心&#xff0c;我们可以使用字符图形或者利用图形库&#xff08;如turtle&#xff09;来绘制。下面我将分别展示这两种方法。 方法一&#xff1a;字符图形爱心 这种方法使用ASCII字符来模拟爱心的形状。 def print_love():heart [ ♥ …

实况:老菜鸟自力更生从零开始重学spring目标是画出一张唬人大图(二、源码下载编译)

前情提要&#xff1a;调试前的基础知识梳理 速览 “Spring”包含哪些东西源码下载源码编译1、编译工具选择&#xff1a;gradle2、使用gradle编译spring并导入idea预编译spring-oxm导入IDEA确认合适的jdk版本排除spring-aspects模块 开始调试 “Spring”包含哪些东西 可以明确的…

代码随想录算法训练营第二十四天| (回溯) 77. 组合、 216.组合总和III、17.电话号码的字母组合

77. 组合 题目链接&#xff1a;77. 组合 文档讲解&#xff1a;代码随想录 状态&#xff1a;很多细节忘了 思路&#xff1a;先画图&#xff0c;然后可以发现&#xff0c;从1到n中选择k个数&#xff0c;可以看成是一个递归过程&#xff0c;这个递归的深度就是k。然后遍历当前这层…

四舍五入 和 交换变量值 题目

题目 JAVA3 四舍五入分析&#xff1a;代码&#xff1a; JAVA4 交换变量值分析&#xff1a;代码&#xff1a;大佬代码&#xff1a; JAVA3 四舍五入 描述 定义一个int类型变量i,i为由浮点数变量d四舍五入后的整数类型&#xff0c;请将转换后的i进行输出。 输入描述&#xff1a;…

Centos7安装jdk8或11以及切换方案

目录 jdk安装 安装OpenJDK11 安装OpenJDK8 配置默认的 Java 版本 验证 全局环境变量&#xff08;选配&#xff09; 个人版&#xff08;自己可以用&#xff0c;公司不建议&#xff09; 公司版本 /etc/profile 和 ~/.bash_profile 区别 前言-与正文无关 生活远不止眼前的苦…

【动态规划】| 路径问题之不同路径 力扣62

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;动态规划 &#x1f397;️ 如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/unique-paths/description/ 通常动态规划的题目有…

建筑电工精选最新模拟试题(含答案)

一、填空题 1、我国安全生产的基本方针是 安全 第一&#xff0c;预防 为主&#xff0c;综合治理。 2、特种作业人员&#xff0c;必须积极主动参加培训与考核 。既是法律法规的规定&#xff0c;也是自身工作&#xff0c;生产及生命安全 的需要 3、触电急救&#x…

如何在React组件中实现父子组件之间的通信?

在React中&#xff0c;父子组件之间的通信通常通过props&#xff08;属性&#xff09;和回调函数来实现。以下是具体的实现方式&#xff1a; 父组件向子组件传递数据&#xff08;通过props&#xff09; 在父组件中&#xff0c;你可以通过向子组件传递props来发送数据。子组件…

【Tkinter界面】Canvas 图形绘制(03/5)

文章目录 一、说明二、画布和画布对象2.1 画布坐标系2.2 鼠标点中画布位置2.3 画布对象显示的顺序2.4 指定画布对象 三、你应该知道的画布对象操作3.1 什么是Tag3.2 操作Tag的函数 https://www.cnblogs.com/rainbow-tan/p/14852553.html 一、说明 Canvas&#xff08;画布&…

双指针练习:和为s的两个数字

题目链接&#xff1a;剑指offer 57.和为s的两个数字 题目描述&#xff1a; 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 示例 1&#xff1a; 输入&#xff1a;price [3, 9…

【Windows】配置Flutter开发环境

一、下载 flutter sdk 点此跳至下载官网 下载好flutter sdk&#xff0c;并解压到自定义的位置。 二、配置环境变量 此电脑 --> 右键 选择 属性 --> 点击 高级系统设置 --> 会弹出系统属性的窗口&#xff0c;点击 环境变量 按钮 1.配置加速镜像地址 PUB_HOSTED_…

Web前端设计毕业论文:深度探索与未来展望

Web前端设计毕业论文&#xff1a;深度探索与未来展望 在数字化时代&#xff0c;Web前端设计作为互联网应用的重要组成部分&#xff0c;其重要性和复杂性日益凸显。本论文旨在深度探索Web前端设计的关键要素、发展趋势以及面临的挑战&#xff0c;为未来的研究和实践提供有价值的…

【python】python指南(四):typing静态类型注解综述

一、引言 对于算法工程师来说&#xff0c;语言从来都不是关键&#xff0c;关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言&#xff0c;实习的时候做一个算法策略后台用的是php&#xff0c;毕业后做策略算法开发&#xff0c;因为要用spark&#x…

大话C语言:第24篇 预处理

1 C语言编译流程 C语言的编译流程包括&#xff1a; 预编译&#xff1a;将.c 中的头文件展开、宏展开&#xff0c;生成的文件是.i 文件。gcc指令&#xff1a;gcc -E file.c -o file.i 编译&#xff1a;将预处理之后的.i 文件生成 .s 汇编文件。gcc指令&#xff1a;gcc -S file…