J2Mod基本的Master和Slave问题

时间:2017-02-20 23:45:25

标签: java modbus

我正在尝试使用j2mod制作一个Modbus Slave和Master(它的版本是1.0.6 tho,因此它与另一个程序兼容),我对我在网上找到的代码有一些一般性的问题。

我发现几乎没有任何有用的文档,所以我有点无能为力。

TcpMaster

public void insertAllStudents(List<Student> students) {
    String sql = "INSERT INTO "+ StudentEntry.TABLE_NAME +" VALUES (?,?,?,?,?);";
    SQLiteDatabase db = this.getWritableDatabase();
    SQLiteStatement statement = db.compileStatement(sql);
    db.beginTransaction();
    for (Student student: students) {
        statement.clearBindings();
        statement.bindString(2, student.getId());
        statement.bindString(3, student.getFirstName());
        statement.bindString(4, student.getLastName());
        statement.bindLong(5, student.getBirthday());
        statement.execute();
    }
    db.setTransactionSuccessful();
    db.endTransaction();
}

TcpSlave

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();

所以现在我在trans.execute()上收到了非法数据地址错误 我的问题是:

Request

上的两个参数究竟是什么?
  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();

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

事先提前

1 个答案:

答案 0 :(得分:2)

我希望我能及时分享我对此的看法。我也觉得J2Mod有时会感到困惑。

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

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

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

    回到您的问题, 参考 是您想要阅读的联系人(在您的情况下)。例如,如果要读取编号为10001的第一个联系人,则会传递0(因为它们在内部被寻址为0000-270E)。第二个参数 count 是您要读取的联系人(位)数。如果您只想阅读联系人10001,那么您可以传递1(仅一个联系人)。

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

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

    • 交易ID - 2个字节
    • 协议ID - 2个字节(Modbus为0000)
    • 长度 - 2个字节 - 显示后面的字节数(包括单元ID)
    • 单位ID - 1个字节

    我将查看如何设置ID,并会根据我的发现回复您。

    希望你的进步!