Modbus总线协议

工业控制已从单机控制走向集中监控、集散控制,如今已进入网络时代,工业控制器连网也为网络管理提供了方便。Modbus就是工业控制器的网络协议中的一种。

1. 协议概述

物理层:传输方式:RS485
通讯地址:0-247
通讯波特率:可设定
通讯介质:屏蔽双绞线
传输方式:主从半双工方式

协议在一根通讯线上使用应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,在相反的方向上终端设备发出的应答信号传输给主机。

协议只允许在主计算机和终端设备之间,而不允许独立的设备之间的数据交换,这就不会在它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。

一个数据帧格式:1位起始位,8位数据,1位或者无奇偶检验位、1位或者2位停止位。

一个数据包格式:

协议详细定义了校验码、数据格式、功能码等,这些都是特定数据交换的必要内容。

当数据帧到达终端设备时,它通过一个简单的“口”进入寻址到的设备,该设备去掉数据帧的“信封”(数据头),读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据加入到取得的“信封”中,把数据帧返回给发送者。返回的响应数据中包含了以下内容:终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和一个校验码(Check)。发生任何错误都不会有成功的响应。

1.1 地址(Address)域

地址域在帧的开始部分,由8位(0 ~ 255)组成,这些位标明了用户指定的终端设备的地址,该设备将接收来自与之相连的主机数据。每个终端设备的地址必须是唯一的,仅仅被寻址到的终端会响应包含了该地址的查询。当终端发送回一个响应,响应中的从机地址数据便告诉了主机哪台终端正与之进行通信。

1.2 功能(Function)域

功能域代码告诉了被寻址到的终端执行何种功能。表1-1列出了部分常用的功能码、它们的意义及它们的初始功能。

表1-1 功能码

1.3 数据域

数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这些数据的内容可能是数值、参考地址或者极限值。例如:功能域代码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同能力而有所不同。

1.4 校验域

该域允许主机和终端检查传输过程中的错误。有时,由于电噪声和其它干扰,一组数据在从一个设备传输到另一个设备时在线路上可能会发生一些改变,出错校验能够保证主机或者终端不去响应那些传输过程中发生了改变的数据,这就提高了系统的安全性和效率,出错校验使用了16位循环冗余的方法。

[注] 发送序列总是相同的 – 地址、功能码、数据和与方向相关的出错校验。

1.5 错误检测

循环冗余校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传送设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。

CRC运算时,首先将一个16位的寄存器预置为全1,然后连续把数据帧中的8位字节与该寄存器的当前值进行运算,仅仅每个字节的8个数据位参与生成CRC,起始位和停止位以及可能使用的奇偶位都不影响CRC。

在生成CRC时,每个8位字节与寄存器中的内容进行异或,然后将结果向低位移位,高位则用“0”补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值进行一次异或运算,如果最低位为0,不作任何处理。

上述处理重复进行,直到执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC值。

生成一个CRC的流程为:
1. 预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。
2. 把数据帧中的第一个8位字节与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。
3. 如果最低位为0:重复第2步(下一次移位)。

如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。
1. 重复第2步和第3步直到8次移位。这样处理完了一个完整的八位。
2. 重复第2步到第4步来处理下一个八位,直到所有的字节处理结束。
3. 最终CRC寄存器的值就是CRC的值。

2. 应用层功能详解

2.1 读保持寄存器(功能码03)

2.1.1 查询

功能码03H允许用户读取多个保持寄存器的内容。主站设备可设从保持寄存器的任何起始地址读取多个寄存器的值。表2-1的例子是从03号从机读3个数据U1,U2,U3, 其中U1的地址为0001H, U2的地址为0002H, U3的地址为0003H,即寄存器起始地址为0001H,数据个数为0003H。

表2-1 读U1、U2、U3的查询数据帧

2.1.2 响应

响应包含从机地址、功能码、数据的数量和CRC错误校验。表2-2的例子是读取U1,U2,U3的响应。

表2-2 读U1,U2,U3 的响应数据帧

2.2 预置多个寄存器(功能码10)

2.2.1 查询

功能码10H允许用户改变多个寄存器的内容,设备可从任何地址开始设置多个变量的值。表2-3的例子是修改3号从站设备的负载监控1和负载监控2的动作及延时时间的设定值,其中负载监控1的动作设定值地址为2AH,延时时间的设定值为2BH,负载监控2的动作设定值地址为2CH,延时时间的设定值为2DH。

表2-3 修改负载监控1和负载监控2的动作值及延时时间的设定值

2.2.2 响应

响应包含从机地址、功能码、数据的数量和CRC错误校验。表2-4的例子是修改负载监控1和负载监控2的动作值及延时时间的设定值的响应。

表2-4 修改负载监控1和负载监控2的动作值及延时时间的设定值的响应

2.3 预置单个寄存器(功能码06)

2.3.1查询

功能码06允许用户改变单个寄存器的内容。表2-5的例子是修改03号从机过载动作设定值Ir1,其中Ir1地址是002EH.

表2-5 修改过载动作设定值Ir1

2.3.2响应

对于预置单个寄存器请求的正常响应是在寄存器值改变以后将接收到的数据传送回去。

表2-6 修改过载动作设定值Ir1响应