modbus概述

一. modbus概述

Modbus是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。包含两个通信规程:串行链路上的MODBUSTCP/IP上的MODBUS

二. 协议描述

2.1 事务交互

 

 

 

 

 对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1

注:需要管理超时,以便明确地等待可能不会出现的应答。

2.2 数据帧

 

用一个字节编码MODBUS数据单元的功能码。有效的码字范围是十进制1-255128-255为异常响应保留)。

串行链路上第一个MODBUS执行的长度约束限制了MODBUS PDU大小(最大RS485 ADU=256字节)。因此,对串行链路通信来说,Modbu PDU=256 – 服务器地址(1字节) – CRC2字节) = 253字节。从而:

RS232/RS485 ADU = 253字节 + 服务器地址(1byte+ CRC2字节) = 256字节。 TCP Modbus ADU = 249字节 + MBAP7字节) = 256字节。

MODBUS协议定义三种PDU:请求PDU,响应PDU,异常响应PDU

正常响应:功能码 = 请求功能码

异常响应:功能码 = 请求功能码 + 0x80,提供一个异常码来指示差错原因。

2.3 数据编码

Modbus使用一个big-Endian表示地址和数据项。这意味着当发送多个字节时,首先发送最高有效位。如:

0x1234  发送的第一个字节为0x12 然后0x34

2.4 Modbus数据模型

Modbus以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:

对于基本表格中任何一项,协议都允许单个地选择65536个数据项,而且涉及那些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事物处理功能码有关。

2.4 功能码分类

Modbus功能码中使用的modbus逻辑参考数字是以0开始的无符号整数索引。

Modbus定义三类功能码:公共功能码,用户定义功能码(65-72100-110),保留功能码。

常用公共功能码定义:

 

2.5 Modbus异常响应

当客户机设备向服务器设备发送请求时,客户机希望一个正常响应。从主站询问中出现下列四种可能事件之一:

》如果服务器设备接收到无通信错误的请求, 并且可以正常地处理询问, 那么服务器设备将返回一个正常响应。

》如果由于通信错误 服务器没有接收到请求, 那么不能返回响应。 客户机程序将最终处理请求的超时状态。

》如果服务器接收到请求, 但是检测到一个通信错误(奇偶校验、 LRC、 CRC、 ...) 那么不能返回响应。 客户机程序将最终处理请求的超时状态。

》如果服务器接收到无通信错误的请求, 但不能处理这个请求(例如 如果请求读一个不存在的输出或寄存器) 服务器将返回一个异常响应 通知用户错误的本质特性。

异常响应报文有两个与正常响应不同的域:

功能码域 在正常响应中 服务器利用响应功能码域来应答最初请求的功能码 所有功能码的最高有效位 MSB) 都 0(它们的值都低于十六进制 80)。在异常响应中 服务器设置功能码MSB 为 1。 这使得异常响应中的功能码值比正常响应中的功能码值高十六进制 80。通过设置功能码 MSB 客户机的应用程序能够识别异常响应 并且能够检测异常码的数据域。

数据域 在正常响应中 服务器可以返回数据域中数据或统计表(请求中要求的任何报文)。在异常响应中 服务器返回数据域中的异常码 这就定义了产生异常的服务器状态。

异常码

三. 串行链路Modbus协议

Modbus串行链路协议是一个主从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点(最大编号247)连接于同一个串行总线。

Modbus通信总是由主节点发起,子节点在没有收到来自主节点的请求时,从不会发送数据。子节点之间从不互相通信。主节点在同一时刻只会发起一个Modbus事务处理。

主节点以两种模式对子节点发出Modbus请求:

单播模式

广播模式:对于主节点广播的请求没有应答返回。广播请求一般用于写命令。所有设备必须接收广播模式的写功能。地址0是专用于表示广播数据的。

Modbus地址规则

Modbus寻址空间有256个不同地址。

Modbus主节点没有地址,只有子节点必须有一个地址。该地址必须在Modbus串行总线上唯一。

两种串行传输模式

RTU模式和ASCII模式

它定义了报文域的位内容在线路上串行的传送,确定了信息如何打包为报文和解码。

Modbus串行链路上所有设备的传输模式(和串行参数)必须相同。

所有设备必须实现RTU模式ASCII 传输模式是选项。

设备应该由用户设成期望的模式,RTUASCII默认设置必须为RTU模式。

错误校验是对报文内容执行“冗余校验”的计算结果。根据不同的传输模式(RTUASCII)使用两种不同的计算方法。

