通信协议—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初学者教程,第三章:modbus寄存器说明

第三章:modbus寄存器说明 寄存器种类 Modbus协议中一个重要的概念是寄存器,所有的数据均存放于寄存器中。Modbus寄存器是指一块内存区域。Modbus寄存器根据存放的数据类型以及各自读写特性,将寄存器分为4个部分,这4个部分可以连续也可以不连续,由开发者决定。寄存器的意义如下表所示。 Modbus协议定义了设备间的数据传输方式,包括数据格式和通信规则。Modbus寄存器是协议中用

嵌入式通信协议----Wi-Fi协议详解(二)(基于STM32+有人物联网WIFI模块)

四、有人WIFI模块 1.模块介绍         Wi-Fi 模块用于实现串口到 Wi-Fi 数据包的双向透明转发,模块内部完成协议转换,通 过该模块,客户可以将物理设备连接到 Wi-Fi 网络上,从而实现物联网的控制与管理。     2.模块参数   Wi-Fi 模块的出厂默认参数如图所示: 基本参数如下图所示:         Wi-Fi 无线模块有三种 Wi-Fi

钡铼BL110在智慧气象站实现Modbus转MQTT无线接入主流云

随着物联网(IoT)技术的发展,各行各业都在积极探索将智能设备与云平台相结合,以提升系统的智能化和自动化水平。智慧气象站作为其中重要的一环,通过实时监测环境数据,为农业、交通、航空等行业提供精准的气象服务。 1. 硬件接口的灵活适配 钡铼BL110智能网关拥有丰富的硬件接口,包括2路或6路RS485/RS232串口、网口以及4G/WiFi接口。这些接口使得BL110能够灵活适配各种气象设备,如

Modbus协议转Profibus协议网关模块连PLC与激光发射器通讯

一、概述 在PLC控制系统中,从站设备通常以Modbus协议,ModbusTCP协议,Profinet协议,Profibus协议,Profibus DP协议,EtherCAT协议,EtherNET协议等。本文将重点探讨PLC连接Modbus协议转Profibus协议网关模块(XD-MDPB100)与激光发射器通讯的相关内容,为您详细解析这一过程的原理与操作步骤。 二、PLC连接Modbus

STM32---SPI通信协议(小白入、含源码)

写在前面:在单片机的学习过程中,各种通信协议的学习是必不可少的,在前面我们学习了串口通信、IIC通信,本节我们来认识一下SPI通信协议。包括其SPI基本概念、NORFLASH芯片的介绍以及相关的例程实验。 目录 一、SPI介绍 1.1什么是SPI? 1.2SPI结构框图 1.3SPI工作模式  1.4SPI工作寄存器 二、NORFLASH介绍 2.1NOR FLASH简介

汇川h3U用modbus配置扩展IO

扩展IO模块为4个艾莫迅RTU简易版,16输入,16输出。物理连接为RS485,A B两根线。 下面为H3Umodbus配置,关键是协议选择为:MODBUS主站配置。协议配置:和从站保持一致 通过下图的程序及配置,已经可以获得扩展模块的各个模块输入点信号: 从站1的16点输入映射M1200-M1215 ,对应通信缓存区是D180。  从站2的16点输入映射M1220-M1235 ,对应

FQC外检机使用Profibus转Modbus网关提升工作效率

一、简介 控制器通过Profibus转Modbus网关(XD-MDPB100)与视觉传感器实现通讯,在FQC外检机的应用为生产流程的自动化和优化提供了重要支持。在工业自动化领域,PLC常被用作控制器,通过采用在PLC与执行设备中间添加Profibus转Modbus网关,可省去过多为协议不同而烦心的焦虑。 二、案例 本文将探讨如何利用PLC通过Profibus转Modbus网关与视觉传感器

php实现modbus CRC校验

一:计算CRC校验函数 function calculateCRC16Modbus($string){$crcBytes = [];for ($i = 0; $i < strlen($string); $i += 2) {$crcBytes[] = hexdec(substr($string, $i, 2));}$crc = 0xFFFF;$polynomial = 0xA001; // T

这些数据可被Modbus采集,你还不知道???

为什么要用Modbus采集模块 Modbus采集模块之所以被广泛使用,是因为它提供了标准化的通信协议,确保了不同设备间的兼容性。它支持多种通信方式,易于实现,并且能够适应不同的网络环境。Modbus模块能够收集和传输各种工业数据,如温度、压力、流量等,帮助实现远程监控和自动化控制,同时降低开发和部署成本。 1. Modbus是什么 Modbus是一种应用层协议,广泛用于工业自动化

modbus流量计数据解析(4个字节与float的换算)

通过modbus协议从流量计中读取数据后,需要将获得的字节数据合成float类型。以天信流量计为例: 如何将字节数据合并成float类型呢?这里总结了三种方法。 以温度值41 A0 00 00为例 目录 1、使用char*逐字节解析2、使用memcpy转换2、使用联合体union转换 1、使用char*逐字节解析 float为4个字节,将这4个字节依次解析用获取的温度值数据进