Skip to content

Commit 3bc040b

Browse files
committed
Experiments
1 parent 984de60 commit 3bc040b

File tree

3 files changed

+82
-26
lines changed

3 files changed

+82
-26
lines changed

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ private void calculateDelta(@NotNull final ModBusData modBusData, @NotNull final
209209
final @NotNull ModbusClient modbusClient) {
210210
final AddressRange addressRange = modbusToMqttMapping.getAddressRange();
211211

212-
return doRead(addressRange.startIdx, modbusToMqttMapping.getDataType().nrOfRegistersToRead, addressRange.unitId, modbusToMqttMapping.getDataType(), addressRange.readType, modbusClient)
212+
return doRead(addressRange.startIdx, addressRange.unitId, modbusToMqttMapping.getDataType(), addressRange.readType, modbusClient)
213213
.thenApply(dataPoint -> {
214214
final ModBusData data = new ModBusData(modbusToMqttMapping);
215215
data.addDataPoint(dataPoint);
@@ -219,7 +219,6 @@ private void calculateDelta(@NotNull final ModBusData modBusData, @NotNull final
219219

220220
protected static CompletableFuture<DataPoint> doRead(
221221
final int startIdx,
222-
final int count,
223222
final int unitId,
224223
final @NotNull ModbusDataType dataType,
225224
final @NotNull ModbusAdu readType,
@@ -228,27 +227,23 @@ protected static CompletableFuture<DataPoint> doRead(
228227
return modbusClient
229228
.readHoldingRegisters(
230229
startIdx,
231-
count,
232230
dataType,
233231
unitId);
234232
} else if (INPUT_REGISTERS.equals(readType)) {
235233
return modbusClient
236234
.readInputRegisters(
237235
startIdx,
238-
count,
239236
dataType,
240237
unitId);
241238
} else if (COILS.equals(readType)) {
242239
return modbusClient
243240
.readCoils(
244241
startIdx,
245-
count,
246242
unitId);
247243
} else if (DISCRETE_INPUT.equals(readType)) {
248244
return modbusClient
249245
.readDiscreteInput(
250246
startIdx,
251-
count,
252247
unitId);
253248
}
254249
return CompletableFuture.failedFuture(new Exception("Unknown read type " + readType));

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

Lines changed: 59 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
import com.hivemq.edge.adapters.modbus.config.ModbusAdapterConfig;
3131
import com.hivemq.edge.adapters.modbus.config.ModbusDataType;
3232
import io.netty.buffer.ByteBuf;
33+
import io.netty.buffer.Unpooled;
3334
import io.netty.util.ReferenceCountUtil;
3435
import org.jetbrains.annotations.NotNull;
3536

37+
import java.nio.ByteBuffer;
3638
import java.nio.charset.StandardCharsets;
3739
import java.time.Duration;
3840
import java.util.concurrent.CompletableFuture;
@@ -71,14 +73,14 @@ public CompletableFuture<Void> connect() {
7173
/**
7274
* Coils are 1bit.
7375
*/
74-
public @NotNull CompletableFuture<DataPoint> readCoils(final int startIdx, final int count, final int unitId) {
76+
public @NotNull CompletableFuture<DataPoint> readCoils(final int startIdx, final int unitId) {
7577
return modbusClient
76-
.<ReadCoilsResponse>sendRequest(new ReadCoilsRequest(startIdx, Math.min(count, DEFAULT_MAX_DISCRETE_INPUTS)), unitId)
78+
.<ReadCoilsResponse>sendRequest(new ReadCoilsRequest(startIdx, Math.min(1, DEFAULT_MAX_DISCRETE_INPUTS)), unitId)
7779
.thenApply(response -> {
7880
try {
7981
final ByteBuf buf = response.getCoilStatus();
80-
return dataPointFactory.create("registers-" + startIdx + "-" + (startIdx + count),
81-
convert(buf, ModbusDataType.BOOL, count));
82+
return dataPointFactory.create("registers-" + startIdx + "-" + (startIdx + 1),
83+
convert(buf, ModbusDataType.BOOL, 1));
8284
} finally {
8385
ReferenceCountUtil.release(response);
8486
}
@@ -88,15 +90,15 @@ public CompletableFuture<Void> connect() {
8890
/**
8991
* Discrete registers are 1bit.
9092
*/
91-
public @NotNull CompletableFuture<DataPoint> readDiscreteInput(final int startIdx, final int count, final int unitId) {
93+
public @NotNull CompletableFuture<DataPoint> readDiscreteInput(final int startIdx, final int unitId) {
9294
return modbusClient
93-
.<ReadDiscreteInputsResponse>sendRequest(new ReadDiscreteInputsRequest(startIdx, Math.min(count,
95+
.<ReadDiscreteInputsResponse>sendRequest(new ReadDiscreteInputsRequest(startIdx, Math.min(1,
9496
DEFAULT_MAX_DISCRETE_INPUTS)), unitId)
9597
.thenApply(response -> {
9698
try {
9799
final ByteBuf buf = response.getInputStatus();
98-
return dataPointFactory.create("registers-" + startIdx + "-" + (startIdx + count),
99-
convert(buf, ModbusDataType.BOOL, count));
100+
return dataPointFactory.create("registers-" + startIdx + "-" + (startIdx + 1),
101+
convert(buf, ModbusDataType.BOOL, 1));
100102
} finally {
101103
ReferenceCountUtil.release(response);
102104
}
@@ -106,16 +108,16 @@ public CompletableFuture<Void> connect() {
106108
/**
107109
* Holding registers are 16bit.
108110
*/
109-
public @NotNull CompletableFuture<DataPoint> readHoldingRegisters(final int startIdx, final int count, final @NotNull ModbusDataType dataType, final int unitId) {
111+
public @NotNull CompletableFuture<DataPoint> readHoldingRegisters(final int startIdx, final @NotNull ModbusDataType dataType, final int unitId) {
110112

111113
return modbusClient
112-
.<ReadHoldingRegistersResponse>sendRequest(new ReadHoldingRegistersRequest(startIdx, Math.min(count,
114+
.<ReadHoldingRegistersResponse>sendRequest(new ReadHoldingRegistersRequest(startIdx, Math.min(dataType.nrOfRegistersToRead,
113115
DEFAULT_MAX_INPUT_REGISTERS)), unitId)
114116
.thenApply(response -> {
115117
try {
116118
final ByteBuf buf = response.getRegisters();
117-
return dataPointFactory.create("registers-" + startIdx + "-" + (startIdx + count),
118-
convert(buf, dataType, count));
119+
return dataPointFactory.create("registers-" + startIdx + "-" + (startIdx + dataType.nrOfRegistersToRead),
120+
convert(buf, dataType, dataType.nrOfRegistersToRead));
119121
} finally {
120122
ReferenceCountUtil.release(response);
121123
}
@@ -125,15 +127,15 @@ public CompletableFuture<Void> connect() {
125127
/**
126128
* Inout registers are 16bit.
127129
*/
128-
public @NotNull CompletableFuture<DataPoint> readInputRegisters(final int startIdx, final int count, final @NotNull ModbusDataType dataType, final int unitId) {
130+
public @NotNull CompletableFuture<DataPoint> readInputRegisters(final int startIdx, final @NotNull ModbusDataType dataType, final int unitId) {
129131
return modbusClient
130-
.<ReadInputRegistersResponse>sendRequest(new ReadInputRegistersRequest(startIdx, Math.min(count,
132+
.<ReadInputRegistersResponse>sendRequest(new ReadInputRegistersRequest(startIdx, Math.min(dataType.nrOfRegistersToRead,
131133
DEFAULT_MAX_INPUT_REGISTERS)), unitId)
132134
.thenApply(response -> {
133135
try {
134136
final ByteBuf buf = response.getRegisters();
135-
return dataPointFactory.create("registers-" + startIdx + "-" + (startIdx + count),
136-
convert(buf, dataType, count));
137+
return dataPointFactory.create("registers-" + startIdx + "-" + (startIdx + dataType.nrOfRegistersToRead),
138+
convert(buf, dataType, dataType.nrOfRegistersToRead));
137139
} finally {
138140
ReferenceCountUtil.release(response);
139141
}
@@ -148,6 +150,7 @@ public CompletableFuture<Void> disconnect() {
148150

149151
private @NotNull Object convert(
150152
final @NotNull ByteBuf buffi, final @NotNull ModbusDataType dataType, final int count) {
153+
boolean registersLittleEndian = true;
151154
switch (dataType) {
152155
case BOOL:
153156
return buffi.readBoolean();
@@ -156,13 +159,49 @@ public CompletableFuture<Void> disconnect() {
156159
case UINT_16:
157160
return Short.toUnsignedInt(buffi.readShort());
158161
case INT_32:
159-
return buffi.readInt();
162+
if(registersLittleEndian) {
163+
byte[] bytes = ByteBuffer.allocate(4).putInt(-2147483647).array();
164+
byte b1 = buffi.readByte();
165+
byte b2 = buffi.readByte();
166+
byte b3 = buffi.readByte();
167+
byte b4 = buffi.readByte();
168+
System.out.println("SINT " + String.format("%02x", b1) + " " + String.format("%02x", b2) + " " + String.format("%02x", b3) + " " + String.format("%02x", b4));
169+
System.out.println("SINT " + String.format("%02x", bytes[2]) + " " + String.format("%02x", bytes[3]) + " " + String.format("%02x", bytes[0]) + " " + String.format("%02x", bytes[1]));
170+
ByteBuffer bb = ByteBuffer.wrap(new byte[] {b3 ,b4, b1, b2});
171+
return bb.getInt();
172+
} else {
173+
return buffi.readInt();
174+
}
160175
case UINT_32:
161-
return Integer.toUnsignedLong(buffi.readInt());
176+
if(registersLittleEndian) {
177+
byte b1 = buffi.readByte();
178+
byte b2 = buffi.readByte();
179+
byte b3 = buffi.readByte();
180+
byte b4 = buffi.readByte();
181+
System.out.println("UINT " + String.format("%02x", b1) + " " + String.format("%02x", b2) + " " + String.format("%02x", b3) + " " + String.format("%02x", b4));
182+
ByteBuffer bb = ByteBuffer.wrap(new byte[] {b4 ,b3, b2, b1});
183+
return bb.getInt();
184+
} else {
185+
return buffi.readUnsignedInt();
186+
}
162187
case INT_64:
163-
return buffi.readLong();
188+
if(registersLittleEndian) {
189+
return buffi.readUnsignedShort() + (buffi.readUnsignedShort() << 16);
190+
} else {
191+
return buffi.readLong();
192+
}
164193
case FLOAT_32:
165-
return buffi.readFloat();
194+
if(registersLittleEndian) {
195+
return buffi.readUnsignedShort() + (buffi.readUnsignedShort() << 16);
196+
} else {
197+
return buffi.readFloat();
198+
}
199+
case FLOAT_64:
200+
if(registersLittleEndian) {
201+
return buffi.readUnsignedShort() + (buffi.readUnsignedShort() << 16);
202+
} else {
203+
return buffi.readDouble();
204+
}
166205
case UTF_8:
167206
final byte[] bytes = new byte[count * 2];
168207
buffi.readBytes(bytes);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.hivemq.edge.adapters.modbus;
2+
3+
import com.hivemq.adapter.sdk.api.data.DataPoint;
4+
import com.hivemq.edge.adapters.modbus.config.ModbusAdapterConfig;
5+
import com.hivemq.edge.adapters.modbus.config.ModbusDataType;
6+
import com.hivemq.edge.adapters.modbus.impl.ModbusClient;
7+
import com.hivemq.edge.modules.adapters.data.DataPointImpl;
8+
9+
public class ModbusMainTest {
10+
public static void main(String[] args) throws Exception {
11+
12+
ModbusAdapterConfig modbusAdapterConfig = new ModbusAdapterConfig("1", 502, "172.16.10.12", 5000, null) ;
13+
ModbusClient modbusClient = new ModbusClient(modbusAdapterConfig, DataPointImpl::new);
14+
15+
modbusClient.connect().get();
16+
17+
//41335
18+
DataPoint dataPoint = modbusClient.readInputRegisters(30021, ModbusDataType.INT_32, 12).get();
19+
20+
System.out.println(dataPoint.getTagName() + " " + dataPoint.getTagValue());
21+
}
22+
}

0 commit comments

Comments
 (0)