Skip to content

Commit a37da1a

Browse files
authored
Modbus Bridge: optimize execution of Tasks (OpenEMS#1976)
This Pull-Request represents a complete rewrite of the Modbus Bridge. For information is available at: - https://github.com/OpenEMS/openems/blob/develop/io.openems.edge.bridge.modbus/readme.adoc - https://github.com/OpenEMS/openems/blob/develop/io.openems.edge.bridge.modbus/doc/statemachine.md - https://community.openems.io/t/asking-for-feedback-new-modbusworker-implementation/1747/2 **Breaking changes:** - Some names of Interfaces and Classes have changed. - It might be required in your individual implementation of a ModbusComponent, to explicitely import `com.ghgande.j2mod` in the bnd file # Implementation details OpenEMS Components that use Modbus communication, must implement the `ModbusComponent` interface and provide a `ModbusProtocol`. A protocol uses the notion of a `Task` to define an individual Modbus Read or Write request that can cover multiple Modbus Registers or Coils depending on the Modbus function code. It is possible to add or remove tasks to/from a protocol at runtime or to change the execution `Priority`. The Modbus Bridge (`Bridge Modbus/RTU Serial` or `Bridge Modbus/TCP`) collects all protocols and manages the execution of Tasks. ### Execution of Modbus Tasks Execution of Modbus Tasks is managed by the `ModbusWorker`. It... * executes Write-Tasks as early as possible (directly after the EXECUTE_WRITE event) * executes Read-Tasks as late as possible to have values available exactly when they are needed (i.e. just before the BEFORE_PROCESS_IMAGE event). To achieve this, the ModbusWorker evaluates all execution times and 'learns' an ideal delay time, that is applied on every Cycle - the 'CycleDelay' * handles defective ModbusComponents (i.e. ones where tasks have repeatedly failed) and delays reading from/writing to those components in order to avoid having defective components block the entire communication bus. Maximum delay is 5 minutes for read from defective components. ModbusComponents can trigger a retry from a defective Component by calling the `retryModbusCommunication()` method. ### Priority Read-Tasks can have two different priorities, that are defined in the ModbusProtocol definition: * `HIGH`: the task is executed once every Cycle * `LOW`: only one task of all defined LOW priority tasks of all components registered on the same bridge is executed per Cycle Write-Tasks always have `HIGH` priority, i.e. a set-point is always executed as-soon-as-possible - as long as the Component is not marked as defective ### Channels Each Modbus Bridge provides Channels for more detailed information: * `CycleTimeIsTooShort`: the configured global Cycle-Time is too short to execute all planned tasks in one Cycle * `CycleDelay`: see 'CycleDelay' in the 'ModbusWorker' description above ### Logging Often it is useful to print detailed logging information on the Console for debugging purposes. Logging can be enabled on Task level in the definition of the ModbusProtocol by adding `.debug()` or globally per Modbus Bridge via the `LogVerbosity` configuration parameter: * `NONE`: Show no logs * `DEBUG_LOG`: Shows basic logging information via the Controller.Debug.Log * `READS_AND_WRITES`: Show logs for all read and write requests * `READS_AND_WRITES_VERBOSE`: Show logs for all read and write requests, including actual hex or binary values of request and response * `READS_AND_WRITES_DURATION`: Show logs for all read and write requests, including actual duration time per request * `READS_AND_WRITES_DURATION_TRACE_EVENTS`: Show logs for all read and write requests, including actual duration time per request & trace the internal Event-based State-Machine The log level via configuration parameter may be changed at any time during runtime without side-effects on the communication.
1 parent e27010f commit a37da1a

File tree

126 files changed

+3150
-1551
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+3150
-1551
lines changed

io.openems.edge.battery.bmw/bnd.bnd

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ Bundle-Version: 1.0.0.${tstamp}
55

66
-buildpath: \
77
${buildpath},\
8+
com.ghgande.j2mod,\
89
io.openems.common,\
910
io.openems.edge.battery.api,\
1011
io.openems.edge.bridge.modbus,\
1112
io.openems.edge.common
1213

1314
-testpath: \
14-
${testpath},\
15-
com.ghgande.j2mod
15+
${testpath}

io.openems.edge.battery.bydcommercial/bnd.bnd

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ Bundle-Version: 1.0.0.${tstamp}
55

66
-buildpath: \
77
${buildpath},\
8+
com.ghgande.j2mod,\
89
io.openems.common,\
910
io.openems.edge.battery.api,\
1011
io.openems.edge.bridge.modbus,\
1112
io.openems.edge.common,\
1213
io.openems.edge.ess.api
1314

1415
-testpath: \
15-
${testpath},\
16-
com.ghgande.j2mod
16+
${testpath}

io.openems.edge.battery.fenecon.commercial/bnd.bnd

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Bundle-Version: 1.0.0.${tstamp}
55

66
-buildpath: \
77
${buildpath},\
8+
com.ghgande.j2mod,\
89
io.openems.common,\
910
io.openems.edge.battery.api,\
1011
io.openems.edge.bridge.modbus,\
@@ -13,5 +14,4 @@ Bundle-Version: 1.0.0.${tstamp}
1314
io.openems.edge.io.api,\
1415

1516
-testpath: \
16-
${testpath},\
17-
com.ghgande.j2mod
17+
${testpath}

io.openems.edge.battery.fenecon.home/bnd.bnd

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Bundle-Version: 1.0.0.${tstamp}
55

66
-buildpath: \
77
${buildpath},\
8+
com.ghgande.j2mod,\
89
io.openems.common,\
910
io.openems.edge.battery.api,\
1011
io.openems.edge.bridge.modbus,\
@@ -14,5 +15,4 @@ Bundle-Version: 1.0.0.${tstamp}
1415
io.openems.edge.io.api,\
1516

1617
-testpath: \
17-
${testpath},\
18-
com.ghgande.j2mod
18+
${testpath}

io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHome.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.openems.common.types.OpenemsType;
77
import io.openems.edge.battery.api.Battery;
88
import io.openems.edge.battery.fenecon.home.statemachine.StateMachine.State;
9+
import io.openems.edge.bridge.modbus.api.ModbusComponent;
910
import io.openems.edge.common.channel.Channel;
1011
import io.openems.edge.common.channel.Doc;
1112
import io.openems.edge.common.channel.IntegerDoc;
@@ -14,7 +15,7 @@
1415
import io.openems.edge.common.startstop.StartStop;
1516
import io.openems.edge.common.startstop.StartStoppable;
1617

17-
public interface BatteryFeneconHome extends Battery, OpenemsComponent, StartStoppable {
18+
public interface BatteryFeneconHome extends Battery, ModbusComponent, OpenemsComponent, StartStoppable {
1819

1920
/**
2021
* Gets the Channel for {@link ChannelId#BMS_CONTROL}.

io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/BatteryFeneconHomeImpl.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@
3939
import io.openems.edge.bridge.modbus.api.ElementToChannelConverter;
4040
import io.openems.edge.bridge.modbus.api.ModbusComponent;
4141
import io.openems.edge.bridge.modbus.api.ModbusProtocol;
42-
import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
4342
import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
4443
import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
44+
import io.openems.edge.bridge.modbus.api.element.ModbusElement;
4545
import io.openems.edge.bridge.modbus.api.element.SignedWordElement;
4646
import io.openems.edge.bridge.modbus.api.element.UnsignedDoublewordElement;
4747
import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
@@ -738,8 +738,8 @@ private synchronized void initializeTowerModulesChannels(int numberOfTowers, int
738738
* for Cell-Voltages.Channel-IDs are like "TOWER_0_OFFSET_2_TEMPERATURE_003".
739739
* Channel-IDs are like "TOWER_0_OFFSET_2_VOLTAGE_003".
740740
*/
741-
var ameVolt = new AbstractModbusElement<?>[SENSORS_PER_MODULE];
742-
var ameTemp = new AbstractModbusElement<?>[SENSORS_PER_MODULE];
741+
var ameVolt = new ModbusElement<?>[SENSORS_PER_MODULE];
742+
var ameTemp = new ModbusElement<?>[SENSORS_PER_MODULE];
743743
for (var j = 0; j < SENSORS_PER_MODULE; j++) {
744744
{
745745
// Create Voltage Channel

io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/statemachine/Context.java

+4
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ protected boolean isBatteryStarted() {
2323
}
2424
return !isNotStarted.get();
2525
}
26+
27+
protected void retryModbusCommunication() {
28+
this.getParent().retryModbusCommunication();
29+
}
2630
}

io.openems.edge.battery.fenecon.home/src/io/openems/edge/battery/fenecon/home/statemachine/GoRunningHandler.java

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ public State runAndGetNextState(Context context) throws OpenemsNamedException {
6464
}
6565

6666
case FINISHED:
67+
// Finished. Battery should have started up.
68+
context.retryModbusCommunication();
6769
return State.RUNNING;
6870
}
6971

io.openems.edge.battery.soltaro/bnd.bnd

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Bundle-Version: 1.0.0.${tstamp}
55

66
-buildpath: \
77
${buildpath},\
8+
com.ghgande.j2mod,\
89
io.openems.common,\
910
io.openems.edge.battery.api,\
1011
io.openems.edge.bridge.modbus,\
@@ -13,5 +14,4 @@ Bundle-Version: 1.0.0.${tstamp}
1314
io.openems.edge.ess.api
1415

1516
-testpath: \
16-
${testpath},\
17-
com.ghgande.j2mod
17+
${testpath}

io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/BatterySoltaroClusterVersionBImpl.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -682,17 +682,17 @@ private int getAddressContactorControl(int addressOffsetRack) {
682682
return addressOffsetRack + OFFSET_CONTACTOR_CONTROL;
683683
}
684684

685-
protected final AbstractModbusElement<?> map(io.openems.edge.common.channel.ChannelId channelId,
686-
AbstractModbusElement<?> element) {
685+
protected final <T extends AbstractModbusElement<?, ?>> T map(io.openems.edge.common.channel.ChannelId channelId,
686+
T element) {
687687
return this.m(channelId, element);
688688
}
689689

690-
protected final AbstractModbusElement<?> map(io.openems.edge.common.channel.ChannelId channelId,
691-
AbstractModbusElement<?> element, ElementToChannelConverter converter) {
690+
protected final <T extends AbstractModbusElement<?, ?>> T map(io.openems.edge.common.channel.ChannelId channelId,
691+
T element, ElementToChannelConverter converter) {
692692
return this.m(channelId, element, converter);
693693
}
694694

695-
protected final AbstractModbusElement<?> map(BitsWordElement bitsWordElement) {
695+
protected final BitsWordElement map(BitsWordElement bitsWordElement) {
696696
return super.m(bitsWordElement);
697697
}
698698

io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/SingleRack.java

+13-12
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.util.ArrayList;
77
import java.util.Collection;
88
import java.util.HashMap;
9-
import java.util.List;
109
import java.util.Map;
1110
import java.util.Optional;
1211

@@ -16,8 +15,8 @@
1615
import io.openems.common.types.OpenemsType;
1716
import io.openems.edge.battery.soltaro.common.enums.ChargeIndication;
1817
import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent;
19-
import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
2018
import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
19+
import io.openems.edge.bridge.modbus.api.element.ModbusElement;
2120
import io.openems.edge.bridge.modbus.api.element.SignedWordElement;
2221
import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
2322
import io.openems.edge.bridge.modbus.api.task.FC3ReadRegistersTask;
@@ -253,44 +252,46 @@ protected Collection<Task> getTasks() {
253252

254253
// Cell voltages
255254
for (var i = 0; i < this.numberOfSlaves; i++) {
256-
List<AbstractModbusElement<?>> elements = new ArrayList<>();
255+
var elements = new ArrayList<ModbusElement<?>>();
257256
for (var j = i * VOLTAGE_SENSORS_PER_MODULE; j < (i + 1) * VOLTAGE_SENSORS_PER_MODULE; j++) {
258257
var key = this.getSingleCellPrefix(j) + "_" + VOLTAGE;
259258
var uwe = this.getUnsignedWordElement(VOLTAGE_ADDRESS_OFFSET + j);
260-
AbstractModbusElement<?> ame = this.parent.map(this.channelIds.get(key), uwe);
259+
var ame = this.parent.map(this.channelIds.get(key), uwe);
261260
elements.add(ame);
262261
}
263262

264263
// not more than 100 elements per task, because it can cause problems..
265264
var taskCount = elements.size() / maxElementsPerTask + 1;
266265

267266
for (var x = 0; x < taskCount; x++) {
268-
var subElements = elements.subList(x * maxElementsPerTask,
269-
Math.min((x + 1) * maxElementsPerTask, elements.size()));
270-
var taskElements = subElements.toArray(new AbstractModbusElement<?>[0]);
267+
var taskElements = elements
268+
.subList(x * maxElementsPerTask, Math.min((x + 1) * maxElementsPerTask, elements.size())) //
269+
.stream() //
270+
.toArray(ModbusElement[]::new);
271271
tasks.add(new FC3ReadRegistersTask(taskElements[0].getStartAddress(), Priority.LOW, taskElements));
272272
}
273273

274274
}
275275

276276
// Cell temperatures
277277
for (var i = 0; i < this.numberOfSlaves; i++) {
278-
List<AbstractModbusElement<?>> elements = new ArrayList<>();
278+
var elements = new ArrayList<ModbusElement<?>>();
279279
for (var j = i * TEMPERATURE_SENSORS_PER_MODULE; j < (i + 1) * TEMPERATURE_SENSORS_PER_MODULE; j++) {
280280
var key = this.getSingleCellPrefix(j) + "_" + TEMPERATURE;
281281

282282
var swe = this.getSignedWordElement(TEMPERATURE_ADDRESS_OFFSET + j);
283-
AbstractModbusElement<?> ame = this.parent.map(this.channelIds.get(key), swe);
283+
var ame = this.parent.map(this.channelIds.get(key), swe);
284284
elements.add(ame);
285285
}
286286

287287
// not more than 100 elements per task, because it can cause problems..
288288
var taskCount = elements.size() / maxElementsPerTask + 1;
289289

290290
for (var x = 0; x < taskCount; x++) {
291-
var subElements = elements.subList(x * maxElementsPerTask,
292-
Math.min((x + 1) * maxElementsPerTask, elements.size()));
293-
var taskElements = subElements.toArray(new AbstractModbusElement<?>[0]);
291+
var taskElements = elements
292+
.subList(x * maxElementsPerTask, Math.min((x + 1) * maxElementsPerTask, elements.size())) //
293+
.stream() //
294+
.toArray(ModbusElement[]::new);
294295
tasks.add(new FC3ReadRegistersTask(taskElements[0].getStartAddress(), Priority.LOW, taskElements));
295296
}
296297
}

io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionc/BatterySoltaroClusterVersionCImpl.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@
4949
import io.openems.edge.bridge.modbus.api.ModbusComponent;
5050
import io.openems.edge.bridge.modbus.api.ModbusProtocol;
5151
import io.openems.edge.bridge.modbus.api.ModbusUtils;
52-
import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
5352
import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
5453
import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
54+
import io.openems.edge.bridge.modbus.api.element.ModbusElement;
5555
import io.openems.edge.bridge.modbus.api.element.SignedWordElement;
5656
import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
5757
import io.openems.edge.bridge.modbus.api.task.FC16WriteRegistersTask;
@@ -386,7 +386,7 @@ private void updateRackChannels(Integer numberOfModules, TreeSet<Rack> racks) th
386386
} //
387387
Consumer<CellChannelFactory.Type> addCellChannels = type -> {
388388
for (var i = 0; i < numberOfModules; i++) {
389-
var elements = new AbstractModbusElement<?>[type.getSensorsPerModule()];
389+
var elements = new ModbusElement<?>[type.getSensorsPerModule()];
390390
for (var j = 0; j < type.getSensorsPerModule(); j++) {
391391
var sensorIndex = i * type.getSensorsPerModule() + j;
392392
var channelId = CellChannelFactory.create(r, type, sensorIndex);
@@ -411,7 +411,7 @@ private void updateRackChannels(Integer numberOfModules, TreeSet<Rack> racks) th
411411

412412
// WARN_LEVEL_Pre Alarm (Pre Alarm configuration registers RW)
413413
{
414-
AbstractModbusElement<?>[] elements = {
414+
ModbusElement<?>[] elements = {
415415
m(this.createChannelId(r, RackChannel.PRE_ALARM_CELL_OVER_VOLTAGE_ALARM),
416416
new UnsignedWordElement(r.offset + 0x080)), //
417417
m(this.createChannelId(r, RackChannel.PRE_ALARM_CELL_OVER_VOLTAGE_RECOVER),
@@ -486,7 +486,7 @@ private void updateRackChannels(Integer numberOfModules, TreeSet<Rack> racks) th
486486

487487
// WARN_LEVEL1 (Level1 warning registers RW)
488488
{
489-
AbstractModbusElement<?>[] elements = {
489+
ModbusElement<?>[] elements = {
490490
m(this.createChannelId(r, RackChannel.LEVEL1_CELL_OVER_VOLTAGE_PROTECTION),
491491
new UnsignedWordElement(r.offset + 0x040)), //
492492
m(this.createChannelId(r, RackChannel.LEVEL1_CELL_OVER_VOLTAGE_RECOVER),
@@ -561,7 +561,7 @@ private void updateRackChannels(Integer numberOfModules, TreeSet<Rack> racks) th
561561

562562
// WARN_LEVEL2 (Level2 Protection registers RW)
563563
{
564-
AbstractModbusElement<?>[] elements = {
564+
ModbusElement<?>[] elements = {
565565
m(this.createChannelId(r, RackChannel.LEVEL2_CELL_OVER_VOLTAGE_PROTECTION),
566566
new UnsignedWordElement(r.offset + 0x400)), //
567567
m(this.createChannelId(r, RackChannel.LEVEL2_CELL_OVER_VOLTAGE_RECOVER),

io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/BatterySoltaroSingleRackVersionBImpl.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
import io.openems.edge.bridge.modbus.api.ModbusComponent;
4646
import io.openems.edge.bridge.modbus.api.ModbusProtocol;
4747
import io.openems.edge.bridge.modbus.api.ModbusUtils;
48-
import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
4948
import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
5049
import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
50+
import io.openems.edge.bridge.modbus.api.element.ModbusElement;
5151
import io.openems.edge.bridge.modbus.api.element.SignedWordElement;
5252
import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
5353
import io.openems.edge.bridge.modbus.api.task.FC16WriteRegistersTask;
@@ -966,8 +966,8 @@ private void calculateCapacity(Integer numberOfModules) {
966966
private void createDynamicChannels(int numberOfModules) {
967967
try {
968968
for (var i = 0; i < numberOfModules; i++) {
969-
var ameVolt = new AbstractModbusElement<?>[SENSORS_PER_MODULE];
970-
var ameTemp = new AbstractModbusElement<?>[SENSORS_PER_MODULE];
969+
var ameVolt = new ModbusElement<?>[SENSORS_PER_MODULE];
970+
var ameTemp = new ModbusElement<?>[SENSORS_PER_MODULE];
971971
for (var j = 0; j < SENSORS_PER_MODULE; j++) {
972972
var sensor = i * SENSORS_PER_MODULE + j;
973973
{

io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionc/BatterySoltaroSingleRackVersionCImpl.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@
4242
import io.openems.edge.bridge.modbus.api.ModbusComponent;
4343
import io.openems.edge.bridge.modbus.api.ModbusProtocol;
4444
import io.openems.edge.bridge.modbus.api.ModbusUtils;
45-
import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
4645
import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
4746
import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
47+
import io.openems.edge.bridge.modbus.api.element.ModbusElement;
4848
import io.openems.edge.bridge.modbus.api.element.SignedWordElement;
4949
import io.openems.edge.bridge.modbus.api.element.UnsignedDoublewordElement;
5050
import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
@@ -492,7 +492,7 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException {
492492
.bit(12, BatterySoltaroSingleRackVersionC.ChannelId.SLAVE_BMS_INIT)//
493493
))); //
494494
{
495-
AbstractModbusElement<?>[] elements = {
495+
ModbusElement<?>[] elements = {
496496
m(BatterySoltaroSingleRackVersionC.ChannelId.PRE_ALARM_CELL_OVER_VOLTAGE_ALARM,
497497
new UnsignedWordElement(0x2080)), //
498498
m(BatterySoltaroSingleRackVersionC.ChannelId.PRE_ALARM_CELL_OVER_VOLTAGE_RECOVER,
@@ -565,7 +565,7 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException {
565565

566566
// WARN_LEVEL1 (Level1 warning registers RW)
567567
{
568-
AbstractModbusElement<?>[] elements = {
568+
ModbusElement<?>[] elements = {
569569
m(BatterySoltaroSingleRackVersionC.ChannelId.LEVEL1_CELL_OVER_VOLTAGE_PROTECTION,
570570
new UnsignedWordElement(0x2040)), //
571571
m(BatterySoltaroSingleRackVersionC.ChannelId.LEVEL1_CELL_OVER_VOLTAGE_RECOVER,
@@ -638,7 +638,7 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException {
638638

639639
// WARN_LEVEL2 (Level2 Protection registers RW)
640640
{
641-
AbstractModbusElement<?>[] elements = {
641+
ModbusElement<?>[] elements = {
642642
m(BatterySoltaroSingleRackVersionC.ChannelId.LEVEL2_CELL_OVER_VOLTAGE_PROTECTION,
643643
new UnsignedWordElement(0x2400)), //
644644
m(BatterySoltaroSingleRackVersionC.ChannelId.LEVEL2_CELL_OVER_VOLTAGE_RECOVER,
@@ -725,7 +725,7 @@ void createCellVoltageAndTemperatureChannels(int numberOfModules) {
725725
*/
726726
Consumer<CellChannelFactory.Type> addCellChannels = type -> {
727727
for (var i = 0; i < numberOfModules; i++) {
728-
var elements = new AbstractModbusElement<?>[type.getSensorsPerModule()];
728+
var elements = new ModbusElement<?>[type.getSensorsPerModule()];
729729
for (var j = 0; j < type.getSensorsPerModule(); j++) {
730730
var sensorIndex = i * type.getSensorsPerModule() + j;
731731
var channelId = CellChannelFactory.create(type, sensorIndex);

io.openems.edge.batteryinverter.refu88k/bnd.bnd

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Bundle-Version: 1.0.0.${tstamp}
55

66
-buildpath: \
77
${buildpath},\
8+
com.ghgande.j2mod,\
89
io.openems.common,\
910
io.openems.edge.battery.api,\
1011
io.openems.edge.batteryinverter.api,\
@@ -14,5 +15,4 @@ Bundle-Version: 1.0.0.${tstamp}
1415
io.openems.edge.timedata.api,\
1516

1617
-testpath: \
17-
${testpath},\
18-
com.ghgande.j2mod
18+
${testpath}

io.openems.edge.batteryinverter.sinexcel/bnd.bnd

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Bundle-Version: 1.0.0.${tstamp}
55

66
-buildpath: \
77
${buildpath},\
8+
com.ghgande.j2mod,\
89
io.openems.common,\
910
io.openems.edge.battery.api,\
1011
io.openems.edge.batteryinverter.api,\
@@ -14,5 +15,4 @@ Bundle-Version: 1.0.0.${tstamp}
1415
io.openems.edge.timedata.api,\
1516

1617
-testpath: \
17-
${testpath},\
18-
com.ghgande.j2mod
18+
${testpath}

0 commit comments

Comments
 (0)