BakeoutController-Basic  0.1
A Controller for the Omicron vacuum chamber
PVCiPressureGauge.java
1 package devices;
2 
3 import com.ghgande.j2mod.modbus.ModbusException;
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.ReadWriteMultipleRequest;
10 import org.jetbrains.annotations.Contract;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13 
14 import java.io.*;
15 
22 public class PVCiPressureGauge implements PressureGauge {
23 
28  private static final Logger log = LoggerFactory.getLogger(
29  PVCiPressureGauge.class);
30 
34  private static final Integer gaugePressureAddress = 154;
35 
42  private static final Integer gaugePressureWordsToRead = 2;
43 
49  private static final Integer unitIDAddress = 0;
50 
54  private static final Integer unitIDNumberofWords = 2;
55 
60  private final Integer address;
61 
65  private final ModbusConnector connection;
66 
74  public PVCiPressureGauge(Integer address, ModbusConnector connection)
75  throws IOException {
76  this.address = address;
77  this.connection = connection;
78  log.debug(
79  "Created PVCi pressure gauge with address {} and conn {}",
80  address, connection);
81 
82  try {
83  this.checkUnitID();
84  } catch (Exception error){
85  throw new IOException(error);
86  }
87  }
88 
99  @Override
100  public Float getPressure() throws WrappedModbusException,
101  ModbusException, IOException {
102  log.debug("Method to get pressure was called");
103 
104  ModbusRequest pressureRequest = getReadRegisterRequest(
105  gaugePressureAddress, gaugePressureWordsToRead
106  );
107  ModbusTransaction transaction = connection.getTransactionForRequest(
108  pressureRequest);
109  log.debug(
110  "PVCi Pressure gauge {} executing transaction {}",
111  this.toString(), transaction.toString());
112  transaction.execute();
113  ModbusMessage response = transaction.getResponse();
114  log.debug(
115  "Received response {} from transaction {}",
116  response.getHexMessage(), transaction.toString());
117 
118  return connection.parseFloatFromResponse(response);
119  }
120 
128  @Contract("_, _ -> !null")
129  private ReadWriteMultipleRequest getReadRegisterRequest(
130  Integer registerNumber, Integer numberofWordsToRead){
131  ReadWriteMultipleRequest request = new
132  ReadWriteMultipleRequest();
133 
134  request.setReadReference(registerNumber);
135  request.setReadWordCount(numberofWordsToRead);
136  request.setWriteReference(0);
137  request.setWriteWordCount(0);
138 
139  request.setUnitID(address);
140  request.setHeadless();
141 
142  return request;
143  }
144 
154  private void checkUnitID() throws WrappedModbusException,
155  ModbusException, IOException {
156  ModbusRequest request = getReadRegisterRequest(
157  unitIDAddress, unitIDNumberofWords
158  );
159 
160  ModbusTransaction transaction = connection.getTransactionForRequest(
161  request);
162 
163  log.info("Checking for device. Attempting to read unit ID using " +
164  "transaction {}", transaction);
165 
166  transaction.execute();
167 
168  log.info("Check Unit ID transaction successfully completed");
169 
170  ModbusMessage response = transaction.getResponse();
171 
172  log.debug("Received response {} from transaction {}",
173  response.getHexMessage(), transaction.toString());
174 
175  if (connection.parseStringFromResponse(response) == null){
176  throw new IOException(
177  "Unable to create pressure gauge. No response from unit"
178  );
179  }
180  }
181 }
ModbusTransaction getTransactionForRequest(ModbusRequest request)
String parseStringFromResponse(ModbusMessage response)
PVCiPressureGauge(Integer address, ModbusConnector connection)
Float parseFloatFromResponse(ModbusMessage response)
Git Repo