Modbus Slave学习笔记(一)

简介: Modbus Slave学习笔记

第一章 初识Modbus

1.1什么是Modbus

简而言之,Modbus通信协议是工业领域通信协议的业界标准,并且是当前工业电子设备之间相当常用的连接方式之一。


Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,可以实现控制器相互之间、控制器经由网络和其他设备之间的通信。它已经成为一种通用的工业标准,有了它,不同厂商生产的控制设备可以连接成工业网络,进行集中监控。此协议定义了一个控制器能够认识使用的消息结构,而不管它们是经过何种网络进行通信的;而且描述了控制器请求访问其他设备的过程,如何应答来 自
其他设备的请求,以及怎样侦测错误并记录;并制定了统一的消息域的结构和内容。


当在 Modbus 网络上通信时,此协议决定了每个控制器必须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行为。如果需要回应,控制器将生成反馈信息并通过 Modbus 协议发送。


Modbus 通信协议具有以下几个特点∶

● Modbus 协议标准开放、公开发表并且无版税要求。用户可以免费获取并使用 Modbus 协议,不需要交纳许可证费,也不会侵犯知识产权。

●Modbus 协议可以支持多种电气接口,如 RS232、RS485、TCP/IP 等;还可以在各种介质上传输,如双绞线、光纤、红外、无线等。

● Modbus 协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络。


1.2模型

Modbus 是 OSI 模型第 7 层之上的应用层报文传输协议,它在不同类型总线或网络设备之间提供主站设备/从站设备(或客户机/服务器)通信。自从 1979 年发布并成为工业串行链路通信的事实标准以来,Modbus 使成千上万的自动化设备能够通信。目前,为了继续增加对简单而优雅的 Modbus 通信协议的支持,国际互联网组织规定并保留 了 TCP/IP 协议栈上的系统 502 端口,专门用于访问 Modbus 设备。Modbus 协议栈模型如图所示。

b2bbd3b8e7743e6e01e50fda7df42678_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc2NDk3NA==,size_16,color_FFFFFF,t_70.png

1.3 协议版本

Modbus 通信协议目前存在用于串行链路、TCP/IP 以太网以及其他支持互联网协议的网络版本。大多数 Modbus 设备通信通过串口(RS232/RS485)或 TCP/IP物理层进行连接。


对于 Modbus 串行链路连接,存在两个变种,它们在协议细节上略有不同,主要区别是传输数据的字节表示上的不同。这两个变种包括 RTU 模式和 ASCII 模式。ModbusRTU 模式是一种紧凑的,采用二进制表示数据的方式;而 ModbusASCII 模式是一种人类可读的、冗长的表示方式。这两个变种都使用串行链路通信(Serial Communication)方式,为了确保数据传输的完整性和准确性,RTU 模式下消息格式命令和数据带有循环冗余校验的校验和,而 ASCII 模式下消息格式采用纵向冗余校验的校验和,而且被配置为 RTU 模式的节点不能与配置为 ASCII模式的节点通信,反之亦然。

对于通过 TCP/IP(例如以太 网)物理层的连接,存在多个 Modbus/TCP 变种,这种方式不需要校验和的计算。

对于以上这 3 种通信模式,在数据模型和功能调用上都是相同的,只有传输报文封装方式是不同的。


1.4 通信设备

通常情况下,Modbus 协议是一个主/从(Master/Slave)或客户 端/服务器(Client/Server)架构的协议。通信网络中有一个节点是 Master 节点;其他使用 Modbus 协议参与通信的节点是 Slave 节点,每一个 Slave 设备都有一个唯一的地址。在串行和 MB十网络中,只有被指定为主节点的节点可以启动一个命令(在以太网上,任何一个设备都能发送一个 Modbus 命令,但是通常也只有一个主节点设备用以引导指令)。

一个 Modbus 命令包含了准备执行指令的设备的 Modbus 地址。线路上所有设备都会收到命令,但只有指定地址的设备会执行并回应指令(地址 0 例外,指定地址 0的指令是广播指令,所有收到指令的设备都会运行,不过不用回应指令)。所有 Modbus 传输报文都包含了错误校验码,以确定到达的命令是否完整。例如,基本的 Modbus 命令能指示一个 Modbus RTU设备改变它的寄存器的某个值,控制或者读取一个I/O 端口,以及指挥设备回送一个或者多个其寄存器中的数据。


