文章目录
1 Modbus
1.1 Modbus是啥
Modbus是一种协议。
其名称源于Modicon + Bus,其中Modicon是现在施耐德公司旗下的品牌,Bus是总线的意思。所以Modbus是Modicon公司在1979年为PLC通信而发表的一种串行通信协议。
1.2 应用
通过此协议,控制器(如PLC)可以相互之间、也可以经由网络(以太网)和其他设备之间通信。由于它早期的开放、公开、无版权要求、免费,并且使用简单,现在已经成为了通用的工业标准。有了它,不同厂商生产的设备可以连成工业网络,进行集中监控。
该协议采用主从通信的模式,典型的主设备(master)包括现场仪表、工控机、显示面板,典型的从设备(slave)为可编程逻辑控制器(PLC)。
1.3 协议变体及区别
Modbus协议包括ASCII、RTU、TCP,并没有规定物理层。
此协议定义了控制器能够识别和使用的消息结构,而不管它是经过何种网络进行通信的。
Modbus的两种常见变体:Modbus RTU和Modbus TCP。下面讨论一下两者的区别。
1.3.1 物理层
Modbus RTU采用串行通信方式,利用RS-232或RS-485进行数据传输(规定了传输的电气标准、机械接口标准等)。它使用二进制编码来实现通信。与之相反,Modbus TCP采用以太网的通信方式,使用TCP/IP协议栈在网络上进行数据传输。(由此可见,Modbus协议是在物理层之上的,它不依赖于具体的物理实现;也是网络层之上的,因为它可以用TCP/IP传输;它是应用层的协议)
1.3.2 帧结构
Modbus RTU采用紧凑的二进制格式对数据帧进行封装。每个数据帧包含从站地址、功能码、数据和错误校验等字段。而Modbus TCP则采用基于TCP/IP的报文结构,将Modbus数据帧封装在TCP报文中,然后通过IP网络进行传输。
1.3.3 传输速率
由于Modbus RTU是基于串行通信的,因此其传输速率受限于串行接口的性能。通常情况下,Modbus RTU的传输速率较低,在几千比特每秒到几十千比特每秒之间。与之相比,Modbus TCP使用以太网作为物理介质,支持更高的传输速率,可以达到以太网的标准速率,如10Mbps、100Mbps或1Gbps。
1.3.4 连接方式
Modbus RTU采用点对点的连接方式,也就是一对一的通信模式。一个主站可以连接多个从站,但每次只能与一个从站进行通信。相反,Modbus TCP采用基于IP的客户端-服务器模型,支持多对多的连接方式。多个客户端可以同时与一个Modbus TCP服务器进行通信。
1.3.5 网络依赖性
Modbus RTU不依赖于网络基础设施,可以在简单的串行连接上进行通信,适用于较小的局域网。Modbus TCP则依赖于TCP/IP网络,需要可靠的网络基础设施支持,适用于更大规模的分布式系统。
1.3.5 安全性
Modbus RTU没有内置的安全机制,通信数据未经加密,因此容易受到安全威胁。Modbus TCP可以利用TCP/IP的安全特性,例如加密和认证,提供更高的安全性。
1.4 传输方式
1.4.1 协议数据单元
Protocol Data Unit,即协议数据单元,缩写PDU,由功能码+数据组成,
功能码——1字节,表示要执行的功能;
数据长度——表示要读取的地址或要写入的值,不同的功能码对应的数据有所不同。
PDU有三种类型:
- 请求型协议数据单元(Request PDU);
- 应答型协议数据单元(Response PDU);
- 异常应答型协议数据单元(Exception Response PDU)。
PDU是Modbus协议通用数据结构,它与底层物理结构无关。但通信时,需要依赖于物理网络。因此要把PDU映射到物理网络上,这就形成了应用数据单元(Application Data Unit,ADU)。由于底层网络不同,RTU应用数据单元的结构与TCP应用数据单元的结构不通。
TCP ADU在PDU的基础上,添加了一个叫MBAP头的结构,即 ModBus Application 应用数据单元。
名称 | 长度 | 描述 | 客户端 | 服务器 |
---|---|---|---|---|
Transaction Identifier /传输标识符 | 2字节 | 用来标识请求/应答帧 | 由客户端初始化 | 服务器拷贝该标识 |
Protocol Identifier 协议标识符 | 2字节 | 0 = Modbus | 由客户端初始化 | 服务器拷贝该标识 |
Length 长度 | 2字节 | 接下来发送数据的长度 | 由客户端初始化 | 服务器拷贝该标识 |
Unit Identifier 单元标识符 | 1字节 | 串行链路或其他总线上的站标识 | 由客户端初始化 | 服务器拷贝该标识 |
其中:
- 传输标识符:用于标识ADU,即请求和应答之间的配对;客户端对该部分进行初始化,服务端将其拷贝到自己的ADU中;
- 协议标识符:系统间的协议标识,0代表Modbus;
- 长度:接下来要发送的数据长度,即:单元标识符+PDU的总长度,以字节为单位;
- 单元标识符:用于系统间的站寻址,比如在以太网+串行链路中,远程站的地址;
1.5 Modbus协议数据模型
Modbus协议允许设备将四种数据分别映射到不同的存储区中,各个区块之间相互独立,使用不同的功能码可以读取到相应的数值,如下图:
Modbus数据模型映射到不同的存储区块
协议也允许设备将四种数据映射到同一存储区块中,这样通过不同的功能码读取数据可能会得到相同的数据(比如:输入寄存器和保持寄存器位于同一物理区块)。
数据模型中的数据最大允许有65536个元素,编号从1开始:1~65536,元素地址从0开始:0~65535。
需要说明的是,65536只是协议允许的最大元素范围,但并不要求全部实现。Modbus协议允许设备根据自己的实际情况实现部分元素,甚至不要求实现模型中的全部四种数据。
1.6 Modbus地址模式
为了简化数据模型与设备存储区的对应关系,引入了一种地址模型,该模型通过编号的方式对不同类型数据区分,各数据的地址编号如下:
Modbus数据模型/数据区 | Modbus地址编号 |
---|---|
线圈 | 0 |
离散量输入 | 1 |
输入寄存器 | 3 |
保持寄存器 | 4 |
Modbus地址模型
Modbus地址模型的编号从1开始,由于每种数据最大支持65536个元素,因此理论上,
- 线圈型数据,地址范围为:000001~065536;
- 离散型输入,地址范围为:100001~165536;
- 输入寄存器,地址范围为:300001~365536;
- 存储寄存器,地址范围为:400001~465536;
由于65536是较大的数值,实际应用一般不需要过大的存储区,因此PLC厂家普遍采用的是10000以内的地址范围,即:
- 线圈型数据:00001~09999;
- 离散型输入:10001~19999;
- 输入寄存器:30001~39999;
- 存储寄存器:40001~49999;
下面是两款PLC的地址表:
![](https://i-blog.csdnimg.cn/blog_migrate/359a35c81a835006d76ac20902771b5b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bb0101f5b7b112f33b6084b3f77d8c2c.png)
各PLC厂家根据PLC的实际情况,将Modbus的地址模型映射到实际的存储区。一般来说:
- 线圈——过程输出区(Q);
- 离散量输入——过程输入区(I);
- 输入寄存器——模拟量输入(AI);
- 保持寄存器——数据块或V存储区或M存储区。
Modbus地址模型对RTU、ASCII和TCP都适用。