我们的全部技术支持人员不监督这个论坛。如果您需要我们工作人员的帮助,请从“问一个问题”页面提交你的问题


登录注册在论坛上发表/回复。

Modbus / CR1000


rwc 2017年6月29日07:24 PM

你好:

我试图与一个使用Modbus的波传感器通信,但我无法得到正确的弦到它。我在谷歌上搜遍了所有的文档,但都没有成功,我希望这里有人能给我一些提示。它通过RS232转换器使用RTU协议,使用大端。

这里有一个例子:

Modbus地址(1)存储在一个单一寄存器的起始寄存器0x1000(即4096)的输入寄存器(函数4)中。我们的要求是:

01 04 10 000 01 35 0a

...如果我通过终端程序发送它它返回01 04 02 00 01 78 F0(地址,1,是倒数第三个字节)。

我已经尝试使用ModbusMaster命令,这里有一个简单的程序来做:

公共ModbusResult
公共Modbus(1) As Long

数据表(波,真的,1)
DataInterval(0 10秒,10)
样本(1、Modbus (1) FP2)
EndTable

BeginProg
SerialOpen (COM2 9600 3 0, 1000)
扫描(10秒1,0)
ModbusMaster (ModbusResult、COM2 9600 1, 4, Modbus(), 4096年,3100年,1)
CallTable波
NextScan
EndProg

...发出01 04 0F FF 00 01 02 EE;我已经尝试了其他ModbusOptions设置,以确保我没有那个错误。我在想,我一定是对起始寄存器的偏移错误,并且尝试了一些有根据的猜测,但没有成功。我遗漏了什么?

OK说,也许我可以通过SerialOutBlock来做。这可能更可取,因为很多数据是不同格式(浮点和u16)的混合,具有不同的偏移量,因此必须手动提取和转换。所以我试着这样做:

Public MBstring作为字符串
MBoutstr为字符串

数据表(测试,真的,1)
DataInterval(0 10秒,10)
样本(1 MBstring FP2)
EndTable

BeginProg
SerialOpen (COM2 9600 3 0, 1000)
扫描(10秒1,0)
MBoutstr =科(&h01) +装备(&h04) +装备(h10) +装备(&h00) +装备(&h00) +装备(&h01) +装备(&h35) +装备(&h0A)
SerialOutBlock (Com2 MBoutstr 8)
SerialIn (MBstring、com2, -1100)
CallTable测试
NextScan
EndProg

....这是发送01 04 10 01 35 0A 00 000,所以都在那里,但顺序错了。谁能解释一下为什么会这样,我需要做什么才能让它发送我想要的?

谢谢,

抢劫


JDavis 2017年6月29日08:14 PM

把你的起始登记号码改成4097。这应该能解决问题。

我们在文档中使用基于1的寄存器映射,这是最常见的。Modbus传送基于0。一些设备在其文档中使用基于0的寻址。如果是这种情况,则需要在CRBasic中向寄存器号添加1以补偿差异。


rwc 2017年6月29日晚上10:32

非常感谢!我的想法是对的,但牌子错了:我试过4095。随着我学习更多关于MoveBytes,我想我可能也能弄清楚SerialOutBlock。

欢呼,罗伯

登录注册在论坛上发表/回复。
Baidu