{
+
+ public void accept(T t) throws OpenemsNamedException;
+
+}
diff --git a/io.openems.common/src/io/openems/common/exceptions/OpenemsError.java b/io.openems.common/src/io/openems/common/exceptions/OpenemsError.java
index 80569bb8218..e19eab4c51d 100644
--- a/io.openems.common/src/io/openems/common/exceptions/OpenemsError.java
+++ b/io.openems.common/src/io/openems/common/exceptions/OpenemsError.java
@@ -51,6 +51,7 @@ public enum OpenemsError {
* JSON Errors. 5000-5999
*/
JSON_HAS_NO_MEMBER(5000, "JSON [%s] has no member [%s]"), //
+ JSON_NO_INTEGER(5019, "JSON [%s] is not an Integer"), //
JSON_NO_INTEGER_MEMBER(5001, "JSON [%s:%s] is not an Integer"), //
JSON_NO_OBJECT(5002, "JSON [%s] is not a JSON-Object"), //
JSON_NO_OBJECT_MEMBER(5003, "JSON [%s] is not a JSON-Object"), //
@@ -68,6 +69,7 @@ public enum OpenemsError {
JSON_PARSE_ELEMENT_FAILED(5015, "JSON failed to parse [%s]. %s: %s"), //
JSON_PARSE_FAILED(5016, "JSON failed to parse [%s]: %s"), //
JSON_NO_FLOAT_MEMBER(5017, "JSON [%s:%s] is not a Float"), //
+ JSON_NO_ENUM_MEMBER(5018, "JSON [%s:%s] is not an Enum"), //
;
/**
diff --git a/io.openems.common/src/io/openems/common/jsonrpc/request/SetChannelValueRequest.java b/io.openems.common/src/io/openems/common/jsonrpc/request/SetChannelValueRequest.java
new file mode 100644
index 00000000000..a5a22764dd9
--- /dev/null
+++ b/io.openems.common/src/io/openems/common/jsonrpc/request/SetChannelValueRequest.java
@@ -0,0 +1,80 @@
+package io.openems.common.jsonrpc.request;
+
+import java.util.UUID;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
+import io.openems.common.jsonrpc.base.JsonrpcRequest;
+import io.openems.common.types.ChannelAddress;
+import io.openems.common.utils.JsonUtils;
+
+/**
+ * Sets the write value of a Channel.
+ *
+ *
+ * {
+ * "jsonrpc": "2.0",
+ * "id": "UUID",
+ * "method": "setChannelValue",
+ * "params": {
+ * "componentId": string,
+ * "channelId": string,
+ * "value": any
+ * }
+ * }
+ *
+ */
+public class SetChannelValueRequest extends JsonrpcRequest {
+
+ public static SetChannelValueRequest from(JsonrpcRequest r) throws OpenemsNamedException {
+ JsonObject p = r.getParams();
+ String componentId = JsonUtils.getAsString(p, "componentId");
+ String channelId = JsonUtils.getAsString(p, "channelId");
+ JsonElement value = JsonUtils.getSubElement(p, "value");
+ return new SetChannelValueRequest(r.getId(), componentId, channelId, value);
+ }
+
+ public final static String METHOD = "setChannelValue";
+
+ private final String componentId;
+ private final String channelId;
+ private final JsonElement value;
+
+ public SetChannelValueRequest(String componentId, String channelId, JsonElement value) {
+ this(UUID.randomUUID(), componentId, channelId, value);
+ }
+
+ public SetChannelValueRequest(UUID id, String componentId, String channelId, JsonElement value) {
+ super(id, METHOD);
+ this.componentId = componentId;
+ this.channelId = channelId;
+ this.value = value;
+ }
+
+ @Override
+ public JsonObject getParams() {
+ return JsonUtils.buildJsonObject() //
+ .addProperty("componentId", this.componentId) //
+ .addProperty("channelId", this.channelId) //
+ .add("value", this.value) //
+ .build();
+ }
+
+ public String getComponentId() {
+ return componentId;
+ }
+
+ public String getChannelId() {
+ return channelId;
+ }
+
+ public ChannelAddress getChannelAddress() {
+ return new ChannelAddress(this.componentId, this.channelId);
+ }
+
+ public JsonElement getValue() {
+ return value;
+ }
+}
diff --git a/io.openems.common/src/io/openems/common/jsonrpc/response/Base64PayloadResponse.java b/io.openems.common/src/io/openems/common/jsonrpc/response/Base64PayloadResponse.java
new file mode 100644
index 00000000000..26ebeb4f46a
--- /dev/null
+++ b/io.openems.common/src/io/openems/common/jsonrpc/response/Base64PayloadResponse.java
@@ -0,0 +1,40 @@
+package io.openems.common.jsonrpc.response;
+
+import java.util.Base64;
+import java.util.UUID;
+
+import com.google.gson.JsonObject;
+
+import io.openems.common.jsonrpc.base.JsonrpcResponseSuccess;
+import io.openems.common.utils.JsonUtils;
+
+/**
+ * Represents a JSON-RPC Response for a Base64-encoded payload.
+ *
+ *
+ * {
+ * "jsonrpc": "2.0",
+ * "id": "UUID",
+ * "result": {
+ * "payload": Base64-String
+ * }
+ * }
+ *
+ */
+public class Base64PayloadResponse extends JsonrpcResponseSuccess {
+
+ private final String payload;
+
+ public Base64PayloadResponse(UUID id, byte[] payload) {
+ super(id);
+ this.payload = Base64.getEncoder().encodeToString(payload);
+ }
+
+ @Override
+ public JsonObject getResult() {
+ return JsonUtils.buildJsonObject() //
+ .addProperty("payload", this.payload) //
+ .build();
+ }
+
+}
diff --git a/io.openems.common/src/io/openems/common/types/EdgeConfig.java b/io.openems.common/src/io/openems/common/types/EdgeConfig.java
index 0d6130527eb..2d194f8534e 100644
--- a/io.openems.common/src/io/openems/common/types/EdgeConfig.java
+++ b/io.openems.common/src/io/openems/common/types/EdgeConfig.java
@@ -1,36 +1,268 @@
package io.openems.common.types;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Optional;
import java.util.TreeMap;
+import java.util.stream.Collectors;
import org.osgi.service.metatype.AttributeDefinition;
import org.osgi.service.metatype.ObjectClassDefinition;
+import com.google.common.base.CaseFormat;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import io.openems.common.channel.AccessMode;
+import io.openems.common.channel.ChannelCategory;
+import io.openems.common.channel.Level;
+import io.openems.common.channel.Unit;
import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
-import io.openems.common.types.EdgeConfig.Factory.Property;
+import io.openems.common.types.EdgeConfig.Component.JsonFormat;
+import io.openems.common.exceptions.OpenemsException;
import io.openems.common.utils.JsonUtils;
+import io.openems.common.utils.JsonUtils.JsonObjectBuilder;
/**
* Holds the configuration of an Edge.
*/
public class EdgeConfig {
+ /**
+ * Represents an instance of an OpenEMS Component.
+ */
public static class Component {
+ /**
+ * Represents a Channel of an OpenEMS Component.
+ */
+ public static class Channel {
+
+ public static interface ChannelDetail {
+ ChannelCategory getCategory();
+
+ JsonObject toJson();
+ }
+
+ /**
+ * Channel-Details for OpenemsType-Channel.
+ */
+ public static class ChannelDetailOpenemsType implements ChannelDetail {
+
+ public ChannelDetailOpenemsType() {
+ }
+
+ @Override
+ public ChannelCategory getCategory() {
+ return ChannelCategory.OPENEMS_TYPE;
+ }
+
+ @Override
+ public JsonObject toJson() {
+ return new JsonObject();
+ }
+ }
+
+ /**
+ * Channel-Details for EnumChannel.
+ */
+ public static class ChannelDetailEnum implements ChannelDetail {
+
+ private final Map options;
+
+ public ChannelDetailEnum(Map options) {
+ this.options = options;
+ }
+
+ @Override
+ public ChannelCategory getCategory() {
+ return ChannelCategory.ENUM;
+ }
+
+ public Map getOptions() {
+ return options;
+ }
+
+ @Override
+ public JsonObject toJson() {
+ JsonObject options = new JsonObject();
+ for (Entry entry : this.options.entrySet()) {
+ options.add(entry.getKey(), entry.getValue());
+ }
+ return JsonUtils.buildJsonObject() //
+ .add("options", options) //
+ .build();
+ }
+ }
+
+ /**
+ * Channel-Details for StateChannel.
+ */
+ public static class ChannelDetailState implements ChannelDetail {
+
+ private final Level level;
+
+ public ChannelDetailState(Level level) {
+ this.level = level;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ @Override
+ public ChannelCategory getCategory() {
+ return ChannelCategory.STATE;
+ }
+
+ @Override
+ public JsonObject toJson() {
+ return JsonUtils.buildJsonObject() //
+ .addProperty("level", this.level.name()) //
+ .build();
+ }
+ }
+
+ /**
+ * Creates a Channel from JSON.
+ *
+ * @param channelId the Channel-ID
+ * @param json the JSON
+ * @return the Channel
+ * @throws OpenemsNamedException on error
+ */
+ public static Channel fromJson(String channelId, JsonElement json) throws OpenemsNamedException {
+ OpenemsType type = JsonUtils.getAsEnum(OpenemsType.class, json, "type");
+ Optional accessModeAbbrOpt = JsonUtils.getAsOptionalString(json, "accessMode");
+ AccessMode accessMode = AccessMode.READ_ONLY;
+ if (accessModeAbbrOpt.isPresent()) {
+ String accessModeAbbr = accessModeAbbrOpt.get();
+ for (AccessMode thisAccessMode : AccessMode.values()) {
+ if (accessModeAbbr.equals(thisAccessMode.getAbbreviation())) {
+ accessMode = thisAccessMode;
+ break;
+ }
+ }
+ }
+ String text = JsonUtils.getAsOptionalString(json, "text").orElse("");
+ Unit unit = JsonUtils.getAsOptionalEnum(Unit.class, json, "unit").orElse(Unit.NONE);
+ ChannelCategory category = JsonUtils.getAsOptionalEnum(ChannelCategory.class, json, "category")
+ .orElse(ChannelCategory.OPENEMS_TYPE);
+ ChannelDetail detail = null;
+ switch (category) {
+ case OPENEMS_TYPE: {
+ detail = new ChannelDetailOpenemsType();
+ break;
+ }
+
+ case ENUM: {
+ Map values = new HashMap<>();
+ Optional optionsOpt = JsonUtils.getAsOptionalJsonObject(json, "options");
+ if (optionsOpt.isPresent()) {
+ for (Entry entry : optionsOpt.get().entrySet()) {
+ values.put(entry.getKey(), entry.getValue());
+ }
+ }
+ detail = new ChannelDetailEnum(values);
+ break;
+ }
+
+ case STATE: {
+ Level level = JsonUtils.getAsEnum(Level.class, json, "level");
+ detail = new ChannelDetailState(level);
+ break;
+ }
+
+ default:
+ throw new OpenemsException("Unknown Category-Key [" + category + "]");
+ }
+ return new Channel(channelId, type, accessMode, text, unit, detail);
+ }
+
+ private final String id;
+ private final OpenemsType type;
+ private final AccessMode accessMode;
+ private final String text;
+ private final Unit unit;
+ private final ChannelDetail detail;
+
+ public Channel(String id, OpenemsType type, AccessMode accessMode, String text, Unit unit,
+ ChannelDetail detail) {
+ this.id = id;
+ this.type = type;
+ this.accessMode = accessMode;
+ this.text = text;
+ this.unit = unit;
+ this.detail = detail;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public OpenemsType getType() {
+ return type;
+ }
+
+ public AccessMode getAccessMode() {
+ return accessMode;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public Unit getUnit() {
+ return unit;
+ }
+
+ public ChannelDetail getDetail() {
+ return detail;
+ }
+
+ /**
+ * Gets the JSON representation of this Channel.
+ *
+ * @return a JsonObject
+ */
+ public JsonObject toJson() {
+ return JsonUtils.buildJsonObject(this.detail.toJson()) //
+ .addProperty("type", this.type.name()) //
+ .addProperty("accessMode", this.accessMode.getAbbreviation()) //
+ .addProperty("text", this.text) //
+ .addProperty("unit", this.unit.getSymbol()) //
+ .addProperty("category", this.detail.getCategory().name()) //
+ .build();
+ }
+ }
+
+ private final String id;
+ private final String alias;
private final String factoryId;
private final TreeMap properties;
+ private final TreeMap channels;
- public Component(String factoryId, TreeMap properties) {
+ public Component(String id, String alias, String factoryId, TreeMap properties,
+ TreeMap channels) {
+ this.id = id;
+ this.alias = alias;
this.factoryId = factoryId;
this.properties = properties;
+ this.channels = channels;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getAlias() {
+ return alias;
}
public String getFactoryId() {
@@ -41,29 +273,64 @@ public Map getProperties() {
return properties;
}
+ public Map getChannels() {
+ return channels;
+ }
+
+ public Map getChannelsOfCategory(ChannelCategory channelCategory) {
+ return this.channels.entrySet().stream()
+ .filter(entry -> entry.getValue().getDetail().getCategory() == channelCategory) //
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+ }
+
+ public Map getStateChannels() {
+ return this.getChannelsOfCategory(ChannelCategory.STATE);
+ }
+
/**
* Returns the Component configuration as a JSON Object.
*
*
* {
+ * alias: string,
* factoryId: string,
* properties: {
* [key: string]: value
+ * },
+ * channels: {
+ * [channelId: string]: {}
* }
* }
*
*
* @return configuration as a JSON Object
*/
- public JsonObject toJson() {
+ public JsonObject toJson(JsonFormat jsonFormat) {
JsonObject properties = new JsonObject();
for (Entry property : this.getProperties().entrySet()) {
properties.add(property.getKey(), property.getValue());
}
- return JsonUtils.buildJsonObject() //
+ JsonObjectBuilder result = JsonUtils.buildJsonObject() //
+ .addProperty("alias", this.getAlias()) //
.addProperty("factoryId", this.getFactoryId()) //
- .add("properties", properties) //
- .build();
+ .add("properties", properties); //
+ switch (jsonFormat) {
+ case WITHOUT_CHANNELS:
+ break;
+
+ case COMPLETE:
+ JsonObject channels = new JsonObject();
+ for (Entry channel : this.getChannels().entrySet()) {
+ channels.add(channel.getKey(), channel.getValue().toJson());
+ }
+ result.add("channels", channels); //
+ break;
+ }
+ return result.build();
+ }
+
+ public enum JsonFormat {
+ COMPLETE, WITHOUT_CHANNELS;
}
/**
@@ -73,26 +340,45 @@ public JsonObject toJson() {
* @return the Component
* @throws OpenemsNamedException on error
*/
- public static Component fromJson(JsonElement json) throws OpenemsNamedException {
+ public static Component fromJson(String componentId, JsonElement json) throws OpenemsNamedException {
+ String alias = JsonUtils.getAsOptionalString(json, "alias").orElse(componentId);
+ String factoryId = JsonUtils.getAsOptionalString(json, "factoryId").orElse("NO_FACTORY_ID");
TreeMap properties = new TreeMap<>();
- for (Entry entry : JsonUtils.getAsJsonObject(json, "properties").entrySet()) {
- properties.put(entry.getKey(), entry.getValue());
+ Optional jPropertiesOpt = JsonUtils.getAsOptionalJsonObject(json, "properties");
+ if (jPropertiesOpt.isPresent()) {
+ for (Entry entry : jPropertiesOpt.get().entrySet()) {
+ properties.put(entry.getKey(), entry.getValue());
+ }
+ }
+ TreeMap channels = new TreeMap<>();
+ Optional jChannelsOpt = JsonUtils.getAsOptionalJsonObject(json, "channels");
+ if (jChannelsOpt.isPresent()) {
+ for (Entry entry : jChannelsOpt.get().entrySet()) {
+ channels.put(entry.getKey(), Channel.fromJson(entry.getKey(), entry.getValue()));
+ }
}
return new Component(//
- JsonUtils.getAsString(json, "factoryId"), //
- properties);
+ componentId, //
+ alias, //
+ factoryId, //
+ properties, //
+ channels);
}
}
+ /**
+ * Represents an OpenEMS Component Factory.
+ */
public static class Factory {
- public static Factory create(ObjectClassDefinition ocd, String[] natureIds) {
+ public static Factory create(String factoryId, ObjectClassDefinition ocd, String[] natureIds) {
String name = ocd.getName();
String description = ocd.getDescription();
List properties = new ArrayList<>();
properties.addAll(Factory.toProperties(ocd, true));
properties.addAll(Factory.toProperties(ocd, false));
- return new Factory(name, description, properties.toArray(new Property[properties.size()]), natureIds);
+ return new Factory(factoryId, name, description, properties.toArray(new Property[properties.size()]),
+ natureIds);
}
private static List toProperties(ObjectClassDefinition ocd, boolean isRequired) {
@@ -120,6 +406,9 @@ private static List toProperties(ObjectClassDefinition ocd, boolean is
return properties;
}
+ /**
+ * Represents a configuration option of an OpenEMS Component Factory.
+ */
public static class Property {
private final String id;
@@ -148,10 +437,26 @@ public static Property from(AttributeDefinition ad, boolean isRequired) {
description = "";
}
- JsonElement defaultValue = JsonUtils.getAsJsonElement(ad.getDefaultValue());
- if ((ad.getCardinality() == 0 || ad.getCardinality() == 1) && defaultValue.isJsonArray()
- && ((JsonArray) defaultValue).size() == 1) {
- defaultValue = ((JsonArray) defaultValue).get(0);
+ String[] defaultValues = ad.getDefaultValue();
+ JsonElement defaultValue;
+ if (defaultValues == null) {
+ defaultValue = JsonNull.INSTANCE;
+
+ } else if (ad.getCardinality() == 0) {
+ // Simple Type
+ if (defaultValues.length == 1) {
+ defaultValue = JsonUtils.getAsJsonElement(defaultValues[0]);
+ } else {
+ defaultValue = new JsonPrimitive("");
+ }
+
+ } else {
+ // Array Type
+ JsonArray defaultValueArray = new JsonArray();
+ for (String value : defaultValues) {
+ defaultValueArray.add(JsonUtils.getAsJsonElement(value));
+ }
+ defaultValue = defaultValueArray;
}
JsonObject schema;
@@ -171,56 +476,62 @@ private static JsonObject getSchema(AttributeDefinition ad) {
JsonObject schema = new JsonObject();
if (ad.getOptionLabels() != null && ad.getOptionValues() != null) {
// use given options for schema
- schema.addProperty("type", "select");
- JsonArray titleMap = new JsonArray();
+ JsonArray options = new JsonArray();
for (int i = 0; i < ad.getOptionLabels().length; i++) {
- titleMap.add(JsonUtils.buildJsonObject() //
+ String label = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL,
+ ad.getOptionLabels()[i].replaceAll("_", " _"));
+ options.add(JsonUtils.buildJsonObject() //
.addProperty("value", ad.getOptionValues()[i]) //
- .addProperty("name", ad.getOptionLabels()[i]) //
+ .addProperty("label", label) //
.build());
}
- schema.add("titleMap", titleMap);
+ return JsonUtils.buildJsonObject() //
+ .addProperty("type", "select") //
+ .add("templateOptions", JsonUtils.buildJsonObject() //
+ .add("options", options) //
+ .build()) //
+ .build();
} else {
// generate schema from AttributeDefinition Type
switch (ad.getType()) {
case AttributeDefinition.STRING:
case AttributeDefinition.CHARACTER:
- schema = JsonUtils.buildJsonObject() //
+ return JsonUtils.buildJsonObject() //
.addProperty("type", "input") //
.add("templateOptions", JsonUtils.buildJsonObject() //
.addProperty("type", "text") //
.build()) //
.build();
- break;
+
case AttributeDefinition.LONG:
case AttributeDefinition.INTEGER:
case AttributeDefinition.SHORT:
case AttributeDefinition.DOUBLE:
case AttributeDefinition.FLOAT:
case AttributeDefinition.BYTE:
- schema = JsonUtils.buildJsonObject() //
+ return JsonUtils.buildJsonObject() //
.addProperty("type", "input") //
.add("templateOptions", JsonUtils.buildJsonObject() //
.addProperty("type", "number") //
.build()) //
.build();
- break;
+
case AttributeDefinition.PASSWORD:
- schema = JsonUtils.buildJsonObject() //
+ return JsonUtils.buildJsonObject() //
.addProperty("type", "input") //
.add("templateOptions", JsonUtils.buildJsonObject() //
.addProperty("type", "password") //
.build()) //
.build();
- break;
+
case AttributeDefinition.BOOLEAN:
- schema = JsonUtils.buildJsonObject() //
+ return JsonUtils.buildJsonObject() //
.addProperty("type", "toggle") //
.build();
- break;
}
}
+
return schema;
}
@@ -236,7 +547,8 @@ public static Property fromJson(JsonElement json) throws OpenemsNamedException {
String name = JsonUtils.getAsString(json, "name");
String description = JsonUtils.getAsString(json, "description");
boolean isRequired = JsonUtils.getAsBoolean(json, "isRequired");
- JsonElement defaultValue = JsonUtils.getOptionalSubElement(json, "defaultValue").orElse(JsonNull.INSTANCE);
+ JsonElement defaultValue = JsonUtils.getOptionalSubElement(json, "defaultValue")
+ .orElse(JsonNull.INSTANCE);
JsonObject schema = JsonUtils.getAsJsonObject(json, "schema");
return new Property(id, name, description, isRequired, defaultValue, schema);
}
@@ -272,18 +584,24 @@ public JsonObject toJson() {
}
+ private final String id;
private final String name;
- private String description;
- private Property[] properties;
+ private final String description;
+ private final Property[] properties;
private final String[] natureIds;
- public Factory(String name, String description, Property[] properties, String[] natureIds) {
+ public Factory(String id, String name, String description, Property[] properties, String[] natureIds) {
+ this.id = id;
this.name = name;
this.description = description;
this.properties = properties;
this.natureIds = natureIds;
}
+ public String getId() {
+ return id;
+ }
+
public String getName() {
return name;
}
@@ -335,17 +653,28 @@ public JsonObject toJson() {
* @return the Factory
* @throws OpenemsNamedException on error
*/
- public static Factory fromJson(JsonElement json) throws OpenemsNamedException {
- String name = JsonUtils.getAsString(json, "name");
- String description = JsonUtils.getAsString(json, "description");
- String[] natureIds = JsonUtils.getAsStringArray(JsonUtils.getAsJsonArray(json, "natureIds"));
- JsonArray jProperties = JsonUtils.getAsJsonArray(json, "properties");
- Property[] properties = new Property[jProperties.size()];
- for (int i = 0; i < jProperties.size(); i++) {
- JsonElement jProperty = jProperties.get(i);
- properties[i] = Property.fromJson(jProperty);
- }
- return new Factory(name, description, properties, natureIds);
+ public static Factory fromJson(String factoryId, JsonElement json) throws OpenemsNamedException {
+ // TODO Update to latest OpenEMS Edge! Remove "Optional"
+ String name = JsonUtils.getAsOptionalString(json, "name").orElse("Undefined");
+ String description = JsonUtils.getAsOptionalString(json, "description").orElse("");
+ Optional natureIdsOpt = JsonUtils.getAsOptionalJsonArray(json, "natureIds");
+ if (!natureIdsOpt.isPresent()) {
+ natureIdsOpt = JsonUtils.getAsOptionalJsonArray(json, "natures");
+ }
+ String[] natureIds = JsonUtils.getAsStringArray(natureIdsOpt.get());
+ Optional jPropertiesOpt = JsonUtils.getAsOptionalJsonArray(json, "properties");
+ Property[] properties;
+ if (jPropertiesOpt.isPresent()) {
+ JsonArray jProperties = jPropertiesOpt.get();
+ properties = new Property[jProperties.size()];
+ for (int i = 0; i < jProperties.size(); i++) {
+ JsonElement jProperty = jProperties.get(i);
+ properties[i] = Property.fromJson(jProperty);
+ }
+ } else {
+ properties = new Property[0];
+ }
+ return new Factory(factoryId, name, description, properties, natureIds);
}
}
@@ -445,7 +774,7 @@ public List getComponentsImplementingNature(String nature) {
*/
public JsonObject toJson() {
return JsonUtils.buildJsonObject() //
- .add("components", this.componentsToJson()) //
+ .add("components", this.componentsToJson(JsonFormat.COMPLETE)) //
.add("factories", this.factoriesToJson()) //
.build();
}
@@ -461,10 +790,10 @@ public JsonObject toJson() {
*
* @return Components as a JSON Object
*/
- public JsonObject componentsToJson() {
+ public JsonObject componentsToJson(JsonFormat jsonFormat) {
JsonObject components = new JsonObject();
for (Entry entry : this.getComponents().entrySet()) {
- components.add(entry.getKey(), entry.getValue().toJson());
+ components.add(entry.getKey(), entry.getValue().toJson(jsonFormat));
}
return components;
}
@@ -504,11 +833,11 @@ public static EdgeConfig fromJson(JsonObject json) throws OpenemsNamedException
}
for (Entry entry : JsonUtils.getAsJsonObject(json, "components").entrySet()) {
- result.addComponent(entry.getKey(), Component.fromJson(entry.getValue()));
+ result.addComponent(entry.getKey(), Component.fromJson(entry.getKey(), entry.getValue()));
}
for (Entry entry : JsonUtils.getAsJsonObject(json, "factories").entrySet()) {
- result.addFactory(entry.getKey(), Factory.fromJson(entry.getValue()));
+ result.addFactory(entry.getKey(), Factory.fromJson(entry.getKey(), entry.getValue()));
}
return result;
@@ -522,6 +851,7 @@ private static EdgeConfig fromOldJsonFormat(JsonObject json) throws OpenemsNamed
for (Entry entry : things.entrySet()) {
JsonObject config = JsonUtils.getAsJsonObject(entry.getValue());
String id = JsonUtils.getAsString(config, "id");
+ String alias = JsonUtils.getAsOptionalString(config, "alias").orElse(id);
String clazz = JsonUtils.getAsString(config, "class");
TreeMap properties = new TreeMap<>();
for (Entry property : config.entrySet()) {
@@ -538,7 +868,8 @@ private static EdgeConfig fromOldJsonFormat(JsonObject json) throws OpenemsNamed
}
}
}
- result.addComponent(id, new EdgeConfig.Component(clazz, properties));
+ TreeMap channels = new TreeMap<>();
+ result.addComponent(id, new EdgeConfig.Component(id, alias, clazz, properties, channels));
}
JsonObject metas = JsonUtils.getAsJsonObject(json, "meta");
@@ -546,8 +877,8 @@ private static EdgeConfig fromOldJsonFormat(JsonObject json) throws OpenemsNamed
JsonObject meta = JsonUtils.getAsJsonObject(entry.getValue());
String id = JsonUtils.getAsString(meta, "class");
String[] implement = JsonUtils.getAsStringArray(JsonUtils.getAsJsonArray(meta, "implements"));
- Property[] properties = new Property[0];
- result.addFactory(id, new EdgeConfig.Factory(id, "", properties, implement));
+ Factory.Property[] properties = new Factory.Property[0];
+ result.addFactory(id, new EdgeConfig.Factory(id, id, "", properties, implement));
}
return result;
diff --git a/io.openems.edge.common/src/io/openems/edge/common/channel/OptionsEnum.java b/io.openems.common/src/io/openems/common/types/OptionsEnum.java
similarity index 93%
rename from io.openems.edge.common/src/io/openems/edge/common/channel/OptionsEnum.java
rename to io.openems.common/src/io/openems/common/types/OptionsEnum.java
index 77e66a08449..7661e37e31c 100644
--- a/io.openems.edge.common/src/io/openems/edge/common/channel/OptionsEnum.java
+++ b/io.openems.common/src/io/openems/common/types/OptionsEnum.java
@@ -1,4 +1,4 @@
-package io.openems.edge.common.channel;
+package io.openems.common.types;
public interface OptionsEnum {
diff --git a/io.openems.common/src/io/openems/common/utils/JsonUtils.java b/io.openems.common/src/io/openems/common/utils/JsonUtils.java
index d9acb4047f1..6e5e4cf1966 100644
--- a/io.openems.common/src/io/openems/common/utils/JsonUtils.java
+++ b/io.openems.common/src/io/openems/common/utils/JsonUtils.java
@@ -48,6 +48,48 @@ public static boolean getAsBoolean(JsonElement jElement, String memberName) thro
return jPrimitive.getAsBoolean();
}
+ public static Optional getAsOptionalBoolean(JsonElement element, String memberName) {
+ try {
+ return Optional.of(getAsBoolean(element, memberName));
+ } catch (OpenemsNamedException e) {
+ return Optional.empty();
+ }
+ }
+
+ public static > E getAsEnum(Class enumType, JsonElement jElement, String memberName)
+ throws OpenemsNamedException {
+ String element = getAsString(jElement, memberName);
+ try {
+ return (E) Enum.valueOf(enumType, element);
+ } catch (IllegalArgumentException e) {
+ throw OpenemsError.JSON_NO_ENUM_MEMBER.exception(memberName, element);
+ }
+ }
+
+ public static > Optional getAsOptionalEnum(Class enumType, JsonElement jElement,
+ String memberName) {
+ Optional elementOpt = getAsOptionalString(jElement, memberName);
+ if (!elementOpt.isPresent()) {
+ return Optional.empty();
+ }
+ try {
+ return Optional.ofNullable((E) Enum.valueOf(enumType, elementOpt.get()));
+ } catch (IllegalArgumentException e) {
+ return Optional.empty();
+ }
+ }
+
+ public static int getAsInt(JsonElement jElement) throws OpenemsNamedException {
+ JsonPrimitive jPrimitive = getAsPrimitive(jElement);
+ if (jPrimitive.isNumber()) {
+ return jPrimitive.getAsInt();
+ } else if (jPrimitive.isString()) {
+ String string = jPrimitive.getAsString();
+ return Integer.parseInt(string);
+ }
+ throw OpenemsError.JSON_NO_INTEGER.exception(jPrimitive.toString().replaceAll("%", "%%"));
+ }
+
public static int getAsInt(JsonElement jElement, String memberName) throws OpenemsNamedException {
JsonPrimitive jPrimitive = getAsPrimitive(jElement, memberName);
if (jPrimitive.isNumber()) {
@@ -208,6 +250,14 @@ public static long getAsLong(JsonElement jElement, String memberName) throws Ope
throw OpenemsError.JSON_NO_NUMBER.exception(jPrimitive.toString().replaceAll("%", "%%"));
}
+ public static Optional getAsOptionalInt(JsonElement jElement) {
+ try {
+ return Optional.of(getAsInt(jElement));
+ } catch (OpenemsNamedException e) {
+ return Optional.empty();
+ }
+ }
+
public static Optional getAsOptionalInt(JsonElement jElement, String memberName) {
try {
return Optional.of(getAsInt(jElement, memberName));
diff --git a/io.openems.common/src/io/openems/common/worker/AbstractImmediateWorker.java b/io.openems.common/src/io/openems/common/worker/AbstractImmediateWorker.java
index 99b15886bcb..a74cba83ca5 100644
--- a/io.openems.common/src/io/openems/common/worker/AbstractImmediateWorker.java
+++ b/io.openems.common/src/io/openems/common/worker/AbstractImmediateWorker.java
@@ -25,5 +25,5 @@ protected final int getCycleTime() {
}
@Override
- protected abstract void forever();
+ protected abstract void forever() throws InterruptedException;
}
diff --git a/io.openems.common/src/io/openems/common/worker/AbstractWorker.java b/io.openems.common/src/io/openems/common/worker/AbstractWorker.java
index 69b581eafcc..66084e2e784 100644
--- a/io.openems.common/src/io/openems/common/worker/AbstractWorker.java
+++ b/io.openems.common/src/io/openems/common/worker/AbstractWorker.java
@@ -89,7 +89,7 @@ public void run() {
/*
* Wait for next cycle
*/
- int cycleTime = getCycleTime();
+ int cycleTime = AbstractWorker.this.getCycleTime();
if (cycleTime == DO_NOT_WAIT) {
// no wait
} else if (cycleTime > 0) {
@@ -109,7 +109,7 @@ public void run() {
/*
* Call forever() forever.
*/
- forever();
+ AbstractWorker.this.forever();
// Everything went ok -> reset onWorkerExceptionSleep
onWorkerExceptionSleep = 1;
diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun
index 5e1294c46f5..8f706418f2d 100644
--- a/io.openems.edge.application/EdgeApp.bndrun
+++ b/io.openems.edge.application/EdgeApp.bndrun
@@ -36,10 +36,12 @@
bnd.identity;id='io.openems.edge.controller.debug.detailedlog',\
bnd.identity;id='io.openems.edge.controller.debug.log',\
bnd.identity;id='io.openems.edge.controller.dischargelimitconsideringcellvoltage',\
+ bnd.identity;id='io.openems.edge.controller.ess.acisland',\
bnd.identity;id='io.openems.edge.controller.ess.limittotaldischarge',\
bnd.identity;id='io.openems.edge.controller.ess.onefullcycle',\
bnd.identity;id='io.openems.edge.controller.evcs',\
bnd.identity;id='io.openems.edge.controller.highloadtimeslot',\
+ bnd.identity;id='io.openems.edge.controller.io.alarm',\
bnd.identity;id='io.openems.edge.controller.io.fixdigitaloutput',\
bnd.identity;id='io.openems.edge.controller.symmetric.balancing',\
bnd.identity;id='io.openems.edge.controller.symmetric.balancingschedule',\
@@ -51,6 +53,7 @@
bnd.identity;id='io.openems.edge.controller.symmetric.randompower',\
bnd.identity;id='io.openems.edge.controller.symmetric.reactivepowervoltagecharacteristic',\
bnd.identity;id='io.openems.edge.core',\
+ bnd.identity;id='io.openems.edge.ess.byd.container',\
bnd.identity;id='io.openems.edge.ess.cluster',\
bnd.identity;id='io.openems.edge.ess.core',\
bnd.identity;id='io.openems.edge.ess.fenecon.commercial40',\
@@ -67,11 +70,13 @@
bnd.identity;id='io.openems.edge.io.kmtronic',\
bnd.identity;id='io.openems.edge.io.wago',\
bnd.identity;id='io.openems.edge.kostal.piko',\
+ bnd.identity;id='io.openems.edge.meter.artemes.am2',\
bnd.identity;id='io.openems.edge.meter.bcontrol.em300',\
bnd.identity;id='io.openems.edge.meter.carlo.gavazzi.em300',\
bnd.identity;id='io.openems.edge.meter.janitza.umg96rme',\
bnd.identity;id='io.openems.edge.meter.microcare.sdm630',\
bnd.identity;id='io.openems.edge.meter.socomec',\
+ bnd.identity;id='io.openems.edge.meter.virtual',\
bnd.identity;id='io.openems.edge.meter.weidmueller',\
bnd.identity;id='io.openems.edge.pvinverter.solarlog',\
bnd.identity;id='io.openems.edge.scheduler.allalphabetically',\
@@ -82,18 +87,13 @@
com.google.gson;version='[2.8.5,2.8.6)',\
com.google.guava.failureaccess;version='[1.0.1,1.0.2)',\
io.openems.common;version=snapshot,\
- io.openems.edge.application;version=snapshot,\
io.openems.edge.battery.soltaro;version=snapshot,\
io.openems.edge.bridge.modbus;version=snapshot,\
io.openems.edge.common;version=snapshot,\
- io.openems.edge.controller.api.backend;version=snapshot,\
io.openems.edge.controller.api.core;version=snapshot,\
- io.openems.edge.controller.api.rest;version=snapshot,\
io.openems.edge.core;version=snapshot,\
io.openems.edge.ess.core;version=snapshot,\
- io.openems.edge.ess.kaco.blueplanet.gridsave50;version=snapshot,\
io.openems.edge.scheduler.fixedorder;version=snapshot,\
- io.openems.edge.simulator;version=snapshot,\
io.openems.edge.timedata.influxdb;version=snapshot,\
io.openems.shared.influxdb;version=snapshot,\
io.openems.wrapper.influxdb-java;version=snapshot,\
@@ -116,21 +116,36 @@
org.eclipse.equinox.metatype;version='[1.4.100,1.4.101)',\
org.osgi.service.event;version='[1.3.1,1.3.2)',\
org.osgi.service.metatype;version='[1.3.0,1.3.1)',\
+ io.openems.edge.controller.chp.soc;version=snapshot,\
+ io.openems.edge.pvinverter.solarlog;version=snapshot,\
+ org.jsr-305;version='[3.0.2,3.0.3)',\
+ com.fazecast.jSerialComm;version='[2.2.2,2.2.3)',\
+ com.ghgande.j2mod;version='[2.5.2,2.5.3)',\
+ com.google.guava;version='[27.1.0,27.1.1)',\
+ io.openems.edge.application;version=snapshot,\
+ io.openems.edge.controller.api.backend;version=snapshot,\
io.openems.edge.controller.api.modbus;version=snapshot,\
+ io.openems.edge.controller.api.rest;version=snapshot,\
io.openems.edge.controller.api.websocket;version=snapshot,\
+ io.openems.edge.ess.fenecon.commercial40;version=snapshot,\
+ io.openems.edge.ess.mr.gridcon;version=snapshot,\
+ io.openems.edge.ess.sinexcel;version=snapshot,\
+ io.openems.edge.evcs.keba.kecontact;version=snapshot,\
+ io.openems.edge.kostal.piko;version=snapshot,\
io.openems.edge.controller.asymmetric.balancingcosphi;version=snapshot,\
io.openems.edge.controller.asymmetric.fixactivepower;version=snapshot,\
io.openems.edge.controller.asymmetric.fixreactivepower;version=snapshot,\
io.openems.edge.controller.asymmetric.phaserectification;version=snapshot,\
io.openems.edge.controller.channelthreshold;version=snapshot,\
- io.openems.edge.controller.chp.soc;version=snapshot,\
io.openems.edge.controller.debug.detailedlog;version=snapshot,\
io.openems.edge.controller.debug.log;version=snapshot,\
io.openems.edge.controller.dischargelimitconsideringcellvoltage;version=snapshot,\
+ io.openems.edge.controller.ess.acisland;version=snapshot,\
io.openems.edge.controller.ess.limittotaldischarge;version=snapshot,\
io.openems.edge.controller.ess.onefullcycle;version=snapshot,\
io.openems.edge.controller.evcs;version=snapshot,\
io.openems.edge.controller.highloadtimeslot;version=snapshot,\
+ io.openems.edge.controller.io.alarm;version=snapshot,\
io.openems.edge.controller.io.fixdigitaloutput;version=snapshot,\
io.openems.edge.controller.symmetric.balancing;version=snapshot,\
io.openems.edge.controller.symmetric.balancingschedule;version=snapshot,\
@@ -140,30 +155,27 @@
io.openems.edge.controller.symmetric.linearpowerband;version=snapshot,\
io.openems.edge.controller.symmetric.peakshaving;version=snapshot,\
io.openems.edge.controller.symmetric.randompower;version=snapshot,\
+ io.openems.edge.controller.symmetric.reactivepowervoltagecharacteristic;version=snapshot,\
io.openems.edge.ess.cluster;version=snapshot,\
- io.openems.edge.ess.fenecon.commercial40;version=snapshot,\
- io.openems.edge.ess.mr.gridcon;version=snapshot,\
+ io.openems.edge.ess.kaco.blueplanet.gridsave50;version=snapshot,\
io.openems.edge.ess.refu;version=snapshot,\
- io.openems.edge.ess.sinexcel;version=snapshot,\
- io.openems.edge.evcs.keba.kecontact;version=snapshot,\
- io.openems.edge.meter.weidmueller;version=snapshot,\
+ io.openems.edge.ess.sma;version=snapshot,\
io.openems.edge.ess.streetscooter;version=snapshot,\
io.openems.edge.fenecon.dess;version=snapshot,\
io.openems.edge.fenecon.mini;version=snapshot,\
io.openems.edge.fenecon.pro;version=snapshot,\
io.openems.edge.io.kmtronic;version=snapshot,\
io.openems.edge.io.wago;version=snapshot,\
- io.openems.edge.kostal.piko;version=snapshot,\
io.openems.edge.meter.bcontrol.em300;version=snapshot,\
io.openems.edge.meter.carlo.gavazzi.em300;version=snapshot,\
io.openems.edge.meter.janitza.umg96rme;version=snapshot,\
io.openems.edge.meter.microcare.sdm630;version=snapshot,\
io.openems.edge.meter.socomec;version=snapshot,\
- io.openems.edge.pvinverter.solarlog;version=snapshot,\
+ io.openems.edge.meter.weidmueller;version=snapshot,\
io.openems.edge.scheduler.allalphabetically;version=snapshot,\
- io.openems.edge.ess.sma;version=snapshot,\
- io.openems.edge.controller.symmetric.reactivepowervoltagecharacteristic;version=snapshot,\
- org.jsr-305;version='[3.0.2,3.0.3)',\
- com.fazecast.jSerialComm;version='[2.2.2,2.2.3)',\
- com.ghgande.j2mod;version='[2.5.2,2.5.3)',\
- com.google.guava;version='[27.1.0,27.1.1)'
\ No newline at end of file
+ io.openems.edge.simulator;version=snapshot,\
+ io.openems.edge.meter.virtual;version=snapshot,\
+ io.openems.edge.meter.artemes.am2;version=snapshot,\
+ io.openems.edge.ess.byd.container;version=snapshot,\
+ io.openems.wrapper.fastexcel;version=snapshot,\
+ io.openems.wrapper.opczip;version=snapshot
\ No newline at end of file
diff --git a/io.openems.edge.battery.api/src/io/openems/edge/battery/api/Battery.java b/io.openems.edge.battery.api/src/io/openems/edge/battery/api/Battery.java
index a99c19a0bfd..cf0a9b93341 100644
--- a/io.openems.edge.battery.api/src/io/openems/edge/battery/api/Battery.java
+++ b/io.openems.edge.battery.api/src/io/openems/edge/battery/api/Battery.java
@@ -2,10 +2,11 @@
import org.osgi.annotation.versioning.ProviderType;
+import io.openems.common.channel.AccessMode;
+import io.openems.common.channel.Unit;
import io.openems.common.types.OpenemsType;
import io.openems.edge.common.channel.Channel;
import io.openems.edge.common.channel.Doc;
-import io.openems.edge.common.channel.Unit;
import io.openems.edge.common.component.OpenemsComponent;
import io.openems.edge.common.modbusslave.ModbusSlaveNatureTable;
import io.openems.edge.common.modbusslave.ModbusType;
@@ -68,7 +69,7 @@ public enum ChannelId implements io.openems.edge.common.channel.ChannelId {
* Unit: mA
*
*/
- CURRENT(Doc.of(OpenemsType.INTEGER).unit(Unit.MILLIAMPERE)),
+ CURRENT(Doc.of(OpenemsType.INTEGER).unit(Unit.AMPERE)),
/**
* Capacity of battery.
@@ -180,8 +181,8 @@ public Doc doc() {
}
}
- public static ModbusSlaveNatureTable getModbusSlaveNatureTable() {
- return ModbusSlaveNatureTable.of(Battery.class, 100) //
+ public static ModbusSlaveNatureTable getModbusSlaveNatureTable(AccessMode accessMode) {
+ return ModbusSlaveNatureTable.of(Battery.class, accessMode, 100) //
.channel(0, ChannelId.SOC, ModbusType.UINT16) //
.channel(1, ChannelId.SOH, ModbusType.UINT16) //
.channel(2, ChannelId.VOLTAGE, ModbusType.FLOAT32) //
diff --git a/io.openems.edge.battery.api/src/io/openems/edge/battery/test/DummyBattery.java b/io.openems.edge.battery.api/src/io/openems/edge/battery/test/DummyBattery.java
index 96a485ef465..a381b0e5739 100644
--- a/io.openems.edge.battery.api/src/io/openems/edge/battery/test/DummyBattery.java
+++ b/io.openems.edge.battery.api/src/io/openems/edge/battery/test/DummyBattery.java
@@ -21,7 +21,7 @@ public DummyBattery(String id) {
for (Channel> channel : this.channels()) {
channel.nextProcessImage();
}
- super.activate(null, id, true);
+ super.activate(null, id, "", true);
}
}
diff --git a/io.openems.edge.battery.soltaro/bnd.bnd b/io.openems.edge.battery.soltaro/bnd.bnd
index 67736f2681b..9011e5cff67 100644
--- a/io.openems.edge.battery.soltaro/bnd.bnd
+++ b/io.openems.edge.battery.soltaro/bnd.bnd
@@ -5,9 +5,10 @@ Bundle-Version: 1.0.0.${tstamp}
Export-Package: \
io.openems.edge.battery.api,\
io.openems.edge.battery.soltaro,\
- io.openems.edge.battery.soltaro.master,\
- io.openems.edge.battery.soltaro.versionb,\
- io.openems.edge.battery.soltaro.multirack
+ io.openems.edge.battery.soltaro.cluster.versiona,\
+ io.openems.edge.battery.soltaro.single.versionb,\
+ io.openems.edge.battery.soltaro.single.versiona,\
+ io.openems.edge.battery.soltaro.cluster.versionb
-includeresource: {readme.md}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/BatteryState.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/BatteryState.java
index c26dd75477f..317d99b10c3 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/BatteryState.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/BatteryState.java
@@ -5,4 +5,6 @@ public enum BatteryState {
DEFAULT,
ON,
OFF,
+ CONFIGURE
+ ;
}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/ChannelIdImpl.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ChannelIdImpl.java
similarity index 88%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/ChannelIdImpl.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ChannelIdImpl.java
index 03f40bc2705..1f768b322c4 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/ChannelIdImpl.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ChannelIdImpl.java
@@ -1,4 +1,4 @@
-package io.openems.edge.battery.soltaro.versionb;
+package io.openems.edge.battery.soltaro;
import io.openems.edge.common.channel.ChannelId;
import io.openems.edge.common.channel.Doc;
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/ModuleParameters.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ModuleParameters.java
similarity index 95%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/ModuleParameters.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ModuleParameters.java
index c1c1923a546..9afca778980 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/ModuleParameters.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ModuleParameters.java
@@ -1,4 +1,4 @@
-package io.openems.edge.battery.soltaro.versionb;
+package io.openems.edge.battery.soltaro;
public enum ModuleParameters {
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/State.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/State.java
similarity index 85%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/State.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/State.java
index 6ce54816582..a53b7f18465 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/State.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/State.java
@@ -1,9 +1,8 @@
-package io.openems.edge.battery.soltaro.master;
+package io.openems.edge.battery.soltaro;
-import io.openems.edge.common.channel.OptionsEnum;
+import io.openems.common.types.OptionsEnum;
public enum State implements OptionsEnum {
-
UNDEFINED("Undefined", -1), //
PENDING("Pending", 0), //
OFF("Off", 1), //
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Master.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Cluster.java
similarity index 54%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Master.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Cluster.java
index 78356b691bb..faff1314765 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Master.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Cluster.java
@@ -1,4 +1,4 @@
-package io.openems.edge.battery.soltaro.master;
+package io.openems.edge.battery.soltaro.cluster.versiona;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -22,15 +22,17 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import io.openems.common.exceptions.OpenemsException;
+import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
import io.openems.edge.battery.api.Battery;
import io.openems.edge.battery.soltaro.BatteryState;
-import io.openems.edge.battery.soltaro.master.Enums.RackUsage;
-import io.openems.edge.battery.soltaro.master.Enums.StartStop;
+import io.openems.edge.battery.soltaro.State;
+import io.openems.edge.battery.soltaro.cluster.versiona.Enums.RackUsage;
+import io.openems.edge.battery.soltaro.cluster.versiona.Enums.StartStop;
import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent;
import io.openems.edge.bridge.modbus.api.BridgeModbus;
import io.openems.edge.bridge.modbus.api.ElementToChannelConverter;
import io.openems.edge.bridge.modbus.api.ModbusProtocol;
+import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
import io.openems.edge.bridge.modbus.api.task.FC16WriteRegistersTask;
@@ -45,12 +47,12 @@
@Designate(ocd = Config.class, factory = true)
@Component( //
- name = "Bms.Fenecon.SoltaroMaster", //
+ name = "Bms.Soltaro.Cluster.VersionA", //
immediate = true, //
configurationPolicy = ConfigurationPolicy.REQUIRE, //
property = EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE //
)
-public class Master extends AbstractOpenemsModbusComponent implements Battery, OpenemsComponent, EventHandler {
+public class Cluster extends AbstractOpenemsModbusComponent implements Battery, OpenemsComponent, EventHandler {
public static final int DISCHARGE_MIN_V = 696;
public static final int CHARGE_MAX_V = 854;
@@ -58,7 +60,7 @@ public class Master extends AbstractOpenemsModbusComponent implements Battery, O
public static final int CHARGE_MAX_A = 0;
public static final Integer CAPACITY_KWH = 150;
- private final Logger log = LoggerFactory.getLogger(Master.class);
+ private final Logger log = LoggerFactory.getLogger(Cluster.class);
private String modbusBridgeId;
private BatteryState batteryState;
@Reference
@@ -66,17 +68,17 @@ public class Master extends AbstractOpenemsModbusComponent implements Battery, O
private State state = State.UNDEFINED;
private Config config;
- public Master() {
+ public Cluster() {
super(//
OpenemsComponent.ChannelId.values(), //
Battery.ChannelId.values(), //
- MasterChannelId.values() //
+ ClusterChannelId.values() //
);
- this.channel(Battery.ChannelId.CHARGE_MAX_CURRENT).setNextValue(Master.CHARGE_MAX_A);
- this.channel(Battery.ChannelId.CHARGE_MAX_VOLTAGE).setNextValue(Master.CHARGE_MAX_V);
- this.channel(Battery.ChannelId.DISCHARGE_MAX_CURRENT).setNextValue(Master.DISCHARGE_MAX_A);
- this.channel(Battery.ChannelId.DISCHARGE_MIN_VOLTAGE).setNextValue(Master.DISCHARGE_MIN_V);
- this.channel(Battery.ChannelId.CAPACITY).setNextValue(Master.CAPACITY_KWH);
+ this.channel(Battery.ChannelId.CHARGE_MAX_CURRENT).setNextValue(Cluster.CHARGE_MAX_A);
+ this.channel(Battery.ChannelId.CHARGE_MAX_VOLTAGE).setNextValue(Cluster.CHARGE_MAX_V);
+ this.channel(Battery.ChannelId.DISCHARGE_MAX_CURRENT).setNextValue(Cluster.DISCHARGE_MAX_A);
+ this.channel(Battery.ChannelId.DISCHARGE_MIN_VOLTAGE).setNextValue(Cluster.DISCHARGE_MIN_V);
+ this.channel(Battery.ChannelId.CAPACITY).setNextValue(Cluster.CAPACITY_KWH);
}
@Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY)
@@ -86,9 +88,9 @@ protected void setModbus(BridgeModbus modbus) {
@Activate
void activate(ComponentContext context, Config config) {
- log.info("Master.activate()");
+ log.info("Cluster.activate()");
this.config = config;
- super.activate(context, config.id(), config.enabled(), config.modbusUnitId(), this.cm, "Modbus",
+ super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, "Modbus",
config.modbus_id());
this.modbusBridgeId = config.modbus_id();
@@ -104,9 +106,9 @@ private void recalcMaxCurrent() {
if (config.rack1IsUsed() && !config.rack2IsUsed() && !config.rack3IsUsed()) {
// Only rack 1 is configured --> use max current of rack 1
Optional chargeMaxCurrentOpt = (Optional) this
- .channel(MasterChannelId.RACK_1_MAX_CHARGE_CURRENT).value().asOptional();
+ .channel(ClusterChannelId.RACK_1_MAX_CHARGE_CURRENT).value().asOptional();
Optional dischargeMaxCurrentOpt = (Optional) this
- .channel(MasterChannelId.RACK_1_MAX_DISCHARGE_CURRENT).value().asOptional();
+ .channel(ClusterChannelId.RACK_1_MAX_DISCHARGE_CURRENT).value().asOptional();
if (chargeMaxCurrentOpt.isPresent()) {
chargeMaxCurrent = chargeMaxCurrentOpt.get();
}
@@ -116,9 +118,9 @@ private void recalcMaxCurrent() {
} else if (!config.rack1IsUsed() && config.rack2IsUsed() && !config.rack3IsUsed()) {
// Only rack 2 is configured --> use max current of rack 2
Optional chargeMaxCurrentOpt = (Optional) this
- .channel(MasterChannelId.RACK_2_MAX_CHARGE_CURRENT).value().asOptional();
+ .channel(ClusterChannelId.RACK_2_MAX_CHARGE_CURRENT).value().asOptional();
Optional dischargeMaxCurrentOpt = (Optional) this
- .channel(MasterChannelId.RACK_2_MAX_DISCHARGE_CURRENT).value().asOptional();
+ .channel(ClusterChannelId.RACK_2_MAX_DISCHARGE_CURRENT).value().asOptional();
if (chargeMaxCurrentOpt.isPresent()) {
chargeMaxCurrent = chargeMaxCurrentOpt.get();
}
@@ -128,9 +130,9 @@ private void recalcMaxCurrent() {
} else if (!config.rack1IsUsed() && !config.rack2IsUsed() && config.rack3IsUsed()) {
// Only rack 3 is configured --> use max current of rack 3
Optional chargeMaxCurrentOpt = (Optional) this
- .channel(MasterChannelId.RACK_3_MAX_CHARGE_CURRENT).value().asOptional();
+ .channel(ClusterChannelId.RACK_3_MAX_CHARGE_CURRENT).value().asOptional();
Optional dischargeMaxCurrentOpt = (Optional) this
- .channel(MasterChannelId.RACK_3_MAX_DISCHARGE_CURRENT).value().asOptional();
+ .channel(ClusterChannelId.RACK_3_MAX_DISCHARGE_CURRENT).value().asOptional();
if (chargeMaxCurrentOpt.isPresent()) {
chargeMaxCurrent = chargeMaxCurrentOpt.get();
}
@@ -139,10 +141,10 @@ private void recalcMaxCurrent() {
}
} else {
// more than one rack is configured, use information of cluster
- Optional chargeMaxCurrentOpt = (Optional) this.channel(MasterChannelId.CHARGE_MAX_CURRENT)
+ Optional chargeMaxCurrentOpt = (Optional) this.channel(ClusterChannelId.CHARGE_MAX_CURRENT_CLUSTER)
.value().asOptional();
Optional dischargeMaxCurrentOpt = (Optional) this
- .channel(MasterChannelId.DISCHARGE_MAX_CURRENT).value().asOptional();
+ .channel(ClusterChannelId.DISCHARGE_MAX_CURRENT_CLUSTER).value().asOptional();
if (chargeMaxCurrentOpt.isPresent()) {
chargeMaxCurrent = chargeMaxCurrentOpt.get();
}
@@ -183,6 +185,9 @@ private void handleBatteryState() {
case ON:
startSystem();
break;
+ case CONFIGURE:
+ System.out.println("Cluster cannot be configured currently!");
+ break;
}
}
@@ -194,7 +199,7 @@ private void handleBatteryState() {
private LocalDateTime startAttemptTime = null;
private void handleStateMachine() {
- log.info("Master.doNormalHandling(): State: " + this.getStateMachineState());
+ log.info("Cluster.doNormalHandling(): State: " + this.getStateMachineState());
boolean readyForWorking = false;
switch (this.getStateMachineState()) {
case ERROR:
@@ -272,73 +277,73 @@ private void handleStateMachine() {
}
private boolean isError() {
- if (readValueFromStateChannel(MasterChannelId.MASTER_ALARM_PCS_OUT_OF_CONTROL))
+ if (readValueFromStateChannel(ClusterChannelId.MASTER_ALARM_PCS_OUT_OF_CONTROL))
return true;
if (config.rack1IsUsed()) {
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_CHA_CURRENT_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_CHA_CURRENT_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_VOLTAGE_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_VOLTAGE_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW))
return true;
}
if (config.rack2IsUsed()) {
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_CHA_CURRENT_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_CHA_CURRENT_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_VOLTAGE_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_VOLTAGE_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW))
return true;
}
if (config.rack3IsUsed()) {
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_CHA_CURRENT_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_CHA_CURRENT_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_VOLTAGE_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_VOLTAGE_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH))
return true;
- if (readValueFromStateChannel(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW))
+ if (readValueFromStateChannel(ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW))
return true;
}
return false;
@@ -355,9 +360,9 @@ private boolean isSystemStopped() {
// racks are configured, the other ones
// must also be stopped, otherwise status is not clear
- IntegerReadChannel rack1StateChannel = this.channel(MasterChannelId.RACK_1_STATE);
- IntegerReadChannel rack2StateChannel = this.channel(MasterChannelId.RACK_2_STATE);
- IntegerReadChannel rack3StateChannel = this.channel(MasterChannelId.RACK_3_STATE);
+ IntegerReadChannel rack1StateChannel = this.channel(ClusterChannelId.RACK_1_STATE);
+ IntegerReadChannel rack2StateChannel = this.channel(ClusterChannelId.RACK_2_STATE);
+ IntegerReadChannel rack3StateChannel = this.channel(ClusterChannelId.RACK_3_STATE);
Optional v1 = rack1StateChannel.value().asOptional();
Optional v2 = rack2StateChannel.value().asOptional();
@@ -375,9 +380,9 @@ private boolean isSystemRunning() {
// stopped, otherwise
// status is not definitively clear
- IntegerReadChannel rack1StateChannel = this.channel(MasterChannelId.RACK_1_STATE);
- IntegerReadChannel rack2StateChannel = this.channel(MasterChannelId.RACK_2_STATE);
- IntegerReadChannel rack3StateChannel = this.channel(MasterChannelId.RACK_3_STATE);
+ IntegerReadChannel rack1StateChannel = this.channel(ClusterChannelId.RACK_1_STATE);
+ IntegerReadChannel rack2StateChannel = this.channel(ClusterChannelId.RACK_2_STATE);
+ IntegerReadChannel rack3StateChannel = this.channel(ClusterChannelId.RACK_3_STATE);
Optional val1Opt = rack1StateChannel.value().asOptional();
Optional val2Opt = rack2StateChannel.value().asOptional();
@@ -423,19 +428,19 @@ private boolean isSystemRunning() {
private boolean isSystemStatePending() {
boolean ret = true;
if (ret && config.rack1IsUsed()) {
- IntegerReadChannel rack1StateChannel = this.channel(MasterChannelId.RACK_1_STATE);
+ IntegerReadChannel rack1StateChannel = this.channel(ClusterChannelId.RACK_1_STATE);
Optional val = rack1StateChannel.value().asOptional();
ret = ret && val.isPresent();
}
if (ret && config.rack2IsUsed()) {
- IntegerReadChannel rack2StateChannel = this.channel(MasterChannelId.RACK_2_STATE);
+ IntegerReadChannel rack2StateChannel = this.channel(ClusterChannelId.RACK_2_STATE);
Optional val = rack2StateChannel.value().asOptional();
ret = ret && val.isPresent();
}
if (ret && config.rack3IsUsed()) {
- IntegerReadChannel rack3StateChannel = this.channel(MasterChannelId.RACK_3_STATE);
+ IntegerReadChannel rack3StateChannel = this.channel(ClusterChannelId.RACK_3_STATE);
Optional val = rack3StateChannel.value().asOptional();
ret = ret && val.isPresent();
}
@@ -451,11 +456,11 @@ public String debugLog() {
}
private void startSystem() {
- IntegerWriteChannel rack1UsageChannel = this.channel(MasterChannelId.RACK_1_USAGE);
- IntegerWriteChannel rack2UsageChannel = this.channel(MasterChannelId.RACK_2_USAGE);
- IntegerWriteChannel rack3UsageChannel = this.channel(MasterChannelId.RACK_3_USAGE);
+ IntegerWriteChannel rack1UsageChannel = this.channel(ClusterChannelId.RACK_1_USAGE);
+ IntegerWriteChannel rack2UsageChannel = this.channel(ClusterChannelId.RACK_2_USAGE);
+ IntegerWriteChannel rack3UsageChannel = this.channel(ClusterChannelId.RACK_3_USAGE);
- IntegerWriteChannel startStopChannel = this.channel(MasterChannelId.START_STOP);
+ IntegerWriteChannel startStopChannel = this.channel(ClusterChannelId.START_STOP);
try {
startStopChannel.setNextWriteValue(StartStop.START.getValue());
@@ -474,23 +479,23 @@ private void startSystem() {
} else {
rack3UsageChannel.setNextWriteValue(RackUsage.UNUSED.getValue());
}
- } catch (OpenemsException e) {
+ } catch (OpenemsNamedException e) {
log.error("Error while trying to start system\n" + e.getMessage());
}
}
private void stopSystem() {
- IntegerWriteChannel startStopChannel = this.channel(MasterChannelId.START_STOP);
- IntegerWriteChannel rack1UsageChannel = this.channel(MasterChannelId.RACK_1_USAGE);
- IntegerWriteChannel rack2UsageChannel = this.channel(MasterChannelId.RACK_2_USAGE);
- IntegerWriteChannel rack3UsageChannel = this.channel(MasterChannelId.RACK_3_USAGE);
+ IntegerWriteChannel startStopChannel = this.channel(ClusterChannelId.START_STOP);
+ IntegerWriteChannel rack1UsageChannel = this.channel(ClusterChannelId.RACK_1_USAGE);
+ IntegerWriteChannel rack2UsageChannel = this.channel(ClusterChannelId.RACK_2_USAGE);
+ IntegerWriteChannel rack3UsageChannel = this.channel(ClusterChannelId.RACK_3_USAGE);
try {
startStopChannel.setNextWriteValue(StartStop.STOP.getValue());
rack1UsageChannel.setNextWriteValue(RackUsage.UNUSED.getValue());
rack2UsageChannel.setNextWriteValue(RackUsage.UNUSED.getValue());
rack3UsageChannel.setNextWriteValue(RackUsage.UNUSED.getValue());
- } catch (OpenemsException e) {
+ } catch (OpenemsNamedException e) {
log.error("Error while trying to stop system\n" + e.getMessage());
}
}
@@ -505,7 +510,7 @@ public State getStateMachineState() {
public void setStateMachineState(State state) {
this.state = state;
- this.channel(MasterChannelId.STATE_MACHINE).setNextValue(this.state);
+ this.channel(ClusterChannelId.STATE_MACHINE).setNextValue(this.state);
}
private static final int BASE_ADDRESS_RACK_1 = 0x2000;
@@ -517,1327 +522,1327 @@ protected ModbusProtocol defineModbusProtocol() {
Collection tasks = new ArrayList<>();
tasks.addAll(Arrays.asList(new Task[] {
// -------- Registers of master --------------------------------------
- new FC16WriteRegistersTask(0x1017, m(MasterChannelId.START_STOP, new UnsignedWordElement(0x1017)), //
- m(MasterChannelId.RACK_1_USAGE, new UnsignedWordElement(0x1018)), //
- m(MasterChannelId.RACK_2_USAGE, new UnsignedWordElement(0x1019)), //
- m(MasterChannelId.RACK_3_USAGE, new UnsignedWordElement(0x101A)) //
+ new FC16WriteRegistersTask(0x1017, m(ClusterChannelId.START_STOP, new UnsignedWordElement(0x1017)), //
+ m(ClusterChannelId.RACK_1_USAGE, new UnsignedWordElement(0x1018)), //
+ m(ClusterChannelId.RACK_2_USAGE, new UnsignedWordElement(0x1019)), //
+ m(ClusterChannelId.RACK_3_USAGE, new UnsignedWordElement(0x101A)) //
), //
new FC3ReadRegistersTask(0x1017, Priority.HIGH,
- m(MasterChannelId.START_STOP, new UnsignedWordElement(0x1017)), //
- m(MasterChannelId.RACK_1_USAGE, new UnsignedWordElement(0x1018)), //
- m(MasterChannelId.RACK_2_USAGE, new UnsignedWordElement(0x1019)), //
- m(MasterChannelId.RACK_3_USAGE, new UnsignedWordElement(0x101A)) //
+ m(ClusterChannelId.START_STOP, new UnsignedWordElement(0x1017)), //
+ m(ClusterChannelId.RACK_1_USAGE, new UnsignedWordElement(0x1018)), //
+ m(ClusterChannelId.RACK_2_USAGE, new UnsignedWordElement(0x1019)), //
+ m(ClusterChannelId.RACK_3_USAGE, new UnsignedWordElement(0x101A)) //
), //
new FC3ReadRegistersTask(0x1044, Priority.LOW, //
- m(MasterChannelId.CHARGE_INDICATION, new UnsignedWordElement(0x1044)), //
- m(MasterChannelId.CURRENT, new UnsignedWordElement(0x1045), //
+ m(ClusterChannelId.CHARGE_INDICATION, new UnsignedWordElement(0x1044)), //
+ m(Battery.ChannelId.CURRENT, new UnsignedWordElement(0x1045), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
new DummyRegisterElement(0x1046, 0x1047), //
// m(Battery.ChannelId.SOC, new UnsignedWordElement(0x1047)), // SoC is not calculated correctly
- m(MasterChannelId.SYSTEM_RUNNING_STATE, new UnsignedWordElement(0x1048)), //
- m(MasterChannelId.VOLTAGE, new UnsignedWordElement(0x1049), //
+ m(ClusterChannelId.SYSTEM_RUNNING_STATE, new UnsignedWordElement(0x1048)), //
+ m(Battery.ChannelId.VOLTAGE, new UnsignedWordElement(0x1049), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
), //
new FC3ReadRegistersTask(0x104D, Priority.HIGH, //
- m(MasterChannelId.CHARGE_MAX_CURRENT, new UnsignedWordElement(0x104D),
+ m(ClusterChannelId.CHARGE_MAX_CURRENT_CLUSTER, new UnsignedWordElement(0x104D),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.DISCHARGE_MAX_CURRENT, new UnsignedWordElement(0x104E),
+ m(ClusterChannelId.DISCHARGE_MAX_CURRENT_CLUSTER, new UnsignedWordElement(0x104E),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
), //
new FC3ReadRegistersTask(0x1081, Priority.LOW, //
- bm(new UnsignedWordElement(0x1081)) //
- .m(MasterChannelId.MASTER_ALARM_PCS_OUT_OF_CONTROL, 1) //
- .m(MasterChannelId.MASTER_ALARM_PCS_COMMUNICATION_FAULT, 0) //
- .build(), //
- bm(new UnsignedWordElement(0x1082)) //
- .m(MasterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_1, 0) //
- .m(MasterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_2, 1) //
- .m(MasterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_3, 2) //
- .build() //
+ m(new BitsWordElement(0x1081, this) //
+ .bit(1, ClusterChannelId.MASTER_ALARM_PCS_OUT_OF_CONTROL) //
+ .bit(0, ClusterChannelId.MASTER_ALARM_PCS_COMMUNICATION_FAULT) //
+ ), //
+ m(new BitsWordElement(0x1082, this) //
+ .bit(0, ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_1) //
+ .bit(1, ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_2) //
+ .bit(2, ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_3) //
+ ) //
) //
}));
// ---------------- registers of rack 1 -----------------------------
tasks.addAll(Arrays.asList(new Task[] { new FC16WriteRegistersTask(BASE_ADDRESS_RACK_1 + 0x1, //
- m(MasterChannelId.RACK_1_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x1)) //
+ m(ClusterChannelId.RACK_1_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x1)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x1, Priority.HIGH, //
- m(MasterChannelId.RACK_1_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x1)) //
+ m(ClusterChannelId.RACK_1_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x1)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x100, Priority.LOW, //
- m(MasterChannelId.RACK_1_VOLTAGE, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x100), //
+ m(ClusterChannelId.RACK_1_VOLTAGE, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x100), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_1_CURRENT, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x101), //
+ m(ClusterChannelId.RACK_1_CURRENT, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x101), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_1_CHARGE_INDICATION,
+ m(ClusterChannelId.RACK_1_CHARGE_INDICATION,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x102)), //
- m(MasterChannelId.RACK_1_SOC,
+ m(ClusterChannelId.RACK_1_SOC,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x103).onUpdateCallback(val -> {
recalculateSoc();
})), //
- m(MasterChannelId.RACK_1_SOH, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x104)), //
- m(MasterChannelId.RACK_1_MAX_CELL_VOLTAGE_ID,
+ m(ClusterChannelId.RACK_1_SOH, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x104)), //
+ m(ClusterChannelId.RACK_1_MAX_CELL_VOLTAGE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x105)), //
- m(MasterChannelId.RACK_1_MAX_CELL_VOLTAGE,
+ m(ClusterChannelId.RACK_1_MAX_CELL_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x106)), //
- m(MasterChannelId.RACK_1_MIN_CELL_VOLTAGE_ID,
+ m(ClusterChannelId.RACK_1_MIN_CELL_VOLTAGE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x107)), //
- m(MasterChannelId.RACK_1_MIN_CELL_VOLTAGE,
+ m(ClusterChannelId.RACK_1_MIN_CELL_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x108)), //
- m(MasterChannelId.RACK_1_MAX_CELL_TEMPERATURE_ID,
+ m(ClusterChannelId.RACK_1_MAX_CELL_TEMPERATURE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x109)), //
- m(MasterChannelId.RACK_1_MAX_CELL_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_MAX_CELL_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x10A)), //
- m(MasterChannelId.RACK_1_MIN_CELL_TEMPERATURE_ID,
+ m(ClusterChannelId.RACK_1_MIN_CELL_TEMPERATURE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x10B)), //
- m(MasterChannelId.RACK_1_MIN_CELL_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_MIN_CELL_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x10C)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x140, Priority.LOW, //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x140)) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH, 0) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH, 1) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_CHA_CURRENT_HIGH, 2) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_VOLTAGE_LOW, 3) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW, 4) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH, 5) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH, 6) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW, 7) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH, 14) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW, 15) //
- .build(), //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x141)) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CELL_VOLTAGE_HIGH, 0) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH, 1) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CHA_CURRENT_HIGH, 2) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CELL_VOLTAGE_LOW, 3) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW, 4) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_DISCHA_CURRENT_HIGH, 5) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH, 6) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CELL_CHA_TEMP_LOW, 7) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_SOC_LOW, 8) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH, 9) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH, 11) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_INSULATION_LOW, 12) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH, 13) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH, 14) //
- .m(MasterChannelId.RACK_1_ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW, 15) //
- .build(), //
- m(MasterChannelId.RACK_1_RUN_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x142)) //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_1 + 0x140, this) //
+ .bit(0, ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH) //
+ .bit(1, ClusterChannelId.RACK_1_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH) //
+ .bit(2, ClusterChannelId.RACK_1_ALARM_LEVEL_2_CHA_CURRENT_HIGH) //
+ .bit(3, ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_VOLTAGE_LOW) //
+ .bit(4, ClusterChannelId.RACK_1_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW) //
+ .bit(5, ClusterChannelId.RACK_1_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH) //
+ .bit(6, ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH) //
+ .bit(7, ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW) //
+ .bit(14, ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH) //
+ .bit(15, ClusterChannelId.RACK_1_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW) //
+ ), //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_1 + 0x141, this) //
+ .bit(0, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CELL_VOLTAGE_HIGH) //
+ .bit(1, ClusterChannelId.RACK_1_ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH) //
+ .bit(2, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CHA_CURRENT_HIGH) //
+ .bit(3, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CELL_VOLTAGE_LOW) //
+ .bit(4, ClusterChannelId.RACK_1_ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW) //
+ .bit(5, ClusterChannelId.RACK_1_ALARM_LEVEL_1_DISCHA_CURRENT_HIGH) //
+ .bit(6, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH) //
+ .bit(7, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CELL_CHA_TEMP_LOW) //
+ .bit(8, ClusterChannelId.RACK_1_ALARM_LEVEL_1_SOC_LOW) //
+ .bit(9, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH) //
+ .bit(11, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH) //
+ .bit(12, ClusterChannelId.RACK_1_ALARM_LEVEL_1_INSULATION_LOW) //
+ .bit(13, ClusterChannelId.RACK_1_ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH) //
+ .bit(14, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH) //
+ .bit(15, ClusterChannelId.RACK_1_ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW) //
+ ), //
+ m(ClusterChannelId.RACK_1_RUN_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x142)) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x160, Priority.HIGH, //
- m(MasterChannelId.RACK_1_MAX_CHARGE_CURRENT,
+ m(ClusterChannelId.RACK_1_MAX_CHARGE_CURRENT,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x160),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_1_MAX_DISCHARGE_CURRENT,
+ m(ClusterChannelId.RACK_1_MAX_DISCHARGE_CURRENT,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x161),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x185, Priority.LOW, //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x185)) //
- .m(MasterChannelId.RACK_1_FAILURE_SAMPLING_WIRE, 0)//
- .m(MasterChannelId.RACK_1_FAILURE_CONNECTOR_WIRE, 1)//
- .m(MasterChannelId.RACK_1_FAILURE_LTC6803, 2)//
- .m(MasterChannelId.RACK_1_FAILURE_VOLTAGE_SAMPLING, 3)//
- .m(MasterChannelId.RACK_1_FAILURE_TEMP_SAMPLING, 4)//
- .m(MasterChannelId.RACK_1_FAILURE_TEMP_SENSOR, 5)//
- .m(MasterChannelId.RACK_1_FAILURE_BALANCING_MODULE, 8)//
- .m(MasterChannelId.RACK_1_FAILURE_TEMP_SAMPLING_LINE, 9)//
- .m(MasterChannelId.RACK_1_FAILURE_INTRANET_COMMUNICATION, 10)//
- .m(MasterChannelId.RACK_1_FAILURE_EEPROM, 11)//
- .m(MasterChannelId.RACK_1_FAILURE_INITIALIZATION, 12)//
- .build() //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_1 + 0x185, this) //
+ .bit(0, ClusterChannelId.RACK_1_FAILURE_SAMPLING_WIRE)//
+ .bit(1, ClusterChannelId.RACK_1_FAILURE_CONNECTOR_WIRE)//
+ .bit(2, ClusterChannelId.RACK_1_FAILURE_LTC6803)//
+ .bit(3, ClusterChannelId.RACK_1_FAILURE_VOLTAGE_SAMPLING)//
+ .bit(4, ClusterChannelId.RACK_1_FAILURE_TEMP_SAMPLING)//
+ .bit(5, ClusterChannelId.RACK_1_FAILURE_TEMP_SENSOR)//
+ .bit(8, ClusterChannelId.RACK_1_FAILURE_BALANCING_MODULE)//
+ .bit(9, ClusterChannelId.RACK_1_FAILURE_TEMP_SAMPLING_LINE)//
+ .bit(10, ClusterChannelId.RACK_1_FAILURE_INTRANET_COMMUNICATION)//
+ .bit(11, ClusterChannelId.RACK_1_FAILURE_EEPROM)//
+ .bit(12, ClusterChannelId.RACK_1_FAILURE_INITIALIZATION)//
+ ) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x800, Priority.LOW, //
- m(MasterChannelId.RACK_1_BATTERY_000_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_000_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x800)), //
- m(MasterChannelId.RACK_1_BATTERY_001_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_001_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x801)), //
- m(MasterChannelId.RACK_1_BATTERY_002_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_002_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x802)), //
- m(MasterChannelId.RACK_1_BATTERY_003_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_003_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x803)), //
- m(MasterChannelId.RACK_1_BATTERY_004_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_004_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x804)), //
- m(MasterChannelId.RACK_1_BATTERY_005_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_005_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x805)), //
- m(MasterChannelId.RACK_1_BATTERY_006_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_006_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x806)), //
- m(MasterChannelId.RACK_1_BATTERY_007_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_007_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x807)), //
- m(MasterChannelId.RACK_1_BATTERY_008_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_008_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x808)), //
- m(MasterChannelId.RACK_1_BATTERY_009_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_009_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x809)), //
- m(MasterChannelId.RACK_1_BATTERY_010_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_010_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x80A)), //
- m(MasterChannelId.RACK_1_BATTERY_011_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_011_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x80B)), //
- m(MasterChannelId.RACK_1_BATTERY_012_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_012_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x80C)), //
- m(MasterChannelId.RACK_1_BATTERY_013_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_013_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x80D)), //
- m(MasterChannelId.RACK_1_BATTERY_014_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_014_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x80E)), //
- m(MasterChannelId.RACK_1_BATTERY_015_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_015_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x80F)), //
- m(MasterChannelId.RACK_1_BATTERY_016_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_016_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x810)), //
- m(MasterChannelId.RACK_1_BATTERY_017_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_017_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x811)), //
- m(MasterChannelId.RACK_1_BATTERY_018_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_018_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x812)), //
- m(MasterChannelId.RACK_1_BATTERY_019_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_019_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x813)), //
- m(MasterChannelId.RACK_1_BATTERY_020_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_020_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x814)), //
- m(MasterChannelId.RACK_1_BATTERY_021_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_021_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x815)), //
- m(MasterChannelId.RACK_1_BATTERY_022_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_022_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x816)), //
- m(MasterChannelId.RACK_1_BATTERY_023_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_023_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x817)), //
- m(MasterChannelId.RACK_1_BATTERY_024_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_024_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x818)), //
- m(MasterChannelId.RACK_1_BATTERY_025_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_025_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x819)), //
- m(MasterChannelId.RACK_1_BATTERY_026_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_026_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x81A)), //
- m(MasterChannelId.RACK_1_BATTERY_027_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_027_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x81B)), //
- m(MasterChannelId.RACK_1_BATTERY_028_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_028_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x81C)), //
- m(MasterChannelId.RACK_1_BATTERY_029_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_029_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x81D)), //
- m(MasterChannelId.RACK_1_BATTERY_030_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_030_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x81E)), //
- m(MasterChannelId.RACK_1_BATTERY_031_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_031_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x81F)), //
- m(MasterChannelId.RACK_1_BATTERY_032_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_032_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x820)), //
- m(MasterChannelId.RACK_1_BATTERY_033_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_033_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x821)), //
- m(MasterChannelId.RACK_1_BATTERY_034_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_034_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x822)), //
- m(MasterChannelId.RACK_1_BATTERY_035_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_035_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x823)), //
- m(MasterChannelId.RACK_1_BATTERY_036_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_036_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x824)), //
- m(MasterChannelId.RACK_1_BATTERY_037_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_037_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x825)), //
- m(MasterChannelId.RACK_1_BATTERY_038_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_038_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x826)), //
- m(MasterChannelId.RACK_1_BATTERY_039_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_039_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x827)), //
- m(MasterChannelId.RACK_1_BATTERY_040_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_040_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x828)), //
- m(MasterChannelId.RACK_1_BATTERY_041_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_041_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x829)), //
- m(MasterChannelId.RACK_1_BATTERY_042_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_042_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x82A)), //
- m(MasterChannelId.RACK_1_BATTERY_043_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_043_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x82B)), //
- m(MasterChannelId.RACK_1_BATTERY_044_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_044_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x82C)), //
- m(MasterChannelId.RACK_1_BATTERY_045_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_045_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x82D)), //
- m(MasterChannelId.RACK_1_BATTERY_046_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_046_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x82E)), //
- m(MasterChannelId.RACK_1_BATTERY_047_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_047_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x82F)), //
- m(MasterChannelId.RACK_1_BATTERY_048_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_048_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x830)), //
- m(MasterChannelId.RACK_1_BATTERY_049_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_049_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x831)), //
- m(MasterChannelId.RACK_1_BATTERY_050_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_050_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x832)), //
- m(MasterChannelId.RACK_1_BATTERY_051_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_051_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x833)), //
- m(MasterChannelId.RACK_1_BATTERY_052_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_052_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x834)), //
- m(MasterChannelId.RACK_1_BATTERY_053_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_053_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x835)), //
- m(MasterChannelId.RACK_1_BATTERY_054_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_054_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x836)), //
- m(MasterChannelId.RACK_1_BATTERY_055_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_055_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x837)), //
- m(MasterChannelId.RACK_1_BATTERY_056_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_056_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x838)), //
- m(MasterChannelId.RACK_1_BATTERY_057_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_057_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x839)), //
- m(MasterChannelId.RACK_1_BATTERY_058_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_058_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x83A)), //
- m(MasterChannelId.RACK_1_BATTERY_059_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_059_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x83B)), //
- m(MasterChannelId.RACK_1_BATTERY_060_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_060_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x83C)) //
),
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x83D, Priority.LOW, //
- m(MasterChannelId.RACK_1_BATTERY_061_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_061_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x83D)), //
- m(MasterChannelId.RACK_1_BATTERY_062_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_062_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x83E)), //
- m(MasterChannelId.RACK_1_BATTERY_063_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_063_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x83F)), //
- m(MasterChannelId.RACK_1_BATTERY_064_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_064_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x840)), //
- m(MasterChannelId.RACK_1_BATTERY_065_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_065_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x841)), //
- m(MasterChannelId.RACK_1_BATTERY_066_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_066_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x842)), //
- m(MasterChannelId.RACK_1_BATTERY_067_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_067_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x843)), //
- m(MasterChannelId.RACK_1_BATTERY_068_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_068_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x844)), //
- m(MasterChannelId.RACK_1_BATTERY_069_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_069_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x845)), //
- m(MasterChannelId.RACK_1_BATTERY_070_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_070_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x846)), //
- m(MasterChannelId.RACK_1_BATTERY_071_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_071_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x847)), //
- m(MasterChannelId.RACK_1_BATTERY_072_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_072_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x848)), //
- m(MasterChannelId.RACK_1_BATTERY_073_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_073_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x849)), //
- m(MasterChannelId.RACK_1_BATTERY_074_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_074_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x84A)), //
- m(MasterChannelId.RACK_1_BATTERY_075_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_075_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x84B)), //
- m(MasterChannelId.RACK_1_BATTERY_076_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_076_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x84C)), //
- m(MasterChannelId.RACK_1_BATTERY_077_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_077_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x84D)), //
- m(MasterChannelId.RACK_1_BATTERY_078_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_078_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x84E)), //
- m(MasterChannelId.RACK_1_BATTERY_079_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_079_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x84F)), //
- m(MasterChannelId.RACK_1_BATTERY_080_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_080_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x850)), //
- m(MasterChannelId.RACK_1_BATTERY_081_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_081_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x851)), //
- m(MasterChannelId.RACK_1_BATTERY_082_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_082_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x852)), //
- m(MasterChannelId.RACK_1_BATTERY_083_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_083_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x853)), //
- m(MasterChannelId.RACK_1_BATTERY_084_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_084_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x854)), //
- m(MasterChannelId.RACK_1_BATTERY_085_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_085_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x855)), //
- m(MasterChannelId.RACK_1_BATTERY_086_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_086_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x856)), //
- m(MasterChannelId.RACK_1_BATTERY_087_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_087_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x857)), //
- m(MasterChannelId.RACK_1_BATTERY_088_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_088_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x858)), //
- m(MasterChannelId.RACK_1_BATTERY_089_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_089_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x859)), //
- m(MasterChannelId.RACK_1_BATTERY_090_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_090_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x85A)), //
- m(MasterChannelId.RACK_1_BATTERY_091_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_091_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x85B)), //
- m(MasterChannelId.RACK_1_BATTERY_092_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_092_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x85C)), //
- m(MasterChannelId.RACK_1_BATTERY_093_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_093_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x85D)), //
- m(MasterChannelId.RACK_1_BATTERY_094_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_094_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x85E)), //
- m(MasterChannelId.RACK_1_BATTERY_095_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_095_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x85F)), //
- m(MasterChannelId.RACK_1_BATTERY_096_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_096_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x860)), //
- m(MasterChannelId.RACK_1_BATTERY_097_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_097_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x861)), //
- m(MasterChannelId.RACK_1_BATTERY_098_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_098_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x862)), //
- m(MasterChannelId.RACK_1_BATTERY_099_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_099_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x863)), //
- m(MasterChannelId.RACK_1_BATTERY_100_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_100_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x864)), //
- m(MasterChannelId.RACK_1_BATTERY_101_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_101_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x865)), //
- m(MasterChannelId.RACK_1_BATTERY_102_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_102_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x866)), //
- m(MasterChannelId.RACK_1_BATTERY_103_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_103_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x867)), //
- m(MasterChannelId.RACK_1_BATTERY_104_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_104_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x868)), //
- m(MasterChannelId.RACK_1_BATTERY_105_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_105_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x869)), //
- m(MasterChannelId.RACK_1_BATTERY_106_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_106_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x86A)), //
- m(MasterChannelId.RACK_1_BATTERY_107_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_107_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x86B)), //
- m(MasterChannelId.RACK_1_BATTERY_108_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_108_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x86C)), //
- m(MasterChannelId.RACK_1_BATTERY_109_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_109_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x86D)), //
- m(MasterChannelId.RACK_1_BATTERY_110_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_110_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x86E)), //
- m(MasterChannelId.RACK_1_BATTERY_111_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_111_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x86F)), //
- m(MasterChannelId.RACK_1_BATTERY_112_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_112_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x870)), //
- m(MasterChannelId.RACK_1_BATTERY_113_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_113_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x871)), //
- m(MasterChannelId.RACK_1_BATTERY_114_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_114_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x872)), //
- m(MasterChannelId.RACK_1_BATTERY_115_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_115_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x873)), //
- m(MasterChannelId.RACK_1_BATTERY_116_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_116_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x874)), //
- m(MasterChannelId.RACK_1_BATTERY_117_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_117_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x875)), //
- m(MasterChannelId.RACK_1_BATTERY_118_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_118_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x876)), //
- m(MasterChannelId.RACK_1_BATTERY_119_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_119_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x877)) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x878, Priority.LOW, //
- m(MasterChannelId.RACK_1_BATTERY_120_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_120_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x878)), //
- m(MasterChannelId.RACK_1_BATTERY_121_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_121_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x879)), //
- m(MasterChannelId.RACK_1_BATTERY_122_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_122_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x87A)), //
- m(MasterChannelId.RACK_1_BATTERY_123_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_123_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x87B)), //
- m(MasterChannelId.RACK_1_BATTERY_124_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_124_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x87C)), //
- m(MasterChannelId.RACK_1_BATTERY_125_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_125_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x87D)), //
- m(MasterChannelId.RACK_1_BATTERY_126_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_126_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x87E)), //
- m(MasterChannelId.RACK_1_BATTERY_127_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_127_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x87F)), //
- m(MasterChannelId.RACK_1_BATTERY_128_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_128_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x880)), //
- m(MasterChannelId.RACK_1_BATTERY_129_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_129_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x881)), //
- m(MasterChannelId.RACK_1_BATTERY_130_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_130_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x882)), //
- m(MasterChannelId.RACK_1_BATTERY_131_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_131_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x883)), //
- m(MasterChannelId.RACK_1_BATTERY_132_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_132_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x884)), //
- m(MasterChannelId.RACK_1_BATTERY_133_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_133_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x885)), //
- m(MasterChannelId.RACK_1_BATTERY_134_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_134_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x886)), //
- m(MasterChannelId.RACK_1_BATTERY_135_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_135_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x887)), //
- m(MasterChannelId.RACK_1_BATTERY_136_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_136_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x888)), //
- m(MasterChannelId.RACK_1_BATTERY_137_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_137_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x889)), //
- m(MasterChannelId.RACK_1_BATTERY_138_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_138_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x88A)), //
- m(MasterChannelId.RACK_1_BATTERY_139_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_139_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x88B)), //
- m(MasterChannelId.RACK_1_BATTERY_140_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_140_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x88C)), //
- m(MasterChannelId.RACK_1_BATTERY_141_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_141_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x88D)), //
- m(MasterChannelId.RACK_1_BATTERY_142_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_142_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x88E)), //
- m(MasterChannelId.RACK_1_BATTERY_143_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_143_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x88F)), //
- m(MasterChannelId.RACK_1_BATTERY_144_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_144_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x890)), //
- m(MasterChannelId.RACK_1_BATTERY_145_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_145_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x891)), //
- m(MasterChannelId.RACK_1_BATTERY_146_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_146_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x892)), //
- m(MasterChannelId.RACK_1_BATTERY_147_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_147_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x893)), //
- m(MasterChannelId.RACK_1_BATTERY_148_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_148_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x894)), //
- m(MasterChannelId.RACK_1_BATTERY_149_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_149_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x895)), //
- m(MasterChannelId.RACK_1_BATTERY_150_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_150_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x896)), //
- m(MasterChannelId.RACK_1_BATTERY_151_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_151_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x897)), //
- m(MasterChannelId.RACK_1_BATTERY_152_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_152_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x898)), //
- m(MasterChannelId.RACK_1_BATTERY_153_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_153_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x899)), //
- m(MasterChannelId.RACK_1_BATTERY_154_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_154_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x89A)), //
- m(MasterChannelId.RACK_1_BATTERY_155_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_155_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x89B)), //
- m(MasterChannelId.RACK_1_BATTERY_156_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_156_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x89C)), //
- m(MasterChannelId.RACK_1_BATTERY_157_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_157_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x89D)), //
- m(MasterChannelId.RACK_1_BATTERY_158_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_158_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x89E)), //
- m(MasterChannelId.RACK_1_BATTERY_159_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_159_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x89F)), //
- m(MasterChannelId.RACK_1_BATTERY_160_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_160_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A0)), //
- m(MasterChannelId.RACK_1_BATTERY_161_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_161_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A1)), //
- m(MasterChannelId.RACK_1_BATTERY_162_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_162_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A2)), //
- m(MasterChannelId.RACK_1_BATTERY_163_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_163_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A3)), //
- m(MasterChannelId.RACK_1_BATTERY_164_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_164_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A4)), //
- m(MasterChannelId.RACK_1_BATTERY_165_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_165_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A5)), //
- m(MasterChannelId.RACK_1_BATTERY_166_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_166_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A6)), //
- m(MasterChannelId.RACK_1_BATTERY_167_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_167_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A7)), //
- m(MasterChannelId.RACK_1_BATTERY_168_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_168_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A8)), //
- m(MasterChannelId.RACK_1_BATTERY_169_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_169_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8A9)), //
- m(MasterChannelId.RACK_1_BATTERY_170_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_170_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8AA)), //
- m(MasterChannelId.RACK_1_BATTERY_171_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_171_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8AB)), //
- m(MasterChannelId.RACK_1_BATTERY_172_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_172_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8AC)), //
- m(MasterChannelId.RACK_1_BATTERY_173_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_173_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8AD)), //
- m(MasterChannelId.RACK_1_BATTERY_174_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_174_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8AE)), //
- m(MasterChannelId.RACK_1_BATTERY_175_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_175_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8AF)), //
- m(MasterChannelId.RACK_1_BATTERY_176_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_176_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B0)), //
- m(MasterChannelId.RACK_1_BATTERY_177_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_177_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B1)), //
- m(MasterChannelId.RACK_1_BATTERY_178_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_178_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B2)), //
- m(MasterChannelId.RACK_1_BATTERY_179_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_179_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B3)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0x8B4, Priority.LOW, //
- m(MasterChannelId.RACK_1_BATTERY_180_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_180_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B4)), //
- m(MasterChannelId.RACK_1_BATTERY_181_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_181_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B5)), //
- m(MasterChannelId.RACK_1_BATTERY_182_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_182_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B6)), //
- m(MasterChannelId.RACK_1_BATTERY_183_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_183_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B7)), //
- m(MasterChannelId.RACK_1_BATTERY_184_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_184_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B8)), //
- m(MasterChannelId.RACK_1_BATTERY_185_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_185_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8B9)), //
- m(MasterChannelId.RACK_1_BATTERY_186_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_186_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8BA)), //
- m(MasterChannelId.RACK_1_BATTERY_187_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_187_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8BB)), //
- m(MasterChannelId.RACK_1_BATTERY_188_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_188_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8BC)), //
- m(MasterChannelId.RACK_1_BATTERY_189_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_189_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8BD)), //
- m(MasterChannelId.RACK_1_BATTERY_190_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_190_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8BE)), //
- m(MasterChannelId.RACK_1_BATTERY_191_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_191_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8BF)), //
- m(MasterChannelId.RACK_1_BATTERY_192_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_192_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C0)), //
- m(MasterChannelId.RACK_1_BATTERY_193_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_193_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C1)), //
- m(MasterChannelId.RACK_1_BATTERY_194_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_194_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C2)), //
- m(MasterChannelId.RACK_1_BATTERY_195_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_195_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C3)), //
- m(MasterChannelId.RACK_1_BATTERY_196_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_196_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C4)), //
- m(MasterChannelId.RACK_1_BATTERY_197_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_197_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C5)), //
- m(MasterChannelId.RACK_1_BATTERY_198_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_198_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C6)), //
- m(MasterChannelId.RACK_1_BATTERY_199_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_199_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C7)), //
- m(MasterChannelId.RACK_1_BATTERY_200_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_200_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C8)), //
- m(MasterChannelId.RACK_1_BATTERY_201_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_201_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8C9)), //
- m(MasterChannelId.RACK_1_BATTERY_202_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_202_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8CA)), //
- m(MasterChannelId.RACK_1_BATTERY_203_VOLTAGE,
+ m(ClusterChannelId.RACK_1_BATTERY_203_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0x8CB)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0xC00, Priority.LOW, //
- m(MasterChannelId.RACK_1_BATTERY_000_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_000_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC00)), //
- m(MasterChannelId.RACK_1_BATTERY_001_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_001_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC01)), //
- m(MasterChannelId.RACK_1_BATTERY_002_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_002_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC02)), //
- m(MasterChannelId.RACK_1_BATTERY_003_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_003_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC03)), //
- m(MasterChannelId.RACK_1_BATTERY_004_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_004_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC04)), //
- m(MasterChannelId.RACK_1_BATTERY_005_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_005_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC05)), //
- m(MasterChannelId.RACK_1_BATTERY_006_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_006_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC06)), //
- m(MasterChannelId.RACK_1_BATTERY_007_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_007_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC07)), //
- m(MasterChannelId.RACK_1_BATTERY_008_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_008_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC08)), //
- m(MasterChannelId.RACK_1_BATTERY_009_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_009_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC09)), //
- m(MasterChannelId.RACK_1_BATTERY_010_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_010_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC0A)), //
- m(MasterChannelId.RACK_1_BATTERY_011_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_011_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC0B)), //
- m(MasterChannelId.RACK_1_BATTERY_012_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_012_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC0C)), //
- m(MasterChannelId.RACK_1_BATTERY_013_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_013_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC0D)), //
- m(MasterChannelId.RACK_1_BATTERY_014_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_014_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC0E)), //
- m(MasterChannelId.RACK_1_BATTERY_015_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_015_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC0F)), //
- m(MasterChannelId.RACK_1_BATTERY_016_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_016_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC10)), //
- m(MasterChannelId.RACK_1_BATTERY_017_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_017_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC11)), //
- m(MasterChannelId.RACK_1_BATTERY_018_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_018_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC12)), //
- m(MasterChannelId.RACK_1_BATTERY_019_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_019_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC13)), //
- m(MasterChannelId.RACK_1_BATTERY_020_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_020_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC14)), //
- m(MasterChannelId.RACK_1_BATTERY_021_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_021_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC15)), //
- m(MasterChannelId.RACK_1_BATTERY_022_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_022_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC16)), //
- m(MasterChannelId.RACK_1_BATTERY_023_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_023_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC17)), //
- m(MasterChannelId.RACK_1_BATTERY_024_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_024_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC18)), //
- m(MasterChannelId.RACK_1_BATTERY_025_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_025_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC19)), //
- m(MasterChannelId.RACK_1_BATTERY_026_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_026_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC1A)), //
- m(MasterChannelId.RACK_1_BATTERY_027_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_027_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC1B)), //
- m(MasterChannelId.RACK_1_BATTERY_028_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_028_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC1C)), //
- m(MasterChannelId.RACK_1_BATTERY_029_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_029_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC1D)), //
- m(MasterChannelId.RACK_1_BATTERY_030_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_030_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC1E)), //
- m(MasterChannelId.RACK_1_BATTERY_031_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_031_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC1F)), //
- m(MasterChannelId.RACK_1_BATTERY_032_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_032_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC20)), //
- m(MasterChannelId.RACK_1_BATTERY_033_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_033_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC21)), //
- m(MasterChannelId.RACK_1_BATTERY_034_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_034_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC22)), //
- m(MasterChannelId.RACK_1_BATTERY_035_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_035_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC23)), //
- m(MasterChannelId.RACK_1_BATTERY_036_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_036_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC24)), //
- m(MasterChannelId.RACK_1_BATTERY_037_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_037_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC25)), //
- m(MasterChannelId.RACK_1_BATTERY_038_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_038_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC26)), //
- m(MasterChannelId.RACK_1_BATTERY_039_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_039_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC27)), //
- m(MasterChannelId.RACK_1_BATTERY_040_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_040_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC28)), //
- m(MasterChannelId.RACK_1_BATTERY_041_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_041_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC29)), //
- m(MasterChannelId.RACK_1_BATTERY_042_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_042_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC2A)), //
- m(MasterChannelId.RACK_1_BATTERY_043_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_043_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC2B)), //
- m(MasterChannelId.RACK_1_BATTERY_044_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_044_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC2C)), //
- m(MasterChannelId.RACK_1_BATTERY_045_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_045_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC2D)), //
- m(MasterChannelId.RACK_1_BATTERY_046_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_046_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC2E)), //
- m(MasterChannelId.RACK_1_BATTERY_047_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_047_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC2F)), //
- m(MasterChannelId.RACK_1_BATTERY_048_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_048_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC30)), //
- m(MasterChannelId.RACK_1_BATTERY_049_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_049_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC31)), //
- m(MasterChannelId.RACK_1_BATTERY_050_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_050_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC32)), //
- m(MasterChannelId.RACK_1_BATTERY_051_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_051_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC33)), //
- m(MasterChannelId.RACK_1_BATTERY_052_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_052_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC34)), //
- m(MasterChannelId.RACK_1_BATTERY_053_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_053_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC35)), //
- m(MasterChannelId.RACK_1_BATTERY_054_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_054_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC36)), //
- m(MasterChannelId.RACK_1_BATTERY_055_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_055_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC37)), //
- m(MasterChannelId.RACK_1_BATTERY_056_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_056_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC38)), //
- m(MasterChannelId.RACK_1_BATTERY_057_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_057_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC39)), //
- m(MasterChannelId.RACK_1_BATTERY_058_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_058_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC3A)), //
- m(MasterChannelId.RACK_1_BATTERY_059_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_059_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC3B)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_1 + 0xC3C, Priority.LOW, //
- m(MasterChannelId.RACK_1_BATTERY_060_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_060_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC3C)), //
- m(MasterChannelId.RACK_1_BATTERY_061_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_061_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC3D)), //
- m(MasterChannelId.RACK_1_BATTERY_062_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_062_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC3E)), //
- m(MasterChannelId.RACK_1_BATTERY_063_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_063_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC3F)), //
- m(MasterChannelId.RACK_1_BATTERY_064_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_064_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC40)), //
- m(MasterChannelId.RACK_1_BATTERY_065_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_065_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC41)), //
- m(MasterChannelId.RACK_1_BATTERY_066_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_066_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC42)), //
- m(MasterChannelId.RACK_1_BATTERY_067_TEMPERATURE,
+ m(ClusterChannelId.RACK_1_BATTERY_067_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_1 + 0xC43)) //
) //
}));
// ---------------- registers of rack 2 -----------------------------
tasks.addAll(Arrays.asList(new Task[] { new FC16WriteRegistersTask(BASE_ADDRESS_RACK_2 + 0x1, //
- m(MasterChannelId.RACK_2_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x1)) //
+ m(ClusterChannelId.RACK_2_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x1)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x1, Priority.HIGH, //
- m(MasterChannelId.RACK_2_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x1)) //
+ m(ClusterChannelId.RACK_2_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x1)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x100, Priority.LOW, //
- m(MasterChannelId.RACK_2_VOLTAGE, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x100), //
+ m(ClusterChannelId.RACK_2_VOLTAGE, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x100), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_2_CURRENT, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x101), //
+ m(ClusterChannelId.RACK_2_CURRENT, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x101), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_2_CHARGE_INDICATION,
+ m(ClusterChannelId.RACK_2_CHARGE_INDICATION,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x102)), //
- m(MasterChannelId.RACK_2_SOC,
+ m(ClusterChannelId.RACK_2_SOC,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x103).onUpdateCallback(val -> {
recalculateSoc();
})), //
- m(MasterChannelId.RACK_2_SOH, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x104)), //
- m(MasterChannelId.RACK_2_MAX_CELL_VOLTAGE_ID,
+ m(ClusterChannelId.RACK_2_SOH, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x104)), //
+ m(ClusterChannelId.RACK_2_MAX_CELL_VOLTAGE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x105)), //
- m(MasterChannelId.RACK_2_MAX_CELL_VOLTAGE,
+ m(ClusterChannelId.RACK_2_MAX_CELL_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x106)), //
- m(MasterChannelId.RACK_2_MIN_CELL_VOLTAGE_ID,
+ m(ClusterChannelId.RACK_2_MIN_CELL_VOLTAGE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x107)), //
- m(MasterChannelId.RACK_2_MIN_CELL_VOLTAGE,
+ m(ClusterChannelId.RACK_2_MIN_CELL_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x108)), //
- m(MasterChannelId.RACK_2_MAX_CELL_TEMPERATURE_ID,
+ m(ClusterChannelId.RACK_2_MAX_CELL_TEMPERATURE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x109)), //
- m(MasterChannelId.RACK_2_MAX_CELL_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_MAX_CELL_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x10A)), //
- m(MasterChannelId.RACK_2_MIN_CELL_TEMPERATURE_ID,
+ m(ClusterChannelId.RACK_2_MIN_CELL_TEMPERATURE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x10B)), //
- m(MasterChannelId.RACK_2_MIN_CELL_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_MIN_CELL_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x10C)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x140, Priority.LOW, //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x140)) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH, 0) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH, 1) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_CHA_CURRENT_HIGH, 2) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_VOLTAGE_LOW, 3) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW, 4) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH, 5) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH, 6) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW, 7) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH, 14) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW, 15) //
- .build(), //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x141)) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CELL_VOLTAGE_HIGH, 0) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH, 1) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CHA_CURRENT_HIGH, 2) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CELL_VOLTAGE_LOW, 3) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW, 4) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_DISCHA_CURRENT_HIGH, 5) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH, 6) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CELL_CHA_TEMP_LOW, 7) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_SOC_LOW, 8) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH, 9) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH, 11) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_INSULATION_LOW, 12) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH, 13) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH, 14) //
- .m(MasterChannelId.RACK_2_ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW, 15) //
- .build(), //
- m(MasterChannelId.RACK_2_RUN_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x142)) //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_2 + 0x140, this) //
+ .bit(0, ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH) //
+ .bit(1, ClusterChannelId.RACK_2_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH) //
+ .bit(2, ClusterChannelId.RACK_2_ALARM_LEVEL_2_CHA_CURRENT_HIGH) //
+ .bit(3, ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_VOLTAGE_LOW) //
+ .bit(4, ClusterChannelId.RACK_2_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW) //
+ .bit(5, ClusterChannelId.RACK_2_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH) //
+ .bit(6, ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH) //
+ .bit(7, ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW) //
+ .bit(14, ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH) //
+ .bit(15, ClusterChannelId.RACK_2_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW) //
+ ), //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_2 + 0x141, this) //
+ .bit(0, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CELL_VOLTAGE_HIGH) //
+ .bit(1, ClusterChannelId.RACK_2_ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH) //
+ .bit(2, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CHA_CURRENT_HIGH) //
+ .bit(3, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CELL_VOLTAGE_LOW) //
+ .bit(4, ClusterChannelId.RACK_2_ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW) //
+ .bit(5, ClusterChannelId.RACK_2_ALARM_LEVEL_1_DISCHA_CURRENT_HIGH) //
+ .bit(6, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH) //
+ .bit(7, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CELL_CHA_TEMP_LOW) //
+ .bit(8, ClusterChannelId.RACK_2_ALARM_LEVEL_1_SOC_LOW) //
+ .bit(9, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH) //
+ .bit(11, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH) //
+ .bit(12, ClusterChannelId.RACK_2_ALARM_LEVEL_1_INSULATION_LOW) //
+ .bit(13, ClusterChannelId.RACK_2_ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH) //
+ .bit(14, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH) //
+ .bit(15, ClusterChannelId.RACK_2_ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW) //
+ ), //
+ m(ClusterChannelId.RACK_2_RUN_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x142)) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x160, Priority.HIGH, //
- m(MasterChannelId.RACK_2_MAX_CHARGE_CURRENT,
+ m(ClusterChannelId.RACK_2_MAX_CHARGE_CURRENT,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x160),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_2_MAX_DISCHARGE_CURRENT,
+ m(ClusterChannelId.RACK_2_MAX_DISCHARGE_CURRENT,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x161),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x185, Priority.LOW, //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x185)) //
- .m(MasterChannelId.RACK_2_FAILURE_SAMPLING_WIRE, 0)//
- .m(MasterChannelId.RACK_2_FAILURE_CONNECTOR_WIRE, 1)//
- .m(MasterChannelId.RACK_2_FAILURE_LTC6803, 2)//
- .m(MasterChannelId.RACK_2_FAILURE_VOLTAGE_SAMPLING, 3)//
- .m(MasterChannelId.RACK_2_FAILURE_TEMP_SAMPLING, 4)//
- .m(MasterChannelId.RACK_2_FAILURE_TEMP_SENSOR, 5)//
- .m(MasterChannelId.RACK_2_FAILURE_BALANCING_MODULE, 8)//
- .m(MasterChannelId.RACK_2_FAILURE_TEMP_SAMPLING_LINE, 9)//
- .m(MasterChannelId.RACK_2_FAILURE_INTRANET_COMMUNICATION, 10)//
- .m(MasterChannelId.RACK_2_FAILURE_EEPROM, 11)//
- .m(MasterChannelId.RACK_2_FAILURE_INITIALIZATION, 12)//
- .build() //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_2 + 0x185, this) //
+ .bit(0, ClusterChannelId.RACK_2_FAILURE_SAMPLING_WIRE)//
+ .bit(1, ClusterChannelId.RACK_2_FAILURE_CONNECTOR_WIRE)//
+ .bit(2, ClusterChannelId.RACK_2_FAILURE_LTC6803)//
+ .bit(3, ClusterChannelId.RACK_2_FAILURE_VOLTAGE_SAMPLING)//
+ .bit(4, ClusterChannelId.RACK_2_FAILURE_TEMP_SAMPLING)//
+ .bit(5, ClusterChannelId.RACK_2_FAILURE_TEMP_SENSOR)//
+ .bit(8, ClusterChannelId.RACK_2_FAILURE_BALANCING_MODULE)//
+ .bit(9, ClusterChannelId.RACK_2_FAILURE_TEMP_SAMPLING_LINE)//
+ .bit(10, ClusterChannelId.RACK_2_FAILURE_INTRANET_COMMUNICATION)//
+ .bit(11, ClusterChannelId.RACK_2_FAILURE_EEPROM)//
+ .bit(12, ClusterChannelId.RACK_2_FAILURE_INITIALIZATION)//
+ ) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x800, Priority.LOW, //
- m(MasterChannelId.RACK_2_BATTERY_000_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_000_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x800)), //
- m(MasterChannelId.RACK_2_BATTERY_001_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_001_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x801)), //
- m(MasterChannelId.RACK_2_BATTERY_002_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_002_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x802)), //
- m(MasterChannelId.RACK_2_BATTERY_003_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_003_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x803)), //
- m(MasterChannelId.RACK_2_BATTERY_004_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_004_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x804)), //
- m(MasterChannelId.RACK_2_BATTERY_005_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_005_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x805)), //
- m(MasterChannelId.RACK_2_BATTERY_006_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_006_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x806)), //
- m(MasterChannelId.RACK_2_BATTERY_007_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_007_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x807)), //
- m(MasterChannelId.RACK_2_BATTERY_008_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_008_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x808)), //
- m(MasterChannelId.RACK_2_BATTERY_009_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_009_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x809)), //
- m(MasterChannelId.RACK_2_BATTERY_010_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_010_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x80A)), //
- m(MasterChannelId.RACK_2_BATTERY_011_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_011_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x80B)), //
- m(MasterChannelId.RACK_2_BATTERY_012_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_012_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x80C)), //
- m(MasterChannelId.RACK_2_BATTERY_013_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_013_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x80D)), //
- m(MasterChannelId.RACK_2_BATTERY_014_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_014_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x80E)), //
- m(MasterChannelId.RACK_2_BATTERY_015_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_015_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x80F)), //
- m(MasterChannelId.RACK_2_BATTERY_016_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_016_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x810)), //
- m(MasterChannelId.RACK_2_BATTERY_017_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_017_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x811)), //
- m(MasterChannelId.RACK_2_BATTERY_018_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_018_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x812)), //
- m(MasterChannelId.RACK_2_BATTERY_019_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_019_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x813)), //
- m(MasterChannelId.RACK_2_BATTERY_020_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_020_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x814)), //
- m(MasterChannelId.RACK_2_BATTERY_021_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_021_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x815)), //
- m(MasterChannelId.RACK_2_BATTERY_022_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_022_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x816)), //
- m(MasterChannelId.RACK_2_BATTERY_023_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_023_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x817)), //
- m(MasterChannelId.RACK_2_BATTERY_024_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_024_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x818)), //
- m(MasterChannelId.RACK_2_BATTERY_025_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_025_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x819)), //
- m(MasterChannelId.RACK_2_BATTERY_026_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_026_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x81A)), //
- m(MasterChannelId.RACK_2_BATTERY_027_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_027_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x81B)), //
- m(MasterChannelId.RACK_2_BATTERY_028_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_028_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x81C)), //
- m(MasterChannelId.RACK_2_BATTERY_029_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_029_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x81D)), //
- m(MasterChannelId.RACK_2_BATTERY_030_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_030_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x81E)), //
- m(MasterChannelId.RACK_2_BATTERY_031_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_031_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x81F)), //
- m(MasterChannelId.RACK_2_BATTERY_032_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_032_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x820)), //
- m(MasterChannelId.RACK_2_BATTERY_033_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_033_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x821)), //
- m(MasterChannelId.RACK_2_BATTERY_034_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_034_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x822)), //
- m(MasterChannelId.RACK_2_BATTERY_035_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_035_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x823)), //
- m(MasterChannelId.RACK_2_BATTERY_036_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_036_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x824)), //
- m(MasterChannelId.RACK_2_BATTERY_037_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_037_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x825)), //
- m(MasterChannelId.RACK_2_BATTERY_038_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_038_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x826)), //
- m(MasterChannelId.RACK_2_BATTERY_039_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_039_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x827)), //
- m(MasterChannelId.RACK_2_BATTERY_040_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_040_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x828)), //
- m(MasterChannelId.RACK_2_BATTERY_041_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_041_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x829)), //
- m(MasterChannelId.RACK_2_BATTERY_042_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_042_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x82A)), //
- m(MasterChannelId.RACK_2_BATTERY_043_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_043_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x82B)), //
- m(MasterChannelId.RACK_2_BATTERY_044_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_044_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x82C)), //
- m(MasterChannelId.RACK_2_BATTERY_045_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_045_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x82D)), //
- m(MasterChannelId.RACK_2_BATTERY_046_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_046_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x82E)), //
- m(MasterChannelId.RACK_2_BATTERY_047_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_047_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x82F)), //
- m(MasterChannelId.RACK_2_BATTERY_048_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_048_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x830)), //
- m(MasterChannelId.RACK_2_BATTERY_049_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_049_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x831)), //
- m(MasterChannelId.RACK_2_BATTERY_050_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_050_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x832)), //
- m(MasterChannelId.RACK_2_BATTERY_051_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_051_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x833)), //
- m(MasterChannelId.RACK_2_BATTERY_052_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_052_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x834)), //
- m(MasterChannelId.RACK_2_BATTERY_053_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_053_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x835)), //
- m(MasterChannelId.RACK_2_BATTERY_054_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_054_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x836)), //
- m(MasterChannelId.RACK_2_BATTERY_055_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_055_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x837)), //
- m(MasterChannelId.RACK_2_BATTERY_056_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_056_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x838)), //
- m(MasterChannelId.RACK_2_BATTERY_057_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_057_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x839)), //
- m(MasterChannelId.RACK_2_BATTERY_058_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_058_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x83A)), //
- m(MasterChannelId.RACK_2_BATTERY_059_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_059_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x83B)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x83C, Priority.LOW, //
- m(MasterChannelId.RACK_2_BATTERY_060_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_060_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x83C)), //
- m(MasterChannelId.RACK_2_BATTERY_061_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_061_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x83D)), //
- m(MasterChannelId.RACK_2_BATTERY_062_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_062_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x83E)), //
- m(MasterChannelId.RACK_2_BATTERY_063_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_063_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x83F)), //
- m(MasterChannelId.RACK_2_BATTERY_064_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_064_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x840)), //
- m(MasterChannelId.RACK_2_BATTERY_065_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_065_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x841)), //
- m(MasterChannelId.RACK_2_BATTERY_066_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_066_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x842)), //
- m(MasterChannelId.RACK_2_BATTERY_067_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_067_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x843)), //
- m(MasterChannelId.RACK_2_BATTERY_068_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_068_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x844)), //
- m(MasterChannelId.RACK_2_BATTERY_069_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_069_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x845)), //
- m(MasterChannelId.RACK_2_BATTERY_070_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_070_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x846)), //
- m(MasterChannelId.RACK_2_BATTERY_071_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_071_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x847)), //
- m(MasterChannelId.RACK_2_BATTERY_072_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_072_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x848)), //
- m(MasterChannelId.RACK_2_BATTERY_073_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_073_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x849)), //
- m(MasterChannelId.RACK_2_BATTERY_074_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_074_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x84A)), //
- m(MasterChannelId.RACK_2_BATTERY_075_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_075_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x84B)), //
- m(MasterChannelId.RACK_2_BATTERY_076_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_076_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x84C)), //
- m(MasterChannelId.RACK_2_BATTERY_077_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_077_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x84D)), //
- m(MasterChannelId.RACK_2_BATTERY_078_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_078_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x84E)), //
- m(MasterChannelId.RACK_2_BATTERY_079_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_079_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x84F)), //
- m(MasterChannelId.RACK_2_BATTERY_080_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_080_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x850)), //
- m(MasterChannelId.RACK_2_BATTERY_081_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_081_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x851)), //
- m(MasterChannelId.RACK_2_BATTERY_082_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_082_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x852)), //
- m(MasterChannelId.RACK_2_BATTERY_083_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_083_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x853)), //
- m(MasterChannelId.RACK_2_BATTERY_084_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_084_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x854)), //
- m(MasterChannelId.RACK_2_BATTERY_085_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_085_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x855)), //
- m(MasterChannelId.RACK_2_BATTERY_086_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_086_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x856)), //
- m(MasterChannelId.RACK_2_BATTERY_087_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_087_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x857)), //
- m(MasterChannelId.RACK_2_BATTERY_088_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_088_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x858)), //
- m(MasterChannelId.RACK_2_BATTERY_089_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_089_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x859)), //
- m(MasterChannelId.RACK_2_BATTERY_090_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_090_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x85A)), //
- m(MasterChannelId.RACK_2_BATTERY_091_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_091_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x85B)), //
- m(MasterChannelId.RACK_2_BATTERY_092_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_092_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x85C)), //
- m(MasterChannelId.RACK_2_BATTERY_093_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_093_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x85D)), //
- m(MasterChannelId.RACK_2_BATTERY_094_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_094_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x85E)), //
- m(MasterChannelId.RACK_2_BATTERY_095_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_095_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x85F)), //
- m(MasterChannelId.RACK_2_BATTERY_096_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_096_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x860)), //
- m(MasterChannelId.RACK_2_BATTERY_097_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_097_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x861)), //
- m(MasterChannelId.RACK_2_BATTERY_098_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_098_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x862)), //
- m(MasterChannelId.RACK_2_BATTERY_099_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_099_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x863)), //
- m(MasterChannelId.RACK_2_BATTERY_100_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_100_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x864)), //
- m(MasterChannelId.RACK_2_BATTERY_101_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_101_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x865)), //
- m(MasterChannelId.RACK_2_BATTERY_102_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_102_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x866)), //
- m(MasterChannelId.RACK_2_BATTERY_103_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_103_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x867)), //
- m(MasterChannelId.RACK_2_BATTERY_104_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_104_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x868)), //
- m(MasterChannelId.RACK_2_BATTERY_105_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_105_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x869)), //
- m(MasterChannelId.RACK_2_BATTERY_106_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_106_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x86A)), //
- m(MasterChannelId.RACK_2_BATTERY_107_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_107_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x86B)), //
- m(MasterChannelId.RACK_2_BATTERY_108_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_108_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x86C)), //
- m(MasterChannelId.RACK_2_BATTERY_109_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_109_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x86D)), //
- m(MasterChannelId.RACK_2_BATTERY_110_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_110_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x86E)), //
- m(MasterChannelId.RACK_2_BATTERY_111_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_111_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x86F)), //
- m(MasterChannelId.RACK_2_BATTERY_112_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_112_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x870)), //
- m(MasterChannelId.RACK_2_BATTERY_113_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_113_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x871)), //
- m(MasterChannelId.RACK_2_BATTERY_114_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_114_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x872)), //
- m(MasterChannelId.RACK_2_BATTERY_115_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_115_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x873)), //
- m(MasterChannelId.RACK_2_BATTERY_116_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_116_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x874)), //
- m(MasterChannelId.RACK_2_BATTERY_117_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_117_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x875)), //
- m(MasterChannelId.RACK_2_BATTERY_118_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_118_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x876)), //
- m(MasterChannelId.RACK_2_BATTERY_119_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_119_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x877)) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x878, Priority.LOW, //
- m(MasterChannelId.RACK_2_BATTERY_120_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_120_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x878)), //
- m(MasterChannelId.RACK_2_BATTERY_121_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_121_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x879)), //
- m(MasterChannelId.RACK_2_BATTERY_122_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_122_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x87A)), //
- m(MasterChannelId.RACK_2_BATTERY_123_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_123_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x87B)), //
- m(MasterChannelId.RACK_2_BATTERY_124_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_124_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x87C)), //
- m(MasterChannelId.RACK_2_BATTERY_125_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_125_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x87D)), //
- m(MasterChannelId.RACK_2_BATTERY_126_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_126_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x87E)), //
- m(MasterChannelId.RACK_2_BATTERY_127_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_127_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x87F)), //
- m(MasterChannelId.RACK_2_BATTERY_128_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_128_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x880)), //
- m(MasterChannelId.RACK_2_BATTERY_129_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_129_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x881)), //
- m(MasterChannelId.RACK_2_BATTERY_130_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_130_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x882)), //
- m(MasterChannelId.RACK_2_BATTERY_131_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_131_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x883)), //
- m(MasterChannelId.RACK_2_BATTERY_132_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_132_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x884)), //
- m(MasterChannelId.RACK_2_BATTERY_133_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_133_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x885)), //
- m(MasterChannelId.RACK_2_BATTERY_134_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_134_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x886)), //
- m(MasterChannelId.RACK_2_BATTERY_135_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_135_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x887)), //
- m(MasterChannelId.RACK_2_BATTERY_136_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_136_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x888)), //
- m(MasterChannelId.RACK_2_BATTERY_137_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_137_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x889)), //
- m(MasterChannelId.RACK_2_BATTERY_138_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_138_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x88A)), //
- m(MasterChannelId.RACK_2_BATTERY_139_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_139_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x88B)), //
- m(MasterChannelId.RACK_2_BATTERY_140_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_140_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x88C)), //
- m(MasterChannelId.RACK_2_BATTERY_141_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_141_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x88D)), //
- m(MasterChannelId.RACK_2_BATTERY_142_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_142_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x88E)), //
- m(MasterChannelId.RACK_2_BATTERY_143_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_143_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x88F)), //
- m(MasterChannelId.RACK_2_BATTERY_144_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_144_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x890)), //
- m(MasterChannelId.RACK_2_BATTERY_145_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_145_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x891)), //
- m(MasterChannelId.RACK_2_BATTERY_146_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_146_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x892)), //
- m(MasterChannelId.RACK_2_BATTERY_147_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_147_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x893)), //
- m(MasterChannelId.RACK_2_BATTERY_148_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_148_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x894)), //
- m(MasterChannelId.RACK_2_BATTERY_149_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_149_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x895)), //
- m(MasterChannelId.RACK_2_BATTERY_150_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_150_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x896)), //
- m(MasterChannelId.RACK_2_BATTERY_151_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_151_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x897)), //
- m(MasterChannelId.RACK_2_BATTERY_152_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_152_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x898)), //
- m(MasterChannelId.RACK_2_BATTERY_153_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_153_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x899)), //
- m(MasterChannelId.RACK_2_BATTERY_154_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_154_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x89A)), //
- m(MasterChannelId.RACK_2_BATTERY_155_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_155_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x89B)), //
- m(MasterChannelId.RACK_2_BATTERY_156_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_156_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x89C)), //
- m(MasterChannelId.RACK_2_BATTERY_157_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_157_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x89D)), //
- m(MasterChannelId.RACK_2_BATTERY_158_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_158_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x89E)), //
- m(MasterChannelId.RACK_2_BATTERY_159_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_159_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x89F)), //
- m(MasterChannelId.RACK_2_BATTERY_160_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_160_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A0)), //
- m(MasterChannelId.RACK_2_BATTERY_161_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_161_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A1)), //
- m(MasterChannelId.RACK_2_BATTERY_162_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_162_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A2)), //
- m(MasterChannelId.RACK_2_BATTERY_163_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_163_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A3)), //
- m(MasterChannelId.RACK_2_BATTERY_164_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_164_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A4)), //
- m(MasterChannelId.RACK_2_BATTERY_165_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_165_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A5)), //
- m(MasterChannelId.RACK_2_BATTERY_166_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_166_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A6)), //
- m(MasterChannelId.RACK_2_BATTERY_167_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_167_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A7)), //
- m(MasterChannelId.RACK_2_BATTERY_168_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_168_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A8)), //
- m(MasterChannelId.RACK_2_BATTERY_169_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_169_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8A9)), //
- m(MasterChannelId.RACK_2_BATTERY_170_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_170_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8AA)), //
- m(MasterChannelId.RACK_2_BATTERY_171_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_171_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8AB)), //
- m(MasterChannelId.RACK_2_BATTERY_172_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_172_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8AC)), //
- m(MasterChannelId.RACK_2_BATTERY_173_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_173_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8AD)), //
- m(MasterChannelId.RACK_2_BATTERY_174_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_174_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8AE)), //
- m(MasterChannelId.RACK_2_BATTERY_175_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_175_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8AF)), //
- m(MasterChannelId.RACK_2_BATTERY_176_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_176_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B0)), //
- m(MasterChannelId.RACK_2_BATTERY_177_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_177_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B1)), //
- m(MasterChannelId.RACK_2_BATTERY_178_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_178_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B2)), //
- m(MasterChannelId.RACK_2_BATTERY_179_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_179_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B3)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0x8B4, Priority.LOW, //
- m(MasterChannelId.RACK_2_BATTERY_180_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_180_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B4)), //
- m(MasterChannelId.RACK_2_BATTERY_181_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_181_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B5)), //
- m(MasterChannelId.RACK_2_BATTERY_182_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_182_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B6)), //
- m(MasterChannelId.RACK_2_BATTERY_183_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_183_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B7)), //
- m(MasterChannelId.RACK_2_BATTERY_184_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_184_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B8)), //
- m(MasterChannelId.RACK_2_BATTERY_185_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_185_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8B9)), //
- m(MasterChannelId.RACK_2_BATTERY_186_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_186_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8BA)), //
- m(MasterChannelId.RACK_2_BATTERY_187_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_187_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8BB)), //
- m(MasterChannelId.RACK_2_BATTERY_188_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_188_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8BC)), //
- m(MasterChannelId.RACK_2_BATTERY_189_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_189_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8BD)), //
- m(MasterChannelId.RACK_2_BATTERY_190_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_190_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8BE)), //
- m(MasterChannelId.RACK_2_BATTERY_191_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_191_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8BF)), //
- m(MasterChannelId.RACK_2_BATTERY_192_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_192_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C0)), //
- m(MasterChannelId.RACK_2_BATTERY_193_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_193_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C1)), //
- m(MasterChannelId.RACK_2_BATTERY_194_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_194_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C2)), //
- m(MasterChannelId.RACK_2_BATTERY_195_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_195_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C3)), //
- m(MasterChannelId.RACK_2_BATTERY_196_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_196_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C4)), //
- m(MasterChannelId.RACK_2_BATTERY_197_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_197_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C5)), //
- m(MasterChannelId.RACK_2_BATTERY_198_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_198_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C6)), //
- m(MasterChannelId.RACK_2_BATTERY_199_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_199_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C7)), //
- m(MasterChannelId.RACK_2_BATTERY_200_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_200_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C8)), //
- m(MasterChannelId.RACK_2_BATTERY_201_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_201_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8C9)), //
- m(MasterChannelId.RACK_2_BATTERY_202_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_202_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8CA)), //
- m(MasterChannelId.RACK_2_BATTERY_203_VOLTAGE,
+ m(ClusterChannelId.RACK_2_BATTERY_203_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0x8CB)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0xC00, Priority.LOW, //
- m(MasterChannelId.RACK_2_BATTERY_000_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_000_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC00)), //
- m(MasterChannelId.RACK_2_BATTERY_001_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_001_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC01)), //
- m(MasterChannelId.RACK_2_BATTERY_002_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_002_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC02)), //
- m(MasterChannelId.RACK_2_BATTERY_003_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_003_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC03)), //
- m(MasterChannelId.RACK_2_BATTERY_004_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_004_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC04)), //
- m(MasterChannelId.RACK_2_BATTERY_005_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_005_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC05)), //
- m(MasterChannelId.RACK_2_BATTERY_006_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_006_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC06)), //
- m(MasterChannelId.RACK_2_BATTERY_007_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_007_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC07)), //
- m(MasterChannelId.RACK_2_BATTERY_008_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_008_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC08)), //
- m(MasterChannelId.RACK_2_BATTERY_009_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_009_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC09)), //
- m(MasterChannelId.RACK_2_BATTERY_010_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_010_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC0A)), //
- m(MasterChannelId.RACK_2_BATTERY_011_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_011_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC0B)), //
- m(MasterChannelId.RACK_2_BATTERY_012_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_012_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC0C)), //
- m(MasterChannelId.RACK_2_BATTERY_013_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_013_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC0D)), //
- m(MasterChannelId.RACK_2_BATTERY_014_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_014_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC0E)), //
- m(MasterChannelId.RACK_2_BATTERY_015_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_015_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC0F)), //
- m(MasterChannelId.RACK_2_BATTERY_016_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_016_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC10)), //
- m(MasterChannelId.RACK_2_BATTERY_017_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_017_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC11)), //
- m(MasterChannelId.RACK_2_BATTERY_018_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_018_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC12)), //
- m(MasterChannelId.RACK_2_BATTERY_019_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_019_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC13)), //
- m(MasterChannelId.RACK_2_BATTERY_020_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_020_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC14)), //
- m(MasterChannelId.RACK_2_BATTERY_021_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_021_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC15)), //
- m(MasterChannelId.RACK_2_BATTERY_022_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_022_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC16)), //
- m(MasterChannelId.RACK_2_BATTERY_023_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_023_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC17)), //
- m(MasterChannelId.RACK_2_BATTERY_024_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_024_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC18)), //
- m(MasterChannelId.RACK_2_BATTERY_025_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_025_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC19)), //
- m(MasterChannelId.RACK_2_BATTERY_026_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_026_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC1A)), //
- m(MasterChannelId.RACK_2_BATTERY_027_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_027_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC1B)), //
- m(MasterChannelId.RACK_2_BATTERY_028_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_028_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC1C)), //
- m(MasterChannelId.RACK_2_BATTERY_029_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_029_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC1D)), //
- m(MasterChannelId.RACK_2_BATTERY_030_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_030_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC1E)), //
- m(MasterChannelId.RACK_2_BATTERY_031_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_031_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC1F)), //
- m(MasterChannelId.RACK_2_BATTERY_032_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_032_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC20)), //
- m(MasterChannelId.RACK_2_BATTERY_033_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_033_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC21)), //
- m(MasterChannelId.RACK_2_BATTERY_034_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_034_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC22)), //
- m(MasterChannelId.RACK_2_BATTERY_035_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_035_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC23)), //
- m(MasterChannelId.RACK_2_BATTERY_036_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_036_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC24)), //
- m(MasterChannelId.RACK_2_BATTERY_037_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_037_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC25)), //
- m(MasterChannelId.RACK_2_BATTERY_038_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_038_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC26)), //
- m(MasterChannelId.RACK_2_BATTERY_039_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_039_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC27)), //
- m(MasterChannelId.RACK_2_BATTERY_040_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_040_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC28)), //
- m(MasterChannelId.RACK_2_BATTERY_041_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_041_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC29)), //
- m(MasterChannelId.RACK_2_BATTERY_042_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_042_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC2A)), //
- m(MasterChannelId.RACK_2_BATTERY_043_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_043_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC2B)), //
- m(MasterChannelId.RACK_2_BATTERY_044_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_044_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC2C)), //
- m(MasterChannelId.RACK_2_BATTERY_045_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_045_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC2D)), //
- m(MasterChannelId.RACK_2_BATTERY_046_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_046_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC2E)), //
- m(MasterChannelId.RACK_2_BATTERY_047_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_047_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC2F)), //
- m(MasterChannelId.RACK_2_BATTERY_048_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_048_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC30)), //
- m(MasterChannelId.RACK_2_BATTERY_049_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_049_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC31)), //
- m(MasterChannelId.RACK_2_BATTERY_050_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_050_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC32)), //
- m(MasterChannelId.RACK_2_BATTERY_051_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_051_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC33)), //
- m(MasterChannelId.RACK_2_BATTERY_052_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_052_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC34)), //
- m(MasterChannelId.RACK_2_BATTERY_053_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_053_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC35)), //
- m(MasterChannelId.RACK_2_BATTERY_054_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_054_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC36)), //
- m(MasterChannelId.RACK_2_BATTERY_055_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_055_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC37)), //
- m(MasterChannelId.RACK_2_BATTERY_056_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_056_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC38)), //
- m(MasterChannelId.RACK_2_BATTERY_057_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_057_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC39)), //
- m(MasterChannelId.RACK_2_BATTERY_058_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_058_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC3A)), //
- m(MasterChannelId.RACK_2_BATTERY_059_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_059_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC3B)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_2 + 0xC3C, Priority.LOW, //
- m(MasterChannelId.RACK_2_BATTERY_060_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_060_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC3C)), //
- m(MasterChannelId.RACK_2_BATTERY_061_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_061_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC3D)), //
- m(MasterChannelId.RACK_2_BATTERY_062_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_062_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC3E)), //
- m(MasterChannelId.RACK_2_BATTERY_063_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_063_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC3F)), //
- m(MasterChannelId.RACK_2_BATTERY_064_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_064_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC40)), //
- m(MasterChannelId.RACK_2_BATTERY_065_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_065_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC41)), //
- m(MasterChannelId.RACK_2_BATTERY_066_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_066_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC42)), //
- m(MasterChannelId.RACK_2_BATTERY_067_TEMPERATURE,
+ m(ClusterChannelId.RACK_2_BATTERY_067_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_2 + 0xC43)) //
) //
}));
@@ -1846,641 +1851,641 @@ protected ModbusProtocol defineModbusProtocol() {
tasks.addAll(Arrays.asList(new Task[] {
new FC16WriteRegistersTask(BASE_ADDRESS_RACK_3 + 0x1, //
- m(MasterChannelId.RACK_3_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x1)) //
+ m(ClusterChannelId.RACK_3_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x1)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x1, Priority.HIGH, //
- m(MasterChannelId.RACK_3_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x1)) //
+ m(ClusterChannelId.RACK_3_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x1)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x100, Priority.LOW, //
- m(MasterChannelId.RACK_3_VOLTAGE, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x100), //
+ m(ClusterChannelId.RACK_3_VOLTAGE, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x100), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_3_CURRENT, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x101), //
+ m(ClusterChannelId.RACK_3_CURRENT, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x101), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_3_CHARGE_INDICATION,
+ m(ClusterChannelId.RACK_3_CHARGE_INDICATION,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x102)), //
- m(MasterChannelId.RACK_3_SOC,
+ m(ClusterChannelId.RACK_3_SOC,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x103).onUpdateCallback(val -> {
recalculateSoc();
})), //
- m(MasterChannelId.RACK_3_SOH, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x104)), //
- m(MasterChannelId.RACK_3_MAX_CELL_VOLTAGE_ID,
+ m(ClusterChannelId.RACK_3_SOH, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x104)), //
+ m(ClusterChannelId.RACK_3_MAX_CELL_VOLTAGE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x105)), //
- m(MasterChannelId.RACK_3_MAX_CELL_VOLTAGE,
+ m(ClusterChannelId.RACK_3_MAX_CELL_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x106)), //
- m(MasterChannelId.RACK_3_MIN_CELL_VOLTAGE_ID,
+ m(ClusterChannelId.RACK_3_MIN_CELL_VOLTAGE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x107)), //
- m(MasterChannelId.RACK_3_MIN_CELL_VOLTAGE,
+ m(ClusterChannelId.RACK_3_MIN_CELL_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x108)), //
- m(MasterChannelId.RACK_3_MAX_CELL_TEMPERATURE_ID,
+ m(ClusterChannelId.RACK_3_MAX_CELL_TEMPERATURE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x109)), //
- m(MasterChannelId.RACK_3_MAX_CELL_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_MAX_CELL_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x10A)), //
- m(MasterChannelId.RACK_3_MIN_CELL_TEMPERATURE_ID,
+ m(ClusterChannelId.RACK_3_MIN_CELL_TEMPERATURE_ID,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x10B)), //
- m(MasterChannelId.RACK_3_MIN_CELL_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_MIN_CELL_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x10C)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x140, Priority.LOW, //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x140)) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH, 0) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH, 1) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_CHA_CURRENT_HIGH, 2) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_VOLTAGE_LOW, 3) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW, 4) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH, 5) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH, 6) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW, 7) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH, 14) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW, 15) //
- .build(), //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x141)) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CELL_VOLTAGE_HIGH, 0) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH, 1) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CHA_CURRENT_HIGH, 2) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CELL_VOLTAGE_LOW, 3) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW, 4) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_DISCHA_CURRENT_HIGH, 5) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH, 6) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CELL_CHA_TEMP_LOW, 7) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_SOC_LOW, 8) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH, 9) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH, 11) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_INSULATION_LOW, 12) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH, 13) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH, 14) //
- .m(MasterChannelId.RACK_3_ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW, 15) //
- .build(), //
- m(MasterChannelId.RACK_3_RUN_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x142)) //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_3 + 0x140, this) //
+ .bit(0, ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH) //
+ .bit(1, ClusterChannelId.RACK_3_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH) //
+ .bit(2, ClusterChannelId.RACK_3_ALARM_LEVEL_2_CHA_CURRENT_HIGH) //
+ .bit(3, ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_VOLTAGE_LOW) //
+ .bit(4, ClusterChannelId.RACK_3_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW) //
+ .bit(5, ClusterChannelId.RACK_3_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH) //
+ .bit(6, ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH) //
+ .bit(7, ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW) //
+ .bit(14, ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH) //
+ .bit(15, ClusterChannelId.RACK_3_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW) //
+ ), //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_3 + 0x141, this) //
+ .bit(0, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CELL_VOLTAGE_HIGH) //
+ .bit(1, ClusterChannelId.RACK_3_ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH) //
+ .bit(2, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CHA_CURRENT_HIGH) //
+ .bit(3, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CELL_VOLTAGE_LOW) //
+ .bit(4, ClusterChannelId.RACK_3_ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW) //
+ .bit(5, ClusterChannelId.RACK_3_ALARM_LEVEL_1_DISCHA_CURRENT_HIGH) //
+ .bit(6, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH) //
+ .bit(7, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CELL_CHA_TEMP_LOW) //
+ .bit(8, ClusterChannelId.RACK_3_ALARM_LEVEL_1_SOC_LOW) //
+ .bit(9, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH) //
+ .bit(11, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH) //
+ .bit(12, ClusterChannelId.RACK_3_ALARM_LEVEL_1_INSULATION_LOW) //
+ .bit(13, ClusterChannelId.RACK_3_ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH) //
+ .bit(14, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH) //
+ .bit(15, ClusterChannelId.RACK_3_ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW) //
+ ), //
+ m(ClusterChannelId.RACK_3_RUN_STATE, new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x142)) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x160, Priority.HIGH, //
- m(MasterChannelId.RACK_3_MAX_CHARGE_CURRENT,
+ m(ClusterChannelId.RACK_3_MAX_CHARGE_CURRENT,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x160),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(MasterChannelId.RACK_3_MAX_DISCHARGE_CURRENT,
+ m(ClusterChannelId.RACK_3_MAX_DISCHARGE_CURRENT,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x161),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x185, Priority.LOW, //
- bm(new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x185)) //
- .m(MasterChannelId.RACK_3_FAILURE_SAMPLING_WIRE, 0)//
- .m(MasterChannelId.RACK_3_FAILURE_CONNECTOR_WIRE, 1)//
- .m(MasterChannelId.RACK_3_FAILURE_LTC6803, 2)//
- .m(MasterChannelId.RACK_3_FAILURE_VOLTAGE_SAMPLING, 3)//
- .m(MasterChannelId.RACK_3_FAILURE_TEMP_SAMPLING, 4)//
- .m(MasterChannelId.RACK_3_FAILURE_TEMP_SENSOR, 5)//
- .m(MasterChannelId.RACK_3_FAILURE_BALANCING_MODULE, 8)//
- .m(MasterChannelId.RACK_3_FAILURE_TEMP_SAMPLING_LINE, 9)//
- .m(MasterChannelId.RACK_3_FAILURE_INTRANET_COMMUNICATION, 10)//
- .m(MasterChannelId.RACK_3_FAILURE_EEPROM, 11)//
- .m(MasterChannelId.RACK_3_FAILURE_INITIALIZATION, 12)//
- .build() //
+ m(new BitsWordElement(BASE_ADDRESS_RACK_3 + 0x185, this) //
+ .bit(0, ClusterChannelId.RACK_3_FAILURE_SAMPLING_WIRE)//
+ .bit(1, ClusterChannelId.RACK_3_FAILURE_CONNECTOR_WIRE)//
+ .bit(2, ClusterChannelId.RACK_3_FAILURE_LTC6803)//
+ .bit(3, ClusterChannelId.RACK_3_FAILURE_VOLTAGE_SAMPLING)//
+ .bit(4, ClusterChannelId.RACK_3_FAILURE_TEMP_SAMPLING)//
+ .bit(5, ClusterChannelId.RACK_3_FAILURE_TEMP_SENSOR)//
+ .bit(8, ClusterChannelId.RACK_3_FAILURE_BALANCING_MODULE)//
+ .bit(9, ClusterChannelId.RACK_3_FAILURE_TEMP_SAMPLING_LINE)//
+ .bit(10, ClusterChannelId.RACK_3_FAILURE_INTRANET_COMMUNICATION)//
+ .bit(11, ClusterChannelId.RACK_3_FAILURE_EEPROM)//
+ .bit(12, ClusterChannelId.RACK_3_FAILURE_INITIALIZATION)//
+ ) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x800, Priority.LOW, //
- m(MasterChannelId.RACK_3_BATTERY_000_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_000_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x800)), //
- m(MasterChannelId.RACK_3_BATTERY_001_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_001_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x801)), //
- m(MasterChannelId.RACK_3_BATTERY_002_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_002_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x802)), //
- m(MasterChannelId.RACK_3_BATTERY_003_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_003_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x803)), //
- m(MasterChannelId.RACK_3_BATTERY_004_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_004_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x804)), //
- m(MasterChannelId.RACK_3_BATTERY_005_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_005_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x805)), //
- m(MasterChannelId.RACK_3_BATTERY_006_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_006_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x806)), //
- m(MasterChannelId.RACK_3_BATTERY_007_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_007_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x807)), //
- m(MasterChannelId.RACK_3_BATTERY_008_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_008_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x808)), //
- m(MasterChannelId.RACK_3_BATTERY_009_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_009_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x809)), //
- m(MasterChannelId.RACK_3_BATTERY_010_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_010_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x80A)), //
- m(MasterChannelId.RACK_3_BATTERY_011_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_011_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x80B)), //
- m(MasterChannelId.RACK_3_BATTERY_012_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_012_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x80C)), //
- m(MasterChannelId.RACK_3_BATTERY_013_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_013_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x80D)), //
- m(MasterChannelId.RACK_3_BATTERY_014_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_014_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x80E)), //
- m(MasterChannelId.RACK_3_BATTERY_015_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_015_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x80F)), //
- m(MasterChannelId.RACK_3_BATTERY_016_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_016_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x810)), //
- m(MasterChannelId.RACK_3_BATTERY_017_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_017_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x811)), //
- m(MasterChannelId.RACK_3_BATTERY_018_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_018_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x812)), //
- m(MasterChannelId.RACK_3_BATTERY_019_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_019_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x813)), //
- m(MasterChannelId.RACK_3_BATTERY_020_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_020_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x814)), //
- m(MasterChannelId.RACK_3_BATTERY_021_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_021_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x815)), //
- m(MasterChannelId.RACK_3_BATTERY_022_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_022_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x816)), //
- m(MasterChannelId.RACK_3_BATTERY_023_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_023_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x817)), //
- m(MasterChannelId.RACK_3_BATTERY_024_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_024_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x818)), //
- m(MasterChannelId.RACK_3_BATTERY_025_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_025_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x819)), //
- m(MasterChannelId.RACK_3_BATTERY_026_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_026_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x81A)), //
- m(MasterChannelId.RACK_3_BATTERY_027_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_027_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x81B)), //
- m(MasterChannelId.RACK_3_BATTERY_028_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_028_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x81C)), //
- m(MasterChannelId.RACK_3_BATTERY_029_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_029_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x81D)), //
- m(MasterChannelId.RACK_3_BATTERY_030_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_030_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x81E)), //
- m(MasterChannelId.RACK_3_BATTERY_031_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_031_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x81F)), //
- m(MasterChannelId.RACK_3_BATTERY_032_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_032_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x820)), //
- m(MasterChannelId.RACK_3_BATTERY_033_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_033_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x821)), //
- m(MasterChannelId.RACK_3_BATTERY_034_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_034_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x822)), //
- m(MasterChannelId.RACK_3_BATTERY_035_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_035_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x823)), //
- m(MasterChannelId.RACK_3_BATTERY_036_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_036_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x824)), //
- m(MasterChannelId.RACK_3_BATTERY_037_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_037_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x825)), //
- m(MasterChannelId.RACK_3_BATTERY_038_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_038_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x826)), //
- m(MasterChannelId.RACK_3_BATTERY_039_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_039_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x827)), //
- m(MasterChannelId.RACK_3_BATTERY_040_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_040_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x828)), //
- m(MasterChannelId.RACK_3_BATTERY_041_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_041_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x829)), //
- m(MasterChannelId.RACK_3_BATTERY_042_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_042_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x82A)), //
- m(MasterChannelId.RACK_3_BATTERY_043_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_043_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x82B)), //
- m(MasterChannelId.RACK_3_BATTERY_044_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_044_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x82C)), //
- m(MasterChannelId.RACK_3_BATTERY_045_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_045_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x82D)), //
- m(MasterChannelId.RACK_3_BATTERY_046_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_046_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x82E)), //
- m(MasterChannelId.RACK_3_BATTERY_047_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_047_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x82F)), //
- m(MasterChannelId.RACK_3_BATTERY_048_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_048_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x830)), //
- m(MasterChannelId.RACK_3_BATTERY_049_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_049_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x831)), //
- m(MasterChannelId.RACK_3_BATTERY_050_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_050_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x832)), //
- m(MasterChannelId.RACK_3_BATTERY_051_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_051_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x833)), //
- m(MasterChannelId.RACK_3_BATTERY_052_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_052_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x834)), //
- m(MasterChannelId.RACK_3_BATTERY_053_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_053_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x835)), //
- m(MasterChannelId.RACK_3_BATTERY_054_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_054_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x836)), //
- m(MasterChannelId.RACK_3_BATTERY_055_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_055_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x837)), //
- m(MasterChannelId.RACK_3_BATTERY_056_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_056_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x838)), //
- m(MasterChannelId.RACK_3_BATTERY_057_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_057_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x839)), //
- m(MasterChannelId.RACK_3_BATTERY_058_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_058_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x83A)), //
- m(MasterChannelId.RACK_3_BATTERY_059_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_059_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x83B)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x83C, Priority.LOW, //
- m(MasterChannelId.RACK_3_BATTERY_060_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_060_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x83C)), //
- m(MasterChannelId.RACK_3_BATTERY_061_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_061_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x83D)), //
- m(MasterChannelId.RACK_3_BATTERY_062_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_062_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x83E)), //
- m(MasterChannelId.RACK_3_BATTERY_063_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_063_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x83F)), //
- m(MasterChannelId.RACK_3_BATTERY_064_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_064_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x840)), //
- m(MasterChannelId.RACK_3_BATTERY_065_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_065_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x841)), //
- m(MasterChannelId.RACK_3_BATTERY_066_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_066_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x842)), //
- m(MasterChannelId.RACK_3_BATTERY_067_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_067_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x843)), //
- m(MasterChannelId.RACK_3_BATTERY_068_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_068_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x844)), //
- m(MasterChannelId.RACK_3_BATTERY_069_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_069_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x845)), //
- m(MasterChannelId.RACK_3_BATTERY_070_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_070_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x846)), //
- m(MasterChannelId.RACK_3_BATTERY_071_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_071_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x847)), //
- m(MasterChannelId.RACK_3_BATTERY_072_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_072_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x848)), //
- m(MasterChannelId.RACK_3_BATTERY_073_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_073_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x849)), //
- m(MasterChannelId.RACK_3_BATTERY_074_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_074_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x84A)), //
- m(MasterChannelId.RACK_3_BATTERY_075_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_075_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x84B)), //
- m(MasterChannelId.RACK_3_BATTERY_076_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_076_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x84C)), //
- m(MasterChannelId.RACK_3_BATTERY_077_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_077_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x84D)), //
- m(MasterChannelId.RACK_3_BATTERY_078_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_078_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x84E)), //
- m(MasterChannelId.RACK_3_BATTERY_079_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_079_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x84F)), //
- m(MasterChannelId.RACK_3_BATTERY_080_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_080_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x850)), //
- m(MasterChannelId.RACK_3_BATTERY_081_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_081_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x851)), //
- m(MasterChannelId.RACK_3_BATTERY_082_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_082_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x852)), //
- m(MasterChannelId.RACK_3_BATTERY_083_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_083_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x853)), //
- m(MasterChannelId.RACK_3_BATTERY_084_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_084_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x854)), //
- m(MasterChannelId.RACK_3_BATTERY_085_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_085_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x855)), //
- m(MasterChannelId.RACK_3_BATTERY_086_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_086_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x856)), //
- m(MasterChannelId.RACK_3_BATTERY_087_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_087_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x857)), //
- m(MasterChannelId.RACK_3_BATTERY_088_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_088_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x858)), //
- m(MasterChannelId.RACK_3_BATTERY_089_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_089_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x859)), //
- m(MasterChannelId.RACK_3_BATTERY_090_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_090_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x85A)), //
- m(MasterChannelId.RACK_3_BATTERY_091_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_091_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x85B)), //
- m(MasterChannelId.RACK_3_BATTERY_092_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_092_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x85C)), //
- m(MasterChannelId.RACK_3_BATTERY_093_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_093_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x85D)), //
- m(MasterChannelId.RACK_3_BATTERY_094_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_094_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x85E)), //
- m(MasterChannelId.RACK_3_BATTERY_095_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_095_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x85F)), //
- m(MasterChannelId.RACK_3_BATTERY_096_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_096_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x860)), //
- m(MasterChannelId.RACK_3_BATTERY_097_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_097_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x861)), //
- m(MasterChannelId.RACK_3_BATTERY_098_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_098_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x862)), //
- m(MasterChannelId.RACK_3_BATTERY_099_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_099_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x863)), //
- m(MasterChannelId.RACK_3_BATTERY_100_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_100_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x864)), //
- m(MasterChannelId.RACK_3_BATTERY_101_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_101_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x865)), //
- m(MasterChannelId.RACK_3_BATTERY_102_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_102_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x866)), //
- m(MasterChannelId.RACK_3_BATTERY_103_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_103_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x867)), //
- m(MasterChannelId.RACK_3_BATTERY_104_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_104_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x868)), //
- m(MasterChannelId.RACK_3_BATTERY_105_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_105_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x869)), //
- m(MasterChannelId.RACK_3_BATTERY_106_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_106_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x86A)), //
- m(MasterChannelId.RACK_3_BATTERY_107_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_107_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x86B)), //
- m(MasterChannelId.RACK_3_BATTERY_108_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_108_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x86C)), //
- m(MasterChannelId.RACK_3_BATTERY_109_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_109_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x86D)), //
- m(MasterChannelId.RACK_3_BATTERY_110_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_110_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x86E)), //
- m(MasterChannelId.RACK_3_BATTERY_111_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_111_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x86F)), //
- m(MasterChannelId.RACK_3_BATTERY_112_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_112_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x870)), //
- m(MasterChannelId.RACK_3_BATTERY_113_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_113_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x871)), //
- m(MasterChannelId.RACK_3_BATTERY_114_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_114_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x872)), //
- m(MasterChannelId.RACK_3_BATTERY_115_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_115_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x873)), //
- m(MasterChannelId.RACK_3_BATTERY_116_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_116_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x874)), //
- m(MasterChannelId.RACK_3_BATTERY_117_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_117_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x875)), //
- m(MasterChannelId.RACK_3_BATTERY_118_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_118_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x876)), //
- m(MasterChannelId.RACK_3_BATTERY_119_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_119_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x877)) //
), //
new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x878, Priority.LOW, //
- m(MasterChannelId.RACK_3_BATTERY_120_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_120_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x878)), //
- m(MasterChannelId.RACK_3_BATTERY_121_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_121_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x879)), //
- m(MasterChannelId.RACK_3_BATTERY_122_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_122_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x87A)), //
- m(MasterChannelId.RACK_3_BATTERY_123_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_123_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x87B)), //
- m(MasterChannelId.RACK_3_BATTERY_124_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_124_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x87C)), //
- m(MasterChannelId.RACK_3_BATTERY_125_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_125_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x87D)), //
- m(MasterChannelId.RACK_3_BATTERY_126_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_126_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x87E)), //
- m(MasterChannelId.RACK_3_BATTERY_127_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_127_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x87F)), //
- m(MasterChannelId.RACK_3_BATTERY_128_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_128_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x880)), //
- m(MasterChannelId.RACK_3_BATTERY_129_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_129_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x881)), //
- m(MasterChannelId.RACK_3_BATTERY_130_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_130_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x882)), //
- m(MasterChannelId.RACK_3_BATTERY_131_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_131_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x883)), //
- m(MasterChannelId.RACK_3_BATTERY_132_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_132_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x884)), //
- m(MasterChannelId.RACK_3_BATTERY_133_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_133_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x885)), //
- m(MasterChannelId.RACK_3_BATTERY_134_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_134_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x886)), //
- m(MasterChannelId.RACK_3_BATTERY_135_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_135_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x887)), //
- m(MasterChannelId.RACK_3_BATTERY_136_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_136_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x888)), //
- m(MasterChannelId.RACK_3_BATTERY_137_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_137_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x889)), //
- m(MasterChannelId.RACK_3_BATTERY_138_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_138_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x88A)), //
- m(MasterChannelId.RACK_3_BATTERY_139_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_139_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x88B)), //
- m(MasterChannelId.RACK_3_BATTERY_140_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_140_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x88C)), //
- m(MasterChannelId.RACK_3_BATTERY_141_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_141_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x88D)), //
- m(MasterChannelId.RACK_3_BATTERY_142_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_142_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x88E)), //
- m(MasterChannelId.RACK_3_BATTERY_143_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_143_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x88F)), //
- m(MasterChannelId.RACK_3_BATTERY_144_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_144_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x890)), //
- m(MasterChannelId.RACK_3_BATTERY_145_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_145_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x891)), //
- m(MasterChannelId.RACK_3_BATTERY_146_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_146_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x892)), //
- m(MasterChannelId.RACK_3_BATTERY_147_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_147_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x893)), //
- m(MasterChannelId.RACK_3_BATTERY_148_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_148_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x894)), //
- m(MasterChannelId.RACK_3_BATTERY_149_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_149_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x895)), //
- m(MasterChannelId.RACK_3_BATTERY_150_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_150_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x896)), //
- m(MasterChannelId.RACK_3_BATTERY_151_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_151_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x897)), //
- m(MasterChannelId.RACK_3_BATTERY_152_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_152_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x898)), //
- m(MasterChannelId.RACK_3_BATTERY_153_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_153_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x899)), //
- m(MasterChannelId.RACK_3_BATTERY_154_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_154_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x89A)), //
- m(MasterChannelId.RACK_3_BATTERY_155_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_155_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x89B)), //
- m(MasterChannelId.RACK_3_BATTERY_156_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_156_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x89C)), //
- m(MasterChannelId.RACK_3_BATTERY_157_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_157_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x89D)), //
- m(MasterChannelId.RACK_3_BATTERY_158_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_158_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x89E)), //
- m(MasterChannelId.RACK_3_BATTERY_159_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_159_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x89F)), //
- m(MasterChannelId.RACK_3_BATTERY_160_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_160_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A0)), //
- m(MasterChannelId.RACK_3_BATTERY_161_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_161_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A1)), //
- m(MasterChannelId.RACK_3_BATTERY_162_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_162_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A2)), //
- m(MasterChannelId.RACK_3_BATTERY_163_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_163_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A3)), //
- m(MasterChannelId.RACK_3_BATTERY_164_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_164_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A4)), //
- m(MasterChannelId.RACK_3_BATTERY_165_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_165_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A5)), //
- m(MasterChannelId.RACK_3_BATTERY_166_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_166_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A6)), //
- m(MasterChannelId.RACK_3_BATTERY_167_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_167_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A7)), //
- m(MasterChannelId.RACK_3_BATTERY_168_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_168_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A8)), //
- m(MasterChannelId.RACK_3_BATTERY_169_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_169_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8A9)), //
- m(MasterChannelId.RACK_3_BATTERY_170_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_170_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8AA)), //
- m(MasterChannelId.RACK_3_BATTERY_171_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_171_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8AB)), //
- m(MasterChannelId.RACK_3_BATTERY_172_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_172_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8AC)), //
- m(MasterChannelId.RACK_3_BATTERY_173_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_173_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8AD)), //
- m(MasterChannelId.RACK_3_BATTERY_174_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_174_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8AE)), //
- m(MasterChannelId.RACK_3_BATTERY_175_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_175_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8AF)), //
- m(MasterChannelId.RACK_3_BATTERY_176_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_176_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B0)), //
- m(MasterChannelId.RACK_3_BATTERY_177_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_177_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B1)), //
- m(MasterChannelId.RACK_3_BATTERY_178_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_178_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B2)), //
- m(MasterChannelId.RACK_3_BATTERY_179_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_179_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B3)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0x8B4, Priority.LOW, //
- m(MasterChannelId.RACK_3_BATTERY_180_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_180_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B4)), //
- m(MasterChannelId.RACK_3_BATTERY_181_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_181_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B5)), //
- m(MasterChannelId.RACK_3_BATTERY_182_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_182_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B6)), //
- m(MasterChannelId.RACK_3_BATTERY_183_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_183_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B7)), //
- m(MasterChannelId.RACK_3_BATTERY_184_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_184_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B8)), //
- m(MasterChannelId.RACK_3_BATTERY_185_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_185_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8B9)), //
- m(MasterChannelId.RACK_3_BATTERY_186_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_186_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8BA)), //
- m(MasterChannelId.RACK_3_BATTERY_187_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_187_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8BB)), //
- m(MasterChannelId.RACK_3_BATTERY_188_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_188_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8BC)), //
- m(MasterChannelId.RACK_3_BATTERY_189_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_189_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8BD)), //
- m(MasterChannelId.RACK_3_BATTERY_190_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_190_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8BE)), //
- m(MasterChannelId.RACK_3_BATTERY_191_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_191_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8BF)), //
- m(MasterChannelId.RACK_3_BATTERY_192_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_192_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C0)), //
- m(MasterChannelId.RACK_3_BATTERY_193_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_193_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C1)), //
- m(MasterChannelId.RACK_3_BATTERY_194_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_194_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C2)), //
- m(MasterChannelId.RACK_3_BATTERY_195_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_195_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C3)), //
- m(MasterChannelId.RACK_3_BATTERY_196_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_196_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C4)), //
- m(MasterChannelId.RACK_3_BATTERY_197_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_197_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C5)), //
- m(MasterChannelId.RACK_3_BATTERY_198_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_198_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C6)), //
- m(MasterChannelId.RACK_3_BATTERY_199_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_199_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C7)), //
- m(MasterChannelId.RACK_3_BATTERY_200_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_200_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C8)), //
- m(MasterChannelId.RACK_3_BATTERY_201_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_201_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8C9)), //
- m(MasterChannelId.RACK_3_BATTERY_202_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_202_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8CA)), //
- m(MasterChannelId.RACK_3_BATTERY_203_VOLTAGE,
+ m(ClusterChannelId.RACK_3_BATTERY_203_VOLTAGE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0x8CB)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0xC00, Priority.LOW, //
- m(MasterChannelId.RACK_3_BATTERY_000_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_000_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC00)), //
- m(MasterChannelId.RACK_3_BATTERY_001_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_001_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC01)), //
- m(MasterChannelId.RACK_3_BATTERY_002_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_002_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC02)), //
- m(MasterChannelId.RACK_3_BATTERY_003_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_003_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC03)), //
- m(MasterChannelId.RACK_3_BATTERY_004_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_004_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC04)), //
- m(MasterChannelId.RACK_3_BATTERY_005_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_005_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC05)), //
- m(MasterChannelId.RACK_3_BATTERY_006_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_006_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC06)), //
- m(MasterChannelId.RACK_3_BATTERY_007_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_007_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC07)), //
- m(MasterChannelId.RACK_3_BATTERY_008_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_008_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC08)), //
- m(MasterChannelId.RACK_3_BATTERY_009_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_009_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC09)), //
- m(MasterChannelId.RACK_3_BATTERY_010_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_010_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC0A)), //
- m(MasterChannelId.RACK_3_BATTERY_011_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_011_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC0B)), //
- m(MasterChannelId.RACK_3_BATTERY_012_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_012_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC0C)), //
- m(MasterChannelId.RACK_3_BATTERY_013_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_013_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC0D)), //
- m(MasterChannelId.RACK_3_BATTERY_014_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_014_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC0E)), //
- m(MasterChannelId.RACK_3_BATTERY_015_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_015_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC0F)), //
- m(MasterChannelId.RACK_3_BATTERY_016_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_016_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC10)), //
- m(MasterChannelId.RACK_3_BATTERY_017_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_017_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC11)), //
- m(MasterChannelId.RACK_3_BATTERY_018_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_018_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC12)), //
- m(MasterChannelId.RACK_3_BATTERY_019_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_019_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC13)), //
- m(MasterChannelId.RACK_3_BATTERY_020_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_020_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC14)), //
- m(MasterChannelId.RACK_3_BATTERY_021_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_021_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC15)), //
- m(MasterChannelId.RACK_3_BATTERY_022_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_022_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC16)), //
- m(MasterChannelId.RACK_3_BATTERY_023_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_023_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC17)), //
- m(MasterChannelId.RACK_3_BATTERY_024_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_024_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC18)), //
- m(MasterChannelId.RACK_3_BATTERY_025_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_025_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC19)), //
- m(MasterChannelId.RACK_3_BATTERY_026_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_026_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC1A)), //
- m(MasterChannelId.RACK_3_BATTERY_027_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_027_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC1B)), //
- m(MasterChannelId.RACK_3_BATTERY_028_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_028_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC1C)), //
- m(MasterChannelId.RACK_3_BATTERY_029_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_029_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC1D)), //
- m(MasterChannelId.RACK_3_BATTERY_030_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_030_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC1E)), //
- m(MasterChannelId.RACK_3_BATTERY_031_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_031_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC1F)), //
- m(MasterChannelId.RACK_3_BATTERY_032_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_032_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC20)), //
- m(MasterChannelId.RACK_3_BATTERY_033_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_033_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC21)), //
- m(MasterChannelId.RACK_3_BATTERY_034_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_034_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC22)), //
- m(MasterChannelId.RACK_3_BATTERY_035_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_035_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC23)), //
- m(MasterChannelId.RACK_3_BATTERY_036_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_036_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC24)), //
- m(MasterChannelId.RACK_3_BATTERY_037_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_037_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC25)), //
- m(MasterChannelId.RACK_3_BATTERY_038_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_038_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC26)), //
- m(MasterChannelId.RACK_3_BATTERY_039_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_039_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC27)), //
- m(MasterChannelId.RACK_3_BATTERY_040_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_040_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC28)), //
- m(MasterChannelId.RACK_3_BATTERY_041_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_041_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC29)), //
- m(MasterChannelId.RACK_3_BATTERY_042_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_042_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC2A)), //
- m(MasterChannelId.RACK_3_BATTERY_043_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_043_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC2B)), //
- m(MasterChannelId.RACK_3_BATTERY_044_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_044_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC2C)), //
- m(MasterChannelId.RACK_3_BATTERY_045_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_045_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC2D)), //
- m(MasterChannelId.RACK_3_BATTERY_046_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_046_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC2E)), //
- m(MasterChannelId.RACK_3_BATTERY_047_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_047_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC2F)), //
- m(MasterChannelId.RACK_3_BATTERY_048_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_048_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC30)), //
- m(MasterChannelId.RACK_3_BATTERY_049_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_049_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC31)), //
- m(MasterChannelId.RACK_3_BATTERY_050_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_050_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC32)), //
- m(MasterChannelId.RACK_3_BATTERY_051_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_051_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC33)), //
- m(MasterChannelId.RACK_3_BATTERY_052_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_052_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC34)), //
- m(MasterChannelId.RACK_3_BATTERY_053_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_053_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC35)), //
- m(MasterChannelId.RACK_3_BATTERY_054_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_054_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC36)), //
- m(MasterChannelId.RACK_3_BATTERY_055_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_055_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC37)), //
- m(MasterChannelId.RACK_3_BATTERY_056_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_056_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC38)), //
- m(MasterChannelId.RACK_3_BATTERY_057_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_057_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC39)), //
- m(MasterChannelId.RACK_3_BATTERY_058_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_058_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC3A)), //
- m(MasterChannelId.RACK_3_BATTERY_059_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_059_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC3B)) //
), new FC3ReadRegistersTask(BASE_ADDRESS_RACK_3 + 0xC3C, Priority.LOW, //
- m(MasterChannelId.RACK_3_BATTERY_060_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_060_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC3C)), //
- m(MasterChannelId.RACK_3_BATTERY_061_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_061_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC3D)), //
- m(MasterChannelId.RACK_3_BATTERY_062_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_062_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC3E)), //
- m(MasterChannelId.RACK_3_BATTERY_063_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_063_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC3F)), //
- m(MasterChannelId.RACK_3_BATTERY_064_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_064_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC40)), //
- m(MasterChannelId.RACK_3_BATTERY_065_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_065_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC41)), //
- m(MasterChannelId.RACK_3_BATTERY_066_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_066_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC42)), //
- m(MasterChannelId.RACK_3_BATTERY_067_TEMPERATURE,
+ m(ClusterChannelId.RACK_3_BATTERY_067_TEMPERATURE,
new UnsignedWordElement(BASE_ADDRESS_RACK_3 + 0xC43)) //
) //
}));
@@ -2494,7 +2499,7 @@ private void recalculateSoc() {
int soc = 0;
if (config.rack1IsUsed()) {
- IntegerReadChannel r = this.channel(MasterChannelId.RACK_1_SOC);
+ IntegerReadChannel r = this.channel(ClusterChannelId.RACK_1_SOC);
Optional s = r.value().asOptional();
if (s.isPresent()) {
i++;
@@ -2503,7 +2508,7 @@ private void recalculateSoc() {
}
if (config.rack2IsUsed()) {
- IntegerReadChannel r = this.channel(MasterChannelId.RACK_2_SOC);
+ IntegerReadChannel r = this.channel(ClusterChannelId.RACK_2_SOC);
Optional s = r.value().asOptional();
if (s.isPresent()) {
i++;
@@ -2512,7 +2517,7 @@ private void recalculateSoc() {
}
if (config.rack3IsUsed()) {
- IntegerReadChannel r = this.channel(MasterChannelId.RACK_3_SOC);
+ IntegerReadChannel r = this.channel(ClusterChannelId.RACK_3_SOC);
Optional s = r.value().asOptional();
if (s.isPresent()) {
i++;
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/MasterChannelId.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/ClusterChannelId.java
similarity index 99%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/MasterChannelId.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/ClusterChannelId.java
index afe8e311689..8d961f82725 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/MasterChannelId.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/ClusterChannelId.java
@@ -1,12 +1,13 @@
-package io.openems.edge.battery.soltaro.master;
+package io.openems.edge.battery.soltaro.cluster.versiona;
+import io.openems.common.channel.AccessMode;
+import io.openems.common.channel.Level;
+import io.openems.common.channel.Unit;
import io.openems.common.types.OpenemsType;
-import io.openems.edge.common.channel.AccessMode;
import io.openems.edge.common.channel.Doc;
-import io.openems.edge.common.channel.Level;
-import io.openems.edge.common.channel.Unit;
+import io.openems.edge.battery.soltaro.State;
-public enum MasterChannelId implements io.openems.edge.common.channel.ChannelId {
+public enum ClusterChannelId implements io.openems.edge.common.channel.ChannelId {
// EnumReadChannels
STATE_MACHINE(Doc.of(State.values()) //
.text("Current State of State-Machine")), //
@@ -18,14 +19,10 @@ public enum MasterChannelId implements io.openems.edge.common.channel.ChannelId
.accessMode(AccessMode.READ_WRITE)), //
// IntegerReadChannels
- CHARGE_MAX_CURRENT(Doc.of(OpenemsType.INTEGER) //
+ CHARGE_MAX_CURRENT_CLUSTER(Doc.of(OpenemsType.INTEGER) //
.unit(Unit.AMPERE)),
- DISCHARGE_MAX_CURRENT(Doc.of(OpenemsType.INTEGER) //
+ DISCHARGE_MAX_CURRENT_CLUSTER(Doc.of(OpenemsType.INTEGER) //
.unit(Unit.AMPERE)),
- CURRENT(Doc.of(OpenemsType.INTEGER) //
- .unit(Unit.MILLIAMPERE)), //
- VOLTAGE(Doc.of(OpenemsType.INTEGER) //
- .unit(Unit.MILLIVOLT)), //
// StateChannels
MASTER_ALARM_PCS_OUT_OF_CONTROL(Doc.of(Level.INFO) //
@@ -2350,7 +2347,7 @@ public enum MasterChannelId implements io.openems.edge.common.channel.ChannelId
private final Doc doc;
- private MasterChannelId(Doc doc) {
+ private ClusterChannelId(Doc doc) {
this.doc = doc;
}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ClusterRunState.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/ClusterRunState.java
similarity index 84%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ClusterRunState.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/ClusterRunState.java
index b53d6734a7e..3663a2ee078 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ClusterRunState.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/ClusterRunState.java
@@ -1,6 +1,6 @@
-package io.openems.edge.battery.soltaro;
+package io.openems.edge.battery.soltaro.cluster.versiona;
-import io.openems.edge.common.channel.OptionsEnum;
+import io.openems.common.types.OptionsEnum;
public enum ClusterRunState implements OptionsEnum {
UNDEFINED(-1, "Undefined"), //
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Config.java
similarity index 78%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Config.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Config.java
index 0f6d755488f..313c7074d7c 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Config.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Config.java
@@ -1,4 +1,4 @@
-package io.openems.edge.battery.soltaro.master;
+package io.openems.edge.battery.soltaro.cluster.versiona;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@@ -6,47 +6,51 @@
import io.openems.edge.battery.soltaro.BatteryState;
@ObjectClassDefinition( //
- name = "BMS FENECON Soltaro Master", //
+ name = "BMS Soltaro Cluster Version A", //
description = "Implements the Soltaro master battery rack system.")
@interface Config {
- String service_pid();
+ @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component")
String id() default "bms0";
+ @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID")
+ String alias() default "";
+
+ @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?")
boolean enabled() default true;
- @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus brige; ! Soltaro Master needs baudrate of 57600 !")
- String modbus_id();
-
+ @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus brige; ! Soltaro Cluster needs baudrate of 57600 !")
+ String modbus_id() default "modbus0";
+
@AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.")
int modbusUnitId() default 1;
-
+
@AttributeDefinition(name = "Battery state", description = "Switches the battery into the given state, if default is used, battery state is set automatically")
BatteryState batteryState() default BatteryState.DEFAULT;
-
+
@AttributeDefinition(name = "Rack 1 Usage", description = "Determines whether rack 1 is used")
boolean rack1IsUsed() default true;
-
+
@AttributeDefinition(name = "Rack 2 Usage", description = "Determines whether rack 2 is used")
boolean rack2IsUsed() default true;
-
+
@AttributeDefinition(name = "Rack 3 Usage", description = "Determines whether rack 3 is used")
boolean rack3IsUsed() default true;
-
+
@AttributeDefinition(name = "Error Level 2 Delay", description = "Sets the delay time in seconds how long the system should be stopped after an error level 2 has occurred")
int errorLevel2Delay() default 600;
-
+
@AttributeDefinition(name = "Max Start Attempts", description = "Sets the counter how many time the system should try to start")
int maxStartAppempts() default 5;
-
+
@AttributeDefinition(name = "Max Start Time", description = "Max Time in seconds allowed for starting the system")
int maxStartTime() default 20;
-
+
@AttributeDefinition(name = "Start Not Successful Delay Time", description = "Sets the delay time in seconds how long the system should be stopped if it was not able to start")
int startUnsuccessfulDelay() default 3600;
@AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.")
String Modbus_target() default "";
- String webconsole_configurationFactory_nameHint() default "BMS FENECON Soltaro Master [{id}]";
+ String webconsole_configurationFactory_nameHint() default "BMS Soltaro Cluster Version A [{id}]";
}
\ No newline at end of file
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Enums.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Enums.java
similarity index 95%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Enums.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Enums.java
index 3cffc6ba3f0..0f5d2185c8e 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/Enums.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/Enums.java
@@ -1,6 +1,6 @@
-package io.openems.edge.battery.soltaro.master;
+package io.openems.edge.battery.soltaro.cluster.versiona;
-import io.openems.edge.common.channel.OptionsEnum;
+import io.openems.common.types.OptionsEnum;
public class Enums {
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/package-info.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/package-info.java
new file mode 100644
index 00000000000..dbc5e256066
--- /dev/null
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versiona/package-info.java
@@ -0,0 +1,2 @@
+@org.osgi.annotation.versioning.Version("1.0.0")
+package io.openems.edge.battery.soltaro.cluster.versiona;
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Cluster.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Cluster.java
new file mode 100644
index 00000000000..18600735c2e
--- /dev/null
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Cluster.java
@@ -0,0 +1,616 @@
+package io.openems.edge.battery.soltaro.cluster.versionb;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.osgi.service.metatype.annotations.Designate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
+import io.openems.edge.battery.api.Battery;
+import io.openems.edge.battery.soltaro.BatteryState;
+import io.openems.edge.battery.soltaro.ModuleParameters;
+import io.openems.edge.battery.soltaro.State;
+import io.openems.edge.battery.soltaro.cluster.versionb.ClusterChannelId;
+import io.openems.edge.battery.soltaro.cluster.versionb.Enums.ContactorControl;
+import io.openems.edge.battery.soltaro.cluster.versionb.Enums.RackUsage;
+import io.openems.edge.battery.soltaro.cluster.versionb.Enums.StartStop;
+import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent;
+import io.openems.edge.bridge.modbus.api.BridgeModbus;
+import io.openems.edge.bridge.modbus.api.ElementToChannelConverter;
+import io.openems.edge.bridge.modbus.api.ModbusProtocol;
+import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
+import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
+import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
+import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
+import io.openems.edge.bridge.modbus.api.task.FC16WriteRegistersTask;
+import io.openems.edge.bridge.modbus.api.task.FC3ReadRegistersTask;
+import io.openems.edge.bridge.modbus.api.task.Task;
+import io.openems.edge.common.channel.Channel;
+import io.openems.edge.common.channel.EnumReadChannel;
+import io.openems.edge.common.channel.EnumWriteChannel;
+import io.openems.edge.common.channel.StateChannel;
+import io.openems.edge.common.component.OpenemsComponent;
+import io.openems.edge.common.event.EdgeEventConstants;
+import io.openems.edge.common.taskmanager.Priority;
+
+@Designate(ocd = Config.class, factory = true)
+@Component( //
+ name = "Bms.Soltaro.Cluster.VersionB", //
+ immediate = true, //
+ configurationPolicy = ConfigurationPolicy.REQUIRE, //
+ property = EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE //
+)
+public class Cluster extends AbstractOpenemsModbusComponent implements Battery, OpenemsComponent, EventHandler {
+
+ public static final int DISCHARGE_MAX_A = 0; // default value 0 to avoid damages
+ public static final int CHARGE_MAX_A = 0; // default value 0 to avoid damages
+
+ private static final int ADDRESS_OFFSET_RACK_1 = 0x2000;
+ private static final int ADDRESS_OFFSET_RACK_2 = 0x3000;
+ private static final int ADDRESS_OFFSET_RACK_3 = 0x4000;
+ private static final int ADDRESS_OFFSET_RACK_4 = 0x5000;
+ private static final int ADDRESS_OFFSET_RACK_5 = 0x6000;
+ private static final int OFFSET_CONTACTOR_CONTROL = 0x10;
+
+ // Helper that holds general information about single racks, independent if they
+ // are used or not
+ private static final Map RACK_INFO = createRackInfo();
+ private final Logger log = LoggerFactory.getLogger(Cluster.class);
+
+ @Reference
+ protected ConfigurationAdmin cm;
+
+ // If an error has occurred, this indicates the time when next action could be
+ // done
+ private LocalDateTime errorDelayIsOver = null;
+ private int unsuccessfulStarts = 0;
+ private LocalDateTime startAttemptTime = null;
+ private String modbusBridgeId;
+ private BatteryState batteryState;
+ private State state = State.UNDEFINED;
+ private Config config;
+ private Map racks = new HashMap<>();
+
+ public Cluster() {
+ super(//
+ OpenemsComponent.ChannelId.values(), //
+ Battery.ChannelId.values(), //
+ ClusterChannelId.values() //
+ );
+ }
+
+ @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY)
+ protected void setModbus(BridgeModbus modbus) {
+ super.setModbus(modbus);
+ }
+
+ @Activate
+ void activate(ComponentContext context, Config config) {
+ // Create racks dynamically, do this before super() call because super() uses getModbusProtocol, and it is using racks...
+ for (int i : config.racks()) {
+ this.racks.put(i, new SingleRack(i, config.numberOfSlaves(), RACK_INFO.get(i).addressOffset, this));
+ }
+
+ super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, "Modbus",
+ config.modbus_id());
+
+ this.config = config;
+ this.modbusBridgeId = config.modbus_id();
+ this.batteryState = config.batteryState();
+
+
+ this.channel(Battery.ChannelId.CHARGE_MAX_CURRENT).setNextValue(Cluster.CHARGE_MAX_A);
+ this.channel(Battery.ChannelId.DISCHARGE_MAX_CURRENT).setNextValue(Cluster.DISCHARGE_MAX_A);
+ this.channel(Battery.ChannelId.CHARGE_MAX_VOLTAGE)
+ .setNextValue(this.config.numberOfSlaves() * ModuleParameters.MAX_VOLTAGE_MILLIVOLT.getValue() / 1000);
+ this.channel(Battery.ChannelId.DISCHARGE_MIN_VOLTAGE)
+ .setNextValue(this.config.numberOfSlaves() * ModuleParameters.MIN_VOLTAGE_MILLIVOLT.getValue() / 1000);
+ this.channel(Battery.ChannelId.CAPACITY).setNextValue(this.config.racks().length * this.config.numberOfSlaves()
+ * ModuleParameters.CAPACITY_WH.getValue() / 1000);
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+
+ if (!this.isEnabled()) {
+ return;
+ }
+ switch (event.getTopic()) {
+
+ case EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE:
+ this.handleBatteryState();
+ break;
+ }
+ }
+
+ private void handleBatteryState() {
+ switch (this.batteryState) {
+ case DEFAULT:
+ handleStateMachine();
+ break;
+ case OFF:
+ stopSystem();
+ break;
+ case ON:
+ startSystem();
+ break;
+ case CONFIGURE:
+ System.out.println("Cluster cannot be configured currently!");
+ break;
+ }
+ }
+
+ private void handleStateMachine() {
+ log.info("Cluster.doNormalHandling(): State: " + this.getStateMachineState());
+ boolean readyForWorking = false;
+ switch (this.getStateMachineState()) {
+ case ERROR:
+ stopSystem();
+ errorDelayIsOver = LocalDateTime.now().plusSeconds(config.errorLevel2Delay());
+ setStateMachineState(State.ERRORDELAY);
+ break;
+ case ERRORDELAY:
+ if (LocalDateTime.now().isAfter(errorDelayIsOver)) {
+ errorDelayIsOver = null;
+ if (this.isError()) {
+ this.setStateMachineState(State.ERROR);
+ } else {
+ this.setStateMachineState(State.OFF);
+ }
+ }
+ break;
+ case INIT:
+ if (this.isSystemRunning()) {
+ this.setStateMachineState(State.RUNNING);
+ unsuccessfulStarts = 0;
+ startAttemptTime = null;
+ } else {
+ if (startAttemptTime.plusSeconds(config.maxStartTime()).isBefore(LocalDateTime.now())) {
+ startAttemptTime = null;
+ unsuccessfulStarts++;
+ this.stopSystem();
+ this.setStateMachineState(State.STOPPING);
+ if (unsuccessfulStarts >= config.maxStartAppempts()) {
+ errorDelayIsOver = LocalDateTime.now().plusSeconds(config.startUnsuccessfulDelay());
+ this.setStateMachineState(State.ERRORDELAY);
+ unsuccessfulStarts = 0;
+ }
+ }
+ }
+ break;
+ case OFF:
+ this.startSystem();
+ this.setStateMachineState(State.INIT);
+ startAttemptTime = LocalDateTime.now();
+ break;
+ case RUNNING:
+ if (this.isSystemRunning()) {
+ if (this.isError()) {
+ this.setStateMachineState(State.ERROR);
+ } else {
+ readyForWorking = true;
+ }
+ } else {
+ this.setStateMachineState(State.UNDEFINED);
+ }
+ break;
+ case STOPPING:
+ if (this.isError()) {
+ this.setStateMachineState(State.ERROR);
+ } else {
+ if (this.isSystemStopped()) {
+ this.setStateMachineState(State.OFF);
+ }
+ }
+ break;
+ case UNDEFINED:
+ if (this.isError()) {
+ this.setStateMachineState(State.ERROR);
+ } else if (this.isSystemStopped()) {
+ this.setStateMachineState(State.OFF);
+ } else if (this.isSystemRunning()) {
+ this.setStateMachineState(State.RUNNING);
+ } else if (this.isSystemStatePending()) {
+ this.setStateMachineState(State.PENDING);
+ }
+ break;
+ case PENDING:
+ this.stopSystem();
+ this.setStateMachineState(State.OFF);
+ break;
+ }
+ this.getReadyForWorking().setNextValue(readyForWorking);
+ }
+
+ private boolean isError() {
+ // still TODO define what is exactly an error
+ if (readValueFromStateChannel(ClusterChannelId.MASTER_ALARM_LEVEL_2_INSULATION)) {
+ return true;
+ }
+ if (readValueFromStateChannel(ClusterChannelId.MASTER_ALARM_PCS_EMS_CONTROL_FAIL)) {
+ return true;
+ }
+ if (readValueFromStateChannel(ClusterChannelId.MASTER_ALARM_PCS_EMS_COMMUNICATION_FAILURE)) {
+ return true;
+ }
+ if (readValueFromStateChannel(ClusterChannelId.MASTER_ALARM_COMMUNICATION_ERROR_WITH_SUBMASTER)) {
+ return true;
+ }
+
+ // Check for communication errors
+ for (int key : racks.keySet()) {
+ if (readValueFromStateChannel(RACK_INFO.get(key).subMasterCommunicationAlarmChannelId)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected Channel> addChannel(io.openems.edge.common.channel.ChannelId channelId) {
+ return super.addChannel(channelId);
+ }
+
+ private boolean readValueFromStateChannel(io.openems.edge.common.channel.ChannelId channelId) {
+ StateChannel s = this.channel(channelId);
+ Optional val = s.value().asOptional();
+ return val.isPresent() && val.get();
+ }
+
+ private boolean isSystemStopped() {
+ return haveAllRacksTheSameContactorControlState(ContactorControl.CUT_OFF);
+ }
+
+ private boolean isSystemRunning() {
+ return haveAllRacksTheSameContactorControlState(ContactorControl.ON_GRID);
+ }
+
+ private boolean haveAllRacksTheSameContactorControlState(ContactorControl cctrl) {
+ boolean b = true;
+ for (SingleRack r : racks.values()) {
+ b = b && cctrl == this.channel(RACK_INFO.get(r.getRackNumber()).positiveContactorChannelId).value()
+ .asEnum();
+ }
+ return b;
+ }
+
+ /**
+ * Checks whether system has an undefined state, e.g. rack 1 & 2 are configured,
+ * but only rack 1 is running. This state can only be reached at startup coming
+ * from state undefined
+ */
+ private boolean isSystemStatePending() {
+ boolean b = true;
+
+ for (SingleRack r : racks.values()) {
+ EnumReadChannel channel = this.channel(RACK_INFO.get(r.getRackNumber()).positiveContactorChannelId);
+ Optional val = channel.value().asOptional();
+ b = b && val.isPresent();
+ }
+
+ return b && !isSystemRunning() && !isSystemStopped();
+ }
+
+ @Override
+ public String debugLog() {
+ return "SoC:" + this.getSoc().value() //
+ + "|Discharge:" + this.getDischargeMinVoltage().value() + ";" + this.getDischargeMaxCurrent().value() //
+ + "|Charge:" + this.getChargeMaxVoltage().value() + ";" + this.getChargeMaxCurrent().value();
+ }
+
+ private void startSystem() {
+ EnumWriteChannel startStopChannel = this.channel(ClusterChannelId.START_STOP);
+ try {
+ startStopChannel.setNextWriteValue(StartStop.START);
+ // Only set the racks that are used, but set the others to unused
+ for (int i : RACK_INFO.keySet()) {
+ EnumWriteChannel rackUsageChannel = this.channel(RACK_INFO.get(i).usageChannelId);
+ if (racks.containsKey(i)) {
+ rackUsageChannel.setNextWriteValue(RackUsage.USED);
+ } else {
+ rackUsageChannel.setNextWriteValue(RackUsage.UNUSED);
+ }
+ }
+ } catch (OpenemsNamedException e) {
+ log.error("Error while trying to start system\n" + e.getMessage());
+ }
+ }
+
+ private void stopSystem() {
+ EnumWriteChannel startStopChannel = this.channel(ClusterChannelId.START_STOP);
+ try {
+ startStopChannel.setNextWriteValue(StartStop.STOP);
+ // write to all racks unused!!
+ for (RackInfo r : RACK_INFO.values()) {
+ EnumWriteChannel rackUsageChannel = this.channel(r.usageChannelId);
+ rackUsageChannel.setNextWriteValue(RackUsage.UNUSED);
+ }
+ } catch (OpenemsNamedException e) {
+ log.error("Error while trying to stop system\n" + e.getMessage());
+ }
+ }
+
+ public String getModbusBridgeId() {
+ return modbusBridgeId;
+ }
+
+ public State getStateMachineState() {
+ return state;
+ }
+
+ public void setStateMachineState(State state) {
+ this.state = state;
+ this.channel(ClusterChannelId.STATE_MACHINE).setNextValue(this.state);
+ }
+
+ @Override
+ protected ModbusProtocol defineModbusProtocol() {
+ ModbusProtocol protocol =new ModbusProtocol(this, new Task[] {
+ // -------- control registers of master --------------------------------------
+ new FC16WriteRegistersTask(0x1017, //
+ m(ClusterChannelId.START_STOP, new UnsignedWordElement(0x1017)), //
+ m(ClusterChannelId.RACK_1_USAGE, new UnsignedWordElement(0x1018)), //
+ m(ClusterChannelId.RACK_2_USAGE, new UnsignedWordElement(0x1019)), //
+ m(ClusterChannelId.RACK_3_USAGE, new UnsignedWordElement(0x101A)), //
+ m(ClusterChannelId.RACK_4_USAGE, new UnsignedWordElement(0x101B)), //
+ m(ClusterChannelId.RACK_5_USAGE, new UnsignedWordElement(0x101C)) //
+ ), //
+ new FC3ReadRegistersTask(0x1017, Priority.HIGH,
+ m(ClusterChannelId.START_STOP, new UnsignedWordElement(0x1017)), //
+ m(ClusterChannelId.RACK_1_USAGE, new UnsignedWordElement(0x1018)), //
+ m(ClusterChannelId.RACK_2_USAGE, new UnsignedWordElement(0x1019)), //
+ m(ClusterChannelId.RACK_3_USAGE, new UnsignedWordElement(0x101A)), //
+ m(ClusterChannelId.RACK_4_USAGE, new UnsignedWordElement(0x101B)), //
+ m(ClusterChannelId.RACK_5_USAGE, new UnsignedWordElement(0x101C)) //
+ ), //
+
+ new FC16WriteRegistersTask(0x101F,
+ m(ClusterChannelId.SYSTEM_INSULATION_LEVEL_1, new UnsignedWordElement(0x101F)), //
+ m(ClusterChannelId.SYSTEM_INSULATION_LEVEL_2, new UnsignedWordElement(0x1020)), //
+ new DummyRegisterElement(0x1021), //
+ m(ClusterChannelId.EMS_COMMUNICATION_TIMEOUT, new UnsignedWordElement(0x1022)), //
+ m(ClusterChannelId.EMS_ADDRESS, new UnsignedWordElement(0x1023)) //
+ ), //
+
+ new FC3ReadRegistersTask(0x101F, Priority.LOW,
+ m(ClusterChannelId.SYSTEM_INSULATION_LEVEL_1, new UnsignedWordElement(0x101F)), //
+ m(ClusterChannelId.SYSTEM_INSULATION_LEVEL_2, new UnsignedWordElement(0x1020)), //
+ new DummyRegisterElement(0x1021), //
+ m(ClusterChannelId.EMS_COMMUNICATION_TIMEOUT, new UnsignedWordElement(0x1022)), //
+ m(ClusterChannelId.EMS_ADDRESS, new UnsignedWordElement(0x1023)) //
+ ), //
+
+ new FC16WriteRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_1),
+ m(ClusterChannelId.RACK_1_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_1))) //
+ ), //
+ new FC3ReadRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_1), Priority.HIGH,
+ m(ClusterChannelId.RACK_1_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_1))) //
+ ), //
+
+ new FC16WriteRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_2),
+ m(ClusterChannelId.RACK_2_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_2))) //
+ ), //
+ new FC3ReadRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_2), Priority.HIGH,
+ m(ClusterChannelId.RACK_2_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_2))) //
+ ), //
+
+ new FC16WriteRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_3),
+ m(ClusterChannelId.RACK_2_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_3))) //
+ ), //
+ new FC3ReadRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_3), Priority.HIGH,
+ m(ClusterChannelId.RACK_3_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_3))) //
+ ), //
+
+ new FC16WriteRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_4),
+ m(ClusterChannelId.RACK_4_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_4))) //
+ ), //
+ new FC3ReadRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_4), Priority.HIGH,
+ m(ClusterChannelId.RACK_4_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_4))) //
+ ), //
+
+ new FC16WriteRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_5),
+ m(ClusterChannelId.RACK_5_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_5))) //
+ ), //
+ new FC3ReadRegistersTask(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_5), Priority.HIGH,
+ m(ClusterChannelId.RACK_5_POSITIVE_CONTACTOR,
+ new UnsignedWordElement(this.getAddressContactorControl(ADDRESS_OFFSET_RACK_5))) //
+ ), //
+
+ // -------- state registers of master --------------------------------------
+ new FC3ReadRegistersTask(0x1044, Priority.LOW, //
+ m(ClusterChannelId.CHARGE_INDICATION, new UnsignedWordElement(0x1044)), //
+ m(ClusterChannelId.SYSTEM_CURRENT, new UnsignedWordElement(0x1045), //
+ ElementToChannelConverter.SCALE_FACTOR_2), // TODO Check if scale factor is correct
+ new DummyRegisterElement(0x1046), //
+ m(Battery.ChannelId.SOC, new UnsignedWordElement(0x1047)) //
+ .onUpdateCallback( val -> { recalculateSoc(); } ), //
+ m(ClusterChannelId.SYSTEM_RUNNING_STATE, new UnsignedWordElement(0x1048)), //
+ m(ClusterChannelId.SYSTEM_VOLTAGE, new UnsignedWordElement(0x1049). //
+ onUpdateCallback( val -> { this.getVoltage().setNextValue(val/10); } ), // map value to api channel
+ ElementToChannelConverter.SCALE_FACTOR_2) // TODO Check if scale factor is correct
+ ), //
+
+ new FC3ReadRegistersTask(0x104A, Priority.HIGH, //
+ m(ClusterChannelId.SYSTEM_INSULATION, new UnsignedWordElement(0x104A)), //
+ new DummyRegisterElement(0x104B, 0x104D), //
+ m(Battery.ChannelId.CHARGE_MAX_CURRENT, new UnsignedWordElement(0x104E),
+ ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
+ m(Battery.ChannelId.DISCHARGE_MAX_CURRENT, new UnsignedWordElement(0x104F),
+ ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
+ ), //
+
+ new FC3ReadRegistersTask(0x1081, Priority.LOW, //
+ m(new BitsWordElement(0x1081, this) //
+ .bit(4, ClusterChannelId.MASTER_ALARM_LEVEL_2_INSULATION) //
+ .bit(3, ClusterChannelId.MASTER_ALARM_LEVEL_1_INSULATION) //
+ .bit(2, ClusterChannelId.MASTER_ALARM_PCS_EMS_CONTROL_FAIL) //
+ .bit(1, ClusterChannelId.MASTER_ALARM_PCS_EMS_COMMUNICATION_FAILURE) //
+ .bit(0, ClusterChannelId.MASTER_ALARM_COMMUNICATION_ERROR_WITH_SUBMASTER) //
+ ), //
+ m(new BitsWordElement(0x1082, this) //
+ .bit(4, ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_5) //
+ .bit(3, ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_4) //
+ .bit(2, ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_3) //
+ .bit(1, ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_2) //
+ .bit(0, ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_1) //
+ ), //
+ m(new BitsWordElement(0x1083, this) //
+ .bit(5, ClusterChannelId.RACK_1_LEVEL_2_ALARM) //
+ .bit(4, ClusterChannelId.RACK_1_PCS_CONTROL_FAULT) //
+ .bit(3, ClusterChannelId.RACK_1_COMMUNICATION_WITH_MASTER_ERROR) //
+ .bit(2, ClusterChannelId.RACK_1_DEVICE_ERROR) //
+ .bit(1, ClusterChannelId.RACK_1_CYCLE_OVER_CURRENT) //
+ .bit(0, ClusterChannelId.RACK_1_VOLTAGE_DIFFERENCE) //
+ ), //
+ m(new BitsWordElement(0x1084, this) //
+ .bit(5, ClusterChannelId.RACK_2_LEVEL_2_ALARM) //
+ .bit(4, ClusterChannelId.RACK_2_PCS_CONTROL_FAULT) //
+ .bit(3, ClusterChannelId.RACK_2_COMMUNICATION_WITH_MASTER_ERROR) //
+ .bit(2, ClusterChannelId.RACK_2_DEVICE_ERROR) //
+ .bit(1, ClusterChannelId.RACK_2_CYCLE_OVER_CURRENT) //
+ .bit(0, ClusterChannelId.RACK_2_VOLTAGE_DIFFERENCE) //
+ ), //
+ m(new BitsWordElement(0x1085, this) //
+ .bit(5, ClusterChannelId.RACK_3_LEVEL_2_ALARM) //
+ .bit(4, ClusterChannelId.RACK_3_PCS_CONTROL_FAULT) //
+ .bit(3, ClusterChannelId.RACK_3_COMMUNICATION_WITH_MASTER_ERROR) //
+ .bit(2, ClusterChannelId.RACK_3_DEVICE_ERROR) //
+ .bit(1, ClusterChannelId.RACK_3_CYCLE_OVER_CURRENT) //
+ .bit(0, ClusterChannelId.RACK_3_VOLTAGE_DIFFERENCE) //
+ ), //
+ m(new BitsWordElement(0x1086, this) //
+ .bit(5, ClusterChannelId.RACK_4_LEVEL_2_ALARM) //
+ .bit(4, ClusterChannelId.RACK_4_PCS_CONTROL_FAULT) //
+ .bit(3, ClusterChannelId.RACK_4_COMMUNICATION_WITH_MASTER_ERROR) //
+ .bit(2, ClusterChannelId.RACK_4_DEVICE_ERROR) //
+ .bit(1, ClusterChannelId.RACK_4_CYCLE_OVER_CURRENT) //
+ .bit(0, ClusterChannelId.RACK_4_VOLTAGE_DIFFERENCE) //
+ ), //
+ m(new BitsWordElement(0x1087, this) //
+ .bit(5, ClusterChannelId.RACK_5_LEVEL_2_ALARM) //
+ .bit(4, ClusterChannelId.RACK_5_PCS_CONTROL_FAULT) //
+ .bit(3, ClusterChannelId.RACK_5_COMMUNICATION_WITH_MASTER_ERROR) //
+ .bit(2, ClusterChannelId.RACK_5_DEVICE_ERROR) //
+ .bit(1, ClusterChannelId.RACK_5_CYCLE_OVER_CURRENT) //
+ .bit(0, ClusterChannelId.RACK_5_VOLTAGE_DIFFERENCE) //
+ ) //
+ ) //
+
+
+ });
+
+ for (SingleRack rack : racks.values()) {
+ protocol.addTasks(rack.getTasks().toArray(new Task[] {}));
+ }
+
+ return protocol;
+ }
+
+ private int getAddressContactorControl(int addressOffsetRack) {
+ return addressOffsetRack + OFFSET_CONTACTOR_CONTROL;
+ }
+
+ protected final AbstractModbusElement> map(io.openems.edge.common.channel.ChannelId channelId,
+ AbstractModbusElement> element) {
+ return this.m(channelId, element);
+ }
+
+ protected final AbstractModbusElement> map(io.openems.edge.common.channel.ChannelId channelId,
+ AbstractModbusElement> element, ElementToChannelConverter converter) {
+ return this.m(channelId, element, converter);
+ }
+
+ protected final AbstractModbusElement> map(BitsWordElement bitsWordElement) {
+ return super.m(bitsWordElement);
+ }
+
+ public void recalculateSoc() {
+ int i = 0;
+ int soc = 0;
+
+ for (SingleRack rack : this.racks.values()) {
+ this.log.info("Rack " + rack.getRackNumber() + " has a SoC of " + rack.getSoC() + " %!");
+ soc = soc + rack.getSoC();
+ i++;
+ }
+
+ if (i > 0) {
+ soc = soc / i;
+ }
+
+ this.log.info("Calculated SoC: " + soc);
+
+ this.channel(Battery.ChannelId.SOC).setNextValue(soc);
+ }
+
+ private static Map createRackInfo() {
+ Map map = new HashMap();
+ map.put(1,
+ new RackInfo(ADDRESS_OFFSET_RACK_1, ClusterChannelId.RACK_1_USAGE,
+ ClusterChannelId.RACK_1_POSITIVE_CONTACTOR,
+ ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_1));
+ map.put(2,
+ new RackInfo(ADDRESS_OFFSET_RACK_2, ClusterChannelId.RACK_2_USAGE,
+ ClusterChannelId.RACK_2_POSITIVE_CONTACTOR,
+ ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_2));
+ map.put(3,
+ new RackInfo(ADDRESS_OFFSET_RACK_3, ClusterChannelId.RACK_3_USAGE,
+ ClusterChannelId.RACK_3_POSITIVE_CONTACTOR,
+ ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_3));
+ map.put(4,
+ new RackInfo(ADDRESS_OFFSET_RACK_4, ClusterChannelId.RACK_4_USAGE,
+ ClusterChannelId.RACK_4_POSITIVE_CONTACTOR,
+ ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_4));
+ map.put(5,
+ new RackInfo(ADDRESS_OFFSET_RACK_5, ClusterChannelId.RACK_5_USAGE,
+ ClusterChannelId.RACK_5_POSITIVE_CONTACTOR,
+ ClusterChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_5));
+
+ return map;
+ }
+
+ // Helper class to get infos about connected racks
+ private static class RackInfo {
+ int addressOffset;
+ ClusterChannelId usageChannelId;
+ ClusterChannelId positiveContactorChannelId;
+ ClusterChannelId subMasterCommunicationAlarmChannelId;
+
+ RackInfo( //
+ int addressOffset, //
+ ClusterChannelId usageChannelId, //
+ ClusterChannelId positiveContactorChannelId, //
+ ClusterChannelId subMasterCommunicationAlarmChannelId //
+ ) {
+ this.addressOffset = addressOffset;
+ this.usageChannelId = usageChannelId;
+ this.subMasterCommunicationAlarmChannelId = subMasterCommunicationAlarmChannelId;
+ this.positiveContactorChannelId = positiveContactorChannelId;
+ }
+ }
+}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/MultiRackChannelId.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/ClusterChannelId.java
similarity index 81%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/MultiRackChannelId.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/ClusterChannelId.java
index 1527174f567..2cd59d99ae7 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/MultiRackChannelId.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/ClusterChannelId.java
@@ -1,12 +1,13 @@
-package io.openems.edge.battery.soltaro.multirack;
+package io.openems.edge.battery.soltaro.cluster.versionb;
+import io.openems.common.channel.AccessMode;
+import io.openems.common.channel.Level;
+import io.openems.common.channel.Unit;
import io.openems.common.types.OpenemsType;
-import io.openems.edge.common.channel.AccessMode;
+import io.openems.edge.battery.soltaro.State;
import io.openems.edge.common.channel.Doc;
-import io.openems.edge.common.channel.Level;
-import io.openems.edge.common.channel.Unit;
-public enum MultiRackChannelId implements io.openems.edge.common.channel.ChannelId {
+public enum ClusterChannelId implements io.openems.edge.common.channel.ChannelId {
// EnumReadChannels
STATE_MACHINE(Doc.of(State.values()) //
.text("Current State of State-Machine")), //
@@ -34,20 +35,15 @@ public enum MultiRackChannelId implements io.openems.edge.common.channel.Channel
EMS_COMMUNICATION_TIMEOUT(Doc.of(OpenemsType.INTEGER) //
.unit(Unit.SECONDS) //
.accessMode(AccessMode.READ_WRITE)), //
- RACK_1_POSITIVE_CONTACTOR(Doc.of(OpenemsType.INTEGER) //
- .unit(Unit.NONE) //
+ RACK_1_POSITIVE_CONTACTOR(Doc.of(Enums.ContactorControl.values()) //
.accessMode(AccessMode.READ_WRITE)), //
- RACK_2_POSITIVE_CONTACTOR(Doc.of(OpenemsType.INTEGER) //
- .unit(Unit.NONE) //
+ RACK_2_POSITIVE_CONTACTOR(Doc.of(Enums.ContactorControl.values()) //
.accessMode(AccessMode.READ_WRITE)), //
- RACK_3_POSITIVE_CONTACTOR(Doc.of(OpenemsType.INTEGER) //
- .unit(Unit.NONE) //
+ RACK_3_POSITIVE_CONTACTOR(Doc.of(Enums.ContactorControl.values()) //
.accessMode(AccessMode.READ_WRITE)), //
- RACK_4_POSITIVE_CONTACTOR(Doc.of(OpenemsType.INTEGER) //
- .unit(Unit.NONE) //
+ RACK_4_POSITIVE_CONTACTOR(Doc.of(Enums.ContactorControl.values()) //
.accessMode(AccessMode.READ_WRITE)), //
- RACK_5_POSITIVE_CONTACTOR(Doc.of(OpenemsType.INTEGER) //
- .unit(Unit.NONE) //
+ RACK_5_POSITIVE_CONTACTOR(Doc.of(Enums.ContactorControl.values()) //
.accessMode(AccessMode.READ_WRITE)), //
SYSTEM_INSULATION_LEVEL_1(Doc.of(OpenemsType.INTEGER) //
.unit(Unit.OHM) //
@@ -57,9 +53,9 @@ public enum MultiRackChannelId implements io.openems.edge.common.channel.Channel
.accessMode(AccessMode.READ_WRITE)), //
// IntegerReadChannels
- CURRENT(Doc.of(OpenemsType.INTEGER) //
+ SYSTEM_CURRENT(Doc.of(OpenemsType.INTEGER) //
.unit(Unit.MILLIAMPERE)), //
- VOLTAGE(Doc.of(OpenemsType.INTEGER) //
+ SYSTEM_VOLTAGE(Doc.of(OpenemsType.INTEGER) //
.unit(Unit.MILLIVOLT)), //
SYSTEM_INSULATION(Doc.of(OpenemsType.INTEGER) //
.unit(Unit.OHM)), //
@@ -75,15 +71,15 @@ public enum MultiRackChannelId implements io.openems.edge.common.channel.Channel
.text("System insulation alarm level 1")),
MASTER_ALARM_LEVEL_2_INSULATION(Doc.of(Level.FAULT) //
.text("System insulation alarm level 2")),
- SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_1(Doc.of(Level.FAULT) //
+ SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_1(Doc.of(Level.OK) //
.text("Communication to sub master 1 fault")),
- SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_2(Doc.of(Level.FAULT) //
+ SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_2(Doc.of(Level.OK) //
.text("Communication to sub master 2 fault")),
- SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_3(Doc.of(Level.FAULT) //
+ SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_3(Doc.of(Level.OK) //
.text("Communication to sub master 3 fault")),
- SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_4(Doc.of(Level.FAULT) //
+ SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_4(Doc.of(Level.OK) //
.text("Communication to sub master 4 fault")),
- SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_5(Doc.of(Level.FAULT) //
+ SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_5(Doc.of(Level.OK) //
.text("Communication to sub master 5 fault")),
RACK_1_LEVEL_2_ALARM(Doc.of(Level.FAULT) //
.text("Rack 1 Level 2 Alarm")),
@@ -148,11 +144,12 @@ public enum MultiRackChannelId implements io.openems.edge.common.channel.Channel
RACK_5_CYCLE_OVER_CURRENT(Doc.of(Level.FAULT) //
.text("Rack 1 Cycle over current")),
RACK_5_VOLTAGE_DIFFERENCE(Doc.of(Level.FAULT) //
- .text("Rack 1 Voltage difference"));
+ .text("Rack 1 Voltage difference"))
+ ;
private final Doc doc;
- private MultiRackChannelId(Doc doc) {
+ private ClusterChannelId(Doc doc) {
this.doc = doc;
}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Config.java
similarity index 64%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/Config.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Config.java
index 4dd47f14610..aed624bd3de 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/Config.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Config.java
@@ -1,4 +1,4 @@
-package io.openems.edge.battery.soltaro.multirack;
+package io.openems.edge.battery.soltaro.cluster.versionb;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@@ -6,60 +6,51 @@
import io.openems.edge.battery.soltaro.BatteryState;
@ObjectClassDefinition( //
- name = "BMS FENECON Soltaro MultiRack", //
+ name = "BMS Soltaro Cluster Version B", //
description = "Implements the Soltaro multi rack battery system.")
@interface Config {
- String service_pid();
+ @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component")
String id() default "bms0";
+ @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID")
+ String alias() default "";
+
+ @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?")
boolean enabled() default true;
- @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus brige; ! Soltaro MultiRack needs baudrate of 57600 !")
- String modbus_id();
-
+ @AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus brige; ! Soltaro Cluster needs baudrate of 57600 !")
+ String modbus_id() default "modbus0";
+
@AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.")
int modbusUnitId() default 0;
-
+
@AttributeDefinition(name = "Battery state", description = "Switches the battery into the given state, if default is used, battery state is set automatically")
BatteryState batteryState() default BatteryState.DEFAULT;
-
- @AttributeDefinition(name = "Number of slaves", description = "The number of slave modules per rack (max. 22)", min = "1", max = "22")
+
+ @AttributeDefinition(name = "Number of slaves", description = "The number of slaves in this battery rack (max. 20)", min = "1", max = "20")
int numberOfSlaves() default 20;
-
- // TODO much more comfortable
+
@AttributeDefinition(name = "Racks Used", description = "Determines what racks are used")
int[] racks();
-
-// @AttributeDefinition(name = "Rack 1 Usage", description = "Determines whether rack 1 is used")
-// boolean rack1IsUsed() default true;
-//
-// @AttributeDefinition(name = "Rack 2 Usage", description = "Determines whether rack 2 is used")
-// boolean rack2IsUsed() default true;
-//
-// @AttributeDefinition(name = "Rack 3 Usage", description = "Determines whether rack 3 is used")
-// boolean rack3IsUsed() default true;
-//
-// @AttributeDefinition(name = "Rack 4 Usage", description = "Determines whether rack 4 is used")
-// boolean rack4IsUsed() default true;
-//
-// @AttributeDefinition(name = "Rack 5 Usage", description = "Determines whether rack 5 is used")
-// boolean rack5IsUsed() default true;
-
+
@AttributeDefinition(name = "Error Level 2 Delay", description = "Sets the delay time in seconds how long the system should be stopped after an error level 2 has occurred")
int errorLevel2Delay() default 600;
-
+
@AttributeDefinition(name = "Max Start Attempts", description = "Sets the counter how many time the system should try to start")
int maxStartAppempts() default 5;
-
+
@AttributeDefinition(name = "Max Start Time", description = "Max Time in seconds allowed for starting the system")
int maxStartTime() default 20;
-
+
@AttributeDefinition(name = "Start Not Successful Delay Time", description = "Sets the delay time in seconds how long the system should be stopped if it was not able to start")
int startUnsuccessfulDelay() default 3600;
+ @AttributeDefinition(name = "Minimal Cell Voltage Millivolt", description = "Minimal cell voltage in milli volt when system does not allow further discharging")
+ int minimalCellVoltage() default 2800;
+
@AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.")
String Modbus_target() default "";
- String webconsole_configurationFactory_nameHint() default "BMS FENECON Soltaro MultiRack [{id}]";
+ String webconsole_configurationFactory_nameHint() default "BMS Soltaro Cluster Version B [{id}]";
}
\ No newline at end of file
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/Enums.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Enums.java
similarity index 96%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/Enums.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Enums.java
index c7b791979dc..6c27581d89a 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/Enums.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/Enums.java
@@ -1,6 +1,6 @@
-package io.openems.edge.battery.soltaro.multirack;
+package io.openems.edge.battery.soltaro.cluster.versionb;
-import io.openems.edge.common.channel.OptionsEnum;
+import io.openems.common.types.OptionsEnum;
public class Enums {
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/SingleRack.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/SingleRack.java
similarity index 81%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/SingleRack.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/SingleRack.java
index b02e6142799..a4f39f90f96 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/SingleRack.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/SingleRack.java
@@ -1,12 +1,19 @@
-package io.openems.edge.battery.soltaro.multirack;
+package io.openems.edge.battery.soltaro.cluster.versionb;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.Optional;
+import io.openems.common.channel.Level;
+import io.openems.common.channel.Unit;
+import io.openems.edge.battery.soltaro.ChannelIdImpl;
+import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent;
import io.openems.edge.bridge.modbus.api.ElementToChannelConverter;
import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
+import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
import io.openems.edge.bridge.modbus.api.element.SignedWordElement;
import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
import io.openems.edge.bridge.modbus.api.task.FC3ReadRegistersTask;
@@ -15,8 +22,6 @@
import io.openems.edge.common.channel.ChannelId;
import io.openems.edge.common.channel.Doc;
import io.openems.edge.common.channel.IntegerDoc;
-import io.openems.edge.common.channel.Level;
-import io.openems.edge.common.channel.Unit;
import io.openems.edge.common.taskmanager.Priority;
/**
@@ -95,11 +100,11 @@ public class SingleRack {
private int rackNumber;
private int numberOfSlaves;
private int addressOffset;
- private MultiRack parent;
+ private Cluster parent;
private final Map channelIds;
private final Map> channelMap;
- protected SingleRack(int racknumber, int numberOfSlaves, int addressOffset, MultiRack parent) {
+ protected SingleRack(int racknumber, int numberOfSlaves, int addressOffset, Cluster parent) {
this.rackNumber = racknumber;
this.numberOfSlaves = numberOfSlaves;
this.addressOffset = addressOffset;
@@ -111,6 +116,16 @@ protected SingleRack(int racknumber, int numberOfSlaves, int addressOffset, Mult
public Collection> getChannels() {
return channelMap.values();
}
+
+ public int getSoC() {
+ @SuppressWarnings("unchecked")
+ Optional socOpt = (Optional) this.channelMap.get(KEY_SOC).value().asOptional();
+ int soc = 0;
+ if (socOpt.isPresent()) {
+ soc = socOpt.get();
+ }
+ return soc;
+ }
private Map> createChannelMap() {
Map> channels = new HashMap<>();
@@ -314,8 +329,7 @@ private Map createChannelIdMap() {
// 10
addEntry(map, KEY_FAILURE_TEMPERATURE_SENSOR_CABLE, Doc.of(Level.FAULT).text("Temperature sensor cable fault")); // Bit
// 9
- addEntry(map, KEY_FAILURE_BALANCING_MODULE, Doc.of(Level.FAULT).text("Balancing module fault")); // Bit
- // 8
+ addEntry(map, KEY_FAILURE_BALANCING_MODULE, Doc.of(Level.OK).text("Balancing module fault")); // Bit 8
addEntry(map, KEY_FAILURE_TEMPERATURE_PCB, Doc.of(Level.FAULT).text("Temperature PCB error")); // Bit 7
addEntry(map, KEY_FAILURE_GR_TEMPERATURE, Doc.of(Level.FAULT).text("GR Temperature error")); // Bit 6
addEntry(map, KEY_FAILURE_TEMP_SENSOR, Doc.of(Level.FAULT).text("Temperature sensor fault")); // Bit 5
@@ -353,7 +367,8 @@ public Collection getTasks() {
parent.map(channelIds.get(KEY_VOLTAGE), getUWE(0x100), ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
parent.map(channelIds.get(KEY_CURRENT), getUWE(0x101), ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
parent.map(channelIds.get(KEY_CHARGE_INDICATION), getUWE(0x102)), //
- parent.map(channelIds.get(KEY_SOC), getUWE(0x103)), //
+ parent.map(channelIds.get(KEY_SOC), getUWE(0x103)). //
+ onUpdateCallback( val -> { parent.recalculateSoc(); } ), //
parent.map(channelIds.get(KEY_SOH), getUWE(0x104)), //
parent.map(channelIds.get(KEY_MAX_CELL_VOLTAGE_ID), getUWE(0x105)), //
parent.map(channelIds.get(KEY_MAX_CELL_VOLTAGE), getUWE(0x106)), //
@@ -367,85 +382,102 @@ public Collection getTasks() {
// Alarm levels
tasks.add(new FC3ReadRegistersTask(this.addressOffset + 0x140, Priority.LOW, //
- parent.map(getUWE(0x140)) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH), 0) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH), 1) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_CHA_CURRENT_HIGH), 2) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_CELL_VOLTAGE_LOW), 3) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW), 4) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH), 5) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH), 6) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW), 7) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_GR_TEMPERATURE_HIGH), 10) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH), 14) //
- .m(channelIds.get(KEY_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW), 15) //
- .build(), //
- parent.map(getUWE(0x141)) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CELL_VOLTAGE_HIGH), 0) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH), 1) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CHA_CURRENT_HIGH), 2) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CELL_VOLTAGE_LOW), 3) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW), 4) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_DISCHA_CURRENT_HIGH), 5) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH), 6) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CELL_CHA_TEMP_LOW), 7) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_SOC_LOW), 8) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH), 9) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_GR_TEMPERATURE_HIGH), 10) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH), 11) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH), 13) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH), 14) //
- .m(channelIds.get(KEY_ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW), 15) //
- .build(), //
+ parent.map(getBWE(0x140, parent) //
+ .bit(0, channelIds.get(KEY_ALARM_LEVEL_2_CELL_VOLTAGE_HIGH)) //
+ .bit(1, channelIds.get(KEY_ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH)) //
+ .bit(2, channelIds.get(KEY_ALARM_LEVEL_2_CHA_CURRENT_HIGH)) //
+ .bit(3, channelIds.get(KEY_ALARM_LEVEL_2_CELL_VOLTAGE_LOW)) //
+ .bit(4, channelIds.get(KEY_ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW)) //
+ .bit(5, channelIds.get(KEY_ALARM_LEVEL_2_DISCHA_CURRENT_HIGH)) //
+ .bit(6, channelIds.get(KEY_ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH)) //
+ .bit(7, channelIds.get(KEY_ALARM_LEVEL_2_CELL_CHA_TEMP_LOW)) //
+ .bit(10, channelIds.get(KEY_ALARM_LEVEL_2_GR_TEMPERATURE_HIGH)) //
+ .bit(14, channelIds.get(KEY_ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH)) //
+ .bit(15, channelIds.get(KEY_ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW)) //
+ ), //
+ parent.map(getBWE(0x141, parent) //
+ .bit(0, channelIds.get(KEY_ALARM_LEVEL_1_CELL_VOLTAGE_HIGH)) //
+ .bit(1, channelIds.get(KEY_ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH)) //
+ .bit(2, channelIds.get(KEY_ALARM_LEVEL_1_CHA_CURRENT_HIGH)) //
+ .bit(3, channelIds.get(KEY_ALARM_LEVEL_1_CELL_VOLTAGE_LOW)) //
+ .bit(4, channelIds.get(KEY_ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW)) //
+ .bit(5, channelIds.get(KEY_ALARM_LEVEL_1_DISCHA_CURRENT_HIGH)) //
+ .bit(6, channelIds.get(KEY_ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH)) //
+ .bit(7, channelIds.get(KEY_ALARM_LEVEL_1_CELL_CHA_TEMP_LOW)) //
+ .bit(8, channelIds.get(KEY_ALARM_LEVEL_1_SOC_LOW)) //
+ .bit(9, channelIds.get(KEY_ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH)) //
+ .bit(10, channelIds.get(KEY_ALARM_LEVEL_1_GR_TEMPERATURE_HIGH)) //
+ .bit(11, channelIds.get(KEY_ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH)) //
+ .bit(13, channelIds.get(KEY_ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH)) //
+ .bit(14, channelIds.get(KEY_ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH)) //
+ .bit(15, channelIds.get(KEY_ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW)) //
+ ), //
parent.map(channelIds.get(KEY_RUN_STATE), getUWE(0x142)) //
) //
);
// Error Codes
tasks.add(new FC3ReadRegistersTask(this.addressOffset + 0x185, Priority.LOW, //
- parent.map(getUWE(0x185)) //
- .m(channelIds.get(KEY_FAILURE_SAMPLING_WIRE), 0)//
- .m(channelIds.get(KEY_FAILURE_CONNECTOR_WIRE), 1)//
- .m(channelIds.get(KEY_FAILURE_LTC6803), 2)//
- .m(channelIds.get(KEY_FAILURE_VOLTAGE_SAMPLING), 3)//
- .m(channelIds.get(KEY_FAILURE_TEMP_SAMPLING), 4)//
- .m(channelIds.get(KEY_FAILURE_TEMP_SENSOR), 5)//
- .m(channelIds.get(KEY_FAILURE_GR_TEMPERATURE), 6)//
- .m(channelIds.get(KEY_FAILURE_TEMPERATURE_PCB), 7)//
- .m(channelIds.get(KEY_FAILURE_BALANCING_MODULE), 8)//
- .m(channelIds.get(KEY_FAILURE_TEMPERATURE_SENSOR_CABLE), 9)//
- .m(channelIds.get(KEY_FAILURE_INTRANET_COMMUNICATION), 10)//
- .m(channelIds.get(KEY_FAILURE_EEPROM), 11)//
- .m(channelIds.get(KEY_FAILURE_INITIALIZATION), 12)//
- .build() //
+ parent.map(getBWE(0x185, parent) //
+ .bit(0, channelIds.get(KEY_FAILURE_SAMPLING_WIRE))//
+ .bit(1, channelIds.get(KEY_FAILURE_CONNECTOR_WIRE))//
+ .bit(2, channelIds.get(KEY_FAILURE_LTC6803))//
+ .bit(3, channelIds.get(KEY_FAILURE_VOLTAGE_SAMPLING))//
+ .bit(4, channelIds.get(KEY_FAILURE_TEMP_SAMPLING))//
+ .bit(5, channelIds.get(KEY_FAILURE_TEMP_SENSOR))//
+ .bit(6, channelIds.get(KEY_FAILURE_GR_TEMPERATURE))//
+ .bit(7, channelIds.get(KEY_FAILURE_TEMPERATURE_PCB))//
+ .bit(8, channelIds.get(KEY_FAILURE_BALANCING_MODULE))//
+ .bit(9, channelIds.get(KEY_FAILURE_TEMPERATURE_SENSOR_CABLE))//
+ .bit(10, channelIds.get(KEY_FAILURE_INTRANET_COMMUNICATION))//
+ .bit(11, channelIds.get(KEY_FAILURE_EEPROM))//
+ .bit(12, channelIds.get(KEY_FAILURE_INITIALIZATION))//
+ ) //
));
+ int MAX_ELEMENTS_PER_TASK = 100;
+
// Cell voltages
for (int i = 0; i < this.numberOfSlaves; i++) {
- Collection> elements = new ArrayList<>();
+ List> elements = new ArrayList<>();
for (int j = i * VOLTAGE_SENSORS_PER_MODULE; j < (i + 1) * VOLTAGE_SENSORS_PER_MODULE; j++) {
String key = getSingleCellPrefix(j) + "_" + VOLTAGE;
UnsignedWordElement uwe = getUWE(VOLTAGE_ADDRESS_OFFSET + j);
AbstractModbusElement> ame = parent.map(channelIds.get(key), uwe);
elements.add(ame);
}
- tasks.add(new FC3ReadRegistersTask(
- this.addressOffset + VOLTAGE_ADDRESS_OFFSET + i * VOLTAGE_SENSORS_PER_MODULE, Priority.LOW,
- elements.toArray(new AbstractModbusElement>[0])));
+
+ //not more than 100 elements per task, because it can cause problems..
+ int taskCount = (elements.size() / MAX_ELEMENTS_PER_TASK) + 1;
+
+ for (int x = 0; x < taskCount; x++) {
+ List> subElements = elements.subList( x * MAX_ELEMENTS_PER_TASK , Math.min( ((x + 1) * MAX_ELEMENTS_PER_TASK ), elements.size() ) );
+ AbstractModbusElement>[] taskElements = subElements.toArray(new AbstractModbusElement>[0]);
+ tasks.add(new FC3ReadRegistersTask(taskElements[0].getStartAddress(), Priority.LOW, taskElements));
+ }
+
+
}
// Cell temperatures
for (int i = 0; i < this.numberOfSlaves; i++) {
- Collection> elements = new ArrayList<>();
+ List> elements = new ArrayList<>();
for (int j = i * TEMPERATURE_SENSORS_PER_MODULE; j < (i + 1) * TEMPERATURE_SENSORS_PER_MODULE; j++) {
String key = getSingleCellPrefix(j) + "_" + TEMPERATURE;
- SignedWordElement swe = new SignedWordElement(this.addressOffset + TEMPERATURE_ADDRESS_OFFSET + j);
+
+ SignedWordElement swe = getSWE(TEMPERATURE_ADDRESS_OFFSET + j);
AbstractModbusElement> ame = parent.map(channelIds.get(key), swe);
elements.add(ame);
}
- tasks.add(new FC3ReadRegistersTask(
- this.addressOffset + TEMPERATURE_ADDRESS_OFFSET + i * TEMPERATURE_SENSORS_PER_MODULE, Priority.LOW,
- elements.toArray(new AbstractModbusElement>[0])));
+
+ //not more than 100 elements per task, because it can cause problems..
+ int taskCount = (elements.size() / MAX_ELEMENTS_PER_TASK) + 1;
+
+ for (int x = 0; x < taskCount; x++) {
+ List> subElements = elements.subList( x * MAX_ELEMENTS_PER_TASK , Math.min( ((x + 1) * MAX_ELEMENTS_PER_TASK ), elements.size() ) );
+ AbstractModbusElement>[] taskElements = subElements.toArray(new AbstractModbusElement>[0]);
+ tasks.add(new FC3ReadRegistersTask(taskElements[0].getStartAddress(), Priority.LOW, taskElements));
+ }
}
return tasks;
@@ -471,7 +503,15 @@ private String getSingleCellPrefix(int num) {
return RACK + "_" + this.rackNumber + "_" + BATTERY + "_" + String.format(NUMBER_FORMAT, num);
}
- private UnsignedWordElement getUWE(int address) {
- return new UnsignedWordElement(this.addressOffset + address);
+ private BitsWordElement getBWE(int addressWithoutOffset, AbstractOpenemsModbusComponent component) {
+ return new BitsWordElement(this.addressOffset + addressWithoutOffset, component);
+ }
+
+ private UnsignedWordElement getUWE(int addressWithoutOffset) {
+ return new UnsignedWordElement(this.addressOffset + addressWithoutOffset);
+ }
+
+ private SignedWordElement getSWE(int addressWithoutOffset) {
+ return new SignedWordElement(this.addressOffset + addressWithoutOffset);
}
}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/package-info.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/package-info.java
new file mode 100644
index 00000000000..7c3d457849b
--- /dev/null
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/cluster/versionb/package-info.java
@@ -0,0 +1,2 @@
+@org.osgi.annotation.versioning.Version("1.0.0")
+package io.openems.edge.battery.soltaro.cluster.versionb;
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/package-info.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/package-info.java
deleted file mode 100644
index 8a02719035c..00000000000
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/package-info.java
+++ /dev/null
@@ -1,2 +0,0 @@
-@org.osgi.annotation.versioning.Version("1.0.0")
-package io.openems.edge.battery.soltaro.master;
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/ChannelIdImpl.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/ChannelIdImpl.java
deleted file mode 100644
index ce8ffabdf6d..00000000000
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/ChannelIdImpl.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.openems.edge.battery.soltaro.multirack;
-
-import io.openems.edge.common.channel.ChannelId;
-import io.openems.edge.common.channel.Doc;
-
-public class ChannelIdImpl implements ChannelId {
-
- private final String name;
- private final Doc doc;
-
- public ChannelIdImpl(String name, Doc doc) {
- this.name = name;
- this.doc = doc;
- }
-
- @Override
- public String name() {
- return this.name;
- }
-
- @Override
- public Doc doc() {
- return this.doc;
- }
-}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/MultiRack.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/MultiRack.java
deleted file mode 100644
index c46095b268e..00000000000
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/MultiRack.java
+++ /dev/null
@@ -1,553 +0,0 @@
-package io.openems.edge.battery.soltaro.multirack;
-
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.ConfigurationPolicy;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.osgi.service.component.annotations.ReferencePolicy;
-import org.osgi.service.component.annotations.ReferencePolicyOption;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventConstants;
-import org.osgi.service.event.EventHandler;
-import org.osgi.service.metatype.annotations.Designate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.openems.common.exceptions.OpenemsException;
-import io.openems.edge.battery.api.Battery;
-import io.openems.edge.battery.soltaro.BatteryState;
-import io.openems.edge.battery.soltaro.multirack.Enums.ContactorControl;
-import io.openems.edge.battery.soltaro.multirack.Enums.RackUsage;
-import io.openems.edge.battery.soltaro.multirack.Enums.StartStop;
-import io.openems.edge.battery.soltaro.versionb.ModuleParameters;
-import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent;
-import io.openems.edge.bridge.modbus.api.BridgeModbus;
-import io.openems.edge.bridge.modbus.api.ElementToChannelConverter;
-import io.openems.edge.bridge.modbus.api.ModbusProtocol;
-import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
-import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
-import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
-import io.openems.edge.bridge.modbus.api.task.FC16WriteRegistersTask;
-import io.openems.edge.bridge.modbus.api.task.FC3ReadRegistersTask;
-import io.openems.edge.bridge.modbus.api.task.Task;
-import io.openems.edge.common.channel.Channel;
-import io.openems.edge.common.channel.IntegerReadChannel;
-import io.openems.edge.common.channel.IntegerWriteChannel;
-import io.openems.edge.common.channel.StateChannel;
-import io.openems.edge.common.component.OpenemsComponent;
-import io.openems.edge.common.event.EdgeEventConstants;
-import io.openems.edge.common.taskmanager.Priority;
-
-@Designate(ocd = Config.class, factory = true)
-@Component( //
- name = "Bms.Fenecon.MultiRack", //
- immediate = true, //
- configurationPolicy = ConfigurationPolicy.REQUIRE, //
- property = EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE //
-)
-public class MultiRack extends AbstractOpenemsModbusComponent implements Battery, OpenemsComponent, EventHandler {
-
- public static final int DISCHARGE_MAX_A = 0; // default value 0 to avoid damages
- public static final int CHARGE_MAX_A = 0; // default value 0 to avoid damages
-
- private static final int ADDRESS_OFFSET_RACK_1 = 0x2000;
- private static final int ADDRESS_OFFSET_RACK_2 = 0x3000;
- private static final int ADDRESS_OFFSET_RACK_3 = 0x4000;
- private static final int ADDRESS_OFFSET_RACK_4 = 0x5000;
- private static final int ADDRESS_OFFSET_RACK_5 = 0x6000;
-
- private static final Map RACK_INFO = createRackInfo();
- private final Logger log = LoggerFactory.getLogger(MultiRack.class);
-
- @Reference
- protected ConfigurationAdmin cm;
-
- // If an error has occurred, this indicates the time when next action could be
- // done
- private LocalDateTime errorDelayIsOver = null;
- private int unsuccessfulStarts = 0;
- private LocalDateTime startAttemptTime = null;
- private String modbusBridgeId;
- private BatteryState batteryState;
- private State state = State.UNDEFINED;
- private Config config;
- private Collection racks = new ArrayList<>();
-
- public MultiRack() {
- super(//
- OpenemsComponent.ChannelId.values(), //
- Battery.ChannelId.values(), //
- MultiRackChannelId.values() //
- );
- }
-
- @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY)
- protected void setModbus(BridgeModbus modbus) {
- super.setModbus(modbus);
- }
-
- @Activate
- void activate(ComponentContext context, Config config) {
- super.activate(context, config.id(), config.enabled(), config.modbusUnitId(), this.cm, "Modbus",
- config.modbus_id());
-
- this.config = config;
- this.modbusBridgeId = config.modbus_id();
- this.batteryState = config.batteryState();
-
- // Create racks dynamically
- for (int i : config.racks()) {
- this.racks.add(new SingleRack(i, config.numberOfSlaves(), RACK_INFO.get(i).addressOffset, this));
- }
-
- this.channel(Battery.ChannelId.CHARGE_MAX_CURRENT).setNextValue(MultiRack.CHARGE_MAX_A);
- this.channel(Battery.ChannelId.DISCHARGE_MAX_CURRENT).setNextValue(MultiRack.DISCHARGE_MAX_A);
- this.channel(Battery.ChannelId.CHARGE_MAX_VOLTAGE)
- .setNextValue(this.config.numberOfSlaves() * ModuleParameters.MAX_VOLTAGE_MILLIVOLT.getValue() / 1000);
- this.channel(Battery.ChannelId.DISCHARGE_MIN_VOLTAGE)
- .setNextValue(this.config.numberOfSlaves() * ModuleParameters.MIN_VOLTAGE_MILLIVOLT.getValue() / 1000);
- this.channel(Battery.ChannelId.CAPACITY).setNextValue(this.config.racks().length * this.config.numberOfSlaves()
- * ModuleParameters.CAPACITY_WH.getValue() / 1000);
- }
-
- @Override
- public void handleEvent(Event event) {
-
- if (!this.isEnabled()) {
- return;
- }
- switch (event.getTopic()) {
-
- case EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE:
- this.handleBatteryState();
- break;
- }
- }
-
- private void handleBatteryState() {
- switch (this.batteryState) {
- case DEFAULT:
- handleStateMachine();
- break;
- case OFF:
- stopSystem();
- break;
- case ON:
- startSystem();
- break;
- }
- }
-
- private void handleStateMachine() {
- log.info("MultiRack.doNormalHandling(): State: " + this.getStateMachineState());
- boolean readyForWorking = false;
- switch (this.getStateMachineState()) {
- case ERROR:
- stopSystem();
- errorDelayIsOver = LocalDateTime.now().plusSeconds(config.errorLevel2Delay());
- setStateMachineState(State.ERRORDELAY);
- break;
- case ERRORDELAY:
- if (LocalDateTime.now().isAfter(errorDelayIsOver)) {
- errorDelayIsOver = null;
- if (this.isError()) {
- this.setStateMachineState(State.ERROR);
- } else {
- this.setStateMachineState(State.OFF);
- }
- }
- break;
- case INIT:
- if (this.isSystemRunning()) {
- this.setStateMachineState(State.RUNNING);
- unsuccessfulStarts = 0;
- startAttemptTime = null;
- } else {
- if (startAttemptTime.plusSeconds(config.maxStartTime()).isBefore(LocalDateTime.now())) {
- startAttemptTime = null;
- unsuccessfulStarts++;
- this.stopSystem();
- this.setStateMachineState(State.STOPPING);
- if (unsuccessfulStarts >= config.maxStartAppempts()) {
- errorDelayIsOver = LocalDateTime.now().plusSeconds(config.startUnsuccessfulDelay());
- this.setStateMachineState(State.ERRORDELAY);
- unsuccessfulStarts = 0;
- }
- }
- }
- break;
- case OFF:
- this.startSystem();
- this.setStateMachineState(State.INIT);
- startAttemptTime = LocalDateTime.now();
- break;
- case RUNNING:
- if (this.isError()) {
- this.setStateMachineState(State.ERROR);
- } else {
- readyForWorking = true;
- }
- break;
- case STOPPING:
- if (this.isError()) {
- this.setStateMachineState(State.ERROR);
- } else {
- if (this.isSystemStopped()) {
- this.setStateMachineState(State.OFF);
- }
- }
- break;
- case UNDEFINED:
- if (this.isError()) {
- this.setStateMachineState(State.ERROR);
- } else if (this.isSystemStopped()) {
- this.setStateMachineState(State.OFF);
- } else if (this.isSystemRunning()) {
- this.setStateMachineState(State.RUNNING);
- } else if (this.isSystemStatePending()) {
- this.setStateMachineState(State.PENDING);
- }
- break;
- case PENDING:
- this.stopSystem();
- this.setStateMachineState(State.OFF);
- break;
- }
- this.getReadyForWorking().setNextValue(readyForWorking);
- }
-
- private boolean isError() {
- // TODO define what is an error
- // should we look at the submasters for level 2 errors?
- if (readValueFromStateChannel(MultiRackChannelId.MASTER_ALARM_LEVEL_2_INSULATION)) {
- return true;
- }
- if (readValueFromStateChannel(MultiRackChannelId.MASTER_ALARM_PCS_EMS_CONTROL_FAIL)) {
- return true;
- }
- if (readValueFromStateChannel(MultiRackChannelId.MASTER_ALARM_PCS_EMS_COMMUNICATION_FAILURE)) {
- return true;
- }
- if (readValueFromStateChannel(MultiRackChannelId.MASTER_ALARM_COMMUNICATION_ERROR_WITH_SUBMASTER)) {
- return true;
- }
-
- return false;
- }
-
- public Channel> addChannel(io.openems.edge.common.channel.ChannelId channelId) {
- return this.addChannel(channelId);
- }
-
- private boolean readValueFromStateChannel(io.openems.edge.common.channel.ChannelId channelId) {
- StateChannel s = this.channel(channelId);
- Optional val = s.value().asOptional();
- return val.isPresent() && val.get();
- }
-
- private boolean isSystemStopped() {
- boolean ret = true;
-
- for (SingleRack rack : racks) {
- ret = ret && ContactorControl.CUT_OFF == this
- .channel(RACK_INFO.get(rack.getRackNumber()).positiveContactorChannelId).value().asEnum();
- }
-
- return ret;
- }
-
- private boolean isSystemRunning() {
- boolean ret = true;
-
- for (SingleRack rack : racks) {
- ret = ret && ContactorControl.ON_GRID == this
- .channel(RACK_INFO.get(rack.getRackNumber()).positiveContactorChannelId).value().asEnum();
- }
-
- return ret;
- }
-
- /**
- * Checks whether system has an undefined state, e.g. rack 1 & 2 are configured,
- * but only rack 1 is running. This state can only be reached at startup coming
- * from state undefined
- */
- private boolean isSystemStatePending() {
- boolean ret = true;
-
- for (SingleRack rack : racks) {
- IntegerReadChannel channel = this.channel(RACK_INFO.get(rack.getRackNumber()).positiveContactorChannelId);
- Optional val = channel.value().asOptional();
- ret = ret && val.isPresent();
- }
-
- return ret && !isSystemRunning() && !isSystemStopped();
- }
-
- @Override
- public String debugLog() {
- return "SoC:" + this.getSoc().value() //
- + "|Discharge:" + this.getDischargeMinVoltage().value() + ";" + this.getDischargeMaxCurrent().value() //
- + "|Charge:" + this.getChargeMaxVoltage().value() + ";" + this.getChargeMaxCurrent().value();
- }
-
- private void startSystem() {
- IntegerWriteChannel startStopChannel = this.channel(MultiRackChannelId.START_STOP);
- try {
- startStopChannel.setNextWriteValue(StartStop.START.getValue());
-// TODO write to all racks unused!!
- for (SingleRack r : racks) {
- IntegerWriteChannel rackUsageChannel = this.channel(RACK_INFO.get(r.getRackNumber()).usageChannelId);
- rackUsageChannel.setNextWriteValue(RackUsage.USED.getValue());
- }
- } catch (OpenemsException e) {
- log.error("Error while trying to start system\n" + e.getMessage());
- }
- }
-
- private void stopSystem() {
-
- IntegerWriteChannel startStopChannel = this.channel(MultiRackChannelId.START_STOP);
- try {
- startStopChannel.setNextWriteValue(StartStop.STOP.getValue());
-// TODO write to all racks unused!!
- for (SingleRack r : racks) {
- IntegerWriteChannel rackUsageChannel = this.channel(RACK_INFO.get(r.getRackNumber()).usageChannelId);
- rackUsageChannel.setNextWriteValue(RackUsage.UNUSED.getValue());
- }
- } catch (OpenemsException e) {
- log.error("Error while trying to stop system\n" + e.getMessage());
- }
- }
-
- public String getModbusBridgeId() {
- return modbusBridgeId;
- }
-
- public State getStateMachineState() {
- return state;
- }
-
- public void setStateMachineState(State state) {
- this.state = state;
- this.channel(MultiRackChannelId.STATE_MACHINE).setNextValue(this.state);
- }
-
- @Override
- protected ModbusProtocol defineModbusProtocol() {
- Collection tasks = new ArrayList<>();
- tasks.addAll(Arrays.asList(new Task[] {
- // -------- control registers of master --------------------------------------
- new FC16WriteRegistersTask(0x1017, m(MultiRackChannelId.START_STOP, new UnsignedWordElement(0x1017)), //
- m(MultiRackChannelId.RACK_1_USAGE, new UnsignedWordElement(0x1018)), //
- m(MultiRackChannelId.RACK_2_USAGE, new UnsignedWordElement(0x1019)), //
- m(MultiRackChannelId.RACK_3_USAGE, new UnsignedWordElement(0x101A)), //
- m(MultiRackChannelId.RACK_4_USAGE, new UnsignedWordElement(0x101B)), //
- m(MultiRackChannelId.RACK_5_USAGE, new UnsignedWordElement(0x101C)) //
- ), //
- new FC3ReadRegistersTask(0x1017, Priority.HIGH,
- m(MultiRackChannelId.START_STOP, new UnsignedWordElement(0x1017)), //
- m(MultiRackChannelId.RACK_1_USAGE, new UnsignedWordElement(0x1018)), //
- m(MultiRackChannelId.RACK_2_USAGE, new UnsignedWordElement(0x1019)), //
- m(MultiRackChannelId.RACK_3_USAGE, new UnsignedWordElement(0x101A)), //
- m(MultiRackChannelId.RACK_4_USAGE, new UnsignedWordElement(0x101B)), //
- m(MultiRackChannelId.RACK_5_USAGE, new UnsignedWordElement(0x101C)) //
- ), //
-
- new FC16WriteRegistersTask(0x101F,
- m(MultiRackChannelId.SYSTEM_INSULATION_LEVEL_1, new UnsignedWordElement(0x101F)), //
- m(MultiRackChannelId.SYSTEM_INSULATION_LEVEL_2, new UnsignedWordElement(0x1020)), //
- new DummyRegisterElement(0x1021), //
- m(MultiRackChannelId.EMS_COMMUNICATION_TIMEOUT, new UnsignedWordElement(0x1022)), //
- m(MultiRackChannelId.EMS_ADDRESS, new UnsignedWordElement(0x1023)) //
- ), //
-
- new FC3ReadRegistersTask(0x101F, Priority.LOW,
- m(MultiRackChannelId.SYSTEM_INSULATION_LEVEL_1, new UnsignedWordElement(0x101F)), //
- m(MultiRackChannelId.SYSTEM_INSULATION_LEVEL_2, new UnsignedWordElement(0x1020)), //
- new DummyRegisterElement(0x1021), //
- m(MultiRackChannelId.EMS_COMMUNICATION_TIMEOUT, new UnsignedWordElement(0x1022)), //
- m(MultiRackChannelId.EMS_ADDRESS, new UnsignedWordElement(0x1023)) //
- ), //
-
- new FC16WriteRegistersTask(ADDRESS_OFFSET_RACK_1 + 10, m(MultiRackChannelId.RACK_1_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_1 + 10)) //
- ), //
- new FC3ReadRegistersTask(ADDRESS_OFFSET_RACK_1 + 10, Priority.LOW,
- m(MultiRackChannelId.RACK_1_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_1 + 10)) //
- ), //
-
- new FC16WriteRegistersTask(ADDRESS_OFFSET_RACK_2 + 10, m(MultiRackChannelId.RACK_2_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_2 + 10)) //
- ), //
- new FC3ReadRegistersTask(ADDRESS_OFFSET_RACK_2 + 10, Priority.LOW,
- m(MultiRackChannelId.RACK_2_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_2 + 10)) //
- ), //
-
- new FC16WriteRegistersTask(ADDRESS_OFFSET_RACK_3 + 10, m(MultiRackChannelId.RACK_2_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_3 + 10)) //
- ), //
- new FC3ReadRegistersTask(ADDRESS_OFFSET_RACK_3 + 10, Priority.LOW,
- m(MultiRackChannelId.RACK_3_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_3 + 10)) //
- ), //
-
- new FC16WriteRegistersTask(ADDRESS_OFFSET_RACK_4 + 10, m(MultiRackChannelId.RACK_4_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_4 + 10)) //
- ), //
- new FC3ReadRegistersTask(ADDRESS_OFFSET_RACK_4 + 10, Priority.LOW,
- m(MultiRackChannelId.RACK_4_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_4 + 10)) //
- ), //
-
- new FC16WriteRegistersTask(ADDRESS_OFFSET_RACK_5 + 10, m(MultiRackChannelId.RACK_5_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_5 + 10)) //
- ), //
- new FC3ReadRegistersTask(ADDRESS_OFFSET_RACK_5 + 10, Priority.LOW,
- m(MultiRackChannelId.RACK_5_POSITIVE_CONTACTOR,
- new UnsignedWordElement(ADDRESS_OFFSET_RACK_5 + 10)) //
- ), //
-
- // -------- state registers of master --------------------------------------
- new FC3ReadRegistersTask(0x1044, Priority.LOW, //
- m(MultiRackChannelId.CHARGE_INDICATION, new UnsignedWordElement(0x1044)), //
- m(MultiRackChannelId.CURRENT, new UnsignedWordElement(0x1045), //
- ElementToChannelConverter.SCALE_FACTOR_2), // TODO Check if scale factor is correct
- new DummyRegisterElement(0x1046), //
- m(Battery.ChannelId.SOC, new UnsignedWordElement(0x1047)), //
- m(MultiRackChannelId.SYSTEM_RUNNING_STATE, new UnsignedWordElement(0x1048)), //
- m(MultiRackChannelId.VOLTAGE, new UnsignedWordElement(0x1049), //
- ElementToChannelConverter.SCALE_FACTOR_2) // TODO Check if scale factor is correct
- ), //
-
- new FC3ReadRegistersTask(0x104A, Priority.HIGH, //
- m(MultiRackChannelId.SYSTEM_INSULATION, new UnsignedWordElement(0x104A)), //
- new DummyRegisterElement(0x104B, 0x104C), //
- m(Battery.ChannelId.CHARGE_MAX_CURRENT, new UnsignedWordElement(0x104D),
- ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(Battery.ChannelId.DISCHARGE_MAX_CURRENT, new UnsignedWordElement(0x104E),
- ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
- ), //
-
- new FC3ReadRegistersTask(0x1081, Priority.LOW, //
- bm(new UnsignedWordElement(0x1081)) //
- .m(MultiRackChannelId.MASTER_ALARM_LEVEL_2_INSULATION, 4) //
- .m(MultiRackChannelId.MASTER_ALARM_LEVEL_1_INSULATION, 3) //
- .m(MultiRackChannelId.MASTER_ALARM_PCS_EMS_CONTROL_FAIL, 2) //
- .m(MultiRackChannelId.MASTER_ALARM_PCS_EMS_COMMUNICATION_FAILURE, 1) //
- .m(MultiRackChannelId.MASTER_ALARM_COMMUNICATION_ERROR_WITH_SUBMASTER, 0) //
- .build(), //
- bm(new UnsignedWordElement(0x1082)) //
- .m(MultiRackChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_5, 4) //
- .m(MultiRackChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_4, 3) //
- .m(MultiRackChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_3, 2) //
- .m(MultiRackChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_2, 1) //
- .m(MultiRackChannelId.SUB_MASTER_COMMUNICATION_FAULT_ALARM_MASTER_1, 0) //
- .build(), //
- bm(new UnsignedWordElement(0x1083)) //
- .m(MultiRackChannelId.RACK_1_LEVEL_2_ALARM, 5) //
- .m(MultiRackChannelId.RACK_1_PCS_CONTROL_FAULT, 4) //
- .m(MultiRackChannelId.RACK_1_COMMUNICATION_WITH_MASTER_ERROR, 3) //
- .m(MultiRackChannelId.RACK_1_DEVICE_ERROR, 2) //
- .m(MultiRackChannelId.RACK_1_CYCLE_OVER_CURRENT, 1) //
- .m(MultiRackChannelId.RACK_1_VOLTAGE_DIFFERENCE, 0) //
- .build(), //
- bm(new UnsignedWordElement(0x1084)) //
- .m(MultiRackChannelId.RACK_2_LEVEL_2_ALARM, 5) //
- .m(MultiRackChannelId.RACK_2_PCS_CONTROL_FAULT, 4) //
- .m(MultiRackChannelId.RACK_2_COMMUNICATION_WITH_MASTER_ERROR, 3) //
- .m(MultiRackChannelId.RACK_2_DEVICE_ERROR, 2) //
- .m(MultiRackChannelId.RACK_2_CYCLE_OVER_CURRENT, 1) //
- .m(MultiRackChannelId.RACK_2_VOLTAGE_DIFFERENCE, 0) //
- .build(), //
- bm(new UnsignedWordElement(0x1085)) //
- .m(MultiRackChannelId.RACK_3_LEVEL_2_ALARM, 5) //
- .m(MultiRackChannelId.RACK_3_PCS_CONTROL_FAULT, 4) //
- .m(MultiRackChannelId.RACK_3_COMMUNICATION_WITH_MASTER_ERROR, 3) //
- .m(MultiRackChannelId.RACK_3_DEVICE_ERROR, 2) //
- .m(MultiRackChannelId.RACK_3_CYCLE_OVER_CURRENT, 1) //
- .m(MultiRackChannelId.RACK_3_VOLTAGE_DIFFERENCE, 0) //
- .build(), //
- bm(new UnsignedWordElement(0x1086)) //
- .m(MultiRackChannelId.RACK_4_LEVEL_2_ALARM, 5) //
- .m(MultiRackChannelId.RACK_4_PCS_CONTROL_FAULT, 4) //
- .m(MultiRackChannelId.RACK_4_COMMUNICATION_WITH_MASTER_ERROR, 3) //
- .m(MultiRackChannelId.RACK_4_DEVICE_ERROR, 2) //
- .m(MultiRackChannelId.RACK_4_CYCLE_OVER_CURRENT, 1) //
- .m(MultiRackChannelId.RACK_4_VOLTAGE_DIFFERENCE, 0) //
- .build(), //
- bm(new UnsignedWordElement(0x1087)) //
- .m(MultiRackChannelId.RACK_5_LEVEL_2_ALARM, 5) //
- .m(MultiRackChannelId.RACK_5_PCS_CONTROL_FAULT, 4) //
- .m(MultiRackChannelId.RACK_5_COMMUNICATION_WITH_MASTER_ERROR, 3) //
- .m(MultiRackChannelId.RACK_5_DEVICE_ERROR, 2) //
- .m(MultiRackChannelId.RACK_5_CYCLE_OVER_CURRENT, 1) //
- .m(MultiRackChannelId.RACK_5_VOLTAGE_DIFFERENCE, 0) //
- .build() //
- ) //
- }));
-
- for (SingleRack rack : this.racks) {
- tasks.addAll(rack.getTasks());
- }
-
- return new ModbusProtocol(this, tasks.toArray(new Task[0]));//
-
- }
-
- protected final AbstractModbusElement> map(io.openems.edge.common.channel.ChannelId channelId,
- AbstractModbusElement> element) {
- return this.m(channelId, element);
- }
-
- protected final AbstractModbusElement> map(io.openems.edge.common.channel.ChannelId channelId,
- AbstractModbusElement> element, ElementToChannelConverter converter) {
- return this.m(channelId, element, converter);
- }
-
- protected final BitChannelMapper map(UnsignedWordElement element) {
- return this.bm(element);
- }
-
- private static Map createRackInfo() {
- Map map = new HashMap();
- map.put(1, new RackInfo(ADDRESS_OFFSET_RACK_1, MultiRackChannelId.RACK_1_USAGE,
- MultiRackChannelId.RACK_1_POSITIVE_CONTACTOR));
- map.put(2, new RackInfo(ADDRESS_OFFSET_RACK_2, MultiRackChannelId.RACK_2_USAGE,
- MultiRackChannelId.RACK_2_POSITIVE_CONTACTOR));
- map.put(3, new RackInfo(ADDRESS_OFFSET_RACK_3, MultiRackChannelId.RACK_3_USAGE,
- MultiRackChannelId.RACK_3_POSITIVE_CONTACTOR));
- map.put(4, new RackInfo(ADDRESS_OFFSET_RACK_4, MultiRackChannelId.RACK_4_USAGE,
- MultiRackChannelId.RACK_4_POSITIVE_CONTACTOR));
- map.put(5, new RackInfo(ADDRESS_OFFSET_RACK_5, MultiRackChannelId.RACK_5_USAGE,
- MultiRackChannelId.RACK_5_POSITIVE_CONTACTOR));
-
- return map;
- }
-
- // Helper class to get infos about connected racks
- private static class RackInfo {
- int addressOffset;
- MultiRackChannelId usageChannelId;
- MultiRackChannelId positiveContactorChannelId;
-
- RackInfo(int addressOffset, MultiRackChannelId usageChannelId, MultiRackChannelId positiveContactorChannelId) {
- this.addressOffset = addressOffset;
- this.usageChannelId = usageChannelId;
- this.positiveContactorChannelId = positiveContactorChannelId;
- }
- }
-}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/State.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/State.java
deleted file mode 100644
index 8cc1c52e086..00000000000
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/State.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package io.openems.edge.battery.soltaro.multirack;
-
-import io.openems.edge.common.channel.OptionsEnum;
-
-public enum State implements OptionsEnum {
-
- UNDEFINED("Undefined", -1), //
- PENDING("Pending", 0), //
- OFF("Off", 1), //
- INIT("Initializing", 2), //
- RUNNING("Running", 3), //
- STOPPING("Stopping", 4), //
- ERROR("Error", 5), //
- ERRORDELAY("Errordelay", 6);
-
- private State(String name, int value) {
- this.name = name;
- this.value = value;
- }
-
- private int value;
- private String name;
-
- @Override
- public int getValue() {
- return this.value;
- }
-
- @Override
- public String getName() {
- return this.name;
- }
-
- @Override
- public OptionsEnum getUndefined() {
- return UNDEFINED;
- }
-
-}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/package-info.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/package-info.java
deleted file mode 100644
index 8e452ced560..00000000000
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/multirack/package-info.java
+++ /dev/null
@@ -1,2 +0,0 @@
-@org.osgi.annotation.versioning.Version("1.0.0")
-package io.openems.edge.battery.soltaro.multirack;
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ChargeIndication.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ChargeIndication.java
similarity index 83%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ChargeIndication.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ChargeIndication.java
index 093e1d5b916..28136a171f2 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ChargeIndication.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ChargeIndication.java
@@ -1,6 +1,6 @@
-package io.openems.edge.battery.soltaro;
+package io.openems.edge.battery.soltaro.single.versiona;
-import io.openems.edge.common.channel.OptionsEnum;
+import io.openems.common.types.OptionsEnum;
public enum ChargeIndication implements OptionsEnum {
UNDEFINED(-1, "Undefined"), //
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/ClusterRunState.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ClusterRunState.java
similarity index 84%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/ClusterRunState.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ClusterRunState.java
index 02d4801d5b6..d32e45aa57b 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/master/ClusterRunState.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ClusterRunState.java
@@ -1,6 +1,6 @@
-package io.openems.edge.battery.soltaro.master;
+package io.openems.edge.battery.soltaro.single.versiona;
-import io.openems.edge.common.channel.OptionsEnum;
+import io.openems.common.types.OptionsEnum;
public enum ClusterRunState implements OptionsEnum {
UNDEFINED(-1, "Undefined"), //
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/Config.java
similarity index 66%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/Config.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/Config.java
index d9c6858b22d..0cfebaf3deb 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/Config.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/Config.java
@@ -1,14 +1,22 @@
-package io.openems.edge.battery.soltaro;
+package io.openems.edge.battery.soltaro.single.versiona;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import io.openems.edge.battery.soltaro.BatteryState;
+
@ObjectClassDefinition( //
- name = "BMS FENECON Soltaro", //
+ name = "BMS Soltaro Single Rack Version A", //
description = "Implements the Soltaro battery rack system.")
@interface Config {
+
+ @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component")
String id() default "bms0";
+ @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID")
+ String alias() default "";
+
+ @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?")
boolean enabled() default true;
@AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus brige.")
@@ -18,7 +26,7 @@
int modbusUnitId() default 1;
@AttributeDefinition(name = "Capacity [Wh]", description = "The capacity of the Battery Rack.")
- int capacity() default 0;
+ int capacity() default 50;
@AttributeDefinition(name = "Battery state", description = "Switches the battery into the given state, if default is used, battery state is set automatically")
BatteryState batteryState() default BatteryState.DEFAULT;
@@ -26,5 +34,5 @@
@AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.")
String Modbus_target() default "";
- String webconsole_configurationFactory_nameHint() default "BMS FENECON Soltaro [{id}]";
+ String webconsole_configurationFactory_nameHint() default "BMS Soltaro Single Rack Version A [{id}]";
}
\ No newline at end of file
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ContactorControl.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ContactorControl.java
similarity index 83%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ContactorControl.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ContactorControl.java
index 6c5df4fccd1..30c0cdb0410 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/ContactorControl.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/ContactorControl.java
@@ -1,6 +1,6 @@
-package io.openems.edge.battery.soltaro;
+package io.openems.edge.battery.soltaro.single.versiona;
-import io.openems.edge.common.channel.OptionsEnum;
+import io.openems.common.types.OptionsEnum;
public enum ContactorControl implements OptionsEnum {
UNDEFINED(-1, "Undefined"), //
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/SoltaroRack.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/SingleRack.java
similarity index 56%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/SoltaroRack.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/SingleRack.java
index 560b9371eaa..f612c46102b 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/SoltaroRack.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versiona/SingleRack.java
@@ -1,4 +1,4 @@
-package io.openems.edge.battery.soltaro;
+package io.openems.edge.battery.soltaro.single.versiona;
import java.time.LocalDateTime;
import java.util.Optional;
@@ -20,23 +20,25 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import io.openems.common.exceptions.OpenemsException;
+import io.openems.common.channel.AccessMode;
+import io.openems.common.channel.Level;
+import io.openems.common.channel.Unit;
+import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
import io.openems.common.types.OpenemsType;
import io.openems.edge.battery.api.Battery;
+import io.openems.edge.battery.soltaro.BatteryState;
import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent;
import io.openems.edge.bridge.modbus.api.BridgeModbus;
import io.openems.edge.bridge.modbus.api.ElementToChannelConverter;
import io.openems.edge.bridge.modbus.api.ModbusProtocol;
+import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
import io.openems.edge.bridge.modbus.api.task.FC3ReadRegistersTask;
import io.openems.edge.bridge.modbus.api.task.FC6WriteRegisterTask;
-import io.openems.edge.common.channel.AccessMode;
import io.openems.edge.common.channel.Doc;
import io.openems.edge.common.channel.EnumReadChannel;
import io.openems.edge.common.channel.EnumWriteChannel;
-import io.openems.edge.common.channel.Level;
-import io.openems.edge.common.channel.Unit;
import io.openems.edge.common.component.OpenemsComponent;
import io.openems.edge.common.event.EdgeEventConstants;
import io.openems.edge.common.modbusslave.ModbusSlave;
@@ -45,19 +47,19 @@
@Designate(ocd = Config.class, factory = true)
@Component( //
- name = "Bms.Fenecon.Soltaro", //
+ name = "Bms.Soltaro.SingleRack.VersionA", //
immediate = true, //
configurationPolicy = ConfigurationPolicy.REQUIRE, //
property = EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE //
)
-public class SoltaroRack extends AbstractOpenemsModbusComponent
+public class SingleRack extends AbstractOpenemsModbusComponent
implements Battery, OpenemsComponent, EventHandler, ModbusSlave {
// Default values for the battery ranges
public static final int DISCHARGE_MIN_V = 696;
public static final int CHARGE_MAX_V = 854;
- public static final int DISCHARGE_MAX_A = 20;
- public static final int CHARGE_MAX_A = 20;
+ public static final int DISCHARGE_MAX_A = 0;
+ public static final int CHARGE_MAX_A = 0;
protected final static int SYSTEM_ON = 1;
protected final static int SYSTEM_OFF = 0;
@@ -65,7 +67,7 @@ public class SoltaroRack extends AbstractOpenemsModbusComponent
private static final int SECURITY_INTERVAL_FOR_COMMANDS_IN_SECONDS = 3;
private static final int MAX_TIME_FOR_INITIALIZATION_IN_SECONDS = 30;
- private final Logger log = LoggerFactory.getLogger(SoltaroRack.class);
+ private final Logger log = LoggerFactory.getLogger(SingleRack.class);
private String modbusBridgeId;
private BatteryState batteryState;
@@ -82,16 +84,16 @@ public class SoltaroRack extends AbstractOpenemsModbusComponent
// sent
private boolean isStopping = false;
- public SoltaroRack() {
+ public SingleRack() {
super(//
OpenemsComponent.ChannelId.values(), //
Battery.ChannelId.values(), //
- SoltaroRack.ChannelId.values() //
+ SingleRack.ChannelId.values() //
);
- this.channel(Battery.ChannelId.CHARGE_MAX_CURRENT).setNextValue(SoltaroRack.CHARGE_MAX_A);
- this.channel(Battery.ChannelId.CHARGE_MAX_VOLTAGE).setNextValue(SoltaroRack.CHARGE_MAX_V);
- this.channel(Battery.ChannelId.DISCHARGE_MAX_CURRENT).setNextValue(SoltaroRack.DISCHARGE_MAX_A);
- this.channel(Battery.ChannelId.DISCHARGE_MIN_VOLTAGE).setNextValue(SoltaroRack.DISCHARGE_MIN_V);
+ this.channel(Battery.ChannelId.CHARGE_MAX_CURRENT).setNextValue(SingleRack.CHARGE_MAX_A);
+ this.channel(Battery.ChannelId.CHARGE_MAX_VOLTAGE).setNextValue(SingleRack.CHARGE_MAX_V);
+ this.channel(Battery.ChannelId.DISCHARGE_MAX_CURRENT).setNextValue(SingleRack.DISCHARGE_MAX_A);
+ this.channel(Battery.ChannelId.DISCHARGE_MIN_VOLTAGE).setNextValue(SingleRack.DISCHARGE_MIN_V);
}
@Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY)
@@ -101,7 +103,7 @@ protected void setModbus(BridgeModbus modbus) {
@Activate
void activate(ComponentContext context, Config config) {
- super.activate(context, config.id(), config.enabled(), config.modbusUnitId(), this.cm, "Modbus",
+ super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, "Modbus",
config.modbus_id());
this.modbusBridgeId = config.modbus_id();
this.batteryState = config.batteryState();
@@ -169,6 +171,8 @@ private void handleBatteryState() {
case ON:
startSystem();
break;
+ case CONFIGURE:
+ log.error("Not possible with version A of the Soltaro batteries!");
}
}
@@ -228,7 +232,7 @@ private void startSystem() {
try {
contactorControlChannel.setNextWriteValue(SYSTEM_ON);
- } catch (OpenemsException e) {
+ } catch (OpenemsNamedException e) {
log.error("Error while trying to start system\n" + e.getMessage());
}
}
@@ -246,7 +250,7 @@ private void stopSystem() {
try {
contactorControlChannel.setNextWriteValue(SYSTEM_OFF);
isStopping = true;
- } catch (OpenemsException e) {
+ } catch (OpenemsNamedException e) {
log.error("Error while trying to stop system\n" + e.getMessage());
}
}
@@ -959,47 +963,47 @@ public Doc doc() {
protected ModbusProtocol defineModbusProtocol() {
return new ModbusProtocol(this, //
new FC6WriteRegisterTask(0x2010, //
- m(SoltaroRack.ChannelId.BMS_CONTACTOR_CONTROL, new UnsignedWordElement(0x2010)) //
+ m(SingleRack.ChannelId.BMS_CONTACTOR_CONTROL, new UnsignedWordElement(0x2010)) //
), //
new FC3ReadRegistersTask(0x2010, Priority.HIGH, //
- m(SoltaroRack.ChannelId.BMS_CONTACTOR_CONTROL, new UnsignedWordElement(0x2010)) //
+ m(SingleRack.ChannelId.BMS_CONTACTOR_CONTROL, new UnsignedWordElement(0x2010)) //
), //
new FC3ReadRegistersTask(0x2042, Priority.HIGH, //
m(Battery.ChannelId.CHARGE_MAX_VOLTAGE, new UnsignedWordElement(0x2042), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
), //
new FC3ReadRegistersTask(0x2046, Priority.HIGH, //
- m(SoltaroRack.ChannelId.CELL_VOLTAGE_PROTECT, new UnsignedWordElement(0x2046)), //
- m(SoltaroRack.ChannelId.CELL_VOLTAGE_RECOVER, new UnsignedWordElement(0x2047)), //
+ m(SingleRack.ChannelId.CELL_VOLTAGE_PROTECT, new UnsignedWordElement(0x2046)), //
+ m(SingleRack.ChannelId.CELL_VOLTAGE_RECOVER, new UnsignedWordElement(0x2047)), //
m(Battery.ChannelId.DISCHARGE_MIN_VOLTAGE, new UnsignedWordElement(0x2048), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
), //
new FC6WriteRegisterTask(0x2046, //
- m(SoltaroRack.ChannelId.CELL_VOLTAGE_PROTECT, new UnsignedWordElement(0x2046)) //
+ m(SingleRack.ChannelId.CELL_VOLTAGE_PROTECT, new UnsignedWordElement(0x2046)) //
), //
new FC6WriteRegisterTask(0x2047, //
- m(SoltaroRack.ChannelId.CELL_VOLTAGE_RECOVER, new UnsignedWordElement(0x2047)) //
+ m(SingleRack.ChannelId.CELL_VOLTAGE_RECOVER, new UnsignedWordElement(0x2047)) //
), //
new FC3ReadRegistersTask(0x2100, Priority.LOW, //
m(Battery.ChannelId.VOLTAGE, new UnsignedWordElement(0x2100), //
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
m(Battery.ChannelId.CURRENT, new UnsignedWordElement(0x2101), //
ElementToChannelConverter.SCALE_FACTOR_2), //
- m(SoltaroRack.ChannelId.CLUSTER_1_CHARGE_INDICATION, new UnsignedWordElement(0x2102)), //
+ m(SingleRack.ChannelId.CLUSTER_1_CHARGE_INDICATION, new UnsignedWordElement(0x2102)), //
m(Battery.ChannelId.SOC, new UnsignedWordElement(0x2103)), //
m(Battery.ChannelId.SOH, new UnsignedWordElement(0x2104)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_MAX_CELL_VOLTAGE_ID, new UnsignedWordElement(0x2105)), //
+ m(SingleRack.ChannelId.CLUSTER_1_MAX_CELL_VOLTAGE_ID, new UnsignedWordElement(0x2105)), //
m(Battery.ChannelId.MAX_CELL_VOLTAGE, new UnsignedWordElement(0x2106)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_MIN_CELL_VOLTAGE_ID, new UnsignedWordElement(0x2107)), //
+ m(SingleRack.ChannelId.CLUSTER_1_MIN_CELL_VOLTAGE_ID, new UnsignedWordElement(0x2107)), //
m(Battery.ChannelId.MIN_CELL_VOLTAGE, new UnsignedWordElement(0x2108)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_MAX_CELL_TEMPERATURE_ID, new UnsignedWordElement(0x2109)), //
+ m(SingleRack.ChannelId.CLUSTER_1_MAX_CELL_TEMPERATURE_ID, new UnsignedWordElement(0x2109)), //
m(Battery.ChannelId.MAX_CELL_TEMPERATURE, new UnsignedWordElement(0x210A),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
- m(SoltaroRack.ChannelId.CLUSTER_1_MIN_CELL_TEMPERATURE_ID, new UnsignedWordElement(0x210B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_MIN_CELL_TEMPERATURE_ID, new UnsignedWordElement(0x210B)), //
m(Battery.ChannelId.MIN_CELL_TEMPERATURE, new UnsignedWordElement(0x210C),
ElementToChannelConverter.SCALE_FACTOR_MINUS_1), //
new DummyRegisterElement(0x210D, 0x2115), //
- m(SoltaroRack.ChannelId.SYSTEM_INSULATION, new UnsignedWordElement(0x2116)) //
+ m(SingleRack.ChannelId.SYSTEM_INSULATION, new UnsignedWordElement(0x2116)) //
), //
new FC3ReadRegistersTask(0x2160, Priority.HIGH, //
m(Battery.ChannelId.CHARGE_MAX_CURRENT, new UnsignedWordElement(0x2160), //
@@ -1008,356 +1012,356 @@ protected ModbusProtocol defineModbusProtocol() {
ElementToChannelConverter.SCALE_FACTOR_MINUS_1) //
), //
new FC3ReadRegistersTask(0x2140, Priority.LOW, //
- bm(new UnsignedWordElement(0x2140)) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_CELL_VOLTAGE_HIGH, 0) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH, 1) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_CHA_CURRENT_HIGH, 2) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_CELL_VOLTAGE_LOW, 3) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW, 4) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_DISCHA_CURRENT_HIGH, 5) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH, 6) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_CELL_CHA_TEMP_LOW, 7) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_INSULATION_LOW, 12) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH, 14) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW, 15) //
- .build(), //
- bm(new UnsignedWordElement(0x2141)) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CELL_VOLTAGE_HIGH, 0) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH, 1) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CHA_CURRENT_HIGH, 2) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CELL_VOLTAGE_LOW, 3) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW, 4) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_DISCHA_CURRENT_HIGH, 5) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH, 6) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CELL_CHA_TEMP_LOW, 7) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_SOC_LOW, 8) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH, 9) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH, 11) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_INSULATION_LOW, 12) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH, 13) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH, 14) //
- .m(SoltaroRack.ChannelId.ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW, 15) //
- .build(), //
- m(SoltaroRack.ChannelId.CLUSTER_RUN_STATE, new UnsignedWordElement(0x2142)) //
+ m(new BitsWordElement(0x2140, this) //
+ .bit(0, SingleRack.ChannelId.ALARM_LEVEL_2_CELL_VOLTAGE_HIGH) //
+ .bit(1, SingleRack.ChannelId.ALARM_LEVEL_2_TOTAL_VOLTAGE_HIGH) //
+ .bit(2, SingleRack.ChannelId.ALARM_LEVEL_2_CHA_CURRENT_HIGH) //
+ .bit(3, SingleRack.ChannelId.ALARM_LEVEL_2_CELL_VOLTAGE_LOW) //
+ .bit(4, SingleRack.ChannelId.ALARM_LEVEL_2_TOTAL_VOLTAGE_LOW) //
+ .bit(5, SingleRack.ChannelId.ALARM_LEVEL_2_DISCHA_CURRENT_HIGH) //
+ .bit(6, SingleRack.ChannelId.ALARM_LEVEL_2_CELL_CHA_TEMP_HIGH) //
+ .bit(7, SingleRack.ChannelId.ALARM_LEVEL_2_CELL_CHA_TEMP_LOW) //
+ .bit(12,SingleRack.ChannelId.ALARM_LEVEL_2_INSULATION_LOW) //
+ .bit(14, SingleRack.ChannelId.ALARM_LEVEL_2_CELL_DISCHA_TEMP_HIGH) //
+ .bit(15, SingleRack.ChannelId.ALARM_LEVEL_2_CELL_DISCHA_TEMP_LOW) //
+ ), //
+ m(new BitsWordElement(0x214, this) //
+ .bit(0, SingleRack.ChannelId.ALARM_LEVEL_1_CELL_VOLTAGE_HIGH) //
+ .bit(1, SingleRack.ChannelId.ALARM_LEVEL_1_TOTAL_VOLTAGE_HIGH) //
+ .bit(2, SingleRack.ChannelId.ALARM_LEVEL_1_CHA_CURRENT_HIGH) //
+ .bit(3, SingleRack.ChannelId.ALARM_LEVEL_1_CELL_VOLTAGE_LOW) //
+ .bit(4, SingleRack.ChannelId.ALARM_LEVEL_1_TOTAL_VOLTAGE_LOW) //
+ .bit(5, SingleRack.ChannelId.ALARM_LEVEL_1_DISCHA_CURRENT_HIGH) //
+ .bit(6, SingleRack.ChannelId.ALARM_LEVEL_1_CELL_CHA_TEMP_HIGH) //
+ .bit(7, SingleRack.ChannelId.ALARM_LEVEL_1_CELL_CHA_TEMP_LOW) //
+ .bit(8, SingleRack.ChannelId.ALARM_LEVEL_1_SOC_LOW) //
+ .bit(9, SingleRack.ChannelId.ALARM_LEVEL_1_CELL_TEMP_DIFF_HIGH) //
+ .bit(11, SingleRack.ChannelId.ALARM_LEVEL_1_CELL_VOLTAGE_DIFF_HIGH) //
+ .bit(12, SingleRack.ChannelId.ALARM_LEVEL_1_INSULATION_LOW) //
+ .bit(13, SingleRack.ChannelId.ALARM_LEVEL_1_TOTAL_VOLTAGE_DIFF_HIGH) //
+ .bit(14, SingleRack.ChannelId.ALARM_LEVEL_1_CELL_DISCHA_TEMP_HIGH) //
+ .bit(15, SingleRack.ChannelId.ALARM_LEVEL_1_CELL_DISCHA_TEMP_LOW) //
+ ), //
+ m(SingleRack.ChannelId.CLUSTER_RUN_STATE, new UnsignedWordElement(0x2142)) //
), //
new FC3ReadRegistersTask(0x2185, Priority.LOW, //
- bm(new UnsignedWordElement(0x2185)) //
- .m(SoltaroRack.ChannelId.FAILURE_SAMPLING_WIRE, 0)//
- .m(SoltaroRack.ChannelId.FAILURE_CONNECTOR_WIRE, 1)//
- .m(SoltaroRack.ChannelId.FAILURE_LTC6803, 2)//
- .m(SoltaroRack.ChannelId.FAILURE_VOLTAGE_SAMPLING, 3)//
- .m(SoltaroRack.ChannelId.FAILURE_TEMP_SAMPLING, 4)//
- .m(SoltaroRack.ChannelId.FAILURE_TEMP_SENSOR, 5)//
- .m(SoltaroRack.ChannelId.FAILURE_BALANCING_MODULE, 8)//
- .m(SoltaroRack.ChannelId.FAILURE_TEMP_SAMPLING_LINE, 9)//
- .m(SoltaroRack.ChannelId.FAILURE_INTRANET_COMMUNICATION, 10)//
- .m(SoltaroRack.ChannelId.FAILURE_EEPROM, 11)//
- .m(SoltaroRack.ChannelId.FAILURE_INITIALIZATION, 12)//
- .build() //
+ m(new BitsWordElement(0x2185, this) //
+ .bit(0, SingleRack.ChannelId.FAILURE_SAMPLING_WIRE)//
+ .bit(1, SingleRack.ChannelId.FAILURE_CONNECTOR_WIRE)//
+ .bit(2, SingleRack.ChannelId.FAILURE_LTC6803)//
+ .bit(3, SingleRack.ChannelId.FAILURE_VOLTAGE_SAMPLING)//
+ .bit(4, SingleRack.ChannelId.FAILURE_TEMP_SAMPLING)//
+ .bit(5, SingleRack.ChannelId.FAILURE_TEMP_SENSOR)//
+ .bit(8, SingleRack.ChannelId.FAILURE_BALANCING_MODULE)//
+ .bit(9, SingleRack.ChannelId.FAILURE_TEMP_SAMPLING_LINE)//
+ .bit(10, SingleRack.ChannelId.FAILURE_INTRANET_COMMUNICATION)//
+ .bit(11, SingleRack.ChannelId.FAILURE_EEPROM)//
+ .bit(12, SingleRack.ChannelId.FAILURE_INITIALIZATION)//
+ ) //
), //
new FC3ReadRegistersTask(0x2800, Priority.LOW, //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_000_VOLTAGE, new UnsignedWordElement(0x2800)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_001_VOLTAGE, new UnsignedWordElement(0x2801)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_002_VOLTAGE, new UnsignedWordElement(0x2802)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_003_VOLTAGE, new UnsignedWordElement(0x2803)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_004_VOLTAGE, new UnsignedWordElement(0x2804)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_005_VOLTAGE, new UnsignedWordElement(0x2805)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_006_VOLTAGE, new UnsignedWordElement(0x2806)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_007_VOLTAGE, new UnsignedWordElement(0x2807)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_008_VOLTAGE, new UnsignedWordElement(0x2808)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_009_VOLTAGE, new UnsignedWordElement(0x2809)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_010_VOLTAGE, new UnsignedWordElement(0x280A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_011_VOLTAGE, new UnsignedWordElement(0x280B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_012_VOLTAGE, new UnsignedWordElement(0x280C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_013_VOLTAGE, new UnsignedWordElement(0x280D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_014_VOLTAGE, new UnsignedWordElement(0x280E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_015_VOLTAGE, new UnsignedWordElement(0x280F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_016_VOLTAGE, new UnsignedWordElement(0x2810)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_017_VOLTAGE, new UnsignedWordElement(0x2811)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_018_VOLTAGE, new UnsignedWordElement(0x2812)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_019_VOLTAGE, new UnsignedWordElement(0x2813)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_020_VOLTAGE, new UnsignedWordElement(0x2814)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_021_VOLTAGE, new UnsignedWordElement(0x2815)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_022_VOLTAGE, new UnsignedWordElement(0x2816)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_023_VOLTAGE, new UnsignedWordElement(0x2817)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_024_VOLTAGE, new UnsignedWordElement(0x2818)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_025_VOLTAGE, new UnsignedWordElement(0x2819)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_026_VOLTAGE, new UnsignedWordElement(0x281A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_027_VOLTAGE, new UnsignedWordElement(0x281B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_028_VOLTAGE, new UnsignedWordElement(0x281C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_029_VOLTAGE, new UnsignedWordElement(0x281D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_030_VOLTAGE, new UnsignedWordElement(0x281E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_031_VOLTAGE, new UnsignedWordElement(0x281F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_032_VOLTAGE, new UnsignedWordElement(0x2820)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_033_VOLTAGE, new UnsignedWordElement(0x2821)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_034_VOLTAGE, new UnsignedWordElement(0x2822)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_035_VOLTAGE, new UnsignedWordElement(0x2823)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_036_VOLTAGE, new UnsignedWordElement(0x2824)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_037_VOLTAGE, new UnsignedWordElement(0x2825)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_038_VOLTAGE, new UnsignedWordElement(0x2826)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_039_VOLTAGE, new UnsignedWordElement(0x2827)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_040_VOLTAGE, new UnsignedWordElement(0x2828)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_041_VOLTAGE, new UnsignedWordElement(0x2829)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_042_VOLTAGE, new UnsignedWordElement(0x282A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_043_VOLTAGE, new UnsignedWordElement(0x282B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_044_VOLTAGE, new UnsignedWordElement(0x282C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_045_VOLTAGE, new UnsignedWordElement(0x282D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_046_VOLTAGE, new UnsignedWordElement(0x282E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_047_VOLTAGE, new UnsignedWordElement(0x282F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_048_VOLTAGE, new UnsignedWordElement(0x2830)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_049_VOLTAGE, new UnsignedWordElement(0x2831)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_050_VOLTAGE, new UnsignedWordElement(0x2832)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_051_VOLTAGE, new UnsignedWordElement(0x2833)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_052_VOLTAGE, new UnsignedWordElement(0x2834)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_053_VOLTAGE, new UnsignedWordElement(0x2835)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_054_VOLTAGE, new UnsignedWordElement(0x2836)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_055_VOLTAGE, new UnsignedWordElement(0x2837)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_056_VOLTAGE, new UnsignedWordElement(0x2838)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_057_VOLTAGE, new UnsignedWordElement(0x2839)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_058_VOLTAGE, new UnsignedWordElement(0x283A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_059_VOLTAGE, new UnsignedWordElement(0x283B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_060_VOLTAGE, new UnsignedWordElement(0x283C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_061_VOLTAGE, new UnsignedWordElement(0x283D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_062_VOLTAGE, new UnsignedWordElement(0x283E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_063_VOLTAGE, new UnsignedWordElement(0x283F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_064_VOLTAGE, new UnsignedWordElement(0x2840)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_065_VOLTAGE, new UnsignedWordElement(0x2841)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_066_VOLTAGE, new UnsignedWordElement(0x2842)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_067_VOLTAGE, new UnsignedWordElement(0x2843)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_068_VOLTAGE, new UnsignedWordElement(0x2844)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_069_VOLTAGE, new UnsignedWordElement(0x2845)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_070_VOLTAGE, new UnsignedWordElement(0x2846)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_071_VOLTAGE, new UnsignedWordElement(0x2847)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_072_VOLTAGE, new UnsignedWordElement(0x2848)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_073_VOLTAGE, new UnsignedWordElement(0x2849)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_074_VOLTAGE, new UnsignedWordElement(0x284A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_075_VOLTAGE, new UnsignedWordElement(0x284B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_076_VOLTAGE, new UnsignedWordElement(0x284C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_077_VOLTAGE, new UnsignedWordElement(0x284D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_078_VOLTAGE, new UnsignedWordElement(0x284E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_079_VOLTAGE, new UnsignedWordElement(0x284F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_080_VOLTAGE, new UnsignedWordElement(0x2850)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_081_VOLTAGE, new UnsignedWordElement(0x2851)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_082_VOLTAGE, new UnsignedWordElement(0x2852)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_083_VOLTAGE, new UnsignedWordElement(0x2853)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_084_VOLTAGE, new UnsignedWordElement(0x2854)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_085_VOLTAGE, new UnsignedWordElement(0x2855)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_086_VOLTAGE, new UnsignedWordElement(0x2856)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_087_VOLTAGE, new UnsignedWordElement(0x2857)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_088_VOLTAGE, new UnsignedWordElement(0x2858)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_089_VOLTAGE, new UnsignedWordElement(0x2859)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_090_VOLTAGE, new UnsignedWordElement(0x285A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_091_VOLTAGE, new UnsignedWordElement(0x285B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_092_VOLTAGE, new UnsignedWordElement(0x285C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_093_VOLTAGE, new UnsignedWordElement(0x285D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_094_VOLTAGE, new UnsignedWordElement(0x285E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_095_VOLTAGE, new UnsignedWordElement(0x285F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_096_VOLTAGE, new UnsignedWordElement(0x2860)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_097_VOLTAGE, new UnsignedWordElement(0x2861)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_098_VOLTAGE, new UnsignedWordElement(0x2862)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_099_VOLTAGE, new UnsignedWordElement(0x2863)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_100_VOLTAGE, new UnsignedWordElement(0x2864)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_101_VOLTAGE, new UnsignedWordElement(0x2865)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_102_VOLTAGE, new UnsignedWordElement(0x2866)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_103_VOLTAGE, new UnsignedWordElement(0x2867)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_104_VOLTAGE, new UnsignedWordElement(0x2868)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_105_VOLTAGE, new UnsignedWordElement(0x2869)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_106_VOLTAGE, new UnsignedWordElement(0x286A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_107_VOLTAGE, new UnsignedWordElement(0x286B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_108_VOLTAGE, new UnsignedWordElement(0x286C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_109_VOLTAGE, new UnsignedWordElement(0x286D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_110_VOLTAGE, new UnsignedWordElement(0x286E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_111_VOLTAGE, new UnsignedWordElement(0x286F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_112_VOLTAGE, new UnsignedWordElement(0x2870)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_113_VOLTAGE, new UnsignedWordElement(0x2871)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_114_VOLTAGE, new UnsignedWordElement(0x2872)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_115_VOLTAGE, new UnsignedWordElement(0x2873)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_116_VOLTAGE, new UnsignedWordElement(0x2874)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_117_VOLTAGE, new UnsignedWordElement(0x2875)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_118_VOLTAGE, new UnsignedWordElement(0x2876)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_119_VOLTAGE, new UnsignedWordElement(0x2877)) //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_000_VOLTAGE, new UnsignedWordElement(0x2800)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_001_VOLTAGE, new UnsignedWordElement(0x2801)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_002_VOLTAGE, new UnsignedWordElement(0x2802)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_003_VOLTAGE, new UnsignedWordElement(0x2803)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_004_VOLTAGE, new UnsignedWordElement(0x2804)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_005_VOLTAGE, new UnsignedWordElement(0x2805)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_006_VOLTAGE, new UnsignedWordElement(0x2806)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_007_VOLTAGE, new UnsignedWordElement(0x2807)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_008_VOLTAGE, new UnsignedWordElement(0x2808)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_009_VOLTAGE, new UnsignedWordElement(0x2809)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_010_VOLTAGE, new UnsignedWordElement(0x280A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_011_VOLTAGE, new UnsignedWordElement(0x280B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_012_VOLTAGE, new UnsignedWordElement(0x280C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_013_VOLTAGE, new UnsignedWordElement(0x280D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_014_VOLTAGE, new UnsignedWordElement(0x280E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_015_VOLTAGE, new UnsignedWordElement(0x280F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_016_VOLTAGE, new UnsignedWordElement(0x2810)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_017_VOLTAGE, new UnsignedWordElement(0x2811)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_018_VOLTAGE, new UnsignedWordElement(0x2812)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_019_VOLTAGE, new UnsignedWordElement(0x2813)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_020_VOLTAGE, new UnsignedWordElement(0x2814)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_021_VOLTAGE, new UnsignedWordElement(0x2815)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_022_VOLTAGE, new UnsignedWordElement(0x2816)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_023_VOLTAGE, new UnsignedWordElement(0x2817)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_024_VOLTAGE, new UnsignedWordElement(0x2818)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_025_VOLTAGE, new UnsignedWordElement(0x2819)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_026_VOLTAGE, new UnsignedWordElement(0x281A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_027_VOLTAGE, new UnsignedWordElement(0x281B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_028_VOLTAGE, new UnsignedWordElement(0x281C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_029_VOLTAGE, new UnsignedWordElement(0x281D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_030_VOLTAGE, new UnsignedWordElement(0x281E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_031_VOLTAGE, new UnsignedWordElement(0x281F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_032_VOLTAGE, new UnsignedWordElement(0x2820)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_033_VOLTAGE, new UnsignedWordElement(0x2821)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_034_VOLTAGE, new UnsignedWordElement(0x2822)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_035_VOLTAGE, new UnsignedWordElement(0x2823)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_036_VOLTAGE, new UnsignedWordElement(0x2824)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_037_VOLTAGE, new UnsignedWordElement(0x2825)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_038_VOLTAGE, new UnsignedWordElement(0x2826)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_039_VOLTAGE, new UnsignedWordElement(0x2827)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_040_VOLTAGE, new UnsignedWordElement(0x2828)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_041_VOLTAGE, new UnsignedWordElement(0x2829)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_042_VOLTAGE, new UnsignedWordElement(0x282A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_043_VOLTAGE, new UnsignedWordElement(0x282B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_044_VOLTAGE, new UnsignedWordElement(0x282C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_045_VOLTAGE, new UnsignedWordElement(0x282D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_046_VOLTAGE, new UnsignedWordElement(0x282E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_047_VOLTAGE, new UnsignedWordElement(0x282F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_048_VOLTAGE, new UnsignedWordElement(0x2830)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_049_VOLTAGE, new UnsignedWordElement(0x2831)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_050_VOLTAGE, new UnsignedWordElement(0x2832)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_051_VOLTAGE, new UnsignedWordElement(0x2833)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_052_VOLTAGE, new UnsignedWordElement(0x2834)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_053_VOLTAGE, new UnsignedWordElement(0x2835)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_054_VOLTAGE, new UnsignedWordElement(0x2836)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_055_VOLTAGE, new UnsignedWordElement(0x2837)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_056_VOLTAGE, new UnsignedWordElement(0x2838)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_057_VOLTAGE, new UnsignedWordElement(0x2839)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_058_VOLTAGE, new UnsignedWordElement(0x283A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_059_VOLTAGE, new UnsignedWordElement(0x283B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_060_VOLTAGE, new UnsignedWordElement(0x283C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_061_VOLTAGE, new UnsignedWordElement(0x283D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_062_VOLTAGE, new UnsignedWordElement(0x283E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_063_VOLTAGE, new UnsignedWordElement(0x283F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_064_VOLTAGE, new UnsignedWordElement(0x2840)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_065_VOLTAGE, new UnsignedWordElement(0x2841)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_066_VOLTAGE, new UnsignedWordElement(0x2842)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_067_VOLTAGE, new UnsignedWordElement(0x2843)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_068_VOLTAGE, new UnsignedWordElement(0x2844)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_069_VOLTAGE, new UnsignedWordElement(0x2845)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_070_VOLTAGE, new UnsignedWordElement(0x2846)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_071_VOLTAGE, new UnsignedWordElement(0x2847)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_072_VOLTAGE, new UnsignedWordElement(0x2848)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_073_VOLTAGE, new UnsignedWordElement(0x2849)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_074_VOLTAGE, new UnsignedWordElement(0x284A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_075_VOLTAGE, new UnsignedWordElement(0x284B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_076_VOLTAGE, new UnsignedWordElement(0x284C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_077_VOLTAGE, new UnsignedWordElement(0x284D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_078_VOLTAGE, new UnsignedWordElement(0x284E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_079_VOLTAGE, new UnsignedWordElement(0x284F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_080_VOLTAGE, new UnsignedWordElement(0x2850)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_081_VOLTAGE, new UnsignedWordElement(0x2851)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_082_VOLTAGE, new UnsignedWordElement(0x2852)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_083_VOLTAGE, new UnsignedWordElement(0x2853)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_084_VOLTAGE, new UnsignedWordElement(0x2854)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_085_VOLTAGE, new UnsignedWordElement(0x2855)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_086_VOLTAGE, new UnsignedWordElement(0x2856)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_087_VOLTAGE, new UnsignedWordElement(0x2857)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_088_VOLTAGE, new UnsignedWordElement(0x2858)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_089_VOLTAGE, new UnsignedWordElement(0x2859)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_090_VOLTAGE, new UnsignedWordElement(0x285A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_091_VOLTAGE, new UnsignedWordElement(0x285B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_092_VOLTAGE, new UnsignedWordElement(0x285C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_093_VOLTAGE, new UnsignedWordElement(0x285D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_094_VOLTAGE, new UnsignedWordElement(0x285E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_095_VOLTAGE, new UnsignedWordElement(0x285F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_096_VOLTAGE, new UnsignedWordElement(0x2860)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_097_VOLTAGE, new UnsignedWordElement(0x2861)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_098_VOLTAGE, new UnsignedWordElement(0x2862)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_099_VOLTAGE, new UnsignedWordElement(0x2863)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_100_VOLTAGE, new UnsignedWordElement(0x2864)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_101_VOLTAGE, new UnsignedWordElement(0x2865)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_102_VOLTAGE, new UnsignedWordElement(0x2866)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_103_VOLTAGE, new UnsignedWordElement(0x2867)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_104_VOLTAGE, new UnsignedWordElement(0x2868)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_105_VOLTAGE, new UnsignedWordElement(0x2869)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_106_VOLTAGE, new UnsignedWordElement(0x286A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_107_VOLTAGE, new UnsignedWordElement(0x286B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_108_VOLTAGE, new UnsignedWordElement(0x286C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_109_VOLTAGE, new UnsignedWordElement(0x286D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_110_VOLTAGE, new UnsignedWordElement(0x286E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_111_VOLTAGE, new UnsignedWordElement(0x286F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_112_VOLTAGE, new UnsignedWordElement(0x2870)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_113_VOLTAGE, new UnsignedWordElement(0x2871)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_114_VOLTAGE, new UnsignedWordElement(0x2872)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_115_VOLTAGE, new UnsignedWordElement(0x2873)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_116_VOLTAGE, new UnsignedWordElement(0x2874)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_117_VOLTAGE, new UnsignedWordElement(0x2875)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_118_VOLTAGE, new UnsignedWordElement(0x2876)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_119_VOLTAGE, new UnsignedWordElement(0x2877)) //
), //
new FC3ReadRegistersTask(0x2878, Priority.LOW, //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_120_VOLTAGE, new UnsignedWordElement(0x2878)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_121_VOLTAGE, new UnsignedWordElement(0x2879)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_122_VOLTAGE, new UnsignedWordElement(0x287A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_123_VOLTAGE, new UnsignedWordElement(0x287B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_124_VOLTAGE, new UnsignedWordElement(0x287C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_125_VOLTAGE, new UnsignedWordElement(0x287D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_126_VOLTAGE, new UnsignedWordElement(0x287E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_127_VOLTAGE, new UnsignedWordElement(0x287F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_128_VOLTAGE, new UnsignedWordElement(0x2880)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_129_VOLTAGE, new UnsignedWordElement(0x2881)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_130_VOLTAGE, new UnsignedWordElement(0x2882)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_131_VOLTAGE, new UnsignedWordElement(0x2883)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_132_VOLTAGE, new UnsignedWordElement(0x2884)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_133_VOLTAGE, new UnsignedWordElement(0x2885)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_134_VOLTAGE, new UnsignedWordElement(0x2886)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_135_VOLTAGE, new UnsignedWordElement(0x2887)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_136_VOLTAGE, new UnsignedWordElement(0x2888)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_137_VOLTAGE, new UnsignedWordElement(0x2889)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_138_VOLTAGE, new UnsignedWordElement(0x288A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_139_VOLTAGE, new UnsignedWordElement(0x288B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_140_VOLTAGE, new UnsignedWordElement(0x288C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_141_VOLTAGE, new UnsignedWordElement(0x288D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_142_VOLTAGE, new UnsignedWordElement(0x288E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_143_VOLTAGE, new UnsignedWordElement(0x288F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_144_VOLTAGE, new UnsignedWordElement(0x2890)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_145_VOLTAGE, new UnsignedWordElement(0x2891)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_146_VOLTAGE, new UnsignedWordElement(0x2892)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_147_VOLTAGE, new UnsignedWordElement(0x2893)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_148_VOLTAGE, new UnsignedWordElement(0x2894)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_149_VOLTAGE, new UnsignedWordElement(0x2895)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_150_VOLTAGE, new UnsignedWordElement(0x2896)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_151_VOLTAGE, new UnsignedWordElement(0x2897)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_152_VOLTAGE, new UnsignedWordElement(0x2898)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_153_VOLTAGE, new UnsignedWordElement(0x2899)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_154_VOLTAGE, new UnsignedWordElement(0x289A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_155_VOLTAGE, new UnsignedWordElement(0x289B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_156_VOLTAGE, new UnsignedWordElement(0x289C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_157_VOLTAGE, new UnsignedWordElement(0x289D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_158_VOLTAGE, new UnsignedWordElement(0x289E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_159_VOLTAGE, new UnsignedWordElement(0x289F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_160_VOLTAGE, new UnsignedWordElement(0x28A0)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_161_VOLTAGE, new UnsignedWordElement(0x28A1)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_162_VOLTAGE, new UnsignedWordElement(0x28A2)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_163_VOLTAGE, new UnsignedWordElement(0x28A3)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_164_VOLTAGE, new UnsignedWordElement(0x28A4)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_165_VOLTAGE, new UnsignedWordElement(0x28A5)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_166_VOLTAGE, new UnsignedWordElement(0x28A6)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_167_VOLTAGE, new UnsignedWordElement(0x28A7)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_168_VOLTAGE, new UnsignedWordElement(0x28A8)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_169_VOLTAGE, new UnsignedWordElement(0x28A9)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_170_VOLTAGE, new UnsignedWordElement(0x28AA)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_171_VOLTAGE, new UnsignedWordElement(0x28AB)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_172_VOLTAGE, new UnsignedWordElement(0x28AC)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_173_VOLTAGE, new UnsignedWordElement(0x28AD)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_174_VOLTAGE, new UnsignedWordElement(0x28AE)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_175_VOLTAGE, new UnsignedWordElement(0x28AF)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_176_VOLTAGE, new UnsignedWordElement(0x28B0)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_177_VOLTAGE, new UnsignedWordElement(0x28B1)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_178_VOLTAGE, new UnsignedWordElement(0x28B2)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_179_VOLTAGE, new UnsignedWordElement(0x28B3)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_180_VOLTAGE, new UnsignedWordElement(0x28B4)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_181_VOLTAGE, new UnsignedWordElement(0x28B5)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_182_VOLTAGE, new UnsignedWordElement(0x28B6)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_183_VOLTAGE, new UnsignedWordElement(0x28B7)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_184_VOLTAGE, new UnsignedWordElement(0x28B8)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_185_VOLTAGE, new UnsignedWordElement(0x28B9)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_186_VOLTAGE, new UnsignedWordElement(0x28BA)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_187_VOLTAGE, new UnsignedWordElement(0x28BB)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_188_VOLTAGE, new UnsignedWordElement(0x28BC)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_189_VOLTAGE, new UnsignedWordElement(0x28BD)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_190_VOLTAGE, new UnsignedWordElement(0x28BE)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_191_VOLTAGE, new UnsignedWordElement(0x28BF)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_192_VOLTAGE, new UnsignedWordElement(0x28C0)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_193_VOLTAGE, new UnsignedWordElement(0x28C1)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_194_VOLTAGE, new UnsignedWordElement(0x28C2)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_195_VOLTAGE, new UnsignedWordElement(0x28C3)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_196_VOLTAGE, new UnsignedWordElement(0x28C4)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_197_VOLTAGE, new UnsignedWordElement(0x28C5)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_198_VOLTAGE, new UnsignedWordElement(0x28C6)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_199_VOLTAGE, new UnsignedWordElement(0x28C7)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_200_VOLTAGE, new UnsignedWordElement(0x28C8)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_201_VOLTAGE, new UnsignedWordElement(0x28C9)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_202_VOLTAGE, new UnsignedWordElement(0x28CA)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_203_VOLTAGE, new UnsignedWordElement(0x28CB)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_204_VOLTAGE, new UnsignedWordElement(0x28CC)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_205_VOLTAGE, new UnsignedWordElement(0x28CD)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_206_VOLTAGE, new UnsignedWordElement(0x28CE)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_207_VOLTAGE, new UnsignedWordElement(0x28CF)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_208_VOLTAGE, new UnsignedWordElement(0x28D0)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_209_VOLTAGE, new UnsignedWordElement(0x28D1)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_210_VOLTAGE, new UnsignedWordElement(0x28D2)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_211_VOLTAGE, new UnsignedWordElement(0x28D3)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_212_VOLTAGE, new UnsignedWordElement(0x28D4)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_213_VOLTAGE, new UnsignedWordElement(0x28D5)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_214_VOLTAGE, new UnsignedWordElement(0x28D6)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_215_VOLTAGE, new UnsignedWordElement(0x28D7)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_216_VOLTAGE, new UnsignedWordElement(0x28D8)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_217_VOLTAGE, new UnsignedWordElement(0x28D9)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_218_VOLTAGE, new UnsignedWordElement(0x28DA)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_219_VOLTAGE, new UnsignedWordElement(0x28DB)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_220_VOLTAGE, new UnsignedWordElement(0x28DC)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_221_VOLTAGE, new UnsignedWordElement(0x28DD)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_222_VOLTAGE, new UnsignedWordElement(0x28DE)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_223_VOLTAGE, new UnsignedWordElement(0x28DF)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_224_VOLTAGE, new UnsignedWordElement(0x28E0)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_225_VOLTAGE, new UnsignedWordElement(0x28E1)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_226_VOLTAGE, new UnsignedWordElement(0x28E2)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_227_VOLTAGE, new UnsignedWordElement(0x28E3)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_228_VOLTAGE, new UnsignedWordElement(0x28E4)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_229_VOLTAGE, new UnsignedWordElement(0x28E5)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_230_VOLTAGE, new UnsignedWordElement(0x28E6)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_231_VOLTAGE, new UnsignedWordElement(0x28E7)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_232_VOLTAGE, new UnsignedWordElement(0x28E8)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_233_VOLTAGE, new UnsignedWordElement(0x28E9)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_234_VOLTAGE, new UnsignedWordElement(0x28EA)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_235_VOLTAGE, new UnsignedWordElement(0x28EB)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_236_VOLTAGE, new UnsignedWordElement(0x28EC)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_237_VOLTAGE, new UnsignedWordElement(0x28ED)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_238_VOLTAGE, new UnsignedWordElement(0x28EE)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_239_VOLTAGE, new UnsignedWordElement(0x28EF)) //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_120_VOLTAGE, new UnsignedWordElement(0x2878)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_121_VOLTAGE, new UnsignedWordElement(0x2879)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_122_VOLTAGE, new UnsignedWordElement(0x287A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_123_VOLTAGE, new UnsignedWordElement(0x287B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_124_VOLTAGE, new UnsignedWordElement(0x287C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_125_VOLTAGE, new UnsignedWordElement(0x287D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_126_VOLTAGE, new UnsignedWordElement(0x287E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_127_VOLTAGE, new UnsignedWordElement(0x287F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_128_VOLTAGE, new UnsignedWordElement(0x2880)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_129_VOLTAGE, new UnsignedWordElement(0x2881)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_130_VOLTAGE, new UnsignedWordElement(0x2882)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_131_VOLTAGE, new UnsignedWordElement(0x2883)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_132_VOLTAGE, new UnsignedWordElement(0x2884)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_133_VOLTAGE, new UnsignedWordElement(0x2885)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_134_VOLTAGE, new UnsignedWordElement(0x2886)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_135_VOLTAGE, new UnsignedWordElement(0x2887)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_136_VOLTAGE, new UnsignedWordElement(0x2888)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_137_VOLTAGE, new UnsignedWordElement(0x2889)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_138_VOLTAGE, new UnsignedWordElement(0x288A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_139_VOLTAGE, new UnsignedWordElement(0x288B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_140_VOLTAGE, new UnsignedWordElement(0x288C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_141_VOLTAGE, new UnsignedWordElement(0x288D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_142_VOLTAGE, new UnsignedWordElement(0x288E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_143_VOLTAGE, new UnsignedWordElement(0x288F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_144_VOLTAGE, new UnsignedWordElement(0x2890)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_145_VOLTAGE, new UnsignedWordElement(0x2891)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_146_VOLTAGE, new UnsignedWordElement(0x2892)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_147_VOLTAGE, new UnsignedWordElement(0x2893)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_148_VOLTAGE, new UnsignedWordElement(0x2894)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_149_VOLTAGE, new UnsignedWordElement(0x2895)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_150_VOLTAGE, new UnsignedWordElement(0x2896)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_151_VOLTAGE, new UnsignedWordElement(0x2897)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_152_VOLTAGE, new UnsignedWordElement(0x2898)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_153_VOLTAGE, new UnsignedWordElement(0x2899)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_154_VOLTAGE, new UnsignedWordElement(0x289A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_155_VOLTAGE, new UnsignedWordElement(0x289B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_156_VOLTAGE, new UnsignedWordElement(0x289C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_157_VOLTAGE, new UnsignedWordElement(0x289D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_158_VOLTAGE, new UnsignedWordElement(0x289E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_159_VOLTAGE, new UnsignedWordElement(0x289F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_160_VOLTAGE, new UnsignedWordElement(0x28A0)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_161_VOLTAGE, new UnsignedWordElement(0x28A1)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_162_VOLTAGE, new UnsignedWordElement(0x28A2)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_163_VOLTAGE, new UnsignedWordElement(0x28A3)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_164_VOLTAGE, new UnsignedWordElement(0x28A4)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_165_VOLTAGE, new UnsignedWordElement(0x28A5)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_166_VOLTAGE, new UnsignedWordElement(0x28A6)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_167_VOLTAGE, new UnsignedWordElement(0x28A7)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_168_VOLTAGE, new UnsignedWordElement(0x28A8)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_169_VOLTAGE, new UnsignedWordElement(0x28A9)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_170_VOLTAGE, new UnsignedWordElement(0x28AA)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_171_VOLTAGE, new UnsignedWordElement(0x28AB)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_172_VOLTAGE, new UnsignedWordElement(0x28AC)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_173_VOLTAGE, new UnsignedWordElement(0x28AD)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_174_VOLTAGE, new UnsignedWordElement(0x28AE)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_175_VOLTAGE, new UnsignedWordElement(0x28AF)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_176_VOLTAGE, new UnsignedWordElement(0x28B0)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_177_VOLTAGE, new UnsignedWordElement(0x28B1)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_178_VOLTAGE, new UnsignedWordElement(0x28B2)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_179_VOLTAGE, new UnsignedWordElement(0x28B3)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_180_VOLTAGE, new UnsignedWordElement(0x28B4)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_181_VOLTAGE, new UnsignedWordElement(0x28B5)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_182_VOLTAGE, new UnsignedWordElement(0x28B6)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_183_VOLTAGE, new UnsignedWordElement(0x28B7)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_184_VOLTAGE, new UnsignedWordElement(0x28B8)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_185_VOLTAGE, new UnsignedWordElement(0x28B9)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_186_VOLTAGE, new UnsignedWordElement(0x28BA)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_187_VOLTAGE, new UnsignedWordElement(0x28BB)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_188_VOLTAGE, new UnsignedWordElement(0x28BC)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_189_VOLTAGE, new UnsignedWordElement(0x28BD)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_190_VOLTAGE, new UnsignedWordElement(0x28BE)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_191_VOLTAGE, new UnsignedWordElement(0x28BF)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_192_VOLTAGE, new UnsignedWordElement(0x28C0)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_193_VOLTAGE, new UnsignedWordElement(0x28C1)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_194_VOLTAGE, new UnsignedWordElement(0x28C2)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_195_VOLTAGE, new UnsignedWordElement(0x28C3)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_196_VOLTAGE, new UnsignedWordElement(0x28C4)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_197_VOLTAGE, new UnsignedWordElement(0x28C5)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_198_VOLTAGE, new UnsignedWordElement(0x28C6)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_199_VOLTAGE, new UnsignedWordElement(0x28C7)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_200_VOLTAGE, new UnsignedWordElement(0x28C8)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_201_VOLTAGE, new UnsignedWordElement(0x28C9)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_202_VOLTAGE, new UnsignedWordElement(0x28CA)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_203_VOLTAGE, new UnsignedWordElement(0x28CB)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_204_VOLTAGE, new UnsignedWordElement(0x28CC)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_205_VOLTAGE, new UnsignedWordElement(0x28CD)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_206_VOLTAGE, new UnsignedWordElement(0x28CE)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_207_VOLTAGE, new UnsignedWordElement(0x28CF)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_208_VOLTAGE, new UnsignedWordElement(0x28D0)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_209_VOLTAGE, new UnsignedWordElement(0x28D1)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_210_VOLTAGE, new UnsignedWordElement(0x28D2)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_211_VOLTAGE, new UnsignedWordElement(0x28D3)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_212_VOLTAGE, new UnsignedWordElement(0x28D4)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_213_VOLTAGE, new UnsignedWordElement(0x28D5)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_214_VOLTAGE, new UnsignedWordElement(0x28D6)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_215_VOLTAGE, new UnsignedWordElement(0x28D7)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_216_VOLTAGE, new UnsignedWordElement(0x28D8)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_217_VOLTAGE, new UnsignedWordElement(0x28D9)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_218_VOLTAGE, new UnsignedWordElement(0x28DA)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_219_VOLTAGE, new UnsignedWordElement(0x28DB)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_220_VOLTAGE, new UnsignedWordElement(0x28DC)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_221_VOLTAGE, new UnsignedWordElement(0x28DD)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_222_VOLTAGE, new UnsignedWordElement(0x28DE)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_223_VOLTAGE, new UnsignedWordElement(0x28DF)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_224_VOLTAGE, new UnsignedWordElement(0x28E0)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_225_VOLTAGE, new UnsignedWordElement(0x28E1)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_226_VOLTAGE, new UnsignedWordElement(0x28E2)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_227_VOLTAGE, new UnsignedWordElement(0x28E3)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_228_VOLTAGE, new UnsignedWordElement(0x28E4)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_229_VOLTAGE, new UnsignedWordElement(0x28E5)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_230_VOLTAGE, new UnsignedWordElement(0x28E6)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_231_VOLTAGE, new UnsignedWordElement(0x28E7)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_232_VOLTAGE, new UnsignedWordElement(0x28E8)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_233_VOLTAGE, new UnsignedWordElement(0x28E9)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_234_VOLTAGE, new UnsignedWordElement(0x28EA)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_235_VOLTAGE, new UnsignedWordElement(0x28EB)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_236_VOLTAGE, new UnsignedWordElement(0x28EC)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_237_VOLTAGE, new UnsignedWordElement(0x28ED)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_238_VOLTAGE, new UnsignedWordElement(0x28EE)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_239_VOLTAGE, new UnsignedWordElement(0x28EF)) //
), //
new FC3ReadRegistersTask(0x2C00, Priority.LOW, //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_00_TEMPERATURE, new UnsignedWordElement(0x2C00)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_01_TEMPERATURE, new UnsignedWordElement(0x2C01)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_02_TEMPERATURE, new UnsignedWordElement(0x2C02)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_03_TEMPERATURE, new UnsignedWordElement(0x2C03)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_04_TEMPERATURE, new UnsignedWordElement(0x2C04)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_05_TEMPERATURE, new UnsignedWordElement(0x2C05)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_06_TEMPERATURE, new UnsignedWordElement(0x2C06)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_07_TEMPERATURE, new UnsignedWordElement(0x2C07)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_08_TEMPERATURE, new UnsignedWordElement(0x2C08)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_09_TEMPERATURE, new UnsignedWordElement(0x2C09)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_10_TEMPERATURE, new UnsignedWordElement(0x2C0A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_11_TEMPERATURE, new UnsignedWordElement(0x2C0B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_12_TEMPERATURE, new UnsignedWordElement(0x2C0C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_13_TEMPERATURE, new UnsignedWordElement(0x2C0D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_14_TEMPERATURE, new UnsignedWordElement(0x2C0E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_15_TEMPERATURE, new UnsignedWordElement(0x2C0F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_16_TEMPERATURE, new UnsignedWordElement(0x2C10)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_17_TEMPERATURE, new UnsignedWordElement(0x2C11)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_18_TEMPERATURE, new UnsignedWordElement(0x2C12)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_19_TEMPERATURE, new UnsignedWordElement(0x2C13)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_20_TEMPERATURE, new UnsignedWordElement(0x2C14)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_21_TEMPERATURE, new UnsignedWordElement(0x2C15)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_22_TEMPERATURE, new UnsignedWordElement(0x2C16)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_23_TEMPERATURE, new UnsignedWordElement(0x2C17)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_24_TEMPERATURE, new UnsignedWordElement(0x2C18)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_25_TEMPERATURE, new UnsignedWordElement(0x2C19)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_26_TEMPERATURE, new UnsignedWordElement(0x2C1A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_27_TEMPERATURE, new UnsignedWordElement(0x2C1B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_28_TEMPERATURE, new UnsignedWordElement(0x2C1C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_29_TEMPERATURE, new UnsignedWordElement(0x2C1D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_30_TEMPERATURE, new UnsignedWordElement(0x2C1E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_31_TEMPERATURE, new UnsignedWordElement(0x2C1F)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_32_TEMPERATURE, new UnsignedWordElement(0x2C20)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_33_TEMPERATURE, new UnsignedWordElement(0x2C21)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_34_TEMPERATURE, new UnsignedWordElement(0x2C22)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_35_TEMPERATURE, new UnsignedWordElement(0x2C23)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_36_TEMPERATURE, new UnsignedWordElement(0x2C24)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_37_TEMPERATURE, new UnsignedWordElement(0x2C25)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_38_TEMPERATURE, new UnsignedWordElement(0x2C26)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_39_TEMPERATURE, new UnsignedWordElement(0x2C27)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_40_TEMPERATURE, new UnsignedWordElement(0x2C28)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_41_TEMPERATURE, new UnsignedWordElement(0x2C29)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_42_TEMPERATURE, new UnsignedWordElement(0x2C2A)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_43_TEMPERATURE, new UnsignedWordElement(0x2C2B)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_44_TEMPERATURE, new UnsignedWordElement(0x2C2C)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_45_TEMPERATURE, new UnsignedWordElement(0x2C2D)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_46_TEMPERATURE, new UnsignedWordElement(0x2C2E)), //
- m(SoltaroRack.ChannelId.CLUSTER_1_BATTERY_47_TEMPERATURE, new UnsignedWordElement(0x2C2F)) //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_00_TEMPERATURE, new UnsignedWordElement(0x2C00)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_01_TEMPERATURE, new UnsignedWordElement(0x2C01)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_02_TEMPERATURE, new UnsignedWordElement(0x2C02)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_03_TEMPERATURE, new UnsignedWordElement(0x2C03)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_04_TEMPERATURE, new UnsignedWordElement(0x2C04)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_05_TEMPERATURE, new UnsignedWordElement(0x2C05)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_06_TEMPERATURE, new UnsignedWordElement(0x2C06)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_07_TEMPERATURE, new UnsignedWordElement(0x2C07)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_08_TEMPERATURE, new UnsignedWordElement(0x2C08)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_09_TEMPERATURE, new UnsignedWordElement(0x2C09)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_10_TEMPERATURE, new UnsignedWordElement(0x2C0A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_11_TEMPERATURE, new UnsignedWordElement(0x2C0B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_12_TEMPERATURE, new UnsignedWordElement(0x2C0C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_13_TEMPERATURE, new UnsignedWordElement(0x2C0D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_14_TEMPERATURE, new UnsignedWordElement(0x2C0E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_15_TEMPERATURE, new UnsignedWordElement(0x2C0F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_16_TEMPERATURE, new UnsignedWordElement(0x2C10)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_17_TEMPERATURE, new UnsignedWordElement(0x2C11)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_18_TEMPERATURE, new UnsignedWordElement(0x2C12)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_19_TEMPERATURE, new UnsignedWordElement(0x2C13)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_20_TEMPERATURE, new UnsignedWordElement(0x2C14)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_21_TEMPERATURE, new UnsignedWordElement(0x2C15)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_22_TEMPERATURE, new UnsignedWordElement(0x2C16)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_23_TEMPERATURE, new UnsignedWordElement(0x2C17)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_24_TEMPERATURE, new UnsignedWordElement(0x2C18)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_25_TEMPERATURE, new UnsignedWordElement(0x2C19)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_26_TEMPERATURE, new UnsignedWordElement(0x2C1A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_27_TEMPERATURE, new UnsignedWordElement(0x2C1B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_28_TEMPERATURE, new UnsignedWordElement(0x2C1C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_29_TEMPERATURE, new UnsignedWordElement(0x2C1D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_30_TEMPERATURE, new UnsignedWordElement(0x2C1E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_31_TEMPERATURE, new UnsignedWordElement(0x2C1F)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_32_TEMPERATURE, new UnsignedWordElement(0x2C20)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_33_TEMPERATURE, new UnsignedWordElement(0x2C21)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_34_TEMPERATURE, new UnsignedWordElement(0x2C22)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_35_TEMPERATURE, new UnsignedWordElement(0x2C23)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_36_TEMPERATURE, new UnsignedWordElement(0x2C24)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_37_TEMPERATURE, new UnsignedWordElement(0x2C25)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_38_TEMPERATURE, new UnsignedWordElement(0x2C26)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_39_TEMPERATURE, new UnsignedWordElement(0x2C27)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_40_TEMPERATURE, new UnsignedWordElement(0x2C28)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_41_TEMPERATURE, new UnsignedWordElement(0x2C29)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_42_TEMPERATURE, new UnsignedWordElement(0x2C2A)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_43_TEMPERATURE, new UnsignedWordElement(0x2C2B)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_44_TEMPERATURE, new UnsignedWordElement(0x2C2C)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_45_TEMPERATURE, new UnsignedWordElement(0x2C2D)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_46_TEMPERATURE, new UnsignedWordElement(0x2C2E)), //
+ m(SingleRack.ChannelId.CLUSTER_1_BATTERY_47_TEMPERATURE, new UnsignedWordElement(0x2C2F)) //
)//
); //
}
@Override
- public ModbusSlaveTable getModbusSlaveTable() {
+ public ModbusSlaveTable getModbusSlaveTable(AccessMode accessMode) {
return new ModbusSlaveTable( //
- OpenemsComponent.getModbusSlaveNatureTable(), //
- Battery.getModbusSlaveNatureTable());
+ OpenemsComponent.getModbusSlaveNatureTable(accessMode), //
+ Battery.getModbusSlaveNatureTable(accessMode));
}
}
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/Config.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Config.java
similarity index 67%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/Config.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Config.java
index 27474bb1223..67b5c7075c9 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/Config.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Config.java
@@ -1,54 +1,62 @@
-package io.openems.edge.battery.soltaro.versionb;
+package io.openems.edge.battery.soltaro.single.versionb;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import io.openems.edge.battery.soltaro.BatteryState;
@ObjectClassDefinition( //
- name = "BMS FENECON Soltaro Version B", //
+ name = "BMS Soltaro Single Rack Version B", //
description = "Implements the Soltaro battery rack system.")
@interface Config {
- String service_pid();
+ @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component")
String id() default "bms0";
+ @AttributeDefinition(name = "Alias", description = "Human-readable name of this Component; defaults to Component-ID")
+ String alias() default "";
+
+ @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?")
boolean enabled() default true;
@AttributeDefinition(name = "Modbus-ID", description = "ID of Modbus brige.")
- String modbus_id();
-
+ String modbus_id() default "modbus0";
+
@AttributeDefinition(name = "Modbus Unit-ID", description = "The Unit-ID of the Modbus device.")
- int modbusUnitId() default 1;
-
+ int modbusUnitId() default 0;
+
@AttributeDefinition(name = "Battery state", description = "Switches the battery into the given state, if default is used, battery state is set automatically")
BatteryState batteryState() default BatteryState.DEFAULT;
-
- @AttributeDefinition(name = "Number of slaves", description = "The number of slaves in this battery rack (max. 22)", min = "1", max = "22")
+
+ @AttributeDefinition(name = "Number of slaves", description = "The number of slaves in this battery rack (max. 20)", min = "1", max = "20")
int numberOfSlaves() default 20;
@AttributeDefinition(name = "Error Level 2 Delay", description = "Sets the delay time in seconds how long the system should be stopped after an error level 2 has occurred")
int errorLevel2Delay() default 600;
-
+
@AttributeDefinition(name = "Max Start Attempts", description = "Sets the counter how many time the system should try to start")
int maxStartAppempts() default 5;
-
+
@AttributeDefinition(name = "Max Start Time", description = "Max Time in seconds allowed for starting the system")
- int maxStartTime() default 20;
-
+ int maxStartTime() default 30;
+
@AttributeDefinition(name = "Start Not Successful Delay Time", description = "Sets the delay time in seconds how long the system should be stopped if it was not able to start")
int startUnsuccessfulDelay() default 3600;
-
+
@AttributeDefinition(name = "Watchdog", description = "Watchdog timeout in seconds")
int watchdog() default 60;
-
- @AttributeDefinition(name = "SoC Low Alarm", description = "Sets the value for BMS SoC protection (0..100)", min="0", max="100")
+
+ @AttributeDefinition(name = "SoC Low Alarm", description = "Sets the value for BMS SoC protection (0..100)", min = "0", max = "100")
int SoCLowAlarm() default 0;
-
+
+ @AttributeDefinition(name = "Minimal Cell Voltage Millivolt", description = "Minimal cell voltage in milli volt when system does not allow further discharging")
+ int minimalCellVoltage() default 2800;
+
@AttributeDefinition(name = "Reduce tasks", description = "Reduces read and write tasks to avoid errors")
boolean ReduceTasks() default false;
-
+
@AttributeDefinition(name = "Modbus target filter", description = "This is auto-generated by 'Modbus-ID'.")
String Modbus_target() default "";
-
- String webconsole_configurationFactory_nameHint() default "BMS FENECON Soltaro [{id}]";
+
+ String webconsole_configurationFactory_nameHint() default "BMS Soltaro Single Rack Version B [{id}]";
}
\ No newline at end of file
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/VersionBEnums.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Enums.java
similarity index 97%
rename from io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/VersionBEnums.java
rename to io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Enums.java
index 04b7ecc20b9..621e32a295e 100644
--- a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/versionb/VersionBEnums.java
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/Enums.java
@@ -1,8 +1,8 @@
-package io.openems.edge.battery.soltaro.versionb;
+package io.openems.edge.battery.soltaro.single.versionb;
-import io.openems.edge.common.channel.OptionsEnum;
+import io.openems.common.types.OptionsEnum;
-public class VersionBEnums {
+public class Enums {
public enum FanStatus implements OptionsEnum {
UNDEFINED(-1, "Undefined"), //
diff --git a/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/SingleRack.java b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/SingleRack.java
new file mode 100644
index 00000000000..42629ff154a
--- /dev/null
+++ b/io.openems.edge.battery.soltaro/src/io/openems/edge/battery/soltaro/single/versionb/SingleRack.java
@@ -0,0 +1,1336 @@
+package io.openems.edge.battery.soltaro.single.versionb;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.osgi.service.component.annotations.ReferencePolicyOption;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.osgi.service.metatype.annotations.Designate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.openems.common.channel.Unit;
+import io.openems.common.exceptions.OpenemsError.OpenemsNamedException;
+import io.openems.edge.battery.api.Battery;
+import io.openems.edge.battery.soltaro.single.versionb.Enums.AutoSetFunction;
+import io.openems.edge.battery.soltaro.single.versionb.Enums.ContactorControl;
+import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent;
+import io.openems.edge.bridge.modbus.api.BridgeModbus;
+import io.openems.edge.bridge.modbus.api.ElementToChannelConverter;
+import io.openems.edge.bridge.modbus.api.ModbusProtocol;
+import io.openems.edge.bridge.modbus.api.element.AbstractModbusElement;
+import io.openems.edge.bridge.modbus.api.element.BitsWordElement;
+import io.openems.edge.bridge.modbus.api.element.DummyRegisterElement;
+import io.openems.edge.bridge.modbus.api.element.SignedWordElement;
+import io.openems.edge.bridge.modbus.api.element.UnsignedWordElement;
+import io.openems.edge.bridge.modbus.api.task.FC16WriteRegistersTask;
+import io.openems.edge.bridge.modbus.api.task.FC3ReadRegistersTask;
+import io.openems.edge.bridge.modbus.api.task.FC6WriteRegisterTask;
+import io.openems.edge.bridge.modbus.api.task.Task;
+import io.openems.edge.common.channel.Channel;
+import io.openems.edge.common.channel.EnumReadChannel;
+import io.openems.edge.common.channel.EnumWriteChannel;
+import io.openems.edge.common.channel.IntegerDoc;
+import io.openems.edge.common.channel.IntegerReadChannel;
+import io.openems.edge.common.channel.IntegerWriteChannel;
+import io.openems.edge.common.channel.StateChannel;
+import io.openems.edge.common.component.OpenemsComponent;
+import io.openems.edge.common.event.EdgeEventConstants;
+import io.openems.edge.common.taskmanager.Priority;
+import io.openems.edge.battery.soltaro.ModuleParameters;
+import io.openems.edge.battery.soltaro.State;
+import io.openems.edge.battery.soltaro.ChannelIdImpl;
+
+@Designate(ocd = Config.class, factory = true)
+@Component( //
+ name = "Bms.Soltaro.SingleRack.VersionB", //
+ immediate = true, //
+ configurationPolicy = ConfigurationPolicy.REQUIRE, //
+ property = EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_AFTER_PROCESS_IMAGE //
+)
+public class SingleRack extends AbstractOpenemsModbusComponent
+ implements Battery, OpenemsComponent, EventHandler { // , JsonApi TODO
+
+ protected static final int SYSTEM_ON = 1;
+ protected final static int SYSTEM_OFF = 0;
+
+ private static final String KEY_TEMPERATURE = "_TEMPERATURE";
+ private static final String KEY_VOLTAGE = "_VOLTAGE";
+ private static final Integer SYSTEM_RESET = 0x1;
+ private static final String NUMBER_FORMAT = "%03d"; // creates string number with leading zeros
+
+ @Reference
+ protected ConfigurationAdmin cm;
+
+ private final Logger log = LoggerFactory.getLogger(SingleRack.class);
+ private String modbusBridgeId;
+ private State state = State.UNDEFINED;
+ // if configuring is needed this is used to go through the necessary steps
+ private ConfiguringProcess nextConfiguringProcess = ConfiguringProcess.NONE;
+ private Config config;
+ private Map> channelMap;
+ // If an error has occurred, this indicates the time when next action could be
+ // done
+ private LocalDateTime errorDelayIsOver = null;
+ private int unsuccessfulStarts = 0;
+ private LocalDateTime startAttemptTime = null;
+
+ private LocalDateTime timeAfterAutoId = null;
+ private LocalDateTime configuringFinished = null;
+ private int DELAY_AUTO_ID_SECONDS = 5;
+ private int DELAY_AFTER_CONFIGURING_FINISHED = 5;
+
+ public SingleRack() {
+ super(//
+ OpenemsComponent.ChannelId.values(), //
+ Battery.ChannelId.values(), //
+ SingleRackChannelId.values() //
+ );
+ }
+
+ @Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY)
+ protected void setModbus(BridgeModbus modbus) {
+ super.setModbus(modbus);
+ }
+
+ @Activate
+ void activate(ComponentContext context, Config config) {
+ this.config = config;
+
+ // adds dynamically created channels and save them into a map to access them
+ // when modbus tasks are created
+ channelMap = createDynamicChannels();
+
+ super.activate(context, config.id(), config.alias(), config.enabled(), config.modbusUnitId(), this.cm, "Modbus",
+ config.modbus_id());
+ this.modbusBridgeId = config.modbus_id();
+ initializeCallbacks();
+
+ setWatchdog(config.watchdog());
+ setSoCLowAlarm(config.SoCLowAlarm());
+ setCapacity();
+ }
+
+ private void setCapacity() {
+ int capacity = this.config.numberOfSlaves() * ModuleParameters.CAPACITY_WH.getValue() / 1000;
+ this.channel(Battery.ChannelId.CAPACITY).setNextValue(capacity);
+ }
+
+ private void handleStateMachine() {
+ log.info("SingleRack.handleStateMachine(): State: " + this.getStateMachineState());
+ boolean readyForWorking = false;
+ switch (this.getStateMachineState()) {
+ case ERROR:
+ stopSystem();
+ errorDelayIsOver = LocalDateTime.now().plusSeconds(config.errorLevel2Delay());
+ setStateMachineState(State.ERRORDELAY);
+ break;
+
+ case ERRORDELAY:
+ if (LocalDateTime.now().isAfter(errorDelayIsOver)) {
+ errorDelayIsOver = null;
+ if (this.isError()) {
+ this.setStateMachineState(State.ERROR);
+ } else {
+ this.setStateMachineState(State.OFF);
+ }
+ }
+ break;
+ case INIT:
+ if (this.isSystemRunning()) {
+ this.setStateMachineState(State.RUNNING);
+ unsuccessfulStarts = 0;
+ startAttemptTime = null;
+ } else {
+ if (startAttemptTime.plusSeconds(config.maxStartTime()).isBefore(LocalDateTime.now())) {
+ startAttemptTime = null;
+ unsuccessfulStarts++;
+ this.stopSystem();
+ this.setStateMachineState(State.STOPPING);
+ if (unsuccessfulStarts >= config.maxStartAppempts()) {
+ errorDelayIsOver = LocalDateTime.now().plusSeconds(config.startUnsuccessfulDelay());
+ this.setStateMachineState(State.ERRORDELAY);
+ unsuccessfulStarts = 0;
+ }
+ }
+ }
+ break;
+ case OFF:
+ log.debug("in case 'OFF'; try to start the system");
+ this.startSystem();
+ log.debug("set state to 'INIT'");
+ this.setStateMachineState(State.INIT);
+ startAttemptTime = LocalDateTime.now();
+ break;
+ case RUNNING:
+ if (this.isError()) {
+ this.setStateMachineState(State.ERROR);
+ } else if (!this.isSystemRunning()) {
+ this.setStateMachineState(State.UNDEFINED);
+ } else {
+ // if minimal cell voltage is lower than configured minimal cell voltage, then force system to charge
+ IntegerReadChannel minCellVoltageChannel = this.channel(SingleRackChannelId.CLUSTER_1_MIN_CELL_VOLTAGE);
+ Optional minCellVoltageOpt = minCellVoltageChannel.value().asOptional();
+ if (minCellVoltageOpt.isPresent()) {
+ int minCellVoltage = minCellVoltageOpt.get();
+ if (minCellVoltage < this.config.minimalCellVoltage()) {
+ // set the discharge current negative to force the system to charge
+ // TODO check if this is working!
+ this.getDischargeMaxCurrent().setNextValue( (-1) * this.getChargeMaxCurrent().value().get() );
+ }
+ }
+ readyForWorking = true;
+ }
+ break;
+ case STOPPING:
+ if (this.isError()) {
+ this.setStateMachineState(State.ERROR);
+ } else {
+ if (this.isSystemStopped()) {
+ this.setStateMachineState(State.OFF);
+ }
+ }
+ break;
+ case UNDEFINED:
+ if (this.isError()) {
+ this.setStateMachineState(State.ERROR);
+ } else if (this.isSystemStopped()) {
+ this.setStateMachineState(State.OFF);
+ } else if (this.isSystemRunning()) {
+ this.setStateMachineState(State.RUNNING);
+ } else if (this.isSystemStatePending()) {
+ this.setStateMachineState(State.PENDING);
+ }
+ break;
+ case PENDING:
+ this.stopSystem();
+ this.setStateMachineState(State.OFF);
+ break;
+ }
+
+ this.getReadyForWorking().setNextValue(readyForWorking);
+ }
+
+ /*
+ * creates a map containing channels for voltage and temperature depending on
+ * the number of modules
+ */
+ private Map> createDynamicChannels() {
+ Map> map = new HashMap<>();
+
+ int voltSensors = ModuleParameters.VOLTAGE_SENSORS_PER_MODULE.getValue();
+ for (int i = 0; i < this.config.numberOfSlaves(); i++) {
+ for (int j = i * voltSensors; j < (i + 1) * voltSensors; j++) {
+ String key = getSingleCellPrefix(j) + KEY_VOLTAGE;
+ IntegerDoc doc = new IntegerDoc();
+ io.openems.edge.common.channel.ChannelId channelId = new ChannelIdImpl(key, doc.unit(Unit.MILLIVOLT));
+ IntegerReadChannel integerReadChannel = (IntegerReadChannel) this.addChannel(channelId);
+ map.put(key, integerReadChannel);
+ }
+ }
+
+ int tempSensors = ModuleParameters.TEMPERATURE_SENSORS_PER_MODULE.getValue();
+ for (int i = 0; i < this.config.numberOfSlaves(); i++) {
+ for (int j = i * tempSensors; j < (i + 1) * tempSensors; j++) {
+ String key = getSingleCellPrefix(j) + KEY_TEMPERATURE;
+
+ IntegerDoc doc = new IntegerDoc();
+ io.openems.edge.common.channel.ChannelId channelId = new ChannelIdImpl(key,
+ doc.unit(Unit.DEZIDEGREE_CELSIUS));
+ IntegerReadChannel integerReadChannel = (IntegerReadChannel) this.addChannel(channelId);
+ map.put(key, integerReadChannel);
+ }
+ }
+ return map;
+ }
+
+ private String getSingleCellPrefix(int num) {
+ return "CLUSTER_1_BATTERY_" + String.format(NUMBER_FORMAT, num);
+ }
+
+ private void setWatchdog(int time_seconds) {
+ try {
+ IntegerWriteChannel c = this.channel(SingleRackChannelId.EMS_COMMUNICATION_TIMEOUT);
+ c.setNextWriteValue(time_seconds);
+ } catch (OpenemsNamedException e) {
+ log.error("Error while setting ems timeout!\n" + e.getMessage());
+ }
+ }
+
+ @Deactivate
+ protected void deactivate() {
+ // Remove dynamically created channels when component is deactivated
+ for (Channel> c : this.channelMap.values()) {
+ this.removeChannel(c);
+ }
+ super.deactivate();
+ }
+
+ private void initializeCallbacks() {
+
+ this.channel(SingleRackChannelId.CLUSTER_1_VOLTAGE).onChange(value -> {
+ @SuppressWarnings("unchecked")
+ Optional vOpt = (Optional) value.asOptional();
+ if (!vOpt.isPresent()) {
+ return;
+ }
+ int voltage_volt = (int) (vOpt.get() * 0.001);
+ log.debug("callback voltage, value: " + voltage_volt);
+ this.channel(Battery.ChannelId.VOLTAGE).setNextValue(voltage_volt);
+ });
+
+ this.channel(SingleRackChannelId.CLUSTER_1_MIN_CELL_VOLTAGE).onChange(value -> {
+ @SuppressWarnings("unchecked")
+ Optional vOpt = (Optional) value.asOptional();
+ if (!vOpt.isPresent()) {
+ return;
+ }
+ int voltage_millivolt = vOpt.get();
+ log.debug("callback min cell voltage, value: " + voltage_millivolt);
+ this.channel(Battery.ChannelId.MIN_CELL_VOLTAGE).setNextValue(voltage_millivolt);
+ });
+
+ // write battery ranges to according channels in battery api
+ // MAX_VOLTAGE x2082
+ this.channel(SingleRackChannelId.WARN_PARAMETER_SYSTEM_OVER_VOLTAGE_ALARM).onChange(value -> {
+ @SuppressWarnings("unchecked")
+ Optional vOpt = (Optional) value.asOptional();
+ if (!vOpt.isPresent()) {
+ return;
+ }
+ int max_charge_voltage = (int) (vOpt.get() * 0.001);
+ log.debug("callback battery range, max charge voltage, value: " + max_charge_voltage);
+ this.channel(Battery.ChannelId.CHARGE_MAX_VOLTAGE).setNextValue(max_charge_voltage);
+ });
+
+ // DISCHARGE_MIN_VOLTAGE 0x2088
+ this.channel(SingleRackChannelId.WARN_PARAMETER_SYSTEM_UNDER_VOLTAGE_ALARM).onChange(value -> {
+ @SuppressWarnings("unchecked")
+ Optional vOpt = (Optional) value.asOptional();
+ if (!vOpt.isPresent()) {
+ return;
+ }
+ int min_discharge_voltage = (int) (vOpt.get() * 0.001);
+ log.debug("callback battery range, min discharge voltage, value: " + min_discharge_voltage);
+ this.channel(Battery.ChannelId.DISCHARGE_MIN_VOLTAGE).setNextValue(min_discharge_voltage);
+ });
+
+ // CHARGE_MAX_CURRENT 0x2160
+ this.channel(SingleRackChannelId.SYSTEM_MAX_CHARGE_CURRENT).onChange(value -> {
+ @SuppressWarnings("unchecked")
+ Optional cOpt = (Optional) value.asOptional();
+ if (!cOpt.isPresent()) {
+ return;
+ }
+ int max_current = (int) (cOpt.get() * 0.001);
+ log.debug("callback battery range, max charge current, value: " + max_current);
+ this.channel(Battery.ChannelId.CHARGE_MAX_CURRENT).setNextValue(max_current);
+ });
+
+ // DISCHARGE_MAX_CURRENT 0x2161
+ this.channel(SingleRackChannelId.SYSTEM_MAX_DISCHARGE_CURRENT).onChange(value -> {
+ @SuppressWarnings("unchecked")
+ Optional