From 5547adf8538fd31750c1ab888665987aa0175f97 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 10 Apr 2015 15:37:26 +0200 Subject: [PATCH] - added support for multiple data models in static model generator --- examples/server_example3/static_model.c | 259 ++++-------------- tools/model_generator/genmodel.jar | Bin 74059 -> 74555 bytes .../tools/StaticModelGenerator.java | 117 +++++--- 3 files changed, 139 insertions(+), 237 deletions(-) diff --git a/examples/server_example3/static_model.c b/examples/server_example3/static_model.c index f0428e1..d302aeb 100644 --- a/examples/server_example3/static_model.c +++ b/examples/server_example3/static_model.c @@ -3,194 +3,51 @@ * * automatically generated from simpleIO_direct_control.icd */ -#include -#include "iec61850_model.h" +#include "static_model.h" -extern IedModel iedModel; static void initializeValues(); -extern LogicalDevice iedModel_GenericIO; -extern LogicalNode iedModel_GenericIO_LLN0; -extern DataObject iedModel_GenericIO_LLN0_Mod; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_q; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_t; -extern DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel; -extern DataObject iedModel_GenericIO_LLN0_Beh; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_q; -extern DataAttribute iedModel_GenericIO_LLN0_Beh_t; -extern DataObject iedModel_GenericIO_LLN0_Health; -extern DataAttribute iedModel_GenericIO_LLN0_Health_stVal; -extern DataAttribute iedModel_GenericIO_LLN0_Health_q; -extern DataAttribute iedModel_GenericIO_LLN0_Health_t; -extern DataObject iedModel_GenericIO_LLN0_NamPlt; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_d; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_GenericIO_LPHD1; -extern DataObject iedModel_GenericIO_LPHD1_PhyNam; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor; -extern DataObject iedModel_GenericIO_LPHD1_PhyHealth; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t; -extern DataObject iedModel_GenericIO_LPHD1_Proxy; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_q; -extern DataAttribute iedModel_GenericIO_LPHD1_Proxy_t; -extern LogicalNode iedModel_GenericIO_GGIO1; -extern DataObject iedModel_GenericIO_GGIO1_Mod; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_t; -extern DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel; -extern DataObject iedModel_GenericIO_GGIO1_Beh; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Beh_t; -extern DataObject iedModel_GenericIO_GGIO1_Health; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Health_t; -extern DataObject iedModel_GenericIO_GGIO1_NamPlt; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev; -extern DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d; -extern DataObject iedModel_GenericIO_GGIO1_AnIn1; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn2; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn3; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t; -extern DataObject iedModel_GenericIO_GGIO1_AnIn4; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO1; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO2; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO3; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t; -extern DataObject iedModel_GenericIO_GGIO1_SPCSO4; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel; -extern DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind1; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind1_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind2; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind2_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind3; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind3_t; -extern DataObject iedModel_GenericIO_GGIO1_Ind4; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q; -extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t; -extern DataSet ds_GenericIO_LLN0_Events; -extern DataSet ds_GenericIO_LLN0_Events2; -extern DataSet ds_GenericIO_LLN0_Measurements; +extern DataSet iedModelds_GenericIO_LLN0_Events; +extern DataSet iedModelds_GenericIO_LLN0_Events2; +extern DataSet iedModelds_GenericIO_LLN0_Measurements; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_Events_fcda3; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3; -DataSetEntry ds_GenericIO_LLN0_Events_fcda0 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda0 = { "GenericIO", false, "GGIO1$ST$SPCSO1$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda1 + &iedModelds_GenericIO_LLN0_Events_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { "GenericIO", false, "GGIO1$ST$SPCSO2$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda2 + &iedModelds_GenericIO_LLN0_Events_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { "GenericIO", false, "GGIO1$ST$SPCSO3$stVal", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events_fcda3 + &iedModelds_GenericIO_LLN0_Events_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { "GenericIO", false, "GGIO1$ST$SPCSO4$stVal", @@ -200,50 +57,50 @@ DataSetEntry ds_GenericIO_LLN0_Events_fcda3 = { NULL }; -DataSet ds_GenericIO_LLN0_Events = { +DataSet iedModelds_GenericIO_LLN0_Events = { "GenericIO", "LLN0$Events", 4, - &ds_GenericIO_LLN0_Events_fcda0, - &ds_GenericIO_LLN0_Events2 + &iedModelds_GenericIO_LLN0_Events_fcda0, + &iedModelds_GenericIO_LLN0_Events2 }; -extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_Events2_fcda3; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3; -DataSetEntry ds_GenericIO_LLN0_Events2_fcda0 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda0 = { "GenericIO", false, "GGIO1$ST$SPCSO1", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events2_fcda1 + &iedModelds_GenericIO_LLN0_Events2_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_Events2_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1 = { "GenericIO", false, "GGIO1$ST$SPCSO2", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events2_fcda2 + &iedModelds_GenericIO_LLN0_Events2_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_Events2_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2 = { "GenericIO", false, "GGIO1$ST$SPCSO3", -1, NULL, NULL, - &ds_GenericIO_LLN0_Events2_fcda3 + &iedModelds_GenericIO_LLN0_Events2_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_Events2_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3 = { "GenericIO", false, "GGIO1$ST$SPCSO4", @@ -253,94 +110,94 @@ DataSetEntry ds_GenericIO_LLN0_Events2_fcda3 = { NULL }; -DataSet ds_GenericIO_LLN0_Events2 = { +DataSet iedModelds_GenericIO_LLN0_Events2 = { "GenericIO", "LLN0$Events2", 4, - &ds_GenericIO_LLN0_Events2_fcda0, - &ds_GenericIO_LLN0_Measurements + &iedModelds_GenericIO_LLN0_Events2_fcda0, + &iedModelds_GenericIO_LLN0_Measurements }; -extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda0; -extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda1; -extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda2; -extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda3; -extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda4; -extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda5; -extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda6; -extern DataSetEntry ds_GenericIO_LLN0_Measurements_fcda7; +extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda0; +extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda1; +extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda2; +extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda3; +extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda4; +extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda5; +extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda6; +extern DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda7; -DataSetEntry ds_GenericIO_LLN0_Measurements_fcda0 = { +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda0 = { "GenericIO", false, "GGIO1$MX$AnIn1$mag$f", -1, NULL, NULL, - &ds_GenericIO_LLN0_Measurements_fcda1 + &iedModelds_GenericIO_LLN0_Measurements_fcda1 }; -DataSetEntry ds_GenericIO_LLN0_Measurements_fcda1 = { +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda1 = { "GenericIO", false, "GGIO1$MX$AnIn1$q", -1, NULL, NULL, - &ds_GenericIO_LLN0_Measurements_fcda2 + &iedModelds_GenericIO_LLN0_Measurements_fcda2 }; -DataSetEntry ds_GenericIO_LLN0_Measurements_fcda2 = { +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda2 = { "GenericIO", false, "GGIO1$MX$AnIn2$mag$f", -1, NULL, NULL, - &ds_GenericIO_LLN0_Measurements_fcda3 + &iedModelds_GenericIO_LLN0_Measurements_fcda3 }; -DataSetEntry ds_GenericIO_LLN0_Measurements_fcda3 = { +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda3 = { "GenericIO", false, "GGIO1$MX$AnIn2$q", -1, NULL, NULL, - &ds_GenericIO_LLN0_Measurements_fcda4 + &iedModelds_GenericIO_LLN0_Measurements_fcda4 }; -DataSetEntry ds_GenericIO_LLN0_Measurements_fcda4 = { +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda4 = { "GenericIO", false, "GGIO1$MX$AnIn3$mag$f", -1, NULL, NULL, - &ds_GenericIO_LLN0_Measurements_fcda5 + &iedModelds_GenericIO_LLN0_Measurements_fcda5 }; -DataSetEntry ds_GenericIO_LLN0_Measurements_fcda5 = { +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda5 = { "GenericIO", false, "GGIO1$MX$AnIn3$q", -1, NULL, NULL, - &ds_GenericIO_LLN0_Measurements_fcda6 + &iedModelds_GenericIO_LLN0_Measurements_fcda6 }; -DataSetEntry ds_GenericIO_LLN0_Measurements_fcda6 = { +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda6 = { "GenericIO", false, "GGIO1$MX$AnIn4$mag$f", -1, NULL, NULL, - &ds_GenericIO_LLN0_Measurements_fcda7 + &iedModelds_GenericIO_LLN0_Measurements_fcda7 }; -DataSetEntry ds_GenericIO_LLN0_Measurements_fcda7 = { +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda7 = { "GenericIO", false, "GGIO1$MX$AnIn4$q", @@ -350,11 +207,11 @@ DataSetEntry ds_GenericIO_LLN0_Measurements_fcda7 = { NULL }; -DataSet ds_GenericIO_LLN0_Measurements = { +DataSet iedModelds_GenericIO_LLN0_Measurements = { "GenericIO", "LLN0$Measurements", 8, - &ds_GenericIO_LLN0_Measurements_fcda0, + &iedModelds_GenericIO_LLN0_Measurements_fcda0, NULL }; @@ -2101,7 +1958,7 @@ ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, IedModel iedModel = { "simpleIO", &iedModel_GenericIO, - &ds_GenericIO_LLN0_Events, + &iedModelds_GenericIO_LLN0_Events, &iedModel_GenericIO_LLN0_report0, NULL, NULL, diff --git a/tools/model_generator/genmodel.jar b/tools/model_generator/genmodel.jar index 6a85ad76ee911293254d551d86a27fd059ff4658..717c721fc6d3e060fa1dfd033c998dc1e43408e0 100644 GIT binary patch delta 14223 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 diff --git a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java index 4a52edf..c35b839 100644 --- a/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/StaticModelGenerator.java @@ -84,8 +84,14 @@ public class StaticModelGenerator { private IED ied; private AccessPoint accessPoint; + private String outputFileName; + private String hDefineName; + private String modelPrefix; + private boolean initializeOnce; + public StaticModelGenerator(InputStream stream, String icdFile, PrintStream cOut, PrintStream hOut, - String iedName, String accessPointName) throws SclParserException + String outputFileName, String iedName, String accessPointName, String modelPrefix, + boolean initializeOnce) throws SclParserException { this.cOut = cOut; this.hOut = hOut; @@ -100,6 +106,16 @@ public class StaticModelGenerator { SclParser sclParser = new SclParser(stream); + this.outputFileName = outputFileName; + this.hDefineName = outputFileName.toUpperCase().replace( '.', '_' ).replace( '-', '_' ) + "_H_"; + this.modelPrefix = modelPrefix; + this.initializeOnce = initializeOnce; + + if( hDefineName.lastIndexOf( '/' ) >= 0 ) + { + hDefineName = hDefineName.substring( hDefineName.lastIndexOf( '/' ) + 1 ); + } + ied = null; if (iedName == null) @@ -147,17 +163,18 @@ public class StaticModelGenerator { public static void main(String[] args) throws FileNotFoundException { if (args.length < 1) { - System.out.println("Usage: genmodel [-ied ] [-ap ]"); + System.out.println("Usage: genmodel [-ied ] [-ap ] [-out ] [-modelprefix ]"); System.exit(1); } String icdFile = args[0]; - String defaultCFileName = "static_model.c"; - String defaultHFileName = "static_model.h"; + String outputFileName = "static_model"; String accessPointName = null; String iedName = null; + String modelPrefix = "iedModel"; + boolean initializeOnce = false; if (args.length > 1) { for (int i = 1; i < args.length; i++) { @@ -175,6 +192,28 @@ public class StaticModelGenerator { i++; + } + else if (args[i].equals("-out")) { + outputFileName = args[i+1]; + + System.out.println("Select Output File " + outputFileName); + + i++; + + } + else if (args[i].equals("-modelprefix")) { + modelPrefix = args[i+1]; + + System.out.println("Select Model Prefix " + modelPrefix); + + i++; + + } + else if (args[i].equals("-initializeonce")) { + initializeOnce = true; + + System.out.println("Select Initialize Once"); + } else { System.out.println("Unknown option: \"" + args[i] + "\""); @@ -183,13 +222,14 @@ public class StaticModelGenerator { } - PrintStream cOutStream = new PrintStream(new FileOutputStream(new File(defaultCFileName))); - PrintStream hOutStream = new PrintStream(new FileOutputStream(new File(defaultHFileName))); + PrintStream cOutStream = new PrintStream(new FileOutputStream(new File(outputFileName + ".c"))); + PrintStream hOutStream = new PrintStream(new FileOutputStream(new File(outputFileName + ".h"))); + System.out.println("Select ICD File " + icdFile); InputStream stream = new FileInputStream(icdFile); try { - new StaticModelGenerator(stream, icdFile, cOutStream, hOutStream, iedName, accessPointName); + new StaticModelGenerator(stream, icdFile, cOutStream, hOutStream, outputFileName, iedName, accessPointName, modelPrefix, initializeOnce); } catch (SclParserException e) { System.err.println("ERROR: " + e.getMessage()); } @@ -199,8 +239,8 @@ public class StaticModelGenerator { hOut.println("\n\n"); for (String variableName : variablesList) { - String name = variableName.substring(8); - hOut.println("#define IEDMODEL" + name + " (&" + variableName + ")"); + String name = modelPrefix.toUpperCase() + variableName.substring( modelPrefix.length() ); + hOut.println("#define " + name + " (&" + variableName + ")"); } } @@ -233,7 +273,7 @@ public class StaticModelGenerator { LogicalDevice logicalDevice = logicalDevices.get(i); - String ldName = "iedModel_" + logicalDevice.getInst(); + String ldName = modelPrefix + "_" + logicalDevice.getInst(); variablesList.add(ldName); @@ -245,10 +285,10 @@ public class StaticModelGenerator { cOut.println(" \"" + logicalDeviceName + "\","); - cOut.println(" (ModelNode*) &iedModel,"); + cOut.println(" (ModelNode*) &" + modelPrefix + ","); if (i < (logicalDevices.size() - 1)) - cOut.println(" (ModelNode*) &iedModel_" + logicalDevices.get(i + 1).getInst() + ","); + cOut.println(" (ModelNode*) &" + modelPrefix + "_" + logicalDevices.get(i + 1).getInst() + ","); else cOut.println(" NULL,"); @@ -279,9 +319,9 @@ public class StaticModelGenerator { cOut.println(settingGroupControlBlocks); String firstLogicalDeviceName = logicalDevices.get(0).getInst(); - cOut.println("\nIedModel iedModel = {"); + cOut.println("\nIedModel " + modelPrefix + " = {"); cOut.println(" \"" + ied.getName() + "\","); - cOut.println(" &iedModel_" + firstLogicalDeviceName + ","); + cOut.println(" &" + modelPrefix + "_" + firstLogicalDeviceName + ","); if (dataSetNames.size() > 0) cOut.println(" &" + dataSetNames.get(0) + ","); @@ -318,7 +358,7 @@ public class StaticModelGenerator { int gseCount = 0; for (GSEControl gse : goCBs) { - String gcbVariableName = "iedModel_" + ldName + "_" + ln.getName() + "_gse" + gseCount; + String gcbVariableName = modelPrefix + "_" + ldName + "_" + ln.getName() + "_gse" + gseCount; gseVariableNames.add(gcbVariableName); gseCount++; } @@ -346,7 +386,7 @@ public class StaticModelGenerator { maxInstances = rcb.getRptEna().getMaxInstances(); for (int i = 0; i < maxInstances; i++) { - String rcbVariableName = "iedModel_" + ldName + "_" + ln.getName() + "_report" + rcbCount; + String rcbVariableName = modelPrefix + "_" + ldName + "_" + ln.getName() + "_report" + rcbCount; rcbVariableNames.add(rcbVariableName); rcbCount++; } @@ -367,7 +407,7 @@ public class StaticModelGenerator { for (SettingControl sgcb : sgcbs) { - String sgcbVariableName = "iedModel_" + ldName + "_" + ln.getName() + "_sgcb"; + String sgcbVariableName = modelPrefix + "_" + ldName + "_" + ln.getName() + "_sgcb"; sgcbVariableNames.add(sgcbVariableName); @@ -467,7 +507,7 @@ public class StaticModelGenerator { if (dataAttribute.getFc() == FunctionalConstraint.SE) { - if (daName.startsWith("iedModel_SE_") == false) + if (daName.startsWith(modelPrefix + "_SE_") == false) daName = daName.substring(0, 9) + "SE_" + daName.substring(9); } @@ -484,7 +524,7 @@ public class StaticModelGenerator { String siblingDoName = doName; if (sibling.getFc() == FunctionalConstraint.SE) { - if (siblingDoName.startsWith("iedModel_SE_") == false) + if (siblingDoName.startsWith(modelPrefix + "_SE_") == false) siblingDoName = siblingDoName.substring(0, 9) + "SE_" + siblingDoName.substring(9); } @@ -564,6 +604,12 @@ public class StaticModelGenerator { StringBuffer buffer = this.initializerBuffer; buffer.append("\n"); + if( initializeOnce ) + { + buffer.append("if (!"); + buffer.append(daName); + buffer.append(".mmsValue)\n"); + } buffer.append(daName); buffer.append(".mmsValue = "); @@ -612,20 +658,17 @@ public class StaticModelGenerator { private void printForwardDeclarations(Server server) { - cOut.println("extern IedModel iedModel;"); cOut.println("static void initializeValues();"); - hOut.println("extern IedModel iedModel;"); + hOut.println("extern IedModel " + modelPrefix + ";"); for (LogicalDevice logicalDevice : server.getLogicalDevices()) { - String ldName = "iedModel_" + logicalDevice.getInst(); + String ldName = modelPrefix + "_" + logicalDevice.getInst(); - cOut.println("extern LogicalDevice " + ldName + ";"); hOut.println("extern LogicalDevice " + ldName + ";"); for (LogicalNode logicalNode : logicalDevice.getLogicalNodes()) { String lnName = ldName + "_" + logicalNode.getName(); - cOut.println("extern LogicalNode " + lnName + ";"); hOut.println("extern LogicalNode " + lnName + ";"); printDataObjectForwardDeclarations(lnName, logicalNode.getDataObjects()); @@ -638,7 +681,6 @@ public class StaticModelGenerator { for (DataObject dataObject : dataObjects) { String doName = prefix + "_" + dataObject.getName(); - cOut.println("extern DataObject " + doName + ";"); hOut.println("extern DataObject " + doName + ";"); if (dataObject.getSubDataObjects() != null) { @@ -655,11 +697,10 @@ public class StaticModelGenerator { if (dataAttribute.getFc() == FunctionalConstraint.SE) { - if (daName.startsWith("iedModel_SE_") == false) + if (daName.startsWith(modelPrefix + "_SE_") == false) daName = daName.substring(0, 9) + "SE_" + daName.substring(9); } - cOut.println("extern DataAttribute " + daName + ";"); hOut.println("extern DataAttribute " + daName + ";"); if (dataAttribute.getSubDataAttributes() != null) @@ -669,24 +710,28 @@ public class StaticModelGenerator { private void printCFileHeader(String filename) { + String include = outputFileName + ".h\""; + if( include.lastIndexOf( '/' ) >= 0 ) { + include = include.substring( include.lastIndexOf( '/' ) + 1 ); + } + cOut.println("/*"); - cOut.println(" * static_model.c"); + cOut.println(" * " + outputFileName + ".c"); cOut.println(" *"); cOut.println(" * automatically generated from " + filename); cOut.println(" */"); - cOut.println("#include "); - cOut.println("#include \"iec61850_model.h\""); + cOut.println("#include \"" + include); cOut.println(); } private void printHeaderFileHeader(String filename) { hOut.println("/*"); - hOut.println(" * static_model.h"); + hOut.println(" * " + outputFileName + ".h"); hOut.println(" *"); hOut.println(" * automatically generated from " + filename); hOut.println(" */\n"); - hOut.println("#ifndef STATIC_MODEL_H_"); - hOut.println("#define STATIC_MODEL_H_\n"); + hOut.println("#ifndef " + hDefineName); + hOut.println("#define " + hDefineName + "\n"); hOut.println("#include "); hOut.println("#include \"iec61850_model.h\""); hOut.println(); @@ -694,7 +739,7 @@ public class StaticModelGenerator { private void printHeaderFileFooter() { hOut.println(); - hOut.println("#endif /* STATIC_MODEL_H_ */\n"); + hOut.println("#endif /* " + hDefineName + " */\n"); } private void printGSEControlBlocks(String ldName, String lnPrefix, LogicalNode logicalNode) { @@ -940,7 +985,7 @@ public class StaticModelGenerator { for (DataSet dataSet : dataSets) { - String dataSetVariableName = "ds_" + logicalDevice.getInst() + "_" + logicalNode.getName() + "_" + dataSet.getName(); + String dataSetVariableName = modelPrefix + "ds_" + logicalDevice.getInst() + "_" + logicalNode.getName() + "_" + dataSet.getName(); dataSetNames.add(dataSetVariableName); } @@ -1033,7 +1078,7 @@ public class StaticModelGenerator { cOut.println("DataSet " + dataSetVariableName + " = {"); - String lnVariableName = "iedModel_" + logicalDevice.getInst() + "_" + logicalNode.getName(); + String lnVariableName = modelPrefix + "_" + logicalDevice.getInst() + "_" + logicalNode.getName(); cOut.println(" \"" + logicalDevice.getInst() + "\","); cOut.println(" \"" + logicalNode.getName() + "$" + dataSet.getName() + "\",");