您好,欢迎来到钮旅网。
搜索
您的当前位置:首页MODBUS通讯规约文本060919-力创

MODBUS通讯规约文本060919-力创

来源:钮旅网
山东力创科技有限公司――――MODBUS-RTU通讯协议

MODBUS-RTU通讯规约说明

力创科技 06-09-19

目录

一、MODBUS通讯协议简介 二、通讯信息传输过程 三、MODBUS 功能码简介

四、错误校验码(CRC 校验) 五、通讯错误信息及数据的处理 附件:CRC 校验算法程序

一、MODBUS通讯协议简介:

MODBUS 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

监控系统之间进行信息交换和数据通讯。

同类型的总线或网络连接的设备之间的客户机/服务器通信。

MODBUS通讯规约允许EDA系列模块/仪表/变送器与多个品牌的PLC、RTU、DCS等或与第三方具有MODBUS兼容的MODBUS是一个请求/应答协议,并且提供功能码规定的服务。MODBUS是一种应用层报文传输协议,用于在通过不EDA系列模块/仪表/变送器提供了标准的RS-485/RS-232通讯接口及MODBUS-RTU通讯协议;EDA系列产品只要注:MODBUS是Modicon公司的注册商标。 l 例如:

寄存器大小 值 l

数据编码:

MODBUS使用最高有效字节在低地址存储的方式表示地址与数据项。即当发送多个字节时,首先发送最高有效字节。

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

通讯数据的类型及格式:

信息传输为异步方式,以字节为单位,每字节为10位的格式传输: 字格式(串行数据) 起始位 数据位 奇偶校验位 停止位

10位二进制 1位,0

8位,最低的有效位先发送 无

1位,1 功能码 1字节

数据区 N字节

CRC校验

16位CRC校验码(循环冗余码)

通讯数据(信息帧)格式: 数据格式: 地址码 数据长度: 1字节

数据字节: 1个字节由8位二进制数(8Bit)组成。

CRC校验: CRC生成后,低字节在前,高字节在后。 l

MODBUS-RTU的帧结构:

在RTU模式中,新的信息总是以至少3.5个字符的静默时间开始。紧接着传送第一个域:设备地址。

整帧的信息必须以一个连续的数据流进行传输。如果信息结束前存在超过1.5个字符以上的间隔时间,则出错。 一帧信息的标准结构如下:

开始 地址域 功能域 数据域 CRC校验 结束 T1-T2-T3-T4 8位 8位 n*8位 16位 T1-T2-T3-T4

http://WWW.SDLCKJ.COM Tel: 0634-6251393,6251397 Page 1 of 7

UnRegis简单地增加一套基于计算机(或工控机)的监控软件(如:组态王、FIX 等)就可构成一套电力监控系统。

tered山东力创科技有限公司――――MODBUS-RTU通讯协议

二、通讯信息传输过程:

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

l 地址码:

地址码是每次通讯信息帧的第一字节,从0 到 255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。同一总线系统内的每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的地址码表明该信息来自于何处。

l 功能码:

是每次通讯信息帧传送的第二个字节。MODBUS 通讯规约可定义的功能码为 1到 127。力创科技EDA系列模块/仪表/变送器仅用到其中的一部分功能码。 作为主机请求发送,通过功能码告诉从机应执行什么动作。作为从机响应,从机返回的功能码与从主机发送来的功能码一样,并表明从机已响应主机并且已进行相关的操作。

力创科技EDA系列MODBUS 部分功能码如下表: 功能码

01 02 03 05 06 0F 10

定 义

读开关量输出 OUT 读开关量输入 DI 读寄存器数据 写开关量输出 OUT 写单路寄存器 写多路开关量输出 写多路寄存器

操 作

读取一路或多路开关量输出状态数据

读取一路或多路开关量状态输入数(遥信) 读取一个或多个寄存器的数据

控制一路继电器“分/合”输出,遥控 把一组二进制数据写入单个寄存器 写一路或多路开关量输出(遥控) 把多组二进制数据写入多个寄存器

l 数据区:

输出、寄存器等等)、参考地址等。例如, 主机通过功能码03 告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相

EDA系列模块/仪表/变送器采用 MODBUS-RTU 通讯规约,主机(PLC、RTU、PC 机、 DCS 等)利用通讯命令(功能码03),可以任意读取其数据寄存器(其数据信息表详见相应说明书)。一次最多可读取寄存器个数是100个。EDA91系列模块/仪表的数据寄存器存储的电量多达几百个(如:电流、电压、功率、0~31 次谐波分量、需量等),每个参数都是16 位(2 字节)的二进制数 据,并且高位在前; 同(可参照通讯信息表)。

