Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

广泛的系统集成:

PDM系列仪表/变送器提供了标准的RS-485/422通讯接口及ModBus通讯协议,这个通讯协议已广泛被国内外电力行业及工控行业作为系统集成的标准。

通讯数据的类型及格式:

信息传输为异步方式,并以字节为单位。在主站和从站之间传递的通讯信息是11位的字格式:

字格式(串行数据)

11位二进制

起始位

1位

数据位

8位

奇偶校验位

1位:有奇偶校验位/无:无奇偶校验位

停止位

1位:有奇偶校验位/2位:无奇偶校验位

● 通讯数据(信息帧)格式

数据格式:

地址码

功能码

数据区

错误校检

数据长度:

1字节

1字节

N字节

16位CRC码(冗余循环码)

★ 注:1、1个字节由8位二进制数组成(既8 bit)。

2、ModBus是Modicon公司的注册商标。

3、“从机”在本文件中既为PDM。

一、通讯信息传输过程:

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

1.1 地址码:

地址码是每次通讯信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机

发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的地址码表明该信息来自于何处。

1.2 功能码:

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

表8.1 MODBUS部分功能码

功能码

定  义

操  作(二进制)

02

读开关量输入

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

01

读开关量输出

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

03

读寄存器数据

读取一个或多个寄存器的数据

05

写开关量输出

控制一路继电器“合/分”输出

06

写单路寄存器

把一组二进制数据写入单个寄存器

10

写多路寄存器

把多组二进制数据写入多个寄存器

1.3 数据区:

数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据(如:开关量输入/输出、模拟量输入/输出、寄存器等等)、参考地址等。例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相同(应给出通讯信息表)。

PDM系列仪表/变送器采用Modbus通讯规约,主机(PLC、RTU、PC机、DCS等)利用通讯命令(功能码03),可以任意读取其数据寄存器(其数据信息表详见附录)。PDM系列仪表/变送器的数据寄存器存储的电量多达几百个(如:电流、电压、功率、0~31次谐波分量等),并且都是16位(2字节)的二进制数据,并且高位在前;一次最多可读取寄存器数(既各种电量的数量)是50个。

PDM响应的命令格式是从机地址、功能码、数据区及CRC码。数据区的数据都是两个字节,并且高位在前(电能量除外)。

注:1、PDM-820AC/ACM/ACR、PDM-800AC/ACM具有“03”、“06”、“10”功能码;

2、如果PDM采用MODBUS ASCII通讯协议,其通讯数据格式为;7个数据位,1个

停止位,偶校验。

二、MODBUS功能码简介

2.1 功能码“02”:读1路或多路开关量状态输入

例如:主机要读取地址为01,开关量DI1—DI4的输入状态。

从机(PDM)数据寄存器的地址和数据为:

起始位地址

DI寄存器数据(16进制)

备  注

0000

0B

DI1/DI2/DI4状态为“1”,DI3状态为“0”

主机发送的报文格式:

主机发送

字节数

发送的信息

备  注

从机地址

1

01

发送至地址为01的从机

功能码

1

02

读开关量输入状态

起始BIT位

2

0000

起始BIT位地址为0000

读数据长度

2

0004

读取4路开关量输入状态位

CRC码

2

79C9

由主机计算得到CRC码

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

从机响应

字节数

返回的信息

备  注

从机地址

1

01

来自从机01

功能码

1

02

读开关量输入状态

数据长度

1

01

1个字节(8个BIT位)

DI状态数据

1

0B

DI寄存器内容

CRC码

2

E04F

由从机计算得到CRC码

2.2 功能码“01”:读1路或多路开关量输出状态

例如:主机要读取地址为01,开关量DO1,DO2的输出状态。

从机(PDM)数据寄存器的地址和数据为:

起始位地址

DO寄存器数据(16进制)

备  注

0000

02

DO2输出状态为“1”,DO1输出状态为“0”

主机发送的报文格式:

主机发送

字节数

发送的信息

备  注

从机地址

1

01

发送至地址为01的从机

功能码

1

01

读开关量输出状态

起始BIT位

2

0000

起始BIT位地址为0000

读数据长度

2

0002

读取2路继电器输出状态位

CRC码

2

BDCB

由主机计算得到CRC码

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

从机响应

字节数

返回的信息

备  注

从机地址

1

01

来自从机01

功能码

1

01

读开关量输出状态

数据长度

1

01

1个字节(8个BIT位)

DO状态数据

1

02

DO寄存器内容

CRC码

2

D049

由从机计算得到CRC码

2.3 功能码“03”:读多路寄存器输入

例如:主机要读取地址为01,起始地址为0116的3个从机寄存器数据。

从机(PDM)数据寄存器的地址和数据为:

寄存器地址

寄存器数据(16进制)

对应PDM电量

0116

1784

UA

0117

1780

UB

0118

178A

UC

主机发送的报文格式:

主机发送

字节数

发送的信息

备  注

从机地址

1

01

发送至地址为01的从机

功能码

1

03

读取寄存器

起始地址

2

