MODBUS串行通信协议
(2011-05-06 12:16:38)
标签:
modbus协议串行通讯杂谈 |
分类: BA、工业控制类 |
第一章
本文详细地描述了装置在MODBUS 通讯模式下的输入和输出命令、信息和数据,以便第三方使用和开发。
1.1 串行通讯协议的目的
通信协议的作用是使信息和数据在上位机主站和装置之间有效地传递,它包括:
(1)
(2) 允许访问装置的所有测量数据。
第二章 装置 MODBUS串行通信协议详细说明
2.1协议基本规则
以下规则确定在RS485 或者RS232C 回路控制器和其他RS485 串行通信回路中设备的通信规则:
(1)
(2)
(3)
(4)
(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)
(2)
(3)
2.5 异常响应
如果主站发送了一个非法的包裹给装置或者是主站请求一个无效的数据寄存器时,异常的数据响应就会产生。这个异常数据响应由从站地址、功能码、故障码和校验域组成。当功能码域的高比特位置为1时,说明此时的数据帧为异常响应。下表说明异常功能码的含义:
|
功能码名称 |
说 明 (field of the request packet.) |
|
01 非法功能码 |
表示从站接收到非法的功能码(03H,10H以外)或者是装置接收到一个错误的操作密码 |
|
02 非法数据地址 |
说明装置接收到无效的数据地址或者是请求寄存器不在有效的寄存器范围内;或者寄存器个数与字节数不相符合; 或者写寄存器时,寄存器范围超出 |
|
03 非法的数据值 |
由主机传来的参数值不在所选中的数据地址允许范围内 |
|
04 遥控继电器错误 |
遥控继电器时,当时装置不满足遥控继电器的条件 |
|
05 密码寄存器错误 |
给密码包裹寄存器写入时,密码不正确;或者未写入正确密码就去写需要密码的寄存器;或者读取密码寄存器时,未正确写入密码包 |
2.6 广播命令
装置 MODBUS 协议支持广播命令,地址域为 00H 时认为是广播命令,只在10H功能码时有效。广播命令时,装置 只接收包裹,不返回响应包裹,这是为了防止网络内的装置同时响应堵塞网络。广播命令主要用于广播对时及为一批装置统一进行参数设置等。
目前,广播命令只响应0x10功能码。不支持0x03和0x05功能码。
第三章
通讯包裹
标准的MODBUS协议仅支持16位数据模式,也就说传输任何数据最大为65535。对于更大的数据,则分成多个寄存器读写。比如,对于32位数据,则高字占一个寄存器,低字占一个寄存器。64位数据则用4个寄存器表示。
3.1 设置继电器输出状态(功能码0X05)
主站指定要操作的继电器的地址,继电器的地址从0开始编址,1号继电器的地址为0。数据域的内容指定继电器的动作,0XFF00为“ON”,0X0000为“OFF”。发送其他的数据不会影响继电器的状态。
|
请求格式(主机→装置) |
|
响应格式(装置→主机) |
||
|
从站地址 |
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)
(2)
a)
由于MODBUS规约中没有密码域,通过以下特殊程序完成这种情况的读。
首先写包裹密码寄存器(40319),如果密码设置正确(面板操作密码或万能密码),则可以正确读寄存器,如果密码不正确,读寄存器时会返回“错误功能码”响应。
(3) 一次最多读120个寄存器。
3.3 写寄存器(功能码16)
该命令允许主站配置装置工作参数,以下为数据格式:
|
写寄存器包裹格式(主机→装置) |
|
响应格式(装置→主机) |
||
|
从站地址 |
1 字节 |
|
从站地址 |
1 字节 |
|
功能码10H |
1 字节 |
|
功能码10H |
1 字节 |
|
开始地址 |
2 字节 |
|
开始地址 |
2 字节 |
|
寄存器个数 |
2 字节 |
|
寄存器个数 |
2 字节 |
|
字节个数(2*寄存器个数) |
1 字节 |
|
CRC校验码 |
2 字节 |
|
第一个寄存器数据 |
|
|
|
|
|
第一个寄存器数据 |
|
|
|
|
|
…… |
|
|
|
|
|
CRC 校验码 |
2 字节 |
|
|
|
备注:
(1)
(2)
第四章 计算CRC-16
算法
该部分将描述计算的过程。在帧中的有关的字节被义为是一串2进制数据(0,1)。第16位校验和是这样得到的:该串数据流被216乘,然后除以发生器多项式(X16+X15+X2+1),该式以2进制表示为1100000000000101。商被忽略,16位的余数就是CRC的值,在计算CRC-16值时,全部算术运算用modulo two或者异或(X0R)算法。
按照下列步骤产生CRC-16 的校验和:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
unsigned int formcrc16(unsigned char * startaddress, unsigned char bytecount)
{
}
第五章
装置寄存器说明
所有的装置寄存器(包括实时寄存器和设置寄存器),在MODBUS通讯协议时都具有4XXXX 的基址。根据MODBUS协议,请求装置中一个地址为4XXXX的寄存器时,主站实际读取为XXXX-1。例如请求装置中40011寄存器,主站实际读取寄存器号为10。

加载中…