MODBUS串行通信协议详细说明
第一章 简介
本文详细地描述了装置在MODBUS 通讯模式下的输入和输出命令、信息和数据,以便第三方使用和开发。
1.1 串行通讯协议的目的
通信协议的作用是使信息和数据在上位机主站和装置之间有效地传递,它包括:
(1) 允许主站访问和设定所接装置的全部设置参数;
(2) 允许访问装置的所有测量数据。
第二章 装置 MODBUS串行通信协议详细说明
2.1协议基本规则
以下规则确定在RS485 或者RS232C 回路控制器和其他RS485 串行通信回路中设备的通信规则:
(1) 所有RS485 回路通信应遵照主/从方式。在这种方式下,信息和数据在单个主站和最多32 个从站监控设备之间传递;
(2) 主站将初始化和控制所有在RS485通信回路上传递的信息;
(3) 无论如何都不能从一个从站开始通信;
(4) 所有RS485环路上的通信都以“打包”方式发生,一个包裹就是一个简单的字符串(每个字符8位),一个包裹中最多可含255个字节。组成这个包裹的字节构成标准异步串行数据,并按8位数据位,1位停止位,无校验位的方式传递。串行数据流由类似于RS232C中使用的设备产生;
(5) 主站发送包裹称为请求,从站发送包裹称为响应;
(6) 任何情况只能有一个从站响应主站的请求。
2.2 传送模式
MODBUS协议可以采用ASCII或者RTU模式传送数据。本文仅仅针对RTU模式,8位数据位,无校验位,1位停止位。
2.3 MODBUS 包裹结构描述
每个MODBUS 包裹都由以下几个部分组成:
(1) 地址域
(2) 功能码域
(3) 数据域
(4) 校验域
2.3.1 地址域
MODBUS的从站地址域长度为一个字节,包含包裹传送的从站地址。有效的从站地址范围从1~247。从站如果接收到一帧从站地址域信息与自身地址相符合的包裹时,应当执行包裹中所包含的命令。从站所响应的包裹中该域为自身地址。
2.3.2 功能码域
MODBUS包裹中功能域长度为一个字节,用以通知从站应当执行何操作。从站响应包裹中应当包含主站所请求操作的相同功能域字节。有关装置用到的功能码参照下表:
功能码 |
含义 |
功能 |
0x03 |
读取寄存器 |
获得当前装置内部一个或多个当前寄存器值 |
0x05 |
设置继电器 |
将指定的继电器设置为ON或OFF |
0x10 |
设置寄存器 |
将指定数值写入装置内部一个或多个寄存器内 |
2.3.3 数据域
MODBUS 数据域长度不定,依据其具体功能而定。MODBUS数据域采用”BIG INDIAN”模式,即是高位字节在前低位字节在后。举例如下:
Example 2.1
1 个16 位寄存器包含数值为0x12AB 寄存器数值发送顺序为
高位字节= 0x12
低位字节= 0x0AB
2.3.4 校验域
MODBUS-RTU模式采用16 位CRC 校验。发送设备应当对包裹中的每一个数据都进行CRC16计算,最后结果存放入检验域中。接收设备也应当对包裹中的每一个数据(除校验域以外)进行CRC16计算,将结果域校验域进行比较。只有相同的包裹才可以被接受。具体的CRC校验算法参照附录。
2.4 网络时间考虑
在RS485 网络上传送包裹需要遵循以下有关时间的规定:
(1) 主站请求包裹结束到从站响应包裹开始之间的时间最小为20毫秒,最大为250毫秒,典型值为60毫秒;
(2) 从站响应包裹结束到主站下一请求包裹开始之间的时间典型值为100 毫秒;
(3) 包裹中相邻两个字节之间的最大时间依据通讯波特率不同而不同,一般来说最大字节时间为3倍的字节发送时间 (例如9600 波特率下,字节间隔为3毫秒;4800波特率时,字节间隔为6 毫秒 )。
2.5 异常响应
如果主站发送了一个非法的包裹给装置或者是主站请求一个无效的数据寄存器时,异常的数据响应就会产生。这个异常数据响应由从站地址、功能码、故障码和校验域组成。当功能码域的高比特位置为1时,说明此时的数据帧为异常响应。下表说明异常功能码的含义:
故障码名称 |
说 明 (field of the request packet.) |
01 非法功能码 |
表示从站接收到非法的功能码(03H,10H以外)或者是装置接收到一个错误的操作密码 |
02 非法数据地址 |
说明装置接收到无效的数据地址或者是请求寄存器不在有效的寄存器范围内;或者寄存器个数与字节数不相符合; 或者写寄存器时,寄存器范围超出 |
03 非法的数据值 |
由主机传来的参数值不在所选中的数据地址允许范围内 |
05 密码寄存器错误 |
给密码包裹寄存器写入时,密码不正确;或者未写入正确密码就去写需要密码的寄存器;或者读取密码寄存器时,未正确写入密码包 |
第三章 通讯包裹
标准的MODBUS协议仅支持16位数据模式,也就说传输任何数据最大为65535。对于更大的数据,则分成多个寄存器读写。比如,对于32位数据,则高字占一个寄存器,低字占一个寄存器。64位数据则用4个寄存器表示。
3.1设置继电器输出状态(功能码0X05)
主站指定要操作的继电器的地址,继电器的地址从0开始编址,1号继电器的地址为0。数据域的内容指定继电器的动作,0XFF00为“ON”,0X0000为“OFF”。发送其他的数据不会影响继电器的状态。
从站响应数据中,对正确设置的数据,返回请求帧。如果设置值无效,则返回错误的功能码。
例如:设置17的4号继电器为“ON”,则通讯请求和响应如下:
请求格式(主机→装置) |
响应格式(装置→主机) |
|||
从站地址 |
0x11 |
从站地址 |
0x11 |
|
功能码 |
0x05 |
功能码 |
0x05 |
|
地址高 |
0x00 |
地址高 |
0x00 |
|
地址低 |
0x03 |
地址低 |
0x03 |
|
设置数据高 |
0XFF |
设置数据高 |
0XFF |
|
设置数据低 |
0x00 |
设置数据低 |
0x00 |
|
CRC 校验码 |
-- |
CRC 校验码 |
-- |
3.2读寄存器(功能码03)
由主站机发送读寄存器的包裹请求,装置响应所有有效的寄存器(在起始寄存器和终止寄存器之间)。读寄存器不需要密码,报文格式如下:
读寄存器包裹格式(主机→装置) |
响应格式(装置→主机) |
|||
从站地址 |
1 字节 |
从站地址 |
1 字节 |
|
功能码03H |
1 字节 |
功能码03H |
1 字节 |
|
开始地址 |
2 字节 |
字节数(2*寄存器数目) |
1 字节 |
|
寄存器个数 |
2 字节 |
第一个寄存器数据 |
2 字节 |
|
CRC 校验码 |
2 字节 |
第二个寄存器数据 |
2 字节 |
|
…… |
…… |
|||
CRC校验码 |
2 字节 |
如:1.<DATA Send="1C 03 0B B9 00 06 15 84" Recv="1C 03 0C 00 01 00 00 00 40 00 00 00 00 25 80 71 10" />
2.<DATA Send="1C 03 03 85 00 03 17 EB" Recv="1C 03 06 00 00 00 00 00 00 25 B4" />
3.<DATA Send="1C 03 00 0A 00 0C 66 40" Recv="1C 03 18 55 8C 55 8C 55 8C 55 8C 7C 9C 7C 9C 7C 9C 7C 9C 9C 40 9C 40 9C 40 9C 40 DB 26" /> 等。
备注:
(1) 响应包裹中对无效的寄存器一律上传0;
(2) 读寄存器一般不需要密码,但在以下情况时,需要密码。
a) 读面板操作密码寄存器(43020)
由于MODBUS规约中没有密码域,通过以下特殊程序完成这种情况的读。
首先写包裹密码寄存器(40319),如果密码设置正确(面板操作密码或万能密码),则可以正确读寄存器,如果密码不正确,读寄存器时会返回“错误功能码”响应。
(3) 一次最多读60个寄存器。
3.3 写寄存器(功能码16)
该命令允许主站配置装置工作参数,以下为数据格式:
写寄存器包裹格式(主机→装置) |
响应格式(装置→主机) |
|||
从站地址 |
1 字节 |
从站地址 |
1 字节 |
|
功能码10H |
1 字节 |
功能码10H |
1 字节 |
|
开始地址 |
2 字节 |
开始地址 |
2 字节 |
|
寄存器个数 |
2 字节 |
寄存器个数 |
2 字节 |
|
字节个数(2*寄存器个数) |
1 字节 |
CRC校验码 |
2 字节 |
|
第一个寄存器数据 |
||||
第一个寄存器数据 |
||||
…… |
||||
CRC 校验码 |
2 字节 |
备注:
(1) 装置假定写入的寄存器从第一个寄存器开始是连续的;
(2) 写寄存器都需要密码,首先要将用户密码或万能密码写入通讯密码寄存器(43019),然后再写目标寄存器。
第四章 计算CRC-16
算法
该部分将描述计算的过程。在帧中的有关的字节被义为是一串2进制数据(0,1)。第16位校验和是这样得到的:该串数据流被216乘,然后除以发生器多项式(X16+X15+X2+1),该式以2进制表示为1100000000000101。商被忽略,16位的余数就是CRC的值,在计算CRC-16值时,全部算术运算用modulo two或者异或(X0R)算法。
按照下列步骤产生CRC-16 的校验和:
(1) 省略发生器最有意义的位并且把位的顺序颠倒过来形成一个新的多项式,结果是1010000000000001或者16进制的A001。
(2) 将全部1或者16进制FFFF装入16位寄存器。
(3) 用16 位寄存器中低阶字节对第一个数据字节进行XOR 运算,把结果存入16 位寄存器。
(4) 把16 位寄存器向右移一位。如果溢出位为1,则转向第5 步骤,否则转向第6 步骤。
(5) 用新的发生器多项式对16 位寄存器执行MOR 运算,并且把结果存入16 步骤。
(6) 重复步骤4 直到移位8 次为止。
(7) 用16 位寄存器的第阶字节对下一个数据字节进行XOR 运算,将结果存入16 位寄存器。
(8) 重复步骤4-7,直到小包的所有字节都已经用16 位寄存器执行了XOR 运算为止。
(9) 16 位寄存器的内容就是CRC-16。
unsigned int formcrc16(unsigned char * startaddress, unsigned char bytecount)
{ unsigned char i, j ;
unsigned int crc16value = 0xffff ;
unsigned int polynomial = 0xa001 ;
for ( i = 0 ; i < bytecount ; i ++ )
{ crc16value = crc16value ^ ( * ( startaddress + i ) ) ;
for ( j = 0 ; j < 8 ; j ++ )
{ if ( ( crc16value & 1 ) == 1 )
crc16value = ( crc16value >> 1 ) ^ polynomial ;
else
crc16value = crc16value >> 1 ;
}
}
return crc16value ;
}
MODBUS串行通信协议详细说明的更多相关文章
- 详解串行通信协议及其FPGA实现
前言 好久没更新博客了,这篇文章写写停停,用了近一周的时间,终于写完了.本篇文章介绍,串口协议数据帧格式.串行通信的工作方式.电平标准.编码方式及Verilog实现串口发送一个字节数据和接收一个字节数 ...
- 国标电表DLT645转MODBUS TCP协议转换器MRD-5021,工业设备,浪涌三级保护MRD
DL/T645转ModbusTcp协议转换器 MRD-5021具有1 路RS485及1路以太网接口,最多支持同时采集5个DL/T645-1997或者5个2007协议国标电表设备,支持DL/T645协议 ...
- 串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧
串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧 本例程中用51单片机作为Modbus从机,从机的设备地址为2,从机有4个寄存器, ...
- ModBus通信协议的【Modbus RTU 协议使用汇总】
1.RTU模式 当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符.这种方式的主要优点是:在同样的波特率下,可比ASCII方式传 ...
- Modbus RTU 协议使用汇总
原创地址:https://blog.csdn.net/u012166958/article/details/64920144 标准的Modbus 口是使用RS-232C 兼容串行接口,它定义了连接口的 ...
- Modbus通讯协议
<ignore_js_op> O1CN01P1wxTI1dCdw5nAeMO_!!85243700.jpg (287.43 KB, 下载次数: 0) 下载附件 保存到相册 2019-6- ...
- 调试备忘录-RS485 MODBUS RTU协议简述
目录--点击可快速直达 目录 写在前面 先简单说下什么是MODBUS? 参考文章 写在前面 最近在做和物联网有关的小项目,有一个传感器通讯用到了RS485 MODBUS RTU协议,所以就写个随笔记录 ...
- 【.NET6+Modbus】Modbus TCP协议解析、仿真环境以及基于.NET实现基础通信
前言:随着工业化的发展,目前越来越多的开发,从互联网走向传统行业.其中,工业领域也是其中之一,包括各大厂也都在陆陆续续加入工业4.0的进程当中. 工业领域,最核心的基础设施,应该是与下位硬件设备或程序 ...
- 对单片机的modbus RTU的详细解释(转载)
Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看协议资料 ...
随机推荐
- TP 真阳性 TN FP FN
TP.True Positive 真阳性:预测为正,实际也为正 FP.False Positive 假阳性:预测为正,实际为负 FN.False Negative 假阴性:预测与负.实际为正 T ...
- Delphi各种Socket组件的模式和模型
Delphi各种Socket组件的模式和模型 Delphi的大多数书籍里面都没有提到delphi的各种socket通信组件的模式和模型,有的书只讲解了windows的socket模式和模型,并没有归纳 ...
- Eclipse新建JSP文件的默认编码
默认情况下,Eclipse新建的JSP文件的编码是“ISO-8859-1”,不支持中文.需要手动修改为“UTF-8” 以下设置可使Eclipse生成的JSP文件的默认编码为“UTF-8” Window ...
- PHP字符串反转
function getRev($str,$encoding='utf-8'){ $result = ''; $len = mb_strlen($str); for($i=$len-1; $i> ...
- ios 内存管理与property copy strong weak assign
- (void)fun{ NSString* str = [[NSString alloc] initWithString:@"string"]; NSLog(@"% ...
- springMVC学习 六 跳转方式
SpringMVC的controller中的方法执行完之后,默认的跳转方式是请求转发 如果想要修改跳转方式,可以设置返回值字符串内容(1) 添加 redirect:资源路径 重定向 "red ...
- springMVC学习一 工作机制
springMVC下面的四大组件: (1)DispatcherServlet : 前端控制器,接收所有请求 ,并把请求路径和请求参数解析出来,本质是一个servlet在web.xml中配置 (如果配置 ...
- CentOS下利用mysqlbinlog恢复MySQL数据库
如果不小心对数据库进行误操作,而又没有及时备份怎么办?这恐怕是广大的coder经常遇到的一类问题.我今天就因为不小心删除了某个数据库,但最后的备份是1个礼拜前的,唯一能解决的办法就是通过mysqlbi ...
- Linux常见目录使用区别
/bin 在有的Unix和Linux系统中是/usr/bin的链接,不过UBuntu系统是两个独立的目录./bin 存放系统管理员和普通用户都要使用的程序. /sbin 存放用于系统恢复,系统启动,系 ...
- ubuntu下安装/卸载vmware虚拟机
1.下载vmware(官网下载试用版,试用版输入序列号后即为专业版,序列号网上搜,很多) 2.下载后安装(命令行) 1)cd进你下载的位置 1.1)下载的文件名字为:VMware-Workstatio ...