差错检验方法

标准Modbus串行链路的可靠性基于两种错误检验:

》奇偶校验(偶或奇)应该被每个字符采用。

》帧检验(LRCCRC)必须应用于整个报文。

奇偶校验

无论指定了偶还是奇校验,则数据部分为1的位的总数被计数(ASCII模式7数据位,RTU模式8数据位)。而奇偶位被设置为01以使为1的位的总数为偶数或奇数。

3.1 RTU传输模式

当设备使用RTU模式在Modbus串行链路通信,报文中每个8位字节含有两个4位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII模式有更高的吞吐率。每个报文必须以连续的字符流传送。

RTU模式每个字节(11位)的格式为:

 

偶校验是要求的,其他模式(奇校验,无校验)也可以使用。为了保证与其他产品的最大兼容性,同时支持无校验模式是建议的。默认校验模式必须为偶校验。

注:使用无校验要求2个停止位,以填充字符帧使统一。

帧描述

Modbus报文RTU帧最大为256字节。

 

整个报文帧必须以连续的字符流发送。

如果两个字符之间的空闲间隔大于1.5个字符时间,则报文帧被认为不完整应该被接收节点丢弃。在RTU模式,帧由时长至少为3.5个字符时间的空闲间隔区分。后续部分,这个时间区间被称为t3.5

注:RTU接收驱动程序的实现,由于t1.5t3.5的定时,隐含着大量对中断的管理。在高通信速率下,这导致CPU负担加重。因此,在通信速率等于或低于19200bps时,这两个定时必须严格遵守;对于波特率大于119200bps的情形,应该使用2个定时的固定值:建议的字符间超时时间(t1.5)为750us,帧间的超时时间t3.51.75ms

CRC校验

RTU模式包含一个对全部报文内容执行的,基于循环冗余校验(CRC-Cyclical Redundancy Checking)算法的错误校验域。CRC域检验整个报文的内容,不管报文有无奇偶校验,均执行此检验。

CRC包含由两个8位字节组成的一个16位值。

CRC的计算,开始对一个16位寄存器预装全1。然后用报文中的连续的8位字节对其进行后续的计算。只有字符中的8个数据位参与生成CRC的运算,起始位,停止位和校验位不参与CRC计算。

CRC的生成过程:1)导入值与寄存器值异或:每个8位字符与寄存器中的值异或2)移位8次:然后结果向最低有效位(LSB)方向移动(shift1位,而最高有效位(MSB)位置充零。然后提取并检查LSB未移位时的LSB):如果LSB1,则寄存器中的值与一个固定的预置值(预先设定好的多项式)异或;如果LSB0,则不进行异或操作。这个过程(指移位过程,不包括导入值与寄存器值异或)将重复执行完8次移位。3)完成最后一次(第8次)移位及相关操作后,下一个8位字节与寄存器的当前值异或,然后又同上面描述过的一样重复8次。4)当所有报文中字节都运算之后得到的寄存器的最终值,就是CRC

 

 

3.2 ASCII传输模式

Modbus串行链路的设备被配置为使用ASCII模式通信时,报文中的每个8位字节以两个ASCII字符发送。当通信链路或设备无法符合RTU模式的定时管理时使用该模式。

注:由于一个字节需要两个字符,此模式比RTU效率低。

例:字节0x5B会被编码为两个字符:0x350x42

ASCII 字符传送

 

 

报文帧

ASCII模式,报文用特殊的字符区分帧起始和帧结束。一个报文必须以一个“冒号”(:)(ASCII十六进制3A)起始,以“回车-换行”(CR LF)对(ASCII十六进制0D0A)结束。

注:LF字符可以通过特定的Modbus应用命令改变。

对于所有域,允许传送的字符为十六进制0-9A-FASCII编码)。设备连续的监视总线上的“冒号”字符。当收到这个字符后,每个设备编码后续的字符一直到帧结束。

报文中字符间的时间间隔可以达到一秒。如果有更大的间隔,则接收设备认为发生了错误。

注:每个字符字节需要用两个字符编码。因此,为了确保ASCII模式和RTU模式在Modbus应用级兼容,ASCII数据域最大数据长度为(2x252)是RTU数据域(252)的两倍。

必然的,Modbus ASCII帧的最大尺寸为513个字符。

每次接受到“:”字符表示新的报文的开始。如果在一个报文的接收过程中收到该字符,则当前的报文被认为不完整并被丢弃。而一个新的接收缓冲区被重新分配。