1.5帧结构

Modbus 是一个请求/应答协议,并且提供统一的功能码用于数据传输服务。 Modbus 功能码是 Modbus 请求/应答 PDU(即 PROTOCOL DATA UNIT,协议数据单元)的元素之一,所谓的 PDU 是 Modbus 协议定义的一个与基础通信层无关的简单协议数据单元。而在特定总线或网络上,Modbus 协议则通过ADU(即APPLICATION DATA UNIT,应用数据单元)引入一些附加域,以实现完整而准确的数据传输。

为了寻求一种简洁的通信格式,Modbus 协议定义了 PDU 模型,即功能码+数据的格式;而为了适应多种传输模式,在 PDU 的基础上增加了必要的前缀(如地址域)和后缀(如差错校验),形成了 ADU模型。


ADU与PDU 之间的关系如图所示。

c28e77af116228d7ce6dc7d88e4b40a6_20210406143945725.png

1.6 事务处理

主机设备(或客户端)创建 Modbus 应用数据单元形成查询报文,其中功能码标识了向从机设备(或服务器端)指示将执行哪种操作。功能码占用一个字节,有效的码字范围是十进制 1~255(其中 128~255 为异常响应保留)。香询报文创建完毕,主机设备(或客户端)向从机设备(或服务器端)发送报文,从机设备(或服务器端)接收报文后,根据功能码做出相应的动作,并将响应报文返回给主机设备(或客户端),如图 所示。

14d467309521fc8ccec06526089b6560_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc2NDk3NA==,size_16,color_FFFFFF,t_70.png

如果在一个正确接收的 Modbus ADU中,不出现与请求 Modbus 功能有关的差错》那么从机设备(或服务器端)将返回正常的响应报文。如果出现与请求 Modbus 功能有关的差错,那么响应报文的功能码域将包括一个异常码,主机设备(或客户端)能够根据异常码确定下一个执行的操作。

如图所示,对于异常响应,从机设备(或服务器端)将返回一个与原始功能码等同的码值,但设置该原始功能码的最高有效位为逻辑 1,用干通知主机设备(或客户端)。

b1eb5448d838abc9e7fd9d59ffc315e2_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc2NDk3NA==,size_16,color_FFFFFF,t_70.png

第二章 Modbus开发环境

2.1 VSPD

2.2 Modbus Poll

2.3 Modbus Slave

第三章 Modbus 协议相关

3.1 协议概要

简而言之,Modbus 协议是一种单主/多从的通信协议,其特点是在同一时间,总线上只能有—个主设备,但可以有一个或者多个(最多 247 个)从设备。Modbus通信总是由主设备发起,当从设备没有收到来自主设备的请求时,不会主动发送数据。从设备之间不能相互通信,主设备同时只能启动一个 Modbus 访问事务处理。


主设备可以采用两种方式向从设备发送 Modbus 请求报文,即主设备可以对指定的单个从设备或者线路上所有的从设备发送请求报文,而从设备 只能被动接收请求报文后给出响应报文即应答。这两种模式分别如下;

a421507b45f87a33723b9a9004d3a3b3_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc2NDk3NA==,size_16,color_FFFFFF,t_70.png

● 单播模式∶ 主设备仅仅寻址单个从设备。从设备接收并处理完请求之后,向主设备返回一个响应报文,即应答。在这种模式下,一个 Modbus 事务处理包含两个报文∶一个是主设备的请求报文,一个是从设备的响应报文。每个从设备必须有唯一的地址(地址范围 1~247),这样才能区别于其他从设备从而可以独立被寻址,而主设备不占用地址。

● 广播模式∶此种模式下,主设备可以向所有的从设备发送请求指令。而从设备在接收到广播指令后,仅仅进行相关指令的事务处理而不要求返回应答。


基于此,广播模式下,请求指令必须是 Modbus 标准功能中的写指令。

根据 Modbus 标准协议的要求,所有从设备必须接收广播模式下的写指令,且地址 0被保留用来识别广播通信。


