1

Java で modbus TCP の実装に取り​​組んでいます。これまでに、modbus4j、jamod、j2mod の 3 つの異なるライブラリを試しました。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 で、上記のコマンドで使用するユニット ID である「255」を使用すると、無効な slaveId エラーが継続的に発生します。他のものを使用すると、CRC 失敗エラーが発生します。mod4j では、エラー コード = 4 を含むさまざまなエラーが発生します。CRC エラー (255 でない場合) または無効な slaveId を返す最新の J2mod コードを次に示します。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.5561

4

1 に答える 1