[转]MODBUS_RTU通讯规约 [http://blog.csdn.net/kw123/archive/2007/09/07/1776750.aspx]

转载 2007年09月14日 14:02:00
MODBUS通讯协议
ModBus通讯规约允许PDM系列仪表/变送器与施耐德、西门子、AB、GE等多个国际著名品牌的可编程顺序控制器(PLC)、RTU、SCADA系统、DCS或与第三方具有ModBus兼容的监控系统之间进行信息交换和数据传送。
PDM系列仪表/变送器只要简单地增加一套基于计算机(或工控机)的监控软件(如:组态王、Intouch、FIX、synall等)就可以构成一套电力监控系统。
广泛的系统集成:
    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码。数据区的数据都是两个字节,并且高位在前(电能量除外)。
 
注:1PDM-820AC/ACM/ACRPDM-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状态为“1DI3状态为“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输出状态为“1DO1输出状态为“0
 
主机发送的报文格式:
 
主机发送
字节数
发送的信息
备 注
从机地址
1
01   
发送至地址为01的从机
功能码
1
01   
读开关量输出状态
起始BIT位
2
0000 
起始BIT位地址为0000
读数据长度
2
0002 
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 Slave/Client开发历程(Rtu/AscII/Tcp) [http://blog.csdn.net/yefanqiu/archive/2007/07/19/169848

其实很早就想写写关于Modbus的开发历程,但牵扯项目较多,不同语言版本较多,头绪繁杂,一时不知从何写起。最近的医疗项目的通信部分,重新调整为Modbus协议,并且内容几乎涵盖了Modbus的方方面面...

深入分析rails数据库连接流程 (转http://blog.csdn.net/pwlazy/archive/2007/11/16/1889264.aspx)

  第一部分:Method 1)def self.establish_connection(spec = nil)     case spec                             ...
  • fjfdszj
  • fjfdszj
  • 2011年06月08日 11:45
  • 773

postgresql运维命令简记 转自:http://blog.csdn.net/hitzhang/archive/2010/09/16/5888028.aspx

转自: hitzhang的博客1 安装:./configuregmakesugmake installadduser postgresmkdir /usr/local/pgsql/datachown ...
  • jubincn
  • jubincn
  • 2011年03月11日 21:48
  • 934

mysql c api 列表(转贴自http://blog.csdn.net/loveu131/archive/2006/07/26/982629.aspx)

为了方便以后不再找mysql 的API,于是转了CSDN站内ID为loveu131的贴子。FunctionDescriptionmysql_affected_rows()Returns the num...

http://blog.csdn.net/sunjd2001/archive/2007/05/15/1609263.aspx

http://blog.csdn.net/sunjd2001/archive/2007/05/15/1609263.aspx

http://blog.csdn.net/whpeace/archive/2007/05/23/1622510.aspx

COM 组件设计与应用(十)——IDispatch 接口 for VC.NET一、前言    终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用、非常...
  • fenving
  • fenving
  • 2011年04月15日 17:36
  • 353

java的内存泄露(转自:http://blog.csdn.net/elimago/archive/2007/12/18/1946380.aspx)

Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即...

http://blog.csdn.net/ztz0223/archive/2007/05/28/1628669.aspx

我一下讨论的都是在不用return把值进行返回的情况, 也就是说用指针的情况。 很简单就是指针和引用,引用在新版本的c里面也有包含,可以使用。 系统xp+ide用的 vc6.0: 要把一个值通过...

【Android内核】下载编译android kernel( 原文地址 http://blog.csdn.net/chizhaolin/archive/2010/07/08/5721539.aspx)

编译linux内核映像 a)准备交叉编译工具链 android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。 注意:虽然Prebuilt下包含了交叉编译工具,但是...
  • liuxiIT
  • liuxiIT
  • 2011年10月20日 10:12
  • 1299
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转]MODBUS_RTU通讯规约 [http://blog.csdn.net/kw123/archive/2007/09/07/1776750.aspx]
举报原因:
原因补充:

(最多只允许输入30个字)