It presents a basic protocol description and discusses the serial and the TCP based. To prevent confusion, the following directed relations describe Master-Slave in terms of the. Type: 16-bit word; Access: read-write; Visual. I need to write Modbus RTU master app in Java that support 03 - Read Holding Registers and 16 - Write Multiple Registers. I found three java libraries: jamod, j2mod, modbus4j.I try all of these libraries (I spend about 4 hours) and it still doesn't work.
Thread Starter
AJ
I am new to the Modbus and Jamod. My aim is to connect my java application with the meter (electrical device) and get the reading of the meter to be shown in my application.
We can set the IP address at the meter. So, i already set the ip address at the meter and being able to Ping and connect to it with my system. The only thing that i not being able to do is get the meter reading.
So, I do really hope, someone out there can help me solve this solution. Because it has been 3 weeks i stuck at this point.
Below is the code:
<pre>
String address = '10.168.168.197' //my device ip adress
try{
conn = new TCPMasterConnection(InetAddress.getByName(address));
conn.connect();
}catch (UnknownHostException e){
throw new ReaderConnectorException('IP is not reachabled.{' + address + '}', e);
}catch (Exception e){
throw new ReaderConnectorException(e.getMessage(), e);
}
ModbusTCPTransaction transaction = new ModbusTCPTransaction(conn);
transaction.setReconnecting(true);
ReadMultipleRegistersResponse response = null;
ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest();
request.setUnitID(1);
request.setReference(43085);
request.setWordCount(2);
try {
transaction.setRequest(request);
transaction.execute();
response = (ReadMultipleRegistersResponse) transaction.getResponse();
for (int n = 0; n < response.getWordCount(); n++) {
System.out.println('Word ' + n + '=' + response.getRegisterValue);
}
} catch (ModbusIOException e) {
e.printStackTrace();
} catch (ModbusSlaveException e) {
e.printStackTrace();
} catch (ModbusException e) {
e.printStackTrace();
}</pre>
and the output of the code is:
Word 0=32768
Word 1=32768
am i doing wrong somewhere ? All help will be appreciated. Thank you.
We can set the IP address at the meter. So, i already set the ip address at the meter and being able to Ping and connect to it with my system. The only thing that i not being able to do is get the meter reading.
So, I do really hope, someone out there can help me solve this solution. Because it has been 3 weeks i stuck at this point.
Below is the code:
<pre>
String address = '10.168.168.197' //my device ip adress
try{
conn = new TCPMasterConnection(InetAddress.getByName(address));
conn.connect();
}catch (UnknownHostException e){
throw new ReaderConnectorException('IP is not reachabled.{' + address + '}', e);
}catch (Exception e){
throw new ReaderConnectorException(e.getMessage(), e);
}
ModbusTCPTransaction transaction = new ModbusTCPTransaction(conn);
transaction.setReconnecting(true);
ReadMultipleRegistersResponse response = null;
ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest();
request.setUnitID(1);
request.setReference(43085);
request.setWordCount(2);
try {
transaction.setRequest(request);
transaction.execute();
response = (ReadMultipleRegistersResponse) transaction.getResponse();
for (int n = 0; n < response.getWordCount(); n++) {
System.out.println('Word ' + n + '=' + response.getRegisterValue);
}
} catch (ModbusIOException e) {
e.printStackTrace();
} catch (ModbusSlaveException e) {
e.printStackTrace();
} catch (ModbusException e) {
e.printStackTrace();
}</pre>
and the output of the code is:
Word 0=32768
Word 1=32768
am i doing wrong somewhere ? All help will be appreciated. Thank you.
CLI test for MODBUS RTU FC01 'Read Coils' with JAMOD
SerialCoilsTest.java
/** |
* Copyright 2002-2010 jamod development team |
* |
* Licensed under the Apache License, Version 2.0 (the 'License'); |
* you may not use this file except in compliance with the License. |
* You may obtain a copy of the License at |
* |
* http://www.apache.org/licenses/LICENSE-2.0 |
* |
* Unless required by applicable law or agreed to in writing, software |
* distributed under the License is distributed on an 'AS IS' BASIS, |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
* See the License for the specific language governing permissions and |
* limitations under the License. |
***/ |
packagenet.wimpi.modbus.cmd; |
importnet.wimpi.modbus.Modbus; |
importnet.wimpi.modbus.ModbusCoupler; |
importnet.wimpi.modbus.io.ModbusSerialTransaction; |
importnet.wimpi.modbus.msg.ReadCoilsRequest; |
importnet.wimpi.modbus.msg.ReadCoilsResponse; |
importnet.wimpi.modbus.net.SerialConnection; |
importnet.wimpi.modbus.util.BitVector; |
importnet.wimpi.modbus.util.SerialParameters; |
/** |
* Class that implements a simple commandline |
* tool for reading an analog input. |
* |
* @author Dieter Wimberger |
* @version @version@ (@date@) |
*/ |
publicclassSerialCoilsTest { |
publicstaticvoidmain(String[] args) { |
SerialConnection con =null; |
ModbusSerialTransaction trans =null; |
ReadCoilsRequest req =null; |
ReadCoilsResponse res =null; |
String portname =null; |
int unitid =0; |
int ref =0; |
int count =0; |
int repeat =1; |
try { |
// 1. Setup the parameters |
if (args.length <4) { |
printUsage(); |
System.exit(1); |
} else { |
try { |
portname = args[0]; |
unitid =Integer.parseInt(args[1]); |
ref =Integer.parseInt(args[2]); |
count =Integer.parseInt(args[3]); |
if (args.length 5) { |
repeat =Integer.parseInt(args[4]); |
} |
} catch (Exception ex) { |
ex.printStackTrace(); |
printUsage(); |
System.exit(1); |
} |
} |
// 2. Set slave identifier for master response parsing |
ModbusCoupler.getReference().setUnitID(unitid); |
System.out.println('net.wimpi.modbus.debug set to: '+System.getProperty('net.wimpi.modbus.debug')); |
// 3. Setup serial parameters |
SerialParameters params =newSerialParameters(); |
params.setPortName(portname); |
params.setBaudRate(9600); |
params.setDatabits(8); |
params.setParity('None'); |
params.setStopbits(1); |
params.setEncoding('rtu'); |
// params.setEcho(false); |
if (Modbus.debug) { |
System.out.println('Encoding ['+ params.getEncoding() +']'); |
} |
// 4. Open the connection |
con =newSerialConnection(params); |
con.open(); |
// 5. Prepare a request |
req =newReadCoilsRequest(ref, count); |
req.setUnitID(unitid); |
req.setHeadless(); |
if (Modbus.debug) { |
System.out.println('Request: '+ req.getHexMessage()); |
} |
// 6. Prepare the transaction |
trans =newModbusSerialTransaction(con); |
trans.setRequest(req); |
// 7. Execute the transaction repeat times |
int k =0; |
do { |
trans.execute(); |
res = (ReadCoilsResponse) trans.getResponse(); |
// if (Modbus.debug) { |
System.out.println('Response: '+ res.getHexMessage()); |
// } |
BitVector inputs = res.getCoils(); |
byte ret[] =newbyte[inputs.size()]; |
for (int i =0; i < count; i++) { |
System.out.println('Bit '+ i +' = '+ inputs.getBit(i)); |
} |
k++; |
} while (k < repeat); |
// 8. Close the connection |
con.close(); |
} catch (Exception ex) { |
ex.printStackTrace(); |
// Close the connection |
con.close(); |
} |
}// main |
privatestaticvoidprintUsage() { |
System.out.println( |
'java net.wimpi.modbus.cmd.SerialCoilsTest <portname [String]> <Unit Address [int8]> <register [int16]> <wordcount [int16]> {<repeat [int]>}'); |
}// printUsage |
}// class SerialAITest |
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment