免费小程序开发平台,河南网站建设优化技术,如何建企业仢网站,做国际贸易如何建网站Modbus常用功能码学习及实例
一.MODBUS寄存器种类说明
虽然MODBUS支持诸多功能码#xff0c;但其中只涉及到四种寄存器#xff1a;线圈寄存器、离散输入寄存器、保持寄存器、输入寄存器。 只要搞清楚寄存器的本质和功能码的联系#xff0c;其实理解功能码就很简单。
寄存…Modbus常用功能码学习及实例
一.MODBUS寄存器种类说明
虽然MODBUS支持诸多功能码但其中只涉及到四种寄存器线圈寄存器、离散输入寄存器、保持寄存器、输入寄存器。 只要搞清楚寄存器的本质和功能码的联系其实理解功能码就很简单。
寄存器种类读写状态位操作字操作适用功能码线圈寄存器读/写位01H读 05H写单个位 0FH写多个位离散输入寄存器只读位02H保持寄存器读/写字03H读 06H写单个字节 0FH写多个字节输入寄存器只读字04H
线圈寄存器可以类比为开关量每个bit都对应一个信号的开关状态。所以一个字节可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写比如控制或者读取电磁阀的开关志状态。对应的功能码有0x01 0x05 0x0f
离散输入寄存器离散输入寄存器相当于线圈寄存器的只读模式每个bit表示一个开关量而他的开关量只能读取不能够写入。只能通过外部设定改变输入状态比如我可以读取外部按键的按下还是松开但是控制不了按键。对应的功能码有0x02
保持寄存器寄存器的单位不再是bit而是两个byte也就是可以存放具体的数据量的并且是可读写的。比如我不到那可以读取传感器报警上限下限也可以设置它的大小。对应的功能码有0x03 0x06 0x10
输入寄存器输入寄存器相当于保持寄存器的只读模式也是只支持读而不能写。一个寄存器也是占据两个字节的空间。比如通过读取输入寄存器获取现在的模拟量采样值。对应的功能码有 0x04
二.MODBUS部分功能码
MODBUS支持很多功能码但是在实际应用的时候常用的也就那么几个。
上面介绍了Modbus的四个寄存器种类线圈寄存器、离散输入寄存器、保持寄存器、输入寄存器从寄存器角度理解了对应功能码。下面列出常用功能码具体如下
功能码名称数据类型作用0x01读线圈寄存器位取得一组逻辑线圈的当前状态ON/OFF )0x02读离散输入寄存器位取得一组开关输入的当前状态ON/OFF )0x03读保持寄存器整型、浮点型、字符型在一个或多个保持寄存器中取得当前的二进制值0x04读输入寄存器整型、浮点型在一个或多个输入寄存器中取得当前的二进制值0x05写单个线圈寄存器位强置一个逻辑线圈的通断状态0x06写单个保持寄存器整型、浮点型、字符型把具体二进值装入一个保持寄存器0x0f写多个线圈寄存器位强置一串连续逻辑线圈的通断0x10写多个保持寄存器整型、浮点型、字符型把具体的二进制值装入一串连续的保持寄存器
三.MODBUS功能码实例
1.功能码01H 读线圈寄存器
1功能读从站线圈寄存器位操作可读单个或者多个 2主机发送指令 主机发送数据包括从站地址功能码寄存器起始地址寄存器数量校验码 假设从站地址为0x01线圈寄存器开始地址0x0021结束地址0x002c即寄存器地址范围为0x0021~0x002c总共读取12个连续线圈的状态值则主机发送指令如下图所示
从站地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数低8位CRC校验低8位CRC校验高8位0x010x010x000x210x000x0c0xXX0xXX
3从站响应返回 从站响应返回数据包括从站地址功能码返回字节数数据值校验码 其中返回数据值的每一位对应线圈状态线圈状态为ON时其值为1状态为OFF时其值为0 【数据以小端的形式进行存储即最低有效位存放于内存最低位地址位于二进制的右侧。每8个位组成一个字节当线圈的数量不是8的倍数时剩余的位数添0补位。】
从站地址功能码返回字节数data1data2CRC校验低8位CRC校验高8位0x010x010x020xCB0x0B0xXX0xXX
本例中读取12个线圈12/8商1余4因此需要2个字节存放应答数据返回字节数为2。 字节1存放线圈编号21~28的数值小端字节序线圈28的值存放在bit7线圈21的值存放在bit0 字节2存放线圈编号29~32的数值剩余位数添0补位
上表中data1表示0x0021-0x0028的线圈状态data1的最低位代表最低地址的线圈状态 data1:0xCB1100 1011则data1线圈状态如下表所示
线圈地址0x280x270x260x250x240x230x220x21数值11001011
data2表示地址0x0030-0x0038的线圈状态不够8位字节高位填充为0。 data20x0B0000 1011则data2线圈状态如下表所示
线圈地址0x300x2f0x2e0x2d0x2c0x2b0x2a0x29数值00001011
2.功能码02H 读离散输入寄存器
1功能读离散输入寄存器位操作可读单个或多个类似功能码0X01此处省略
3.功能码03H 读保持寄存器
1功能读从站保持寄存器字节操作可读单个或者多个每个保持寄存器占2个字节16位 2主机发送指令 主机发送数据包括从站地址功能码寄存器起始地址寄存器数量校验码 假设从站地址为0x03保持寄存器开始地址为0x003B结束地址0x003D即寄存器地址范围为0x003B~0x003D总共读取3个保持寄存器的数据则主机发送指令如下图所示
从站地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数量低8位CRC校验低8位CRC校验高8位0x030x030x000x3B0x000x030xXX0xXX
3从站响应返回 从站响应返回数据包括从站地址功能码返回字节数数据值校验码
从站地址功能码返回字节数data1Hdata1Ldata2Hdata2Ldata3Hdata3LCRC校验低8位CRC校验高8位0x030x030x060x1B0x0B0x0A0x010xC20xDB0xXX0xXX
本例中读取3个保持寄存器每个保持寄存器占2个字节因此需要6个字节存放应答数据返回字节数为6。 0x003B~0x003D保持寄存器的数值如下图所示
寄存器地址0x003D0x003C0x003A数值0xC2 DB0x0A 010x1B 0B
4.功能码04H 读输入寄存器
1功能读输入寄存器字节操作可读单个或多个类似功能码0X03此处省略
5.功能码05H 写单个线圈寄存器
1功能对单个线圈进行写操作位操作只能写一个。写入0xFF00表示将线圈置为ON写入0x0000表示将线圈置为OFF其它值无效 2主机发送指令 主机发送数据包括从站地址功能码寄存器起始地址数据值校验码 假设从站地址为0x03线圈寄存器起始地址为0x0032要将其设置为ON则主机发送指令如下表所示
从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位0x030x050x000x320xff0x000xXX0xXX
3从站响应返回 从站应答数据包括从站地址功能码寄存器地址写入值校验码 如果数据成功写入则应答数据与请求数据一样如下表所示
从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位0x030x050x000x320xff0x000xXX0xXX
6.功能码06H 写单个保持寄存器|
1功能对单个保持寄存器进行写操作字节操作只能写一个。 2主机发送指令 主机发送数据包括从站地址功能码寄存器起始地址数据值校验码 假设从站地址为0x01线圈寄存器起始地址为0x0048写入数值为0x1234则主机发送指令如下表所示
从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位0x010x060x000x480x120x340xXX0xXX
3从站响应返回 从站应答数据包括从站地址功能码寄存器地址写入值校验码 如果数据成功写入则应答数据与请求数据一样。