Skip to content

Commit f4b56a9

Browse files
authored
Merge pull request #532 from hivemq/bugfix/24802-modbus-multiple-registers/latest
[latest] modbus-multiple-registers
2 parents 2ad8bd9 + a606123 commit f4b56a9

25 files changed

+397
-324
lines changed

modules/hivemq-edge-module-modbus/src/main/java/com/hivemq/edge/adapters/modbus/IModbusClient.java

Lines changed: 0 additions & 39 deletions
This file was deleted.

modules/hivemq-edge-module-modbus/src/main/java/com/hivemq/edge/adapters/modbus/ModBusUtils.java

Lines changed: 0 additions & 122 deletions
This file was deleted.

modules/hivemq-edge-module-modbus/src/main/java/com/hivemq/edge/adapters/modbus/ModbusProtocolAdapter.java

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public class ModbusProtocolAdapter implements PollingProtocolAdapter<ModbusToMqt
5959
private final @NotNull ProtocolAdapterState protocolAdapterState;
6060
private final @NotNull AdapterFactories adapterFactories;
6161

62-
private volatile @Nullable IModbusClient modbusClient;
62+
private volatile @Nullable ModbusClient modbusClient;
6363
private final @NotNull Map<ModbusToMqttMapping, List<DataPoint>> lastSamples = new HashMap<>();
6464

6565
public ModbusProtocolAdapter(
@@ -78,7 +78,7 @@ public void start(
7878
try {
7979
initConnection();
8080
output.startedSuccessfully();
81-
} catch (Exception e) {
81+
} catch (final Exception e) {
8282
output.failStart(e, "Exception during setup of Modbus client.");
8383
}
8484

@@ -90,7 +90,7 @@ public void stop(@NotNull final ProtocolAdapterStopInput input, @NotNull final P
9090
if (modbusClient != null) {
9191
modbusClient.disconnect();
9292
}
93-
} catch (Exception e) {
93+
} catch (final Exception e) {
9494
output.failStop(e, "Error encountered closing connection to Modbus device.");
9595
return;
9696
}
@@ -119,7 +119,7 @@ public void poll(
119119
} else {
120120
pollingOutput.fail(new IllegalStateException("client not initialised"),"The client is not initialised.");
121121
}
122-
} catch (Exception e) {
122+
} catch (final Exception e) {
123123
pollingOutput.fail(e, null);
124124
}
125125
}
@@ -140,14 +140,14 @@ public int getMaxPollingErrorsBeforeRemoval() {
140140
}
141141

142142

