zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Modbus协议介绍

协议 介绍 MODBUS
2023-09-11 14:21:43 时间

Modbus协议介绍

简介

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于 1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus 已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

类型

Modbus协议属于应用层的报文传输协议,Modbus协议本身是个比较泛的说法,它有三种类型,分别是Modbus ASCII,Modbus RTU,Modbus TCP/IP,三者的协议并不相同,但有类似的地方,所以说Modbus协议时,最好说这三种类型中的一种

在这里插入图片描述

Modbus数据模型

数据模型是对可访问数据的一种抽象,Modbus协议的数据模型定义了四种可访问的数据,分别是:
在这里插入图片描述

既然数据模型是一种抽象,在实际使用时必须将其映射到真实的物理存储区才能被访问。

Modbus协议允许设备将四种数据分别映射到不同的存储区块中,各个区块之间相互独立,使用不同的功能码可读取到不同的数值,如下图所示:

在这里插入图片描述

Modbus协议也允许设备将四种数据映射到同一存储区块中,这样通过不同的功能码读取数据可能会得到相同的数据(比如:输入寄存器和保持寄存器为同一物理区块),如下图所示:

在这里插入图片描述

线圈:因为Modbus最初是为PLC服务的,所以线圈是PLC相关的术语,实际上就可以类比为开关量(继电器状态),每一个bit对应一个信号的开关状态,要么是1,要么是0;所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈和写多个线圈;

离散输入:如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。

保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写。

输入寄存器:这个和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。

规律:

输入:表示这个存储区只能读,不能写

其余的则可读可写

注意:网上的资料对Modbus数据模型这一部分的介绍各不相同,一开始看这部分资料时被搞得乱七八糟,为什么同一种东西会有这么多不同的说法,无奈把说法不同但却是同一种东西汇总一下:

线圈 = 输出线圈 = 开关量输出 = 位状态

离散量输入 = 输入线圈 = 开关量输入

保持寄存器 = 输出寄存器 = 寄存器

Modbus数据模型 = PLC存储区

Modbus地址模型

也就是真实的物理存储区

存储区范围:分为5位和6位,对应了标准地址和扩展地址;如果使用的是5位标准地址,则4种存储区分别用5位地址中的首位来区分,如线圈是0,离散量是1,输入寄存器是3,保持寄存器是4,剩下的4位就从1 ~ 9999开始编址,表示一片连续的地址

有些设备是6位的地址,编址方法跟5位的类似,只不过地址最大只能到65536

数据模型地址前缀标号5位6位访问方式
线圈000001 ~ 09999000001 ~ 065536读/写
离散量输入110001 ~ 19999100001 ~ 165536只读
输入寄存器330001 ~ 39999300001 ~ 365536只读
保持寄存器440001 ~ 49999400001 ~ 465536读/写

通讯信息传输过程

通信的本质其实就是要么我说,你听,要么你说,我听,那应用到主机与从机之间时,就是要么主机往从机写入数据,要么主机往从机读取数据。

当通讯命令由发送设备(主机)发送至接收设备(从机)时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果(数据)返送给主机。返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码。如果CRC校验出错就不返回任何信息。

地址码

地址码是每次通讯信息帧的第一字节(8位),从0到247。其中0为广播地址,从机的实际地址范围为 1 ~ 247;这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的
地址码表明该信息来自于何处。

功能码

对存储区的操作有:读和写,分别有以下的组合,再给这些操作编个号,就是功能码

功能码是每次通讯信息帧传送的第二个字节。ModBus通讯规约可定义的功能码为1到127。有些PLC器件仅用到其中的一部分功能码。作为主机请求发送,通过功能码告诉从机应执行什么动作。作为从机响应,从机返回的功能码与从主机发送来的功能码一样,就表明从机已响应主机并且已进行相关的操作。

在这里插入图片描述

数据区

