标题:
MODBUS功能码01与05的疑问
[打印本页]
作者:
ne5532
时间:
2023-9-11 21:36
标题:
MODBUS功能码01与05的疑问
最近搞了个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的位不一样?求解!
作者:
ne5532
时间:
2023-9-12 09:06
昨晚又在网上查了资料,不知道我的理解对不, 正常01的地址包括16个位,如果用05来打开和关闭的话,05就是按位来算的,只是他以数量来计,并不以寄存器地址来计算。 例 :我要打开第100个继电器,那我的转换成实际的寄存器值 ,100/16=6 余4 实际上要打开的地址在05寄存器的第4位?(应该从00寄存器开始吧,) 如果 是这样的话,那01和05控制的地方就相同了,不知道理解对不对,请高手指点。
作者:
mtt661
时间:
2023-9-12 09:52
01和05功能码的前提不就是8位地址吗?
作者:
yuxuesuixing
时间:
2023-9-12 10:10
01不是读线圈05不是写线圈吗?你就按照格式来就好了,不用管内部机理的,内部有数据转换的。线圈也要占用一个地址的,难道16个线圈用一个地址吗?
作者:
ne5532
时间:
2023-9-12 10:27
还我还是理解错了,以为是16位, 按现在的说的8位来算,假如我要打开第32个继电器,是否是发送01 05 00 20 00 00 CC 00 实际的寄存器地址为 03寄存器的第8位呢? 相当于说寄存器地址是从00的第0位开始,一直累加,这样理解对吗?
作者:
ne5532
时间:
2023-9-12 10:45
就这是我迷茫的地方,因为协议要自己写,所以一开始先写01的,把自己的绕进去了,按楼上大侠 的意思,一个输出继电器就占用一个地址,比如说我用u8 out[100] 这个数组来存放继电器状态,每一个地址对应一个继电器,我用05的时候就直接对相应的地址操作就行了,但如果用01来读的时候,我要把数组中8个位的状态合并成一个字节再发出来,是这样吗?
作者:
xuyaqi
时间:
2023-9-12 11:13
这和你硬件连接有关,如果你一个地址接了8个开关量你就读写8位,你接了16个开关量你就读写16位.
作者:
ne5532
时间:
2023-9-12 22:52
感谢各位的回贴,现在按照05执行一个地址,01读8个位,经过测试,效果可以。再次感谢!
作者:
TTQ001
时间:
2023-9-13 10:20
Modbus功能码1可以读取多个线圈的值。 Modbus功能码5写入单个线圈值,值0x0000表示OFF,值0xFF00表示ON
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1