Я работаю над реализацией 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»отн=