Java J2Mod基本主从问题

Java J2Mod基本主从问题,java,modbus,Java,Modbus,我正在尝试使用j2mod制作一个Modbus从站和主站(它的版本是1.0.6 tho,因此与另一个程序兼容) 我确实有一些关于我在网上找到的代码的一般性问题 我几乎没有找到任何有用的文档,所以我有点不知所措 TcpMaster this.addr = InetAddress.getByName("127.0.0.1"); conn = new TCPMasterConnection(addr); conn.setPort(port); con

我正在尝试使用
j2mod
制作一个Modbus从站和主站(它的版本是1.0.6 tho,因此与另一个程序兼容)

我确实有一些关于我在网上找到的代码的一般性问题

我几乎没有找到任何有用的文档,所以我有点不知所措

TcpMaster

this.addr = InetAddress.getByName("127.0.0.1");

conn = new TCPMasterConnection(addr);
        conn.setPort(port);
        conn.connect();

req = new ReadInputDiscretesRequest(ref, count);

trans = new ModbusTCPTransaction(conn);
        trans.setRequest(req);
        
        trans.execute();
res = (ReadInputDiscretesResponse) trans.getResponse();
TcpSlave

spi = new SimpleProcessImage();
spi.addDigitalOut(bitOut);

ModbusCoupler.getReference().setProcessImage(spi);
ModbusCoupler.getReference().setMaster(false);
ModbusCoupler.getReference().setUnitID(1);

addr = InetAddress.getByName("127.0.0.1");

listener = new ModbusTCPListener(3);
listener.setPort(port);
listener.setAddress(addr);
listener.setUnit(1);
listener.setListening(true);
listener.run();
所以现在我在trans.execute()上得到一个非法的数据地址错误
我的问题是:

请求上的两个参数究竟是什么

req = new ReadInputDiscretesRequest(ref, count);

我应该在哪里定义Master必须访问的
UnitId
(在Master类中)。

我希望我现在就来分享我的想法不会太晚。我有时也会感到困惑

对于您的第一个问题——“请求中的两个参数究竟是什么?”: 在标准Modbus设备上,数据存储在4个表中,每个表具有9999个值:

  • 线圈(离散输出线圈)-它们是读写的,内部地址从0000到270E。它们占用Modbus设备上的寄存器1-9999
  • 离散输入(离散输入触点)-它们是只读的,内部地址从0000到270E。它们占用Modbus设备上的寄存器10001-19999
  • 输入寄存器(模拟输入寄存器)-它们是只读的,内部地址从0000到270E。它们占用Modbus设备上的寄存器30001-39999
  • 保持寄存器(模拟输出寄存器)-它们是读写的,内部地址从0000到270E。它们占用Modbus设备上的寄存器40001-49999
  • 每个线圈(1)或触点(2)为1位(1字节)

    每个寄存器(3,4)为1个字或16位(2字节)

    回到您的问题,ref是您想要阅读的联系人(在您的案例中)。例如,如果您想读取编号为10001的第一个联系人,您将通过0(因为他们内部的地址是0000-270E)。第二个参数,count,是要读取的联系人数(位)。如果您只想读取联系人10001,则可以传递1(仅一个联系人)

    至于你的第二个问题,我不确定,因为我没有太多的J2mod经验

    通常在Modbus TCP/IP上,您有7个字节的MBAP头

    • 事务ID-2字节
    • 协议ID-2字节(对于Modbus为0000)
    • 长度-2字节-显示后面的字节数(包括单元ID)
    • 单元ID-1字节
    我会看看如何设置ID,然后再给你回复我的发现


    希望你正在进步

    首先谢谢你的支持,我自己解决了一些问题。我现在至少能读写线圈了。您关于数据存储方式的解释对我很有用,不过,谢谢:)