diff --git a/examples/server_example_basic_io/simpleIO_direct_control.cid b/examples/server_example_basic_io/simpleIO_direct_control.cid index fcf046b9..a0228a20 100644 --- a/examples/server_example_basic_io/simpleIO_direct_control.cid +++ b/examples/server_example_basic_io/simpleIO_direct_control.cid @@ -42,7 +42,7 @@ - + diff --git a/examples/server_example_basic_io/static_model.c b/examples/server_example_basic_io/static_model.c index 276d60da..0048197d 100644 --- a/examples/server_example_basic_io/static_model.c +++ b/examples/server_example_basic_io/static_model.c @@ -20,7 +20,7 @@ extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3; DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0 = { "GenericIO", false, - "GGIO1$ST$SPCSO1$stVal", + "GGIO1$ST$SPCSO1$stVal", -1, NULL, NULL, @@ -30,7 +30,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0 = { DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { "GenericIO", false, - "GGIO1$ST$SPCSO2$stVal", + "GGIO1$ST$SPCSO2$stVal", -1, NULL, NULL, @@ -40,7 +40,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { "GenericIO", false, - "GGIO1$ST$SPCSO3$stVal", + "GGIO1$ST$SPCSO3$stVal", -1, NULL, NULL, @@ -50,7 +50,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { "GenericIO", false, - "GGIO1$ST$SPCSO4$stVal", + "GGIO1$ST$SPCSO4$stVal", -1, NULL, NULL, @@ -73,7 +73,7 @@ extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3; DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda0 = { "GenericIO", false, - "GGIO1$ST$SPCSO1", + "GGIO1$ST$SPCSO1", -1, NULL, NULL, @@ -83,7 +83,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda0 = { DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1 = { "GenericIO", false, - "GGIO1$ST$SPCSO2", + "GGIO1$ST$SPCSO2", -1, NULL, NULL, @@ -93,7 +93,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1 = { DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2 = { "GenericIO", false, - "GGIO1$ST$SPCSO3", + "GGIO1$ST$SPCSO3", -1, NULL, NULL, @@ -103,7 +103,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2 = { DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3 = { "GenericIO", false, - "GGIO1$ST$SPCSO4", + "GGIO1$ST$SPCSO4", -1, NULL, NULL, @@ -130,7 +130,7 @@ extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda7; DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda0 = { "GenericIO", false, - "GGIO1$MX$AnIn1$mag$f", + "GGIO1$MX$AnIn1$mag$f", -1, NULL, NULL, @@ -140,7 +140,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda0 = { DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda1 = { "GenericIO", false, - "GGIO1$MX$AnIn1$q", + "GGIO1$MX$AnIn1$q", -1, NULL, NULL, @@ -150,7 +150,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda1 = { DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda2 = { "GenericIO", false, - "GGIO1$MX$AnIn2$mag$f", + "GGIO1$MX$AnIn2$mag$f", -1, NULL, NULL, @@ -160,7 +160,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda2 = { DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda3 = { "GenericIO", false, - "GGIO1$MX$AnIn2$q", + "GGIO1$MX$AnIn2$q", -1, NULL, NULL, @@ -170,7 +170,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda3 = { DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda4 = { "GenericIO", false, - "GGIO1$MX$AnIn3$mag$f", + "GGIO1$MX$AnIn3$mag$f", -1, NULL, NULL, @@ -180,7 +180,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda4 = { DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda5 = { "GenericIO", false, - "GGIO1$MX$AnIn3$q", + "GGIO1$MX$AnIn3$q", -1, NULL, NULL, @@ -190,7 +190,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda5 = { DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda6 = { "GenericIO", false, - "GGIO1$MX$AnIn4$mag$f", + "GGIO1$MX$AnIn4$mag$f", -1, NULL, NULL, @@ -200,7 +200,7 @@ DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda6 = { DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda7 = { "GenericIO", false, - "GGIO1$MX$AnIn4$q", + "GGIO1$MX$AnIn4$q", -1, NULL, NULL, @@ -2012,16 +2012,16 @@ extern ReportControlBlock iedModel_GenericIO_LLN0_report7; extern ReportControlBlock iedModel_GenericIO_LLN0_report8; extern ReportControlBlock iedModel_GenericIO_LLN0_report9; -ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report1}; -ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCBPreConf01", "Events1", false, "Events", 1, 24, 175, 50, 1000, {0x4, 0xc0, 0xa8, 0x2, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report2}; -ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsBRCB01", "Events2", true, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report3}; -ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsBRCBPreConf01", "Events2", true, "Events", 1, 24, 175, 50, 1000, {0x4, 0xc0, 0xa8, 0x2, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report4}; -ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report5}; -ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report6}; -ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report7}; -ReportControlBlock iedModel_GenericIO_LLN0_report7 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report8}; -ReportControlBlock iedModel_GenericIO_LLN0_report8 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report9}; -ReportControlBlock iedModel_GenericIO_LLN0_report9 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL}; +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 1, 88, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report1}; +ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsRCBPreConf01", "Events1", false, "Events", 1, 88, 175, 50, 1000, {0x4, 0xc0, 0xa8, 0x2, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report2}; +ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsBRCB01", "Events2", true, "Events", 1, 88, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report3}; +ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsBRCBPreConf01", "Events2", true, "Events", 1, 88, 175, 50, 1000, {0x4, 0xc0, 0xa8, 0x2, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report4}; +ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 88, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report5}; +ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 88, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report6}; +ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 88, 175, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report7}; +ReportControlBlock iedModel_GenericIO_LLN0_report7 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 80, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report8}; +ReportControlBlock iedModel_GenericIO_LLN0_report8 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 80, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, &iedModel_GenericIO_LLN0_report9}; +ReportControlBlock iedModel_GenericIO_LLN0_report9 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 80, 239, 50, 1000, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, NULL}; diff --git a/tools/model_generator/genconfig.jar b/tools/model_generator/genconfig.jar index 6da279bb..5ad24fcb 100644 Binary files a/tools/model_generator/genconfig.jar and b/tools/model_generator/genconfig.jar differ diff --git a/tools/model_generator/genmodel.jar b/tools/model_generator/genmodel.jar index 25fb74df..e2b4f93f 100644 Binary files a/tools/model_generator/genmodel.jar and b/tools/model_generator/genmodel.jar differ diff --git a/tools/model_generator/src/com/libiec61850/scl/model/IED.java b/tools/model_generator/src/com/libiec61850/scl/model/IED.java index 45936a04..a3848e3e 100644 --- a/tools/model_generator/src/com/libiec61850/scl/model/IED.java +++ b/tools/model_generator/src/com/libiec61850/scl/model/IED.java @@ -34,11 +34,14 @@ public class IED { private String name; private List accessPoints; private TypeDeclarations typeDeclarations; + private Node self; public IED(Node iedNode, TypeDeclarations typeDeclarations) throws SclParserException { this.name = ParserUtils.parseAttribute(iedNode, "name"); + self = iedNode; + List accessPointNodes = ParserUtils.getChildNodesWithTag(iedNode, "AccessPoint"); this.accessPoints = new LinkedList(); @@ -76,4 +79,13 @@ public class IED { return accessPoints.get(0); } + public Services getServices() { + Node servicesNode = ParserUtils.getChildNodeWithTag(self, "Services"); + + if (servicesNode != null) { + return new Services(servicesNode); + } + else + return null; + } } diff --git a/tools/model_generator/src/com/libiec61850/scl/model/ReportSettings.java b/tools/model_generator/src/com/libiec61850/scl/model/ReportSettings.java new file mode 100644 index 00000000..0550cb83 --- /dev/null +++ b/tools/model_generator/src/com/libiec61850/scl/model/ReportSettings.java @@ -0,0 +1,51 @@ +package com.libiec61850.scl.model; + +/* + * Copyright 2013-2020 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +import org.w3c.dom.Node; + +import com.libiec61850.scl.ParserUtils; +import com.libiec61850.scl.SclParserException; + +public class ReportSettings { + + private Node self; + + public ReportSettings(Node reportSettingsNode) + { + self = reportSettingsNode; + } + + public boolean hasOwner() + { + try { + Boolean ownerValue = ParserUtils.parseBooleanAttribute(self, "owner"); + + if (ownerValue != null) + return ownerValue.booleanValue(); + else + return false; + } catch (SclParserException e) { + return false; + } + } +} diff --git a/tools/model_generator/src/com/libiec61850/scl/model/Services.java b/tools/model_generator/src/com/libiec61850/scl/model/Services.java new file mode 100644 index 00000000..309a66b5 --- /dev/null +++ b/tools/model_generator/src/com/libiec61850/scl/model/Services.java @@ -0,0 +1,44 @@ +package com.libiec61850.scl.model; + +/* + * Copyright 2013-2020 Michael Zillgith + * + * This file is part of libIEC61850. + * + * libIEC61850 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * libIEC61850 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libIEC61850. If not, see . + * + * See COPYING file for the complete license text. + */ + +import org.w3c.dom.Node; + +import com.libiec61850.scl.ParserUtils; + +public class Services { + + private Node self; + + public Services(Node servicesNode) { + self = servicesNode; + } + + public ReportSettings getReportSettings() + { + Node reportSettingsNode = ParserUtils.getChildNodeWithTag(self, "ReportSettings"); + + if (reportSettingsNode != null) + return new ReportSettings(reportSettingsNode); + return null; + } +} diff --git a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java index b1e04201..44d68303 100644 --- a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java @@ -50,12 +50,15 @@ import com.libiec61850.scl.model.LogControl; import com.libiec61850.scl.model.LogicalDevice; import com.libiec61850.scl.model.LogicalNode; import com.libiec61850.scl.model.ReportControlBlock; +import com.libiec61850.scl.model.ReportSettings; +import com.libiec61850.scl.model.Services; import com.libiec61850.scl.model.SettingControl; public class DynamicModelGenerator { private ConnectedAP connectedAP; private IED ied = null; + private boolean hasOwner = false; public DynamicModelGenerator(InputStream stream, String icdFile, PrintStream output, String iedName, String accessPointName) throws SclParserException { @@ -69,7 +72,17 @@ public class DynamicModelGenerator { if (ied == null) throw new SclParserException("No data model present in SCL file! Exit."); - + + Services services = ied.getServices(); + + if (services != null) { + ReportSettings rptSettings = services.getReportSettings(); + + if (rptSettings != null) { + hasOwner = rptSettings.hasOwner(); + } + } + AccessPoint accessPoint = null; if (accessPointName != null) @@ -257,7 +270,13 @@ public class DynamicModelGenerator { output.print("- "); output.print(rcb.getConfRef() + " "); - output.print(rcb.getTriggerOptions().getIntValue() + " "); + + int triggerOptions = rcb.getTriggerOptions().getIntValue(); + + if (hasOwner) + triggerOptions += 64; + + output.print(triggerOptions + " "); output.print(rcb.getOptionFields().getIntValue() + " "); diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index 18460784..c17b86a4 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -60,9 +60,11 @@ import com.libiec61850.scl.model.LogControl; import com.libiec61850.scl.model.LogicalDevice; import com.libiec61850.scl.model.LogicalNode; import com.libiec61850.scl.model.ReportControlBlock; +import com.libiec61850.scl.model.ReportSettings; import com.libiec61850.scl.model.RptEnabled; import com.libiec61850.scl.model.SampledValueControl; import com.libiec61850.scl.model.Server; +import com.libiec61850.scl.model.Services; import com.libiec61850.scl.model.SettingControl; import com.libiec61850.scl.model.TriggerOptions; @@ -113,6 +115,8 @@ public class StaticModelGenerator { private boolean initializeOnce; private SclParser sclParser; + + private boolean hasOwner = false; public StaticModelGenerator(InputStream stream, String icdFile, PrintStream cOut, PrintStream hOut, String outputFileName, String iedName, String accessPointName, String modelPrefix, @@ -162,6 +166,16 @@ public class StaticModelGenerator { if (ied == null) System.out.println("IED model not found in SCL file! Exit."); + + Services services = ied.getServices(); + + if (services != null) { + ReportSettings rptSettings = services.getReportSettings(); + + if (rptSettings != null) { + hasOwner = rptSettings.hasOwner(); + } + } accessPoint = null; @@ -1422,6 +1436,9 @@ public class StaticModelGenerator { if (rcb.getTriggerOptions() != null) triggerOps = rcb.getTriggerOptions().getIntValue(); + + if (hasOwner) + triggerOps += 64; rcbString += triggerOps + ", ";