Java 使用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

在使用jamod向modbus写入数据时,我遇到了一个奇怪的情况。下面的读取代码非常有效:

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)