0116

起始地址为0116

数据长度

3

0003

读取3个寄存器(共6个字节)

CRC码

2

E5F3

由主机计算得到CRC码

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

从机响应

字节数

返回的信息

备  注

从机地址

1

01

来自从机01

功能码

1

03

读取寄存器

读取字

1

06

3个寄存器共6个字节

寄存器数据1

2

1784

地址为0116内存的内容

寄存器数据2

2

1780

地址为0117内存的内容

寄存器数据3

2

178A

地址为0118内存的内容

CRC码

2

5847

由从机计算得到CRC码

2.4 功能码“05”:写1路开关量输出(“遥控”)

例1:开关量输出点DO1,其当前状态为“分”,主机要控制该路继电器“合”。

控制命令为:

“FF00”为控制继电器“合”;

“0000”为控制继电器“分”;

主机发送的报文格式:

主机发送

字节数

发送的信息

备  注

从机地址

1

01

发送至地址为01的从机

功能码

1

05

写开关量输出状态

输出BIT位

2

0000

对应输出继电器BIT位(DO1)

控制命令

2

FF00

控制该路继电器输出为“合”状态位

CRC码

2

8C3A

由主机计算得到CRC码

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

与主机发送的报文格式及数据内容完全相同。

例2:开关量输出点DO2,其当前状态为“合”,主机要控制该路继电器“分”。

主机发送的报文格式:

主机发送

字节数

发送的信息

备  注

从机地址

1

01

发送至地址为01的从机

功能码

1

05

写开关量输出状态

输出BIT位

2

0001

对应输出继电器BIT位(DO2)

控制命令

2

0000

控制该路继电器输出为“合”状态位

CRC码

2

9C0A

由主机计算得到CRC码

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

与主机发送的报文格式及数据内容完全相同。

2.5 功能码“06”:写单路寄存器

例如:主机要把数据07D0,保存到地址为002C的从机寄存器中去(从机地址码为01)。通讯数据保存结束后,地址为002C的PDM表原存储信息为:

地址

原来存储数据(16进制)

002C

04B0

主机发送的报文格式:

主机发送

字节数

发送的信息

举例

从机地址

1

01

发送至地址为01的从机

功能码

1

06

写单路寄存器

起始地址

2

002C

要写入的寄存器地址

写入数据

2

07D0

对应的新数据

CRC码

2

4BAF

由主机计算得到的CRC码

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

与主机发送的报文格式及数据内容完全相同。

2.6功能码“10”:写多路寄存器

主机利用这个功能码把多个数据保存到PDM表的数据存储器中去。Modbus通讯规约中的寄存器指的是16位(即2字节),并且高位在前。这样PDM的存储器都是二个字节。由于Modbus通讯规约允许每次最多保存60个寄存器,因此PDM一次也最多允许保存60个数据寄存器。

例如:主机要把0064,0010保存到地址为002C,002D的从机寄存器中去(从机地址码为01)。通讯数据保存结束后,地址为002C/002D的PDM表内存储信息为:

地址

原来存储数据(16进制)

002C

04B0

002D

1388

主机发送的报文格式:

主机发送

字节数

发送信息

举例

从机地址

1

01

发送至从机01

功能码

1

10

写多路寄存器

起始地址

2

002C

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

保存数据字长度

2

0002

保存数据的字长度(共2字)

保存数据字节长

1

04

保存数据的字节长度(共4字节)

保存数据1

2

04B0

数据地址002C

保存数据2

2

1388

数据地址002D

CRC码

2

FC63

由主机计算得到的CRC码

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

从机响应

字节数

字节数

举例

从机地址

1

01

来自从机01

功能码

1

10

写多路寄存器

起始地址

2

002C

起始地址为002C

保存数据字长度

2

0002

保存2个字长度的数据

CRC码

2

8001

由从机计算得到的CRC码

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

主机或从机可用校验码进行判别接收信息是否正确。由于电子噪声或一些其它干扰,信息在传输过程中有时会发生错误,错误校验码(CRC)可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃(无论是发送还是接收),这样增加了系统的安全和效率。

MODBUS通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。CRC码由发送设备(主机)计算,放置于发送信息帧的尾部。接收信息的设备(从机)再重新计算接收到信息的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。

在进行CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。

● CRC码的计算方法是:

1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;

2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低

8位相异或,把结果放于CRC寄存器;

3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;

4.如果移出位为0:重复第3步(再次右移一位);

如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;

5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;

6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;

7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低

字节进行交换;

8.最后得到的CRC寄存器内容即为:CRC码。

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

当PDM表检测到除了CRC码出错以外的错误时,必须向主机回送信息,功能码的最高位置为1,即从机返送给主机的功能码是在主机发送的功能码的基础上加128 。以下的这些代码表明有意外的错误发生。

PDM从主机接收到的信息如有CRC错误,则将被PDM表忽略。

PDM返送的错误码的格式如下(CRC码除外):

地址码: 1字节

功能码: 1字节(最高位为1)

错误码: 1字节

CRC码:2字节。

