一文搞懂物联网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的错误。

访问http://fizzed.com/oss/rxtx-for-java 下载对应操作系统的库文件,解压后安装如下指导进行拷贝后安装。

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

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

18.png

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

publicstaticSerialPortopen(StringportName, IntegerbaudRate, IntegerdataBits,
IntegerstopBits, Integerparity) {
SerialPortresult=null;
try {
CommPortIdentifieridentifier=CommPortIdentifier.getPortIdentifier(portName);
// 打开端口CommPortcommPort=identifier.open(portName, 2000);
// 判断是不是串口if (commPortinstanceofSerialPort) {
result= (SerialPort) commPort;
// 设置串口的参数result.setSerialPortParams(baudRate, dataBits, stopBits, parity);
log.info("打开串口{}成功", portName);
            }else{
log.info("{}不是串口", portName);
            }
        } catch (Exceptione) {
log.error("打开串口{}错误", portName, e);
        }
returnresult;
    }

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

publicstaticvoidcreateRtuSlave(){
// 串口是COM3,波特率是9600SerialPortWrapperImplwrapper=newSerialPortWrapperImpl("COM3", 9600,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, 0, 0);
ModbusFactorymodbusFactory=newModbusFactory();
创建RTUSlavefinalModbusSlaveSetslave=modbusFactory.createRtuSlave(wrapper);
// 寄存器里可以设置线圈状态、离散输入状态、保持寄存器和输入寄存器//从站设备ID是1BasicProcessImageprocessImage=newBasicProcessImage(1);
processImage.setInvalidAddressValue(Short.MIN_VALUE);
slave.addProcessImage(processImage);
// 添加监听器,监听slave线圈状态和保持寄存器的写入processImage.addListener(newMyProcessImageListener());
//设置数据setCoil(processImage);
setInput(processImage);
setHoldingRegister(processImage);
setInputRegister(processImage);
// 开启线程启动newThread(() -> {
try {
slave.start();
            }
catch (ModbusInitExceptione) {
e.printStackTrace();
            }
        }).start();
    }

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

privatestaticvoidcreateRtuMaster() throwsException{
//串口是COM4,波特率是9600SerialPortWrapperImplwrapper=newSerialPortWrapperImpl("COM4", 9600,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, 0, 0);
ModbusFactorymodbusFactory=newModbusFactory();
//RTU MasterModbusMastermaster=modbusFactory.createRtuMaster(wrapper);
master.init();
// 从站设备ID是1intslaveId=1;
// 读取保持寄存器readHoldingRegisters(master, slaveId, 0, 3);
// 将地址为0的保持寄存器数据修改为0writeRegister(master, slaveId, 0, 0);
// 再读取保持寄存器readHoldingRegisters(master, slaveId, 0, 3);
    }

启动后输出如下所示:

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

参考开源项目:https://github.com/wu-boy/modbus4j

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
2月前
|
Java Maven
【开源视频联动物联网平台】J2mod库写一个Modbus RTU 服务器
【开源视频联动物联网平台】J2mod库写一个Modbus RTU 服务器
78 0
|
2月前
|
网络协议 Java
【开源视频联动物联网平台】J2mod库写一个Modbus TCP 服务器
【开源视频联动物联网平台】J2mod库写一个Modbus TCP 服务器
76 0
EMQ
|
9月前
|
存储 监控 网络协议
工业物联网数据桥接教程:Modbus 桥接到 MQTT
通过将 Modbus RTU 或 TCP 转换为 MQTT 消息,可以轻松地将设备数据发送到云端,并在需要时进行远程控制和监控。
EMQ
527 0
工业物联网数据桥接教程:Modbus 桥接到 MQTT
|
存储 消息中间件 安全
MQTT物联网通讯协议入门及Demo实现
MQTT物联网通讯协议入门及Demo实现
|
存储 消息中间件 安全
物联网通讯协议MQTT入门
让我一起带大家来了解吧~
|
1天前
|
存储 安全 物联网
未来交织:区块链、物联网与虚拟现实的技术融合与应用革新
【5月更文挑战第9天】 随着科技的迅猛发展,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐渗透到我们生活的各个角落。这些技术不仅单独发展,而且越来越多地相互融合,催生出新的应用场景和商业模式。区块链技术以其去中心化和不可篡改的特性,为数据安全提供了坚实的保障;物联网通过智能化连接日常设备,极大地提升了生活和工作效率;而虚拟现实则通过沉浸式体验,改变了人们的娱乐和学习方式。本文将探讨这些技术的发展趋势,并分析它们在不同领域的结合应用,从而描绘出一个由新技术驱动的未来蓝图。
|
1天前
|
安全 物联网 区块链
未来技术的融合潮流:区块链、物联网与虚拟现实的交汇点
【5月更文挑战第9天】 在数字化时代的浪潮中,新技术不断涌现,重塑着商业模式、社会互动和日常生活。本文聚焦于三项前沿技术——区块链、物联网(IoT)和虚拟现实(VR),探讨它们各自的发展趋势以及如何相互交织,共同构建一个更加智能、安全和沉浸式的未来世界。通过分析每项技术的核心优势和潜在挑战,文章描绘了一个多技术融合的应用蓝图,旨在为读者提供一个关于这些技术如何联合起来改变未来世界的清晰视角。
12 5
|
1天前
|
监控 安全 物联网
未来技术纵横谈:区块链、物联网与虚拟现实的融合与创新
【5月更文挑战第9天】 随着科技的不断进步,新兴技术正以前所未有的速度渗透到我们的生活之中。区块链、物联网(IoT)、和虚拟现实(VR)等技术,不仅各自发展迅猛,更在相互交织中激发出新的应用模式和商业机会。本文将深入探讨这些技术的发展趋势,分析它们在不同领域的结合点,以及这种融合如何推动着传统行业的变革与升级。
|
2天前
|
供应链 物联网 区块链
未来技术纵横谈:区块链、物联网及虚拟现实的新进展与应用探索
【5月更文挑战第8天】 随着科技的不断进步,新兴技术如区块链、物联网(IoT)、虚拟现实(VR)等正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和多样化的应用场景,旨在为读者提供一个关于如何利用这些技术进行创新的思路。区块链技术以其不可篡改性和去中心化的特点,在金融安全、供应链管理等领域得到广泛应用。物联网通过智能设备的互联互通,推动了智能家居、智慧城市的发展。而虚拟现实则在游戏娱乐、教育培训等方面提供了沉浸式的体验。这些技术的发展不仅带来了新的挑战,也为企业和消费者创造了前所未有的价值。

相关产品

  • 物联网平台