1.请求

主设备发送的请求报文主要包括从设备地址(或者广播地址 0)、功能码、传输的数据以及差错检测字段。

查询消息中的功能码告之被选中的从设备要执行何种功能。数据段包含 了从设备要执行功能的任何附加信息。 例如功能代码 03 要求从设备读保持寄存器

并返回其内容。

数据段必须包含要告之从设备的信息∶ 从何寄存器开始读取及要读取的寄存器数量。差错检测域为从设备提供了—种验证消息内容是否正确的方法。


2.应答

从设备的应答报文包括地址、功能码、差错检测域等。

如果从设备产生一个正常的回应,则在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据,如寄存器值或状态。

如果有错误发生,功能代码将被修改以用于指出 回应消息是错误的,同时数据段包含了描述此错误信息的代码。差错检测域允许主设备确认消息内容是否可用。

对于串行链路来说,又存在两种传输帧模式∶ ASCII(American Standard Code

for Information Interchange,美 国标 准 信 息 交换码)模式 和 RTU(Remote Terminal Unit)模式。但是,对于同一网络或链路来说,所有的设备必须保持统一,要么统一为 ASCII模式,要么统一为 RTU 模式,不可共存。相对来说,RTU模式传输效率更高,因此,在当前普遍的生产环境中 RTU 模式获得了广泛应用,而 ASCII 模式只作为特殊情况下的可选项。

3.2寄存器

基本表 对象类型 访问类型 注释
离散量输入 单个位 只读 I/O系统可提供这种类型数据
线圈 单个位 读写 通过应用程序而可以改变这种类型数据
输入寄存器 16位字 只读 I/O系统可提供这种类型数据
保持寄存器 16位字 读写 通过应用程序而可以改变这种类型数据

3.3串行消息帧格式

3.3.1 ASCII消息帧格式

当控制器设为在 Modbus 网络上以 ASCII 模式通信时,在消息中每个 8 位(bit)的字节都将作为两个 ASCII 字符发送。这种方式的主要优点是字符发送的

时间间隔可达到 1秒而不产生错误。

在 ASCII模式下,消息以冒号(∶)字符(ASCII 码 0x3A)开始,以回车换行符结束(ASCII 码 0x0D,0x0A)。消息帧的其他字段(域)可以使用的传输字符是十六进制的 0…9,A…F。处于网络上的 Modbus 设备不断侦测"∶"字符,当有一个冒号接收到时,每个设备进入解码阶段,并解码下一个字段(地址域)来判断是否是发给自 已的。消息帧中的字符间发送的时间间隔最长不能超过 1 秒,否则接收的设备将认为发生传输错误。

一个典型的 ASCII 消息帧格式如表所示。

c8ca7ebc0f179372066bf3c15fe834ef_20210406144121753.png

3.3.2 RTU消息帧格式

传输设备(主/从设备)将 Modbus 报文放置在带有已知起始和结束点的消息帧中,这就要求接收消息帧的设备在报文的起始处开始接收,并且要知道报文传

输何时结束。另外还必须能够检测到不完整的报文,且能够清晰地设置 错误标志。

在 RTU 模式中,消息的发送和接收以至少 3.5 个字符时间的停顿间隔为标志。实际使用中,网络设备不断侦测网络总线,计算字符间的停顿间隔时间,判断

消息帧的起始点。 当接收到第—个域(地址域)时,每个设备都进行解码以判断是否是发给自己的。在最后一个传输字符结束之后,一个至少 3.5个字符时间的停

顿标定了消息的结束,而一个新的消息可在此停顿后开始。另外,在一帧报文中,必须以连续的字符流发送整个报文帧。如果两个字符之间的空闲间隔大于 1.5个字符时间,那么认为报文帧不完整,该报文将被丢弃。

需要记住的是∶

● 3.5 时间间隔目的是作为区别前后两帧数据的分隔符。


● 3.5 时间间隔只对 RTU模式有效。


如图 3-2 所示,Modbus 通信时规定主机发送完一组命令必须间隔 3.5个字符再发送下一组新命令,这 3.5 个字符主要用来告诉其他设备这次命令(数据)已结束。这 3.5个字符的时间间隔采用以下方式计算∶

