Modbus通讯规约.docx
《Modbus通讯规约.docx》由会员分享,可在线阅读,更多相关《Modbus通讯规约.docx(18页珍藏版)》请在冰豆网上搜索。
Modbus通讯规约
MODBUS通讯规约V2.0
1.通讯参数和传输特性
传输方式:
异步串行通信方式。
MODBUS规约模式:
RTU模式。
传输速率:
2400bps,4800bps,9600bps,19200bps。
串行口通讯数据格式:
1个起始位,8个数据位,无校验位,1个停止位。
最大传输距离:
1200米。
通讯介质:
推荐采用0.5mm的双绞线,不带屏蔽层。
(原因是如果使用屏蔽双绞线,但现场接地处理不好反而影响通讯质量)。
网络连接主站数目:
1个。
网络连接从站数目:
最多31个。
应答时间:
小于4.5个byte传输时间(帧间隔最小时间)+10ms。
2.网络连接
RS-485网络的匹配电阻选取:
双绞线网络两端的匹配电阻选取,以现场通信正常为准,一般地1.2km时取120Ω,600m时取220Ω,300m时取330Ω,如通信误码率较大,观察通信时的波形,匹配电阻做适当改变:
末端匹配电阻合适末端匹配电阻偏小末端匹配电阻偏大
3.通信参数选择
通信站号:
在通讯参数中修改装置地址,范围1~99,禁止使用0作为装置地址,地址0作为广播地址使用。
通信波特率:
通讯参数中修改装置485口,修改通信波特率:
选择范围:
2400bps,4800bps,9600bps,19200bps。
4.MODBUS协议通用格式
4.1支持的MODBUS功能码
功能码02H:
读取开关量输入(读实遥信和虚遥信)。
功能码03H:
读取保持寄存器(读事件记录等)
功能码04H:
读取输入寄存器(读远动遥测)
功能码05H:
强制单点继电器输出(远方复归、单步的遥控跳闸、遥控合闸)。
功能码06H:
向保持寄存器写单个字(遥控跳闸、遥控合闸的选择和执行操作)
功能码10H:
向保持寄存器(内存区)写多个16位的字(通讯对时)。
4.2异常响应报文格式
由于软件编程错误,对协议理解错误或通讯干扰等原因,MODBUS通信子站接收到主站的报文后,可以采用异常响应报文给予回答,异常响应报文格式举例如下:
异常响应报文子站=>主站
报文
内容含义
备注
1字节
MODBUS地址
01H举例
1字节
功能码
85H
1字节
异常代码
02H
1字节
CRC高字节
C3H
1字节
CRC低字节
51H
FC05H主站=>子站:
远方复归
报文
内容含义
备注
1字节
MODBUS地址
01H举例
1字节
功能码
05H
1字节
线圈地址高字节
01H
1字节
线圈地址低字节
07H
1字节
强制线圈数值高字节
FFH
1字节
强制线圈数值低字节
00H
1字节
CRC高字节
3CH
1字节
CRC低字节
07H
子站通过校验,发现主站报文有问题,将响应报文将主站的功能码最高位(D7)置1,如例子中的85H,异常响应报文中有固定的一个字节作为“异常代码”,表示异常原因。
异常代码
含义
01
非法功能码。
子站无法处理主站报文中的功能码。
02
非法数据地址。
子站无法处理主站报文中的数据地址。
03
非法数据内容。
主站报文中的数据不能满足子站的要求格式。
04
子站设备错误。
当子站试图执行主站报文,会产生无法恢复的设备错误。
05
确认帧。
子站接改到主站报文并执行,但由于执行时间比较长,采用本报文通知主站,防止产生主站接收报文超时错误。
06
子站忙。
4.3时间格式
本规约中使用到的对时报文的时间格式,事件记录中的时间格式,参见下面说明。
七个八位位组的二进制时间
27毫秒20
215毫秒28
IV
(RES1)0
25分20
0(SU)
(RES2)00
24时20
22星期20
24日20
(RES3)0000
23月20
(RES4)0
26年20
4.4MODBUS规约中CRC码的计算
采用RTU通讯方式的MODBUS规约,要将报文中除CRC码外的所有字节进行CRC码校验,校验程序如下:
staticunsignedcharauchCRCHi[]={/*TableofCRCvaluesforhigh-orderbyte*/
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40
};
staticunsignedcharauchCRCLo[]={/*TableofCRCvaluesforlow-orderbyte*/
0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,
0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,
0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,
0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,
0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,
0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,
0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,
0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,
0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,
0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,
0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,
0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,
0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,
0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,
0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,
0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,
0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,
0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,
0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,
0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,
0x43,0x83,0x41,0x81,0x80,0x40};
unsignedshortModbus_CRC16(unsignedchar*puchMsg,unsignedshortusDataLen)
{unsignedcharuchCRCHi=0xFF;/*highCRCbyteinitialized*/
unsignedcharuchCRCLo=0xFF;/*lowCRCbyteinitialized*/
unsignedshortuIndex;/*willindexintoCRClookup*/
while(usDataLen--)/*passthroughmessagebuffer*/
{
uIndex=uchCRCHi^*puchMsg++;/*calculatetheCRC*/
uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
uchCRCLo=auchCRCLo[uIndex];
}
return(uchCRCHi<<8|uchCRCLo);
}
5报文格式详解
以下报文以MMP-5000D为例说明,相应通讯信息点表见MMP-5000D测点表。
报文中的字节都是以16进制的方式显示。
5.1读全遥信
主站发送:
从机地址
功能码
开始地址H
开始地址L
遥信点数H
遥信点数L
CRC码H
CRC码L
01
02
00
00
00
20
79
D2
子站响应
地址
功能码
字节数
遥信数值(LSB-MSB)
CRC码H
CRC码L
01
02
04
01
本字节的LSB对应遥信点号1
02
00
00
本字节的MSB对应遥信点号32
5B
DE
注意:
1)MMP-5000D供有32个遥信(实遥信和虚遥信),因此主站从开始地址0读0x20个遥信点。
2)本例应答报文中:
数值01的D0位为1代表MMP-5000D的“远方控制”为1;数值02中的D1位为1代表MMP-5000D的跳位信号为1。
3)子站响应中的LSB,MSB指D0位和D7位,通讯点号依次采用升序的方式,比如第一个字节的D0位为遥信点号1…它的D7位为遥信点号8;第二个节字的D0位就为遥信点号9,它的D7位为遥信点号16,依次类推。
5.2读全遥测(远动遥测)
主站发送:
从机地址
功能码
开始地址H
开始地址L
遥测点数H
遥测点数L
CRC码H
CRC码L
01
04
00
00
00
0F
B0
0E
子站响应
地址
功能码
字节数
设备状态字
HL
第一个遥测值
HL
第N个遥测值
CRC码H
CRC码L
01
04
1E
00
01
6A
A0
…
B6
1B
“设备状态字”的D0为1,表示请求读全遥信
MMP-5000D的“频率”遥测值
注意:
1)遥测报文第一个测点为“设备状态字”,不用入库,第二个开始才是“频率”,以后依次后推。
2)远动遥测值的数据格式采用带品质描述的被测值(MEA)定义
BIT0=溢出位(OV)
BIT1=差错位(ER)
BIT2=测试位(TEST),该位置1表示本遥测量为综自功能
BIT15~BIT3=被测值(MVAL),范围-4096~4095
3)“设备状态字”占用两个字节,它的低字节的D0位为1表示有实遥信和虚遥信变位,要求主站使用“读全遥信”报文来读取,一旦执行了“读全遥信”,则“设备状态字的D0位变为0;“设备状态字”的D1位为1:
表示保护装置有事件记录,要求主站使用连续执行“读单个事件记录”来读取事件记录,子站没有新的事件记录时,D1位自动变为0。
通讯管理机可以根据需要选择是否使用“设备状态字”。
4)如果不需要使用“设备状态字”,可以将报文中的开始地址设为0x0001,则第一个读到的遥测值就是“频率”。
5)遥测值计算方法:
◆电压4095对应1.2倍的额定值1.2*100=120V
◆电流4095对应1.2倍的额定值1.2*5=6A
◆功率4095对应1.2倍的额定值(1.2*57.77*1.2*5)*3=1248W
◆频率4095对应1.2倍的额定值1.2*50=60Hz
◆功率因素4095对应1倍的额定值1.000
本例中:
6AA0为第一个遥测值(频率),它被放大8倍,满量程值为4095,对应60Hz(50Hz的1.2倍)。
因此频率如下计算:
0x6AA0/8/4095*60.0Hz=49.993Hz
例:
========MMP-5000D读全遥测========
TX:
01040000000FB00E
RX:
01041E00016AA000000000000036C04058000000000000000000000000000005C0B61B
5.3读电度值
主站发送:
从机地址
功能码
电度对象起始地址H
电度对象起始地址L
电度对象数目H
电度对象数目L
CRC码H
CRC码L
01
03
00
00
00
01
85
B2
子站响应:
地址
功能码
字节数
正向有功电度
LSBMSB
反向有功电度
LSBMSB
正向无功电度
LSBMSB
反向无功电度
LSBMSB
01
03
10
E8
03
00
00
D0
07
00
00
B8
0B
00
00
A0
0F
00
00
正向有功电度值为:
0x000003E8(1000W/1kW)
反向有功电度
0x000007D0(2000W/2kW)
正向无功电度
0x00000BB8(3000Var/3kVar)
反向无功电度
0x00000FA0(4000Var/4kvar)
CRC码H
CRC码L
B6
1B
注意:
1)每个电度值由4个字节组成一个32位字,它的单位是W(瓦特)或Var(乏)
2)报文中先收到的是电度的低位字节,后收到的是高位字节。
例:
========MMP-5000D读电度值========
TX:
01030200000185B2
RX:
010310E8030000D0070000B80B0000A00F000093CD
5.4广播对时
主站发送:
从机地址
功能码
开始地址H
开始地址L
寄存器数H
寄存器数L
字节总数
毫秒L
毫秒H
00
10
04
80
00
04
08
98
B7
分钟
小时
日
月份
年份
保留
CRC码H
CRC码L
16
12
17
01
07
00
87
78
说明:
1)对时时间为07年1月23日18时22分47秒000毫秒
2)广播对时的从机地址设为00
5.5广播信号复归
方式一:
采用功能码05H向单个线圈264写ON信号(0xFF00),产生远方信号复归功能。
主站发送:
从机地址
功能码
线圈地址H
线圈地址L
强制线圈数值H
强制线圈数值L
CRC码H
CRC码L
00
05
01
07
FF
00
3D
D6
方式二:
采用功能码06H向单个保持寄存器0x0000写数值0x0000,产生远方复归功能。
主站发送:
从机地址
功能码
寄存器地址H
寄存器地址L
设置数值H
设置数值L
CRC码H
CRC码L
00
06
00
00
00
00
89
CA
说明:
1)如果需要点对点复归,只要将从机地址从广播地址00改为相应设备地址即可。
2)两种方式通讯管理机可以任意选择。
5.6遥控跳闸的选择命令
采用功能码06H向单个保持寄存器0x0101写数值0xFFFF,产生遥控跳闸的选择功能。
主站发送:
从机地址
功能码
寄存器地址H
寄存器地址L
寄存器数值H
寄存器数据L
CRC码H
CRC码L
01
06
01
01
FF
FF
D8
46
子站响应:
子站地址
功能码
寄存器地址H
寄存器地址L
寄存器数值H
寄存器数据L
CRC码H
CRC码L
01
06
01
01
FF
FF
D8
46
5.7遥控跳闸的执行命令
采用功能码06H向单个保持寄存器0x0011写数值0xFFFF,产生遥控跳闸的执行。
主站发送:
从机地址
功能码
寄存器地址H
寄存器地址L
寄存器数值H
寄存器数据L
CRC码H
CRC码L
01
06
00
11
FF
FF
D8
7F
子站响应:
子站地址
功能码
寄存器地址H
寄存器地址L
寄存器数值H
寄存器数据L
CRC码H
CRC码L
01
06
00
11
FF
FF
D8
7F
5.8遥控合闸的选择命令
采用功能码06H向单个保持寄存器0x0100写数值0xFFFF,产生遥控合闸的选择功能。
主站发送:
从机地址
功能码
寄存器地址H
寄存器地址L
寄存器数值H
寄存器数据L
CRC码H
CRC码L
01
06
01
00
FF
FF
89
86
子站响应:
子站地址
功能码
寄存器地址H
寄存器地址L
寄存器数值H
寄存器数据L
CRC码H
CRC码L
01
06
01
00
FF
FF
89
86
5.9遥控合闸的执行命令
采用功能码06H向单个保持寄存器0x0010写数值0xFFFF,产生遥控合闸的执行。
主站发送:
从机地址
功能码
寄存器地址H
寄存器地址L
寄存器数值H
寄存器数值L
CRC码H
CRC码L
01
06
00
10
FF
FF
89
BF
子站响应:
子站地址
功能码
寄存器地址H
寄存器地址L
寄存器数值H
寄存器数据L
CRC码H
CRC码L
01
06
00
10
FF
FF
89
BF
5.10单报文直接遥控跳闸
采用功能码05H向线圈0x0001写数值0xFF00,产生单报文直接遥控跳闸。
慎用本命令!
主站发送:
从机地址