Java 使用Jamod写入modbus
在使用jamod向modbus写入数据时,我遇到了一个奇怪的情况。下面的读取代码非常有效:Java 使用Jamod写入modbus,java,modbus,Java,Modbus,在使用jamod向modbus写入数据时,我遇到了一个奇怪的情况。下面的读取代码非常有效: public static void main(String[] args) throws Exception { InetAddress address = InetAddress.getByName("host.somewhere"); TCPMasterConnection connection = new TCPMasterConnection(address); connect
public static void main(String[] args) throws Exception {
InetAddress address = InetAddress.getByName("host.somewhere");
TCPMasterConnection connection = new TCPMasterConnection(address);
connection.setPort(502);
connection.connect();
ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(0, 1);
ReadMultipleRegistersResponse response = (ReadMultipleRegistersResponse)
executeTransaction(connection, request);
}
private static ModbusResponse executeTransaction(TCPMasterConnection connection,
ModbusRequest request)
throws ModbusIOException, ModbusSlaveException, ModbusException {
ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);
transaction.setRequest(request);
transaction.execute();
return transaction.getResponse();
}
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
但尝试以类似的方式编写失败(Jamod尝试了3次,每次都遇到SocketTimeoutException,最后抛出ModbusException)
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
是的,我知道我正在使用请求对象的多寄存器版本,但我使用的设备只支持功能代码3和16
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
我还编写了rawsockettester来编写寄存器,据我所知,它工作正常。但在这两种情况下都使用jamod会很好
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
有没有人有使用jamod的经验,如果有人能告诉我我做错了什么,他会不会很仁慈?jamod的1.1和1.2rc1版本都会出现这种情况。或者这可能是某个特定于供应商的情况?最后,我编写了自己的modbus实现。我只需要支持2个不同的函数代码,所以实现很简单
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
尽管后来我发现了另一个用于java的开源modbus库。我想其他人也会遇到同样的问题,使用可能会有所帮助。我根据您的问题编写的方法有效
try {
ModbusTCPTransaction trans = null; // the transaction
String refe = "0";// HEX Address
int ref = Integer.parseInt(refe, 16);// Hex to int
// int count = 1; // the number Address to read
ReadMultipleRegistersRequest ainReq = new ReadMultipleRegistersRequest(
ref, count);
ReadMultipleRegistersResponse ainRes = new ReadMultipleRegistersResponse();
// 3. Start Transaction
trans = new ModbusTCPTransaction(con);
trans.setRetries(5);
trans.setReconnecting(true);
trans.setRequest(ainReq);
int k = 0;
do {
trans.execute();
ainRes = (ReadMultipleRegistersResponse) trans.getResponse();
Register reg = new SimpleRegister(ertekInt);
WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
new Register[]{reg});
System.out.println("Állított AOUT: " + request.getRegisterValue(k));
lista.add(createPlanet("AOUT",
"" + k + " " + request.getRegisterValue(k)));
k++;
} while (k < count);
} catch (ModbusIOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ModbusSlaveException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ModbusException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
试试看{
ModbusTCPTransaction trans=null;//事务
字符串refe=“0”;//十六进制地址
int ref=Integer.parseInt(refe,16);//十六进制到整数
//int count=1;//要读取的数字地址
ReadMultipleRegistersRequest ainReq=新的ReadMultipleRegistersRequest(
参考,计数);
ReadMultipleRegistersResponse ainRes=新的ReadMultipleRegistersResponse();
//3.启动交易
trans=新的ModbusTCPTransaction(con);
反式设置重试(5);
trans.setReconnecting(真);
传输设置请求(ainReq);
int k=0;
做{
trans.execute();
ainRes=(ReadMultipleRegistersResponse)trans.getResponse();
寄存器reg=新的简单寄存器(ertekInt);
WriteMultipleRegisterRequest=新的WriteMultipleRegisterRequest(0,
新寄存器[]{reg});
System.out.println(“llított AOUT:+request.getRegisterValue(k));
添加(createPlanet(“AOUT”),
“+k+”+request.getRegisterValue(k));
k++;
}而(k
我遇到了类似的问题,我试图在“设备作业”中定义为线圈寄存器的寄存器中写入一个值。所以我用了:
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
这就解决了问题。也许这有帮助
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
再见 默认情况下,Modbus请求的单位id为0。因此,必须将任何其他id设置为请求,例如:
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
WriteCoilRequest writeCoilRequest = new WriteCoilRequest(ref, bool);
writeCoilRequest.setUnitID(unitid);
浪费了几个小时试图解决您在问题中描述的相同问题。我在Android上遇到过这个问题
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)
由于此任务在等待外部设备响应时可能需要花费大量时间,因此我找到的解决方案是在另一个线程中执行写入和读取。我首先要确定这是jamod还是设备问题。你能试着用其他方法向设备写东西吗?是的,我能。我编写了一个测试程序,它使用tcp套接字来写入设备。至少在我的测试中,读套接字写寄存器返回最近写入它的值。(我使用了随机值,而不仅仅是零:)。我必须在一个较旧的(现在是2012…)jamod版本上做大量的工作才能让它工作。有一个更新的版本(如果你最近没有看过,请再看一次)可能更好地支持Modbus/TCP。我最终厌恶地举手,在SourceForge上用jamod创建了“j2mod”。这是我公司的设备附带的jamod的一个修复了很多错误的版本。另一件事是jamod不支持大量Modbus消息,所以我实现了我能找到的所有消息。你可以通过搜索“j2mod”在SourceForge上找到我的叉子。哇,一个5年前的问题的答案。很抱歉,我无法测试您的解决方案。但是,我已经多年没有访问过有问题的设备。我知道现在回答这个问题有点晚了,但我认为这可能对处于相同位置的其他人有用;)听起来很合理。然而,我无法测试这一点,但希望这能帮助一些人。
WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)