143-
private @NotNull IModbusClient initConnection() {
143+
private @NotNull ModbusClient initConnection() {
144144
if (modbusClient == null) {
145145
synchronized (lock) {
146146
if (modbusClient == null) {
147147
if (log.isTraceEnabled()) {
148148
log.trace("Creating new instance of Modbus Client with {}.", adapterConfig);
149149
}
150-
modbusClient = new ModbusClient(adapterConfig);
150+
modbusClient = new ModbusClient(adapterConfig, adapterFactories.dataPointFactory());
151151
}
152152
}
153153
}
@@ -162,7 +162,7 @@ public int getMaxPollingErrorsBeforeRemoval() {
162162

163163
@Override
164164
public void discoverValues(
165-
@NotNull ProtocolAdapterDiscoveryInput input, @NotNull ProtocolAdapterDiscoveryOutput output) {
165+
@NotNull final ProtocolAdapterDiscoveryInput input, @NotNull final ProtocolAdapterDiscoveryOutput output) {
166166
//-- Do the discovery of registers and coils, only for root level
167167
final NodeTree nodeTree = output.getNodeTree();
168168
if (input.getRootNode() == null) {
@@ -199,13 +199,13 @@ protected void captureDataSample(final @NotNull ModBusData modBusData, @NotNull
199199
pollingOutput.finish();
200200
}
201201

202-
private void calculateDelta(@NotNull ModBusData modBusData, @NotNull PollingOutput pollingOutput) {
203-
ModbusToMqttMapping subscription =
202+
private void calculateDelta(@NotNull final ModBusData modBusData, @NotNull final PollingOutput pollingOutput) {
203+
final ModbusToMqttMapping subscription =
204204
(ModbusToMqttMapping) modBusData.getPollingContext();
205205

206-
List<DataPoint> previousSampleDataPoints = lastSamples.put(subscription, modBusData.getDataPoints());
207-
List<DataPoint> currentSamplePoints = modBusData.getDataPoints();
208-
List<DataPoint> delta = AdapterDataUtils.mergeChangedSamples(previousSampleDataPoints, currentSamplePoints);
206+
final List<DataPoint> previousSampleDataPoints = lastSamples.put(subscription, modBusData.getDataPoints());
207+
final List<DataPoint> currentSamplePoints = modBusData.getDataPoints();
208+
final List<DataPoint> delta = AdapterDataUtils.mergeChangedSamples(previousSampleDataPoints, currentSamplePoints);
209209
if (log.isTraceEnabled()) {
210210
log.trace("Calculating change data old {} samples, new {} sample, delta {}",
211211
previousSampleDataPoints != null ? previousSampleDataPoints.size() : 0,
@@ -218,25 +218,21 @@ private void calculateDelta(@NotNull ModBusData modBusData, @NotNull PollingOutp
218218
}
219219
}
220220

221-
protected @NotNull ModBusData readRegisters(@NotNull final PollingContext sub) {
221+
protected @NotNull ModBusData readRegisters(final @NotNull ModbusToMqttMapping modbusToMqttMapping) {
222222
try {
223-
ModbusToMqttMapping subscription = (ModbusToMqttMapping) sub;
224-
AddressRange addressRange = subscription.getAddressRange();
225-
Short[] registers = modbusClient.readHoldingRegisters(addressRange.startIdx,
226-
addressRange.endIdx - addressRange.startIdx);
227-
ModBusData data = new ModBusData(subscription, adapterFactories.dataPointFactory());
228-
//add data point per register
229-
for (int i = 0; i < registers.length; i++) {
230-
data.addDataPoint("register-" + (addressRange.startIdx + i), registers[i]);
231-
}
223+
final AddressRange addressRange = modbusToMqttMapping.getAddressRange();
224+
final DataPoint dataPoint = modbusClient.readHoldingRegisters(addressRange.startIdx,
225+
addressRange.nrRegistersToRead, modbusToMqttMapping.getDataType());
226+
final ModBusData data = new ModBusData(modbusToMqttMapping);
227+
data.addDataPoint(dataPoint);
232228
return data;
233-
} catch (Exception e) {
229+
} catch (final Exception e) {
234230
throw new RuntimeException(e);
235231
}
236232
}
237233

238234
private static void addAddresses(
239-
@NotNull NodeTree tree, @NotNull String parent, int startIdx, int count, int groupIdx) {
235+
@NotNull final NodeTree tree, @NotNull final String parent, final int startIdx, final int count, final int groupIdx) {
240236

241237
String parentNode = parent;
242238
if (groupIdx < count) {

modules/hivemq-edge-module-modbus/src/main/java/com/hivemq/edge/adapters/modbus/ModbusProtocolAdapterFactory.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import com.hivemq.adapter.sdk.api.factories.ProtocolAdapterFactory;
2222
import com.hivemq.adapter.sdk.api.model.ProtocolAdapterInput;
2323
import com.hivemq.adapter.sdk.api.config.ProtocolAdapterConfig;
24+
import com.hivemq.edge.adapters.modbus.config.AddressRange;
2425
import com.hivemq.edge.adapters.modbus.config.ModbusAdapterConfig;
26+
import com.hivemq.edge.adapters.modbus.config.ModbusDataType;
2527
import com.hivemq.edge.adapters.modbus.config.ModbusToMqttConfig;
2628
import com.hivemq.edge.adapters.modbus.config.ModbusToMqttMapping;
2729
import com.hivemq.edge.adapters.modbus.config.legacy.LegacyModbusAdapterConfig;
@@ -102,7 +104,8 @@ public ModbusProtocolAdapterFactory(final boolean writingEnabled) {
102104
context.getIncludeTimestamp(),
103105
context.getIncludeTagNames(),
104106
context.getLegacyProperties(),
105-
context.getAddressRange()))
107+
new AddressRange(context.getAddressRange().startIdx, context.getAddressRange().endIdx - context.getAddressRange().startIdx),
108+
ModbusDataType.INT_32))
106109
.collect(Collectors.toList());
107110

108111
final ModbusToMqttConfig modbusToMqttConfig =

modules/hivemq-edge-module-modbus/src/main/java/com/hivemq/edge/adapters/modbus/config/AddressRange.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
2020
import com.hivemq.adapter.sdk.api.annotations.ModuleConfigField;
2121

22-
@JsonPropertyOrder({"startIdx", "endIdx"})
22+
@JsonPropertyOrder({"startIdx", "nrRegistersToRead"})
2323
public class AddressRange {
2424

2525
@JsonProperty(value = "startIdx", required = true)
@@ -30,18 +30,18 @@ public class AddressRange {
3030
required = true)
3131
public final int startIdx;
3232

33-
@JsonProperty(value = "endIdx", required = true)
34-
@ModuleConfigField(title = "End Index",
35-
description = "The Finishing Index (Excl.) of the Address Range",
33+
@JsonProperty(value = "nrRegistersToRead", required = true)
34+
@ModuleConfigField(title = "# of registers to read",
35+
description = "Number of registers to read",
3636
numberMin = 1,
3737
numberMax = ModbusAdapterConfig.PORT_MAX,
3838
required = true)
39-
public final int endIdx;
39+
public final int nrRegistersToRead;
4040

4141
public AddressRange(
4242
@JsonProperty(value = "startIdx", required = true) final int startIdx,
43-
@JsonProperty(value = "endIdx", required = true) final int endIdx) {
43+
@JsonProperty(value = "nrRegistersToRead", required = true) final int nrRegistersToRead) {
4444
this.startIdx = startIdx;
45-
this.endIdx = endIdx;
45+
this.nrRegistersToRead = nrRegistersToRead;
4646
}
4747
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.hivemq.edge.adapters.modbus.config;
2+
3+
public enum ModbusDataType {
4+
INT_16,
5+
UINT_16,
6+
INT_32,
7+
UINT_32,
8+
INT_64,
9+
FLOAT_32,
10+
UTF_8
11+
}

0 commit comments

Comments
 (0)