ODBUS-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 | 后面跟随数据的字节数 |
***种工况数据 | 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个字节 |
***个参数值 | 2 | 1784H | |
第2个参数值 | 2 | 0000H | |
第3个参数值 | 2 | 178AH | |
第4个参数值 | 2 | 178AH | |
***3个参数值 | 2 | 178AH | |
CRC码 | 2 | XXXXH | 由从机计算得到CRC码 |
注:1、控制器共有42个工作参数,详细见附录2
2、所有参数须分四次传完(13*3+3)
3) 功能码06:写单个寄存器
主机利用这个功能码把数据保存到控制器的数据存储器中去(寄存器)。例如:主机要把0016H保存到从机0x0200寄存器中去(从机地址码为01)。通讯数据保存结束后,从机内0x0200寄存器为0001H:
主机发送数据地址和数据为:
寄存器地址 | 数据 |
0x234 | 01 |
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 举例说明 |
从机地址 | 1 | 01H | 发送至从机01 |
功能码 | 1 | 06H | 写单路寄存器 |
数据地址 | 2 | 0x0200 | ***项参数 |
保存数据 | 2 | 0x0001H | |
CRC码 | 2 | XXXXH | 由主机计算得到的CRC码 |
从机(FH)响应返回的报文格式:
主机发送 | 字节数 | 返回的信息 | 举例说明 |
从机地址 | 1 | 01H | 发送至从机01 |
功能码 | 1 | 06H | 写多路寄存器 |
数据地址 | 2 | 0x0200 | ***项参数 |
保存数据 | 2 | 0001H | |
CRC码 | 2 | XXXXH | 由主机计算得到的CRC码 |
4) 功能码16:写多个数据
主机利用这个功能码把多个数据保存到从机的数据存储器中去(寄存器)。例如:主机要把04B0H,保存到从机***项参数中去;1388H保存到从机第2项参数中去(从机地址码为01)。通讯数据保存结束后,从机内 ***项参数为04B0H;、第2项参数为1388H:(参数首地址0X200H)
主机发送数据地址和数据为:
地址 | 数据 |
0x200h | 04B0H |
0x202h | 1388H |
主机发送的报文格式:
主机发送 | 字节数 | 发送的信息 | 举例说明 |
从机地址 | 1 | 01H | 发送至从机01 |
功能码 | 1 | 10H | 写多路寄存器 |
起始地址 | 2 | 0x200H | ***项参数地址 |
数据数 | 2 | 0002H | 共2项参数数据 |
保存数据1 | 2 | 04B0H | |
保存数据2 | 2 | 1388H | |
CRC码 | 2 | XXXXH | 由主机计算得到的CRC码 |
从机(FH)响应返回的报文格式:
主机发送 | 字节数 | 返回的信息 | 举例说明 |
从机地址 | 1 | 01H | 发送至从机01 |
功能码 | 1 | 10H | 写多路寄存器 |
起始地址 | 2 | 0x200H | ***项参数地址 |
数据数 | 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 |
附录2:从机参数说明
见“参数说明.xls”文档
附录3:控制指令说明
1) 开阀运行:
向从机0268H 地址单元写入 0003H
2) 关阀运行:
向从机0268H 地址单元写入 0004H
3) 停止:
向从机0268H 地址单元写入 0002H
4) 远控模拟量控制:
向从机0268H 地址单元写入 0001H
5) 阀门开度给定值:
向从机026AH 地址单元写入 XXXXH
附录4:工况数据数值说明
1) 工况数据中***个字表示系统工作状态,数值含义如下:
0 全停状态
1 自动状态
2 就地状态
3 关阀状态
4 开阀状态
2) 工况数据中***~六个字表示相应工况数值,含一位小数,即数值除十显示
3) 工况数据中第七个字表示系统异常状态,数值每一位的含义如下:
0 位 开机械过力矩
1 位 关机械过力矩
2 位 开堵转
3 位 关堵转
4 位 开过流
5 位 关过流
6 位 参数异常
7 位 缺相
8 位 断信号
9 位 备用
10位 电机过热
附录五:常用通讯字符串(16进制)
工况数据读取 | 06 03 02 68 00 09 04 1f |
初级参数读取1 | 06 03 40 00 00 0d 90 78 |
初级参数读取2 | 06 03 40 1a 00 0d b1 bf |
二级参数读取1 | 06 03 40 30 00 0d 90 77 |
二级参数读取2 | 06 03 40 4a 00 0d b1 ae |
参数查看读取1 | 06 03 40 70 00 0d 91 a3 |
参数查看读取2 | 06 03 40 8a 00 0d b1 92 |
***参数读取1 | 06 03 40 a0 00 0d 90 *** |
***参数读取2 | 06 03 40 ba 00 0d b1 9d |
远程控制命令—模拟量控制 | 06 06 02 68 00 01 c9 d9 |
远程控制命令—停止 | 06 06 02 68 00 02 89 d8 |
远程控制命令—开阀 | 06 06 02 68 00 03 48 18 |
远程控制命令—关阀 | 06 06 02 68 00 04 09 da |
远程控制命令—给定开度值 | 06 06 02 6a 00 02 28 18 |
远程控制命令—模拟量控制及给定开度值 | 06 10 02 68 00 02 00 01 01 f4 1d d0 |
备注:
FH控制器增加通讯控制参数选项:
二级菜单---》远控控制方式---》总线型---》通讯控制
设置为“有效”时,开关型状态下远程控制由PLC控制开阀、关阀、停止,外接端子上的相应节点无效,调节型状态下远程控制由PLC直接通过06或16命令给定开度值,外接端子上的4~20Ma输入节点信号无效。
设置为“无效”时,开关型或调节型状态下远程控制均由外接端子上的相应节点起作用, PLC控制开关阀命令无效,但仍可进行常规工况数据读取。