基于Java的TCP协议ModBus协议

基于Java的TCP协议ModBus协议,java,modbus-tcp,Java,Modbus Tcp,我有一个HLK-DIO16设备支持tcp上的modbus 在用户手册中,我看到了一个同时读取16位数字输入的示例 字符串为: 0x01030026000165c1 01设备地址 03功能代码 0026寄存器初始地址 0001登记号码 65c1 crc 在jlibmodus库中使用java代码 方法是 int[] registerValues = m.readHoldingRegisters(slaveId, offset, quantity); 3个变量的哪些参数值可以重现字符串 0x0103

我有一个HLK-DIO16设备支持tcp上的modbus

在用户手册中,我看到了一个同时读取16位数字输入的示例

字符串为:

0x01030026000165c1

01设备地址 03功能代码 0026寄存器初始地址 0001登记号码 65c1 crc

在jlibmodus库中使用java代码 方法是

int[] registerValues = m.readHoldingRegisters(slaveId, offset, quantity);
3个变量的哪些参数值可以重现字符串 0x01030026000165c1


编辑:以下答案仅适用于问题特定设备的串行Modbus RTU,该设备似乎不支持Modbus TCP(但它支持TCP端口8080上的不同十六进制协议)

以下是如何翻译这些不同的命名约定:

slaveId
=设备地址(
01

offset
=初始寄存器(从开始读取的位置),
0x0026
在上面的示例中,是38位小数

quantity
=要读取的寄存器数量(如果要读取1个寄存器,则应为
0001
,其中包括16个DI作为位)

函数代码
0x03
和CRC将在调用
readHoldingRegisters
时由库添加,因此您不必担心它们

因此,您可以:

int[] registerValues = m.readHoldingRegisters(1, 38, 1);
您应该在
registerValues
变量中获得这16位。例如,如果您得到:

registerValues=255


这意味着您的所有输入都设置为高(1)。

编辑:以下答案仅适用于问题特定设备的串行Modbus RTU,该设备似乎不支持Modbus TCP(但它支持TCP端口8080上的不同十六进制协议)

以下是如何翻译这些不同的命名约定:

slaveId
=设备地址(
01

offset
=初始寄存器(从开始读取的位置),
0x0026
在上面的示例中,是38位小数

quantity
=要读取的寄存器数量(如果要读取1个寄存器,则应为
0001
,其中包括16个DI作为位)

函数代码
0x03
和CRC将在调用
readHoldingRegisters
时由库添加,因此您不必担心它们

因此,您可以:

int[] registerValues = m.readHoldingRegisters(1, 38, 1);
您应该在
registerValues
变量中获得这16位。例如,如果您得到:

registerValues=255


这意味着您的所有输入都设置为高(1)。

谢谢您,Marcos。我尝试了它,但得到了“ModbusIOException:预期为6字节,但收到了0”。连接很好(isConnected()返回true)奇怪。。。我找不到你设备的手册。如果你有一份要分享,我可以看一看。有时,断开连接仅意味着您已正确创建客户端实例。你能ping设备并确保端口502是打开的吗?配置的端口是8080(使用默认的502连接会出现套接字异常,因为端口错误)。手册是我现在看到了错误,地址应该是十六进制数,而不是我写的整数。你能试着把26改成38(0x26=38十进制)吗?slaveID和quantity也应该是十六进制的,但是它们应该是相同的…它不能用十六进制转换。我尝试了偏移量上的for循环,尝试从1到100的值。。但没什么,这很奇怪,谢谢你,马科斯。我尝试了它,但得到了“ModbusIOException:预期为6字节,但收到了0”。连接很好(isConnected()返回true)奇怪。。。我找不到你设备的手册。如果你有一份要分享,我可以看一看。有时,断开连接仅意味着您已正确创建客户端实例。你能ping设备并确保端口502是打开的吗?配置的端口是8080(使用默认的502连接会出现套接字异常,因为端口错误)。手册是我现在看到了错误,地址应该是十六进制数,而不是我写的整数。你能试着把26改成38(0x26=38十进制)吗?slaveID和quantity也应该是十六进制的,但是它们应该是相同的…它不能用十六进制转换。我尝试了偏移量上的for循环,尝试从1到100的值。。但没什么,这很奇怪..那是jlibmodbus的哪个版本?在另一个手动驱动器中.google.com/file/d/…他们说modbus只通过RS接口。。对于TCP十六进制指令协议。。“hilink”的帮助让我发疯。。我向他们询问了一种通过wifi远程控制设备的方法,他们向我发送了modbus规范。。所以我需要十六进制协议规范?你认为我会通过tcp套接字发送hex吗?那是哪个版本的jlibmodbus?在另一个手动驱动器中。google.com/file/d/…他们说modbus只通过RS接口。。对于TCP十六进制指令协议。。“hilink”的帮助让我发疯。。我向他们询问了一种通过wifi远程控制设备的方法,他们向我发送了modbus规范。。所以我需要十六进制协议规范?你认为我会通过tcp套接字发送hex吗?