我正在尝试使用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类中)
事先提前答案 0 :(得分:2)
我希望我能及时分享我对此的看法。我也觉得J2Mod有时会感到困惑。
对于您的第一个问题 - &#34;请求中的两个参数究竟是什么?&#34;: 在标准Modbus设备上,数据存储在4个表中,每个表有9999个值:
每个线圈(1)或联系人(2)为1位(1个字节)。
每个寄存器(3,4)为1个字或16位(2个字节)。
回到您的问题, 参考 是您想要阅读的联系人(在您的情况下)。例如,如果要读取编号为10001的第一个联系人,则会传递0(因为它们在内部被寻址为0000-270E)。第二个参数 count 是您要读取的联系人(位)数。如果您只想阅读联系人10001,那么您可以传递1(仅一个联系人)。
至于你的第二个问题,我不确定,因为我没有很多J2mod的经验。
通常在Modbus TCP / IP上,您有MBAP标头,即7个字节。
我将查看如何设置ID,并会根据我的发现回复您。
希望你的进步!