通常情况下在串行通信中,1 个字符包括1 位起始位、8 位数据位、1 位校验位(或者没有)、1 位停止位(一般情况下)。这样一般情况下 1 个字符就包括 11 位,那么 3.5个字符就是3.5×11=38.5 位。

而串行通信中波特率的含义是每秒传输的二进制位的个数。例如波特率为9600bps,则意思就是说每 1s(也就是 1000ms)传输 9600 个位的数据;反过来说传输 9600 个二进制位的数据需要 1000ms,那么传输 38.5 个二进制位的数据需要的时间就是∶

38.5×(1000/9600)=4.0104167ms

如图 3-2 所示,Modbus RTU 要求相邻两帧数据的起始和结束之间至少有大于等于3.5 个字符的时间间隔,那么在波特率为 9600bps 的情况下,只要大于 4.0104167ms 即可!

9b1b84529cfbf56453c0bcc56266c750_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc2NDk3NA==,size_16,color_FFFFFF,t_70.png

3.3.3 地址域

所谓地址域,指的是 Modbus 通信帧中的地址字段,其内容为从设备地址。 Modbus 消息帧的地址域包含 2 个字符(ASCII模式)或者1个字节(RTU 模式)。

消息帧中可能的从设备地址是 0~247(十进制),单个设备的实际地址范围是1~247(参见表 3-4)。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己已的地址放入回应的地址域中,以便主设备知道是哪一个设备做出回应。

地址 0用作广播地址,以使所有的从设备都能认识。当 Modbus 协议用于更高级别的网络时,广播方式可能不被允许或以其他方式代替。

5129fd7e9be89fccc2da1f8d6742a992_20210406144210286.png

.3.4 功能码域

功能码在 Modbus 协议中用于表示消息帧的功能。

功能码域由 1 个字节构成,因此其取值范围为 1~255(十进制)。例如,常用的功能码有 03、04、06、16 等,其中 03 功能码的作用是读保持寄存器内容,04 功能码的作用是读输入寄存器内容(输入寄存器和保持寄存器的区别可参考上一节的内容),06 功能码的内容是预置单个保持寄存器,16 功能码的内容则是预置多个保持寄存器。

从设备根据功能码执行对应的功能,执行完成后,正常情况下则在返回的响应消息帧中设置同样的功能码;如果出现异常,则在返回的消息帧中将功能码最

高位(MSB)设置为 1。据此,主设备可获知对应从设备的执行情况。

另外,对于主设备发送的功能码,则从设备根据具体配置来决定是否支持此功能码。如果不支持,则返回异常响应。


3.3.5 数据域

数据域与功能码紧密相关,存放功能码需要操作的具体数据。数据域以字节为单位,长度是可变的,对于有些功能码,数据域可以为空。



相关文章
|
存储 缓存 网络协议
HTTP协议【网络基础/应用层】
HTTP协议【网络基础/应用层】
847 3
|
API
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果。前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html
1264 0
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
|
5月前
|
架构师 Java 程序员
程序员的出路:30岁,我们聊聊那些真实的选择
30岁程序员的迷茫与出路:技术焦虑、薪资倒挂、能力单一困扰着许多人。本文基于真实观察,梳理五条可行路径——深耕技术、理性转管理、务实搞副业、跨界融合、提前布局B计划,并总结三条铁律与自测问题,帮助你在变局中找到方向。出路不在远方,而在你写下的每一行“值钱”的代码里。(238字)
834 117
|
Java Apache Maven
HttpClientConnectionManager哪个版本里有?
【8月更文挑战第25天】HttpClientConnectionManager哪个版本里有?
722 2
STM32CubeMX时钟树(72MHZ主频配置)
STM32CubeMX时钟树(72MHZ主频配置)
1435 0
|
安全 Java Go
Go 调用 C/C++ 函数全攻略
Go 调用 C/C++ 函数全攻略
1417 0
|
缓存 网络协议 算法
理解TCP/IP协议
理解TCP/IP协议
851 2
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的助农扶贫的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的助农扶贫的详细设计和实现(源码+lw+部署文档+讲解等)
339 0