其他分享
首页 > 其他分享> > Modbus从一窍不通到原来如此

Modbus从一窍不通到原来如此

作者:互联网

modbus

Modbus学习文档

0. 前言

最近学习Modbus,本人0基础,学习之前都不知道Modbus是什么,以前从未接触过这个协议;看资料看了4天,CSDN上的博文总是不尽人意、缺枝短叶,看完仍是一头雾水;后来结合着Modbus中文协议,终于算是有了比较透彻的理解。在此细心的整理了两天的学习笔记,给出了一个比较完整的学习流程和知识记录。

1. 基本宏观概念(大方面,是什么,干啥用的)


目录:

1.1 通信模式分类

并行通信(数据各位同时传送)

​ 一般快速设备之间采用并行通信,譬如CPU 与存储设备、存储器与存储器、主机与打印机等都采用并行通讯。并行通讯,有多少位数据就必须有多少根数据线,如下图是11 位数据就有11 根数据线。

图片

串行通信(数据一位一位顺序依次传送)

​ 串行通信最少可以只需一根通信线,只发或只收。因而大大节省了系统资源,降低了系统成本。由于只用一根数据线,所以是以降低传送速度来换取资源的,它常用在传送距离远,速度要求不高的场合。

图片

参考文章

1.2 Modbus基本概念

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式,是工业自动化领域里使用最普遍的协议。随着电子技术计算机和通信技术的不断发展, Modbus也从最古老的RS232/Rs485串行总线发展到了 ModbusTCP透明就绪工业以太网

Modbus是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。

从1979年开始,Modbus作为工业串行链路的事实标准,Modbus使成千上万的自动化设备能够通信。目前,对简单而精致的 Modbus结构的支持仍在增长。互联网用户能够使用TCP/P栈上的保留系统端口502访问。

ModbusModbus是一个请求/应答协议,并且提供功能码规定的服务。 Modbus功能码是 Modbus请求/应答PDU的元素。

Modbus是一种应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。

在这里插入图片描述

参考:

1.3 应用场景

工业、建筑、基础设施

每种设备(PC、HMI、控制面板、驱动器、运动控制、I/O设备……)都能使用Modbus协议来启动远程操作。同样的通信能够在基于串行链路和以太网TCP/IP网络上进行。网关能够实现在各种使用 Modbus协议的总线或网络之间的通信。
在这里插入图片描述

2. 分解模块概念(细节步骤,包括什么东西,怎么定义和运作的)


​ 通信就是交流,协议就是交流的规范或者语言。Modbus简单来说就是主机和远程设备的交流语言。工业上,比如我想获得工厂温度、湿度信息,那我先通过传感器获得温度湿度数据,保存到记录里,我在办公室想知道这个信息,那么我只要保证三点:和工厂的控制设备连接、发送命令,控制设备返回响应,这三项满足,就能远程获取信息或者控制控制器了。

​ 那么这里面包括了几点:数据的存储和读取(线圈和寄存器)、命令的种类(功能码)、数据的传输(通信模式、数据帧格式)、数据正确与否的检验(校验)、反馈或响应(异常码)等模块。

目录:

2.1 单播模式与广播模式

单播模式:“一对一”通讯。主站只寻找某一确定的从站,从站接收到命令后处理,并返回一个应答报文。主站需要发出一个命令报名并处理从站返回的报文,从站需要接收主站的命令报文并发出一个应答报文。每个子节点必须有唯一的地址(1-247)。

广播模式:一对所有”。主站向所有从站发送请求,对于主站发送的广播请求没有应答返回,广播请求必须是写命令。所有从站必须接收写功能的广播。地址0用来广播通信。

2.2 Modbus帧格式

​ Modbus应用协议定义了一个独立于通信层的协议数据单元PDU(Protocol Data Unit),在不同的总线或者网络的Modbus协议同过在PDU上添加对应的附加域,构造出能用于当前通信的ADU
在这里插入图片描述
在这里插入图片描述

​ Modbus合法字节地址为十进制0-247,0为广播地址,每个子设备地址为1-247。主节点将子节点地址填入地址域来寻找子节点,子节点将自己的地址填入来告知主节点是哪个子节点在应答。

​ 功能码表明了主节点要求子节点执行的操作。

​ 数据部分包括了请求时的具体细节或者返回时的数据细节。

​ 差错校验是串行传输中对地址域和PDU的冗余校验值,不同的传输模式采用不同的校验方式

2.3 寄存器(数据的存储和读取)

2.3.1 寄存器种类
寄存器种类说明PLC类比举例
线圈状态输出端口。可设定端口的输出状态,也可以读取该位的输出状态。可分为两种不同的执行状态,例如保持型或边沿触发型。可读可写。DO数字量输出电磁阀输出,MOSFET输出,LED显示等。
离散输入状态输入端口。通过外部设定改变输入状态,可读但不可写。DI数字量输入拨码开关,接近开关等。
保持寄存器输出参数或保持参数,控制器运行时被设定的某些参数。可读可写。AO模拟量输出模拟量输出设定值,PID运行参数,变量阀输出大小,传感器报警上限下限。
输入寄存器输入参数。控制器运行时从外部设备获得的参数。可读但不可写。AI模拟量输入模拟量输入
2.3.2 寄存器地址分配

​ 寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以使触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代表寄存器类型。

​ 寄存器协议地址指指通信时使用的寄存器地址,例如PLC地址40001对应寻址地址0x0000,40002对应寻址地址0x0001,寄存器寻址地址一般使用16进制描述。例如,PLC寄存器地址40003对应协议地址0002,PLC寄存器地址30003对应协议地址0002,虽然两个PLC寄存器寄存器通信时使用相同的地址,但是需要使用不同的功能码访问,不同的功能码对应操作对应确定的PLC地址,所以访问时不存在冲突。

