MODBUS-RTU通讯协议
一、 ModBus_RTU通讯规约(本协议采用主从问答方式)
1. 通讯数据的类型及格式:
信息传输为异步方式,并以字节为单位。主站和从站之间传递的通讯信息为
11位字格式:(1位起始位,8位数据位,1位停止位,无奇偶校验)。
主机发给从机的一条完整信息帧由如下字节组成
数据格式 |
地址码 |
功能码 |
数据区 |
CRC校检码16位 |
数据长度 |
1字节 |
1字节 |
N字节 |
2字节 |
从机发给主机的一条完整信息帧只包含有效字节,通讯数据(信息帧)格式
数据格式 |
地址码 |
功能码 |
数据区 |
CRC校检码16位 |
数据长度 |
1字节 |
1字节 |
N字节 |
2字节 |
地址码:
地址码是每次通讯信息帧的第一字节(8位),从01H到FFH。每个从机都必须有唯一的地址码。所有地址的从机都将接收由主机发送来的信息,只有符合地址码的从机才响应要求,回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。
功能码:
是每次通讯信息帧传送的第二个字节。ModBus通讯规约可定义的功能码为0到127。FH控制器仅用到其中的一部分功能码。作为主机请求发送,通过功能码告诉从机应执行什么动作。作为响应,从机返回的功能码与从主机发送来的功能码一样,并表明从机已响应主机并且已进行相关的操作。
数据区:
数据区包括需要由主机发送、从机回送何种信息或执行什么动作。这些信息可以是数据(如:开关量、模拟量、寄存器参数等等)、参考地址等。例如,主机通过功能码03告诉从机返回单路或多路工况数据寄存器的值或单路或多路控制/报警设置数据寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度等),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相同(见通讯信息表)。
FH控制器采用Modbus通讯规约,主机(PLC、RTU、PC机、DCS等)利用通讯命令(功能码03),可以进任意行读取其数据寄存器(其数据信息表详见附录)。FH控制器的数据寄存器存储多种工况数据(如:温度、压力、流量、电流、电压、功率及控制/报警数据等),开关量以bit位为单元的二进制数组成(既8 bit为1个字节)多字节数据;模拟量、寄存器参数都是16位(2字节)的二进制数据(整型),低字节在前,高字节在后。
工况数据转换方法:仪表回送的工况数据都是整数,上位机如果转换为实型,可以除十处理,如果转换成字符串型,可以直接将小数点插入在十位。
如1:工况温度值=60.0,小数点在十位
仪表回送数据=60010 =25816 = 00000010010110002
FH控制器响应的命令格式是从机地址、功能码、数据区及CRC码。数据区的数据为多字节开关量数据或模拟量数据。
★ 注:1、1个字节由8位二进制数组成(既8 bit)。
2、ModBus是Modicon公司的注册商标。
3、“从机”在本文件中既为本控制器。
4、每次查询从机数据,数据区数据最多只能13个字(26个字节)
2. 通讯信息传输过程:
当通讯命令由发送设备(主机)发送至接收设备(从机)时,在CRC校验无误情况下,从机地址与地址码相符的从机接收通讯命令(从机以本机的地址码和功能码2个字节作为同步字),并根据功能码及相关要求处理信息,执行相应的任务,然后把执行结果(数据)返送给主机。返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码。如果CRC校验出错则不响应信息
3. FH控制器使用的MODBUS功能码(10进制)
功能码 |
定 义 |
操 作(二进制) |
03 |
读寄存器数据 |
读取单路或多路工况数据;单路或多路控制/报警设置数据 |
06 |
写单个寄存器(状态量) |
写单个功能寄存器 |
16 |
写多个寄存器 |
写多个功能寄存器或参数值到eeprom |
1) 功能码03:读从机工况数据
例如:主机要读取地址为01,起始地址为从0x268h从机工况数据,8种16进制数据。
从机(FH)数据寄存器的地址和数据为:
寄存器地址 |
寄存器数据(16进制) |
0x268 |
1784H |
0x26a |
0000H |
0x26c |
178AH |
0x26e |
178AH |
0x270 |
178AH |
0x272 |
178AH |
0x274 |
178AH |
0x276 |
178AH |
主机发送的报文格式:
主机发送 |
字节数 |
发送的信息 |
举例说明 |
从机地址 |
1 |
01H |
发送至地址为01的从机 |
功能码 |
1 |
03H |
读取工况数据 |
起始地址 |
2 |
0268H |
起始地址为0x268 |
数据路数 |
2 |
0008H |
读取8种工况数据 |
CRC码 |
2 |
XXXXH |
由主机计算得到CRC码 |
从机(FH)响应返回的报文格式:
从机响应 |
字节数 |
返回的信息 |
举例说明 |
从机地址 |
1 |
01H |
来自从机01 |
功能码 |
1 |
03H |
读取工况数据 |
字节数 |
1 |
0eH |
后面跟随数据的字节数 |
第1种工况数据 |
2 |
1784H |
系统工作状态 |
第2种工况数据 |
2 |
0000H |
阀门开度给定 |
第3种工况数据 |
2 |
178AH |
阀门开度值 |
第4种工况数据 |
2 |
178AH |
模块温度 |
第5种工况数据 |
2 |
178AH |
母线电压 |
第6种工况数据 |
2 |
178AH |
电机速度 |
第7种工况数据 |
2 |
178AH |
电机电流值 |
第8种工况数据 |
2 |
178AH |
系统异常状态量 |
CRC码 |
2 |
XXXXH |
由从机计算得到CRC码 |
2) 功能码03:读从机参数值
例如:主机要读取地址为01,起始地址为从0x200h的从机参数值,13个16进制数据。
从机(FH)数据寄存器的地址和数据为:
寄存器地址 |
寄存器数据(16进制) |
0x200 |
1784H |
0x202 |
0000H |
0x204 |
|
|
|
0x236 |
|
0x238 |
178AH |
主机发送的报文格式:
主机发送 |
字节数 |
发送的信息 |
举例说明 |
从机地址 |
1 |
01H |
发送至地址为01的从机 |
功能码 |
1 |
03H |
读取参数值 |
起始地址 |
2 |
0200H |
起始地址为0x200 |
数据路数 |
2 |
000DH |
读取13个参数值 |
CRC码 |
2 |
XXXXH |
由主机计算得到CRC码 |
从机(FH)响应返回的报文格式:
从机响应 |
字节数 |
返回的信息 |
举例说明 |
从机地址 |
1 |
01H |
来自从机01 |
功能码 |
1 |
03H |
读取工况数据 |
字节数 |
1 |
1AH |
26个字节 |
第1个参数值 |
2 |
1784H |
|
第2个参数值 |
2 |
0000H |
|
第3个参数值 |
2 |
178AH |
|
第4个参数值 |
2 |
178AH |
|
|
|
|
|
第13个参数值 |
2 |
178AH |
|
CRC码 |
2 |
XXXXH |
由从机计算得到CRC码 |
注:1、控制器共有42个工作参数,详细见附录2
2、所有参数须分四次传完(13*3+3)
3) 功能码06:写单个寄存器
主机利用这个功能码把数据保存到控制器的数据存储器中去(寄存器)。例如:主机要把0016H保存到从机0x0200寄存器中去(从机地址码为01)。通讯数据保存结束后,从机内0x0200寄存器为0001H:
主机发送数据地址和数据为:
主机发送的报文格式:
主机发送 |
字节数 |
发送的信息 |
举例说明 |
从机地址 |
1 |
01H |
发送至从机01 |
功能码 |
1 |
06H |
写单路寄存器 |
数据地址 |
2 |
0x0200 |
第1项参数 |
保存数据 |
2 |
0x0001H |
|
CRC码 |
2 |
XXXXH |
由主机计算得到的CRC码 |
从机(FH)响应返回的报文格式:
主机发送 |
字节数 |
返回的信息 |
举例说明 |
从机地址 |
1 |
01H |
发送至从机01 |
功能码 |
1 |
06H |
写多路寄存器 |
数据地址 |
2 |
0x0200 |
第1项参数 |
保存数据 |
2 |
0001H |
|
CRC码 |
2 |
XXXXH |
由主机计算得到的CRC码 |
4) 功能码16:写多个数据
主机利用这个功能码把多个数据保存到从机的数据存储器中去(寄存器)。例如:主机要把04B0H,保存到从机第1项参数中去;1388H保存到从机第2项参数中去(从机地址码为01)。通讯数据保存结束后,从机内 第1项参数为04B0H;、第2项参数为1388H:(参数首地址0X200H)
主机发送数据地址和数据为:
地址 |
数据 |
0x200h |
04B0H |
0x202h |
1388H |
主机发送的报文格式:
主机发送 |
字节数 |
发送的信息 |
举例说明 |
从机地址 |
1 |
01H |
发送至从机01 |
功能码 |
1 |
10H |
写多路寄存器 |
起始地址 |
2 |
0x200H |
第1项参数地址 |
数据数 |
2 |
0002H |
共2项参数数据 |
保存数据1 |
2 |
04B0H |
|
保存数据2 |
2 |
1388H |
|
CRC码 |
2 |
XXXXH |
由主机计算得到的CRC码 |
从机(FH)响应返回的报文格式:
主机发送 |
字节数 |
返回的信息 |
举例说明 |
从机地址 |
1 |
01H |
发送至从机01 |
功能码 |
1 |
10H |
写多路寄存器 |
起始地址 |
2 |
0x200H |
第1项参数地址 |
数据数 |
2 |
0002H |
共2项参数数据 |
CRC码 |
2 |
XXXXH |
由主机计算得到的CRC码 |
4. 错误校验码(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填补最高位,并检查最低位(LSB位被提取出来检测);
如果最低位为1:移位后 CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;如果最低位为0:不作处理;
4.重复步骤3,直到右移8次,这样整个8位数据全部进行了处理;
5.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
6.最后得到的CRC寄存器内容即为:CRC码。
注:报文中的CRC码低八位在前,高八位在后。
5. 通讯错误信息及数据的处理:
当从机发现除了CRC码出错以外的错误时,必须向主机回送信息,并将接收到的功能码的最高位置为1,即从机返送给主机的功能码是在主机发送的功能码的基础上加128 。以下的这些代码表明有意外的错误发生。
从机接收到的信息如有CRC错误,则将被从机忽略。
从机返送的错误码的格式如下(CRC码除外):
地址码: 1字节
功能码: 1字节(最高位为1,例:03H功能码变为83H)
错误码: 1字节
CRC码:2字节。
从机响应回送如下错误码:
81:非法的数据位置。
指定的数据位置超出从机的范围。
82:非法的数据值。
接收到主机发送的数据值超出从机相应地址的数据范围。
附录1:FH控制器MODBUS通讯规约信息表
工况数据
长度 |
名称 |
地址 |
含义 |
备注 |
U16 |
State |
0x268 |
系统当前工作状态 |
|
U16 |
Angle_give |
0x26a |
阀门开度给定 |
|
U16 |
Angle_data |
0x26c |
阀门开度值 |
|
U16 |
I_motor |
0x26e 0x274 |
电机电流值 |
|
U16 |
|
0x270 |
备用1 |
|
U16 |
|
0x272 |
备用2 |
|
U16 |
Sys_state |
0x274 |
系统异常信息 |
|
U16 |
|
0x276 |
备用3 |
|