MODBUS通信规约解析.docx

上传人:b****2 文档编号:17406669 上传时间:2023-07-25 格式:DOCX 页数:11 大小:19.89KB
下载 相关 举报
MODBUS通信规约解析.docx_第1页
第1页 / 共11页
MODBUS通信规约解析.docx_第2页
第2页 / 共11页
MODBUS通信规约解析.docx_第3页
第3页 / 共11页
MODBUS通信规约解析.docx_第4页
第4页 / 共11页
MODBUS通信规约解析.docx_第5页
第5页 / 共11页
MODBUS通信规约解析.docx_第6页
第6页 / 共11页
MODBUS通信规约解析.docx_第7页
第7页 / 共11页
MODBUS通信规约解析.docx_第8页
第8页 / 共11页
MODBUS通信规约解析.docx_第9页
第9页 / 共11页
MODBUS通信规约解析.docx_第10页
第10页 / 共11页
MODBUS通信规约解析.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

MODBUS通信规约解析.docx

《MODBUS通信规约解析.docx》由会员分享,可在线阅读,更多相关《MODBUS通信规约解析.docx(11页珍藏版)》请在冰点文库上搜索。

MODBUS通信规约解析.docx

MODBUS通信规约解析

MODBUS通信规约

第一章MODBUS协议简介

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

MODBUS协议在一对通讯线上使用主从应答式连接(半双工),这意味着在一对单独的通讯线上信号沿着相反的两个方向传输。

首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,终端设备发出的应答信号以相反的方向传输给主机。

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

1.1传输方式

传输方式是一个数据帧内一系列独立的数据结构以及用于传输数据的有限规则,下面定义了与MODBUS协议-RTU方式相兼容的传输方式。

◆CodingSystem二进制编码8位

◆Startbit起始位1位

◆Databits数据位8位

◆Parity校验无奇偶校验

◆Stopbit停止位1位

◆Errorchecking错误检测CRC(循环冗余校验)

1.2协议

当数据帧到达终端设备时,它通过一个简单的“端口”进入被寻址到的设备,该设备去掉数据帧的“信封”(数据头),读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据加到取得的“信封”中,把数据帧返回给发送者。

返回的响应数据中包含了以下内容:

终端从机地址(Address)、被执行了的命令(Function)、执行命令生成的被请求数据(Data)和一个校验码(Check)。

发生任何错误都不会有成功的响应。

1.2.1数据帧格式

Address

Function

Data

Check

8-Bits

8-Bits

N×8-Bits

16-Bits

1.2.2地址(Address)域

地址域在帧的开始部分,由一个字节8位(0~255)组成,这些位标明了用户指定的终端设备的地址,该设备将接收来自与之相连的主机数据。

每个终端设备的地址必须是唯一的,仅仅被寻址到的终端会响应包含了该地址的查询。

当终端发送回一个响应,响应中的从机地址数据便告诉了主机哪台终端正与之通信。

1.2.3功能(Function)域

功能于域代码告诉了被寻址到的终端执行何种功能。

参见表1-1。

功能码

意义

作用

01

读取线圈状态

取得一组逻辑线圈的当前状态(ON/OFF)

02

读取输入状态

取得一组开关输入的当前状态(ON/OFF)

03

读取保持寄存器

取得一个或多个保持寄存器的当前二进制值

04

读取输入寄存器

取得一个或多个输入寄存器的当前二进制值

05

强制单线圈

强制一个逻辑线圈的通断状态

06

预置单寄存器

把具体的二进制值装入一个保持寄存器

07

读取异常状态

取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可将这些线圈定义,以说明从机状态,短报文适宜迅速读取状态。

08

回送诊断校验

把诊断校验报文送主机,以对通讯处理进行评鉴

09

编程(只用于484)

使主机模拟编程器使用,修改PC从机逻辑

10

控询(只用于484)

可使主机与正在执行长程序任务从机通讯,定期探询该从机是否已经完成其操作任务,仅在含有功能码9的报文发送后,本功能码才得发送。

11

读取事件计数

可使主机发出单询问,并随即判定操作是否成功,尤其是在该命令或其应答产生通讯错误时。

12

读取通讯事件记录

可使主机检索每台从机的Modbus事务处理通讯事件记录。

