加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MODBUS串行通信协议

(2011-05-06 12:16:38)
标签:

modbus

协议

串行通讯

杂谈

分类: BA、工业控制类

第一章  简介

本文详细地描述了装置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

设置继电器

将指定的继电器设置为ONOFF

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)              从站响应包裹结束到主站下一请求包裹开始之间的时间在16位模式下典型值为100 毫秒,在32位模式下典型值为500 毫秒;

(3)              包裹中相邻两个字节之间的最大时间依据通讯波特率不同而不同,一般来说最大字节时间为3倍的字节发送时间 (例如9600 波特率下,字节间隔为3毫秒;4800波特率时,字节间隔为6 毫秒 )

2.5 异常响应

如果主站发送了一个非法的包裹给装置或者是主站请求一个无效的数据寄存器时,异常的数据响应就会产生。这个异常数据响应由从站地址、功能码、故障码和校验域组成。当功能码域的高比特位置为1时,说明此时的数据帧为异常响应。下表说明异常功能码的含义:

功能码名称

说 明 (field of the request packet.)

01 非法功能码

表示从站接收到非法的功能码(03H,10H以外)或者是装置接收到一个错误的操作密码

02 非法数据地址

说明装置接收到无效的数据地址或者是请求寄存器不在有效的寄存器范围内;或者寄存器个数与字节数不相符合; 或者写寄存器时,寄存器范围超出

03 非法的数据值

由主机传来的参数值不在所选中的数据地址允许范围内

04 遥控继电器错误

遥控继电器时,当时装置不满足遥控继电器的条件

05 密码寄存器错误

给密码包裹寄存器写入时,密码不正确;或者未写入正确密码就去写需要密码的寄存器;或者读取密码寄存器时,未正确写入密码包

 

2.6 广播命令

装置 MODBUS 协议支持广播命令,地址域为 00H 时认为是广播命令,只在10H功能码时有效。广播命令时,装置 只接收包裹,不返回响应包裹,这是为了防止网络内的装置同时响应堵塞网络。广播命令主要用于广播对时及为一批装置统一进行参数设置等。

目前,广播命令只响应0x10功能码。不支持0x030x05功能码。 

第三章  通讯包裹

标准的MODBUS协议仅支持16位数据模式,也就说传输任何数据最大为65535。对于更大的数据,则分成多个寄存器读写。比如,对于32位数据,则高字占一个寄存器,低字占一个寄存器。64位数据则用4个寄存器表示。

3.1 设置继电器输出状态(功能码0X05

主站指定要操作的继电器的地址,继电器的地址从0开始编址,1号继电器的地址为0。数据域的内容指定继电器的动作,0XFF00为“ON”,0X0000为“OFF”。发送其他的数据不会影响继电器的状态。

       从站响应数据中,对正确设置的数据,返回请求帧。如果设置值无效,则返回错误的功能码。

       例如:设置174号继电器为“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)    响应包裹中对无效的寄存器一律上传0

(2)    读寄存器一般不需要密码,但在以下情况时,需要密码。

a)      读面板操作密码寄存器(43020

由于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)    写寄存器都需要密码(除校时用的时间寄存器外),首先要将用户密码或万能密码写入通讯密码寄存器(43019),然后再写目标寄存器。 

第四章  计算CRC-16

算法

该部分将描述计算的过程。在帧中的有关的字节被义为是一串2进制数据(01)。第16位校验和是这样得到的:该串数据流被216乘,然后除以发生器多项式(X16X15X21),该式以2进制表示为1100000000000101。商被忽略,16位的余数就是CRC的值,在计算CRC16值时,全部算术运算用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通讯协议时都具有4XXXX 的基址。根据MODBUS协议,请求装置中一个地址为4XXXX的寄存器时,主站实际读取为XXXX-1例如请求装置40011寄存器,主站实际读取寄存器号为10

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有