PDM响应回送如下错误码:

81.非法的功能码。

接收到的功能码PDM表不支持。

82.非法的数据位置。

指定的数据位置超出PDM表的范围。

83.非法的数据值。

接收到主机发送的数据值超出PDM相应地址的数据范围。

MODBUS_RTU通信协议的更多相关文章

  1. RPC框架实现 - 通信协议篇

    RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面.其对业务隐藏了底层通信过程(TCP/UDP.打包/解包.序列化/反序列化),使 ...

  2. 【分布式】Zookeeper序列化及通信协议

    一.前言 前面介绍了Zookeeper的系统模型,下面进一步学习Zookeeper的底层序列化机制,Zookeeper的客户端与服务端之间会进行一系列的网络通信来实现数据传输,Zookeeper使用J ...

  3. 通用访问 - 用“反射”来设计通用的通信协议,以及配套的SDK、工具

    1. 效果演示 2. 通信协议 功能介绍 特点 TCP协议 WebApi协议 3. SDK与工具 4. 应用示例 迷你网管 通用GIS 系统管理 5. 设计初衷与演化   1. 效果演示     服务 ...

  4. USB通信协议——深入理解

    USB通信协议——深入理解 0. 基本概念 一个[传输](控制.批量.中断.等时):由多个[事务]组成: 一个[事务](IN.OUT.SETUP):由一多个[Packet]组成. USB数据在[主机软 ...

  5. delphi 串口 关于RS485总线通信协议开发注意事项

    http://blog.csdn.net/shjhuang/article/details/9426739 关于RS485总线通信协议开发注意事项 1       前言 近段时间发现我们系统在进行设备 ...

  6. tcpdump的使用以及通信协议中常见缩写涵义(持续不定期更新)

    1. tcpdump的使用 在tcpdump输出中 Flags: [S],表示该TCP报文段包含SYN标志 [F],表示该TCP报文段包含FIN标志 seq:TCP首部32位序号值 win:接收通告窗 ...

  7. 简述移动端IM开发的那些坑:架构设计、通信协议和客户端

    1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...

  8. 多平台下Modbus通信协议库的设计(一)

    1.背景 1.1.范围 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议, 它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信. 自从 1979 年出现工业串行链路的事实标准以 ...

  9. Mysql通信协议

    Mysql四种通信协议(linux下本地连接的都是socket 其他都是tcp) 当连接mysql时,使用-h127.0.0.1时,linux与unix下的连接协议为socket协议,windows下 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:字体writingSystem、ProportionalFonts、MonospacedFonts的含义以及QFontComboBox字体组合框详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在介绍QFontComboBox之前,我们先简单介绍一下字体 ...

  2. 第8.31节 Python中使用__delattr__清除属性数据

    一. 引言 在前面几节我们介绍了__ getattribute__方法和__setattr__方法,分别实现了实例属性的查询和修改(含定义即新增),作为Python中数据操作必不可少的三剑客get.s ...

  3. 虚拟机(centos7)网络配置

    修改网络配置(ip等) VWware右上角,选择编辑---虚拟网络编辑器 可以看到子网ip是 192.168.1.0,那么我们分配ip地址就可以从此ip段开始. 再点击NAT设置 这里的网关我们稍后会 ...

  4. windows server2012无法安装.Net FrameWork 3.5功能

    问题描述: 现象1:安装完服务器系统,在安装SQL Server 2012,安装到中间提示安装SQL Server 2012过程中出现"启用windows功能NetFx3时出错"以 ...

  5. POJ_1961

    Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 19817   Accepted: 9640 Descripti ...

  6. matplotlib 绘制多个图——两种方法

    import numpy as np import matplotlib.pyplot as plt #创建自变量数bai组du x= np.linspace(0,2*np.pi,500) #创建函数 ...

  7. 华大MCU单片机之HC32F003/HC32F005 hc32f005_ddl_Rev1.9.0 Lite精简版库使用心得

    之前几个项目开发都是用的华大HC32F003_DDL_Rev1.0.2的库函数,今年刚开始入手华大,刚开始不是很了解这个芯片,看到库能用就上手了.这个版本的库编译效率很低,16K的芯片一下就写爆了.后 ...

  8. es6 数组新增方法

    1.Array.from(): 这个函数的作用是将类似数组的对象转化为数组,比如DOM对象 let arrayLike = {      "0":"TangSir&quo ...

  9. 深入解析ConcurrentHashMap:感受并发编程智慧

    如果有一个整型变量count,多个线程并发让count自增1,你会怎么设计? 你知道如何让多个线程协作完成一件事件吗? 前言 很高兴遇见你~ ConcurrentHashMap是个老生常谈的集合类了, ...

  10. Panda交易所视点观察:政府连发区块链建设文件,相关概念股受追捧

    日前,Panda交易所从北京市地方金融监督管理局获悉,证监会已同意在北京.苏州.上海.浙江.深圳等地区的区域性股权市场参与区块链建设工作.以上5市金融监管局将按照中国证监会的统一部署要求推进建设工作. ...