如果某项事务处理未完成,记录会给出有关错误。

13

编程(184/384484584)

可使主机模拟编程功能,修改PC状态逻辑

14

探询(184/384484584)

可使主机与正在执行长程序任务从机通讯,定期探询该从机是否已经完成其操作任务,仅在含有功能码13的报文发送后,本功能码才得发送。

15

强置多线圈

强置一串连续逻辑线圈的通断

16

预置多寄存器

把具体的二进制值装入一串连续的保持寄存器

17

报告从机标识

可使主机判断编址从机的类型及该从机运行指示灯的状态。

18

编程(884和Micro84)

可使主机模拟编程功能,修改PC状态逻辑

19

重置通讯链路

发生非可修正错误后使从机复位于已知状态

20

读取通用参数

显示扩展存储器文件中的数据信息

21

写入通用参数

把通用参数写入扩展存储器文件,或修改之

22-64

保留作扩展功能备用

65-72

保留以备用户功能使用

留作用户功能的扩展编码

73-119

非法功能

120-127

保留

留作内部使用

128-255

保留

用于异常应答

1.2.4数据(Data)域

数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。

这些数据的内容可能是数值、参考地址或者设定值。

例如:

功能码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取了多少个数据,内嵌的地址和数据依照类型和从机之间的不同内容而有所不同。

1.2.5错误校验(Check)域

该域允许主机和终端检查传输过程中的错误。

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

1.3错误检测

循环冗余校验(CRC)域占用两个字节,包含了一个16位的二进制值。

CRC值由传送设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。

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

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

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

生成一个CRC的流程为:

1.预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2.把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

3.将CRC寄存器向右移一位。

4.如果最低位为0:

重复第三步(下一次移位)。

如果最低位为1:

将CRC寄存器与一个预设的固定值(1010000000000001)进行异或运算。

5.重复第三步和第四步直到8次移位。

这样处理完了一个完整的八位。

6.重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

7.最终CRC寄存器得到的值就是CRC的值。

8.CRC寄存器发送时将高低位互换,即高位在前,低位在后。

 

第二章MODBUS功能详解

本章所述协议将尽可能的使用下图所示的格式。

(数字为16进制)

Addr

Fun

Datastartreghi

Datastartreglo

Data#ofregshi

Data#ofregslo

CRC16Hi

CRC16Lo

06H

03H

00H

00H

00H

21H

84H

65H

注:

Addr:

从机地址

Fun:

功能码

Datastartreghi:

数据起始地址寄存器高位

Datastartreglo:

数据起始地址寄存器低位

Data#ofregshi:

数据读取个数寄存器高位

Data#ofregslo:

数据读取个数寄存器低位

CRC16Hi:

循环冗余校验高位

CRC16lo:

循环冗余校验低位

2.1读数字输出状态(功能码01)

查询数据帧

此功能允许用户获得指定地址的从机控制的特定地址的DO输出状态ON/OFF(1=ON,0=OFF),除了从机地址和功能域,数据帧还需要在数据域中包含被读取DO的初始地址和要读取的DO数量。

下图的例子是从地址为17的从机读取DO1到DO6的状态。

Addr

Fun

DOstartreghi

DOstartreglo

Data#ofregshi

Data#ofregslo

CRC16Hi

CRC16Lo

11H

01H

00H

00H

00H

06H

BEH

98H

响应数据帧

响应包含从机地址、功能码、数据的数量和CRC错误校验,数据包中每个DO占用一位(1=ON,0=OFF),第一个字节的最低位为寻址到的DO值,其余的在后面。

下图所示为读数字输出状态响应的实例。

(DO1=OFF,DO2=ON,DO3=OFF,DO4=ON,DO5=OFF,DO6=ON)

Addr

Fun

Bytecount

Data

CRC16hi

CRC16lo

11H

01H

01H

2AH

D4H

97H

DO状态

DO6

DO5

DO4

DO3

DO2

DO1

0

0

1

0

1

0

1

0

2.2读数字输入状态(功能码02)

查询数据帧

此功能允许用户获得DI的状态ON/OFF(1=ON,0=OFF),除了从机地址和功能域,数据帧还需要在数据域中包含被读取DI的初始地址和要读取的DI数量。

