Modbus通讯规约

2019-01-07 14:24

MODBUS通讯规约

MODBUS通讯规约 V2.0

1. 通讯参数和传输特性

传输方式:异步串行通信方式。 MODBUS规约模式: RTU模式。

传输速率:2400 bps,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位的字(通讯对时)。

1

MODBUS通讯规约

4.2 异常响应报文格式

由于软件编程错误,对协议理解错误或通讯干扰等原因,MODBUS通信子站接收到主站的报文后,可以采用异常响应报文给予回答,异常响应报文格式举例如下:

主站=>子站:远方复归 FC 05H 异常响应报文 子站=>主站 报文 内容含义 备注 报文 内容含义 备注 MODBUS地址 1字节01H 举例 1字节 MODBUS地址 01H 举例 1字节 功能码 05H 1字节 功能码 85H 1字节01H 1字节 02H 线圈地址高字节 异常代码 1字节 线圈地址低字节 07H 1字节 CRC高字节 C3H 1字节 强制线圈数值高字节 FFH 1字节 CRC低字节 51H 强制线圈数值低字节 1字节00H 1字节 CRC高字节 3CH CRC低字节 1字节07H 子站通过校验,发现主站报文有问题,将响应报文将主站的功能码最高位(D7)置1,如例子中的85H,异常响应报文中有固定的一个字节作为“异常代码”,表示异常原因。 异常代码 01 02 03 04 05 06

含义 非法功能码。子站无法处理主站报文中的功能码。 非法数据地址。子站无法处理主站报文中的数据地址。 非法数据内容。主站报文中的数据不能满足子站的要求格式。 子站设备错误。当子站试图执行主站报文,会产生无法恢复的设备错误。 确认帧。 子站接改到主站报文并执行,但由于执行时间比较长,采用本报文通知主站,防止产生主站接收报文超时错误。 子站忙。 4.3 时间格式

本规约中使用到的对时报文的时间格式,事件记录中的时间格式,参见下面说明。

七个八位位组的二进制时间 27 毫秒 20 215 毫秒 28 IV 0(SU) (RES1)0 (RES2) 0 0 25 分 20 24 时 20 24 日 20 23 月 20 22 星期 20 (RES3) 0 0 0 0 (RES4) 0 26 年 20 2

MODBUS通讯规约

4.4 MODBUS规约中CRC码的计算

采用RTU通讯方式的MODBUS规约,要将报文中除CRC码外的所有字节进行CRC码校验,校验程序如下:

static unsigned char auchCRCHi[] = { /* Table of CRC values for high-order byte */ 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 };

static unsigned char auchCRCLo[] = { /* Table of CRC values for low-order byte */ 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 };

unsigned short Modbus_CRC16(unsigned char *puchMsg, unsigned short usDataLen) { unsigned char uchCRCHi = 0xFF ; /* high CRC byte initialized */ unsigned char uchCRCLo = 0xFF ; /* low CRC byte initialized */ unsigned short uIndex ; /* will index into CRC lookup*/ while (usDataLen--) /* pass through message buffer */ {

uIndex = uchCRCHi ^ *puchMsg++ ; /* calculate the CRC */ uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; uchCRCLo = auchCRCLo[uIndex] ; }

return (uchCRCHi << 8 | uchCRCLo) ; }

3

MODBUS通讯规约

5 报文格式详解

以下报文以MMP-5000D为例说明,相应通讯信息点表见MMP-5000D测点表。 报文中的字节都是以16进制的方式显示。

5.1 读全遥信

主站发送: 从机地址 功能码 开始地址H 01 02 00 开始地址L 00 遥信点数H 00 遥信点数L 20 79 D2 CRC码 H CRC码 L 子站响应 地址 01 功能码 02 字节数 04 01 本字节的LSB对应遥信点号1 遥信数值(LSB-MSB) 02 00 00 本字节的MSB对应遥信点号32 CRC码 H 5B CRC码 L 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 01 04 00 开始地址L 00 遥测点数H 00 遥测点数L 0F B0 0E CRC码 H CRC码 L 子站响应

地址 功能码 字节数 设备状态字 H L 01 04 1E 00 01 第一个遥测值 H L 6A A0 第N个遥测值 ? B6 1B CRC码 H CRC码 L “设备状态字”的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:表示保护装置有事件记录,要求主站使用连续执行“读单个事件记录”来读取事件记录,子站没有新的事件记录时,

4

MODBUS通讯规约

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:01 04 00 00 00 0F B0 0E

RX: 01 04 1E 00 01 6A A0 00 00 00 00 00 00 36 C0 40 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 C0 B6 1B

5.3 读电度值

主站发送: 从机地址 功能码 电度对象起始地址H 01 03 00 电度对象起始地址L 00 00 01 85 B2 电度对象数目H 电度对象数目L CRC码 H CRC码 L 子站响应: 地功字节正向有功电度 LSB MSB 反向有功电度 LSB MSB 正向无功电度 LSB MSB 反向无功电度 LSB MSB 址 能码 数 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 B6 CRC码 L 1B 注意:

1) 每个电度值由4个字节组成一个32位字,它的单位是W(瓦特)或Var(乏) 2) 报文中先收到的是电度的低位字节,后收到的是高位字节。 例:========MMP-5000D读电度值======== TX:01 03 02 00 00 01 85 B2

RX:01 03 10 E8 03 00 00 D0 07 00 00 B8 0B 00 00 A0 0F 00 00 93 CD

5.4 广播对时

主站发送: 从机地址 功能码 开始地址H 开始地址L 00

10 04 80 寄存器数H 00 5

寄存器数L 04 08 98 B7 字节总数 毫秒L 毫秒H


Modbus通讯规约.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:创建平安全文明校园,优化学校育人环境

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: