pull/33/merge
Abdelaziz Said 2 years ago committed by GitHub
commit a0b9d04f08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -17,6 +17,7 @@ import com.beanit.asn1bean.ber.types.BerNull;
import com.beanit.iec61850bean.internal.mms.asn1.Data;
import com.beanit.iec61850bean.internal.mms.asn1.TypeDescription;
import com.beanit.iec61850bean.internal.mms.asn1.UtcTime;
import java.time.Instant;
import java.util.Date;
@ -65,6 +66,41 @@ public final class BdaTimestamp extends BasicDataAttribute {
return ((0xff & value[4]) << 16 | (0xff & value[5]) << 8 | (0xff & value[6]));
}
public Date getDate() {
if (value == null || value.length == 0) {
return null;
}
long time =
getSecondsSinceEpoch() * 1000L
+ (long) (((float) getFractionOfSecond()) / (1 << 24) * 1000 + 0.5);
return new Date(time);
}
public void setDate(Date date) {
if (value == null) {
value = new byte[8];
}
int secondsSinceEpoch = (int) (date.getTime() / 1000L);
int fractionOfSecond = (int) ((date.getTime() % 1000L) / 1000.0 * (1 << 24));
// 0x8a = time accuracy of 10 and LeapSecondsKnown = true, ClockFailure
// = false, ClockNotSynchronized = false
value =
new byte[] {
(byte) ((secondsSinceEpoch >> 24) & 0xff),
(byte) ((secondsSinceEpoch >> 16) & 0xff),
(byte) ((secondsSinceEpoch >> 8) & 0xff),
(byte) (secondsSinceEpoch & 0xff),
(byte) ((fractionOfSecond >> 16) & 0xff),
(byte) ((fractionOfSecond >> 8) & 0xff),
(byte) (fractionOfSecond & 0xff),
(byte) 0x8a
};
}
@Override
public void setValueFrom(BasicDataAttribute bda) {
byte[] srcValue = ((BdaTimestamp) bda).getValue();
@ -183,13 +219,17 @@ public final class BdaTimestamp extends BasicDataAttribute {
return ((value[7] & 0x1f));
}
/** Sets Timestamp the empty byte array (indicating an invalid Timestamp) */
/**
* Sets Timestamp the empty byte array (indicating an invalid Timestamp)
*/
@Override
public void setDefault() {
value = new byte[8];
}
/** Sets Timestamp to current time */
/**
* Sets Timestamp to current time
*/
public void setCurrentTime() {
setInstant(Instant.now());
}

@ -0,0 +1,148 @@
package com.beanit.iec61850bean;
import java.util.Objects;
public class ConnectionParam {
private String iedName;
private String IP;
private String IP_SUBNET;
private String OSI_AP_Title;
private String OSI_AE_Qualifier;
private String OSI_PSEL;
private String OSI_SSEL;
private String OSI_TSEL;
private String IP_GATEWAY;
private String S_Profile;
private String MAC_Address;
public String getIedName() {
return iedName;
}
public void setIedName(String iedName) {
this.iedName = iedName;
}
public String getIP() {
return IP;
}
public void setIP(String IP) {
this.IP = IP;
}
public String getIP_SUBNET() {
return IP_SUBNET;
}
public void setIP_SUBNET(String IP_SUBNET) {
this.IP_SUBNET = IP_SUBNET;
}
public String getOSI_AP_Title() {
return OSI_AP_Title;
}
public void setOSI_AP_Title(String OSI_AP_Title) {
this.OSI_AP_Title = OSI_AP_Title;
}
public String getOSI_AE_Qualifier() {
return OSI_AE_Qualifier;
}
public void setOSI_AE_Qualifier(String OSI_AE_Qualifier) {
this.OSI_AE_Qualifier = OSI_AE_Qualifier;
}
public String getOSI_PSEL() {
return OSI_PSEL;
}
public void setOSI_PSEL(String OSI_PSEL) {
this.OSI_PSEL = OSI_PSEL;
}
public String getOSI_SSEL() {
return OSI_SSEL;
}
public void setOSI_SSEL(String OSI_SSEL) {
this.OSI_SSEL = OSI_SSEL;
}
public String getOSI_TSEL() {
return OSI_TSEL;
}
public void setOSI_TSEL(String OSI_TSEL) {
this.OSI_TSEL = OSI_TSEL;
}
public String getIP_GATEWAY() {
return IP_GATEWAY;
}
public void setIP_GATEWAY(String IP_GATEWAY) {
this.IP_GATEWAY = IP_GATEWAY;
}
public String getS_Profile() {
return S_Profile;
}
public void setS_Profile(String s_Profile) {
S_Profile = s_Profile;
}
public String getMAC_Address() {
return MAC_Address;
}
public void setMAC_Address(String MAC_Address) {
this.MAC_Address = MAC_Address;
}
@Override
public String toString() {
return "iedName = " + iedName + '\n' +
"IP = " + IP + '\n' +
"IP_SUBNET = " + IP_SUBNET + '\n' +
"OSI_AP_Title = " + OSI_AP_Title + '\n' +
"OSI_AE_Qualifier = " + OSI_AE_Qualifier + '\n' +
"OSI_PSEL = " + OSI_PSEL + '\n' +
"OSI_SSEL = " + OSI_SSEL + '\n' +
"OSI_TSEL = " + OSI_TSEL + '\n' +
"IP_GATEWAY = " + IP_GATEWAY + '\n' +
"S_Profile = " + S_Profile + '\n' +
"MAC-Address = " + MAC_Address
;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ConnectionParam that = (ConnectionParam) o;
return iedName.equals(that.iedName) &&
IP.equals(that.IP) &&
Objects.equals(IP_SUBNET, that.IP_SUBNET) &&
Objects.equals(OSI_AP_Title, that.OSI_AP_Title) &&
Objects.equals(OSI_AE_Qualifier, that.OSI_AE_Qualifier) &&
Objects.equals(OSI_PSEL, that.OSI_PSEL) &&
Objects.equals(OSI_SSEL, that.OSI_SSEL) &&
Objects.equals(OSI_TSEL, that.OSI_TSEL) &&
Objects.equals(IP_GATEWAY, that.IP_GATEWAY) &&
Objects.equals(S_Profile, that.S_Profile) &&
Objects.equals(MAC_Address, that.MAC_Address);
}
@Override
public int hashCode() {
return Objects.hash(iedName, IP, IP_SUBNET, OSI_AP_Title, OSI_AE_Qualifier, OSI_PSEL, OSI_SSEL,
OSI_TSEL, IP_GATEWAY, S_Profile, MAC_Address);
}
}

@ -14,6 +14,7 @@
package com.beanit.iec61850bean;
import com.beanit.iec61850bean.internal.mms.asn1.Data;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
@ -30,10 +31,17 @@ import java.util.List;
*/
public class FcDataObject extends FcModelNode {
public FcDataObject(ObjectReference objectReference, Fc fc, List<FcModelNode> children) {
private final List<FcModelNode> fcModelNodes;
private String doType;
private String cdc;
public FcDataObject(ObjectReference objectReference, Fc fc, List<FcModelNode> children) {
this.fcModelNodes = children;
super.setDataAttributes(children);
this.children = new LinkedHashMap<>((int) ((children.size() / 0.75) + 1));
this.objectReference = objectReference;
for (ModelNode child : children) {
this.children.put(child.getReference().getName(), child);
child.setParent(this);
@ -92,4 +100,20 @@ public class FcDataObject extends FcModelNode {
child.setValueFromMmsDataObj(iterator.next());
}
}
public String getDoType() {
return doType;
}
public void setDoType(String doType) {
this.doType = doType;
}
public String getCdc() {
return cdc;
}
public void setCdc(String cdc) {
this.cdc = cdc;
}
}

@ -13,22 +13,16 @@
*/
package com.beanit.iec61850bean;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccess;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection;
import com.beanit.iec61850bean.internal.mms.asn1.*;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection.SelectAccess;
import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection.SelectAccess.Component;
import com.beanit.iec61850bean.internal.mms.asn1.BasicIdentifier;
import com.beanit.iec61850bean.internal.mms.asn1.Identifier;
import com.beanit.iec61850bean.internal.mms.asn1.ObjectName;
import com.beanit.iec61850bean.internal.mms.asn1.Unsigned32;
import com.beanit.iec61850bean.internal.mms.asn1.VariableDefs;
import com.beanit.iec61850bean.internal.mms.asn1.VariableSpecification;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import static java.nio.charset.StandardCharsets.UTF_8;
public abstract class FcModelNode extends ModelNode {
Fc fc;
@ -36,6 +30,24 @@ public abstract class FcModelNode extends ModelNode {
private ServerAssociation selected = null;
private TimerTask task = null;
private String daType;
private BdaType basicType = null;
private String sAddr;
private String daiVal;
private boolean dchg;
private boolean dupd;
private boolean qchg;
private String bType;
private List<FcModelNode> bdas;
private short valueShort;
private byte[] valueBytes;
private byte valueByte;
private boolean valueBoolean;
private int valueInt;
private long valueLong;
public Fc getFc() {
return fc;
}
@ -249,4 +261,125 @@ public abstract class FcModelNode extends ModelNode {
}
return sb.toString();
}
public String getDaType() {
return daType;
}
public void setDaType(String daType) {
this.daType = daType;
}
public BdaType getBasicType() {
return basicType;
}
public void setBasicType(BdaType basicType) {
this.basicType = basicType;
}
public String getsAddr() {
return sAddr;
}
public void setsAddr(String sAddr) {
this.sAddr = sAddr;
}
public String getDaiVal() {
return daiVal;
}
public void setDaiVal(String daiVal) {
this.daiVal = daiVal;
}
public boolean isDchg() {
return dchg;
}
public void setDchg(boolean dchg) {
this.dchg = dchg;
}
public boolean isDupd() {
return dupd;
}
public void setDupd(boolean dupd) {
this.dupd = dupd;
}
public boolean isQchg() {
return qchg;
}
public void setQchg(boolean qchg) {
this.qchg = qchg;
}
public String getbType() {
return bType;
}
public void setbType(String bType) {
this.bType = bType;
}
public List<FcModelNode> getDataAttributes() {
return bdas;
}
public FcModelNode setDataAttributes(List<FcModelNode> bdas) {
this.bdas = bdas;
return this;
}
public short getValueShort() {
return valueShort;
}
public void setValueShort(short valueShort) {
this.valueShort = valueShort;
}
public byte[] getValueBytes() {
return valueBytes;
}
public void setValueBytes(byte[] valueBytes) {
this.valueBytes = valueBytes;
}
public byte getValueByte() {
return valueByte;
}
public void setValueByte(byte valueByte) {
this.valueByte = valueByte;
}
public boolean isValueBoolean() {
return valueBoolean;
}
public void setValueBoolean(boolean valueBoolean) {
this.valueBoolean = valueBoolean;
}
public int getValueInt() {
return valueInt;
}
public void setValueInt(int valueInt) {
this.valueInt = valueInt;
}
public long getValueLong() {
return valueLong;
}
public void setValueLong(long valueLong) {
this.valueLong = valueLong;
}
}

@ -19,7 +19,11 @@ import java.util.List;
public final class LogicalDevice extends ModelNode {
private final List<LogicalNode> logicalNodes;
private String ldInst;
public LogicalDevice(ObjectReference objectReference, List<LogicalNode> logicalNodes) {
this.logicalNodes = logicalNodes;
children = new LinkedHashMap<>((int) ((logicalNodes.size() / 0.75) + 1));
this.objectReference = objectReference;
for (LogicalNode logicalNode : logicalNodes) {
@ -36,4 +40,16 @@ public final class LogicalDevice extends ModelNode {
}
return new LogicalDevice(objectReference, childCopies);
}
public List<LogicalNode> getLogicalNodes() {
return logicalNodes;
}
public String getLdInst() {
return ldInst;
}
public void setLdInst(String ldInst) {
this.ldInst = ldInst;
}
}

@ -28,7 +28,14 @@ public final class LogicalNode extends ModelNode {
private final Map<String, Urcb> urcbs = new HashMap<>();
private final Map<String, Brcb> brcbs = new HashMap<>();
private final List<FcDataObject> dataObjects;
private String prefix;
private String lnClass;
private String lnInst;
private String lnType;
public LogicalNode(ObjectReference objectReference, List<FcDataObject> fcDataObjects) {
this.dataObjects = fcDataObjects;
children = new LinkedHashMap<>();
for (Fc fc : Fc.values()) {
this.fcDataObjects.put(fc, new LinkedHashMap<String, FcDataObject>());
@ -59,8 +66,7 @@ public final class LogicalNode extends ModelNode {
dataObjectsCopy.add((FcDataObject) obj.copy());
}
LogicalNode copy = new LogicalNode(objectReference, dataObjectsCopy);
return copy;
return new LogicalNode(objectReference, dataObjectsCopy);
}
public List<FcDataObject> getChildren(Fc fc) {
@ -134,4 +140,36 @@ public final class LogicalNode extends ModelNode {
}
return sb.toString();
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getLnClass() {
return lnClass;
}
public void setLnClass(String lnClass) {
this.lnClass = lnClass;
}
public String getLnInst() {
return lnInst;
}
public void setLnInst(String lnInst) {
this.lnInst = lnInst;
}
public String getLnType() {
return lnType;
}
public void setLnType(String lnType) {
this.lnType = lnType;
}
}

@ -1,3 +1,4 @@
/*
* Copyright 2011 The IEC61850bean Authors
*
@ -13,34 +14,20 @@
*/
package com.beanit.iec61850bean;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.beanit.iec61850bean.internal.scl.AbstractDataAttribute;
import com.beanit.iec61850bean.internal.scl.Bda;
import com.beanit.iec61850bean.internal.scl.Da;
import com.beanit.iec61850bean.internal.scl.DaType;
import com.beanit.iec61850bean.internal.scl.Do;
import com.beanit.iec61850bean.internal.scl.DoType;
import com.beanit.iec61850bean.internal.scl.EnumType;
import com.beanit.iec61850bean.internal.scl.EnumVal;
import com.beanit.iec61850bean.internal.scl.LnSubDef;
import com.beanit.iec61850bean.internal.scl.LnType;
import com.beanit.iec61850bean.internal.scl.Sdo;
import com.beanit.iec61850bean.internal.scl.TypeDefinitions;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilderFactory;
import com.beanit.iec61850bean.internal.scl.*;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.*;
import static java.nio.charset.StandardCharsets.UTF_8;
public class SclParser {
private final Map<String, DataSet> dataSetsMap = new HashMap<>();
@ -48,10 +35,26 @@ public class SclParser {
private TypeDefinitions typeDefinitions;
private Document doc;
private String iedName;
private List<ServerModel> serverModels = new ArrayList<>();
private final List<ServerModel> serverModels = new ArrayList<>();
private boolean useResvTmsAttributes = false;
private SclParser() {}
private String iedConnectedAP;
ConnectionParam connectionParm;
private final Map<String, ConnectionParam> iedConnectionMap = new HashMap<>();
private String iedManufacturer;
Map<String, String> descMap;
private List<String> ldsInsts;
private List<String> ldsRefs;
private Set<String> lnSet;
private Map<String, Set<String>> lns;
private final HashSet<String> lnS = new HashSet<>();
private final Map<String, String> cdcDOMap = new HashMap<>();
private Map<String, String> daiDescMap;
private List<LogicalDevice> logicalDevices;
private SclParser() {
}
public static List<ServerModel> parse(InputStream is) throws SclParseException {
SclParser sclParser = new SclParser();
@ -88,6 +91,39 @@ public class SclParser {
readTypeDefinitions();
NodeList connectedAPs = doc.getElementsByTagName("ConnectedAP");
for (int zz = 0; zz < connectedAPs.getLength(); zz++) {
Node connectedAP = connectedAPs.item(zz);
Node attributeName = connectedAP.getAttributes().getNamedItem("iedName");
iedConnectedAP = attributeName.getNodeValue();
connectionParm = new ConnectionParam();
if ((iedConnectedAP == null) || (iedConnectedAP.length() == 0)) {
throw new SclParseException("ConnectedAP must has a name");
}
NodeList elementsConnectedAP = connectedAP.getChildNodes();
for (int yy = 0; yy < elementsConnectedAP.getLength(); yy++) {
Node elementConnectedAP = elementsConnectedAP.item(yy);
String nodeAddress = elementConnectedAP.getNodeName();
if (nodeAddress.equals("Address")) {
NodeList address = elementConnectedAP.getChildNodes();
for (int ii = 0; ii < address.getLength(); ii++) {
Node elementAddress = address.item(ii);
String nodeCheck = elementAddress.getNodeName();
if ("P".equals(nodeCheck)) {
setConnectionParm(elementAddress);
}
}
connectionParm.setIedName(iedConnectedAP);
iedConnectionMap.put(iedConnectedAP, connectionParm);
}
}
}
NodeList iedList = doc.getElementsByTagName("IED");
if (iedList.getLength() == 0) {
throw new SclParseException("No IED section found!");
@ -100,6 +136,9 @@ public class SclParser {
Node nameAttribute = iedNode.getAttributes().getNamedItem("name");
Node manufacturerAttr = iedNode.getAttributes().getNamedItem("manufacturer");
iedManufacturer = manufacturerAttr.getNodeValue();
iedName = nameAttribute.getNodeValue();
if ((iedName == null) || (iedName.length() == 0)) {
throw new SclParseException("IED must have a name!");
@ -131,6 +170,48 @@ public class SclParser {
}
}
public void setConnectionParm(Node P) {
String nodeValue;
P.getAttributes().getNamedItem("type");
String typeValue = P.getAttributes().getNamedItem("type").getNodeValue();
nodeValue = P.getTextContent();
switch (typeValue) {
case "IP":
connectionParm.setIP(nodeValue);
break;
case "IP-SUBNET":
connectionParm.setIP_SUBNET(nodeValue);
break;
case "OSI-AP-Title":
connectionParm.setOSI_AP_Title(nodeValue);
break;
case "OSI-AE-Qualifier":
connectionParm.setOSI_AE_Qualifier(nodeValue);
break;
case "OSI-PSEL":
connectionParm.setOSI_PSEL(nodeValue);
break;
case "OSI-SSEL":
connectionParm.setOSI_SSEL(nodeValue);
break;
case "OSI-TSEL":
connectionParm.setOSI_TSEL(nodeValue);
break;
case "IP-GATEWAY":
connectionParm.setIP_GATEWAY(nodeValue);
break;
case "S-Profile":
connectionParm.setS_Profile(nodeValue);
break;
case "MAC-Address":
connectionParm.setMAC_Address(nodeValue);
break;
}
}
private void readTypeDefinitions() throws SclParseException {
NodeList dttSections = doc.getElementsByTagName("DataTypeTemplates");
@ -148,14 +229,19 @@ public class SclParser {
String nodeName = element.getNodeName();
if (nodeName.equals("LNodeType")) {
switch (nodeName) {
case "LNodeType":
typeDefinitions.putLNodeType(new LnType(element));
} else if (nodeName.equals("DOType")) {
break;
case "DOType":
typeDefinitions.putDOType(new DoType(element));
} else if (nodeName.equals("DAType")) {
break;
case "DAType":
typeDefinitions.putDAType(new DaType(element));
} else if (nodeName.equals("EnumType")) {
break;
case "EnumType":
typeDefinitions.putEnumType(new EnumType(element));
break;
}
}
}
@ -170,6 +256,12 @@ public class SclParser {
if (element.getNodeName().equals("Server")) {
ldsInsts = new ArrayList<>();
ldsRefs = new ArrayList<>();
descMap = new HashMap<>();
daiDescMap = new HashMap<>();
logicalDevices = new ArrayList<>();
ServerModel server = createServerModel(element);
Node namedItem = iedServer.getAttributes().getNamedItem("name");
@ -195,7 +287,9 @@ public class SclParser {
Node element = elements.item(i);
if (element.getNodeName().equals("LDevice")) {
lns = new HashMap<>();
logicalDevices.add(createNewLDevice(element));
this.logicalDevices.add(createNewLDevice(element));
}
}
@ -212,6 +306,19 @@ public class SclParser {
dataSetDefs.clear();
serverModel.setConnectionParam(iedConnectionMap.get(iedName));
serverModel.setIedName(iedName);
serverModel.setIedManufacturer(iedManufacturer);
serverModel.setLns(lns);
serverModel.setLnS(lnS);
serverModel.setDos(cdcDOMap);
serverModel.setLdsInsts(ldsInsts);
serverModel.setLdsRefs(ldsRefs);
serverModel.setDescriptions(descMap);
serverModel.setdAIDescriptions(daiDescMap);
serverModel.setLogicalDevices(logicalDevices);
return serverModel;
}
@ -237,15 +344,20 @@ public class SclParser {
throw new SclParseException("Required attribute \"inst\" in logical device not found!");
}
ldsInsts.add(inst);
NodeList elements = ldXmlNode.getChildNodes();
List<LogicalNode> logicalNodes = new ArrayList<>();
String ref;
if ((ldName != null) && (ldName.length() != 0)) {
ref = ldName;
ldsRefs.add(ref);
} else {
ref = iedName + inst;
ldsRefs.add(ref);
}
lnSet = new HashSet<>();
for (int i = 0; i < elements.getLength(); i++) {
Node element = elements.item(i);
@ -254,8 +366,10 @@ public class SclParser {
logicalNodes.add(createNewLogicalNode(element, ref));
}
}
lns.put(ref, lnSet);
LogicalDevice lDevice = new LogicalDevice(new ObjectReference(ref), logicalNodes);
lDevice.setLdInst(inst);
return lDevice;
}
@ -276,17 +390,24 @@ public class SclParser {
Node node = attributes.item(i);
String nodeName = node.getNodeName();
if (nodeName.equals("inst")) {
switch (nodeName) {
case "inst":
inst = node.getNodeValue();
} else if (nodeName.equals("lnType")) {
break;
case "lnType":
lnType = node.getNodeValue();
} else if (nodeName.equals("lnClass")) {
break;
case "lnClass":
lnClass = node.getNodeValue();
} else if (nodeName.equals("prefix")) {
break;
case "prefix":
prefix = node.getNodeValue();
break;
}
}
lnSet.add(prefix + lnClass + inst);
if (inst == null) {
throw new SclParseException("Required attribute \"inst\" not found!");
}
@ -298,6 +419,7 @@ public class SclParser {
}
String ref = parentRef + '/' + prefix + lnClass + inst;
lnS.add(ref);
LnType lnTypeDef = typeDefinitions.getLNodeType(lnType);
@ -316,6 +438,12 @@ public class SclParser {
NamedNodeMap doiAttributes = childNode.getAttributes();
Node nameAttribute = doiAttributes.getNamedItem("name");
Node cdcAttribute = doiAttributes.getNamedItem("desc");
if (cdcAttribute != null) {
descMap.put(ref + "." + nameAttribute.getNodeValue(), cdcAttribute.getNodeValue());
}
if (nameAttribute != null && nameAttribute.getNodeValue().equals(dobject.getName())) {
doiNodeFound = childNode;
}
@ -323,7 +451,7 @@ public class SclParser {
}
dataObjects.addAll(
createFcDataObjects(dobject.getName(), ref, dobject.getType(), doiNodeFound));
createFcDataObjects(dobject.getName(), ref, dobject.getType(), doiNodeFound, dobject.getType()));
}
// look for ReportControl
@ -343,6 +471,12 @@ public class SclParser {
dataSetDefs.add(new LnSubDef(childNode, lNode));
}
}
lNode.setPrefix(prefix);
lNode.setLnClass(lnClass);
lNode.setLnInst(inst);
lNode.setLnType(lnType);
return lNode;
}
@ -378,25 +512,33 @@ public class SclParser {
Node node = attributes.item(j);
String nodeName = node.getNodeName();
if (nodeName.equals("ldInst")) {
switch (nodeName) {
case "ldInst":
ldInst = node.getNodeValue();
} else if (nodeName.equals("lnInst")) {
break;
case "lnInst":
lnInst = node.getNodeValue();
} else if (nodeName.equals("lnClass")) {
break;
case "lnClass":
lnClass = node.getNodeValue();
} else if (nodeName.equals("prefix")) {
break;
case "prefix":
prefix = node.getNodeValue();
} else if (nodeName.equals("doName")) {
break;
case "doName":
doName = node.getNodeValue();
} else if (nodeName.equals("daName")) {
break;
case "daName":
if (!node.getNodeValue().isEmpty()) {
daName = "." + node.getNodeValue();
}
} else if (nodeName.equals("fc")) {
break;
case "fc":
fc = Fc.fromString(node.getNodeValue());
if (fc == null) {
throw new SclParseException("FCDA contains invalid FC: " + node.getNodeValue());
}
break;
}
}
@ -446,8 +588,7 @@ public class SclParser {
}
}
DataSet dataSet = new DataSet(lNode.getReference().toString() + '.' + name, dsMembers, false);
return dataSet;
return new DataSet(lNode.getReference().toString() + '.' + name, dsMembers, false);
}
private List<Rcb> createReportControlBlocks(Node xmlNode, String parentRef)
@ -588,7 +729,7 @@ public class SclParser {
BdaVisibleString rptId =
new BdaVisibleString(
new ObjectReference(reportObjRef.toString() + ".RptID"), fc, "", 129, false, false);
new ObjectReference(reportObjRef + ".RptID"), fc, "", 129, false, false);
attribute = rcbNodeAttributes.getNamedItem("rptID");
if (attribute != null) {
rptId.setValue(attribute.getNodeValue().getBytes(UTF_8));
@ -600,17 +741,17 @@ public class SclParser {
children.add(
new BdaBoolean(
new ObjectReference(reportObjRef.toString() + ".RptEna"), fc, "", false, false));
new ObjectReference(reportObjRef + ".RptEna"), fc, "", false, false));
if (fc == Fc.RP) {
children.add(
new BdaBoolean(
new ObjectReference(reportObjRef.toString() + ".Resv"), fc, "", false, false));
new ObjectReference(reportObjRef + ".Resv"), fc, "", false, false));
}
BdaVisibleString datSet =
new BdaVisibleString(
new ObjectReference(reportObjRef.toString() + ".DatSet"), fc, "", 129, false, false);
new ObjectReference(reportObjRef + ".DatSet"), fc, "", 129, false, false);
attribute = xmlNode.getAttributes().getNamedItem("datSet");
if (attribute != null) {
@ -622,7 +763,7 @@ public class SclParser {
BdaInt32U confRef =
new BdaInt32U(
new ObjectReference(reportObjRef.toString() + ".ConfRev"), fc, "", false, false);
new ObjectReference(reportObjRef + ".ConfRev"), fc, "", false, false);
attribute = xmlNode.getAttributes().getNamedItem("confRev");
if (attribute == null) {
throw new SclParseException(
@ -635,7 +776,7 @@ public class SclParser {
BdaInt32U bufTm =
new BdaInt32U(
new ObjectReference(reportObjRef.toString() + ".BufTm"), fc, "", false, false);
new ObjectReference(reportObjRef + ".BufTm"), fc, "", false, false);
attribute = xmlNode.getAttributes().getNamedItem("bufTime");
if (attribute != null) {
bufTm.setValue(Long.parseLong(attribute.getNodeValue()));
@ -644,13 +785,13 @@ public class SclParser {
children.add(
new BdaInt8U(
new ObjectReference(reportObjRef.toString() + ".SqNum"), fc, "", false, false));
new ObjectReference(reportObjRef + ".SqNum"), fc, "", false, false));
children.add(trigOps);
BdaInt32U intgPd =
new BdaInt32U(
new ObjectReference(reportObjRef.toString() + ".IntgPd"), fc, "", false, false);
new ObjectReference(reportObjRef + ".IntgPd"), fc, "", false, false);
attribute = xmlNode.getAttributes().getNamedItem("intgPd");
if (attribute != null) {
intgPd.setValue(Long.parseLong(attribute.getNodeValue()));
@ -659,19 +800,19 @@ public class SclParser {
children.add(
new BdaBoolean(
new ObjectReference(reportObjRef.toString() + ".GI"), fc, "", false, false));
new ObjectReference(reportObjRef + ".GI"), fc, "", false, false));
Rcb rcb = null;
Rcb rcb;
if (fc == Fc.BR) {
children.add(
new BdaBoolean(
new ObjectReference(reportObjRef.toString() + ".PurgeBuf"), fc, "", false, false));
new ObjectReference(reportObjRef + ".PurgeBuf"), fc, "", false, false));
children.add(
new BdaOctetString(
new ObjectReference(reportObjRef.toString() + ".EntryID"),
new ObjectReference(reportObjRef + ".EntryID"),
fc,
"",
8,
@ -680,7 +821,7 @@ public class SclParser {
children.add(
new BdaEntryTime(
new ObjectReference(reportObjRef.toString() + ".TimeOfEntry"),
new ObjectReference(reportObjRef + ".TimeOfEntry"),
fc,
"",
false,
@ -689,19 +830,19 @@ public class SclParser {
if (useResvTmsAttributes) {
children.add(
new BdaInt16(
new ObjectReference(reportObjRef.toString() + ".ResvTms"), fc, "", false, false));
new ObjectReference(reportObjRef + ".ResvTms"), fc, "", false, false));
}
children.add(
new BdaOctetString(
new ObjectReference(reportObjRef.toString() + ".Owner"), fc, "", 64, false, false));
new ObjectReference(reportObjRef + ".Owner"), fc, "", 64, false, false));
rcb = new Brcb(reportObjRef, children);
} else {
children.add(
new BdaOctetString(
new ObjectReference(reportObjRef.toString() + ".Owner"), fc, "", 64, false, false));
new ObjectReference(reportObjRef + ".Owner"), fc, "", 64, false, false));
rcb = new Urcb(reportObjRef, children);
}
@ -713,7 +854,7 @@ public class SclParser {
}
private List<FcDataObject> createFcDataObjects(
String name, String parentRef, String doTypeID, Node doiNode) throws SclParseException {
String name, String parentRef, String doTypeID, Node doiNode, String type) throws SclParseException {
DoType doType = typeDefinitions.getDOType(doTypeID);
@ -723,6 +864,10 @@ public class SclParser {
String ref = parentRef + '.' + name;
String cdc = doType.getCdc();
cdcDOMap.put(ref, cdc);
List<ModelNode> childNodes = new ArrayList<>();
for (Da dattr : doType.das) {
@ -730,10 +875,22 @@ public class SclParser {
// look for DAI node with the name of the DA
Node iNodeFound = findINode(doiNode, dattr.getName());
if (iNodeFound != null) {
NamedNodeMap daiAttributes = iNodeFound.getAttributes();
if (daiAttributes != null) {
Node nameAttribute = daiAttributes.getNamedItem("name");
Node cdcAttribute = daiAttributes.getNamedItem("desc");
if (cdcAttribute != null) {
daiDescMap.put(ref + "." + nameAttribute.getNodeValue(), cdcAttribute.getNodeValue());
}
}
}
if (dattr.getCount() >= 1) {
childNodes.add(createArrayOfDataAttributes(ref + '.' + dattr.getName(), dattr, iNodeFound));
} else {
childNodes.add(
FcModelNode fcModelNode =
createDataAttribute(
ref + '.' + dattr.getName(),
dattr.getFc(),
@ -741,7 +898,12 @@ public class SclParser {
iNodeFound,
false,
false,
false));
false
);
fcModelNode.setbType(dattr.getbType());
fcModelNode.setDaType(dattr.getType());
childNodes.add(fcModelNode);
}
}
@ -755,7 +917,7 @@ public class SclParser {
Node iNodeFound = findINode(doiNode, sdo.getName());
childNodes.addAll(createFcDataObjects(sdo.getName(), ref, sdo.getType(), iNodeFound));
childNodes.addAll(createFcDataObjects(sdo.getName(), ref, sdo.getType(), iNodeFound, type));
}
Map<Fc, List<FcModelNode>> subFCDataMap = new LinkedHashMap<>();
@ -773,7 +935,10 @@ public class SclParser {
for (Fc fc : Fc.values()) {
if (subFCDataMap.get(fc).size() > 0) {
fcDataObjects.add(new FcDataObject(objectReference, fc, subFCDataMap.get(fc)));
FcDataObject fcDataObject = new FcDataObject(objectReference, fc, subFCDataMap.get(fc));
fcDataObject.setDoType(type);
fcDataObject.setCdc(cdc);
fcDataObjects.add(fcDataObject);
}
}
@ -821,7 +986,9 @@ public class SclParser {
return new Array(new ObjectReference(ref), fc, arrayItems);
}
/** returns a ConstructedDataAttribute or BasicDataAttribute */
/**
* returns a ConstructedDataAttribute or BasicDataAttribute
*/
private FcModelNode createDataAttribute(
String ref,
Fc fc,
@ -853,8 +1020,11 @@ public class SclParser {
Node iNodeFound = findINode(iXmlNode, bda.getName());
subDataAttributes.add(
createDataAttribute(ref + '.' + bda.getName(), fc, bda, iNodeFound, dchg, dupd, qchg));
FcModelNode fcModelNode = createDataAttribute(ref + '.' + bda.getName(), fc, bda, iNodeFound, dchg, dupd, qchg);
fcModelNode.setDaType(bda.getType());
fcModelNode.setbType(bda.getbType());
subDataAttributes.add(fcModelNode);
}
return new ConstructedDataAttribute(new ObjectReference(ref), fc, subDataAttributes);
}
@ -1057,7 +1227,7 @@ public class SclParser {
BdaTimestamp bda = new BdaTimestamp(new ObjectReference(ref), fc, sAddr, dchg, dupd);
if (val != null) {
// TODO
throw new SclParseException("parsing configured value for TIMESTAMP is not supported yet.");
bda.setDate(new Date(System.currentTimeMillis()));
}
return bda;
} else if (bType.equals("Enum")) {

@ -17,13 +17,8 @@ import com.beanit.iec61850bean.internal.mms.asn1.AlternateAccessSelection;
import com.beanit.iec61850bean.internal.mms.asn1.ObjectName;
import com.beanit.iec61850bean.internal.mms.asn1.ObjectName.DomainSpecific;
import com.beanit.iec61850bean.internal.mms.asn1.VariableDefs;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
public final class ServerModel extends ModelNode {
@ -32,6 +27,19 @@ public final class ServerModel extends ModelNode {
private final Map<String, Urcb> urcbs = new HashMap<>();
private final Map<String, Brcb> brcbs = new HashMap<>();
private ConnectionParam connectionParam;
private String iedName;
private String iedManufacturer;
private List<String> ldsInsts;
private List<String> ldsRefs;
private List<String> lnsRefs;
private Map<String, Set<String>> lns;
private HashSet<String> lnS;
private Map<String, String> descriptions;
private Map<String,String> dAIDescriptions;
private Map<String, String> dos;
private List<LogicalDevice> logicalDevices;
public ServerModel(List<LogicalDevice> logicalDevices, Collection<DataSet> dataSets) {
children = new LinkedHashMap<>();
objectReference = null;
@ -397,4 +405,100 @@ public final class ServerModel extends ModelNode {
((Array) modelNode).getChild(altAccIt.getSelectAccess().getIndex().intValue());
}
}
public ConnectionParam getConnectionParam() {
return connectionParam;
}
public void setConnectionParam(ConnectionParam connectionParam) {
this.connectionParam = connectionParam;
}
public String getIedName() {
return iedName;
}
public void setIedName(String iedName) {
this.iedName = iedName;
}
public String getIedManufacturer() {
return iedManufacturer;
}
public void setIedManufacturer(String iedManufacturer) {
this.iedManufacturer = iedManufacturer;
}
public List<String> getLdsInsts() {
return ldsInsts;
}
public void setLdsInsts(List<String> ldsInsts) {
this.ldsInsts = ldsInsts;
}
public List<String> getLdsRefs() {
return ldsRefs;
}
public void setLdsRefs(List<String> ldsRefs) {
this.ldsRefs = ldsRefs;
}
public List<String> getLnsRefs() {
return lnsRefs;
}
public void setLnsRefs(List<String> lnsRefs) {
this.lnsRefs = lnsRefs;
}
public Map<String, Set<String>> getLns() {
return lns;
}
public void setLns(Map<String, Set<String>> lns) {
this.lns = lns;
}
public HashSet<String> getLnS() {
return lnS;
}
public void setLnS(HashSet<String> lnS) {
this.lnS = lnS;
}
public Map<String, String> getDescriptions() {
return descriptions;
}
public void setDescriptions(Map<String, String> descriptions) {
this.descriptions = descriptions;
}
public Map<String, String> getdAIDescriptions() {
return dAIDescriptions;
}
public void setdAIDescriptions(Map<String, String> dAIDescriptions) {
this.dAIDescriptions = dAIDescriptions;
}
public Map<String, String> getDos() {
return dos;
}
public void setDos(Map<String, String> dos) {
this.dos = dos;
}
public List<LogicalDevice> getLogicalDevices() {
return logicalDevices;
}
public void setLogicalDevices(List<LogicalDevice> logicalDevices) {
this.logicalDevices = logicalDevices;
}
}

@ -14,11 +14,12 @@
package com.beanit.iec61850bean.internal.scl;
import com.beanit.iec61850bean.SclParseException;
import java.util.ArrayList;
import java.util.List;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.util.ArrayList;
import java.util.List;
public final class DoType extends AbstractType {
// attributes not needed: cdc, iedType
@ -26,12 +27,16 @@ public final class DoType extends AbstractType {
public List<Da> das = new ArrayList<>();
public List<Sdo> sdos = new ArrayList<>();
private String cdc;
public DoType(Node xmlNode) throws SclParseException {
super(xmlNode);
if (xmlNode.getAttributes().getNamedItem("cdc") == null) {
throw new SclParseException("Required attribute \"cdc\" not found in DOType!");
} else {
cdc = xmlNode.getAttributes().getNamedItem("cdc").getNodeValue();
}
NodeList elements = xmlNode.getChildNodes();
@ -46,4 +51,8 @@ public final class DoType extends AbstractType {
}
}
}
public String getCdc() {
return cdc;
}
}

@ -14,16 +14,18 @@
package com.beanit.iec61850bean.internal.scl;
import com.beanit.iec61850bean.SclParseException;
import java.util.ArrayList;
import java.util.List;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.util.ArrayList;
import java.util.List;
public final class LnType extends AbstractType {
// attributes not needed: lnClass, iedType
public List<Do> dos = new ArrayList<>();
private String lnClass;
public LnType(Node xmlNode) throws SclParseException {
@ -31,6 +33,8 @@ public final class LnType extends AbstractType {
if (xmlNode.getAttributes().getNamedItem("lnClass") == null) {
throw new SclParseException("Required attribute \"lnClass\" not found in LNType!");
} else {
lnClass = xmlNode.getAttributes().getNamedItem("lnClass").getNodeValue();
}
NodeList elements = xmlNode.getChildNodes();
@ -42,4 +46,12 @@ public final class LnType extends AbstractType {
}
}
}
public String getLnClass() {
return lnClass;
}
public void setLnClass(String lnClass) {
this.lnClass = lnClass;
}
}

Loading…
Cancel
Save