LRC校验

LRC域检验不包括起始“冒号”和结尾CRLF。不管报文有无奇偶校验,均执行此检验。

ASCII模式,LRC的结果被ASCII编码为两个字节并放置于ASCII模式报文帧的结尾,CRLF之前。

纵向冗余检验(LRC)为一个字节,含有8位二进制值。

LRC的计算,对报文中的所有的连续8位字节相加,忽略任何进位,然后求出其二进制补码。

 

 

 

 

3.3 物理层

数据信号发送频率

要求9600bps波特率,推荐19200bps

每种波特率,对发送方,要求其精度必须高于1%,而对接受方,必须允许2%误差。

在没有中继器的任何RS485-Modbus系统中,总是允许最多有32台设备。

主干电缆端到端的长度必须有限制。其长度由波特率、电缆(规格、电容或特征阻抗)、菊花链上的负载数、以及网络配置(2线或4线制)所决定。

对于最高波特率为9600AWG26(或更粗)规格的电缆,其最大长度为1000m4线制用作2线制的系统中,最大长度必须除以2

分支必须短,不能超过20m。如果使用n分支的多口接头,每个分支最大长度必须限制为40m除以n

线路终端

为了使在RS485电缆终端的反射最小,需要在接近总线两端点处放置线路终端。

由于传播是双向的,故在线路两端都加置终端是非常重要的。但在一个无源D0-D1平衡对线上,加的LT不能超过2个,也不能再分支电缆上放置任何LT

每个线路终端必须连接在平衡线D0-D1两条导线之间。

4线系统中,在总线的两端,每一对线都必须有终端。

线路极性偏置

当没有数据在RS485上传递时,该线路不被驱动,因此易受外部噪声与干扰的影响。为确保它的接收器处于一个稳定状态,在没有数据信号出现时,一些设备需要使网络偏置。

如果一个或多个设备需要线路极性偏置,则必须在该RS485平衡对线上接一对电阻:

D1线上的上拉电阻至5V电压。

D0线上的下拉电阻至公共地线。

这些电阻的值必须介于450650欧姆之间,650欧姆的电阻值可以允许在串行链路总线上有较多设备。

在这种情况下,对在一个局部区域的整个串行总线,必须实现对线的极性偏置。通常该点选在主站或其接头上。其他设备不可实现任何极性偏置。

在此类Modbus串行链路上允许的最多设备数,比无极性偏置的Modbus系统少4个。

四. TCP/IPModbus

Modbus报文传输服务提供设备之间的客户机/服务器通信,这些设备联接在一个Ethernet TCP/IP网络上。

Modbus报文传输服务(客户机/服务器模型)基于4中类型报文:

Modbus请求:客户机在网络上发送用来启动实务处理的报文

Modbus指示:服务器接受的请求报文

Modbus响应:服务器发送的响应信息

Modbus 证实:在客户端接受的响应信息。

五. 示例

STC-1内部寄存器定义

继电器定义,功能码01/05.

序号 地址 数据描述

01 00001 DO1

08 00008 DO8

 

开关量输入定义,功能码02.

序号 地址 数据描述

01 10001 DI1

02 10002 DI2

08 10008 DI8

 

输入寄存器定义,功能码04

序号 地址 数据描述

01 30001 AI1

08 30008 AI8

 

保持寄存器定义,功能码03/06

序号 地址 数据描述

01 40001 系统实际时间的低16

02   40002 系统实际时间的高16

03 40003 第一路开关量32位计数器低16位。

04 40004 第一路开关量32位计数器高16位。

19 40019 为串口1收发延时设置,16位,以1ms为单位。

20 40020 为串口2收发延时设置,16位,以1ms为单位。

21 40021 串口1波特率设置

22 40022 串口2波特率设置。

 

参考:

1. MODBUS APPLICATION PROTOCOL SPECIFICATION v1.1

2. MODBUS APPLICATION PROTOCOL SPECIFICATION cn

3. Modbus通信协议

4. http://www.modbus.org/tech.php modbus官网及各语言code

5. https://github.com/stephane/libmodbus/ libmodbus

6. https://libmodbus.org/docs/v3.1.6/ libmodbus官网及API

7. libmodbus官方中文手册详解

8. modbusTCP协议

posted @ 2016-03-19 19:47  yuxi_o  阅读(1853)  评论(0编辑  收藏  举报