Modbus TCP в Java/Android

Я работаю над реализацией Modbus TCP на Java. На данный момент я пробовал 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 я постоянно получаю недопустимую ошибку slaveId при использовании «255», который является идентификатором устройства, который я использую в приведенной выше команде. Если я использую что-то еще, я получаю ошибку CRC failed. В mod4j я получаю различные ошибки, включая код ошибки = 4. Вот мой последний код J2mod, который возвращает либо ошибку CRC (если не 255), либо недопустимый slaveId. Я знаю, что slaveId в основном используется для последовательной связи, но мое устройство отвечает только на идентификатор устройства 255 при использовании других приложений.

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&е=Z1dxUv7qF4a9yAGpooHYBQ&USG=AFQjCNGGZnBx_A0fFjuW3qqgWjhS_ek-0W&BVM=bv.55617003,d.aWc»отн=


person Michael    schedule 30.10.2013    source источник
comment
Разве ID 255 обычно не является широковещательным ID? Можете ли вы попробовать переадресовать подчиненное устройство на что-то другое, например 1? На практике я никогда не видел, чтобы кто-нибудь использовал 255 в качестве подчиненного адреса Modbus. Не знаю, поможет ли это, но может быть что-то в ваших библиотеках не понравится «255».   -  person Nanomurf    schedule 12.11.2013
comment
Нет, блок 0 — это широковещательный адрес, за исключением ПЛК Modbus/TCP, которые обычно используют блок 0 для всех коммуникаций. Единственным (общим...) исключением является случай, когда ПЛК подключен через мост, и мост распределяет PDU между стороной соединения TCP/IP и какой-либо другой транспортной стороной.   -  person Julie in Austin    schedule 19.03.2014


Ответы (1)


Я не могу сказать, почему именно это происходит. Я могу вам сказать, что как jamod, так и j2mod (j2mod — ответвление jamod с исправленными ошибками) просто копируют все, что вы установили в качестве номера модуля, в 7-й байт TCP-пакета. Затем ПЛК должен ответить на пакет как отправленный.

Для j2mod установка системного свойства com.ghgande.modbus.debug равным «true» из командной строки JVM активирует отладочные сообщения. Это позволит вам просмотреть дамп пакетов, который должен сказать вам, что происходит.

Вы делаете один очень интересный комментарий, и он заключается в том, что вы видите ошибки CRC. Вы знаете, что Modbus/TCP вообще не использует CRC?

person Julie in Austin    schedule 19.03.2014