我正在爪哇上进行Modbus TCP实现。到目前为止,我已经尝试了3个不同的库modbus4j、jamod和j2mod。我可以使用Linux modpoll工具成功访问我的从属设备:http://www.modbusdriver.com/modpoll.html

michael@michael-G75VW:~/Documents/modbus-test-tool/linux$ ./modpoll -a255 -r1 -1        192.168.1.101
modpoll 3.4 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright (c) 2002-2013 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: MODBUS/TCP
Slave configuration...: address = 255, start reference = 1, count = 1
Communication.........: 192.168.1.101, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, output (holding) register table

-- Polling slave...
[1]: 256

这导致我的设备上的障碍物上升,这很好。但是,在Java实现中,我无法重现这一点。我试过很多不同的步骤,但都失败了。在j2mod/jamod中,当使用“255”时,我不断地得到一个无效的slaveid错误,这是我在上面的命令中使用的单元id。如果我使用其他任何东西,我会得到一个crc失败错误。在mod4j中,我得到了各种错误,包括错误代码=4。这是我最新的J2mod代码,它返回CRC错误(如果不是255)或无效的slaveid。我知道slaveid主要用于串行通信,但是当使用其他应用程序时,我的设备只响应255的单位id。
Integer value = Integer.decode(val).intValue();
    Integer unitID = Integer.decode(uid).intValue();
    Integer length = Integer.decode(len).intValue();
    Integer ref = Integer.decode(reference).intValue();
    SimpleRegister MyReg = new SimpleRegister(value);
    try {
        InetAddress address;
        address = InetAddress.getByName(addr);
        //2. Open the connection
        TCPMasterConnection con = new TCPMasterConnection(address);
        con.setPort(port);
        con.connect();
        //3. Prepare the requestWrite
        WriteSingleRegisterRequest WriteReq = new WriteSingleRegisterRequest(ref,MyReg);
        WriteReq.setDataLength(length);
        WriteReq.setUnitID(unitID);
        //4. Prepare the transaction
        ModbusTCPTransaction trans = new ModbusTCPTransaction(con);
        trans.setRequest(WriteReq);
        trans.setRetries(0);
        trans.execute();
        Log.d(TAG, "Complete: " +trans.toString());
        return trans.getResponse().getHexMessage();
    } catch (UnknownHostException e) {
        Log.d(TAG, "UnknownHostException: " + e.getMessage());
        return e.getMessage();
    } catch (Exception e) {
        Log.d(TAG,"Exception: " + e.toString());
        return e.getMessage();
    }

我的modbus接口手册如下:
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCsQFjAA&url=http%3A%2F%2Fwww.ac-magnetic.com%2Fgermany%2Fsites%2Fdefault%2Ffiles%2F58150001EN_00_Technical%2520Maunal%2520EM01.pdf&ei=Z1dxUv7qF4a9yAGpooHYBQ&usg=AFQjCNGGZnBx_A0fFjuW3qqgWjhS_ek-0w&bvm=bv.55617003,d.aWc

最佳答案

我说不清为什么会发生这种事。我可以告诉您,jamod和j2mod(j2mod是jamod的一个bug修复分叉)只需将设置为单元号的内容复制到tcp包的第7个字节。然后由plc对发送的数据包做出响应。
对于j2mod,从jvm命令行将系统属性com.ghgande.modbus.debug设置为“true”将启用调试消息。这将允许您查看应该告诉您发生了什么的数据包转储。
您确实做了一个非常有趣的评论,那就是您看到了crc错误。你知道modbus/tcp根本不使用crc吗?

08-03 19:52