数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据(如︰开关量输入/输出、模拟量输入/输出、寄存器、参考地址等。例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相同

CRC校验

主机或从机可用校验码进行判别接收信息是否正确。由于电子噪声或一些其它干扰,信息在传输过程中有时会发生错误,错误校验码(CRC)可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃(无论是发送还是接收),这样增加了系统的
安全和效率。

MODBUS 通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。CRC码由发送设备(主机)计算,放置于发送信息帧的尾部。接收信息的设备(从机)再重新计算接收到信息的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。

CRC校验码可用一些工具计算出,在软件编程中一般用查数组的方式

报文格式

Modbus RTU报文格式:从机地址(设备编号)+ 功能码 + 数据 + 校验 (只要是Modbus协议,都遵循这样的报文格式,其中数据是个泛指,还分为读取和回应两种不同的数据)

在这里插入图片描述

读单个或多个线圈(位状态)

主机发送:从机地址 01 起始地址 读取数据个数 CRC校验

从机返回:从机地址 01 读取到的数据长度 数据DATA1…DATAN CRC校验

在这里插入图片描述

写单个线圈(位状态)

主机发送:从机地址 05 起始地址 要写入的数据 CRC校验

从机返回:从机地址 05 起始地址 写入的数据 CRC校验

写数据时,从机返回的数据与主机发送的数据一样

在这里插入图片描述

实际例子

读单个或多个线圈(开关量)

例如︰主机要读取地址为01,开关量DO1,DO2的输出状态。从机数据寄存器的地址和数据为︰

起始位地址D0寄存器数据(16进制)备注
000002DO2输出状态为1,DO1输出状态为0

主机发送的报文格式:

主机发送字节数发送的信息备注
从机地址101发送至地址为01的从机
功能码101读开关量输出状态
起始地址20000起始位地址为0000
读数据长度20002读取两个开关量状态
CRC码2BDCB由主机计算得到CRC码

从机响应返回的报文格式:

从机响应字节数返回的信息备注
从机地址101来自从机01
功能码101读开关量输出状态
数据长度1011个字节(8个bit位)
D0状态数据102D0寄存器内容
CRC码2D049由从机计算得到CRC码

写单个保持寄存器

例如∶主机要把数据07D0,保存到地址为002C的从机寄存器中去(从机地址码为01)。

主机发送的报文格式:

主机发送字节数发送的信息备注
从机地址101发送至地址为01的从机
功能码106写单个保持寄存器
起始地址2002C要写入的寄存器地址
写入数据207D0写入的新数据
CRC码24BAF由主机计算得到的CRC码

从机响应返回的报文格式:

与主机发送的报文格式及数据内容完全相同。

注意:主机发送的报文数据中,寄存器的起始地址是相对地址,像002C是相对40001来说的,00001、10001这些是绝对地址;

通过相对地址算出绝对地址要先确定数据模型的地址,如读保持寄存器,起始地址是006B,那006B是107,对应的地址就是40108,

如果是输入寄存器,起始地址也是006B,那对应的地址就是30108

可挂载的设备数量

首先在485总线上,MODBUS RTU协议理论是可以挂200+台设备,但实际应用中,由于阻抗等原因,一般是32台,除去自身的话,就是31台。

​ RS485总线可以连接256个设备,但测试后发现这个数字有比较大的差异。有一种说法认为专门开发串行嵌入式的RS485总线只能连接32个节点,这由自身的驱动能力决定的。有人说网上的各种485总线产品可以支持128个,也有人说可以支持256个,甚至高达400个,那么RS485转换器到底支持多少个?

485通信中的一个串行端口能控制多少台设备的问题,由485网络中的电特性和协议特性决定。电特性就是,为了保证485网络中的特征阻抗在允许范围内,应该是120欧姆左右,因为连接的设备越多特征阻抗越小,所以在485网络中一般是120欧姆的终端,同时保证信号的衰减在允许的范围内。因此,有长距离传输和中继的情况。协议特性是在485网络上传输的协议支持的地址范围,Modbus应该是32个,能连接31个设备。

连接方式

RS-485连接采用菊花链方式连接,而不能采用星型网络拓扑

在这里插入图片描述