3050311118 发表于 2015-7-31 13:51:28

modbus功能吗04读取数值,我自定义的比如读取30001这个地址

我看了下基本是读取一个地址后,从机反馈好像都是该地址的一个数据。
因为很多从机类型并不是一样的,变量数量等,所以不能确定有几个寄存器
我想自定义为
比如我想把读30001这个地址作为一个命令值,从机反馈的数据并不是一个值,而是很多自定义的值,但总体还是按照modbus的一帧数据规则。

我想这么做可不可以?会不会跟其他组态软件,或者其他的平台做的modbus上位机程序兼容性问题??

R8C 发表于 2015-7-31 14:06:21

你是做主机还是从机?

3050311118 发表于 2015-7-31 14:36:40

R8C 发表于 2015-7-31 14:06
你是做主机还是从机?

我弄的是从机,我想会不会这样会有问题

R8C 发表于 2015-7-31 14:56:40

modbus功能码04其实是区分回调函数(04:读写 03:仅读 )你如果改了回调函数把30001这个地址作为一个命令值当然无问题

R8C 发表于 2015-7-31 14:59:03

上位机程序兼容性的解决:上位机程序用3x指令就可以了

embeddev_1 发表于 2015-7-31 15:35:56

类似30001地址只能返回16位整型值,如果是浮点数之类的,是占据2个字,也就是30001-30002 {:biggrin:}

R8C 发表于 2015-7-31 16:54:40

是16位的,对

qjs412_avr 发表于 2015-7-31 19:39:09

楼主这样做,就不是标准的MODBUS协议了吧;感觉就是套用了modbus的框架,如果是这样的话,肯定和其他标准设备无法互联

另外感觉楼主没有完全理解modbus协议,读寄存器也可以连续读取多个值

编辑原因:修改错字

3050311118 发表于 2015-7-31 21:15:46

qjs412_avr 发表于 2015-7-31 19:39
楼主这样做,就不是标准的MODBUS协议了吧;感觉就是套用了modbus的框架,如果是这样的话,肯定和其他标准设 ...

我知道可以读多个值的,但是目标地址的寄存器数量不确定啊

3050311118 发表于 2015-7-31 21:16:33

qjs412_avr 发表于 2015-7-31 19:39
楼主这样做,就不是标准的MODBUS协议了吧;感觉就是套用了modbus的框架,如果是这样的话,肯定和其他标准设 ...

我想发个命令过去就全部把数据都返回回来

chishangpiao 发表于 2015-7-31 22:16:16

那就让一个地址返回当前的数量再去读一次,我就是这么干的,当然是被逼的,n个丛鸡有n个通道,具体多少不确定,但只读传感器工作的通道值,我就在让丛鸡在一个地址上放了当前的工作通道信息,主机解析后再去读,虽然没办法,但都是被逼的

qjs412_avr 发表于 2015-8-1 10:49:52

3050311118 发表于 2015-7-31 21:15
我知道可以读多个值的,但是目标地址的寄存器数量不确定啊

楼主的意思是在一个地址下有多个数据,例如:地址:30001,内容有n个字节(n>2)?是这意思吗?

如果是这样的话,那就不再是标准的modbus协议了,个人理解:同一个地址,不能存放大于2byte的数据

我倒是觉得数据再多,也可以按照地址存放,然后按照地址读取就是了。什么地址放什么内容,你自己定义的。

你可以将一次读取的数据按照连续地址存放,然后发送读取多个寄存器的命令,同样达到了效果。这样做最起码兼容标准modbus协议。

3050311118 发表于 2015-8-1 20:48:49

qjs412_avr 发表于 2015-8-1 10:49
楼主的意思是在一个地址下有多个数据,例如:地址:30001,内容有n个字节(n>2)?是这意思吗?

如果是这 ...

恩差差不多,主要是从机有好几类,不知道从机的寄存器数量。但是上位机只要发个命令,从机就反馈对应数量的数据,内含机器类型,上位机再通过机器类型来解析数据

R8C 发表于 2015-8-1 21:03:54

标准modbus协议,你怎么用是你的问题,一样对的

lingdianhao 发表于 2015-8-1 22:26:23

没明白你的意思,建议看看Modbus规约。
页: [1]
查看完整版本: modbus功能吗04读取数值,我自定义的比如读取30001这个地址