一文搞懂物联网Modbus通讯协议

简介: 一般来说,常见的物联网通讯协议众多,如蓝牙、Zigbee、WiFi、ModBus、PROFINET、EtherCAT、蜂窝等。而在众多的物联网通讯协议中,Modbus是当前非常流行的一种通讯协议。它一种串行通信协议,是Modicon公司于1979年为使用可编程逻辑控制器(PLC)通信而制定的,可以说,它已经成为工业领域通信协议的业界标准。

1 概述

随着IT技术的快速发展,当前已经步入了智能化时代,其中的物联网技术将在未来占据越来越重要的地位。根据百度百科的定义,物联网(Internet of things,简称IOT )即“万物相连的互联网”,是互联网基础上的延伸和扩展的网络,物联网将各种信息有机的结合起来,实现任何时间、任何地点,人、机、物的互联互通。物联网从技术上来说,很重要的核心是通讯协议,即如何按约定的通讯协议,把机、物和人与互联网相连接,进行信息通信,以实现对人、机和物的智能化识别、定位、跟踪、监控和管理的一种网络。

一般来说,常见的物联网通讯协议众多,如蓝牙、Zigbee、WiFi、ModBus、PROFINET、EtherCAT、蜂窝等。而在众多的物联网通讯协议中,Modbus是当前非常流行的一种通讯协议。它一种串行通信协议,是Modicon公司于1979年为使用可编程逻辑控制器(PLC)通信而制定的,可以说,它已经成为工业领域通信协议的业界标准。其优势如下:

  • 免费无版税限制
  • 容易部署
  • 灵活限制少

2 ModBus协议概述

Modbus通讯协议使用请求-应答机制在主(Master)(客户端Client)和从(Slave)(服务器Server)之间交换信息。Client-Server原理是通信协议的模型,其中一个主设备控制多个从设备。这里需要注意的是:Modbus通讯协议当中的Master对应Client,而Slave对应Server。Modbus通讯协议的官网为www.modbus.org。目前官网组织已经建议将Master-Slave替换为Client-Server。从协议类型上可以分为:Modbus-RTU(ASCII)、Modbus-TCP和Modbus-Plus。本文主要介绍Modbus-RTU(ASCII)的通讯协议原理。标准的Modbus协议物理层接口有RS232、RS422、RS485以太网接口。

通讯示意图如下:

1.jpg

  一般来说,Modbus通信协议原理具备如下的特征:

  • 一次只有一个主机(Master)连接到网络
  • 只有主设备(Master)可以启动通信并向从设备(Slave)发送请求
  • 主设备(Master)可以使用其特定地址单独寻址每个从设备(Slave),也可以使用地址0(广播)同时寻址所有从设备(Slave)
  • 从设备(Slave)只能向主设备(Master)发送回复
  • 从设备(Slave)无法启动与主设备(Master)或其他从设备(Slave)的通信

    Modbus协议可使用2种通信模式交换信息:

  • 单播模式
  • 广播模式

    不管是请求报文还是答复报文,数据结构如下:

2.jpg

即报文(帧数据)由4部分构成:地址(Slave Number)+功能码(Function Codes)+数据(Data)+校验(Check) 。其中的地址代表从设备的ID地址,作为寻址的信息。功能码表示当前的请求执行具体什么操作,比如读还是写。数据代表需要通讯的业务数据,可以根据实际情况来确定。最后一个校验则是验证数据是否有误。其中的功能码说明如下:

3.jpg

比如功能码为03代表读取当前寄存器内一个或多个二进制值,而06代表将二进制值写入单一寄存器。为了模拟Modbus通讯协议过程,这里可以借助模拟软件:

  • Modbus Poll(Master)
  • Modbus Slave

具体的安装过程这里不再赘述。首先这里需要模拟一个物联网传感器设备,这里用Modbus Slave来定义,首先打开此软件,并定义一个ID为1的设备:

4.jpg

此功能码为03。另外,设置连接参数,示例界面如下:

5.jpg

下面再用Modbus Poll软件来模拟主机,来获取从设备的数据。首先定义一个读写报文。

6.jpg

然后再定义一个连接信息:

7.jpg

注意:两个COM口要使用不同的名称。

成功建立通讯后,通信的报文格式如下:

8.jpg