下图的例子是从地址为17的从机读取DI1到DI16的状态。

Addr

Fun

DIstartaddrhi

DIstartaddrlo

DInumhi

DInumlo

CRC16Hi

CRC16Lo

11H

02H

00H

00H

00H

10H

7BH

56H

响应数据帧

响应包含从机地址、功能码、数据的数量和CRC错误校验,数据包中每个DI占用一位(1=ON,0=OFF),第一个字节的最低位为寻址到的DI值,其余的在后面。

下图所示为读数字输出状态响应的实例。

(DI1=ON,DI2=ON,DI3=OFF,DI4=OFF,DI5=ON,DI6=ON,DI7=OFF,DI8=OFF,DI9=OFF,DI10=ON,DI11=ON,DI12=ON,DI13=OFF,DI14=OFF,DI15=ON,DI16=ON)

Addr

Fun

Bytecount

Data1

Data2

CRC16hi

CRC16lo

11H

02H

02H

33H

CCH

6CH

DEH

Data1

DI8

DI7

DI6

DI5

DI4

DI3

DI2

DI1

0

0

1

1

0

0

1

1

Data2

DI16

DI15

DI14

DI13

DI12

DI11

DI10

DI9

1

1

0

0

1

1

0

0

2.3读数据(功能码03)

查询数据帧

此功能允许用户获得设备采集与记录的数据及系统参数。

下图的例子是从17号从机读3个采集到的基本数据(数据帧中每个地址占用2个字节)U1,U2,U3。

Addr

Fun

Datastartaddrhi

Datastartaddrlo

Data#ofregshi

Data#ofregslo

CRC16Hi

CRC16Lo

11H

03H

00H

00H

00H

03H

07H

5BH

响应数据帧

响应包含从机地址、功能码、数据的数量和CRC错误校验

下图所示为读U1,U2,U3(U1=03E8H,U2=03E7H,U3=03E9H)响应的实例。

Addr

Fun

Bytecount

Data1hi

Data1lo

Data2hi

Data2lo

Data3hi

Data3lo

CRC16hi

CRC16lo

11H

03H

06H

03H

E8H

03H

E7H

03H

E9H

FDH

9CH

2.4控制DO(功能码05)

查询数据帧

该数据帧强行设置一个独立的DO为ON或OFF,数据FF00H将设DO为ON状态,而0000H将设DO为OFF状态。

下图的例子是从17号从机设置DO1为ON状态。

Addr

Fun

DOaddrhi

DOaddrlo

Valuehi

Valuelo

CRC16Hi

CRC16Lo

11H

05H

00H

00H

FFH

00H

8EH

AAH

响应数据帧

响应包含从机地址、功能码、数据的数量和CRC错误校验

对这个命令请求的正常响应是在DO状态改变以后回传接收到的数据。

Addr

Fun

DOaddrhi

DOaddrlo

Valuehi

Valuelo

CRC16Hi

CRC16Lo

11H

05H

00H

00H

FFH

00H

8EH

AAH

2.5预置多寄存器(功能码16)

查询数据帧

功能码16(十进制)(十六进制为10H)允许用户改变多个寄存器的内容。

注意:

禁止对不具有可写属性的单元使用此命令改写。

下图的例子是预置17号从机正向有功电度EP+为178077833Kwh.EP+的地址是0040H,EP+占用32位,共4个字节。

Addr

Fun

Datastartreghi

Datastartreglo

Data#ofreghi

Data#ofreglo

Bytecount

Valuehi

Valuelo

Valuehi

Valuelo

CRC16hi

CRC16lo

11H

10H

00H

40H

00H

02H

04H

40H

89H

0AH

9DH

A0H

7CH

响应数据帧

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

Addr

Fun

Datastartreghi

Datastartreglo

Data#ofreghi

Data#ofreglo

CRC16hi

CRC16lo

11H

10H

00H

40H

00H

02H

42H

8CH

一般原则:

1.模拟量采用MODBUS-RTU通讯规约的03号命令读出。

2.开入量采用MODBUS-RTU通讯规约的02号命令读出。

3.开出量采用MODBUS-RTU通讯规约的01号命令读出,05号命令写入。

4.SOE记录可用MODBUS-RTU通讯规约的03号命令读出,16号命令清除。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2