你好:
我试图与一个使用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,所以都在那里,但顺序错了。谁能解释一下为什么会这样,我需要做什么才能让它发送我想要的?
谢谢,
抢劫
把你的起始登记号码改成4097。这应该能解决问题。
我们在文档中使用基于1的寄存器映射,这是最常见的。Modbus传送基于0。一些设备在其文档中使用基于0的寻址。如果是这种情况,则需要在CRBasic中向寄存器号添加1以补偿差异。
非常感谢!我的想法是对的,但牌子错了:我试过4095。随着我学习更多关于MoveBytes,我想我可能也能弄清楚SerialOutBlock。
欢呼,罗伯