From 1d622707302fbcc77ee82c6d557353e83a23211d Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 17 Aug 2023 16:45:31 +0100 Subject: [PATCH] - Config file generator: support multiple access points for GOOSE and SMV control blocks (LIB61850-418) --- .../src/com/libiec61850/scl/SclParser.java | 19 +++++++++++++++++++ .../tools/DynamicModelGenerator.java | 15 +++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/tools/model_generator/src/com/libiec61850/scl/SclParser.java b/tools/model_generator/src/com/libiec61850/scl/SclParser.java index a606b27f..676d1507 100644 --- a/tools/model_generator/src/com/libiec61850/scl/SclParser.java +++ b/tools/model_generator/src/com/libiec61850/scl/SclParser.java @@ -291,6 +291,25 @@ public class SclParser SclParser sclParser = new SclParser(stream); } + public List getConnectedAPs() + { + List aps = new LinkedList(); + + if (communication != null) { + List subNetworks = communication.getSubNetworks(); + + for (SubNetwork subNetwork : subNetworks) { + List connectedAPs = subNetwork.getConnectedAPs(); + + for (ConnectedAP connectedAP : connectedAPs) { + aps.add(connectedAP); + } + } + } + + return aps; + } + public ConnectedAP getConnectedAP(IED ied, String accessPointName) { communication = this.getCommunication(); diff --git a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java index 516b200e..4252f032 100644 --- a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java @@ -61,6 +61,7 @@ public class DynamicModelGenerator { private ConnectedAP connectedAP; private IED ied = null; private boolean hasOwner = false; + private List connectedAPs; public DynamicModelGenerator(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName) throws SclParserException { @@ -96,6 +97,8 @@ public class DynamicModelGenerator { throw new SclParserException("No valid access point found!"); this.connectedAP = sclParser.getConnectedAP(ied, accessPoint.getName()); + + this.connectedAPs = sclParser.getConnectedAPs(); List logicalDevices = accessPoint.getServer().getLogicalDevices(); @@ -175,6 +178,18 @@ public class DynamicModelGenerator { if (connectedAP != null) { smv = connectedAP.lookupSMV(ld.getInst(), svcb.getName()); + if (smv == null) + System.out.println("ConnectedAP not found for SMV"); + + if (smv == null) { + for (ConnectedAP ap : connectedAPs) { + smv = ap.lookupSMV(ld.getInst(), svcb.getName()); + + if (smv != null) + break; + } + } + if (smv != null) smvAddress = smv.getAddress(); }