0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

写多个线圈与写多个保持寄存器

瑞萨MCU小百科 来源:瑞萨MCU小百科 2024-11-06 15:21 次阅读

10.5.11

(0x0F)写多个线圈

1. 功能说明

15功能码用于将连续的多个线圈或离散输出设置为ON/OFF状态,支持广播模式,在广播模式下,所有从站设备的同一地址的值将被统一修改。15功能码中,起始地址字段由2字节构成,取值范围为0x00000xFFFF:而寄存器数量字段由2字节构成,取值范用为0x00010x07B0。

2. 查询报文

查询报文中包含请求数据字段,用于定义ON或OFF状态。数据字段中为逻辑1的位对应ON;逻辑0的位对应OFF。其中,ON/OFF与数据字段的对应关系可参考前面的童节“01(0x01)读取线圈,离散量输出状态(Read Coilstatus/DOs)”中的内容举例说明,假设从站设备地址为5,需要设置线圈地址20~30的状态如下表所示。

线圈状态:

bd1d8152-9bec-11ef-a511-92fbcf53809c.png

那么,写入的数据字段被划分为2字节,值分别为0xD1,对应于27~20的线圈,值0x05对应于30~28的线圈,注意细体会其中的高低位的对应关系。需要注意的是,在查询报文中,Modbus协议的起始地址为19(0x13),即比线圈起始地址20少1。如下表所示,其中字节数字段表示需要变更数据的字节总数。

功能码15查询报文示例:

字段
(Hex)
ASCII
模式字符型
RTU模式8位
(Hex)
帧头 “:”
从设备地址 0x05 “0”,“5” 0x05
功能码 0x0F “0”,“F” 0x0F
起始地址
(高位)
0x00 “0”,“0” 0x00
起始地址
(低位)
0x13 “1”,“3” 0x13
寄存器数
(高位)
0x00 “0”,“0” 0x00
寄存器数
(低位)
0x0B “0”,“B” 0x08
字节数 0x02 “0”,“2” 0x02
变更数据
(高位)
0xD1 “D”,“1” 0xD1
变更数据
(低位)
0x05 “0”,“5” 0x05
差错校验 LRC(2字符) CRC(2字节)
帧尾 CR/LF
合计字节数 23 11

3. 响应报文

对于从设备,在正常情况下,响应报文包括功能码、起始地址以及写入的线圈数量,如下表所示。

功能码15响应报文示例:

字段
(Hex)
ASCII
模式字符型
RTU模式8位
(Hex)
帧头 “:”
从设备地址 0x05 “0”,“5” 0x05
功能码 0x0F “0”,“F” 0x0F
起始地址
(高位)
0x00 “0”,“0” 0x00
起始地址
(低位)
0x13 “1”,“3” 0x13
寄存器数
(高位)
0x00 “0”,“0” 0x00
寄存器数
(低位)
0x0B “0”,“B” 0x08
差错校验 LRC(2字符) CRC(2字节)
帧尾 CR/LF
合计字节数 17 8

10.5.12

(0x10)写多个保持寄存器

1. 功能说明

16功能码用于设置或写入从设备保持寄存器的多个连续的地址块(1~123个寄存器),支持广播模式,在广播模式下,所有从站设备的同一地址的值将被统一修改。本功能码中,起始地址字段由2字节构成,取值范围为0x0000~0xFFFF;而寄存器数量字段由2字节构成,取值范围为0x0001~0x007B。

2. 查询报文

查询报文包含请求数据字段。数据字段保存需要写入的数值,各数据按每个寄存器2字节存放。举例说明,从站设备地址为5,需要将保持寄存器地址40020~40022设置为如下表所示的数值。

寄存器的设置:

寄存器地址 设定值 寄存器地址 设定值
40020 0X0155 40022 0x0157
40021 0x0156

对应于40020~40022的寄存器,注意仔细体会其中的高低位的对应关系。需要注意的是,在查询报文中,Modbus协议的起始地址为19(0x13),即比寄存器起始地址20少1。如下表所示,其中字节数字段表示需要变更数据的字节总数。