Tx代表请求报文,而Rx代表答复报文。

3 ModBus Java实现

下面介绍一下如何用Java来实现一个Modbus TCP通信。这里Java框架采用Spring Boot,首先需要引入Modbus4j库。Maven依赖库的pom.xml定义如下:

 <dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j</artifactId><version>3.0.3</version>
</dependency>
<dependency><groupId>org.rxtx</groupId><artifactId>rxtx</artifactId><version>2.1.7</version>
</dependency>

其中的modbus4j库可能在Maven中无法正常下载,可以手动下载后放于项目中,并添加到项目库中。如下图所示:

15.jpg

注意:首次实用串口时,需要进行安装,否则会报 no rxtxSerial in java.library.path的错误。

访问RXTX for Java 下载对应操作系统的库文件,解压后安装如下指导进行拷贝后安装。

For a JDK installation:
Copy RXTXcomm.jar ---> <JAVA_HOME>\jre\lib\ext
Copy rxtxSerial.dll ---> <JAVA_HOME>\jre\bin
Copy rxtxParallel.dll ---> <JAVA_HOME>\jre\bin

另外,需要注意,这里还需要串口支持,这里可以用虚拟串口软件来解决。

18.png

下面给出Java核心代码片段。

    public static SerialPort open(String portName, Integer baudRate, Integer dataBits,Integer stopBits, Integer parity) {SerialPort result = null;try {CommPortIdentifier identifier = CommPortIdentifier.getPortIdentifier(portName);// 打开端口CommPort commPort = identifier.open(portName, 2000);// 判断是不是串口if (commPort instanceof SerialPort) {result = (SerialPort) commPort;// 设置串口的参数result.setSerialPortParams(baudRate, dataBits, stopBits, parity);log.info("打开串口{}成功", portName);}else{log.info("{}不是串口", portName);}} catch (Exception e) {log.error("打开串口{}错误", portName, e);}return result;}

首先需要启动Modbus RTU Slave程序,核心代码片段如下:

    public static void createRtuSlave(){// 串口是COM3,波特率是9600SerialPortWrapperImpl wrapper = new SerialPortWrapperImpl("COM3", 9600,SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, 0, 0);ModbusFactory modbusFactory = new ModbusFactory();创建RTU Slavefinal ModbusSlaveSet slave = modbusFactory.createRtuSlave(wrapper);// 寄存器里可以设置线圈状态、离散输入状态、保持寄存器和输入寄存器//从站设备ID是1BasicProcessImage processImage = new BasicProcessImage(1);processImage.setInvalidAddressValue(Short.MIN_VALUE);slave.addProcessImage(processImage);// 添加监听器,监听slave线圈状态和保持寄存器的写入processImage.addListener(new MyProcessImageListener());//设置数据setCoil(processImage);setInput(processImage);setHoldingRegister(processImage);setInputRegister(processImage);// 开启线程启动new Thread(() -> {try {slave.start();}catch (ModbusInitException e) {e.printStackTrace();}}).start();}

而Modbus RTU Master程序,核心代码片段如下:

    private static void createRtuMaster() throws Exception{//串口是COM4,波特率是9600SerialPortWrapperImpl wrapper = new SerialPortWrapperImpl("COM4", 9600,SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, 0, 0);ModbusFactory modbusFactory = new ModbusFactory();//RTU MasterModbusMaster master = modbusFactory.createRtuMaster(wrapper);master.init();// 从站设备ID是1int slaveId = 1;// 读取保持寄存器readHoldingRegisters(master, slaveId, 0, 3);// 将地址为0的保持寄存器数据修改为0writeRegister(master, slaveId, 0, 0);// 再读取保持寄存器readHoldingRegisters(master, slaveId, 0, 3);}

启动后输出如下所示:

//Slave
[Thread-1] INFO cn.wu.demo.modbus4j.util.SerialPortUtils - 打开串口COM3成功
保持寄存器地址=0,旧值=8,新值=0
//Master  //  
[main] INFO cn.wu.demo.modbus4j.util.SerialPortUtils - 打开串口COM4成功
读取保持寄存器=[8, 56, 0]
写保持寄存器成功
读取保持寄存器=[0, 56, 0]

参考开源项目:GitHub - wu-boy/modbus4j: modbus4j demo

原文链接
本文为阿里云原创内容,未经允许不得转载。 

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

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

相关文章

快看世界技术VP安尝思:从漫画到视频,如何用技术赋能创作

供稿 | 快看世界 2月25日&#xff0c;在火山引擎举办的视频云科技原力峰会上&#xff0c;快看世界技术VP安尝思受邀参加&#xff0c;并发表主题为《如何搭建轻量高效的视频技术体系》的演讲。 安尝思表示&#xff0c;快看视频内容的革命性变化来自于漫剧的推出&#xff0c;在过…

2021云栖大会丨阿里云发布第四代神龙架构,提供业界首个大规模弹性RDMA加速能力

简介&#xff1a; 10月20日&#xff0c;2021年杭州栖大云会上&#xff0c;阿里云发布第四代神龙架构&#xff0c;升级至全新的eRMDA网络架构&#xff0c;是业界首个大规模弹性RDMA加速能力。 10月20日&#xff0c;2021年杭州栖大云会上&#xff0c;阿里云发布第四代神龙架构。…

Rambus推出面向下一代数据中心的PCIe 6.0控制器

新闻摘要&#xff1a; 将先进的人工智能/机器学习、存储和网络应用的性能提升至64 GT/s优化了功耗、面积和延迟&#xff0c;全方位实现PCIe 6.0特性集成IDE引擎提供最先进的数据安全Rambus PCIe 6.0控制器框图 作为业界领先的芯片和IP核供应商&#xff0c;致力于使数据传输更…

阿里云混合云Apsara Stack 2.0发布 加速政企数智创新

简介&#xff1a; 2021年10月21日&#xff0c;杭州 – 今日&#xff0c;阿里云于云栖大会正式发布Apsara Stack 2.0&#xff0c;从面向单一私有云场景&#xff0c;升级为服务大型集团云&行业云场景。新一代Apsara Stack不仅可以为政企定制稳定、安全、开放、智能的数字底座…

ArrayList源码浅析

简介&#xff1a; ArrayList作为我们开发中最常用的集合&#xff0c;作为极高频次使用的类&#xff0c;我们不妨阅读源码一谈究竟。 前言 ArrayList作为我们开发中最常用的集合&#xff0c;作为极高频次使用的类&#xff0c;我们不妨阅读源码一谈究竟。 介绍 ArrayList继承…

阿里云边缘云ENS再升级 四大场景应用加速产业数字化落地

简介&#xff1a; 云栖大会 | 于10月21日上午举办的边缘云应用升级与技术创新论坛中&#xff0c;阿里云边缘云ENS产品全面升级&#xff0c;从边缘云产品、技术、行业应用等维度全面阐述阿里云在边缘计算领域的技术积累、产品&解决方案沉淀、商业实践。 一年一度科技圈盛事…

在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer(下)

作者 | Addo Zhang来源 | 云原生指北在上一篇《在 Kubernetes 集群中使用 MetalLB 作为 LoadBalancer&#xff08;上&#xff09;》中&#xff0c;我们使用 MetalLB 的 Layer2 模式作为 LoadBalancer 的实现&#xff0c;将 Kubernetes 集群中的服务暴露到集群外。还记得我们在 …

聚焦2021云栖大会,边缘云专场畅谈技术应用创新

简介&#xff1a; 本届大会以“前沿 探索 想象力”为主题&#xff0c;与业界同仁、合作伙伴共同打造一场数字时代的云上相聚。其中&#xff0c;边缘计算技术领域因5G快速发展而备受关注&#xff0c;阿里云边缘云专场吸引了数百位参会嘉宾驻足。 于10月21日上午举办的“边缘云应…

技术干货 | 闲鱼:一个优秀的 Push 平台,需要经历怎样的前世今生

简介&#xff1a; mPaaS 消息推送服务&#xff0c;快速集成多家厂商 Push 通道&#xff0c;有效提高用户留存率&#xff0c;提升用户体验。 编者荐语&#xff1a; 点击这里&#xff0c;了解 mPaaS 消息推送服务&#xff0c;快速集成多家厂商 Push 通道&#xff0c;有效提高用户…

「深入浅出」主流前端框架更新批处理方式

作者 | &#x1f47d;来源 | 前端Sharing背景在不同的技术框架背景下&#xff0c;处理更新的手段各不相同&#xff0c;今天我们来探讨一下&#xff0c;主流的前端框架批量处理的方式&#xff0c;和其内部的实现原理。通过今天的学习&#xff0c;你将收获这些内容&#xff1a;主…

钉钉宜搭3.0发布!易连接、酷数据、更安全

简介&#xff1a; 10月20日&#xff0c;在2021云栖大会低代码分论坛上&#xff0c;阿里巴巴资深技术专家叶周全&#xff08;花名骁勇&#xff09;发布钉钉宜搭3.0版本。 10月20日&#xff0c;在2021云栖大会低代码分论坛上&#xff0c;阿里巴巴资深技术专家叶周全&#xff08;…

基层数字化治理困境如何破局?

简介&#xff1a; 10月20日&#xff0c;2021云栖大会低代码分论坛如约举行。在这场低代码行业的盛会上&#xff0c;兰溪市大数据发展中心党组书记、主任芦建洪分享的内容获得了在场观众的热烈反响&#xff0c;兰溪市使用钉钉宜搭低代码破解基层数字化治理困境的成功经验也为全国…

形式化验证工具TLA+:程序员视角的入门之道

简介&#xff1a; 女娲是飞天分布式系统中提供分布式协同的基础服务&#xff0c;支撑着阿里云的计算、网络、存储等几乎所有云产品。在女娲分布式协同服务中&#xff0c;一致性引擎是核心基础模块&#xff0c;支持了Paxos&#xff0c;Raft&#xff0c;EPaxos等多种一致性协议&a…

性能突出的 Redis 是咋使用 epoll 的?

作者 | 闪客来源 | 低并发编程我是个 redis 服务&#xff0c;我马上就要启动了因为我的主人正在控制台输入&#xff1a;./redis-server宏观上看下我的流程突然&#xff0c;主人按下了回车键&#xff0c;不得了了。shell 程序把我的程序加载到了内存&#xff0c;开始执行我的 ma…

阿里云重磅发布业务中台产品 BizWorks,中台发展进入下一个阶段

简介&#xff1a; 业务中台产品BizWorks重磅发布&#xff0c;这可以看作是阿里云在 “做厚中台” 战略上继 “云钉一体”之后的又一个新动作&#xff01; 10 月 19 日&#xff0c;2021 云栖大会正式开幕&#xff0c;连续举办多年的云栖大会俨然已经成为了国内科技产业展示前沿…

java32位怎么用eclipse_无法在Windows 7 32位上打开eclipse

我正在使用Eclipse Indigo(eclipse-jee-indigo-SR2-win32) . 当我双击eclipse.exe时&#xff0c;会出现以下对话框&#xff1a;日志文件的内容如下&#xff1a;!SESSION 2013-05-27 17:55:26.853 -----------------------------------------------eclipse.buildIdM20120208-080…

云栖发布|企业级互联网架构全新升级 ,助力数字创新

简介&#xff1a; 云原生产品家族全面升级&#xff0c;让业务技术团队有了更多选择&#xff0c;通过简单、丰富、开放和低成本的 PaaS 服务&#xff0c;帮助企业客户更简单、更高效的进行在云上创新&#xff0c;搭建更符合业务需要和团队情况的技术体系。 作者&#xff5c;白玙…

当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢

作者 | 阿Q来源 | 阿Q说代码事情是这样的&#xff1a;对话中的截图如下&#xff1a;看了阿Q的解释&#xff0c;你是否也和“马小跳”一样存在疑问呢&#xff1f;请往&#x1f447;看我们都知道在java中&#xff0c;只要是类型兼容&#xff0c;就可以将一种类型的对象分配给另一…

java 垃圾回收 新生代_Java垃圾回收

一、概述Java垃圾回收器实现内存的自动分配和回收&#xff0c;这两个操作都发生在Java堆上(还包括方法区&#xff0c;即永久代)。垃圾回收操作不是实时的发生(对象死亡不会立即释放)&#xff0c;当内存消耗完或者是达到某一指标(threshold,使用内存占总内存的比列&#xff0c;比…

一图看懂云栖大会「云原生」发布

简介&#xff1a; 云原生产品全新升级 原文链接 本文为阿里云原创内容&#xff0c;未经允许不得转载。