l CRC校验:

细说明见后页;

MODBUS-RTU通讯协议的 CRC(冗余循环码)包含2个字节,即16位二进制数。低字节在前,高字节在后。其详

l 静止时间要求:

在MODBUS-RTU模式中,发送数据前要求数据总线静止时间即无数据发送时间至少大于3.5个字符的时间(如波特率为9600时为3.6mS); 整帧的信息必须以一个连续的数据流进行传输。如果信息结束前存在超过1.5个字符以上的间隔时间,则出错。

三、MODBUS 功能码简介:

3.1 功能码01(0x01):读1路或多路开关量输出状态

例1:主机要读取地址为01,输出开关量第0~15路的共16路输出状态 主机发送的报文格式: 主机发送

字节数

发送信息 备注

http://WWW.SDLCKJ.COM Tel: 0634-6251393,6251397 Page 2 of 7

UnReg数据区包括需要由从机返回何种信息或执行什么动作。这些信息可以是数据(如:开关量输入/输出、模拟量输入/

istered山东力创科技有限公司――――MODBUS-RTU通讯协议

从机地址 1 01 发送到地址为01的从机 功能码 1 01 读开关量输出状态

起始位

2 0000 起始BIT位地址为0000 读开关量个数 2 0010 读取16路开关量输出状态 CRC码 2 3DC6 由主机计算出的CRC码

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

从机响应 字节数 返回信息 备注

从机地址 1 01 来至从机01

功能码 1 01 读开关量输出状态

数据长度 1 02 2个字节(16个BIT位)

OUT状态数据

1

02 00

第一个字节的BIT0位对应开关量开始地址的状态位; 第一个字节对应开关量7~0状态位;第二个字节对应开关量15~8状态位;返回数据0200表示第1路开关量输出为“1”,其余为“0”; CRC码 2 BC

由EDA模块计算得到的CRC码

例2:主机要读取地址为01,输出开关量2和3的输出状态(开关量0、1、2、3……) 主机发送的报文格式: 主机发送 字节数 发送信息 备注

从机地址 1 01 发送到地址为01的从机 功能码 1 01 读开关量输出状态

d起始位

2 0002 起始Bit位地址为0002 读开关量个数 2 0002 读取2路开关量输出状态 eCRC码 2 1C0B 由主机计算出的CRC码

r从机(EDA)响应返回的报文格式:

从机响应 字节数 返回信息 备注

e从机地址 1 01 来至从机01

t功能码 1 01 读开关量输出状态

数据长度 1 01 1个字节(8si个BIT位)

OUT状态数据

1

02

g寄存器内容BIT0对应开关量输出2状态为“0”,BIT1对应开关量输出3状态为“1”;Bit7~2为用0填充的CRC码 2 D049

e6个剩余位;

由EDA模块计算得到的CRC码

3.2 功能码02(0x02)Rn:读1路或多路开关量输入状态 DI

例3:主机要读取地址为01,开关量DI0~15的输入状态 主机发送的报文格式: 主机发送 字节数 发送信息 备注

从机地址 U1 01 发送到地址为01的从机 功能码 1 02 读开关量输入状态

起始位

2 0000 起始BIT位地址为0000 读开关量个数 2 0010 读取16路开关量输入状态 CRC码 2

79C6

由主机计算出的CRC码

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

从机响应 字节数 返回信息 备注

从机地址 1 01 来至从机01

功能码 1 02 读开关量输入状态

数据长度 1 02 2个字节(16个BIT位)

DI状态数据

1

0200

第一个字节的BIT0位对应开关量开始地址的状态位;第一个字节对应开关量7~0状态位;第二个字节对应开关量15~8状态位;返回数据0200表示第1路开关量输入为“1”,其余为“0”; CRC码

2

B8D8

由EDA模块计算得到的CRC码

http://WWW.SDLCKJ.COM Tel: 0634-6251393,6251397 Page 3 of 7

山东力创科技有限公司――――MODBUS-RTU通讯协议

例4:主机要读取地址为01,开关量DI1~3的输入状态 主机发送的报文格式: 主机发送 从机地址 功能码 起始位

读开关量个数 CRC码 从机响应 从机地址 功能码 数据长度 DI状态数据

字节数 1 1 2 2 2 字节数 1 1 1 1

发送信息 01 02 0001 0003 69CB 返回信息 01 02 01 02

备注

发送到地址为01的从机 读开关量输入状态

起始BIT位地址为0001 读取3路开关量输入状态 由主机计算出的CRC码

备注

来至从机01

读开关量输入状态

1个字节(8个BIT位)

数据02H的Bit2、Bit0对应开关量输入的DI3、DI1其状态为“0”, Bit1对应开关量输入的DI2其状态为“1”;(因命令是从开关量输入的第1位开始读取) Bit7~3为用0填充的5个剩余位; 由EDA模块计算得到的CRC码

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

3.3 功能码03(0x03): 读多路寄存器

主机发送的报文格式: 主机发送 从机地址 功能码 起始地址 数据长度 CRC码 从机响应 从机地址 功能码 返回字节数 寄存器数据1 寄存器数据2 CRC码

字节数 1 1 2 2 2 字节数 1 1 1 2 2 2

发送信息 01 03 0106 0002 25F6 返回信息 01 03 04 2710 1388 FC14

例5:主机要读取地址为01,开始地址为0106H的2个从机寄存器数据

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

3.4 功能码05(0x05):写1路开关量输出(遥控)

控制命令为:

“FF00”为输出开关量为“1”,即控制继电器“合”;“0000”为输出开关量为“0”,即控制继电器“分”。 例6:主机要控制地址为01,第0路开关量DO0(或继电器)“合” 主机发送的报文格式: 主机发送 从机地址 功能码 输出Bit位 控制命令 CRC码

http://WWW.SDLCKJ.COM Tel: 0634-6251393,6251397 Page 4 of 7

字节数 1 1 2 2 2

发送信息 01 05 0000 FF00 8C3A

备注

发送到地址为01的从机 写开关量输出状态

对应输出继电器BIT0位(DO0) 控制该路继电器输出为“合” 由主机计算出的CRC码

从机(EDA)响应返回的报文格式:与主机发送的报文格式及数据内容完全相同。

UnReg备注

发送到地址为01的从机 读取寄存器

起始地址为0106H

读取2个寄存器(共4字节) 由主机计算出的CRC码 备注

来至从机01 读取寄存器

2个寄存器共4字节

地址为0106寄存器的内容 地址为0107寄存器的内容 由EDA模块计算得到的CRC码

isteredCRC码 2 2049

山东力创科技有限公司――――MODBUS-RTU通讯协议

例7:主机要控制地址为01,第1路开关量DO1(或继电器)“分” 主机发送的报文格式: 主机发送 字节数 发送信息 备注

从机地址 1 01 发送到地址为01的从机 功能码 1 05 写开关量输出状态

输出Bit位 2 0001 对应输出继电器BIT1位(DO1) 控制命令 2 0000 控制该路继电器输出为“分” CRC码 2

9C0A

由主机计算出的CRC码

从机(EDA)响应返回的报文格式:与主机发送的报文格式及数据内容完全相同。

3.5 功能码06(0x06):写单路寄存器

例8:主机要把数据1388,保存到1号从机地址为0001的寄存器中去。 主机发送的报文格式: 主机发送 字节数 发送信息 备注

从机地址 1 01 发送到地址为01的从机 功能码 1 06 写单路寄存器

起始地址 2 0001 要写入的寄存器地址 写入数据 2 1388 对应的写入数据

CRC码 2

D55C

由主机计算出的CRC码

从机(EDA)响应返回的报文格式:与主机发送的报文格式及数据内容完全相同。

d e

r3.6 功能码0F(0x0F):写多路开关量输出(遥控)

例9:主机要控制地址为01,第0、2路继电器闭合,第1、3e主机发送的报文格式: t路继电器断开。

主机发送 字节数 发送信息 备注

s从机地址 1 01 发送到地址为i功能码 1 0F 起始位地址 2 0000 g01的从机 写多路开关量输出

输出数量 2 字节计数 1 e对应输出继电器起始BIT0位(DO0) 0004 控制DO0~DO3共4路继电器

01 1字节数;字节数N=输出数量/8,若余数不等于0,输出数据 2 R则N=N+1。

05

Bit3~Bit0:0101为0、2路合,1、3路分;其他未CRC码 2

n使用位用0填充

FE95 由主机计算出的CRC码

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

从机响应 从机地址 U字节数 返回信息 备注

1 01 来至从机01

功能码 1 0F 写多路开关量输出

起始位地址 2 0000 对应输出继电器起始BIT0位(DO0) 输出数量 2 0004 控制DO0~DO3共4路继电器 CRC码 2

08

由EDA模块计算得到的CRC码

3.7 功能码10(0x10):写多路寄存器

主机利用这个功能码把多个数据保存到EDA表的数据寄存器中去。 MODBUS 通讯规约中的寄存器指的是 16 位(即2字节),并且高位在前。

例10:主机要把0001,0014保存到地址为0002,0003 的从机寄存器中去(从机地址码为01)。 主机发送的报文格式: 主机发送 字节数 发送信息 备注

从机地址 1 01 发送到地址为01的从机 功能码 1 10 写多路寄存器

起始地址

2

0002

要写入的寄存器起始地址

http://WWW.SDLCKJ.COM Tel: 0634-6251393,6251397 Page 5 of 7

山东力创科技有限公司――――MODBUS-RTU通讯协议

写寄存器数量 字节计数 保存数据1 保存数据2 CRC码 从机响应 从机地址 功能码 起始地址 写寄存器数量 CRC码

2 1 2 2 2 字节数 1 1 2 2 2

0002 04 0001 0014 23B9 返回信息 01 10 0002 0002 E008

要写入的寄存器个数 要写入的数据字节长度

数据0001写入地址为0002的寄存器 数据0014写入地址为0003的寄存器 由主机计算出的CRC码 备注

来至从机01 写多路寄存器

要写入的寄存器起始地址 要写入的寄存器个数

由EDA模块计算得到的CRC码

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

四、错误校验码(CRC 校验):

使用MODBUS-RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。

主机或从机可用校验码进行判别接收信息是否正确。由于电子噪声或一些其它干扰,信息在传输过程中有时会发生加了系统的可靠性及通讯效率。

CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。 CRC 码的计算方法是:

错误,错误校验码(CRC)可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃,这样增

CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的在进行 CRC 计算时只用 8 个数据位,起始位及停止位和奇偶校验位都不参与 CRC 计算。 1.预置1个全“1”的16位CRC寄存器(0xFFFF)(即全为1);

果放于 CRC 寄存器的低8位;

2.把第一个 8 位二进制数据(既信息帧的第一个字节)与 16 位的CRC寄存器的低8位相异或(XOR),把结3.把 CRC 寄存器的内容右移一位(朝低位),用0 填补最高位,并检查右移后的移出位;

4.如果移出位为1,则CRC寄存器与预置的值A001(1010 0000 0000 0001)异或一下; 如果移出位为0,则不

进行。

5.重复8 次步骤3和4,对整个8位数据全部进行处理; 6.重复按步骤2到5的方法,进行通讯信息帧的下一个字节处理;

7.将该通讯信息帧所有字节按上述步骤计算完成后,得到16位的CRC值; 8.CRC添加到消息中时,低字节先加入,然后高字节。

五、通讯错误信息及数据的处理:

当EDA系列模块/仪表/变送器 检测到除了CRC码出错以外的错误时,则向主机回送信息,功能码的最高位置

为1,即从机返送给主机的功能码是在主机发送的功能码的基础上加128 。以下的这些代码表明有意外的错误发生。

EDA从主机接收到的信息如有CRC错误,则将被EDA从机忽略。 EDA从机返送的错误码的格式如下(CRC 码除外):

地址码: 1 字节

功能码: 1 字节(最高位为 1) 错误码: 1 字节 CRC 码:2 字节。 EDA 响应回送如下错误码:

81:非法的功能码。 接收到的功能码 EDA模块不支持。

82:读取非法的数据地址。 指定的数据位置超出EDA模块的可读取的地址范围。

http://WWW.SDLCKJ.COM Tel: 0634-6251393,6251397 Page 6 of 7

UnRegistered山东力创科技有限公司――――MODBUS-RTU通讯协议

83:非法的数据值。 接收到主机发送的数据值超出EDA模块相应地址的数据范围。

附件:CRC 校验算法程序(直接计算)

function CalcCRC16(str: string): Word; procedure CRC16(Data: Byte); var

i: Integer; begin

Result := Result xor Data; begin

if ((Result and 1)=1) then

Result := (Result shr 1) XOR $A001 else

Result := Result shr 1; end; end; var

d i: Integer; begin

e Result := $FFFF; rfor i:=1 to Length(str) do e CRC16(Byte(str[i])); tend;

s i

geRnUhttp://WWW.SDLCKJ.COM Tel: 0634-6251393,6251397 Page 7 of 7

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- niushuan.com 版权所有 赣ICP备2024042780号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务