功能码16查询报文示例:

字段
(Hex)
ASCII
模式字符型
RTU模式8位
(Hex)
帧头 “:”
从设备地址 0x05 “0”,“5” 0x05
功能码 0x10 “0”,“F” 0x0F
起始地址
(高位)
0x00 “0”,“0” 0x00
起始地址
(低位)
0x13 “1”,“3” 0x13
寄存器数
(高位)
0x00 “0”,“0” 0x00
寄存器数
(低位)
0x03 “0”,“B” 0x08
字节数 0x06 “0”,“6” 0x06
变更数据1
(高位)
0x01 “0”,“1” 0x01
变更数据1
(低位)
0x55 “5”,“5” 0x56
变更数据2
(高位)
0x01 “0”,“1” 0x01
变更数据2
(低位)
0x56 “5”,“6” 0x56
变更数据3
(高位)
0x01 “0”,“1” 0x01
变更数据3
(低位)
0x57 “5”,“7” 0x57
差错校验 LRC(2字符) CRC(2字节)
帧尾 CR/LF
合计字节数 31 15

3. 响应报文

对于从设备,在正常情况下,响应报文包括功能码、起始地址及写入的寄存器数量,如下表所示。

功能码16响应报文示例:

字段
(Hex)
ASCII
模式字符型
RTU模式8位
(Hex)
帧头 “:”
从设备地址 0x05 “0”,“5” 0x05
功能码 0x10 “1”,“0” 0x10
起始地址
(高位)
0x00 “0”,“0” 0x00
起始地址
(低位)
0x13 “1”,“3” 0x13
寄存器数
(高位)
0x00 “0”,“0” 0x00
寄存器数
(低位)
0x03 “0”,“3” 0x03
差错校验 LRC(2字符) CRC(2字节)
帧尾 CR/LF
合计字节数 17 8

在实际开发过程中,功能码“16(0x10)写多个寄存器(Preset MultipleRegisters)”通常用于方便用户写入多字节类型的数据。

例如,假设从站设备地址为5,需要向保持寄存器写入一个32位(4字节)的浮点数,那么此浮点数将占用2个寄存器地址。假设浮点数将存放在40001和40002寄存器中,设定值为1.235(即0x3F9E 147A)实际的查询和响应报文如下(其中标记部分为设定的浮点数值,假设字节序为AB-CD,参考第5.3.7章字节序和大小端的内容)。

查询报文:05 10 00 00 00 02 04 3F 9E 14 7A 05 86

响应报文:05 10 00 00 00 02 40 4C

对于64位(8字节)的双精度浮点数,同理将占用4个寄存器地址共8字节的空间。特别需要注意的是字节序及大小端的问题,前面讨论过多字节存在大小端问题,因此主站设备和从站设备必须保持一致的规则处理,约定Modbus传输中的数据字段的字节序,否则会因为大小端不一致而产生数据处理错误。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 线圈
    +关注

    关注

    14

    文章

    1815

    浏览量

    44380
  • 寄存器
    +关注

    关注

    31

    文章

    5328

    浏览量

    120116
  • 功能码
    +关注

    关注

    0

    文章

    10

    浏览量

    2107
  • 报文
    +关注

    关注

    0

    文章

    38

    浏览量

    4017

