定时、测频类产品通用MODBUS-RTU通讯协议
通信协议
计数、
定时、测频类产品通用MODBUS-RTU通讯协议
一、MODBUS-RTU通讯格式
1、基本规则
1.1、同一网络中只允许存在一台主机。
1.2、所有RS485通讯回路都应遵照主/从方式进行通讯。
1.3、任何一次通讯都不能是由从机发起的。
1.4、在RS485总线上,所有通讯都是以“信息帧”方式传递。 “信息帧”就是由若干“数据帧”构成的字符串,是由信息头和发送的编码数据构成标准的异步串行数据,
1.5、如果主机和从机接收到含有未知命令的信息帧,则不予回应。
2、传输方式
通讯是以字节(数据帧)为单位,采用异步方式进行传输。 3、“数据帧”格式
每一个“数据帧”都包含有一个起始位、8个数据位、奇偶或无校验位、一个停止位,共10位数据。
二、主机命令格式与从机返回消息格式
为支持部分没有64位数据类型的主机(如部分组态软件、PLC),0x1000–0x105B地址段内的数据统一放大了232倍。目的是为了保证数据精度和使数据的整数部分和小数部分可以单独处理。
2.1、读多寄存器
例1:读计数(计时)值(完整数据,64位数据格式) 1、如仪表当前的计数值=123.456789,主机发送命令读0x1000开始的4个寄存器,仪表返回0x7B74F01FB8
2、将0x7B74F01FB8即十进制530242871224除232= 从机当前计数值123.456789
命令格式 | 主机发送命令 | 通讯数据字顺序 | ||
=1234 | =4321 | =2143 | ||
地址域 | 表地址 | 0x01 | ||
功能域 | 功能码 | 0x03 | ||
数据域 | 起始寄存器地址 | 高字节 | 0x10 | |
0x00 | ||||
读寄存器数量 | 高字节 | 0x00 | ||
0x04 | ||||
错误检测域 | CRC校验码 | 0x40 | ||
高字节 | 0xC9 |
消息格式 | 从机返回消息 | 通讯数据字顺序 | |||
=1234 | =2143 | =4321 | |||
地址域 | 表地址 | 0x01 | |||
功能域 | 功能码 | 0x03 | |||
数据域 | 数据字节数 | 0x08 | |||
计数(计时)值寄存器 | 高高字 | 0x00 | 0x00 | 0x1F | |
0x00 | 0x7B | 0xB8 | |||
高字 | 0x00 | 0x00 | 0x74 | ||
0x7B | 0x00 | 0xF0 | |||
低字 | 0x74 | 0x1F | 0x00 | ||
0xF0 | 0xB8 | 0x7B | |||
低低字 | 0x1F | 0x74 | 0x00 | ||
0xB8 | 0xF0 | 0x00 | |||
错误检测域 | CRC校验码 | 0x62 | 0xFE | 0xD6 | |
高字节 | 0x5C | 0x65 | 0x28 |
例2:读计数(计时)值(只读整数部分,32位数据格式)
1、假设从机当前的计数值= 19088743.568,读计数值整数部分,从机返回数据=0x01234567。
2、单独读取某参数的整数部分时,返回数据0x01234567=19088743就是从机当前的实际值(不用再除232)。
止
起
X0
X0
X0
X0
X0
X0
X0
X0
止
start
起始位
4、“信息帧”格式
data
数据位
end
命令格式 | 主机发送命令 | 通讯数据字顺序 | ||
=1234 | =2143 | =4321 | ||
地址域 | 表地址 | 0x01 | ||
功能域 | 功能码 | 0x03 | ||
数据域 | 起始寄存器地址 | 高字节 | 0x10 | 0x10 |
0x00 | 0x02 | |||
读寄存器数量 | 高字节 | 0x00 | 0x00 | |
0x02 | 0x02 | |||
错误检测域 | CRC校验码 | 0xC0 | 0x61 | |
高字节 | 0xCB | 0x0B |
消息格式 | 从机返回消息 | 通讯数据字顺序 | |||
=1234 | =2143 | =4321 | |||
地址域 | 表地址 | 0x01 | |||
功能域 | 功能码 | 0x03 | |||
数据域 | 数据字节数 | 0x04 | |||
计数(计时)值整数部分 | 高字 | 0x01 | 0x45 | 0x45 | |
0x23 | 0x67 | 0x67 | |||
低字 | 0x45 | 0x01 | 0x01 | ||
0x67 | 0x23 | 0x23 | |||
错误检测域 | CRC校验码 | 0x79 | 0x1E | 0x1E | |
高字节 | 0x7F | 0xA9 | 0xA9 |
停止位
地址码 | 功能码 | 数据区 | CRC校验码 |
1字节 | 1字节 | N字节 | 2字节(低字节前高字节后) |
通讯命令由主机发往从机时,与主机发送的表地址相符的从机接收命令,如CRC校验无误且命令格式无误,则从机执行相应的操作,然后把执行结果返回给主机。 4.1、地址码(1个字节)
包含在“信息帧”的地址域中,地址范围1-247。主机通过将从机表地址放入命令的地址域来选通从机。从机返回数据时,它将自己的表地址放入返回信息的地址域中,以便主机知道是那一个从机作出了回应(在同一总线内每一个设备的表地址必需是唯一的)。
4.2、功能码(1个字节)
包含在“信息帧”的功能码域中。由主机发往从机时,功能码将告之从机需要执行那些操作。当从机作为回应时,用功能码来指示正常回应或是有错误发生(异常回应)。对于正常回应,从机仅将接收到的功能码作为返回。对于异常回应,从机将接收到的功能码最高位置一后返回。
功能码定义
功能码 | 定义 | 操作 |
0x03 | 读寄存器 | 读取单个或多个寄存器的数据 |
0x10 | 写多路寄存器 | 把n个32位二进制数据写入n个连续的寄存器中 |
4.3、数据区
包含在消息的数据域中,数据长度视功能码不同而不同。
4.4、CRC校验码
冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送端计算,放置于发送信息的尾部。接收端的设备再重新计算接收到信息的CRC码,比较计算得到的CRC码是否与接收到的相符,如果二者不相符,则表明出错。
CRC码的计算方法是,先预置16位寄存器全为。再逐渐把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。
在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一位,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。
这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相异或,这个过程与上以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。
CRC-16码的计算步骤 4.4.1、置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器。
4.4.2、把一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器。
4.4.3、把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(移出位)。
4.4.4、如果最低位为0:复第3步(再次移位)。
如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或。 4.4.5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。
4.4.6、重复步骤2到步骤5,进行下一个8位的处理。
4.4.7、最后得到的CRC寄存器即为CRC码,低字节在前,高字节在后。
2.2、写多寄存器
例3:将12345.678写入从机PS2设定值寄存器
1、如果主机支持64位数据格式,可直接将12345.678乘232=53024283256946,然后以十六进制格式进行发送(53024283256946 = 0x00003039AD916872。共8个字节,不够的在高位填0)
2、如果主机只支持32位数据格式,则需要将12345.678的整数部分和小数部分,分开进行处理。
2.1、整数部分不用处理,直接将12345以十六进制格式放入待发送数据的高4个字节(不够4个字节的,在高位填0。12345 = 0x00003039)。
2.2、小数部分0.678需乘232=2911987826,以十六进制格式放入待发送数据的低4个字节(不够4个字节的,在高位填0。2911987826 = 0x AD916872)。
2.3、然后将处理好的8个字节数据,按由高字到低字(1234)的顺序(0x00003039AD916872),或由低字到高字(4321)的顺序(0x6872AD9130390000)进行发送即可
命令格式 | 主机发送命令 | 通讯数据字顺序 | |||
=1234 | =2143 | =4321 | |||
地址域 | 表地址 | 0x01 | |||
功能域 | 功能码 | 0x10 | |||
数据域 | 起始寄存器地址 | 高字节 | 0x10 | ||
低字节 | 0x30 | ||||
写寄存器数量 | 高字节 | 0x00 | |||
低字节 | 0x04 | ||||
写数据字节数 | 0x08 | ||||
准备写入 PS2设定值寄存器 中的数据(64位数据, 高位前低位后) | 高高字 | 0x00 | 0x30 | 0x68 | |
0x00 | 0x39 | 0x72 | |||
高字 | 0x30 | 0x00 | 0xAD | ||
0x39 | 0x00 | 0x91 | |||
低字 | 0xAD | 0x68 | 0x30 | ||
0x91 | 0x72 | 0x39 | |||
低低字 | 0x68 | 0xAD | 0x00 | ||
0x72 | 0x91 | 0x00 | |||
错误检测域 | CRC 校验码 | 低字节 | 0x8F | 0x63 | 0xA6 |
高字节 | 0xFB | 0xFA | 0x4E |
消息格式 | 从机返回消息 | 通讯数据字顺序 | ||
=1234 | =2143 | =4321 | ||
地址域 | 表地址 | 0x01 | ||
功能域 | 功能码 | 0x10 | ||
数据域 | 起始寄存器 地址 | 高字节 | 0x10 | |
低字节 | 0x30 | |||
写寄存器 数量 | 高字节 | 0x00 | ||
低字节 | 0x04 | |||
错误检测域 | CRC 校验码 | 低字节 | 0xC5 | |
高字节 | 0x05 |
三、通讯错误处理
当仪表检测到除CRC校验码错误以外的其它错误时,将向主机返回错误信息。从机将接收到的功能码最高位置1,然后连同表地址、错误码一起作为错误信息返回。 3.1、从机返回错误代码格式
地址码 | 功能码(最高位置 1) | 错误码 | CRC 校验码低字节 | CRC 校验码高字节 |
一个字节 | 一个字节 | 一个字节 | 一个字节 | 一个字节 |
3.2、错误代码
0x01 | 功能码非法 | 接收到的功能码仪表不支持 |
0x02 | 寄存器地址非法 | 接收到的寄存器地址超出仪表寄存器地址范围 |
0x03 | 寄存器数量非法 | 接收到的寄存器数量超出仪表寄存器数量 |
0x04 | 数据值非法 | 接收到的数据值超出相应地址的数据范围 |
1 KKCI-B21C/A0/20190417 2
4.4、0x1100–0x1164地址段内每个参数占用1个寄存器地址(1个字,2个字节),寄存器内数据高字节前低字节后。
序号 | 地址(寄存器号) | 参数名称 | 字长 | 数据类型 | 属性 | 备注 | |||||
24 | 0x1100(44353) | 通讯地址 | 1 | 无符号16位整型 | R/W | 1~247 | |||||
25 | 0x1101(44354) | 保留 | |||||||||
26 | 0x1102(44355) | 保留 | |||||||||
27 | 0x1103(44356) | 通讯xx率 | 1 | 无符号16位整型 | R/W | 4800=4800bit/s、9600=9600bit/s、19200=19200bit/s | |||||
28 | 0x1104(44357) | 通讯校验方式 | 1 | 无符号16位整型 | R/W | 0=无校验,1=奇校验,2=偶校验 | |||||
例:发送或接收数据0x1020304050607080时,不同设置对应的顺序如下: | |||||||||||
29 | 0x1105(44358) | 通讯数据字(寄存器)顺序选择 | 1 | 无符号16位整型 | R/W | =1234时,接收和发送顺序 = 10 20 30 40 50 60 70 80 =2143时,接收和发送顺序 = 30 40 10 20 70 80 50 60 | |||||
=4321时,接收和发送顺序 = 70 80 50 60 30 40 10 20 | |||||||||||
30 | 0x1106(44359) | 批次/总量累计方式选择 | 1 | 无符号16位整型 | R/W | 0=按批次累计,1=按总数累计 | |||||
31 | 0x1107(44360) | 功能选择 | 1 | 无符号16位整型 | R/W | 0=计数,1=计时,2=频率,3=转速,4=线速度 | |||||
32 | 0x1108(44361) | 上升或下降方式选择 | 1 | 无符号16位整型 | R/W | 0=上升,1=下降 | |||||
33 | 0x1109(44362) | NPN,PNP选择 | 1 | 无符号16位整型 | R/W | 0=NPN,1=PNP | |||||
34 | 0x110a(44363) | 输入方式选择 | 1 | 无符号16位整型 | R/W | 0=U, 1=D, 2=UD-A, 3=UD-B, 4=UD-C, 5=UD-D | |||||
35 | 0x110b(44364) | 输入频率选择 | 1 | 无符号16位整型 | R/W | 1=1Hz,30=30Hz,1000=1KHz,5000=5 KHz,10000=10KHz | |||||
20000=20KHz | |||||||||||
36 | 0x110c(44365) | 外部信号宽度选择 | 1 | 无符号16位整型 | R/W | 实际脉宽,单位ms | |||||
37 | 0x110d(44366) | 保留 | |||||||||
38 | 0x110e(44367) | 保留 | |||||||||
39 | 0x110f(44368) | 定时范围选择 | 1 | 无符号16位整型 | R/W | 0 = 999999s99 | |||||
256 = 99h59m59s99 | |||||||||||
512 = 9999h59m59s | |||||||||||
40 | 0x1110(44369) | 延时范围选择 | 1 | 无符号16位整型 | R/W | ||||||
备注:非时间继电器或计时模式时,写入无效 | |||||||||||
41 | 0x1111(44370) | 保留 | |||||||||
42 | 0x1112(44371) | 显示小数点选择 | 1 | 无符号16位整型 | R/W | 0=没有小数点或浮动小数点,1=1位小数点, 2=2位小数点,…… | |||||
43 | 0x1113(44372) | 显示刷新时间选择 | 1 | 无符号16位整型 | R/W | 单位(10ms):0=自动刷新,50=0.5秒,100=1秒 | |||||
44 | 0x1114(44373) | 保留 | |||||||||
45 | 0x1115(44374) | 保留 | |||||||||
0 = F | 1 = N | 2 = C | 3 = R | ||||||||
46 | 0x1116(44375) | 计数输出方式选择 | 1 | 无符号16位整型 | R/W | 4 = K | 5 = P | 6 = Q | 7 = A | ||
8 = S | 9 = T | 10 = D | 11 = M | ||||||||
0 = OND | 1 = OND.1 | 2 = OND.2 | 3 = FLK | ||||||||
47 | 0x1117(44376) | 计时输出方式选择 | 1 | 无符号16位整型 | R/W | 4 = FLK.1 | 5 = FLK.2 | 6 = INT | 7 = INT.1 | ||
8 = OFD | |||||||||||
48 | 0x1118(44377) | SV1输出方式选择(保留) | 1 | 无符号16位整型 | R/W | ||||||
49 | 0x1119(44378) | SV2输出方式选择(保留) | 1 | 无符号16位整型 | R/W | ||||||
50 | 0x111a(44379) | SV3输出方式选择(保留) | 1 | 无符号16位整型 | R/W | ||||||
51 | 0x111b(44380) | LSV输出方式选择(保留) | 1 | 无符号16位整型 | R/W | ||||||
52 | 0x111c(44381) | BSV输出方式选择(保留) | 1 | 无符号16位整型 | R/W | ||||||
53 | 0x111d(44382) | 停电记忆功能 | 1 | 无符号16位整型 | R/W | 0=关闭, 1=开启 | |||||
54 | 0x111e(44383) | 启动功能 | 1 | 无符号16位整型 | R/W | 0=关闭, 1=开启 | |||||
55 | 0x111f(44384) | 保留 | |||||||||
56 | 0x1120(44385) | 保留 | |||||||||
57 | 0x1121(44386) | 保留 | |||||||||
58 | 0x1122(44387) | 密码设置 | 1 | ||||||||
59 | 0x1160(44449) | OUT1输出状态 | 1 | 无符号16位整型 | R | 0=未动作, 1=动作 | |||||
60 | 0x1161(44450) | OUT2输出状态 | 1 | 无符号16位整型 | R | 0=未动作, 1=动作 | |||||
61 | 0x1162(44451) | OUT3输出状态 | 1 | 无符号16位整型 | R | 0=未动作, 1=动作 | |||||
62 | 0x1163(44452) | LSO输出状态 | 1 | 无符号16位整型 | R | 0=未动作, 1=动作 | |||||
63 | 0x1164(44453) | BAO输出状态 | 1 | 无符号16位整型 | R | 0=未动作, 1=动作 | |||||
4
*
*