MODBUS_RTU通信协议
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通信协议的更多相关文章
- RPC框架实现 - 通信协议篇
RPC(Remote Procedure Call,远程过程调用)框架是分布式服务的基石,实现RPC框架需要考虑方方面面.其对业务隐藏了底层通信过程(TCP/UDP.打包/解包.序列化/反序列化),使 ...
- 【分布式】Zookeeper序列化及通信协议
一.前言 前面介绍了Zookeeper的系统模型,下面进一步学习Zookeeper的底层序列化机制,Zookeeper的客户端与服务端之间会进行一系列的网络通信来实现数据传输,Zookeeper使用J ...
- 通用访问 - 用“反射”来设计通用的通信协议,以及配套的SDK、工具
1. 效果演示 2. 通信协议 功能介绍 特点 TCP协议 WebApi协议 3. SDK与工具 4. 应用示例 迷你网管 通用GIS 系统管理 5. 设计初衷与演化 1. 效果演示 服务 ...
- USB通信协议——深入理解
USB通信协议——深入理解 0. 基本概念 一个[传输](控制.批量.中断.等时):由多个[事务]组成: 一个[事务](IN.OUT.SETUP):由一多个[Packet]组成. USB数据在[主机软 ...
- delphi 串口 关于RS485总线通信协议开发注意事项
http://blog.csdn.net/shjhuang/article/details/9426739 关于RS485总线通信协议开发注意事项 1 前言 近段时间发现我们系统在进行设备 ...
- tcpdump的使用以及通信协议中常见缩写涵义(持续不定期更新)
1. tcpdump的使用 在tcpdump输出中 Flags: [S],表示该TCP报文段包含SYN标志 [F],表示该TCP报文段包含FIN标志 seq:TCP首部32位序号值 win:接收通告窗 ...
- 简述移动端IM开发的那些坑:架构设计、通信协议和客户端
1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...
- 多平台下Modbus通信协议库的设计(一)
1.背景 1.1.范围 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议, 它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信. 自从 1979 年出现工业串行链路的事实标准以 ...
- Mysql通信协议
Mysql四种通信协议(linux下本地连接的都是socket 其他都是tcp) 当连接mysql时,使用-h127.0.0.1时,linux与unix下的连接协议为socket协议,windows下 ...
随机推荐
- espcms代码审计第一弹
以前的代码审计都是在CTF比赛题里面进行对于某一段代码的审计,对于后端php整体代码和后端整体架构了解的却很少,所以有空我都会学习php的代码审计,以提高自己 环境就直接用的是phpstudy,学习的 ...
- bugkuctf web区 多次
首先看到以下url : 发现这是一个基于布尔类型的盲注. true: false: 根据这两种类型可以进行注入.废话不多说,直接进行尝试. 构造 url = index.php?id=1' or 1= ...
- 你必须掌握的关于JVM知识点
对本文所持态度 抓住主要矛盾,抓住重点学习,然后从这些点展开学. 不管是面试别人,还是参加面试.都可以有收获. JDK体系结构与JVM架构解析 jdk jre javac jvm Java是怎么实现跨 ...
- js 面试题正则相关
正则相关[i不区分大小写,g匹配全部数据] var str = "Hello word! I think word is good."; 1.替换str中的word为javascr ...
- 原生js之事件解绑
#removeEventListener ##html <button id='btn'>click</button> ##js ###第一种方式(错误方式) var btn ...
- 介质访问控制子层-Medium Access Control Sublayer:多路访问协议、以太网、无线局域网
第四章 介质访问控制子层-Medium Access Control Sub-layer 4.1介质访问控制子层概述 MAC子层不属于之前提到的OSI或TCP/IP架构的任何一层,这也是为什么这一层被 ...
- Node第三方模块nodemon和nrm
1.第三方模块nodemon nodemon是一个命令行工具,用以辅助项目开发. 在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐,这时,nodemon就可以来解决这个问题. ...
- 【UV统计】海量数据统计的前世今生
转载请注明出处 背景 在互联网公司中,每个项目都需要数据统计.分析,便于项目组利用详细数据研究项目的整体情况,进行下一步的调整.在数据统计中,UV统计是最常见的,也是最普遍的.有的场景要求实时性很高, ...
- apt-get could not get lock /var/lib/dpkg/lock报错
用apt-get命令安装一些软件包时,报这个错 could not get lock /var/lib/dpkg/lock 出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁不可用.而导致资 ...
- BloomFilter中保存的数据量
结果 /** * @author WeiJiQian * BF_CARDINAL_THRESHOLD BF_FALSE_POSITIVE_RATE 保存的数据量 * 100,0000 0.01 391 ...