原文标题:写多个线圈与写多个保持寄存器 - RZ MPU工业控制教程连载(35)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    NXP RC522 寄存器问题,哪位大神给点建议

    问题:寄存器 后再读取寄存器值;但读取的总是RC522 寄存器复位值(如TxControlReg 0x01,读出是0x80;试写过RC5
    发表于 12-29 02:32

    NI提供的modbus工具包功能测试结果,但是读线圈读不回来,多个寄存器也只能写进去起始地址那个是什么原因呢?

    我使用的是NI提供的modbus工具包,目前成功的是连读多个寄存器单个线圈单个寄存器;读
    发表于 07-20 08:59

    Modbus协议———常用功能码详解

    0x0032,读2个保持寄存器3)响应:数据存储顺序04H-读输入寄存器1)描述:读输入寄存器,字节指令操作,可读单个或者多个; 2)发送指
    发表于 08-02 19:47

    如何把库函数的文件和寄存器的文件结合起来用?

    库函数的文件 怎么样和 寄存器的文件 结合起来用啊?库函数的文件 怎么样和 寄存器的文件
    发表于 08-07 02:49

    无法理解Modbus RTU协议多个寄存器的这两个参数

    Modbus RTU协议多个寄存器的协议是下面这样描述的:针对这个协议我有几个问题,请教大家:1、其中请求PDU中的“寄存器数量”和“字节数”两个参数是不是冗余了?“字节数”不是可以
    发表于 05-07 10:43

    无法理解Modbus RTU协议多个寄存器的这两个参数!

    Modbus RTU协议多个寄存器的协议是下面这样描述的:针对这个协议我有几个问题,请教大家:1、其中请求PDU中的“寄存器数量”和“字节数”两个参数是不是冗余了?“字节数”不是可以
    发表于 05-07 15:21

    调试AD7124-8驱动时,对各寄存器配置之后再次读各寄存器的值,多个寄存器的值都为fffffffd是为什么?

    在调试AD7124-8驱动时,对各寄存器配置之后再次读各寄存器的值,多个寄存器的值都为fffffffd,这是为什么? 看参考程序里面对各寄存器
    发表于 12-07 08:29

    寄存器寻址方式

    寄存器寻址方式   寄存器寻址是对由指令选定的工作寄存器(R0--R7)进行读/,由指令操作码字节的最低3位指明所寻址的工作寄存器
    发表于 03-14 15:29 2781次阅读

    32位寄存器,32位寄存器是什么意思

    32位寄存器,32位寄存器是什么意思  从X8086开始学了一年,第一个ASM的程序就是变32换16进制的程序,不过现在叫我从新开始ASM程
    发表于 03-08 17:26 1.7w次阅读

    使用寄存器级读&控制基于PXI平台的FPGA

    本文以基于PXI平台的Marvin Test Solutions 3U FPGA板卡GX3500为设计对象,通过设计实例讲解如何使用寄存器级读&控制FPGA,并提供FPGA设计相关文件(如
    发表于 09-27 17:46 10次下载

    如何使用寄存器级读&控制基于PXI平台的FPGA

    如何使用寄存器级读&控制基于PXI平台的FPGA
    发表于 10-16 15:20 14次下载
    如何使用<b class='flag-5'>寄存器</b>级读&<b class='flag-5'>写</b>控制基于PXI平台的FPGA

    如何使用寄存器级读&控制基于PXI平台的FPGA

    如何使用寄存器级读&控制基于PXI平台的FPGA
    发表于 10-19 08:48 12次下载

    STM32系列MCU,寄存器Or利用固件库

    嵌入式的编程,往下说就是操作MCU的寄存器。而固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。相对于固件库的方式,直接寄存器
    的头像 发表于 08-09 17:22 7224次阅读
    STM32系列MCU,<b class='flag-5'>写</b><b class='flag-5'>寄存器</b>Or利用固件库

    寄存器阵列低功耗设计方案

    寄存器操作的时候会改变寄存器内容,需要时钟锁入新的数据。但是,对寄存器进行读操作的时候,寄存器内容不改变,
    的头像 发表于 12-08 11:19 579次阅读
    <b class='flag-5'>寄存器</b>阵列低功耗设计方案

    单个线圈与单个保持寄存器相关

    05功能码用于将单个线圈寄存器(或离散输入)设置为ON或OFF,该功能码支持广播模式在广播模式下,所有从站设备的同一地址的值将被统一修改。查询报文中的ON/OFF状态由报文数据字段的常数指定
    的头像 发表于 11-01 13:46 141次阅读