From 8cfb9d99a0bcfacd4724cd9c7ffa808257b212cc Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 19 Jan 2015 14:29:03 +0100 Subject: [PATCH] - added support for data sets that span multiple logical devices with server configuration file (see feature #271) --- .../vmd-filestore/model.cfg | 3 +- src/doxygen.config | 3 +- src/iec61850/inc/iec61850_dynamic_model.h | 2 +- src/iec61850/inc/iec61850_model.h | 1 + src/iec61850/server/model/dynamic_model.c | 26 ++++++++++++++++-- src/mms/inc/mms_common.h | 22 +++++++++++++++ tools/model_generator/genconfig.jar | Bin 73580 -> 73808 bytes .../tools/DynamicModelGenerator.java | 20 ++++++++++++-- 8 files changed, 67 insertions(+), 10 deletions(-) diff --git a/examples/server_example_config_file/vmd-filestore/model.cfg b/examples/server_example_config_file/vmd-filestore/model.cfg index d0507a1..c50a26d 100644 --- a/examples/server_example_config_file/vmd-filestore/model.cfg +++ b/examples/server_example_config_file/vmd-filestore/model.cfg @@ -1,7 +1,6 @@ MODEL(simpleIO){ LD(GenericIO){ LN(LLN0){ -SG(1 2) DO(Mod 0){ DA(q 0 23 0 2 0); DA(t 0 22 0 0 0); @@ -36,7 +35,7 @@ DE(GGIO1$MX$AnIn2); DE(GGIO1$MX$AnIn3); DE(GGIO1$MX$AnIn4); } -RC(EventsRCB01 - 0 Events 1 8 111 50 1000); +RC(EventsRCB01 Events 0 Events 1 8 111 50 1000); RC(AnalogValuesRCB01 AnalogValues 0 AnalogValues 1 8 111 50 1000); GC(gcbEvents events Events 2 0){ PA(4 111 1000 010ccd010001); diff --git a/src/doxygen.config b/src/doxygen.config index a71d55b..d4b7390 100644 --- a/src/doxygen.config +++ b/src/doxygen.config @@ -219,7 +219,8 @@ INPUT += "iec61850/inc/iec61850_config_file_parser.h" INPUT += "iec61850/inc/iec61850_cdc.h" INPUT += "goose/goose_subscriber.h" INPUT += "mms/inc/mms_device_model.h" -INPUT += "mms/inc/mms_types.h" +INPUT += "mms/inc/mms_types.h" +INPUT += "mms/inc/mms_common.h" INPUT += "mms/inc/mms_server.h" INPUT += "mms/inc/iso_server.h" INPUT += "mms/inc/mms_named_variable_list.h" diff --git a/src/iec61850/inc/iec61850_dynamic_model.h b/src/iec61850/inc/iec61850_dynamic_model.h index 8870158..43d1182 100644 --- a/src/iec61850/inc/iec61850_dynamic_model.h +++ b/src/iec61850/inc/iec61850_dynamic_model.h @@ -238,7 +238,7 @@ DataSetEntry_getNext(DataSetEntry* self); * \return the new data set entry instance */ DataSetEntry* -DataSetEntry_create(DataSet* dataSet, char* variable, int index, char* component); +DataSetEntry_create(DataSet* dataSet, const char* variable, int index, const char* component); /**@}*/ diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index 01d1a1e..a4a091a 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -186,6 +186,7 @@ struct sDataAttribute { typedef struct sDataSetEntry { char* logicalDeviceName; + bool isLDNameDynamicallyAllocated; char* variableName; int index; char* componentName; diff --git a/src/iec61850/server/model/dynamic_model.c b/src/iec61850/server/model/dynamic_model.c index 6e8af66..f536d47 100644 --- a/src/iec61850/server/model/dynamic_model.c +++ b/src/iec61850/server/model/dynamic_model.c @@ -514,11 +514,28 @@ DataSet_addEntry(DataSet* self, DataSetEntry* newEntry) } DataSetEntry* -DataSetEntry_create(DataSet* dataSet, char* variable, int index, char* component) +DataSetEntry_create(DataSet* dataSet, const char* variable, int index, const char* component) { DataSetEntry* self = (DataSetEntry*) GLOBAL_MALLOC(sizeof(DataSetEntry)); - self->variableName = copyString(variable); + char variableName[130]; + + strncpy(variableName, variable, 129); + + char* separator = strchr(variableName, '/'); + + if (separator != NULL) { + *separator = 0; + + self->variableName = copyString(separator + 1); + self->logicalDeviceName = copyString(variableName); + self->isLDNameDynamicallyAllocated = true; + } + else { + self->variableName = copyString(variable); + self->logicalDeviceName = dataSet->logicalDeviceName; + self->isLDNameDynamicallyAllocated = false; + } if (component != NULL) self->componentName = copyString(component); @@ -526,7 +543,7 @@ DataSetEntry_create(DataSet* dataSet, char* variable, int index, char* component self->componentName = NULL; self->index = index; - self->logicalDeviceName = dataSet->logicalDeviceName; + self->sibling = NULL; DataSet_addEntry(dataSet, self); @@ -622,6 +639,9 @@ IedModel_destroy(IedModel* model) GLOBAL_FREEMEM(dse->variableName); + if (dse->isLDNameDynamicallyAllocated) + GLOBAL_FREEMEM(dse->logicalDeviceName); + GLOBAL_FREEMEM(dse); dse = nextDse; diff --git a/src/mms/inc/mms_common.h b/src/mms/inc/mms_common.h index 705b402..495c8d1 100644 --- a/src/mms/inc/mms_common.h +++ b/src/mms/inc/mms_common.h @@ -42,6 +42,13 @@ typedef enum MMS_ERROR, MMS_INITIATE, MMS_CONFIRMED_REQUEST, MMS_OK, MMS_CONCLUDE } MmsIndication; +/** + * \addtogroup common_api_group + */ +/**@{*/ + + + typedef enum { /* generic error codes */ @@ -107,21 +114,33 @@ typedef enum typedef enum ATTRIBUTE_PACKED { + /*! this represents all MMS array types (arrays contain uniform elements) */ MMS_ARRAY = 0, + /*! this represents all complex MMS types (structures) */ MMS_STRUCTURE = 1, + /*! boolean value */ MMS_BOOLEAN = 2, + /*! bit string */ MMS_BIT_STRING = 3, + /*! represents all signed integer types */ MMS_INTEGER = 4, + /*! represents all unsigned integer types */ MMS_UNSIGNED = 5, + /*! represents all float type (32 and 64 bit) */ MMS_FLOAT = 6, + /*! octet string (unstructured bytes) */ MMS_OCTET_STRING = 7, + /*! MMS visible string */ MMS_VISIBLE_STRING = 8, MMS_GENERALIZED_TIME = 9, MMS_BINARY_TIME = 10, MMS_BCD = 11, MMS_OBJ_ID = 12, + /*! MMS unicode string */ MMS_STRING = 13, + /*! MMS UTC time type */ MMS_UTC_TIME = 14, + /*! This represents an error code as returned by MMS read services */ MMS_DATA_ACCESS_ERROR = 15 } MmsType; @@ -146,6 +165,9 @@ typedef struct typedef struct sMmsNamedVariableList* MmsNamedVariableList; typedef struct sMmsAccessSpecifier* MmsNamedVariableListEntry; +/**@}*/ + + #ifdef __cplusplus } #endif diff --git a/tools/model_generator/genconfig.jar b/tools/model_generator/genconfig.jar index 6b33f7477dee229d83f34e3ba0df4b13078ea12e..32b327e78b1d827f4cd54f1c0f65532517caba7f 100644 GIT binary patch delta 20032 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 Wa>eQRHL@gr>0H=IHjx3A4E-OTp@%pC delta 19544 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 T!cE{ns};abOTG+UHmv^x8l}BD diff --git a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java index d2e65a5..03d3cc6 100644 --- a/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java +++ b/tools/model_generator/src/com/libiec61850/tools/DynamicModelGenerator.java @@ -122,7 +122,7 @@ public class DynamicModelGenerator { } for (DataSet dataSet : logicalNode.getDataSets()) - exportDataSet(output, dataSet); + exportDataSet(output, dataSet, logicalNode); for (ReportControlBlock rcb : logicalNode.getReportControlBlocks()) { @@ -217,7 +217,7 @@ public class DynamicModelGenerator { output.println(");"); } - private void exportDataSet(PrintStream output, DataSet dataSet) { + private void exportDataSet(PrintStream output, DataSet dataSet, LogicalNode logicalNode) { output.print("DS(" + dataSet.getName() + "){\n"); for (FunctionalConstraintData fcda : dataSet.getFcda()) { String mmsVariableName = ""; @@ -237,7 +237,21 @@ public class DynamicModelGenerator { if (fcda.getDaName() != null) mmsVariableName += "$" + toMmsString(fcda.getDaName()); - output.print("DE(" + mmsVariableName + ");\n"); + String logicalDeviceName = null; + + if (fcda.getLdInstance() != null) { + + if (!fcda.getLdInstance().equals(logicalNode.getParentLogicalDevice().getInst())) { + logicalDeviceName = fcda.getLdInstance(); + } + } + + + if (logicalDeviceName != null) + output.print("DE(" + logicalDeviceName + "/" + mmsVariableName + ");\n"); + else + output.print("DE(" + mmsVariableName + ");\n"); + } output.println("}"); }