通信协议—Modbus

2024-06-15 23:36
文章标签 通信协议 modbus

本文主要是介绍通信协议—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;
}

这篇关于通信协议—Modbus的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064896

相关文章

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

Modbus从基地址 1 和基地址 0 开始的区别

Modbus 是一种应用于工业自动化领域的通信协议,在设备之间进行数据交换。它支持多种数据类型(如线圈、离散输入、输入寄存器、保持寄存器),每种数据类型都有特定的地址范围。在使用 Modbus 通信时,设备的地址可以从 1 或 0 开始计数,这取决于具体实现。这种不同的基地址(1 或 0)选择,可能导致实际读取或写入的地址存在偏差,因此理解其差异是十分重要的。 1. Modbus 地址的基本概念

搭建SpringBoot+ Netty + WebSocket 通信协议框架

运用场景:与机器设备进行通讯或者其他场景; pom文件就不上传了,直接上代码,网上都可以找的到 主要是 SpringBoot 和 Netty 的依赖 1.配置类 @Component@ConfigurationProperties(prefix = "ws")public class WebSocketConfig {private int port;private String host

网关桥梁:modbus 转 profinet 网关中频加热机的智能融合之旅

一、项目序章:金属热处理的智慧曙光在金属锻造的辉煌舞台上,中频感应加热电源以其高效节能、精准控温的卓越才艺,成为了热处理、焊接与成型艺术中不可或缺的幕后英雄。然而,随着工业自动化的浪潮汹涌而至,如何让这位英雄融入智能工厂的广阔天地,实现远程指挥与智能操控,成为了新时代的命题。本案例,便是一场关于中频感应加热电源与工业网关携手,共绘智能工厂新蓝图的壮丽篇章。 二、系统蓝图:织就智慧互联的经纬1

HART转Modbus转换器

功能说明                 HART 转 Modbus 模块实现将 HART 信号中的数字信号转换为符合 Modbus RTU/ASCII 标准的 RS485 信号和 RS232 信号,实现仪表的数据读取功能。 主要技术指标 接线方法以及指示灯 24V-IN : 供电端口, 7-24V 都可以。 RS232-T ,

JAKA学习2:博途组态配置PROFINET和MODBUS

目录 一、GSD文件安装与设备组态1.1、GSD安装1.2、PROFINET设备组态 二、远程启动顺序2.1、启动步骤2.2、安全点配置 三、JAKA配置3.1、输入输出点配置 一、GSD文件安装与设备组态 1.1、GSD安装 1.2、PROFINET设备组态 二、远程启动顺序 2.1、启动步骤 1、 要保证DO9已开机状态,(开机可以远程控制,接个继电器

WinCC Modbus TCP 通信

概述 从版本WinCC V7.0 开始,WinCC支持Modbus TCP通讯,WinCC中的Modbus TCP驱动主要是针对施耐德PLC开发的,支持的PLC类型如下: 图1 本文档以Quantum CPU651和 Premium P57为例,介绍WinCC V7.2 的Modbus TCP通讯的组态步骤。并在最后列出WinCC和第三方Modbus TCP设备通讯的注意事项。 W

【CRC校验】CRC-16/MODBUS 源码(查表法)

废话少说,直接上代码: 源码 /*************************** CRC校验函数 ***************************//* Table of CRC values for high-order byte */const uint8_t crcTableHigh[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x8

Modbus通信主站和从站点区别的理解

定义 在Modbus协议中,主站和从站的角色分工非常明确: 主站(Master):主站是通信的发起者,它控制着整个通信过程。它发送请求并等待从站的响应。主站可以是PLC、计算机或其他控制器。它根据需要发起读写操作,并负责处理从站返回的数据。 从站(Slave):从站响应主站的请求,它的行为由主站的指令决定。每个从站都有一个唯一的地址,以便主站能准确地定位到它。当从站接收到主站的请求时,它会