3 import com.ghgande.j2mod.modbus.io.ModbusSerialTransaction;
4 import com.ghgande.j2mod.modbus.io.ModbusTransaction;
5 import com.ghgande.j2mod.modbus.msg.ModbusMessage;
6 import com.ghgande.j2mod.modbus.msg.ModbusRequest;
7 import com.ghgande.j2mod.modbus.msg.ModbusResponse;
8 import com.ghgande.j2mod.modbus.net.SerialConnection;
10 import org.jetbrains.annotations.Contract;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13 import java.io.DataInput;
14 import java.io.ByteArrayInputStream;
15 import java.io.ByteArrayOutputStream;
16 import java.io.DataInputStream;
17 import java.io.DataOutputStream;
18 import java.io.IOException;
19 import java.io.DataOutput;
29 private static final Logger log = LoggerFactory.getLogger(
41 private PortShutdownThread portShutdownThread;
46 private SerialConnection connection;
48 private static final Integer recieveTimeOut = 4000;
50 private static final Integer numberOfRetries = 1;
57 return this.desiredPortConfiguration;
67 desiredPortConfiguration = portConfiguration;
77 if (connection == null){
80 return connection.isOpen();
90 removeShutdownThread();
107 "Creating transaction for request {}", request.getHexMessage()
111 log.debug(
"Port {} is not open. Opening now",
this);
113 log.debug(
"Port {} successfully opened",
this);
115 log.debug(
"Port {} is open, using for connection",
this);
117 connection.setTimeout(recieveTimeOut);
119 ModbusSerialTransaction transaction =
new ModbusSerialTransaction();
120 transaction.setSerialConnection(connection);
121 transaction.setRequest(request);
122 transaction.setRetries(numberOfRetries);
137 ClassCastException, IOException {
138 ModbusResponse inputRegistersResponse = (ModbusResponse) response;
139 ByteArrayOutputStream byteBuffer =
new ByteArrayOutputStream();
140 DataOutput writer =
new DataOutputStream(byteBuffer);
142 "Received response {}. Parsing to float",
143 inputRegistersResponse.toString()
146 inputRegistersResponse.writeData(writer);
148 byte[] dataToRead = processByteArray(byteBuffer.toByteArray());
150 DataInput reader =
new DataInputStream(
151 new ByteArrayInputStream(dataToRead)
154 return reader.readFloat();
170 ClassCastException, IOException {
171 ModbusResponse inputRegistersResponse = (ModbusResponse) response;
173 ByteArrayOutputStream byteBuffer =
new ByteArrayOutputStream();
174 DataOutput writer =
new DataOutputStream(byteBuffer);
176 "Received response {}. Parsing to string",
177 inputRegistersResponse.toString()
180 inputRegistersResponse.writeData(writer);
182 DataInput reader =
new DataInputStream(
183 new ByteArrayInputStream(byteBuffer.toByteArray())
186 return reader.readLine();
198 private void openConnection()
throws IllegalStateException,
199 WrappedModbusException {
201 assertHasPortConfiguration();
203 connection =
new SerialConnection(
207 createShutdownThread();
211 }
catch (Exception error){
212 throw new WrappedModbusException(error);
219 private void assertPortClosed()
throws IllegalStateException {
221 throw new IllegalStateException(
"MODBUS port is not open.");
229 private void assertHasPortConfiguration()
throws IllegalStateException {
230 if (desiredPortConfiguration == null){
231 throw new IllegalStateException(
232 "Attempted to open a port without configuration being set" 242 private void createShutdownThread(){
243 portShutdownThread =
new PortShutdownThread(connection);
244 Runtime.getRuntime().addShutdownHook(portShutdownThread);
251 private void removeShutdownThread(){
252 Runtime.getRuntime().removeShutdownHook(portShutdownThread);
277 @Contract(pure =
true)
278 private static byte[] processByteArray(byte[] inputBytes){
279 byte[] outputBytes =
new byte[inputBytes.length - 1];
281 for (
int index = 0; index < outputBytes.length; index++){
282 outputBytes[index] = inputBytes[
283 inputBytes.length - 1 - index
294 private class PortShutdownThread
extends Thread {
298 private final Logger log = LoggerFactory.getLogger
299 (PortShutdownThread.class);
304 private final SerialConnection connection;
309 public PortShutdownThread(SerialConnection connection){
310 this.connection = connection;
318 log.info(
"Connection {} caught shutdown signal. Closing",
319 connection.toString());
321 log.info(
"MODBUS Connection {} successfully closed",
322 connection.toString());
ModbusTransaction getTransactionForRequest(ModbusRequest request)
ModbusPortConfiguration getPortConfiguration()
void setPortConfiguration(ModbusPortConfiguration portConfiguration)
String parseStringFromResponse(ModbusMessage response)
SerialParameters getSerialParameters()
Float parseFloatFromResponse(ModbusMessage response)