找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1103|回复: 8
收起左侧

MODBUS功能码01与05的疑问

[复制链接]
ID:497468 发表于 2023-9-11 21:36 | 显示全部楼层 |阅读模式
   最近搞了个MODBUS的控制器控制输出继电器,阅读了01和05的功能码后,有点搞不明白了, 01和05都是位控制的,为何05的地址是一个字节呢?
如用05强制一个地址,发送指令为:01 05 00 01 00 00 9C 0A  从机01的01所对应的寄存器置0, 05发送置1为FF00 置0为0000,这个地址默认有8个位,如果按位来算,那是用哪个位?还是说05指令对应的就是一个地址代表一个线圈,和01的位不一样?求解!
回复

使用道具 举报

ID:497468 发表于 2023-9-12 09:06 | 显示全部楼层
昨晚又在网上查了资料,不知道我的理解对不, 正常01的地址包括16个位,如果用05来打开和关闭的话,05就是按位来算的,只是他以数量来计,并不以寄存器地址来计算。 例 :我要打开第100个继电器,那我的转换成实际的寄存器值 ,100/16=6 余4 实际上要打开的地址在05寄存器的第4位?(应该从00寄存器开始吧,) 如果 是这样的话,那01和05控制的地方就相同了,不知道理解对不对,请高手指点。
回复

使用道具 举报

ID:1010435 发表于 2023-9-12 09:52 | 显示全部楼层
01和05功能码的前提不就是8位地址吗?
回复

使用道具 举报

ID:1065084 发表于 2023-9-12 10:10 | 显示全部楼层
01不是读线圈05不是写线圈吗?你就按照格式来就好了,不用管内部机理的,内部有数据转换的。线圈也要占用一个地址的,难道16个线圈用一个地址吗?
回复

使用道具 举报

ID:497468 发表于 2023-9-12 10:27 | 显示全部楼层
还我还是理解错了,以为是16位, 按现在的说的8位来算,假如我要打开第32个继电器,是否是发送01 05 00 20 00 00 CC 00    实际的寄存器地址为 03寄存器的第8位呢? 相当于说寄存器地址是从00的第0位开始,一直累加,这样理解对吗?
回复

使用道具 举报

ID:497468 发表于 2023-9-12 10:45 | 显示全部楼层
就这是我迷茫的地方,因为协议要自己写,所以一开始先写01的,把自己的绕进去了,按楼上大侠 的意思,一个输出继电器就占用一个地址,比如说我用u8 out[100] 这个数组来存放继电器状态,每一个地址对应一个继电器,我用05的时候就直接对相应的地址操作就行了,但如果用01来读的时候,我要把数组中8个位的状态合并成一个字节再发出来,是这样吗?
回复

使用道具 举报

ID:94031 发表于 2023-9-12 11:13 | 显示全部楼层
这和你硬件连接有关,如果你一个地址接了8个开关量你就读写8位,你接了16个开关量你就读写16位.
回复

使用道具 举报

ID:497468 发表于 2023-9-12 22:52 | 显示全部楼层
感谢各位的回贴,现在按照05执行一个地址,01读8个位,经过测试,效果可以。再次感谢!
回复

使用道具 举报

ID:420836 发表于 2023-9-13 10:20 | 显示全部楼层
Modbus功能码1可以读取多个线圈的值。 Modbus功能码5写入单个线圈值,值0x0000表示OFF,值0xFF00表示ON
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表