寄存器PLC地址寄存器协议地址适用的功能码(指令代号)寄存器种类读写状态
00001-099990000-FFFF01H、05H、0FH线圈状态可读可写
10001-199990000-FFFF02H离散输入状态可读
30001-399990000-FFFF04H输入寄存器可读
40001-499990000-FFFF03H、06H、0FH保持寄存器可读可写

2.4 功能码(主机发送的命令代码)

2.4.1功能码分类

​ 功能码按操作对象可以分为两种:位操作功能码(最小单位是bit)和字操作功能码(最小单位为2字节)

功能码按使用范围可以分为三种:
在这里插入图片描述

公共功能码:

用户定义功能码

保留功能码

2.4.2 部分功能码举例
功能码异常功能码(+ 0×80)中文名称寄存器PLC地址位操作/字操作操作数量
0×010×81读线圈状态00001-09999位操作单个或多个
0×020×82读离散输入状态10001-19999位操作单个或多个
0×030×83读保持寄存器40001-49999字操作单个或多个
0×040×84读输入寄存器30001-39999字操作单个或多个
0×050×85写单个线圈00001-09999位操作单个
0×060×86写单个保持寄存器40001-49999字操作单个
0×0F0×8F写多个线圈00001-09999位操作多个
0×100×90写多个保持寄存器40001-49999字操作多个

2.5 异常码(服务器或从站返回的异常代号)

2.5.1 通信状况

当主机向设备发送命令后,可能会出现以4下种情况:

2.5.2 响应类型

综上,根据服务器处理结果,可以建立两种类型的响应:

2.5.3 异常码表
代码名称含义
01非法功能对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作。这也许是因为功能码仅仅适用于新设备而在被选单元中是不可实现的。同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:因为它是未配置的,并且要求返回寄存器值。
02非法数据地址对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。特别是,参考号和传输长度的组合是无效的。对于带有 100 个寄存器的控制器来说,带有偏移量 96 和长度 4 的请求会成功,带有偏移量 96 和长度 5 的请求将产生异常码 02。
03非法数据值对于服务器(或从站)来说,询问中包括的值是不可允许的值。这个值指示了组合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为MODBUS 协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。
04从站设备故障当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。
05确认与编程命令一起使用。服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长的持续时间进行这些操作。返回这个响应防止在客户机(或主站)中发生超时错误。客户机(或主站)可以继续发送轮询程序完成报文来确定是否完成处理。
06从属设备忙与编程命令一起使用。服务器(或从站)正在处理长持续时间的程序命令。当服务器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。
0A不可用网关路径与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路径。通常意味着网关是错误配置的或过载的。
0B网关目标设备响应失败与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。
2.5.4 事务处理流程

在这里插入图片描述

2.6 数据帧格式

2.6.1 0x01功能码(读线圈状态)
2.6.2 0x03功能码(读保持寄存器)
2.6.3 0x0f功能码(写多个线圈)
2.6.4 0x10功能码(写多个保持寄存器)

2.7 三种通信模式

2.7.1 串行传输模式(异步串行传输)

​ 主从协议,位于OSI模型的第二层。由于没有冲突检测,为了防止混乱,只有一个主站,向“从站”发送命令并处理从节点的响应,从站接收主站的命令并做出响应;主站只能启动一个Modbus事务处理,从站没有收到主站的请求时不主动传输数据,也不与其他从站通信。

​ 物理层上,最常用RS-485 2线制接口或4线制接口,当需要短距离的点到点通信时,也可以使用RS-232串行接口。

​ 串行总线作为客户机,从站作为服务器。在串行链路上,所有设备的传输模式(及串行口参数)必须相同。所有设备必须实现RTU模式,ASCII模式只是一个选项,默认模式必须是RTU模式。
在这里插入图片描述

在这里插入图片描述

从站地址:1字节 = 8位(1byte = 8bit)

功能码:1字节 = 8位(1byte = 8bit)

数据:0-252字节

CRC循环冗余校验:2字节 = 16位(2byte = 16bit)
2.7.2 以太网(MODBUS TCP/IP)

MODBUS TCP/IP通信结构:

​ 串行链路上一个主站多个从站的模式演变为多个客户机和多个服务器的模式,IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,Modbus TCP/IP服务器端通常该端口作为接收报文的端口, 这是目前在仪表与自动化行业中唯一分配到的端口号。

在这里插入图片描述

MODBUS TCP/IP帧:

​ MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。

​ 在TCP/IP上使用一种专用报文头来识别Modbus应用数据单元ADU,即MBAP报文头
在这里插入图片描述

MBAP报文头格式(长7字节):

在这里插入图片描述

MODBUS TCP/IP帧格式:

协议数据单元前加MBAP报文头,没有了校验码,其他数据格式相同

请求帧格式:

事务元处理标识符(高位)事务元处理标识符(低位)协议标识符(高位)协议标识符(低位)长度(高位)长度(低位)单元标识符功能码起始地址(高位)起始地址(低位)寄存器数量(高位)寄存器数量(低位)
0x150x010x000x000x000x060xFF0x030x000x060x000x02

正常应答帧格式:

事务元处理标识符(高位)事务元处理标识符(低位)协议标识符(高位)协议标识符(低位)长度(高位)长度(低位)单元标识符功能码字节计数字节一(高位)字节一(低位)字节二(高位)字节二(低位)
0x150x010x000x000x000x060xFF0x030x020xA10x050x040xCD

参考文章:

标签:一窍不通,功能,字节,校验,校验码,Modbus,地址,寄存器,原来如此
来源: https://blog.csdn.net/qq_41965346/article/details/118760449