modbus功能码详解

modbus功能码详解,第1张

modbus功能码详解:

Modbus功能码链稿凯是Modbus消息帧(报文)的重要组成部分,是Modubs协议中通信事务处理的基础,代表消息将要执行的动作。

简而言之,Modbus功能码占用一个字节,取值范围是1127,之所以127以上不能使用,是因为Modbus规定出现异常棚唤时,功能码+0x80(十进制128)代替异常状态,因此129(1+128)255(127+128)的取值代表异常码。

读取从设备的线圈或离散量输出的状态,即各DO的ON/OFF状态。消息帧中指定了需读取的线圈起始地址和线圈数目。需要注意的一点是,在敬镇Modbus协议规定的PDU中,规定所有线圈或寄存器地址从0开始计算。

Modbus寄存器分为四种,如表1.1所示

表1.1 寄存器分类

Modbus中常用的功能码有8个,可以分为位 *** 作和字 *** 作两类,如表2.1所示:

表2.1 常用功能码

功能码01H读取Modbus从机中线圈寄存器的状态,可以是单个寄存器,或者多个连续的寄存器。

假设从机地址为01H,读取的启脊线圈寄存器的起始地址为0017H,读取38个寄存器,指令如表3.1所示:

表3.1 读线圈寄存器指令:

各线圈的状态与数据内容的每个bit对应,1代表ON,0代表OFF。如果查询的线圈数量不是8的倍数,则在最后一个字节的高位补0。

表3.2.1 读线圈状态的返回结果

其中,第一个字节CDH对应线圈0017H到001E的状态,转为二进制是11001101,其中bit0对应0017H,bit7对应001E,如表3.2.2所示:

表3.2.2 线圈0017H到001EH的状态

最后一个字节为1BH,对应线圈0037H到003CH的状态,转为二进制是00011011,其中bit0对应0037H,bit5对应003CH,其余两位用0填充,如表3.2.3所示:

表3.2.3 线圈0037H到003CH的状态

功能码02H读取Modbus从机中离散输入寄存器的状态绝旁正,可以是单个寄存器,或者多个连续的寄存器。

假设从机地址为01H,读取的离散输入寄存器的起始地址为00C4H,读取22个寄存器,指令如表4.1所示:

表4.1 读离散输入寄存器指令:

各个离散输入寄存器的状态与数据内容的每个bit对应,1代表ON,0代表OFF。如果查询的线圈数量不是8的倍数,则在最后一个字节的高位补0。

表4.2.1 读离散输入寄存器的返回结果

其中,第一个字节ACH对应00C4H到00CBH寄存器的状态,转为二进制是10101100,其中bit0对应00C4H,bit7对应00CB,如表4.2.2所示:

表4.2.2 寄存器00C4H到00CBH的状态

最后一个字节为35H,对应寄存器00D4H到00D9H的状态,转为二进制是00110101,其中bit0对应00D4H,bit5对应00D9H,其余两位用0填充,如表4.2.3所示:

表4.2.3 寄存器00D4H到00D9H的状态

功能码03H读取Modbus从机中保持寄存器的数据,可以是单个寄存器,或者多个连续的寄存器。

假设从机地址为01H,读取的保持寄存器的起始地址为006BH,读取3个寄存器,指令如表5.1所示:

表5.1 读保持寄存器指令:

每个保持寄存器的长度为2个字节。保持寄存器之间,低地址寄存器先传输,高地址寄存器后传输。单个保持寄存器,高字节数据先传输,低字节数据后传输。

表5.2.1 读保持寄存器的返回结果

功能码04H读取Modbus从机中输入寄存器的数据,可以是单个寄存器,或者多个连续的寄存器。

假设从机地址为01H,读取的保持寄存器的起始地址为0008H,读取2个寄存器,指令如表6.1所示:

表6.1 读输入寄存器指令:

每个输入寄存器的长度为2个字节。输入寄存器之间,低地址寄存器先传输,高地址寄存器后传输。单个输并悔入寄存器,高字节数据先传输,低字节数据后传输。

表6.2.1 读输入寄存器的返回结果

功能码05H写单个线圈寄存器,FF00H请求线圈处于ON状态,0000H请求线圈处于OFF状态。

假设从机地址为01H,线圈寄存器的地址为00ACH,使其处于ON状态的指令如表7.1所示:

表7.1 写单个线圈指令:

如果写入成功,返回发送的指令,即010500ACFF004C1B。

功能码06H写单个保持寄存器。

假设从机地址为01H,保持寄存器的地址为0001H,数据位0003H,指令如表8.1所示:

表8.1 写单个保持寄存器指令:

如果写入成功,返回发送的指令,即010600010003980B。

功能码0FH写多个线圈寄存器。如果对应的数据位为1,表示线圈状态为ON;如果对应的数据位为0,表示线圈状态为OFF。线圈寄存器之间,低地址寄存器先传输,高地址寄存器后传输。单个线圈寄存器,高字节数据先传输,低字节数据后传输。如果写入的线圈寄存器的个数不是8的倍数,则在最后一个字节的高位补0。

假设从机地址为01H,线圈寄存器的起始地址为0013H,写入10个寄存器,指令如表9.1.1所示:

表9.1.1 写入多个线圈寄存器指令

其中,CDH对应线圈0013H到001AH的内容,01H对应线圈001B到001CH的内容,未使用位用0填充。

此时,线圈寄存器的内容如表9.1.2所示:

表9.1.2 线圈寄存器0013H到001CH的内容

如果写入成功,返回写入的寄存器数量,如表9.2所示:

表9.2 写多个线圈寄存器的返回结果

功能码10H写多个保持寄存器,其中每个保持寄存器的长度为两个字节。

假设从机地址为01H,保持寄存器的起始地址为0001H,写入2个寄存器,指令如表10.1所示:

表10.1 写入多个保持寄存器指令

如果写入成功,返回写入的寄存器数量,如表10.2所示:

表10.2 写多个保持寄存器的返回结果

ModBus常用功能码 (功能码为10进制)\x0d\x0a01 READ COIL STATUS 读线宽枣圈寄存器 \x0d\x0a02 READ INPUT STATUS 读状态寄存器\x0d\x0a03 READ HOLDING REGISTER 核巧指 读保持寄存器\x0d\x0a04 READ INPUT REGISTER 读输入寄存器 \x0d\x0a05 WRITE SINGLE COIL写单线圈寄存器\x0d\x0a06 WRITE SINGLE REGISTER 写单保持寄存器改配\x0d\x0a15 WRITE MULTIPLE COIL写多线圈寄存器\x0d\x0a16 WRITE MULTIPLE REGISTER 写多保持寄存器


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12465360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存