From 3aa01687c54c8ece56654139bef9a3644b1c4f38 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 4 May 2017 11:07:07 +0200 Subject: [PATCH 01/64] - MMS client/server: fixed problem with negative frsmId - some code cleanup --- .../client_example_files.c | 3 + src/mms/asn1/ber_decode.c | 58 ++++++++++++++++++- src/mms/asn1/ber_encoder.c | 27 +++++++++ src/mms/inc_private/ber_decode.h | 3 + src/mms/inc_private/ber_encoder.h | 3 + src/mms/inc_private/mms_server_internal.h | 4 +- src/mms/iso_mms/client/mms_client_files.c | 6 +- src/mms/iso_mms/server/mms_file_service.c | 8 +-- .../iso_mms/server/mms_get_namelist_service.c | 4 +- src/mms/iso_mms/server/mms_identify_service.c | 2 +- .../server/mms_named_variable_list_service.c | 2 +- src/mms/iso_mms/server/mms_server_common.c | 2 +- src/mms/iso_mms/server/mms_status_service.c | 2 +- 13 files changed, 108 insertions(+), 16 deletions(-) diff --git a/examples/iec61850_client_example_files/client_example_files.c b/examples/iec61850_client_example_files/client_example_files.c index 33c6750b..f321f832 100644 --- a/examples/iec61850_client_example_files/client_example_files.c +++ b/examples/iec61850_client_example_files/client_example_files.c @@ -29,6 +29,9 @@ downloadHandler(void* parameter, uint8_t* buffer, uint32_t bytesRead) if (bufferPosition + bytesRead < MAX_BUFFER_SIZE) { memcpy(downloadBuffer + bufferPosition, buffer, bytesRead); + + bufferPosition += bytesRead; + return true; } else diff --git a/src/mms/asn1/ber_decode.c b/src/mms/asn1/ber_decode.c index 7eca9308..4acc260b 100644 --- a/src/mms/asn1/ber_decode.c +++ b/src/mms/asn1/ber_decode.c @@ -70,10 +70,65 @@ BerDecoder_decodeString(uint8_t* buffer, int strlen, int bufPos, int maxBufPos) } uint32_t -BerDecoder_decodeUint32(uint8_t* buffer, int intlen, int bufPos) { +BerDecoder_decodeUint32(uint8_t* buffer, int intLen, int bufPos) +{ uint32_t value = 0; int i; + for (i = 0; i < intLen; i++) { + value <<= 8; + value += buffer[bufPos + i]; + } + + return value; +} + +#if 0 +int32_t +BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos) +{ + int32_t value = 0; + + bool isNegative = ((buffer[bufPos] & 0x80) == 0x80); + + int i = 0; + + if (isNegative) { + for (i = 0; i < 4; i++) { + + value <<= 8; + + if (i < (4 - intlen)) + value += 0xff; + else + value += buffer[bufPos + i - (4 - intlen)]; + } + } + else { + for (i = 0; i < intlen; i++) { + value <<= 8; + value += buffer[bufPos + i]; + } + } + + return value; +} +#endif + +#if 1 +int32_t +BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos) +{ + int32_t value; + int i; + + bool isNegative = ((buffer[bufPos] & 0x80) == 0x80); + + if (isNegative) + value = -1; + else + value = 0; + for (i = 0; i < intlen; i++) { value <<= 8; value += buffer[bufPos + i]; @@ -81,6 +136,7 @@ BerDecoder_decodeUint32(uint8_t* buffer, int intlen, int bufPos) { return value; } +#endif float BerDecoder_decodeFloat(uint8_t* buffer, int bufPos) diff --git a/src/mms/asn1/ber_encoder.c b/src/mms/asn1/ber_encoder.c index 35953c66..49c9b679 100644 --- a/src/mms/asn1/ber_encoder.c +++ b/src/mms/asn1/ber_encoder.c @@ -250,6 +250,33 @@ BerEncoder_encodeUInt32(uint32_t value, uint8_t* buffer, int bufPos) return bufPos; } +int +BerEncoder_encodeInt32(int32_t value, uint8_t* buffer, int bufPos) +{ + uint8_t* valueArray = (uint8_t*) &value; + uint8_t valueBuffer[4]; + + int i; + +#if (ORDER_LITTLE_ENDIAN == 1) + for (i = 0; i < 4; i++) { + valueBuffer[3 - i] = valueArray[i]; + } +#else + for (i = 0; i < 4; i++) { + valueBuffer[i] = valueArray[i]; + } +#endif + + int size = BerEncoder_compressInteger(valueBuffer, 4); + + for (i = 0; i < size; i++) { + buffer[bufPos++] = valueBuffer[i]; + } + + return bufPos; +} + int BerEncoder_encodeUInt32WithTL(uint8_t tag, uint32_t value, uint8_t* buffer, int bufPos) { diff --git a/src/mms/inc_private/ber_decode.h b/src/mms/inc_private/ber_decode.h index 258f6a21..8bdbcc3e 100644 --- a/src/mms/inc_private/ber_decode.h +++ b/src/mms/inc_private/ber_decode.h @@ -34,6 +34,9 @@ BerDecoder_decodeString(uint8_t* buffer, int strlen, int bufPos, int maxBufPos); uint32_t BerDecoder_decodeUint32(uint8_t* buffer, int intlen, int bufPos); +int32_t +BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos); + float BerDecoder_decodeFloat(uint8_t* buffer, int bufPos); diff --git a/src/mms/inc_private/ber_encoder.h b/src/mms/inc_private/ber_encoder.h index 343f54f0..ff4b26d6 100644 --- a/src/mms/inc_private/ber_encoder.h +++ b/src/mms/inc_private/ber_encoder.h @@ -55,6 +55,9 @@ BerEncoder_encodeAsn1PrimitiveValue(uint8_t tag, Asn1PrimitiveValue* value, uint int BerEncoder_encodeUInt32(uint32_t value, uint8_t* buffer, int bufPos); +int +BerEncoder_encodeInt32(int32_t value, uint8_t* buffer, int bufPos); + int BerEncoder_encodeUInt32WithTL(uint8_t tag, uint32_t value, uint8_t* buffer, int bufPos); diff --git a/src/mms/inc_private/mms_server_internal.h b/src/mms/inc_private/mms_server_internal.h index a95579a8..33935012 100644 --- a/src/mms/inc_private/mms_server_internal.h +++ b/src/mms/inc_private/mms_server_internal.h @@ -271,7 +271,7 @@ mmsServer_handleWriteRequest( void mmsServer_handleIdentifyRequest( MmsServerConnection connection, - int invokeId, + uint32_t invokeId, ByteBuffer* response); void @@ -279,7 +279,7 @@ mmsServer_handleStatusRequest( MmsServerConnection connection, uint8_t* requestBuffer, int bufPos, - int invokeId, + uint32_t invokeId, ByteBuffer* response); void diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index a6603ebc..b0e75494 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -212,7 +212,7 @@ mmsClient_handleFileReadRequest( uint32_t invokeId, ByteBuffer* response) { - int32_t frsmId = (int32_t) BerDecoder_decodeUint32(buffer, maxBufPos - bufPos, bufPos); + int32_t frsmId = BerDecoder_decodeInt32(buffer, maxBufPos - bufPos, bufPos); if (DEBUG_MMS_CLIENT) printf("MMS_CLIENT: mmsClient_handleFileReadRequest read request for frsmId: %i\n", frsmId); @@ -232,7 +232,7 @@ mmsClient_handleFileCloseRequest( uint32_t invokeId, ByteBuffer* response) { - int32_t frsmId = (int32_t) BerDecoder_decodeUint32(buffer, maxBufPos - bufPos, bufPos); + int32_t frsmId = BerDecoder_decodeInt32(buffer, maxBufPos - bufPos, bufPos); MmsFileReadStateMachine* frsm = getFrsm(connection, frsmId); @@ -698,7 +698,7 @@ mmsMsg_parseFileOpenResponse(uint8_t* buffer, int bufPos, int maxBufPos, int32_t switch (tag) { case 0x80: /* frsmId */ - *frsmId = (int32_t) BerDecoder_decodeUint32(buffer, length, bufPos); + *frsmId = BerDecoder_decodeInt32(buffer, length, bufPos); bufPos += length; break; diff --git a/src/mms/iso_mms/server/mms_file_service.c b/src/mms/iso_mms/server/mms_file_service.c index 9894e9a6..ead75715 100644 --- a/src/mms/iso_mms/server/mms_file_service.c +++ b/src/mms/iso_mms/server/mms_file_service.c @@ -213,7 +213,7 @@ mmsMsg_createFileOpenResponse(uint32_t invokeId, ByteBuffer* response, char* ful buffer[bufPos++] = 0xbf; bufPos = BerEncoder_encodeTL(0x48, openFileResponseSize, buffer, bufPos); bufPos = BerEncoder_encodeTL(0x80, frsmIdSize - 2, buffer, bufPos); - bufPos = BerEncoder_encodeUInt32(frsm->frsmId, buffer, bufPos); + bufPos = BerEncoder_encodeInt32(frsm->frsmId, buffer, bufPos); bufPos = encodeFileAttributes(0xa1, frsm->fileSize, gtString, buffer, bufPos); response->size = bufPos; @@ -734,7 +734,7 @@ mmsServer_handleFileReadRequest( uint32_t invokeId, ByteBuffer* response) { - int32_t frsmId = (int32_t) BerDecoder_decodeUint32(buffer, maxBufPos - bufPos, bufPos); + int32_t frsmId = BerDecoder_decodeInt32(buffer, maxBufPos - bufPos, bufPos); if (DEBUG_MMS_SERVER) printf("MMS_SERVER: mmsServer_handleFileReadRequest read request for frsmId: %i\n", frsmId); @@ -760,7 +760,7 @@ mmsServer_handleFileCloseRequest( uint32_t invokeId, ByteBuffer* response) { - int32_t frsmId = (int32_t) BerDecoder_decodeUint32(buffer, maxBufPos - bufPos, bufPos); + int32_t frsmId = BerDecoder_decodeInt32(buffer, maxBufPos - bufPos, bufPos); MmsFileReadStateMachine* frsm = getFrsm(connection, frsmId); @@ -923,7 +923,7 @@ createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, int maxPduS bufPos = BerEncoder_encodeTL(0xa1, confirmedResponsePDUSize, buffer, bufPos); bufPos = BerEncoder_encodeTL(0x02, invokeIdSize - 2, buffer, bufPos); - bufPos = BerEncoder_encodeUInt32((uint32_t) invokeId, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); buffer[bufPos++] = 0xbf; bufPos = BerEncoder_encodeTL(0x4d, fileDirectoryResponseSize, buffer, bufPos); diff --git a/src/mms/iso_mms/server/mms_get_namelist_service.c b/src/mms/iso_mms/server/mms_get_namelist_service.c index 4b41f21b..676a1964 100644 --- a/src/mms/iso_mms/server/mms_get_namelist_service.c +++ b/src/mms/iso_mms/server/mms_get_namelist_service.c @@ -330,7 +330,7 @@ getNamedVariableListAssociationSpecific(MmsServerConnection connection) static void createNameListResponse( MmsServerConnection connection, - int invokeId, + uint32_t invokeId, LinkedList nameList, ByteBuffer* response, char* continueAfter) @@ -406,7 +406,7 @@ createNameListResponse( bufPos = BerEncoder_encodeTL(0xa1, confirmedResponsePDUSize, buffer, bufPos); bufPos = BerEncoder_encodeTL(0x02, invokeIdSize - 2, buffer, bufPos); - bufPos = BerEncoder_encodeUInt32((uint32_t) invokeId, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); bufPos = BerEncoder_encodeTL(0xa1, getNameListSize, buffer, bufPos); bufPos = BerEncoder_encodeTL(0xa0, identifierListSize, buffer, bufPos); diff --git a/src/mms/iso_mms/server/mms_identify_service.c b/src/mms/iso_mms/server/mms_identify_service.c index b8ff70b4..0c88007e 100644 --- a/src/mms/iso_mms/server/mms_identify_service.c +++ b/src/mms/iso_mms/server/mms_identify_service.c @@ -29,7 +29,7 @@ void mmsServer_handleIdentifyRequest( MmsServerConnection connection, - int invokeId, + uint32_t invokeId, ByteBuffer* response) { int bufPos = 0; diff --git a/src/mms/iso_mms/server/mms_named_variable_list_service.c b/src/mms/iso_mms/server/mms_named_variable_list_service.c index f82dd629..2a48b02b 100644 --- a/src/mms/iso_mms/server/mms_named_variable_list_service.c +++ b/src/mms/iso_mms/server/mms_named_variable_list_service.c @@ -252,7 +252,7 @@ createDefineNamedVariableListResponse(uint32_t invokeId, ByteBuffer* response) bufPos = BerEncoder_encodeTL(0xa1, confirmedResponsePDUSize, buffer, bufPos); bufPos = BerEncoder_encodeTL(0x02, invokeIdSize - 2, buffer, bufPos); - bufPos = BerEncoder_encodeUInt32((uint32_t) invokeId, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); bufPos = BerEncoder_encodeTL(0x8b, 0, buffer, bufPos); diff --git a/src/mms/iso_mms/server/mms_server_common.c b/src/mms/iso_mms/server/mms_server_common.c index bfdbedf8..e6522bf4 100644 --- a/src/mms/iso_mms/server/mms_server_common.c +++ b/src/mms/iso_mms/server/mms_server_common.c @@ -181,7 +181,7 @@ mmsServer_createServiceErrorPduWithServiceSpecificInfo(uint32_t invokeId, ByteBu bufPos = BerEncoder_encodeTL(0xa2, confirmedErrorContentSize, buffer, bufPos); bufPos = BerEncoder_encodeTL(0x80, invokeIdSize - 2, buffer, bufPos); /* invokeID */ - bufPos = BerEncoder_encodeUInt32((uint32_t) invokeId, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); bufPos = BerEncoder_encodeTL(0xa2, serviceErrorContentSize, buffer, bufPos); /* serviceError */ bufPos = BerEncoder_encodeTL(0xa0, 3, buffer, bufPos); /* serviceError */ diff --git a/src/mms/iso_mms/server/mms_status_service.c b/src/mms/iso_mms/server/mms_status_service.c index a547b9f0..bccbd34b 100644 --- a/src/mms/iso_mms/server/mms_status_service.c +++ b/src/mms/iso_mms/server/mms_status_service.c @@ -31,7 +31,7 @@ mmsServer_handleStatusRequest( MmsServerConnection connection, uint8_t* requestBuffer, int bufPos, - int invokeId, + uint32_t invokeId, ByteBuffer* response) { /* check for extended derivation */ From 8999487b240d14e34c6ddc89d4a9ad10689c4d48 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 5 May 2017 09:03:54 +0200 Subject: [PATCH 02/64] - C server API: added function IedServer_setLocalIpAddress - C# server API: added IedServer.SetLocalIpAddress --- dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs | 24 +++++++++++++++++++ .../IEC61850forCSharp.csproj | 2 ++ src/iec61850/inc/iec61850_server.h | 22 +++++++++++++++++ src/iec61850/inc_private/ied_server_private.h | 1 + src/iec61850/server/impl/ied_server.c | 14 +++++++++++ src/vs/libiec61850-wo-goose.def | 3 ++- src/vs/libiec61850.def | 3 ++- 7 files changed, 67 insertions(+), 2 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs index 926d008f..b3fbc53a 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs @@ -561,6 +561,9 @@ namespace IEC61850 [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)] static extern IntPtr IedServer_create(IntPtr modelRef); + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedServer_setLocalIpAddress(IntPtr self, string localIpAddress); + [DllImport ("iec61850", CallingConvention=CallingConvention.Cdecl)] static extern void IedServer_start(IntPtr self, int tcpPort); @@ -796,7 +799,28 @@ namespace IEC61850 private InternalConnectionHandler internalConnectionHandler = null; + /// + /// Sets the local ip address for listening + /// + /// Local IP address. + public void SetLocalIpAddress(string localIpAddress) + { + IedServer_setLocalIpAddress (self, localIpAddress); + } + + /// + /// Start MMS server + /// + /// Local IP address. + /// TCP port to use + public void Start(string localIpAddress, int tcpPort) + { + SetLocalIpAddress (localIpAddress); + Start (tcpPort); + } + /// Start MMS server + /// TCP port to use public void Start(int tcpPort) { if (internalConnectionHandler == null) diff --git a/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj b/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj index dc2a4dc5..1c22e5ad 100644 --- a/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj +++ b/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj @@ -7,6 +7,8 @@ Library iec61850dotnet iec61850dotnet + 8.0.30703 + 2.0 true diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index 338f76bf..cf409dab 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -76,6 +76,15 @@ IedServer_create(IedModel* iedModel); void IedServer_destroy(IedServer self); +/** + * \brief Set the local IP address to listen on + * + * \param self the IedServer instance + * \param localIpAddress the local IP address as C string (an internal copy will be created) + */ +void +IedServer_setLocalIpAddress(IedServer self, const char* localIpAddress); + /** * \brief Start handling client connections * @@ -106,6 +115,19 @@ IedServer_stop(IedServer self); void IedServer_startThreadless(IedServer self, int tcpPort); +/** + * \brief Wait until a server connection is ready (with timeout) + * + * The function will wait until a server connection is ready (data available) or the + * timeout elapsed. This function is intended for the non-threaded mode. Its use is optional. + * It is equivalent of using select on sockets on Linux. If the return value is != 0 the + * IedServer_processIncomingData function should be called. + * + * \param self the IedServer instance + * \param timeoutMs the timeout to wait when no connection is ready + * + * \return 0 if no connection is ready; otherwise at least one connection is ready + */ int IedServer_waitReady(IedServer self, unsigned int timeoutMs); diff --git a/src/iec61850/inc_private/ied_server_private.h b/src/iec61850/inc_private/ied_server_private.h index df140828..a9e5d9f3 100644 --- a/src/iec61850/inc_private/ied_server_private.h +++ b/src/iec61850/inc_private/ied_server_private.h @@ -39,6 +39,7 @@ struct sIedServer MmsDevice* mmsDevice; MmsServer mmsServer; IsoServer isoServer; + char* localIpAddress; MmsMapping* mmsMapping; LinkedList clientConnections; uint8_t writeAccessPolicies; diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index eb20a5dd..ebf1cc27 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -405,6 +405,7 @@ IedServer_create(IedModel* iedModel) self->model = iedModel; // self->running = false; /* not required due to CALLOC */ + // self->localIpAddress = NULL; /* not required due to CALLOC */ #if (CONFIG_MMS_THREADLESS_STACK != 1) self->dataModelLock = Semaphore_create(1); @@ -464,6 +465,9 @@ IedServer_destroy(IedServer self) MmsServer_destroy(self->mmsServer); IsoServer_destroy(self->isoServer); + if (self->localIpAddress != NULL) + GLOBAL_FREEMEM(self->localIpAddress); + #if ((CONFIG_MMS_SINGLE_THREADED == 1) && (CONFIG_MMS_THREADLESS_STACK == 0)) /* trigger stopping background task thread */ @@ -600,6 +604,16 @@ IedServer_stop(IedServer self) } #endif /* (CONFIG_MMS_THREADLESS_STACK != 1) */ +void +IedServer_setLocalIpAddress(IedServer self, const char* localIpAddress) +{ + if (self->localIpAddress != NULL) + GLOBAL_FREEMEM(self->localIpAddress); + + self->localIpAddress = StringUtils_copyString(localIpAddress); + IsoServer_setLocalIpAddress(self->isoServer, self->localIpAddress); +} + void IedServer_startThreadless(IedServer self, int tcpPort) diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 065650a9..9711a2c7 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -560,4 +560,5 @@ EXPORTS IedConnection_readInt64Value Timestamp_create Timestamp_destroy - Timestamp_setByMmsUtcTime \ No newline at end of file + Timestamp_setByMmsUtcTime + IedServer_setLocalIpAddress \ No newline at end of file diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 3a2ca387..45dc4d2f 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -638,4 +638,5 @@ EXPORTS IedConnection_readInt64Value Timestamp_create Timestamp_destroy - Timestamp_setByMmsUtcTime \ No newline at end of file + Timestamp_setByMmsUtcTime + IedServer_setLocalIpAddress \ No newline at end of file From d33f16ca8a1e8d5adc0b18972c8db1a390183ef7 Mon Sep 17 00:00:00 2001 From: Cedric Boudinet Date: Thu, 11 May 2017 10:54:02 +0200 Subject: [PATCH 03/64] Allowing user to set the interface as an argument for sv_publisher_example.c --- examples/sv_publisher/sv_publisher_example.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/examples/sv_publisher/sv_publisher_example.c b/examples/sv_publisher/sv_publisher_example.c index b048befe..84bcb044 100644 --- a/examples/sv_publisher/sv_publisher_example.c +++ b/examples/sv_publisher/sv_publisher_example.c @@ -20,7 +20,16 @@ void sigint_handler(int signalId) int main(int argc, char** argv) { - SampledValuesPublisher svPublisher = SampledValuesPublisher_create("vboxnet0"); + char * interface; + if (argc > 1) { + interface=argv[1]; + } + else { + interface = "vboxnet0"; + } + printf("Using interface %s\n", interface); + + SampledValuesPublisher svPublisher = SampledValuesPublisher_create(interface); SV_ASDU asdu1 = SampledValuesPublisher_addASDU(svPublisher, "svpub1", NULL, 1); From ad98531b1bc4e77bb02b27d066f5f642f86de278 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 15 May 2017 15:44:10 +0200 Subject: [PATCH 04/64] - fixed SDO bug in dynamic code generator --- .../client_example_reporting.c | 4 +++- src/iec61850/inc/iec61850_client.h | 2 ++ tools/model_generator/gendyncode.jar | Bin 88037 -> 88158 bytes .../tools/DynamicCodeGenerator.java | 4 ++-- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/iec61850_client_example_reporting/client_example_reporting.c b/examples/iec61850_client_example_reporting/client_example_reporting.c index 1f531171..00c0472c 100644 --- a/examples/iec61850_client_example_reporting/client_example_reporting.c +++ b/examples/iec61850_client_example_reporting/client_example_reporting.c @@ -132,7 +132,9 @@ int main(int argc, char** argv) { Thread_sleep(1000); - IedConnection_triggerGIReport(con, &error, "simpleIOGenericIO/LLN0.RP.EventsRCB01"); + /* Trigger GI Report */ + ClientReportControlBlock_setGI(rcb, true); + IedConnection_setRCBValues(con, &error, rcb, RCB_ELEMENT_GI, true); if (error != IED_ERROR_OK) { printf("Error triggering a GI report (code: %i)\n", error); diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 8d2b46b7..26f3428f 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -810,6 +810,8 @@ IedConnection_uninstallReportHandler(IedConnection self, const char* rcbReferenc * * The RCB must have been enabled and GI set as trigger option before this command can be performed. * + * \deprecated Use ClientReportControlBlock_setGI instead + * * \param connection the connection object * \param error the error code if an error occurs * \param rcbReference object reference of the report control block diff --git a/tools/model_generator/gendyncode.jar b/tools/model_generator/gendyncode.jar index 0721d44f989a3038c79a74469a0882a3a10fc082..ba2bd0fafd303f4ae6d4315a0dba8e736b5875c8 100644 GIT binary patch delta 33876 zcmY(pQ*b3*7p|L5(y?vZwpVQ1wyhQ0Hakhjwr$(C?ezKneJ;*E^JdhjQSZ&HdTQ{v z_V-TRZv;gdFmN;wC@3fpX}?M&UYe8PZ0kFpFSb_3k}$;3GJ!6{QNJMH@Pc)A6bM*QpmKAh?p2W zh=dF|&=#U0lc;htLDrBcQ_6w@OL}|0sO3hwo*}i!DZNNu5vC-1ZvmsZdU<1|`bOqb zxia7cIOEe8CWX{{`%n0$bCUZs?>mQg*7tG99z^Uy7V_lalI?1g6UQ6B4%w6lI|V4t zk$Z(;nQ~B|x?nozChfB4<_tANBu)lM3&u~82e3^z5}_JgvZeH9b(4VZFmH*7UYUNNxC$nYk3sL9N z4a!1J7a8YDv(dQCQM2jT^Qsx1p0R24om#0NW{bP2)~W={mt8JVeaf-WrR>9DV?;hho3)6V%b2yumK`Jb3Ry&1S^&qdY_VtN z&voBBz#T*7rx8>mJ=K~N%P`(M+^m#xTj&ph8kWsmq7beh?N71oumuj;RzXze?3&Sr2t{wWU)JZTZxvAKQn z&e9W(pViUC08kOH@d0lz2G;&~UiV;l=oq<)aSxWHd3WXQ*^0Q>Pg}2QYZQ)ZXkK5R z!EyZlw%729Y+gTksG&Q;kM}T>LaPc)mjI34&1{M=WIXJI23Ygyd+1qw!n6VlZNzYI z;p|~LvR0Qmc&3`gdza5VaQMsT^qtav$iQbf`fWCUIK<0_CvPFSnztpu)MJZL)3Ot@r4C(YS_J_3OvT} z+07oIG=S;R>mEV=2AluDd_v%oTSpqamUo2aj_u5k>A0;4aJP&0nX(@@e5Y+boa*}1 z=qL1qHIjKHHGxh`8lg(P)eN%8Ch04+n$yCP8Q-}#&2@5FgT`#95L!Lxxx%j=_YdHp zrM-O9Mr$_@p3tPu>6D8_;}Zp}VfHlfz3*)FNHXO9ZV zu3*68U0hFSM${3q!$0Ni)&0kaZQr2pkikEapYYysdB9UFTqHi6r;sh4{Kil*rz~Y| z-mja0Oo^JX>IPXY(jx&d+s6fnnjo=^oe{*N~5Z%(X$Z_YD`ChqsEf}r&tQK~D zUSe`J!ob=^TyS=)Zea(QLf||sM7Nj&?h`_{&79AZfYCuK9M;Sx`?2f;Sm8Z!y?|Zv z3NKt&Xe+d9k1!#$0%}jH1x$5^F4*n9U$8(a5ci2tc;=cgvs+*cC9F8+KD#0#UExe6 z@t)PZ&uZ@UsT}H(>8w|T{&e$=RfVS3LfU|d9OxT03-^(~7sqQ1hx3LgzaFdSJ)1HRV!nvR-^ zHQ;#j7I)qr-mUI23|F^+MU#)@-J6qbWJQB6pro<5f|$j$PHst2X$6vIQE_l+jqvY& z*aS-MI?f5p6ONxf#EVmpkolGe8J+>uHCtaGOUOWKz zGM8K|=hD5iQXCxWnI1&W$&nEaAfHHP6WAoR&?L(~DsJRd9F%dABT^)H~&icN-7BZm=`Q^U3H(Jm;*(VzPat59Zn6SskjBj`#T@{fp%p>>Rn|oxQYmYVF|JluhH= zrjP-j#@1ckXE?#Ghn({U(6cl;w4H@C{!B=&6X$q|_cbRWdq(?pFE=h|Y3r%mV+5_w z9RJ?>=E*JL!(i(1dC}@RzHm&_?pHK~06hI!TE#vJTODeCfos-;w|Hbi02+BFcg6y! z>s=i|&@%8}3hv59i7>CphBM*O)>Eam9rQ7{Sq|dcT+7K>=wg?0?}T*$@?*D`Cc^68 z1x!|6=Ek1Gij!nImgupu&#}XJPLsp)FmXY$GfiCcC>i5tIs}ka@-A}d91#$tc{|uo zj@D1$o}{cTO87Br?RR5{!2B?^%L(6W7y4Slx;`nmtR#ArRg=u5Cc&J+Lp6g_Sas=a zBus}E-Sb&-3Lsw~9+~o7M$qv1-PWI3V2vvTRWy*?rB<*m zuBTcEjK6B}ZH1y0SltxB4Hji0%pCP7$&>@gv=*VHn%#<6o5xCg?Wimsyf$m4c~h@l zbZni7@SekrRGjurY_6xh%(E~91l~0&fWbM0D zLZaxCBvo4Y*{G=XIp=74;819cC=oOf4Q^8s#_TQcZ<7=L@d91m!SF~2Z}Sv2k*FKE zJUC)4kkC}5-Poch2Xpsl=92MiuBjP2R~IdS%Y_gRxoA(1 z1TxV^p3(_!rAb}0OtF{~+F7pH_wmF(S0}nCk@lXw^{<>ZCkqyIpa5kgl^Y;p)EMOL z1a`A#5Kbty@h~V8zdOxBLn>5~G@)022iY^kaoE#w(Np@>hx@e^7iY27k)F7&1Pxo- zxz?I_Jb}{y`LE2LtE;EF`CDaCI)s+IyI}c~@UCrd$MPyCH&FAnhN|vD1$rsl!%1tzB&kM7rnybuu2~J&0=Q+6gL9`+Qky zPY%A=kk{8Wv!dQ=Ai{0FzS4F@aQ!SpH>jnd;k{)??+e@sNE#kYdwR5)*iT67rt6^# z-zVcSNILrpw9U7IzSXB@Sl%<=wLV{T9s2eqr!H)0A2vI$>c6#rb`6C;X9pg&WcIA$f70sCLdQEt{Uai1qMfs59>KFUmOFUOc+3h|LG4IOs~s$X7(Z^bm4n_djt>!;|IUlOkVyvzE{2u zv9t0=yc#ZFfAPagO3%d+fw}b{%{^UzK~nZgeWh9wfZKt#vnt&QZZc4+Ps?q<1RN9b zl7masufPM;iQx`d=|SzF*i=}4H6uX)!xMh6!p7K0Lkfqz`{hj;uKVkz_K8ikz{T(A z9XBL2B#;fpVMLz=wDo*B^K!VPyspw5W~KG0K&+?ow! zg?;1bFW+T_`JIgYv$L&^0gNr&b>#i9)3A3H?oWgHe)eK5&V(&x9JbzZ%&uj;G2fQl zwHi4?ahFD2zzo3fG!s?jLl3_IzaoMZ3}YjNDPNQn{9F8-5uG0gKi2UVr>Oosti>E^ zuB=y;Nmq%$^U-};t7Hi)hVLN^`jWb51igKa)u|=4K)u{QoxQoi|Wc|zyE{cnmEYQoKKrdU`I$z<# z=+9vTd_ON?Pcq{cjMa zY&HTLjP-8DPx|O~3zR&7w=yVEUCCPgyxZNJcgv}MwFLOx9W+zs!ie&hH-5Q+m7k!P zVu7clR<^>LQtU^2<-D7F-rUYeky!;{J zQk1Bz#njHL14BoS;!iDKQ)0FmPzpw_lL2Yd2k{uMz@|U{ic64zn2m9!HtXhC@7PyX zlbwla`ThQ_e1e12#W{J{16od#jm0uj(c(R4G@ZDd$1-syzh)wP;~x*&iQAIu2P9}e z1g+)y8m8wOpWxgx?%y-%(?+3EcxCcQ^if4F58!z|Cj{x-2N=HPROsFW#i8T<${aO+4xP}ahvF?6 zW-A@pr$?KYLM|6%noM8Q8bk0$?ysVx{bpXH6 zQMo0i2csqQ5lTM`GM!g`)>5!AbGXRz;MN^cdxlN30&dQMu zniW+EK=BFvVd>Wyq_LHwt|`l6mTxc${4>so<=fs{a2uIfmTE9q#vM5XKGWoL_}kb- z(9*C}@*_R4{A()JY2;W_EA=d=>u?>`0xy6PSty6arTKTeIpc}M)(}BWtQ{X(2&^zK zBB(j>=ztC%C-rojO*ioyN-*h79qE0DM-Qb^@_9TGtY)XMOY33`^p0M(V)kVl4wyo{ zeqLB|<)!FXp3F31JBr{a!aLv0C~O-va6sV>b87||J1cMR^D_WHySq-lYYaoUr{){A z>WJikv@f?fhCPQ^#CJ?&{a(vrCJD3q%>0AjG61iucKwB)oA0GxB&3(N@}X(0S46(@ z>=1cNi4OE5`S~EV`Gy=%2FcG6OyFmL+8^*oWQ5s25N&5zkACuf4|6OZABN~>N*0^q zi^T%Y9B$g?d9+n}A-?M_D43+zn1tr_)9~ZwJ6_&luk5+l4q>+87#tATN9Caf@7c^? zcbk$b@=)W*yW@yamqsoOi0Q9*nls<6QS5qHiwvn_z17jexz9!RHrVefhz z>=C0<|KP-M@uK6Py+-$OvK=~C8DzhXa^wR3dEswkaVCncOfu9@g>F5+p#{ zyTEUw_=&Q4C84C=Yjz4S=Oh?#n~HlkW3*!ee1GWdF?swU-;ECXJ7JGRqfLgXnc@)h z$YViby8GzRa{Ovllx_sRDLSetJ&5OAkOQ|gXV}(`p(_M%;x;=#z=`8$1Fc<@?2-Vk z9~I2AWsE3d#Fj)J{h?+HEM0_l#W-GgefM$}I9@DaTYrkUpF<>`mF*qI;cy=0yChO4 z9JuGpejtx)PC75UvQdZpAn}Q08^v9Nx0kk!!$cF^6!bCvw1{{3cQw8t=%f4Dnk%)N zBk64#@>FWv`TINhW~bFyn@4yzOdHyFtc%e_#1q-T`SLUIACoAvdNIw-w3+RZ^G{ZVVs4K zlu2f?fefhU_hWw|SihhD`Tm*zC1!Ugx#mS+mMc1NUOp&Kco>4q-93Bcizu=}T42#Q z);-AAK@s)liFHpr{-ZDyYP|_e6s|z*)E6Qtdv_9F$37M6Z8~Wc7iyQtu}4rb;wAk)02;P!^gzQ=AowAqA2IFJ1nleQ*I`ttx#u7rMD7JWg}E*7L+MC>@@$s7a?+ zs#q0kOKDWPcZj>qxmnY17jVqSUbuHiZA)dVa&8-sSp5paAJD^TnOdxK^Yxw}o?5sY z7WN#8;TDf26f{5hC8Y<%Hvfu~+Xuh78(Ehzu)WN0m!?0DW zIkK4`vdy(UyzgzXr=S~)gn0MWOYjfP?aV`HP z>@V_R;xr+DWssGdB*?uv6F+{6;bG$Ibm7iNSokB-mhwgI9q2hEFtf~b!npzxCGXrycZhb#Mmjpi zswy7n6y}tsWSW9yCLYQ>$u-I~+Xf_r&3KsP3P0Tcz)vu%ttJ`XQ!cSX2q>usz)13vq){Qo3#j1}|jXSDj zq2c}wgeF}tO?8+z%R}O00@djipunjP%7^h}=*+EsnJHJZTR9>SxJP-EbQ!C>#iaHES zmFZ}#Pe7|Jcr+wi?TzbGaN=JUak~woJ|xBlwE+xQEf_yu|J4&0}_ z<3BOjWPSS%g}lqRx8k+xQ;BTaUL-0%vWj3kv&vxWsCvZ#zL;&3UQK>@)P?gIOcK0w zCHuvmD!oLU>RsXIc{J8OcZGK^KI*^xJ-uA(R~h5$cfz8wHL zCi3G;PNDvDu7eaHQtKGm5JNjhZKEj^yfAFHRoE5n^A`M|ur+Fs0z4$nQxq8f=PCS- zQhOivK)+}PRj9ZAEv-DT`e4^Knl45!JH8l+`Hwb}kJ4)T zOz%X@EOy($Wxi4VhQE5NmJGuy^kr5Xk79#5jyNbY(qkh`p}KIqb*y1lRLoO`X%q*< z&@zpus1+(!=di4$M(k*-Zd+LX2liegvoS6)pv7Z~*yJN#BfrHnm5fxe*+=jWNe(eb z$f-cX&&$bI_?tscxzt(jmw}y0$)NRJa%qiC=8KjvL*JDQ%b4)ns9bOGtT1p6S8|zs*I;GwP{Uf%6VnRNVH1P3)C^LT5wZkJfI= zM52jPRVSX-?5wDj+*-w#wym}3%BVJ>_h{&U%9YCtOw|H+va)7VOM$7hsn*=JGx|~` zi>_oY&CXg%F6rRjCl9G#s{6g}`j#g6j2oSW44FJHW@bJQjN&S}Y${Y{o1FF96S6~) z=j1!`jLi{|MH+@poFHBOku2CIWgN#>qbu^0A??z%V>^evD80x3k6 zPwpR;-UtZ!!9MWU|9~rcq>PmO4>+^`A8`N6bIFB-!oY41UsbVHF8`USt*z{7_>d5A zk;LEB#G$1H;G*ZEsM=JZG$E$Yv{t5^Xnt2~KA7NQXeN+o7)YYFhPT}&z$?8!8MoZ8 zJJstUXP2L!UBEAb>2{TwoJ?-JnUrU*m)dX-kUo&*)zHCuVq|kz!vHvNuyG;gIV>`! zIX9!WKA_nlC5z)Z$@uT;E0knmmSA-_ZB|L6xiDdxU^WOl>_4nyb7H)hu4vcX$>q@q z3|w%yx_jvO*seuYXSNZ8Z=0b`TW}pLXCqMItYjOVj7awn{w_SH_l>^KhRfL8K&kdTo21Q3_?*dj%b&9%b}7R*e;3* z1WI5&w%s}drZ_`Zk;*y@%QgFAX?2T~Rh=rbgyDlj;jFRWu--B?@q@)WG;Jfub95)z z%dihz0bip?7FY+efE=@kMtG+<;u*7t({tlYSO%nTcqai;1H%Ydcqio9Lt}_^tOI3$ zu6e{Hyi+J~4cm~~6i}o$i`y@jxaRl-xO#rz4cO{C=uUj(JU4D9R(E_b*Q;{vx2~Tc zw?}TpF=ofyDUD_iYs*dcI5Vy$zBw}OX1HM)+74?QMS6Aa_v>ie{e7vm&^QbRx5BJB zYX}w$iOn};SWL`;P13iPjcq$Wtd7YyK`2JgsMO4!F%H9(5mrV0SSYaSq6TdTb*!-aadc^$#aj z-R{F+cTCQEts+|C?m13(j7V;szkT3#JR%XPLJ1=fGs_5_E=&kc2mrn!C)5J$Ll$9g zTSx|E2WAH{>2K0st4Ic{JDg#_w-uyarw1Rvmth1U{CzU9KgSSb*xNEvFZO{4;L9kY zJM3){=@YI#pPGzL#1`oUB(D z6+)ylz7i(OY>Epg#bKFFu+w|1mgO{s0B$l{I*iEz-1kf+(yz#PaUXz80C(m;n+baG z>(dFQmzAa-fR{Z71&D54mS}S_9~X*jVT52^zzKE(BIPGeLq2TUrpcMZ*sqjC2_~+j z|6+k~5X?l22K4b9M}~SQk62-MY+*PLSXmu-BYT<TV(4num{9qk+AY9OA)80Zgy!x$=@mgN}9OsoZ&3~JB*6*vScwk*q$>B`3sUy3n= z3KrhDAlC_d_zjYOkMJpIZ^lY4b{&lBrdsIN)jXYyZqXT>d|EZ zC$3-9(N{aDt$ZeOjV~v#KBbkenE1r_wCPqm281c0s__)YMU-qd?_BhtmQN@^Kc(V1Igchv|TRUc?-hd@dRtNwY5z} z4rt1|iHY1v4$4;S<>uwPDjdEfBD)w$Q0xUS3zyV@Gn7_6Gq=pLB8UDnr7Z<1tMbv) zY)v^DVB}mS_Se3VsP$?^$Bco>DdAx=c1Xg8=6mGFmr|bB4h_H(0SB%tpimJ*c$8KIYK{iiG$_ntXk*OVFz;IP0ju&P(wUU;+F}i4Hv&eK7Y^_Ed zk8PhU28GpQAQF$ZX;74<)Ub*T>t@*`E7C@q&)S0|FO9ethL;TgZ?&t1xN&RoA*DBf z_h|Cp?b=wSq1Y;c?v*1~FA9-PW#g7z)|L()+vXNdxydNEGQMr2`VxQ+U!M_1pljzK z@SyH_bGx~9l2XT?rK2KQPYui2Z+`i_@Z#*DMqZ)i&@tkv;NIBpMd;H`=a zW@X`g8A)=E~Y3Mxy_0 z{;20b5ZdI z)(+;G{ni(<@fd0FKH_si7Om<=2gIF>b$1^Xc&*9CX)`}CS)IlV%>=ncgG*^kOg$p6#JLZYobAy;2x`@WT{W-jLc-K^ z>JA&S2XA6;jqlk*tnM{a=!dT=`=SADOb?ztgCjW);K@2A%aoh@R7PrshqCXaQ5{UG z*mF99RcyG`X3IOd+*r%hoi8xtx1%%`I*{YbhD*>bNA`$n2;xK_Yh|@a4 z1cNE3<7TCN2Kt5*u*YI(chdx%n<=ML+3R&^DC$rH z+?n4P1;nk-AGDlZ87p4W+6NN5nzP;-yj9qM9n>0=n^eO6XXh$@>UwvK zn?iMp*%^4=^%R?<>n4dtNWRSqvR$EW^mQqz+{_1r_B6KAH5Fml=*^pTyXULY1isk~ zIdbmiDQ||V6F;9U6|R1q#O&rAn&~m*&~t76j%$1*qvjb{mzoWhlNdwHLg&_QZfn+N zYhktL0~(L!=EO0ehX?7*f`N8UE&}(kAvNMCfmYo_OqB?dpY-}&kLh=JvM_)8blEZs z7Ya%WYq@)(9I3k*)Ovl(er@Skn**QD=?($Kx7|vX2rh-n&hSP}d>)_Iz>#k&^=;au zWdK7u^=;y7)`NgoFEwGprDa#WxW&Y?GZ^&89gB^I=wUkWrYdi!d8gDjLGA`bpmZ`^ zwq41d<=)J$E`(VQ^y;KJ7Na4oySJ7cI_I3IZz!ErBppc z;IKNFBQJ8A(w1SD+Q*q_*Zm!L-huz~#CA{cGIz~|dKs;2F}K#rtkS_bopKi-#n3qE zN8moUDfbT5I%z}kL|Jw&AVi4e?uV=e0$bddeZ>Sufdvl7M1=dqu~50@eN+?H#h z&;RcTG@E(rZ#5V$#rJH=Y{K+m=UX0ie(LP`gO^GVk%4I*dOXFXzf{i@>=UgiAVtCw zU2N!j%}v$ls7?QvxP(c%|15FE(>xwq$~37sO7=a=H&^W*USjccK1;esyN7z0<#_YK zf8`zTHD%nyLLr08?B(yiO4uv`xBc5&eX#^E^8vqRCZalzCsCkS?ww)PJ>qXJo13Rm ze+u^g%WZv`9r{Z}=rZ1KcWBJDQT?Xn3cCAnJPs+7kGt_h*pc{YkI$3jmkybU32QHA za>kRJlb4SwPcvjKOKdUvW_uJV#~!`$%3emnJ!qiiMEucc=@zNr{Bc>1mc_*E(P=60 zOJqU&8QEV}etbB?0NJMNaZ5{2iuOZQ{ew>D>YC&l?s#lI>!J6-M$g}5!ePCM2a{W^ zv63$uw&E+#IZM*cjhs9lE5U5y7E9`>)UZW{>|}{1zqM;ZW#q3)H^R;91DN(6>Ad*d z!6|k51j)H5M!4}gopI>Z$P%ykiozrCqsxVs&nRbUY=aqnncSZw6GMxuq9aaQ(JI`~ zQz%+bN-uQSFpG;d121w@K|6i+CJ7TdPfhe`Wz59B7!?41*3xC;xRq(=Q&d_Miki|%@x_b z$})D?t*xvgW~s`7qkIAJK_UcP`&;~|)9pQ(8kp8g1mecBspQVmWf;Kc^s|t-oH~e4 zYRFq^wmYmsBHcT&OO+}U_0as&{bHA$_N1IM;ruq<_k`8|cfETR2wg#^G5m zm%3hxUoyU!4o{E|K(2YBRwV>DLvkY$0vE6%o4GtM3wk>Ro9ByJtRPwfE!BNPj4g^~cvPw?7Er#Tt zKR5oAB(4{VO50W$Rj8Wdy|Am{P^ud3zxk7~{}~RHp*E%VDlZj^UXJL2`86t zu$ohlx+&tzElatrEE@q!F9yi%A@s0aO&qy`Z{WO{&ZOiOpAW>fy5wE${Le`^5>zLB zn|zz%n5bwwy^z6PxihHe{P&J8#jg#hpa_Z(C zXKfn_aEIV5;aGt}u`{1D+CC}+0Iky(FWaf5g|%F4nY(FZykzTilutr&vYL8|=H^0G zBI#ifSqf4r4GZw03**1k14+Czcc%e~n3hB%?fV1jJR?IfMVdTGbEYSxgJZC*n;)DY zFXrTcIm!RSyrXSB)%jS%775sP&sqvfkf3X3B#V#WJp&*|Zdoxrzw`f*Ti}72qbF2T zTDIMjW0U+0A|)j7`rPPT#}?h~eR$Rvm2wmZ{G7xTMFKe*?P75L>f7(SCEuu6n;ywM zZ=E2BX9DT*4P4SUBbO@uE`_qA%rj56Dd@RMF3#lC1%%9zIl zK+;LLSW#s>(MqKZ3dm3aom*T3J=Z9UT_cV8$dYZ(Vtm_N;bo^w4B$vw6Bo<4JqmU99aRtz;c~7eJSj`KMx3juOX|t41+pUCve|E!8Gj zvoNz@x2kQN&s1gYyX;*1F7|wiozvUqg5@?(Hj&=mUF7hQX8&DR#!Krh+O|wv)Zh2r z{+moXB<+2^C)4aA@{jgxYhj7uLv*^runyw5TA=lnp7xFW;wFu`-hRc>r~iFzM-~e$ zGjN>7sG8=)&cza0p{l^I6%{l=k8t+H*|(9FHqr4en^0p4ohj6{O1H4mF^Vh8a%X6p zTWRba_pGJA4y~xx>XU7r_SVSH&*Z**QPr5(4pc&8Sxx>gJ*>FQ{c0gaL|ycZoe}sU zUmxyVw`cvT0Z;GWKVkghuMv42Dhk{51VE4Y1&)Rct>4pmqQeE3%gtu`4FtSP)KL5| zO!WCE%COTKD*e$KwVtdIxThoh3%1U~&HArujDIVs8L}`ICfioy{#n|^M`?$zaWKV3 z$W}e8uX=yWtV@W(3~<*v9e|9`Q8h06d&GP~m3$Qets7&`?sDcgXV^pdU}TyV1QWOFe0GcP!r< zSR?iG(SeU0r8<-nc##&OjFUz!l)$ORnJ*-W(fL3vdZ)6uY#jXyMgkk!S5KB5uVIs1 zv(CCH1YOURP_>m$T}l-_d&s=V7U2{H(|I31Rr~74(pAoNm4nKfhWt}(cPK;Vk;_KA zbV}@#=dK7QO4q4#s>18~QBQt!vn40I@on5b&|5BF45q)dj8u-=u28w+1`Z2XdaMl^|Bu(QxK~L#w z^;)3E*Elis8Y5iBYQILdx}KWr_TP&-S@BdyoQ?roJOmIup*uGgB7HILK#j#+cF*e6 zo|$+3cuvh-+}v9^=C?_wP+)4$dbt6%O7BE@?{Il9d#Qi33NTxxm!kB?z3c~}%->G- zJ6GPXTLq{g`@Jpy&Ch)Ndf=!2;qTk`@n0LV;sGXL=|?yayW)}j2+y@U-4@!T7rCPD zoAI#u_s(pt54>-*ffLMpQjQ2q5+W*ageWjDFSivs=1R618l|x{5NI=EF1Z12&Xp-U zuAXAs4Xr#-VmDAyzQ54qXtn8R<=w_cs=L9UyCI;Ph0SnX2hTGzwhov3ptqj6L2)Ll z7Ote0E=vz`lOjOf2sXz~KKlV)pmVVg4m#(D`ZPAf#vwd=^)w_mN9#lSBzcY-P?a6Y zVIlI{S{}rkmBT*h3OE(AJ;%elh#r79u?(P`-1D#91|1`Vk zjD*xh4fsi^r95$DP(kbinNV^0uWjfB!9xxpUbOAELYR)zudOhdJ@+oSl_Z+R zgWcHH{%%jiEueyQR~(uf81*@TEncn-74!{inhX&IC&Ducq0w!tFjym;dZl+~uJ(3jzuOX}LG9j*zu_R6k)CDe;SXI(&J&Q?j#JxIV{9Tkuq7&iMm# z2yCc6^@F3q1enc;;LSoxKG4WFE&(Il#3ka$pI=|(KEQBouxhOz(#VJn(Bg*UfPtlX zF)o5fwTld2IRt5*JM(D$LQq)}_VklwaV9GEO8cx<> zWXRIbH4z)nnIq1<=qON`@Y9}EbTM(3uyIkagPPkKfiJ2M6nobT{-(2)JjA?5&e>R+(g^JAi@@ zApJpy2QixnEr7_sCpH$CZb;MxH@J_E1u1(7PZi$U2kDTE+ylEh_-X1-D9rB*huB9c zdd%wit0%-`k9G~rAo<--=HwMDb2mN%RM14?4L^K9h6@zI@HZaWqjkaZFUydmk&J-a zLf`$lSqaD7UpV~ym?laN>V~x9_%onrsSlwg{1KF{lOvwY5WdiO(qK?a zxB@bxd#LTLaDpm~qQpsR#zno{%~`e3zNpcRdcm6~_f!$M-G)a{>zEP8{u9~jbd(jP z0y(4YqaPnC%!Fy62~jzE9736T*dLYMIv~XrCU1fyh@NRX#S>W?x*@G*M0I~WH3n;v z5MBTqzQ=7a_tKG-?+7-~;sGzH2ggc&`6IzX(l9*8D&)h~vEl>m0fWa#K$4+-<9_Ye zU+O6ecAc?;w7~eleBu9=77rQnY~RCBHjd`L>g$b@8o;R` z*=BTkOeTI_2i7l21CxK~N0ZpXj0xW65rk<#-bpENG7i2e_kb=_R%9Lxbn z@v4cHzIr*M#|Rgma_)ZY_276SWrce%M5|1*n3t?-k`wP9*DQUc0N7kF%AuE$N{6E_ zh68YH=GI*}OvYl6%UX8TWMeB`C16dllb=g44yQoU0lBbS2b)N=zG)1I?g<_G_^-Ac z0XrShyC@3i1%oU(>SnQ&8rwK!+-zm>XezyByb{-JgfLbOjI_LpEWE)e@ZQtAnO@c4uI zI>^U;Uc8|0dn~+w(E~a>U|h5#cwT7n9m>=|r6Zo*KFl3C->=;vlC5CW`~Pmow>0UT z9V@WH7l+C{i~bH~9^mAVa~zBxDCN-ajB+0^=Fp7$?8qd2R>nCpeD^hGYlDUClc1hRSmqkkU^nhqa=w z*%zhHUmj9Af`q({LF`XLqf+VE7n?B8%px^+6%BSBz5ND<93_(!kV*EQ=K@LCId?>j z#$m8xIRV5qLC~JGs{7Va(DuQQj_`Id_TjOfkhUYucT780z(^x%GCYu6tW_aio^5l! zV@;wIqRc(}0EjVX4uyI*9^F0?*E(}{fbbo~XgS!L#9(VYss5kd^dC&K#)pIkt!3r) zEfm`97W%|#ezI&IDUR1<+m&Qnjs#l*l66~>b#O_JY$*;MNe&$;4#Z^JmPFf@f4hm( zlf>(DnA$4uz)|J~ujZ15c2;$cRu1CqMUe)r-26WfnVC|*+UzjNbPNvGiBu4zSWUkYYb(oElb%$Tz&Qv>OsP87AV(fWJ7JJ>2{Spud^$h}lLxXn2 zgub&v*=r>0JEi^sBBve5I1==LrXN<`Vc8w&_pR=m0VjGR9r}6SIJ)9*`y}3K$d_P= z?{`rygvVBl*a-^eZ$hEzMt~Ft8b6rRw{d{1-Ho)Y-Q4<<)gJPbS7NDK(xe@Nq@6Od z?paB1gM_CZl5;<~lUMr8-B(k8!G!m3$&**q%-z|49#gl=|HRgp2$eZJnpHVGMkh)E zGNzBb!0{8rr0IOJ>~FGcFtY4kL(uD#%8&qdk$y0eUmS{jbxK%uT4V!*1J6JSj@nRD z7rgyU)gA$H4jXNnY_a-=cFJ8S7z$?A`F@&%lu$Q^o=UTz_SyAE3MbjzOw-9fJw|$d zgTJ5Q8wWtK`wlV3=Y*R;TO|YYNYKTj*{IOYfptPn!RREYH)#0#_Vds;sJTYDTvI4R z8EH@ljAuqJInF+XZC*7!aSmLZu-igl!EK$o2+HR)v)sFFe2jX(U!UHy219csF+^`3 z7L|p0u>s%BJHEvvqH6o`tGy6ltGwdiN zK+1N8Hg+w-0Qi}ZXK_ee?_zk%J6FXYSt{N)5D4B!zBh+xwRDsN#`yRH)sB%BF*AB;l$Qm@UzKZ+cIm5c7mS z(WG@ka6{t*>lrwlRhr z?q+A0R)?@r&1=LO*vjwrz0xBtC5th8_!@_>cY;00Q+8VcQMCJd} z)>j6^u{3M51PSi$?i$?P-95pAy95gh!QEL17Tnzl!QCaeySoHS_%`9Z_nzGM2{)Gu6)gAtNVoPl1F}H-YDvH^~aBF{wGkyuH*u4dw@Eg8XknD|ZAsEv)oS zJ`x?-xaJX~5wd=^Mca|O6<5rncns53|3o{^52THOT@UJGP)0qHggwfKXeIp0^9|ik zyZMw8IU4f(!P$bT|=k$o3iWo9>Q-c zLyS~^c#-f0c!BzVs#>ZXr?zl!LWb>cK^#}B7$IFAC9Oj+!$$%}bBGg<6-dkZJf_%l%-T+Vk)Vfg2*cus6g6#b>?g zOC?=0j1zv!rmH2(n4kY9Bac%0tHMwh;bETaUFWr9B0#Ylsg0DW*ll z*B;4Dd#Cy)ZAP3QVVs))rx+a?VswHY_fN`UiX1~so95L?eJzH^XebfNyx3P#i`$JFSv!aTzDl?!hQ*Sqy|VyXUD6Vm-C z_?AoAV!o_HaK17?l8ydbrgR;MaEFsPXzSflg`|fy2%k~rqB-ZqrK0Z+JZZ(w$I6F| zlM82ekEA|XHgxwWA5S+J+N}`Fcwm6<-lw;}G5s|=vBoUl<@6l;LFE;Dz$wp-w0G)r zSozi7mtVeu--x4F$5^<=D)YXo@|^49?r{_Bxp0lqre_$ZuTePu3hmLw>swgD9E)ci z%Tm1Iq>8Mqq)YcjoBb-h-;DxQrjO&!6b&f-9uTd;h!%`8vO530Zm`&fhrhRJQHyRu{R< zguT_x+-6xy3bHRDfZTY@Kc~V0Dz;L4tu<4$o(WuIImUY7i;;S45KxajYI&2CT!`7m z35ThV*>h%3mNR(otYa(05gdRT~6{5Al6frNfLu1W_vaC)26#@SAEk>E5y?Al{D#)$%j zy!f7-h-$@E9SapV_fx@mi-eN6AYYfPcsG|u0jiJ3_Ln?k6UG__RN#HyfRtRgB>Stl zv(lQAIVj`R>y16rODIbggzQqrPeRV*7nbNF@d=$25gWF=(9Ch_#^vcSKL!u5fruhT z*q!nmZSZU+EY<#NCAP+%K?TXUAFON1VH0sb>zPceQ{-*yV>G$DGhDFNu8TfHvzX92NGyHRWHp_7?u4Kwr$x9d8^ctJ2IS^4;1Nalg)dAo`a1D zvCwfms>j@lq>!2vJrrhL#aNm@2{xK&#_xO?zTa+6X@9%L&1HU~T9TWue-XAm`27w^|I>Y)QR>8HTV7z-- z#1Vx#W<+L~*;=S0u82Hu7yJenh3|;?&hebJw+gFu@u|pCY8+A_em9?y_@|uHf-^o# zA10h>ag6q+#uBLItmy3e>NYvGjG{Bc`Z&*vH<)PBiSpA;8yoF5#|ZqUqw3j8b?p%H zc!{25K$qol@av9< zXG}WXSpve&E9YVZn#v@CqHVJK$Ysj6328fp&Jl8PD5XZuU-_g?RZMr3+**AUum<}x zBBr^J)`KN19{Zjbwc(ZZ&Sc7u@Q)G8KbOrJCq=IT`OcI)JB7&t8i07P>s<6at;&7A zP3*Z0qRLXQt|2Idh$2SUg3|BB`cnx!pWySL#|(T4op*y+# zcPhloBDX4Hel;%NeCdmJKVSPW7XZFm4nu}}&*~opDf`CNCMTrqFGHyhf(iGZ=SBOG zk5jVyQ)e$GM4w<>+RqQ#+pYszw#@+w|r`7McvrA?fEN^qSe$rHOLdEkl;o zkNLpQF73l88@@5a`-+YWWGiPs?gCu&)IY%4mi`U^Ll4$%mO#0zLjc=a76F0cs)g?C@W zuIJjqVu!cg?~zovG8x+SO%8L^tqR$e6k=u350r=491`sI3%pTF&1)qh({&5RoPmBQ zs^CcIHm*7ZbZaW}h?;k5%n)D~5jKhJ06XhTP?kl^88n5PG;cy4XCQPcqXR>}i^v;% z6m{^sy^ZpT4Z-!{;vl`V-B+eXe5iq z<>IIQK9#bGd%@7Cg2LQ12G(SWRS zQFVR3Jgd<*C{5N5O7GVnl1{g$ zROK8bYUb?Xwcp9L7LH`8kadK|;%b5AS^|fr#7Q<(EQLhAt-p{yW{es>=Z1Zah|Er~1&V_7Z0WHKXGa?03NEk{TwH-^Q$y6koSt; z4A5l2@y{%rC-dR7sSmHCxU~U$?J#;o=dIpw2kbvZ1LuA6cT{R}(b^?~EoS+JcUZZ| zdUTHFKE=hbTn2zDXXBh(2N>ZyO>B)IXr$P*3gczJlAl^ru+m7HN>wSxgzKmDZLdsF zl@V%ceY+a&@yR9T<8_O~GnA%MpK>g@3FucDFxTOk?mGD@HS36hVC)5iio^IInkAL+ zIwxy>Ds^I0djE~P|6mrx*mf@~)ee{AMWL;Vi5dS<=Ub@8;=!_=2|@Irh@3e5n-!Xz zds#GriQKNSz7rUUI{y2tI@5%BTeWyh!(d+pbYnH+Z<~63;cUfy-vg+z%Dw(L^^+#r zsXVO-F~Fh8{ukzaP2iDpN<~HB^!FLZ=oXm68Mi9&6^Suh-eXnnZlQX3H#Y>{x*3l$ zy#UkiCrv8ly%8FMMkS|xHs1w3YFkj|iXJcQ>yfk62+lokNPP>r;PWBLW$my9ziY8+ z*kMr2xI5J>l08`$@~8_kSEwk5+8xqelq@o}sf~wb&D18}zXysQiWYqsXox!W8SnE*FA^b5l6d|*T-B3KqeFGV0-^rN zLxk&+%5&QrASbi>TD<%na;3WPy4MYcP@ZpR$V}y3-UHHy(zOe$8`!pr+s%+e<>lPl z4Q^{;-%8|lBRA9^rR{+Q_<`B}GBYZ9He#-mc>_}%ais?)>B+RaRyeWY27@C597|8cfGy2$oZr+8dgo1In?Zb@eOBA? zrLD~fjd(6CQ+l^H(;Or_qI8fT#(s={wPY2w>F`Tf-qDxeP?^k~KFKJH=;G_a1n_w? zIHiA~QCfJcp%Fe@`8a*=lHPStQU41BbKMWLNJ)Mf*dqxgHtgA5*wLY83Ptg^q^=9Z zH#`etxIn-)e|QJ1Klk~T{iEA0(X7jT>OyuF;u@;prLPn4`E#(FKaa5A$4)Yen8C0X zSS^HrA06_Zvr(1znyTBJ!uJ-New-KkOU0+1KS`WAK1&yxLk0xLoy7-~y~>xoEg0GE z9yPO&P~uIn=@ss;-sMVF$8PSuFAvb#s+n&N{00<@ul35481=O{6X3A zHrrUjjmGOK_f!eN4d+LHmz4(}MIG`w5K?s<+4I(}=_%4MJC?OJD!@B97tzjy;ZsD; z%w-u5(|GvY6f#QlgY6@y(Hq=7+fEk>eqINh>(CfaBdCIp>fabomzN}zm!$-S6I)2> zlQMyMyXP^@IR{nw5@DYlmNP(KZ(?n^+i5THSY!nR#g^=mvZSc>&6p9xnS9JL3`oM4 zOyiCZ0~{og4ma1okW-S_-DZElG_H;DK%FjOEB#dD^tOjN|03i2>NH;Dy!_UKSsTPPT5Tmk{-}Qf&hZQo?;#DL}osp2#LiqV8e!q#BdQ+ zVK&%A|3qhGBG?pYM~Q8d>r}vn4YG#zD0YW5%EsD&w}V_QQS9QcAH1v6ip;W74=MmE z7Gj-9#N~~C(X_)Zx2B26ty7n%=90dvM|VolqSvw_uGUJUaksqc)n6>$q_Fd!FV!4E z)~hEhVM@%c)8kbxP2gN4_pEQwSuJCVv#HN_&Twy8&iN_rTaZE5J~x&OwA>r|xX7MV zlu`L$iBqywAE6QF9#%5Ntj=wtT_g>xXP8l5)YOALv9>F6FW35FSeQ{{Sb1MhP}jSt zxX8N*f1+lW?;g|;&T5~%I5R8vK0|jy@Kr*L!cO=F@(3}?4#mraQnIQLyP5oTVz|T$$}49ia%fT)~0K?AiiX_%qF2u;58-&YRq8$IUXcKeNqLw*3GC#T1B1K^l&f@N;H_ln|kzqm_tgb7C%B-YwBUuGuJOJF3#%Z z%Xpo7*P6c<>#bz`vEn_>`^@`8c#rvNs;$2PP-Nml_1(k}d3K8)O)QLLR5D ze*BaVt8^O**H^2CkiJyes7FxCOvdQ5vQ3!nW4${~G&nX+EDom_j>0G>007G6*-dj3 zA_|;`P6tJ+cTA`>RU#?9iJ!g@kkTXq3Wvl2>mnu4d6fwBf(K^8?yJ6VV@>&zV;-s?$)6ur7q2Pf;%bA0D$qh0iaf(S>#ieY;?RS#oz2LR)3O zWPA3=+fXkogdQS7S(<$cL))EEfEX7^q3scOA)&xaXf=qp5qF?ahr9hX@;0oCj8H-H zUlb;lerI^L^=*F2rKYT)WG3UP@33Drg9Fk&0_v%zmhyualbD4^b-b|N`elD{)xDB4 zuU9+Jh7?S)(;L9qFWv|S!q!`b|ELR+%c@{`M-sqshFG~+c>l@2%8$(7pKP2!4NK8Z z2Sdf{qfxiEs#Puby#B!tw|kAVNUJx6%H@dOKa=c?p2?{&wZx%VSgBbPIz}LCQSJ3v z(JxD)gor_Jpl#alRm8)w5fwMc7M-xiuv2EnY|WxRrQ{q_DK^to0Ie;^hmCbwc*?Ge zh=nSLZPE@2ws*F(m5j7D)W4cHCojT_sT?U4(B&&vXto-05?1UZJV5G+sS!k4eneAj zCB=^7jB ztMLi$`uRS>6m$OKje&{9*1U&Yb2Rp(&#xh9IS|9a>we~}UsG51KNeyvt*KlFb_vI-oi;#%<^>YV zY(A%9wo(|k`tj11Z6T^Wn7SJL#mGTN12u6Qn(pOenHAAjR%E5lxc~pYhh0M_AK-mKVWAgX&g9D?t%=RT_U8Jk%znM5Pgr2 z9kpyNr1$mn>v#;L-q)1I(+hFZAQBJBIoBhBTeDRB`p{XGgJzrdD`j`rh6 zYd>ODtc7#-0uzTf;S%3JU3|5)wJIRD+D_ss1Qv+JjHRZ_e+)ceKXA=z=t{}AF+X74 zNes~*RjUvvke*?$Wep;~-_YIq;VW=0QE)fq69$Ean9z^Wk5MfK*H~m>`JfCPK7&31 z+g%)bp%98`_w6m5dZ=lz)qcWLiE0ZStd^QhPNm}brE~BiqpWT+RUCyT!UkuN@gi`` z6UZ`bh|iT6S%`mj@rn|grCt4chqHIByk)$=ui*B4uenO^Li+pcPI`X9cgbE354fIX zY9;zh?$5hZtD!p-dF3DyrljsfxVmlFk}10k=hMlwI|v`08$?_@E6QIbw* zgegIy+TM$72dkBP8;hJ2tvNLZ==`mVkibRsOi8a0=~FA>5^9e6q=}G)J&ycF}wjg;RsQTOGT2(lpE7{n^3IZYgru;2t@oK2Zfw#US$Q3qjnhjzwjv(mUr(e=esQ!kw=0ACi8gcXW6A7@1<--R%^G@p! z8|esp_M=6&CxOzijU*i@fJh>dUt-K8dV-;!qAvlFS3098rcb2lL`tQe5Eueng?0$k z&hQF+(8C*fw<RsLHSPtb#nfs|f z7S4ez+lI*#Ci-)+&9<^n(EAfgYgb99(6OJS@L?I^`X+Bq9cJCnG$^L!5kSBqXXeRjh(7}?x7|H)5&9%=^Yt6XtH75 zy@`(@tHXJ_^%~a8$S77{i8zyKRF;fq7px*oZo^u&e-OeiN9QKw@ELAXn>Ct7+jDC> z#K<*JWjnLwQPnxnL0vy22^h2T zY0Gu_SGL7+^m`&NvihImr`Lh0CF&U1Z;j;HJ4$*k^`=2{pQ~FXy}W%|+BuhUU^W-!ol^VNp%Hiv(p3#B=XVCmGio*!gZ4;uPGV!A93Ee)9a_VsBckWDqweB zOTgXagH+y1!Ie)fskFGY26k1WPfgKz@Oi_H@>QWbOI)+-+yo521G>G(<58MhdV@?_ zF3xG+|Cw^|@d2ZeBq9g&z~p+xm?PZ*Hy}>1;(Nk_D8E0Z9~{JkC+`HWm4i{ZrO^_H zX%N9|oAY?ab^VTCYh64&m}R{m^t#FbN*7P84BwdR6<*ZHM(bp8l{45 zw6nh8zGe3SCq?knGxP2qfK+IFh5ec*L|;YJvv&EP=IM`{S>=r=SAj(ImrjO zRg7KO!|1m4>4E)B86H#4fXtfZkU}Q@s+CK=%=SF7De!mnlHn?y&29&<3Q7PZEW zqtQR?sO~zn{DCNTGj{`Aud?Q?FN#laecq>qjNi=lU}GXpCP-keV>%Z9N@-&Jb>q8bGy{JJzuf(Bi;0R5c}8@vTnS z^BEs-;$5W*J3hlXbJp}8GEbnQSz-=6^;G-9J&NT8ZA5zi_IHMeXeprTF(L#60^!Tj z>0f67yt8Nib9eyA0S-V3I*|sz)wbI&L;hJs)n+-d!~XdNnxJ^8MXQDP{0jZD#v1hH zc!2?cJWwx103bc+SO$Py`!OKmg(Km-g0hx1IR2miQWNNF&qFg`;2;uo0A&JeFidT0 z)WQpCZEC{pKb6|t|5ScUfd#zKXF2_WgK*^mIJIz}*1McvCUux|9VQ#A+w=mr2%f>0F!guwbleFp+baEcnI z^gES8CuBwOVX}!JYO3$m7-@;gYW=Hq)VD1+WK>Wxb4QxB=BCoOEus9BcYxoSp~8EZ zR02`Ou+R;hG>d-%lGb5K!9h&#j8G&xnH|VMuT{^!tCNwju~TKBk2kCcycXu0l&Ezc zCCR)S0XODA9NNM#AQYQ2Wf*3)2qU@`xp=D#Bbr4hD73bR7o6EZ-~!&se*k@$Y+Gys zOHJ>FsK2&BZa4aUeIw_b6;DHwEOY)|eZ`LT(n-OIweI*4PgJJG-0Dg-79;_5&^hn0 zn_lz>Bjb1P-4)4F5~|@TBn!<6zMTZG6sIC-dj*$fT76@B13dPuTRe4R^zO}$+*2H9 zbV}x&K3OPqNa0p&4qdHTcAv8{WLa3%`ij>j_Zr8vDNqbid3_MqsMi`%G7&SnnsVcF z`4L>M;fbz3L-YyPjZ)!CSm$~byHjeDm_{hQD#c+BzEhG%ln#v%4Ob|4D0f(6sNyER zF*;HieR}+gJn(qwTi~%#PP=zl`&xFgMktmZ)7J!-QTw@5`ktTswA}Xd$%U*}MId#a z`!jJAfyV5#vRJsi_wTvGV|3iLh*Rvp%X?AjPhY{;K4-IjKjp|sKDdnuO;3H-S;Rz# zC`b9`Yjf=4Xnsps$m92=qj=B}>wDrT5lq_@x`c0mkR*;wz=iqsL|)zqh&cK?3=CcU5AraaZ}BP>Vq<72qc#-r&qSRz;X_9ub@ z`6oESUeW?b$Z^@s#Bmor_5jAq_!b}Dl6X$fEhgX~wfjWU^*Qk>=m~;klVULD0?uC6 zH+W4N5q8UuT$dx`TDzD5buR(XZ1A&RBF6^~)9ml6B@d#hfofd-C- z5_=^xL+aa^@0`8&uRNrXM^RDWcFjg(Z$=D}28Hv1eiuNI=pyPXnDeq@T+~FtfMYDw zBuz>pkc7Y!&2Pu`W$|zf2u^Kt^k1oM{*3I}ie{J>*8s9101xyDMF0jcDcQSy{wP%?{EI(rfz6tm{zGd}n&1$8|U>UyDwn$wd#NWG^E7oJBqd^9e|6RtME@&7SYBi&!rhd0o-U{F!E5aETwVeh%+lQAiWaPV zdN{~P!PoEPKiXUYhgu|94Y=`%rn=pbyF)`@5`s?&Vh-#Oi%;#}GKk}6x0#1WA*tJ1 znaF@HU~0u|vhXa~SnxlOMD)S5RJpl&5gr~CGu*eX%&g4q9J<{ZoFMWN7mn``oIiN2 ztfYb8`8!UHTL2t#H?EzyIUKv{k}W(Pr`R3@>%0+PEz|i3>^>w2KpL%i|F&`Iz$y!G z1Oetxp&`!`_Geu zVVy>Tg)Q$We&vbw|HKbAXCse@Wpp1fDP-)b!A+8sz*g1mF{?)4a45dK;^^6N(|df! z_<6!nB@E~yfpYr&+^=K@AsTto)%#PheI19D%s`Qy4Ld3_-WEQx%;vW3G_-R$>B-exjiiE}=d7#s9W2?p?c-QaOs z*;vmrI4nMrXOl*K2|rdpI}F1k+8}#q5kItg>oX6;$SrPcCYSPAUa24}ZWAqjLPf$T z$ zL{TY4z~r)sa(5sR5UQ5yJun^TA9C>;cU7{%j}~}a`z|5H1&_{R0C%)=W-LoJC?H=Vv#Vd@ zXO>MBA!A=_#x@v#@S%jMn5?+ojBb!!J{g!$R+SfRmQQssi9Jl|p=C_g z)llRIRXw3)gDzLP>q)^v+biAqPvovSn1(u`_Kg0p43h!Ww!M7UQ|y;&Oe8A@-5J3B zes}s1M;yBk!ge!ubwrKRS}kb}!-93zr}@2nekfZ)=@Jmi#;Ap8J-S{d@#uY2i()M5 zT^>=Hz8UDf1c{WZc~BSFR3VLYY)=94UG1p(k~pTt^Sw2w7R@qMYPeYEA!)CPJWYVRRAEN83j*I7tct1%DXL|E^5a_qV9lWHbT>wEi!lX z{)GgOl#D)#V?6vglqpNbo+rkW=cjYB5?b!w_l^$(80y~iy&)XU2YUu>p&CG9W!Ywk zao+hP^MV5U=|uDVe7a$+j$Hcg;+#U*-Y zuf|Wc9dmMVGg=mHBeLVJidMCIfjBz$ByGAgw9gZXEGli9W?_swoI~D{4Fg)Inx`1N z^bAF1>bsl520%J81Y84q$i=r6sLVT}rlHY7YI(5y7N=o9mNCiy1UDN594# zE)jRRGjxXCo1=5Dw(}#j*`xw^**kQGMU^9QPrmaiMBxW$6vdOX`r*yg`jZ^83i)R$pjwPo})Wk&S5~A6N)kK;ENFh&GE#9@-f8# zR2X7p`DkKj=1gL2=ImVtL*9YtLmq)@Lo|Wxa%h3hLu7&QL&Sk{a*nGm@16x^sa5jF z!fiFC;5bm~x64yvkol^8>NJC^Lcw{t_Z18jXok_##W=@uVYG{OH5q$3`HFvq?bL;7 zS3!QSmei3=Ysjq6^}nBx90;E1LFA~-wKP_Khs7VHfK>+me7mor*u~-S>EX3d ziO1!ikXkx{*#|5*2ncwz{~J=PJ?l<|`m->sjU3qdXW`^FLi*1-50Q{G0kskyB&`g< zt6iSJ`QP;%eF8XEm2grIpTIKn8mR9Io{9asHKVp*cab4ApnwUc?qH=v%-fmDmPAJ< zZEWa;N5V)s`dR+ltqzpx4k<2o%+o z%jGQ(>N2s>wCa^o2P7=(gbU|fkdk8dBYFE|-EX}o`dHLS(-7GJR+W0JU3U0DKXV^`yDW^2e^ zPR!)Y@qQ8+aK^`ukjQ~ou$q2wFri+qC;bWczix1X@sM=hef_ba!J ztaRZg5LRo>dWy)G4HX0B#b9&x^k2*?W0KZ-9+Nt38FJwbs>Vc00+{nt3N`ArZn8~O zGpV^z(I@3cf!AM*Vrc4siMuHhOISW>{Yv$U$qPvds;EYFvZOL*xmJ5lQLcr(LwTDI zUg9wB*5BUSq?zLqeWsd{z^dn|*aQd^nIN_0nUq6SZgOI+iKcbrTtp@K?pGMwHz*7~ zD)3)33+8XSwUTLGPflJ?aZ;mufp+ycF@ab#lxH8D)OzWBl;7xF8*a}7?{d#&p&t|lwfi!xER8G`4E(eZ3-@nke=l)xlg zYPUsnmLgg?zBaqr&ZTIs>PJwSMxn7aoc6u|^iTTLzBEXeE2(DL)>XM1%UdF&C#X?K zH*q!Co|Vxxjhr)2@c{@`mE-`i~sb zi49Lvg0{&O1pBz-KiO;OVH^#<&|)qQH^s~LlIm$ZVcO9P#Tp~UtT_j3k5OH_X4&h8rfnX2=M6M{Hhx>m&q&a1r(Y1#Z`omX6-C_}r%Gs9pi>b{Zc!~V*!m)ob)33=wKQwUw8|zh5i;Gd+C8s} zhcC2}&t0~!g}!7qSx@ZA9qC_?Cfh8RqLh!1Zk$Kp6%V{M-lKJw2XV=|1!Z_GH9H`Q=U=zsA@02na2n?zvPz5POnb3{zB6S{NOTz(WzJ z5pD2QdCAR{+Bp^1aCCJ{-@HrQ>f_lO zCj=%%Ya0fjUrAMTtQqZ=kL6fG0Q9C=Dtdh44uPUY0V&{AaCaG!7jPr(pWZ!UCDx(5 zW5+8DYo`zxliG#zI>-rwM_Mw_pi-*m#-Ewyf$E1z@?T!9xxzmMh<}34y zUZKRPrc3ul&i?9Bag-46rH8?F4@4xnR!b6q9;0m&qcmidX6 zMP2FB*JcOkQZWLmcoX?hGxwH8>%~IjA12}2&XqU$?7u|frhWmMF20IGgVPHttPUg` z9#EIAz;|Yn7S`HCN7&_NOkGPj<4gDfGrR*tVN3+RD?iUMqV+*h=+a`tTI#W_W4~XN zKynYCnWvh47gN;VZGu6Jwv-(vJxQkE8cs3Mi!o1=+3kA)+0x6Fl7o`$K>)jNFNa7@ zQIVtV6DYpf=%Mh091|hDDNB8%zIo;$^@K4V4%{e$^_W!m0||(>j*xryzCq|0sC5D^ zV|0~fvKn16_8n!O?00*4rT3KSyH1t9OZtQa&qe=q6{sH>ai)|=e)LxKd@U5sUQNXv z1B-j(9wngX1TTv$kYVlnlK>_nI3-s6Z?l=1uQ zHr0JnWpw-Z<9LdCtnt?z8`!p^ahaw-h6|?(isB!p0!=z&x{ON(H*8%st!WvD70L0J zH&G%Z`cgHYeYt^W=Fx^oWGvhsy>Z0S1 zFcK#}5;Lq+x7Xzzk!D}l$eZo9<%JQHnWhx85}llWfu%ud2tO2SAnu9%BZFuIctUE- zu;`5F5bGZj13olVJn@IIRCK+SOwZ+;(}H%CUgoK+-f+U29F%E8Gf8ZQZ-pCInRM&p z%`k@<53f;wMV{}`_G%LMa&n!c=;E}S5&87g{=`zgo)aihCIljEFlA}=&B43#u)CXZ z?m?VHIrW)6KZA4q!@eFQOER^1jR^rEh5CP|HVHzRl(p+Cqc0mrwbg6&FI&&Qw~&}? zQ+DA0wWCx!v5WrCl&5-)z83Z9JB}~+GuKB1 zfX}DeDSeA7vsCV%!)BMT)fCrRT{{mb5cGpmURolizUW$_R@{V!G3J+HyHN+gjZoZwKBZb--!V%!jC>zo$%3W@Ru|>cWGgg1h2H+$;Y zwG~BoZQD7M+0Qd=@4pk${~WPiHR9Bpba@Y4bw628?^u`Uwc!r`P&jI`VuL-`)W*?V z{7$x$U0%PG=>vLm!c$0WTiI- zDs-V4s5$b+uvct5VLjZU5>XR!FVvaN*$$`k3V9#uOmb(KBw+FPa)VQ(52Q=>I}-HX zEHVw7g}l1xtR5kn`?SZKyzxspyyU>gvhHK)Pp^&*32x}sQ}Z*gO4x>OH5mO%y2WP` z)VdQrns=AY#L~J8bVYKxOSFnwztl~`fQ6bzQ|DY8tSk?tKx}$+=OHsV-hEbNNhh9g z3RS|WO&v^>U^ZCyK=Gb#p9g=oP7ey+w;sqBxT(@&u~cHor1HUxlF9I?a>>XG5W3W6 zAp?oAhNS8w6px2!+`g=r9AJl4-OO(P;txAUWGd;mM1g_M$#GLMpyDvyd5{kzy9G*Tl*Ea8LpHj6o3Ey7YI86qYI<|GJ(QAjbt!p=i>oP#p0{3NZ$p~= zFbPIY2*2JbH{f6h?8*`w`#ZSN1J$3HP4OAhH>k!+6x@T>O6NQ1h5GP?difZAphDyj zG?%v&&P*{-oL;R>Trk;h^80+EarKQEKc^7te}n50hVL5`rd5{(kA7M0JdT*SL#5Y|%*pz-D{Pr)P7Pq5f@WwO> z?0>lzu%iGussm6P3y}b>FQdE>9EK`?i83{Uj~)TNIFUxM!!dsS$8R)(<7?CZyNIF$ zF=_(v8+T{{k^guTHwJ*fi(diDQ-XY00LYDd3;?@Ve+t0|E08Am*+Vsg%lBWFZ6L7! zVQ>7*0cd_)6^FVc-*=*f$AAR}=A_lt*16$c2tz?Z}U|HKH9 zBmjIbwek`G5v1Q|I{eQeE1(n!fEv>8tn>eK00iiV1VEkiH|pOh>fik9cyb5`Ji-Jr zW0KzokRvCw;=TrDNdgc_f3y7ibx+p6M7l`8BDmnATQC#a0WhE{DF75ACdB`qiw;7P z0^mc&YWzW^YoIZz$O9n%4fuCB^lxe=W3UkWZ_1Z|BB=f+3Xnt$Rz|o9a z3kd;H2?YVc_?L#oe+2$SQxn?lQ9u)N|KT%`2J9NP3Qg8^C z=%qAP9)J&62RX?Ai2iE(w?T0e_ncS3_a7$sO!vRLfC~iE5Q3s*0OWs6Kk$ks1Mikl=Xj3(|O?T*n-YGzKGS{^}1!@E@d{ECBBh=S=h_wgVW|0&bn+8juIycfT#$5>)$H8*EuoaLDOzH8uW$g2TzAf1t{jjCrPDs4p1$x4~d5f3uQ; z92Edqf1v3#7Sml|+rIrT+qT!dDA1|!k8%GU^ZNUO&DQ^hQh`Vm0eCM%Q$P{iyV~YI z3<(v@n4nVWf4cGStsSPnti9Lr(jYikM)F5D*wp3-Zm?dQ;GH0zzo6PZFU(mZm>^*# z0QR4O$rJOCm;~;%G}!e~{{_DucwvrH0^q)wxLgUW-^$2;Snxs5O8*%ND9Yd}z~qYr zcpr)Ck1j9swwGz!-`0OS^Bel7^U&bEB^Xev@_(pCep8XJzEDA_0I*&fCsF|y8)pI(s{;14zd@jh-|~oiFY*(+7$5@G|Fp=U z3a(N(`dvi|vQP!!{!!kxtRra*2^_5?hk#)C%QEX1|6zemD7}COjr1Q~7`izy%3t{Kt$68sN%Vfbpe84RWBjiU z0SpWd?0pp4YY%5%4~?*PLMYunJHn%NK^4tTd}FF!2GR(7V{CrC!#ECkHl14(aN;D za}~8kw?`vFS$_~SCyX(@a@hqy1?2|GaHo<`Jsr%(5C?2AO?L4jsQ zf|nu*lHuFDUZB|o(w0mX{7$hM?>57UAdZm^WANRgjrFlkagc)PTdw2=(Tbs7^F1d@ z81la;_Y-@?zyBTh;P@F9h;M$yAq|AtW=#pZ;8>ZXP+YRks3F2fTDJ}%Dn9A^;#i9F zq>)Q2=D@FA#^raR)vbtMrIo_&YqFJm^D`(?Bi;8hItJW*- ze8{zw;@p?RQp=Q8SF2Tx1zKLH(SNwJ&7>O#0uUwMCD?Qsnkm`%Rm)2~2n(9UTbj*5 z9&v#4E4MtqT!;?&av%OF@gBCUdevY*eLl{s7QHh1>yxrnHeE`wWMH-X!^BFpYBNxH zagthP+x%`CHNm(Kz{pmUU>uvfhLC#M0`$^mZqA>2CUASt1fFlRD$vLmBXV>t#3{HX z0&u3CA_3`J*2NhC82VIE-Fg<96Ad7l6yH*y=A~OJ?!`HqUh!fp#0z3>U9)Ml(jHma zwrGFL^7GI*c61T1F6ppEtV4q-0i~^5F_8PRMM9$=9lQO?t@+odPMEG)$11RW@|vJa zU+Br= zBXcl&mCMC^f@RCce9)XW%U0=Sx^^&{)I z96n)2DZT*sgbtoP97OSWa^jE#rkJ&rZJ9Y2080C3vr2B^ZDf7P7 zx&nWEEC+6$PjDpA5a4ATG(nKYTB1FxdoY@+0p2pK!=>_`zB_?WtOtoqmtG z(^+2SmihzQ{Z&hwc6FTZy^^4X3+>n~&aH9pN;Cc5YV8xVU9*lgPLQvEAi}LnT5n|( z?Za8k^+=3+?Jv}TM%&o#J#&|J@`GBvoAwRLm^mQHaHDR>-uRuE*1hQ_+7rg1PVqUM zPxFqlGDo)4O?+pDKlQ;Q*OzdElr*<@HDi|kpL^JxJRgm@BaE}gHA;NsM&9m8-To>> z*x%NhMH_fdYn>1w<{)Z6b-3s7t07EQAM59)RKk!DJmD(?#O;zzYFSr}U#Gfj=uTg_ z%<<$#@6(TjVb!?~D21SxC2^gV3+PyblY;8Uw%05DQU~}2ky90)o@i2QMx*>&;JeAdsRnG69O!+^*CkxW8`bC(R=|P01yFpSxc?tTb?i>v? z$f|Tw&GV<8-Vn&`#wku|QvLiSUd2&l9l&x^_S`}EB1)zaXG|`>ZNPkg;agS6=T(Z>{3@Mw55uns!?mg4lgX)-hMIQ8waMUNI(;-u zDLYoBj!Hi70Z`IVzVjL-I0$S0(J+spPCU7 zARo)h%`7@LwZ;lY#;ZImgGtbm_kyi1U7Y9<&_8q3*})|YU*KC8k}K# zVypO7K)+xh`-BrCjo) zO7yf@WC1V4?`(Z&0rD5HEu)H1ix(uUT%|QbVkZ8OX6)D8X}rMpjdg zwGg{&Wnw0f=hDZusAj|u;n~o{f-)~L) z3tzb7Uuobeqj(LYRb?_aQF)l}62Z58JGX~IDqRmSN~GHA54e4@^WJ;UNc1R+qTq-& z$!s^}3B116{=i~Y01A8Z9e=m`|H z@hTlTyF6U3kuy}7E7XMzIq>(>Ze+ zsxtu<3~sB^EY7G^2(c*>zQ)Z%JE~N14dK^6AeorrWOlTibbzlWC~r=#uDq5;zAKkC z(9w%pzjcQHT)d=%x;Ce)2naHLbv+U(+yX1ye9yWmdABz94h7HoY!&@1NSlXneEk0m z_*5cA=8`c*yIH?lk(7qfq;rcyA6P3szPv|d*>9SryQr0AO#aGsd57=ZVXbP?{We#J zlu3Q`|8vUl)BP1^(0TV=S-{P>ol(?sN^nL18;%oDxn|=HijBB^VOO+RA#ecIPGA1@ zsWIesrzg!wbN{ex=iut{L!VNf<{C5mD_w7Bg*VsLwQ^%)bMWEXmCAtK)(~x|8W-Af zZGLag3!q-?OcFo$u>1hXd9AxRSK{M*Xo!`Uk)NH@%fOdDBLU?sIfXQfef1|2h##dK zq9YL$pEL(SW*DLSj=NDg7x3dVvBIo?=vtHdQsf_5{35;5j)0{jy9ZCw%gi+4 zwN{2`dYWD_a3b%!(4-T;fD=OI-x5wx9Sz&u=7bfeg6vZbc2PD;z77oR7adKh4WbnKUfie9f9hPkz8M>_Kxa_C>*5>{t*?78;hZQQ=PU1 zx_DK3kXy?*5ZFP}X14iXq$X#gi?iLflf|BAwvniKr9R@W2tDl}*~^6Og{|zX1g2%~ z#O=8xWDbyw^!Etg=)jT_ zOa*}^+LjG@vW*Z}PR-Z!3f4Y9i9&bHnlc1$$o&XS?0FEyJ{4wVe&pw2jckN_i%`vC zJ{ocE-@yyD4%mllHK~zYs-#hjv$ZiUW2Z@2l(BR|Pof!*MY3Fbd5gr%PoOY@s3uHI z#GBUQ%JJ+}EQ7Gnf|5<)@(7EZqpYaqouW`G)0XRzd9zw)^;3GzPJhlsf${)xQiqc+y+5~C(>!)uZ>ihAH^e2 z$R3`^iYy;qGlu(N_t`jgICSE+3p;j`@sL310wbgjSG1tc%Jbq;U3?lSM1O`asg}Kc zXhOkKQFkk9WykHMyR`EX8SnI|hGZ^II}bx!R)@nyLNl|rgH_Xo5Yfru+CK+p9&so$ z0!v6|?OECXQ+WxqH$QIEBb|_?aCLkKRp+oYlkm*oW z81+yOCz=ZGUP-l5-*#^A`ti47-1&!Q{m1I<-7g<-l&bXm1Rq2YN_Bgq>K9^s)jXOS zY@?iiGJo(I2amnWUy^-5mFi)ln6(rpSHJ=4P8$BqsI4o~Pc{rm% zkjGOq>6uYt%tsVjO;si z{cQQVGZoYlmrMmZ*H!7nn>LM^ZfqjksBq?B&Mn;}BSW7lVGGRh~h0|ujs6g_{yKyayNt1TXxExL& zf8g(R7P+EDrF|k%W)$oiV|hlS({QK~K10YX7yvgg6oL$FO9eBfuRku0+`$;wkurP3k-9h_vCs>!ZOry6;H>Ca*ILUzYIMSL*xmJY1!89z0GY)Y`NwtPb^z zl>11>eiPm&ov$v?l0)paokM=JGlFV^V88SptjeSdF<`)P4re!TgHnc zb#fnV-qQffB_lK!;=5)o(GT%f4xKH%sd11D2l%5Ey3M5-Lz!wr3UJh?E(K?iqpk?L zY{cIf5hppTSelbsEOT!CwVu*+Ni3(L!>Hm0jkZlE(aH75B1|!0*BqvUGD5dopocMH zyIbIMmQ_2v%IhP}<7q3_Ue0VQjK5lkwQB%-dFiIXt5?jcmwsvfRA$TgpFPsipA1lo zYdqG%Ux!k;SJ(WIC!v_5%P$cDl4=hCYP8^l4X%7eN4zf=4r z?Qgi?Y_E>SLH$3=`+vXPf`9w+4(^M*MPK||OgI)8dxr~OavjeRnw#YE^QoVFHh`*y z{kg4?=$-EU6b*NTK{^6U`6!HsQKkSIhou!h^8ts?KO4g}^Ne{EFrRgV4|WNDZP6}7 zbYXwF3z-kteoIZjld03Kp$@(Lx(#QCZY1_}df6wA3Kjh9fSEON{^4rxXy#J z{PNu_T1OZ%QGsL(F5g*0Nv#`*-6NdR_3mFhV!^ZOi~*Age)4M?V?tv(XG-&U8&a>? zGrz&6$6;npi40axT?yThThn+OQMSEm(g)@F^=25o>pP|5)T?0mYc1}y>$Z1tm5JS3 zxKh0do}(#S>k$CsSQ~?UeJCP&{3XG6o4bV%=_&d5P8sk7|I3e*$5NXnDQRa z+I>y_^m|efd2qNkOv=pRXIdUZnM}uNH4zt?0`{PnecM#TeDb;kdW{IpEjwlk+eS#$ zjF4!|FfLqjl`P&|DE1rUbSF2TBF7jxG+j8v6#6Dg{XJCc`XTWIcD5u|Q7&~*CbcLU zf9Qws;A?{8P+Gn)=A>w|%)TKtf8_3i?5NEDJ?0oI_S9qDyIg>B^;5XS>XqxI9Cr>$ zmD-Y6(ghaghiiqi)TATfP02((n~G0d2JJV^-@G+Nhk6lwg|B~LN^-DpJVMpF`Pg7! z#jIfe#sBZ^c{&pVI7#x|5BzjgNpLt&X^NaJhB9v0elk@qMHyG@b3irUmPWPd64hF_ zHDB$bS&@Pc4gy~$z{4$zHaYSLxbTDI0tFRw$45+D97?|v{RtMX%bEH@=d-Vcr_`em zZt^kjd?wQsI7fLK(B}nB63VVTu|Yg&a~+{nnck`>Dm)DwV;Tc9bShVGn$bFO$WmvfQi?a`d<{ zC%`7|nu$Jud}5RZLEVU`zi7kftEh%u9t|g|H-DsixGN_0vRU z`dqg7>dnQRtUfkhu@tlnp|ASp5>Rs2o#bn%H%?B8y-KP2@vla&X&kUBV;ZW`#`)N( zVnMSfmhO(EZ-8bve4Z!=XDZ00<`Mkb$-dX)xRd{quxmW z=nLvy{_F74aZA71?PoZeXZ1!-fhxkyXdQv=PT-;Rvh>d+i!GQz{}ENKE5m#WfoY(i z#uyt(7G>Qz_<_pdkn5CaXH;XWr&!<~`x(OZ}}O zO|q|c$dqIf%+5{94r6reL|RUJ?7P)|PIFxQW0wt4_+0e!Dalwj?$i+N0+&b^3l68E z_NV8hi+pXXI(KiDL3?Fc_0{h&MttM>WA*k^yfaYH=#nsKe6gLOcm|R&EAH~L@3+F< zil^I^oI7CKUT02n^ND*mEQB6iNbZ2{0X|0@1mQ|U!Ge;?cch7_>&b;VTiX^h3q9RJ zP<7sE0D-t;mw3-xJn<09quzMrN-Cf z{@u4mx2RUNsc57>a=IHBT?-nd=+ztZcI^rgxM>YZ)N;|I7D}Icxbih;cV_P9=ofmo z<= z_>|J;a{hUq77CtK0Ci~8A8s;l(_Gjm!Mp0IFTSHr;Dr+PL@|FHVV+u(loSNZqKYw- z8uUjAOI_fB`1-_n^xj|&OWQn>Bq36z`5|MIWCO>fiv!1Gl0S5Q81JtO4EELgM}O-0N(55+rX}G+Mbk1)#OzJ+H~9%r@rSdtQsv*y)*6>m`$m7r5?7oG z|M}5haLo48G~|v|s1UGB2bO+8P>x4fF3$GO{XeK74TYj}{D&I*|A$)g!VeKpkEb7& z#5zyF+>D)vYja>i!cQ8POVZFP8gOO4MGBI_hzQiAY$r+z(!XIv@mS*5y#*#BlpZ37 z5JAt%4S)9hT~D zU>L`N!A$&QNdRC%#)?2d>f?lg5cRkM$RN|1lJpkFm{{>B*sX>O7=tlkZg5N3q)iv{ zMEHUM`fg4lmWzq(nOzqrLBkD;&<2Z{A~;h~bzwX)`MbE|vjzOY#4!uWBFu9y7Hs~w zPYRgYMfs#n`Yh@vPWp9nCz0O(n2wR3tPzbcuA`_pfx~!&gPVnVz7&?AcoUWw5uxBi zfF$mbl~{~f)i~~vmRO97vQ#k=>lmsj5^G#I+a4+gfOQcSI*exyb)2AR0aYT5hHHdE zOrC25zAK|B8eLzWbA$s&9%osfMPbIMh#KFdj1;&u%78P2z3lGH_Lol=r~EGD4A-O% zQC6ao^o;Tlv4{cQGs*=7L#(gnw4WN5;Rshx3UnW2Yy3r^**PMrJX?tm(+a?5tuQ?> zJ+L%+24Md-i6l*Palu>9v4~hkx@Q*4F^*tIa!wzF{rAvi)8)3b?~1~~IR<}cJ60S&Dqsyje$t6d#qsOwE$^~ayj zU0U`L1U%lwOb#xCwI;E0I}8r2Bei;7*-UHrM;^ev!f1Y^#<*mpu8wI`Pl6+2v7Kq? zzn4b=I5n0s^Jpk6UI~LfFa)>)BL~JX1W1jOsNiFJGe*%&ZCwY-#Fykb`(x7EohOUp z_ZeP0sERDj`DUQI6w+_|h;pQR!1}FG!z?Ple#rVP>b%Q0Z{F5pm{(xt16g{{$q>ru zbeLCYem(vXXF#7r1b4@Sf_~3w5Q^5jBf$}oSkH9l-;9Y5y?@}rDEdd_vWHSfre~Mb zIqxaqoztlKiQZB3NcW+neH4T2BCT zuCJ5y%``z`#1<0{VQvIX-K4&_Np}9R*X9#@pV$BO`Q$7XW6Xr-%-AQ46Kp30#9q!% zz{HT<25o!+!2sS2HW#?yVZ0L-o}fV`7_;~GsbT=HeEOR}*r7lyT9`mq8Iu$nPuO5% z7@_&ZB2$NEoH5Hf$$~QhKqDvgU~K@mpnW#PM{Lh4SSpo{6;{J>;wR>VA=!X+FxA_c#vDc{JQ z0O12y@m&&0e*-SrOZF3jiBHNp~Rtyc#MJ}*Z1&8J|Q#CY^Y3|p(tLekzOQ@>s zR0PrF+HHF|A*obT^HBv#5j%bQ)OY7}K{wC7a@9TM-dB?AnrdEGsC-#N>XU#es_S2%N~4_ZGNt8C~@ zBh@(NN*ZXmf}s2mamLXLif|z^kpq)PL8g-9 zDicrMp8-b~AzfMTTevDWeyIvts70KGw2aL?D~38p_xu%;=A4K)Ynr~(vR`{yHX$OR zYAgj){PVwQ3HUB5$YGH0Qq_?nMDbau*rXm5=&DIq86JJ7q!c7^7w8ZQVO9)$1W)01 zkJ@y#RR2`sE3r5*{8iP_IJ1m8KbhWJyT>?mhoDSBRsWI&@8HdNz!4i(N)Xr?D`*!EO55{)4B$w+H(a5jfNmrX8AbSYVu>iaOX|uBXg$??!+<8H>~7+gu~}~( z3dO!p_KVZ~D>Eum_g)4=^B9S$&e(}QcpIwDO(X&@(WIOAc4sds{lAm{Vpt76CoxI%PXk|913!1suot#)vZmNnZ zeeJDdzxF{7gz;l6788P#D62h6AdEJB8mmk|v5w>P%>@hE&y{M9^%PnyBHO7r5*#Mm zIhvL^1t;^t#5*z)<;X|XfR35{^z;Ei-@tmR+Uwn)#?Mn1-CcA2br*~CdG*x6v9;Sw zzOXxpXLnc7p>lnHKSlF+oyuV#+|4_dwmx+|^TDSRq?68_@gPY&qu>%7`S%!-Dqu8X zpQR&(ipeppJ);9rnEl=xdm01a!SaeCBx7^=pzY$uTz8+=J(Sqfn)TZBuFL`IqIFDd zR}KnVTrPi;r5AkrBdgddc!maTI;L|>csCNq2-K;3m6+Lbgg&0AM~(ffEe#tn>ik+~yOcCYx1|iU5H^|O+1U2`xJ*8igL2<~ zs{0fHzhK&Y%J-zVtVeOraSHY%m}5_?nElkJGZ1RGd1ni2@wJq{8pXLbpZ14I@^-x9 z)q}CBLrS*1AC@88Jts^(yI0~MJz$T71kxp#mV279Ma-deyF6f`rG1KD!4Es1T)Dfb zN*lBz)vX9BM+(mV7GKr=%<8IHOO7sZW{lK+Dv+nMY^t#_U~m5D^yX7boWL4gMnH5` zc#GH(CsnS-)<2rS8`h`li*!^LxYd>|lyB|6eE(@WdU!3JM=^k%dsrYj&R;_Ul#q85 z<@{rmY+=wP&Jm|=TS-N$C&rszJ;18pKAbN^wKohR?t-*5@lX5>!2jT~kgY$pM zGzXT>4UM4dQd+ASy#Bd_O*sK5~IFNx~w8 z$`z!n6|c~FjLHrN`%Kjre4F)3{%v+N|7wT! z^G~*&Ht%>Nh7q*78x5BTm-)rn5$}(q$iMaYiKH`UJy5=}J=T~JYQNAws2da*k`ojO zh-TA}IgHm8Ban|j^P$j&DkF@=Hjc4deu8kxk_pw#rnpbCYoZ)^vxE}X)E-tJ?BC*O z_f!8i&z*Oa12b7Hmrg2O$Kta1Z00f|i=(Jx2yCbRcJPt6`D~f_#IT=!=xx&$y@Xg7 zBOsQ|0owol612~5&}6JRq-oIY7zntL(5($E{Z1IBvYx@^EbS=p67AdO&Tm=Q*8v$A zj7QUYvwEVmuUn4NM^B1Q)7n(JCQAoB-T)20#NN;pUrkj5$b>mhncgy)gwJP!%RWT| ztf%TJYSr@(%1=`CV&0G%$8-joY zavNZ)rHn}HzN!pHWwo~SBx!K7Jm?LQJTd@t#v^(pN8{#EL&J9p&pm5>@Jl&B9MO+r z%Sz`{pmbH6B6s3Qi6K{_CP6U6=X~P*(jec{AeA~M8DE>fuc~ZCkz$z)aeQq>6_M@+ z6M$mXNMBpuge#9>36o6j{2}xEVN?HsY_K^hVlT^UhJjc+>e!Xs&)#PP2_(g6#(J8@ zO#(SIe;@2*9x|wtYB;7LxfORUoWI@!zS(18sT$~{x}-3<3D;6PhC!a zR&$kZb7_MbQRp?8(DvrXvW-HaQuqfFzeP4H=Z|{PCV%Wk}@i;1f86`)y&R1yv(c2R9ltp zBNf*y7VYcZN}^us(lE`q|FGVpd@hgdCv+^WjU6xJNLBN9W+73@rw#>Mjk8P7x-W<1 zULv)8FHT%5kx_E3fmqb(*pXo~=wdOd8XCMvCS!i|R`jG-Zavy9XZpb?c0ww0Faj6M zs^VfYC#7@MELGi=_1)bwD!ZH`vqd~%1aY6t7NSKQVf-iHtNM0mqSqt;Ff!|pz$Dpp z#;3)%p}|Ouazq5k8#z5f1(lc48O({HTA1UoCH?`zRDnZrs@JiaC>XN=SM$e zQ9i6uLH(Mi*Kyz96|A>&-OCin?pxL>h@!;3GeQZ3Aau`#a5D7HWxcaUU+L_UXS$#5 zeroFO(Sh8HBsYk0erhL|w*ARUwuahRZ3=u!{nr$_6f0R1 zsaGF$d|0PGZEs$6_;!FL1~;m(TWT#69OrgHpRttL8QkANqSK3$4+gnndQ1eAT zE^4y{p!|>pCOe&LItKL2!=?#MCXL*ul|?Omjz453rq-q5`#(bkq$L-=iv$pL4?a~4 zS>FtQ+hugAuWC?j8RQx-R#XeDrhdO+y96>)ek`o})4(i-n8Zh0KU69YyD$yV{D6*H zktiMCA7K+CPsD^>w81Q!6e*lv`zVvb(LdVs1Z}9h8C!GjTEXgCD!K2NqO2v+wzm9S zBuiT@O54!Flu1W%bWX<~Yo^vz>*9DN-pkZmRz=@sdggt!`d)(1R^gF-*(9T_%wI2I zpwlU18*Uo(S#yZ}lEq_uWdw5XWhr9Z{#(~su+d{fHa;-CjSxHL>vs%Gcjx?rwj*PQ z0fN5o4ftTuCF>mUJDcSc1x`C~Y=k9-k2C0rAUcW=XhSqsdpSf4N}4w3`uLkppJ{GI zzHhnEI|r!`>8KBFpDmE(X-RxIP(zV)3&qWzc3^92kR2Yh3)E$h8zEe3b&5(IVmfmy z_hdG^79~95EZ7Gd(~AFCesL_*+#7y}0gW7~mRF95Zb8LW*BSCu)(PM;jv9t%kq$BO zwWp%RxPm)6)hAIJfHpt>+j70&_LBKrNeDhSdF{~4Zcmt4V70tb(ZT4~SJMAYdfq4m zid?AtvVKcR(6Q>_uIp8Ht2mTspyilH^%q+wSDcS0#xDN zVGp?+IdQ`0sF1tfALB1xLXz{B6G%9a0e#xG6<<|*YSwg`H7zQpuKks9dy|#WaC8uv zS2`%2Vx7XEr^m8Jr4VI%Q>*8}ir3(dRW#}~EJ?6;RK_SiO{K?QnqtV`b*)ro5@pF6 zJN=u!s{ZINp^zomC?{62>=<^48AxQ>$|`8EGrm<>EL*gQZLfPpRj9IP=(2V~S8%m^ z;W9RjnLqjBS^J*5-nQ%cEQ0(#=E9tJ<|PE-ckYj&1|B|^YR*3^&Z@;zpOhGOr%Y7G zwKSOr4BMfn9tT6k3^i?k&iOL4WclypTab!e*rNA-7rWTza`*n%0#`9qXa)HT&NqmG zMY9^@+jk30veeU)4dpD@0;S;X;|2GASJIXLY1YN`qxf@Y5!aq&qGQT@&rr0fyJX_L zAmm|OOPQQNnA^g+C2mWcjIF7rZEgE8`&hgtK<-!?I!a}vxSr-zHOr((Nw8vuqOH+6 z`}dBu*I^X7=U5S0W}we_pa+D!x7Bi0Rs4HwEySFyEoFIu=;fhzJ{kPpWeUD0 zC_wW_UE|&6+#AWjRP^PZjiu4{7T=zitsdbK{bvj1mg z|8Qj=Pqlxp($VSaHmb6JyRx6U?9-rUUUokoMQa|`x%YYJ7mD_LxHG8udFMm`a?X|A zq0rK^s1@r+;U^cJ9~K7-_}%37?5|B13^m1+|b<+ejmij#G>leJ9;2czDWkX{xs(=1%N$A1P$w+NHtw-26UcjXdG_tW$! zYlH7nSv6K$WmHA{1>!FSP33^ODNZ&MgI^?WCI1BTu@BnY%p9Y-NY2gcfPc4e4B4ZF zgh+5FUp$kq_&JO8Q+RAlAt5)j0b|R;vI`~baq>_jC_$LuzwB%Fk~6$A#u z@;xB$PksN(7J?<>0cnJA&io1-SKixZPWv4RFpvO7*asgs0h-$dh~W|9<((*VjWv9h zT+fuuCMZ7O1N+gQ__G4YxwXjlfOp=w@(uWy^1sA+h_?nPq=V5f;Mfc3XM%{8ApHxm z9}1A;AcSKAeQ3fcSuoN>d2=LN%Q5~dYB2ku3lD)qh^rA1LpV|cMBA|J26**>L8f zKdu(=NOo7tf+OQqF#?G6Wv{&;@+s`81*x&&=pf~0K$2Ii3`9V}-xL>?Fh(irTv<~Y z*;dZ%!2l>Ddgli;=}`NT!J7qG;!trvgn#w~i7TX$-w@wfUl}@x_S)a35fNJurp>1Z zLo3b_S}|{Q?tXn#;Z&$gL>n?ltIN;V<7+0e9$i8_?xJ8+bzuQ18m_Q77|>Fos)*9s zk9MJypd@-XyI-EQ*yGxaF4x#^bVZZ*A$gTW+dIasv@zGEG(|FK#^;jl70o)BQqM&a z9GN4%R*UwMI`&k$_FI*O@H3GZ6;0qi5-mBRvABu$jTBJ>gZXWPE1BCy_+Mr7Zg<{# zmF#vsvrb1A1w+XX&u1)_qbB%h`uXyyyoF5dph3GAg7On;hhScIb_`dxXL)jN)l+ku zOZaT#KQS;DiMKv*XVBT{_c@bK(_$1{T6<6Ge#1-L8X4{j@dp?QV2VkXf)cWi0NO?1 zM98_cOn&(A0W{knP9b*>fcFl85WIef#tVrGV%ZCk?vUtiu-h!;c9`>yG;^PN0W5zA z1bK(2{03nVRDUS=3ga=@ZWgeg{Prb&_LseEfO!M&djRbYAujAo3mSH!2jAKq48O31 zmFj??;*N3U4rhgNnJ%nkMG`-?@OU}#WrRv%&1EG)M2v0MSHzY=>L4okSc^;uCWS$e z!OHg)aBm_t@j?tCQwsKMW)N9PynPY}+CsntVxHMSN5yLnGsrHKeZk*h^UhG^2%Yq4 zv)-Iko`l->;jkAL$Yb-sB{#FSml9(GC! zupFuKVL}8aI)*uc;jH6HItmqW@1hZnHn4~R)4OKCngs6% zA->U-xLdM-Ut*puOWC56O>Y&i%vGQ*R!?Daj8y4Ts5Gsn(O*O_MdkvP0&9!h%;i$p zB30sI7K)1|$}}Y|^jeyvt~!W<^>=%U3^9tkIv1y8)z@|SKMS z7v}Yl-z#{ysjvV(>@h13qST=YVXWn$Ru5|PolB0iZU=-Pbo_XGBb?`Sz8{U;rl`PIYF7nzvJC7lNWD_aWXDlYnY(tYx+0o!&DM(>mL| zKrL)u{qwl`)}&YA*VpPImY?G|cO=(~#+gJYxUnn* zAz0=8U=2UeYezv(cV7#<8CLsIP*Qkf4H5km={Wb4{A**WEtu5HaBZjJzNsI<2IktV z{NH|~a^`(wh!lmV)MivX5$8@*LwcF@k4)F^eqzW9GaPo}nq|`>Ib*bl&h7y!IjtK8 z?6oNl%!-xVsM3mnf!H3U#-vhOYCi9XILC8tYm+ zhqzRQk2TQ58FA8VFGco;4A*ZNE&^#Tlw>=uL^}wI>{*IzMvClOifk!quI>Nq-|fWN zYJ%MbynW^8GVW&2p3Y`Xbm}bQ?8I41f}O*xqKeq;ObOUd8)Q-~^}SsMZ8%jqb$PaJ zVS{^7x1frfy;tFk9R~Vtlv&c=FjDL}7YFda{Ab`18*rDb_7oGq@+rW-v!PxA@J_Js zciQL&j}!wqwBI1Sv_tv^Lc?IWJ9n=nE*Iv*>^r*C{V~r2K|dU!k-rBRe*5TGZwar8 z@Xugozn$p+lrR1XlVKR^r#@Q$#+kj16U*Aqt>x@@Z#-LX5tbHe>(yzvw1wo)Wu1Hnnzt{;OH} z+Qb=3(ri9Owjf2eKSlNzMRqVtq{q~%=zvb)0eB)90S)m64Pb)-{SfW&y`MarTeOKc z?M|M~@CSKzYi;W6k=Eu;vLh69az^Hb5eUn9YN(5Qf0b`==lt3`nWt<{zR7%P;nhg& zcq(j6`@gTcXZO)&7Zh8+bW48zNJKam$H$Cv(<0#;KqA9fi=1<6zkv7~S$9{!GlM?z zx(0Vd^3=u)?A%paV$<9oY0pUxB`ydQ+0kbVuX0O0@7eF5VAhBJ`}CGI9GWAIEe`tg z7;iGBbIVOu^zjkw`@MlffWq-;a{QULZ+{|wiyUNn%1t0OKH6#kEU8}bMLItnA>Fg3 z5C=XC9;})9gK_a-tY!CXEM(jL40hy3XCTA$7ceX39vLN&~l0&`}1MYveHx zZ^M2Q^?GLq+%AaP_RG(c^~#hSVKDYiwmwT@o`pSG`1|#4I??oQZsqI=EP-P7>|UdN zlD83hCu0`~q+XPL*m)eo-5)Sl`RcuIhWv;oHy5nhZ+`jxzPyfjJfhoc^NJeB+Ri=O z*0t*s-1uAs6FB4GW_u=DI9Hn51`D^uzrTw~<31PJ8P7!%FlJUwJUf^X8fA^P&xF|w zWiRIf9=^=pQB;2g!VcSjm_Qx0yooD)zgE7zR6fX5K4eN>l4WibNm}zoZG=--0`M!p z+&1VfjBr>ne5189D1l>y&IrWxX9tx16saPf=!NwrXVl!lAtl-bRxEH zbF=zt-nB>Kuf1^;yWh&fn``9tiR9gUZRE^TH~1+!eKsb1bPO`F?23X={|sO;*jh6v zuPzHB@;braLy@)25k`^tI|9lnN#PTIEIfO~W-2_PmBtX5Ksw<{t6;i-PynK6YAMyD)z>zJl;+^+anwH}DdsdH1Jly{& z>#F0bdV)O{0j0aUrMtVk8|m(p2Cqs_{P4$h_dBz* zbN0-cojGR*2}hwW)CK(^E1xO)sk@X$Bp#bEz5wz}buxka(^ZxKl`MoognpU<{MSRh z8<>|;08iIiwxs%oG`JNctd>oT7JPcoD7ez@3lfIDW|qbq58-C}vkrN>R$M{g@GSmk z$En7ZzLC!>yUsu~JPeE0Xfc--iGv< zM|!FfG5%nP!W!*&HVICn&q!eFhQBa7&n`t_8iL-y+($1TtnS8l3G@VKtQ6z4!fxob zxNs*tyL=!<#@AIY%wDds@m0PI!hJBRsw8HdIq!;(e`?|TVN`=ee0601b_My#?XfVX zj*xciWlq{!-{k|8P_5FsIFRzSV6Bv(0P}Z^eAy=@h&FTVDG!cgd-Vg4v~TJ>*W_0Z zdq>ERzOUX5*Tz2<{J1%bS;c_4l*?PaIBGv@w-=O!=eT zF1a1b?Pd`d(JH|CU9Iyw^45sX4@{lh?Tg%oRmPI*{HVQmGRHQaXmZ0w zKbPDRc!w~NX!$~mbu=EstL~8CPJ`0?SNSX5wnv*&|d^el`8J62U zpxPzD3V53MYHLPjz!V2OQ?cG)V}&-1EmC|uSU_&%ZMYUuPf z2S4n7nuWdO7nn^ka?W6D4fGm0n(0G+`w_Jqi-QMO*RU(j^vHf4(+FQ-LdIb=yg2Lp z;>^saV$PiNZ6c2oFn-uS*##ng@PjgC@K-c1?lh{X3aVM6+}3$Ph;8@J_4u)bKd+#l z+7J|@Ml(wH1&G*M5j*yufW&=)jd>hhUka~cb<}YzR5+uD;-pZ+g1~=WI9}|PRupMW zQXTp(2&EuXYfDxnqPR^4O*bQf3LQ61CqEptcjI4Ie$YJv7aB7vqvAy-zW+EAZ=UF% z7;D5|&Ce|coSa@r> z*zSQ!B#GFFhYQ-d73**;^?NDB57p+ddanyQ(_QeEs0-davOsvr zKrxNqQgwe?26n@=6;uUoW2WeuEERnVB~Ui8vI+U76cHV38nZBm;Ul#!VKD4WJO4pS z#RgwCkDDf#8mA*Jc`cS&BqI%4YB0_?G!2n@NUc9@=c|GXV`*GoF4uRXYI<_UN9wnW zh0zUP;oZu_IBdQicbZn^qc`0{qtK?-p;*SBtnfF@wit_!D@}GYyU0%%e#;!2&B6;^nrb(foVdt- zG{LGmI|C#koIz8qH>z~IjEk+n;vawI5G;Fhx%J~sg%pZ_z zgATky`MsdM!4($rFbm3A3Mnol$K(NCw57aW#o}_)IaER^GHnlhe^JG*QW7NWt3_PC zlB2WI``)~Xa+-uR!e~NlE^54b*qo}(2oU}b3^Q<4wX}gvw(AGd%KM#|25+Oc9M;Tc z9NXzRS*=I{^7%YgZuCPiT#HW9t}poby^ZGCxI{mu3~?=S=?Xm<4C~^|y{*w3(nj@= z-SBuPu4k@|dEiQ(>pWi1cH4W{R^LU}ap=T-mjNA3Qj!%>`r+CI^=-5u4(*|Fu^!~M z3$7<{dtaGh6e5!!y)4$Ui^>bBg=sWUvXQ`N0Fzs271|7tZO_dG(!63>+>34f zi&tLt{4y(a*aHvStatBQWXnJ|{lQzVE;+tHF_^7gmulIVHyVbG3WN;A8t7Y_2i$i7 zw6RLO!THB{9f%<#GZ8=M`(Tyccu0TA!8?MpPx&%y91*$7=b`A;AtdNu_YU`Aos)KN zUdWVKFL6BmGj$HCw?ArTWX}$<=!kF3=5Pdm8(;#?l2Hhe=lk?sh_QzN`+KRny)wsJ z;LqhNq3trU((ui)sQZGYtFin@_c=q4*{&4T0ml*j-Jkj%0{p$Bs^g!i99*QU--;n! z0*^kMzI1;(blBCO@1SkUHOz;|@V2XxhbwJR`{#Rn2WfzB&fX0?2bx4&QYY*7x=O)?zGeWj_4@%)b!&cMDt)&MfoER{5CbW z#Jf<93pPDPbL@VmbIm(ML9+H9eDiB*?OP!c?^JPYLmx@l-<^AN9%*yh20oUA{>#idFHtpK@szT^p_KM)=-XXgRKs9tC3&uyPG@V+Qf~~YZ}IyfHYZpF`c=?< zXTb#P5Wc0yUq#2cfcNXNvlG)61oc2svBQGyHqK`}74f$El?}jnSr(@#l(J4w8 zqqC9xe+(+H?E|{hnQ-#FyUvT5p#W9tV$^7 zN&sy-ZDo5TAab@#Fs=lrxbO2e zzZIZQiSY%fC{T{e2XorMm=z^EHKag8+i-eL5mZI0R()jkluYPyEQXAm@;xe3>>~tJAnOrw`vk1ZJE+%wv%=Ne&v+Rtqv;XKop^D_YT2z8A5n!%zDHI=A zn>Gnk%x%M=WTg0d2dW)dsgXr@h#K}Lo`RQUMu;R>{tXh#X|g(@8LbdO7FO5WT8zY^ zNu$Pl?7LjHHCQ*SmYk6f#8WP}YF{cE>_2itD9sIjBjE+EWpWyB%XMqHuy4%vpA9!{ z77+AO1>o5F(cpNUlL>jA*|e%gVkb+GYKMP=U)y@!d!X*p8TrW-xbSKiJ)4Dmu0X1X zLEdywaSux~(xznPj+SNB>OG?(p{eAo%D@zRnuXsH4qPJwyrp-8-%UTBg9+*IClZ$p zq`g%$G?7d6H+<;2kFWf8keKgKzs7m8$jdY$>OH)1IA}f5o$NmFS^)W2yQfK`HaD?QVF{(c84d*ap*d?VPI7CSfi~)Vp8>3PdIRBQCSYNo%Zvr_Xa{_svMq6)B=FY$nbfb zArzP>tSh4vUViRi zStWYNA{TggODG=mhL-Bop9R<9z8Sf<+WIsnA=q$>W_KR|dTmU4M$DD#G<|Sq@xG z@J3$jd?{Qd@$p$O9Ouyr-~H_uK2@2JF9;7nqZsrcX?I6KXqE**!I>Qo`_hpgh0hMY z=5sAhU^yCwq>D4LEG`XS9HFma?ORAbn2x@bmP&z__YJMRiIoKYLwJZW>`t;(2glC4Z1wpLe*MQ9946f0Cwx6&CU|C$h#(%{r zaevyWcHrl!=m(Km64g)W`>{~4r|p1^ps4Mu^MTxDarwF36|r7c8#(Aqz~IZf?yCb! zU+t%lQH6%UbL%Vo6ZQ5@+XG}@wWko`lH~@usZ`>L`Ql}XBvdv*g=2aqS&0;7W3fH@x^K>-XB7GK@8*|xgqN37;}U9$hpW!g2eYj%Z;OG=**3N)J& z*lD)@0?%R(+-u&4fvZ$2x=cCx%{{sUw~ z|B4hd)-efTDLPM&wl;{Eoo+Xr9ntT@n6b}Pj~SmS)Y$23$o5w)iA?T`T-B!)WrLaV zg!g*4z=gdSF91qrC89TA3*1&sYKsPvinWnU5s`EY&XUW z)LK722yMLQh+?FJf*8OloP{*I+SUVNk9SJQ z%7JIG-IL@s$BAc){bpgqcOsR6hC0+-0UOua6wUWv`BeOyNVp4M4M?T>?GZ`L9g#D3 z*H{l0lh`b!79mB7b;O8eAM>Qxjt_KHHjW)Be0z;#h|{?jOZX`2_vK39vQ}TTcd5?$ zu+CTsoi3KWte-eN08roGaNTYXg^TKBbed~wwaZm(dR^HYO8st>_m9EnjaM+ z_^+aD{MTUZnIGTaL-N&-uTvhszSYDJVq_qWt6iTnzz@M)sN|N$kDy%8=9j^b8mbBL zjBzJ0D8}4C)MZ)8R_JwGfW0l{gl-?phf_#pM6eH%o>0uyIHu5@R>YFBsg?-gl)44h zHg0&^XK3dngz<4idCHeyoLU*2hqxEdebE?D)U74RnjWlNAk)dZGykH=R6d3^gkMW} zp=e*^tIVh1Fs=wPw6g3cuC3n6T;OpjuhXNnp;HIi=kY4?8Dd&v7upcpEB`J~=_(a&8j)GuDn)zA8pmGY)E;nI4~ z7ousw@SD>|!?5GZnw*w<1%3mVg zW`3@tJqB4ar8N*wFrabmH*_0}1|RzeKCFdzo4Sixo?tzw7@LqE-=mwrzL*nZtv+$6 z;w0#n+uP6HelYPC4LyJUau!202M5qoowhoV{sk)TXpV=Y_xN>rD2PPH%*%f5rA@HRzImRUje zqLXa1VWc6eFr0O7?IV0-GYO5hgm{nslykC*a-Z9h1wo&4ya?}Z8|aJ7;HTA!C67~q z-N)UfpJ~locVbaTP|734=ISQ)NM*eoXk`g35QjjDN6q|mH?%Sk3+AE3qoO3zjO^Uk zcCND>N!WH!g-W*qnFE${7y_R|0t-qiceg#61BeBxe&_24KJg`*NssFA>4vbIA0!(N zxOdug8$`G{6`H-~4P4k-Yi)X^9ZxM@!rlJ-HNoO`>#J9d4Fqo__~}jXPgkf(X-x^5 zDC~f{iEk*6qSrSzr6}GGyPin%I=^48yNV#qe>qEg$zODm1 zD&v`<)K0P?0n0Q{*fZ2JKa{Fv))G2P@u<>yh_nL-JPW+_Py~vt!u84GP z+#cX@w`LA|dVXpEd+J&bj5z}k17B~FkE{dxe9uC{mCm(B4lL0GL1%#hOm};9u)xg= zEsDon=w>+b`8N^`$nmx2uzzhu^?^8;jR z_82kJW{i@kzg$!g$~o`@)RIn&7YC&zXbOFMMHtHTl{weS_(|2gQFTWP^4MHKw;vm5 zRlXMVl)~QQb4`$^Hj9mmvz1KOYE!TS57S9zO2)>5a2cd7p=PTI9gmbbd#0hRev0TG zf9Ll_aGLLKjwX&OKCtyi6;(N~3=OV?^dok%j@ie4da`OX2Q_B2i{e^AA`m&WZ6cns zSSS`k#4hQ=nOqtj>v%6kqF78HM!ErT;%!}@hP}K6*jw5OOmLs>+I90X*LRC>W$`L> zVWht*vRAaEtj!DfteGyNCR>I|2nU9v=-qS)52958(s4~C!0vOzybe(wIGP=eKUtEhvuOtGpFH>N zsA`1DN6jsM%Zv~<>XMCjRk%U+rudVmNn;CccWTG^naMEPUGO)oJ{*fK z%7&?40z2+JJ*hA&LEyX{WlOHiv{mu|4{c5Lbe*@M_U1jgogKwcePz!4Ykb$LafF;| zuSrd}V&jwQWL{3quf5C|H(#`Y#CA7cn7|j5GtAsUmRW_4{&*5&kjg%|1*6U^_=Tm(%CY&M`iFnF_Q6D!Og9b-aQtXckd@;R3=K`4_ z^7V@!1f3t`tR$pCTMs6X1Cq=pR@OA7S)J>WM`_iO{ zy&TB6fie~B@72jxrb(SoDkp6IjIR-}8`32PrZDic8qx#po9M8Isw>e}8gz>Kdl$8F zQ-$w9JZ934sqXI3idgUDb-CvN&xKq;%hHnI^V<22!viXHiK%QtobC z_Bd}E6}ibD@+GPzy9HktpHZZ8YK~Ba9&zKRc2lu^@}_9He`(<)7mm`%>CWFy&MI97 z+q4f=#!1^ymvViF!Kqf>>p4RE^tNPF^X9^+V)CNby_qf;68?WBPa~yK>f{HB`2d1W2+Y zl<<%_m3RqjK=64w$?u9)AL#J5{eQZ{(3de*1Q&KW5!Gt?xo|(72@zv|?bevLkw&q0 zZ?`R|fEBC%YQ`l+dR89T*6FUTzjNV@H)@PHOdh>(4AiEUuS2M7aChi5FY8EjX~qex z0rX5^kI*`jEIVw~ycMb2l{BWy`>AqCUJ=G%$EG;WaDRwJ85Afb&B7BpMJVc+`sjdQ zwcjgz@94OGt>1sx`I!+Rqib7WsF@`mfaYNrhg+t#f#SbzC zMl1wVL_h`ga8clf<14sN(V{81QmrNgFR-tcUgx#)+BMJ+-NJ25xZ>YY5!xW#t&aNQ(w&ylcu>3#pzTzd zfr0)mVpVvj-6P^r=8e^iBw0OOXbkVoazC|uqyzAipMYqK>3;9)18#wt*w>P$5UoG? zv&EJG_dLx2+Ec==3iv>x0a6K;89~O-Y{Y)oS4h^_y~o0pum$$L>SB8nf!C^xu07^= zL8am#L?`Wr3JR(tol_L|uggP4;IGQkq(Tc4v;cj$N`^kkF$PMJT?hU1A7FVWPA1wu z=*a*-o0Eo)+a zdCbcWSuZ8z>|`eHP_H-4KNZE7&Ra5jzbk%kU-NPdLBu-i=)A3T^%lJgPkJ1Fjb$zi z91WF8c&(dr)|-3HIfCq5bN{ovf z6Fo;=|Ev7kx3PM``0`vEl9LK^R^Av~$?lsLllToiHN^EPZM{^J^$p+NLe!^z;2ZX8 zm^}KbzoXKy$p7Ld<N@*EX{gnCi{qcLM0{P#*R zZo(+Iu(JjyfIIBXChWTL5mwU~#`MHwXWSh5QAc%WpQqw2y?k!J_dJ7sZa;a){`>=c>`|QZ3RE0&2u!sy5DDt9R*<0# zfS@|tKMeAjo+YU6`Bz+994!b(7Jykz8xrz|rlXMpxcq^%Aw z3H&obmZ0A#xN5QTpud}7K)eb7#A>MOr9U!1PZbUnr2xPJeu-apz?T3YU*mjKddwT~ zT}td0zI%)!fY;q5ZbJ27E_G(gpuRF)6*Bkms(9YrRO-6v6B`9epR^M|T4DoZ0gg0) zmV$fZ6)YpfufIst)kASRX%Skq*r%57!y`xG?dew@KwmFpVLYuI?#TI9`OMfcGyGRN zi16{dpU{EgvDy@>;wjo>i6ICvlo`~TpW?dVyJC!L3gw9@Y??hIf8F zS_%?nW-`SLl2aVw^yWisR%632yF}0sm~0}YJMsb6ES$K}`+Um^$CMwXcTGT?Jf5d6 zOXX5%3|XmKa-X%-*`qmnFsN8OLVU z5jfxYZQ_L@ALXbl*MYg8fYu~Doa;~H?3okx^u+yZrCFVJIUvB?N(z~&Zi=vs{L+^{atoKOtjBXJy_E2fn_WZzV`SlJRv|owt8z#Knx{2iQ z&VI>CT|I`U=>eMH2kyHz!DK$~LZ$>kFQ6qbLHS2Z2FM?0{T>=ip3}W3gAUVHYh&`l zTZpW@IaKLlttyb2s1H4MQg}@OK^ngJ2lP~HdA0{i!?)3|yRTsAGD$qM%KfuR4LQbv zB8FYrDdni+73C`9w;#r(_Fe|{?Y-P>i}06eYg!i+?wD!*XA7 zx_Q}fihhZ@N}L^a|1Ml`=Yhg+=_Ys|-R~y?`X?iTK9o)hi?i_D$3QajWC6M<@Tgi(zzEQ*!z;2~moeS*8 z&{Ybcmhy{NMV~`USO%OqzF1J8+o&+eFqTx)GU+H|W6mP4$?y>P^CM_~RqMo0YA+o~ zxDfh!n@L*WB$cIprJ4O4E)_bCG%G0^ETL7ZA{EHYh|}T( zs?$KW$gN~S^Nqw8S&bT6Xgr%rXaD_bx(alXC#giTiqfA!fk<%Y5 zJ|{dk89pmFBPBn*&dnhhZr?Cgoy8Lp_w?CuTX$LWeY|b369kfu`o@}eM;4sZ&}8o5 zBs?MnGkOJ?)^D*9n8s#q?2R5-+?wYB7vs^U9;S6Om{CLiDlbH&dCRe7the~%N8qfg|=^#w?@ss!}B$r2c>&I z#*&Z3tj$qB{0t=@h}mG~o*+Occ;G>Dl6N84;_h}%+I-cg5@|}%XMfA#Zyz_ixaoe) z!hRXBF`h5&Nl_Zio5HuK#hE7>lW*m#9>vasNRCS+gAZ&1vSyVV_g`Gz@!?j%ej}W; zvro2=!WWASuTLW6efdo|*lTRUf~cl$?8BGlzC(2_CE|g@95Ey4|~@AhsSzs;e2w@b@DE z)!Vu=&z=JJ-5wrCR^EAMAN!9GMF|PRuPjPx1yV-+ zu3is&o@04L=`$TdC^(7av6qgp4K1xBWn};uqDWk^4ryIWBcc?m@#t#Hv13!KB{%$X z7E4j27!z&HRVTh#^TyZmj``FClMfT)r~>=Qk>bGDCTcIdJ=jW1PUq3nUU5o%tgNIW z)+fS$Hgk= z$0G&sa9`)B&65{*qPfe3tgrMt-Btr0Q9R{oZV=Zweh}rUlO1BzT0P#1|Ejeo1hw65 zYmm@d6rLo?1T!tZK4-Hz8&#_Fe1Lhi6sM0ldW?cPCrf}8>Gr1er=iWGvKVpxy!8sS z*#@G8lJ)3=ZDa|leK#MmAcwa#*3$ij_CCBo99aA~JS5p~SHU^ngRdmf@uo+=|{5L<{qq09+_#T`12Ji;CG80D9_D==>7w|0Czg>0$Q*`IUzD{B1D|udN0RKX1+bKZC&ST zUK<9<>v{>>>goEy@*wlzT@vUfp^@oC*O1!?qTi_YZmLT+^*W4%v?*;w1^aTSA2~CZ7G=|Ow2~AyY zK<-p5YpjdhPK>&?s*I|+42MhvWi7>bh9dIDu2^Uacm^GDmjcQ#nZ#j!HAk5jGC7oT zGKo4>X=Z_x3KVn<)>PJ&xe2-7V%=jSlU+cR=@cdOIto?2v9%P37K7e$oWN+inr@k@ z0W@qG5ao$0Xq>Pi{M!e)xs5Y*Gc85+ChfDAgDmt*i2JWdnmSl%5(Tc&h_;CIUQ zIz%r`VDBr?3~I874=d8Wk(7~%C7$L!h#YmInBO1`t~Jvx%)}A{o_si4X_~X=gaMf zcHt`m=fps$p*}&)0E!av(CJPixo8VHmX3vrOt%dPSCiOA=jf|-6#TEob?{Pi%#l^j z1g5A2me%}VshmHifAv4YP^^+VNAW=@n6u^|&d48rh#qWe@;yEVdWHk<2aZ<}Bm2&~ z-(H)QiPp)VhF61PFrChZhvoKKA)2dNO6kp0sveK*%%KP2TwUT}%_TTfS%a%gMiLTU z(_!+MG&v?;xEP~Pw(ioDqv*-sl&c$1x=55=*lcrjG9C@uCX8ZxktunlUkGNwD%?SC z8^kbOByhbx#fHunzHwgBGYJy5kj{8ZSZBF7k4VlVC0Czk}3KU-ta~w4=3c6Gob5GZe;R zHGHoI{T&)AaPU=?4eD!cnf^RkiO&m$a{W06;$wx3s24?3C~zaDd|A=4sU(FJD4~V9 zC08G4 zPp6ws7~eJSn1mVp)PXxWsBU}Rgf$)5$|+2_>iXiDV|@ELbxE9$XlWt>jM;$M!d*A| zymtAaGbQ>03jGe*v2HA5N=kFKLs9teISCQj5x7>C)Z-mQefmcTyz>&JCbJbO`dXQl z`=jH*=cql@KjDAv=ERw`=$F8C+)7aX%8I=Jmwl@??@osLe+A&E;?8RctLX=tpEoQ|NFXL<01Ple%ic*{3-{fK1(!#)Ppa^3 zxV@1zWPp7vv~F8sov1WqmhlS;03=rHyk4gQ=M7`C2ds5vjn%Y?t*tek^_MTAVVbX@ z_hCYGr;u`fOyC0h5psZO#|ntw{0#Mk=Gq?x;1SAN8-Sp7 z((b^1q5Y|VVo$?~;yo=tgGf2?=&kcq6w}?gxwQ>2ig*;J0?{zWrv0FAHg{~7f}1Kr zfU3t&zvDZcf$|w5pmu=$YAProQSs0kuqwh3GY&1A>Qm#dOOchl9FsUgB;ZhvnUu)l zqfoMH$IRx(*E?CeK+|Sb ziI^Er6ExS{3m;v3hLvUsIbL4Omclhk=v9nY>;$2QGK&@RL6fUr78|9%mFlvp$XiBd z`{`**p+`a0vBw=v*y*Fy{yTa%R)|Sbd%Nf9NEo`ET?Si>Lh~3vx*X^inXIQX^DEtX^DC)HA>^wFk6Z@ zIBMYOlb5*ngHP~wEQT&yMr*`QXVhrh0?}1_NC?yQRMp6`JZ#G}$j`OTo3{L3tZJSE zsoKbyE$yTaStYaOXuaSa;fLXI_oJ=nNg29nnVUov83IcENQ)?PH<~{c-DW@?I;(cj zV4kk&e|YIpwn}6hY9Ahyl5_~8lj-Cen}%3<&5-r3YlXN)nTiaTTi{W=1;v)f&v#uj zlQIltC7#Ga7_Ud@;&DmRd2%-BSG1fJZ7vpy5Uhp1-l@D)wba3Il)ZqbZ+et8?VPX+ z`GLwOPNeT>u8o5RR599DWH6sd2@$O^R_hAtGuvac;Ej{lrFnCzOL8{0tgU;14?IX8 zi!^=n4!h3&_%Jnffwz}U!Euynxyxd|=|kkjl90G&4@x9FMxf{ejuvZCLx3ixkYsb{ z5NoMMTz%TO1{L@T85A_?vX4ktmC((p^Y)9<3L^UFeGAnxw0yOqAaNkheo$Mk zz#2i1!~TRtQCWpt6d$(PHU{GWqp-cmqD|fX9oE>y#l{S>S&g`NI9H?X&~(*eV?YVs za*=`JhXC^{i`bL>vJ~ahDQw0lntk43{5po7k)BSuEhf5l78j|abO$Y$MD4Fqi+F;& zaBDF)sO|h0vMxJrBc;L>q|-oDhc#Ns7SQ*WGZb-c-&avk&}g1r92X@ihPyJP%1rzH z$ZcO+rqlx-REF!P5a>Jg=yx892V<6nljHTB5Cvt9t&@eXp>K)$vn#FzPD&!*8es+Z zp3gQTvt*hw^^x?Q@{}nt{}?{!icFo>`YhhMZhXr(*utTMfk-MWrx*rYFJ#hlg*~8L z>f*S$O_w-7)aDL1>SLDW4PuT!n3R))Ev`=Lpb1MBOS&3|9%f9B>sgxACSXWQd93;5 zyvwFym|VU?2t|3*y2be2+_Z&<#EdHoCYf6cl}P^U7ry%yQ~Rlou$(Y&9|Px z$~61u*p@m@K6k-1HH=5VS4hS&V%{@4iFZL2b2{xj(6$<2FC>vWm&TGtr)#81Z3l68 zxzVfHY}a_yO;wn&IDJe)YKCKk*H?-}&K6hTLflLkgf_L6EF&4{Il%Uk$>*fYS&7o%oW9pK14qC*w@+rcRf4(|PLpn~&?v4`NU@=( z;r2wFrs^6K%8^XAK}TdBQGMzCt`GuRy(RFY(aHA}CFQif#HI71*RnDLWOn)BoeF3F zIZle}x7@U9dNadYGJfLl%W%<`;KPiuu2au*p-p90$?Q6SGX(oQb*RLg3b9x1yOEp6;}Bf`g6%Lf*vOWLS| z*~s?5v&2#QO*v>j0$jezMA!G%l02pSsF#<{pdd=4amdDIF4D4#>W z|BC=^s{&B#b07h+e}clyE3_a%H2`eA9W=o8kHb{&@W+vgQUjm?-P9Ev(X}uHMh)5A z30}RRxg&v=%?e33AwfY)gOQg0%1&&LAd+WOa_(t@7;dRIic{DG0jqgj7A9*qSF4)m z5G@;4Tuiqh0aTm5ZrOzu@wb)R&1iI8Y2IDAIcooLcjW<5;KUKu%FVDI9$*b?NjWT? zl;ET&$`kCDG|7?#?D9z(UB?+YoGUk#?yHDICCuUNW!D>XQXxT~%PeYjRw+btKVjCn%A|oeHuxm8=I}@ z3dMFvaR@$)-9*Rypzaa3Oc!ZcZS&2+kj<8n?Wxpe*?{8>aNN~m{-8Yk5)6 zdFGYxB^-S4wQlBesA!lZT&1_W0hQdR*O@c%O`K-9ZJW$jE_*vYCVKS^o1!>wRT_3y z1dzg#qxDjR17*2M)?X#E)9*UtYF!k5CUF`zDJfHPwX?n78cs&f`|2X6aQ{}Wdb3X@v8?bwSdJ~KA?5cpxzH${@j(%L)-#v)m$&kpx{QWxeA zi}FqWm26-Y@%?IlSn2&%<2-81x1LLSB4#R@yPPxls=zI_SFo_KG_W$T*03p1tXbd-$wr)OBEb5-HdQbA9LJwC%h~qg+hVmVuU=Q*wf|BtDkIgM2mci$;Gz77q zAm~`UYa8z3an$gWU{2xGk2_G`FteN4dtc*BUQi9hVHcN&%W{6|$(Rt=^G@ZSS4#<% z^V?{a5y%^8U?(9urBUe1^9aeyP-S3ziuKGcP>+&3MOV6xx7e5n?p8Z6k$-ym%fzT+ z-iGFaHwVjFie2PvwewM z*=DRqBLJ|ydNwWho)q==6oB%7*-(J;Gyr(@1~h>1KfF%p0Q|qf^Pv>u!pn|*Hml_X=WUlssBKNI}2TC5-;ZLo176#-QJVLdAb;CeQDXyO3D z=U?jLfalB~C`cT@``p$o4iE+(&;&2@Z^;x8ssupwchkRx9zaeK05y_dsQ(^F&-R~! z;}8%(@Z+L!aDLYm|5f+_gd+(+_)YTPH#(XBB8ejglhA{lBmro|znF_$0c54YIZF^O z1O)Y8NGnj5B!KfbyZ&}AHI*yg3}NnBnSwWzvyE?XHo#+--E2IG_+0VbgY-O2qy{be?uK?h-0T1bHg` z87HmEaThHk-wK|O4V=puZ%M8@A>{WoAvi%t*m{9f+H?uzxDUDd0;p9YYJff zG5&Wd5bmHc1%SYBe*cXFG5iH8ZUT)f00`qqn$dpi?s-AjDS{`l-t|0*sBR+q|EmG+ zsQdT?uo;vBUl6Ll7{2R&rlKD}p!>g6e4iJNI>A(~U@Gvt+W+}y2@+8Pi2aszI&;(Y z2@K)@`*DApim5%5xh$4`uK?{?>WY&TlqxQoAUi!hcp_xBL4S{9vo$hWvj=ojZ7DzoY^ncpmjp z1w5+V`7;;%3nUPa%AYm%-X&}10X#z)@W6k|9{2M%mjodI3MgIm-_@!L=ClIf+GiJMEH0lq3Y;8Fj+lBj6Uc<`eXvB= zSUT Date: Wed, 17 May 2017 10:33:08 +0200 Subject: [PATCH 05/64] - added Timestamp_toMmsValue function --- examples/sv_publisher/sv_publisher_example.c | 2 +- src/iec61850/common/iec61850_common.c | 14 ++++++++++++++ src/iec61850/inc/iec61850_common.h | 9 +++++++++ src/vs/libiec61850-wo-goose.def | 3 ++- src/vs/libiec61850.def | 3 ++- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/examples/sv_publisher/sv_publisher_example.c b/examples/sv_publisher/sv_publisher_example.c index b048befe..6c4cf685 100644 --- a/examples/sv_publisher/sv_publisher_example.c +++ b/examples/sv_publisher/sv_publisher_example.c @@ -20,7 +20,7 @@ void sigint_handler(int signalId) int main(int argc, char** argv) { - SampledValuesPublisher svPublisher = SampledValuesPublisher_create("vboxnet0"); + SampledValuesPublisher svPublisher = SampledValuesPublisher_create("eth0"); SV_ASDU asdu1 = SampledValuesPublisher_addASDU(svPublisher, "svpub1", NULL, 1); diff --git a/src/iec61850/common/iec61850_common.c b/src/iec61850/common/iec61850_common.c index 31892033..d2a68988 100644 --- a/src/iec61850/common/iec61850_common.c +++ b/src/iec61850/common/iec61850_common.c @@ -405,6 +405,20 @@ Timestamp_setByMmsUtcTime(Timestamp* self, MmsValue* mmsValue) memcpy(self->val, mmsValue->value.utcTime, 8); } +MmsValue* +Timestamp_toMmsValue(Timestamp* self, MmsValue* mmsValue) +{ + MmsValue* convertedValue = mmsValue; + + if (convertedValue == NULL) + convertedValue = MmsValue_newUtcTime(0); + + if (convertedValue != NULL) + memcpy(convertedValue->value.utcTime, self->val, 8); + + return convertedValue; +} + char* LibIEC61850_getVersionString() { diff --git a/src/iec61850/inc/iec61850_common.h b/src/iec61850/inc/iec61850_common.h index 47131c43..a48e8eda 100644 --- a/src/iec61850/inc/iec61850_common.h +++ b/src/iec61850/inc/iec61850_common.h @@ -406,6 +406,15 @@ Timestamp_setTimeInMilliseconds(Timestamp* self, uint64_t millisSinceEpoch); void Timestamp_setByMmsUtcTime(Timestamp* self, MmsValue* mmsValue); +/** + * \brief Set an MmsValue instance of type UTCTime to the timestamp value + * + * \param self the Timestamp instance + * \param mmsValue the mmsValue instance, if NULL a new instance will be created + */ +MmsValue* +Timestamp_toMmsValue(Timestamp* self, MmsValue* mmsValue); + /** * \brief Get the version of the library as string * diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 9711a2c7..4a8cfc14 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -561,4 +561,5 @@ EXPORTS Timestamp_create Timestamp_destroy Timestamp_setByMmsUtcTime - IedServer_setLocalIpAddress \ No newline at end of file + IedServer_setLocalIpAddress + Timestamp_toMmsValue diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 45dc4d2f..1769ee94 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -639,4 +639,5 @@ EXPORTS Timestamp_create Timestamp_destroy Timestamp_setByMmsUtcTime - IedServer_setLocalIpAddress \ No newline at end of file + IedServer_setLocalIpAddress + Timestamp_toMmsValue From 2a40798f10014452a63561333f7a7f2e835fbb83 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 30 May 2017 07:43:31 +0200 Subject: [PATCH 06/64] - server: added MmsFileAccessHandler for server side monitoring and control of file services - file services: added support to set filestore basepath at runtime - added IedConnection_getFileDirectoryEx to better control receiving file directories --- CHANGELOG | 16 + config/stack_config.h | 5 + config/stack_config.h.cmake | 33 +- examples/CMakeLists.txt | 1 + examples/Makefile | 2 + examples/iec61850_9_2_LE_example/README | 9 + .../iec61850_9_2_LE_example.c | 15 +- examples/mms_utility/mms_utility.c | 19 +- examples/server_example3/server_example3.c | 4 + examples/server_example_files/CMakeLists.txt | 21 + examples/server_example_files/Makefile | 31 + .../server_example_files.c | 98 + .../simpleIO_direct_control.icd | 281 +++ examples/server_example_files/static_model.c | 2003 +++++++++++++++++ examples/server_example_files/static_model.h | 301 +++ .../server_example_files/vmd-filestore/test | 1 + src/iec61850/client/ied_connection.c | 33 + src/iec61850/inc/iec61850_client.h | 45 + src/iec61850/inc/iec61850_server.h | 13 + src/iec61850/server/impl/ied_server.c | 7 + src/mms/inc/mms_client_connection.h | 13 + src/mms/inc/mms_server.h | 54 +- src/mms/inc_private/mms_client_internal.h | 8 + src/mms/inc_private/mms_common_internal.h | 11 +- src/mms/inc_private/mms_server_connection.h | 3 + src/mms/inc_private/mms_server_internal.h | 9 + .../iso_mms/client/mms_client_connection.c | 41 + src/mms/iso_mms/client/mms_client_files.c | 58 +- src/mms/iso_mms/common/mms_common_msg.c | 72 +- src/mms/iso_mms/server/mms_file_service.c | 200 +- src/mms/iso_mms/server/mms_server.c | 40 +- .../iso_mms/server/mms_server_connection.c | 17 + src/vs/libiec61850-wo-goose.def | 6 + src/vs/libiec61850.def | 5 + 34 files changed, 3317 insertions(+), 158 deletions(-) create mode 100644 examples/iec61850_9_2_LE_example/README create mode 100644 examples/server_example_files/CMakeLists.txt create mode 100644 examples/server_example_files/Makefile create mode 100644 examples/server_example_files/server_example_files.c create mode 100644 examples/server_example_files/simpleIO_direct_control.icd create mode 100644 examples/server_example_files/static_model.c create mode 100644 examples/server_example_files/static_model.h create mode 100644 examples/server_example_files/vmd-filestore/test diff --git a/CHANGELOG b/CHANGELOG index ea68a97c..de833d8a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,19 @@ +Changes to version 1.0.2 +------------------------ +- server: added MmsFileAccessHandler for server side monitoring and control of file services +- file services: added support to set filestore basepath at runtime +- added IedConnection_getFileDirectoryEx to better control receiving file directories +- common: added timestamp handling functions Timestamp_create, Timestamp_destroy, Timestamp_setByMmsUtcTime, Timestamp_toMmsValue +- .NET API: Added Timestamp class +- .NET API: Added missing UpdateAttribute methods to IedServer +- common: added support for Currency BasicType +- MMS file services: fixed problem with negative frsmId +- java scl tools: fixed bug with SDOs in dynamic code generator +- java scl tools: fixed parsing bug in OptionFields.java +- server: added functions to restrict local IP address IedServer_setLocalIpAddress, IedServer.SetLocalIpAddress +- .NET: IedConnection: added internal reference to IsoConnectionParameters object to avoid deletion of internal AcseAuthenticationParameters by garbage collector + + Changes to version 1.0.1 ------------------------ - server: fixed problem in COTP src/dst reference handling (returning zero src reference) diff --git a/config/stack_config.h b/config/stack_config.h index a3052809..c11d32ff 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -224,4 +224,9 @@ /* Support user access to raw messages */ #define CONFIG_MMS_RAW_MESSAGE_LOGGING 1 +/* Allow to set the virtual filestore basepath for MMS file services at runtime with the + * MmsServer_setFilestoreBasepath function + */ +#define CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME 1 + #endif /* STACK_CONFIG_H_ */ diff --git a/config/stack_config.h.cmake b/config/stack_config.h.cmake index c9ea73d7..c85e15d9 100644 --- a/config/stack_config.h.cmake +++ b/config/stack_config.h.cmake @@ -29,6 +29,9 @@ #cmakedefine01 DEBUG_MMS_SERVER #cmakedefine01 DEBUG_GOOSE_SUBSCRIBER #cmakedefine01 DEBUG_GOOSE_PUBLISHER +#cmakedefine01 DEBUG_SV_SUBSCRIBER 0 +#cmakedefine01 DEBUG_SV_PUBLISHER 0 +#cmakedefine01 DEBUG_HAL_ETHERNET 0 /* 1 ==> server runs in single threaded mode (one dedicated thread for the server) * 0 ==> server runs in multi threaded mode (one thread for each connection and @@ -103,14 +106,14 @@ #define CONFIG_GOOSE_EVENT_RETRANSMISSION_COUNT 2 /* Define if GOOSE control block elements are writable (1) or read-only (0) */ -#define CONFIG_GOOSE_GOID_WRITABLE 1 -#define CONFIG_GOOSE_DATSET_WRITABLE 1 -#define CONFIG_GOOSE_CONFREV_WRITABLE 1 -#define CONFIG_GOOSE_NDSCOM_WRITABLE 1 -#define CONFIG_GOOSE_DSTADDRESS_WRITABLE 1 -#define CONFIG_GOOSE_MINTIME_WRITABLE 1 -#define CONFIG_GOOSE_MAXTIME_WRITABLE 1 -#define CONFIG_GOOSE_FIXEDOFFS_WRITABLE 1 +#define CONFIG_GOOSE_GOID_WRITABLE 0 +#define CONFIG_GOOSE_DATSET_WRITABLE 0 +#define CONFIG_GOOSE_CONFREV_WRITABLE 0 +#define CONFIG_GOOSE_NDSCOM_WRITABLE 0 +#define CONFIG_GOOSE_DSTADDRESS_WRITABLE 0 +#define CONFIG_GOOSE_MINTIME_WRITABLE 0 +#define CONFIG_GOOSE_MAXTIME_WRITABLE 0 +#define CONFIG_GOOSE_FIXEDOFFS_WRITABLE 0 /* The default value for the priority field of the 802.1Q header (allowed range 0-7) */ #define CONFIG_GOOSE_DEFAULT_PRIORITY 4 @@ -133,6 +136,9 @@ /* include support for IEC 61850 reporting services */ #cmakedefine01 CONFIG_IEC61850_REPORT_SERVICE +/* support buffered report control blocks with ResvTms field */ +#define CONFIG_IEC61850_BRCB_WITH_RESVTMS 0 + /* The default buffer size of buffered RCBs in bytes */ #cmakedefine CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE @CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE@ @@ -194,10 +200,21 @@ #define CONFIG_IEC61850_CONTROL_SERVICE 0 #endif +/* Sort getNameList response according to the MMS specified collation order - this is required by the standard + * Set to 0 only for performance reasons and when no certification is required! */ +#define CONFIG_MMS_SORT_NAME_LIST 1 + +#define CONFIG_INCLUDE_PLATFORM_SPECIFIC_HEADERS 0 + /* use short FC defines as in old API */ #define CONFIG_PROVIDE_OLD_FC_DEFINES 0 /* Support user acccess to raw messages */ #cmakedefine01 CONFIG_MMS_RAW_MESSAGE_LOGGING +/* Allow to set the virtual filestore basepath for MMS file services at runtime with the + * MmsServer_setFilestoreBasepath function + */ +#define CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME 1 + #endif /* STACK_CONFIG_H_ */ diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 398e901d..a09192d7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -11,6 +11,7 @@ add_subdirectory(server_example_threadless) add_subdirectory(server_example_61400_25) add_subdirectory(server_example_setting_groups) add_subdirectory(server_example_logging) +add_subdirectory(server_example_files) add_subdirectory(iec61850_client_example1) add_subdirectory(iec61850_client_example2) add_subdirectory(iec61850_client_example3) diff --git a/examples/Makefile b/examples/Makefile index 38262219..3e8fcc38 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -25,6 +25,7 @@ EXAMPLE_DIRS += server_example_61400_25 EXAMPLE_DIRS += server_example_threadless EXAMPLE_DIRS += server_example_setting_groups EXAMPLE_DIRS += server_example_logging +EXAMPLE_DIRS += server_example_files EXAMPLE_DIRS += goose_subscriber EXAMPLE_DIRS += goose_publisher EXAMPLE_DIRS += sv_subscriber @@ -47,6 +48,7 @@ MODEL_DIRS += server_example_61400_25 MODEL_DIRS += server_example_threadless MODEL_DIRS += server_example_setting_groups MODEL_DIRS += server_example_logging +MODEL_DIRS += server_example_files MODEL_DIRS += iec61850_9_2_LE_example all: examples diff --git a/examples/iec61850_9_2_LE_example/README b/examples/iec61850_9_2_LE_example/README new file mode 100644 index 00000000..ca64b3a9 --- /dev/null +++ b/examples/iec61850_9_2_LE_example/README @@ -0,0 +1,9 @@ + +The default ethernet interface is eth0. You can specify another interface at the command line. + + ./sv_9_2LE_example eth1 + +In order for the SV publisher to start the SVCB has to be enabled by an MMS client. + + + diff --git a/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c b/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c index 71223023..b2c3ed08 100644 --- a/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c +++ b/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c @@ -36,7 +36,7 @@ extern IedModel iedModel; static int running = 0; -static int svcbEnabled = 0; +static int svcbEnabled = 1; void sigint_handler(int signalId) { @@ -57,9 +57,9 @@ static SampledValuesPublisher svPublisher; static SV_ASDU asdu; static void -setupSVPublisher() +setupSVPublisher(const char* svInterface) { - svPublisher = SampledValuesPublisher_create("eth1"); + svPublisher = SampledValuesPublisher_create(svInterface); asdu = SampledValuesPublisher_addASDU(svPublisher, "xxxxMUnn01", NULL, 1); @@ -87,6 +87,13 @@ static void sVCBEventHandler (SVControlBlock* svcb, int event, void* parameter) int main(int argc, char** argv) { + char* svInterface; + + if (argc > 1) + svInterface = argv[1]; + else + svInterface = "eth0"; + IedServer iedServer = IedServer_create(&iedModel); /* MMS server will be instructed to start listening to client connections. */ @@ -102,7 +109,7 @@ main(int argc, char** argv) signal(SIGINT, sigint_handler); - setupSVPublisher(); + setupSVPublisher(svInterface); int voltage = 1; int current = 1; diff --git a/examples/mms_utility/mms_utility.c b/examples/mms_utility/mms_utility.c index da6ca126..e2511c69 100644 --- a/examples/mms_utility/mms_utility.c +++ b/examples/mms_utility/mms_utility.c @@ -21,6 +21,7 @@ print_help() printf("-a specify domain for read or write command\n"); printf("-f show file list\n"); printf("-g get file attributes\n"); + printf("-x delete file\n"); printf("-j read journal\n"); printf("-m print raw MMS messages\n"); } @@ -115,10 +116,11 @@ int main(int argc, char** argv) { int getFileAttributes = 0; int readJournal = 0; int printRawMmsMessages = 0; + int deleteFile = 0; int c; - while ((c = getopt(argc, argv, "mifdh:p:l:t:a:r:g:j:")) != -1) + while ((c = getopt(argc, argv, "mifdh:p:l:t:a:r:g:j:x:")) != -1) switch (c) { case 'm': printRawMmsMessages = 1; @@ -158,6 +160,10 @@ int main(int argc, char** argv) { getFileAttributes = 1; filename = StringUtils_copyString(optarg); break; + case 'x': + deleteFile = 1; + filename = StringUtils_copyString(optarg); + break; case 'j': readJournal = 1; @@ -351,6 +357,17 @@ int main(int argc, char** argv) { MmsConnection_getFileDirectory(con, &error, filename, NULL, mmsGetFileAttributeHandler, NULL); } + if (deleteFile) { + MmsConnection_fileDelete(con, &error, filename); + + if (error != MMS_ERROR_NONE) { + printf("Delete file failed: (ERROR %i)\n", error); + } + else { + printf("File deleted\n"); + } + } + exit: free(hostname); MmsConnection_destroy(con); diff --git a/examples/server_example3/server_example3.c b/examples/server_example3/server_example3.c index 2352bc67..2e49ef92 100644 --- a/examples/server_example3/server_example3.c +++ b/examples/server_example3/server_example3.c @@ -85,6 +85,10 @@ main(int argc, char** argv) iedServer = IedServer_create(&iedModel); + /* Set the base path for the MMS file services */ + MmsServer mmsServer = IedServer_getMmsServer(iedServer); + MmsServer_setFilestoreBasepath(mmsServer, "./vmd-filestore/"); + /* Install handler for operate command */ IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, (ControlHandler) controlHandlerForBinaryOutput, diff --git a/examples/server_example_files/CMakeLists.txt b/examples/server_example_files/CMakeLists.txt new file mode 100644 index 00000000..a0dfc356 --- /dev/null +++ b/examples/server_example_files/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + . +) + +set(server_example_SRCS + server_example_files.c + static_model.c +) + +IF(WIN32) +set_source_files_properties(${server_example_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(server_example_files + ${server_example_SRCS} +) + +target_link_libraries(server_example_files + iec61850 +) diff --git a/examples/server_example_files/Makefile b/examples/server_example_files/Makefile new file mode 100644 index 00000000..bcc7b4c5 --- /dev/null +++ b/examples/server_example_files/Makefile @@ -0,0 +1,31 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = server_example_files +PROJECT_SOURCES = server_example_files.c +PROJECT_SOURCES += static_model.c + +PROJECT_ICD_FILE = simpleIO_direct_control.icd + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +LDLIBS += -lm + +CP = cp + +model: $(PROJECT_ICD_FILE) + java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) + $(CP) $(PROJECT_BINARY_NAME) vmd-filestore/IEDSERVER.BIN + +clean: + rm -f $(PROJECT_BINARY_NAME) + rm -f vmd-filestore/IEDSERVER.BIN + + diff --git a/examples/server_example_files/server_example_files.c b/examples/server_example_files/server_example_files.c new file mode 100644 index 00000000..9b263bb3 --- /dev/null +++ b/examples/server_example_files/server_example_files.c @@ -0,0 +1,98 @@ +/* + * server_example_files.c + * + * - How to use some special MMS file service features + * - How to control how files file services can be used + */ + +#include "iec61850_server.h" +#include "hal_thread.h" +#include +#include +#include +#include + +#include "static_model.h" + +/* import IEC 61850 device model created from SCL-File */ +extern IedModel iedModel; + +static int running = 0; +static IedServer iedServer = NULL; + +void +sigint_handler(int signalId) +{ + running = 0; +} + +static void +connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter) +{ + if (connected) + printf("Connection opened\n"); + else + printf("Connection closed\n"); +} + +static MmsError +fileAccessHandler (void* parameter, MmsServerConnection connection, MmsFileServiceType service, + const char* localFilename, const char* otherFilename) +{ + printf("fileAccessHanlder: service = %i, local-file: %s other-file: %s\n", service, localFilename, otherFilename); + + /* Don't allow client to rename files */ + if (service == MMS_FILE_ACCESS_TYPE_RENAME) + return MMS_ERROR_FILE_FILE_ACCESS_DENIED; + + /* Don't allow client to delete fike "IEDSERVER.BIN" */ + if (service == MMS_FILE_ACCESS_TYPE_DELETE) { + if (strcmp(localFilename, "IEDSERVER.BIN") == 0) + return MMS_ERROR_FILE_FILE_ACCESS_DENIED; + } + + /* allow all other accesses */ + return MMS_ERROR_NONE; +} + +int +main(int argc, char** argv) +{ + printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString()); + + iedServer = IedServer_create(&iedModel); + + /* Set the base path for the MMS file services */ + MmsServer mmsServer = IedServer_getMmsServer(iedServer); + MmsServer_setFilestoreBasepath(mmsServer, "./vmd-filestore/"); + + /* Set a callback handler to control file accesses */ + MmsServer_installFileAccessHandler(mmsServer, fileAccessHandler, NULL); + + IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL); + + /* MMS server will be instructed to start listening to client connections. */ + IedServer_start(iedServer, 102); + + if (!IedServer_isRunning(iedServer)) { + printf("Starting server failed! Exit.\n"); + IedServer_destroy(iedServer); + exit(-1); + } + + running = 1; + + signal(SIGINT, sigint_handler); + + + while (running) + Thread_sleep(100); + + + /* stop MMS server - close TCP server socket and all client sockets */ + IedServer_stop(iedServer); + + /* Cleanup - free all resources */ + IedServer_destroy(iedServer); + +} /* main() */ diff --git a/examples/server_example_files/simpleIO_direct_control.icd b/examples/server_example_files/simpleIO_direct_control.icd new file mode 100644 index 00000000..0a0c6355 --- /dev/null +++ b/examples/server_example_files/simpleIO_direct_control.icd @@ -0,0 +1,281 @@ + + +
+
+ + + Station bus + 10 + +
+

10.0.0.2

+

255.255.255.0

+

10.0.0.1

+

0001

+

00000001

+

0001

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + + + + + + MZ Automation + + + 0.7.3 + + + libiec61850 server example + + + + + + + + status-only + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + direct-with-normal-security + sbo-with-normal-security + direct-with-enhanced-security + sbo-with-enhanced-security + + + not-supported + bay-control + station-control + remote-control + automatic-bay + automatic-station + automatic-remote + maintenance + process + + +
diff --git a/examples/server_example_files/static_model.c b/examples/server_example_files/static_model.c new file mode 100644 index 00000000..05926022 --- /dev/null +++ b/examples/server_example_files/static_model.c @@ -0,0 +1,2003 @@ +/* + * static_model.c + * + * automatically generated from simpleIO_direct_control.icd + */ +#include "static_model.h" + +static void initializeValues(); + +extern DataSet iedModelds_GenericIO_LLN0_Events; +extern DataSet iedModelds_GenericIO_LLN0_Events2; +extern DataSet iedModelds_GenericIO_LLN0_Measurements; + + +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 iedModelds_GenericIO_LLN0_Events_fcda0 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO1$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda1 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO2$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda2 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO3$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda3 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO4$stVal", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_GenericIO_LLN0_Events = { + "GenericIO", + "LLN0$Events", + 4, + &iedModelds_GenericIO_LLN0_Events_fcda0, + &iedModelds_GenericIO_LLN0_Events2 +}; + +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 iedModelds_GenericIO_LLN0_Events2_fcda0 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO1", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda1 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO2", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda2 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO3", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda3 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO4", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_GenericIO_LLN0_Events2 = { + "GenericIO", + "LLN0$Events2", + 4, + &iedModelds_GenericIO_LLN0_Events2_fcda0, + &iedModelds_GenericIO_LLN0_Measurements +}; + +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 iedModelds_GenericIO_LLN0_Measurements_fcda0 = { + "GenericIO", + false, + "GGIO1$MX$AnIn1$mag$f", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda1 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda1 = { + "GenericIO", + false, + "GGIO1$MX$AnIn1$q", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda2 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda2 = { + "GenericIO", + false, + "GGIO1$MX$AnIn2$mag$f", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda3 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda3 = { + "GenericIO", + false, + "GGIO1$MX$AnIn2$q", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda4 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda4 = { + "GenericIO", + false, + "GGIO1$MX$AnIn3$mag$f", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda5 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda5 = { + "GenericIO", + false, + "GGIO1$MX$AnIn3$q", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda6 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda6 = { + "GenericIO", + false, + "GGIO1$MX$AnIn4$mag$f", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda7 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda7 = { + "GenericIO", + false, + "GGIO1$MX$AnIn4$q", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_GenericIO_LLN0_Measurements = { + "GenericIO", + "LLN0$Measurements", + 8, + &iedModelds_GenericIO_LLN0_Measurements_fcda0, + NULL +}; + +LogicalDevice iedModel_GenericIO = { + LogicalDeviceModelType, + "GenericIO", + (ModelNode*) &iedModel, + NULL, + (ModelNode*) &iedModel_GenericIO_LLN0 +}; + +LogicalNode iedModel_GenericIO_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_GenericIO, + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, +}; + +DataObject iedModel_GenericIO_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_GenericIO_LLN0, + NULL, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_configRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { + DataAttributeModelType, + "configRev", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_ldNs, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { + DataAttributeModelType, + "ldNs", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +LogicalNode iedModel_GenericIO_LPHD1 = { + LogicalNodeModelType, + "LPHD1", + (ModelNode*) &iedModel_GenericIO, + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, +}; + +DataObject iedModel_GenericIO_LPHD1_PhyNam = { + DataObjectModelType, + "PhyNam", + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LPHD1_PhyHealth = { + DataObjectModelType, + "PhyHealth", + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LPHD1_Proxy = { + DataObjectModelType, + "Proxy", + (ModelNode*) &iedModel_GenericIO_LPHD1, + NULL, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_GenericIO_GGIO1 = { + LogicalNodeModelType, + "GGIO1", + (ModelNode*) &iedModel_GenericIO, + NULL, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, +}; + +DataObject iedModel_GenericIO_GGIO1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_q, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn1 = { + DataObjectModelType, + "AnIn1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn2 = { + DataObjectModelType, + "AnIn2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn3 = { + DataObjectModelType, + "AnIn3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn4 = { + DataObjectModelType, + "AnIn4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO1 = { + DataObjectModelType, + "SPCSO1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO2 = { + DataObjectModelType, + "SPCSO2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO3 = { + DataObjectModelType, + "SPCSO3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO4 = { + DataObjectModelType, + "SPCSO4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind1 = { + DataObjectModelType, + "Ind1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind2 = { + DataObjectModelType, + "Ind2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind3 = { + DataObjectModelType, + "Ind3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind4 = { + DataObjectModelType, + "Ind4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + NULL, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +extern ReportControlBlock iedModel_GenericIO_LLN0_report0; +extern ReportControlBlock iedModel_GenericIO_LLN0_report1; +extern ReportControlBlock iedModel_GenericIO_LLN0_report2; +extern ReportControlBlock iedModel_GenericIO_LLN0_report3; +extern ReportControlBlock iedModel_GenericIO_LLN0_report4; +extern ReportControlBlock iedModel_GenericIO_LLN0_report5; +extern ReportControlBlock iedModel_GenericIO_LLN0_report6; + +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report1}; +ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report2}; +ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report3}; +ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report4}; +ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report5}; +ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report6}; +ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, NULL}; + + + + +extern LogControlBlock iedModel_GenericIO_LLN0_lcb0; +extern LogControlBlock iedModel_GenericIO_LLN0_lcb1; +LogControlBlock iedModel_GenericIO_LLN0_lcb0 = {&iedModel_GenericIO_LLN0, "EventLog", "Events", "GenericIO/LLN0$EventLog", 3, 0, true, true, &iedModel_GenericIO_LLN0_lcb1}; +LogControlBlock iedModel_GenericIO_LLN0_lcb1 = {&iedModel_GenericIO_LLN0, "GeneralLog", NULL, NULL, 3, 0, true, true, NULL}; + +extern Log iedModel_GenericIO_LLN0_log0; +extern Log iedModel_GenericIO_LLN0_log1; +Log iedModel_GenericIO_LLN0_log0 = {&iedModel_GenericIO_LLN0, "GeneralLog", &iedModel_GenericIO_LLN0_log1}; +Log iedModel_GenericIO_LLN0_log1 = {&iedModel_GenericIO_LLN0, "EventLog", NULL}; + + +IedModel iedModel = { + "simpleIO", + &iedModel_GenericIO, + &iedModelds_GenericIO_LLN0_Events, + &iedModel_GenericIO_LLN0_report0, + NULL, + NULL, + NULL, + &iedModel_GenericIO_LLN0_lcb0, + &iedModel_GenericIO_LLN0_log0, + initializeValues +}; + +static void +initializeValues() +{ + +iedModel_GenericIO_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_GenericIO_LLN0_NamPlt_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation"); + +iedModel_GenericIO_LLN0_NamPlt_swRev.mmsValue = MmsValue_newVisibleString("0.7.3"); + +iedModel_GenericIO_LLN0_NamPlt_d.mmsValue = MmsValue_newVisibleString("libiec61850 server example"); + +iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO4_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); +} diff --git a/examples/server_example_files/static_model.h b/examples/server_example_files/static_model.h new file mode 100644 index 00000000..b5670e9f --- /dev/null +++ b/examples/server_example_files/static_model.h @@ -0,0 +1,301 @@ +/* + * static_model.h + * + * automatically generated from simpleIO_direct_control.icd + */ + +#ifndef STATIC_MODEL_H_ +#define STATIC_MODEL_H_ + +#include +#include "iec61850_model.h" + +extern IedModel iedModel; +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; + + + +#define IEDMODEL_GenericIO (&iedModel_GenericIO) +#define IEDMODEL_GenericIO_LLN0 (&iedModel_GenericIO_LLN0) +#define IEDMODEL_GenericIO_LLN0_Mod (&iedModel_GenericIO_LLN0_Mod) +#define IEDMODEL_GenericIO_LLN0_Mod_stVal (&iedModel_GenericIO_LLN0_Mod_stVal) +#define IEDMODEL_GenericIO_LLN0_Mod_q (&iedModel_GenericIO_LLN0_Mod_q) +#define IEDMODEL_GenericIO_LLN0_Mod_t (&iedModel_GenericIO_LLN0_Mod_t) +#define IEDMODEL_GenericIO_LLN0_Mod_ctlModel (&iedModel_GenericIO_LLN0_Mod_ctlModel) +#define IEDMODEL_GenericIO_LLN0_Beh (&iedModel_GenericIO_LLN0_Beh) +#define IEDMODEL_GenericIO_LLN0_Beh_stVal (&iedModel_GenericIO_LLN0_Beh_stVal) +#define IEDMODEL_GenericIO_LLN0_Beh_q (&iedModel_GenericIO_LLN0_Beh_q) +#define IEDMODEL_GenericIO_LLN0_Beh_t (&iedModel_GenericIO_LLN0_Beh_t) +#define IEDMODEL_GenericIO_LLN0_Health (&iedModel_GenericIO_LLN0_Health) +#define IEDMODEL_GenericIO_LLN0_Health_stVal (&iedModel_GenericIO_LLN0_Health_stVal) +#define IEDMODEL_GenericIO_LLN0_Health_q (&iedModel_GenericIO_LLN0_Health_q) +#define IEDMODEL_GenericIO_LLN0_Health_t (&iedModel_GenericIO_LLN0_Health_t) +#define IEDMODEL_GenericIO_LLN0_NamPlt (&iedModel_GenericIO_LLN0_NamPlt) +#define IEDMODEL_GenericIO_LLN0_NamPlt_vendor (&iedModel_GenericIO_LLN0_NamPlt_vendor) +#define IEDMODEL_GenericIO_LLN0_NamPlt_swRev (&iedModel_GenericIO_LLN0_NamPlt_swRev) +#define IEDMODEL_GenericIO_LLN0_NamPlt_d (&iedModel_GenericIO_LLN0_NamPlt_d) +#define IEDMODEL_GenericIO_LLN0_NamPlt_configRev (&iedModel_GenericIO_LLN0_NamPlt_configRev) +#define IEDMODEL_GenericIO_LLN0_NamPlt_ldNs (&iedModel_GenericIO_LLN0_NamPlt_ldNs) +#define IEDMODEL_GenericIO_LPHD1 (&iedModel_GenericIO_LPHD1) +#define IEDMODEL_GenericIO_LPHD1_PhyNam (&iedModel_GenericIO_LPHD1_PhyNam) +#define IEDMODEL_GenericIO_LPHD1_PhyNam_vendor (&iedModel_GenericIO_LPHD1_PhyNam_vendor) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth (&iedModel_GenericIO_LPHD1_PhyHealth) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_stVal (&iedModel_GenericIO_LPHD1_PhyHealth_stVal) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_q (&iedModel_GenericIO_LPHD1_PhyHealth_q) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_t (&iedModel_GenericIO_LPHD1_PhyHealth_t) +#define IEDMODEL_GenericIO_LPHD1_Proxy (&iedModel_GenericIO_LPHD1_Proxy) +#define IEDMODEL_GenericIO_LPHD1_Proxy_stVal (&iedModel_GenericIO_LPHD1_Proxy_stVal) +#define IEDMODEL_GenericIO_LPHD1_Proxy_q (&iedModel_GenericIO_LPHD1_Proxy_q) +#define IEDMODEL_GenericIO_LPHD1_Proxy_t (&iedModel_GenericIO_LPHD1_Proxy_t) +#define IEDMODEL_GenericIO_GGIO1 (&iedModel_GenericIO_GGIO1) +#define IEDMODEL_GenericIO_GGIO1_Mod (&iedModel_GenericIO_GGIO1_Mod) +#define IEDMODEL_GenericIO_GGIO1_Mod_q (&iedModel_GenericIO_GGIO1_Mod_q) +#define IEDMODEL_GenericIO_GGIO1_Mod_t (&iedModel_GenericIO_GGIO1_Mod_t) +#define IEDMODEL_GenericIO_GGIO1_Mod_ctlModel (&iedModel_GenericIO_GGIO1_Mod_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_Beh (&iedModel_GenericIO_GGIO1_Beh) +#define IEDMODEL_GenericIO_GGIO1_Beh_stVal (&iedModel_GenericIO_GGIO1_Beh_stVal) +#define IEDMODEL_GenericIO_GGIO1_Beh_q (&iedModel_GenericIO_GGIO1_Beh_q) +#define IEDMODEL_GenericIO_GGIO1_Beh_t (&iedModel_GenericIO_GGIO1_Beh_t) +#define IEDMODEL_GenericIO_GGIO1_Health (&iedModel_GenericIO_GGIO1_Health) +#define IEDMODEL_GenericIO_GGIO1_Health_stVal (&iedModel_GenericIO_GGIO1_Health_stVal) +#define IEDMODEL_GenericIO_GGIO1_Health_q (&iedModel_GenericIO_GGIO1_Health_q) +#define IEDMODEL_GenericIO_GGIO1_Health_t (&iedModel_GenericIO_GGIO1_Health_t) +#define IEDMODEL_GenericIO_GGIO1_NamPlt (&iedModel_GenericIO_GGIO1_NamPlt) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_vendor (&iedModel_GenericIO_GGIO1_NamPlt_vendor) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_swRev (&iedModel_GenericIO_GGIO1_NamPlt_swRev) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_d (&iedModel_GenericIO_GGIO1_NamPlt_d) +#define IEDMODEL_GenericIO_GGIO1_AnIn1 (&iedModel_GenericIO_GGIO1_AnIn1) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag (&iedModel_GenericIO_GGIO1_AnIn1_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f (&iedModel_GenericIO_GGIO1_AnIn1_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_q (&iedModel_GenericIO_GGIO1_AnIn1_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_t (&iedModel_GenericIO_GGIO1_AnIn1_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn2 (&iedModel_GenericIO_GGIO1_AnIn2) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag (&iedModel_GenericIO_GGIO1_AnIn2_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f (&iedModel_GenericIO_GGIO1_AnIn2_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_q (&iedModel_GenericIO_GGIO1_AnIn2_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_t (&iedModel_GenericIO_GGIO1_AnIn2_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn3 (&iedModel_GenericIO_GGIO1_AnIn3) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag (&iedModel_GenericIO_GGIO1_AnIn3_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f (&iedModel_GenericIO_GGIO1_AnIn3_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_q (&iedModel_GenericIO_GGIO1_AnIn3_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_t (&iedModel_GenericIO_GGIO1_AnIn3_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn4 (&iedModel_GenericIO_GGIO1_AnIn4) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag (&iedModel_GenericIO_GGIO1_AnIn4_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f (&iedModel_GenericIO_GGIO1_AnIn4_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_q (&iedModel_GenericIO_GGIO1_AnIn4_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_t (&iedModel_GenericIO_GGIO1_AnIn4_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1 (&iedModel_GenericIO_GGIO1_SPCSO1) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal (&iedModel_GenericIO_GGIO1_SPCSO1_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_q (&iedModel_GenericIO_GGIO1_SPCSO1_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper (&iedModel_GenericIO_GGIO1_SPCSO1_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO1_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_t (&iedModel_GenericIO_GGIO1_SPCSO1_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal (&iedModel_GenericIO_GGIO1_SPCSO2_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_q (&iedModel_GenericIO_GGIO1_SPCSO2_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper (&iedModel_GenericIO_GGIO1_SPCSO2_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO2_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_t (&iedModel_GenericIO_GGIO1_SPCSO2_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3 (&iedModel_GenericIO_GGIO1_SPCSO3) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal (&iedModel_GenericIO_GGIO1_SPCSO3_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_q (&iedModel_GenericIO_GGIO1_SPCSO3_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper (&iedModel_GenericIO_GGIO1_SPCSO3_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_t (&iedModel_GenericIO_GGIO1_SPCSO3_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4 (&iedModel_GenericIO_GGIO1_SPCSO4) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal (&iedModel_GenericIO_GGIO1_SPCSO4_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_q (&iedModel_GenericIO_GGIO1_SPCSO4_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper (&iedModel_GenericIO_GGIO1_SPCSO4_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_t (&iedModel_GenericIO_GGIO1_SPCSO4_t) +#define IEDMODEL_GenericIO_GGIO1_Ind1 (&iedModel_GenericIO_GGIO1_Ind1) +#define IEDMODEL_GenericIO_GGIO1_Ind1_stVal (&iedModel_GenericIO_GGIO1_Ind1_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind1_q (&iedModel_GenericIO_GGIO1_Ind1_q) +#define IEDMODEL_GenericIO_GGIO1_Ind1_t (&iedModel_GenericIO_GGIO1_Ind1_t) +#define IEDMODEL_GenericIO_GGIO1_Ind2 (&iedModel_GenericIO_GGIO1_Ind2) +#define IEDMODEL_GenericIO_GGIO1_Ind2_stVal (&iedModel_GenericIO_GGIO1_Ind2_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind2_q (&iedModel_GenericIO_GGIO1_Ind2_q) +#define IEDMODEL_GenericIO_GGIO1_Ind2_t (&iedModel_GenericIO_GGIO1_Ind2_t) +#define IEDMODEL_GenericIO_GGIO1_Ind3 (&iedModel_GenericIO_GGIO1_Ind3) +#define IEDMODEL_GenericIO_GGIO1_Ind3_stVal (&iedModel_GenericIO_GGIO1_Ind3_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind3_q (&iedModel_GenericIO_GGIO1_Ind3_q) +#define IEDMODEL_GenericIO_GGIO1_Ind3_t (&iedModel_GenericIO_GGIO1_Ind3_t) +#define IEDMODEL_GenericIO_GGIO1_Ind4 (&iedModel_GenericIO_GGIO1_Ind4) +#define IEDMODEL_GenericIO_GGIO1_Ind4_stVal (&iedModel_GenericIO_GGIO1_Ind4_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind4_q (&iedModel_GenericIO_GGIO1_Ind4_q) +#define IEDMODEL_GenericIO_GGIO1_Ind4_t (&iedModel_GenericIO_GGIO1_Ind4_t) + +#endif /* STATIC_MODEL_H_ */ + diff --git a/examples/server_example_files/vmd-filestore/test b/examples/server_example_files/vmd-filestore/test new file mode 100644 index 00000000..9daeafb9 --- /dev/null +++ b/examples/server_example_files/vmd-filestore/test @@ -0,0 +1 @@ +test diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index 63c60333..29ba1b41 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -1131,6 +1131,32 @@ IedConnection_getFileDirectory(IedConnection self, IedClientError* error, const return fileNames; } +LinkedList /**/ +IedConnection_getFileDirectoryEx(IedConnection self, IedClientError* error, const char* directoryName, const char* continueAfter, + bool* moreFollows) +{ + *error = IED_ERROR_OK; + + MmsError mmsError = MMS_ERROR_NONE; + + LinkedList fileNames = LinkedList_create(); + + bool moreFollowsInternal = MmsConnection_getFileDirectory(self->connection, &mmsError, directoryName, continueAfter, + mmsFileDirectoryHandler, fileNames); + + if (mmsError != MMS_ERROR_NONE) { + *error = iedConnection_mapMmsErrorToIedError(mmsError); + LinkedList_destroyDeep(fileNames, (LinkedListValueDeleteFunction) FileDirectoryEntry_destroy); + + return NULL; + } + + if (moreFollows != NULL) + *moreFollows = moreFollowsInternal; + + return fileNames; +} + struct sClientProvidedFileReadHandler { IedClientGetFileHandler handler; @@ -1201,6 +1227,13 @@ IedConnection_getFile(IedConnection self, IedClientError* error, const char* fil return clientFileReadHandler.byteReceived; } +void +IedConnection_setFilestoreBasepath(IedConnection self, const char* basepath) +{ + /* simply pass the call to MMS client API */ + MmsConnection_setFilestoreBasepath(self->connection, basepath); +} + void IedConnection_setFile(IedConnection self, IedClientError* error, const char* sourceFilename, const char* destinationFilename) { diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 26f3428f..3319eba1 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -1871,6 +1871,38 @@ FileDirectoryEntry_getLastModified(FileDirectoryEntry self); LinkedList /**/ IedConnection_getFileDirectory(IedConnection self, IedClientError* error, const char* directoryName); + +/** + * \brief returns the directory entries of the specified file directory returned by a single file directory request. + * + * This function will only create a single request and the result may only be the directory that fits + * into a single MMS PDU. If the server contains more directory entries, this will be indicated by setting + * the moreFollows variable (if provided by the caller). If the directory entry does not fit into a single MMS + * PDU the next part of the directory list can be requested by setting the continueAfter parameter with the value + * of the last filename of the received list. + * + * Requires the server to support file services. + * + * NOTE: the returned linked list has to be freed by the user. You can user the following statement + * to free the list of directory entries: + * + * LinkedList_destroyDeep(fileNames, (LinkedListValueDeleteFunction) FileDirectoryEntry_destroy); + * + * where fileNames is the return value of this function. + * + * \param self the connection object + * \param error the error code if an error occurs + * \param directoryName the name of the directory or NULL to get the entries of the root directory + * \param continueAfter last received filename to continue after, or NULL for the first request + * \param moreFollows if provided by the caller (non NULL) the function will indicate if more directory entries + * are available. + * + * \return the list of directory entries. The return type is a LinkedList with FileDirectoryEntry elements + */ +LinkedList /**/ +IedConnection_getFileDirectoryEx(IedConnection self, IedClientError* error, const char* directoryName, const char* continueAfter, + bool* moreFollows); + /** * \brief user provided handler to receive the data of the GetFile request * @@ -1903,6 +1935,19 @@ uint32_t IedConnection_getFile(IedConnection self, IedClientError* error, const char* fileName, IedClientGetFileHandler handler, void* handlerParameter); +/** + * \brief Set the virtual filestore basepath for the setFile service + * + * All external file service accesses will be mapped to paths relative to the base directory. + * NOTE: This function is only available when the CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME + * option in stack_config.h is set. + * + * \param self the connection object + * \param basepath the new virtual filestore basepath + */ +void +IedConnection_setFilestoreBasepath(IedConnection, const char* basepath); + /** * \brief Implementation of the SetFile ACSI service * diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index cf409dab..90b266cb 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -85,6 +85,19 @@ IedServer_destroy(IedServer self); void IedServer_setLocalIpAddress(IedServer self, const char* localIpAddress); +/** + * \brief Set the virtual filestore basepath for the MMS file services + * + * All external file service accesses will be mapped to paths relative to the base directory. + * NOTE: This function is only available when the CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME + * option in stack_config.h is set. + * + * \param self the IedServer instance + * \param basepath the new virtual filestore basepath + */ +void +IedServer_setFilestoreBasepath(IedServer self, const char* basepath); + /** * \brief Start handling client connections * diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index ebf1cc27..e82af82e 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -604,6 +604,13 @@ IedServer_stop(IedServer self) } #endif /* (CONFIG_MMS_THREADLESS_STACK != 1) */ +void +IedServer_setFilestoreBasepath(IedServer self, const char* basepath) +{ + /* simply pass to MMS server API */ + MmsServer_setFilestoreBasepath(self->mmsServer, basepath); +} + void IedServer_setLocalIpAddress(IedServer self, const char* localIpAddress) { diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index 972f0fe5..1f60c1c7 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -106,6 +106,19 @@ typedef void (*MmsRawMessageHandler) (void* parameter, uint8_t* message, int mes void MmsConnection_setRawMessageHandler(MmsConnection self, MmsRawMessageHandler handler, void* parameter); +/** + * \brief Set the virtual filestore basepath for the MMS obtain file services + * + * All external file service accesses will be mapped to paths relative to the base directory. + * NOTE: This function is only available when the CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME + * option in stack_config.h is set. + * + * \param self the MmsServer instance + * \param basepath the new virtual filestore basepath + */ +void +MmsConnection_setFilestoreBasepath(MmsConnection self, const char* basepath); + /** * \brief Set the request timeout in ms for this connection * diff --git a/src/mms/inc/mms_server.h b/src/mms/inc/mms_server.h index 7aa4d673..23d128d4 100644 --- a/src/mms/inc/mms_server.h +++ b/src/mms/inc/mms_server.h @@ -164,13 +164,61 @@ typedef void (*MmsGetFileCompleteHandler)(void* parameter, MmsServerConnection c * \brief Install callback handler that is invoked when the file upload (obtainFile service) is completed and the * file has been uploaded. * - * \param self the MmsServer instance to operate on + * \param self the MmsServer instance * \param handler the callback handler function * \param parameter user provided parameter that is passed to the callback handler */ void MmsServer_installGetFileCompleteHandler(MmsServer self, MmsGetFileCompleteHandler handler, void* parameter); + +typedef enum { + MMS_FILE_ACCESS_TYPE_READ_DIRECTORY, + MMS_FILE_ACCESS_TYPE_OPEN, + MMS_FILE_ACCESS_TYPE_OBTAIN, + MMS_FILE_ACCESS_TYPE_DELETE, + MMS_FILE_ACCESS_TYPE_RENAME +} MmsFileServiceType; + +/** + * \brief MmsFileAccessHandler callback function. Use to monitor and control file access + * + * \param parameter user provided parameter that is passed to the callback handler + * \param connection the connection that requested the service + * \param service the requested file service + * \param localFilename the requested file or directory name at the server + * \param otherFilename a second file name parameter (e.g. source file of the ObtainFile or new file of rename file) + * + * \return MMS_ERROR_NONE when the request is accepted, otherwise use the appropriate error code (e.g. MMS_ERROR_FILE_FILE_ACCESS_DENIED) + */ +typedef MmsError (*MmsFileAccessHandler) (void* parameter, MmsServerConnection connection, MmsFileServiceType service, + const char* localFilename, const char* otherFilename); + + +/** + * \brief Install a callback handler this is invoked when the client requests a file server. This function can be + * used to monitor and control file access + * + * \param self the MmsServer instance + * \param handler the callback handler function + * \param parameter user provided parameter that is passed to the callback handler + */ +void +MmsServer_installFileAccessHandler(MmsServer self, MmsFileAccessHandler handler, void* parameter); + +/** + * \brief Set the virtual filestore basepath for the MMS file services + * + * All external file service accesses will be mapped to paths relative to the base directory. + * NOTE: This function is only available when the CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME + * option in stack_config.h is set. + * + * \param self the MmsServer instance + * \param basepath the new virtual filestore basepath + */ +void +MmsServer_setFilestoreBasepath(MmsServer self, const char* basepath); + /** * \brief lock the cached server data model * @@ -198,9 +246,6 @@ void MmsServer_insertIntoCache(MmsServer self, MmsDomain* domain, char* itemId, MmsValue* value); -void -MmsServer_setDevice(MmsServer self, MmsDevice* device); - /*************************************************** * Functions for multi-threaded operation mode ***************************************************/ @@ -391,6 +436,7 @@ MmsServerConnection_getClientAddress(MmsServerConnection self); IsoConnection MmsServerConnection_getIsoConnection(MmsServerConnection self); + /**@}*/ #ifdef __cplusplus diff --git a/src/mms/inc_private/mms_client_internal.h b/src/mms/inc_private/mms_client_internal.h index af992ad1..8eb23a42 100644 --- a/src/mms/inc_private/mms_client_internal.h +++ b/src/mms/inc_private/mms_client_internal.h @@ -102,7 +102,12 @@ struct sMmsConnection { #if (MMS_OBTAIN_FILE_SERVICE == 1) int32_t nextFrsmId; MmsFileReadStateMachine frsms[CONFIG_MMS_MAX_NUMBER_OF_OPEN_FILES_PER_CONNECTION]; + +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char* filestoreBasepath; #endif + +#endif /* (MMS_OBTAIN_FILE_SERVICE == 1) */ }; @@ -116,6 +121,9 @@ typedef enum { MMS_OBJECT_CLASS_DOMAIN = 9 } MmsObjectClass; +char* +MmsConnection_getFilestoreBasepath(MmsConnection self); + MmsValue* mmsClient_parseListOfAccessResults(AccessResult_t** accessResultList, int listSize, bool createArray); diff --git a/src/mms/inc_private/mms_common_internal.h b/src/mms/inc_private/mms_common_internal.h index 0c97dde1..e987fd12 100644 --- a/src/mms/inc_private/mms_common_internal.h +++ b/src/mms/inc_private/mms_common_internal.h @@ -28,6 +28,7 @@ #include "MmsPdu.h" #include "conversions.h" #include "byte_buffer.h" +#include "mms_server.h" #if (MMS_FILE_SERVICE == 1) @@ -60,8 +61,16 @@ void mmsMsg_createFileCloseResponse(uint32_t invokeId, ByteBuffer* response); void -mmsMsg_createFileOpenResponse(uint32_t invokeId, ByteBuffer* response, char* fullPath, MmsFileReadStateMachine* frsm); +mmsMsg_createFileOpenResponse(const char* basepath, uint32_t invokeId, ByteBuffer* response, char* fullPath, MmsFileReadStateMachine* frsm); +bool +mmsMsg_parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint32_t invokeId, ByteBuffer* response); + +void +mmsMsg_createExtendedFilename(const char* basepath, char* extendedFileName, char* fileName); + +FileHandle +mmsMsg_openFile(const char* basepath, char* fileName, bool readWrite); #endif /* (MMS_FILE_SERVICE == 1) */ diff --git a/src/mms/inc_private/mms_server_connection.h b/src/mms/inc_private/mms_server_connection.h index 01901ec7..e65c78ac 100644 --- a/src/mms/inc_private/mms_server_connection.h +++ b/src/mms/inc_private/mms_server_connection.h @@ -101,6 +101,9 @@ MmsServerConnection_getLastInvokeId(MmsServerConnection self); uint32_t MmsServerConnection_getNextRequestInvokeId(MmsServerConnection self); +const char* +MmsServerConnection_getFilesystemBasepath(MmsServerConnection self); + #endif /* MMS_SERVER_CONNECTION_H_ */ diff --git a/src/mms/inc_private/mms_server_internal.h b/src/mms/inc_private/mms_server_internal.h index 33935012..58655c87 100644 --- a/src/mms/inc_private/mms_server_internal.h +++ b/src/mms/inc_private/mms_server_internal.h @@ -156,6 +156,15 @@ struct sMmsServer { struct sMmsObtainFileTask fileUploadTasks[CONFIG_MMS_SERVER_MAX_GET_FILE_TASKS]; #endif +#if (MMS_FILE_SERVICE == 1) + MmsFileAccessHandler fileAccessHandler; + void* fileAccessHandlerParameter; +#endif + +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char* filestoreBasepath; +#endif + }; struct sMmsServerConnection { diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 00ad03fd..3428c190 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -947,9 +947,50 @@ MmsConnection_destroy(MmsConnection self) GLOBAL_FREEMEM(self->outstandingCalls); +#if (MMS_OBTAIN_FILE_SERVICE == 1) +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + if (self->filestoreBasepath != NULL) + GLOBAL_FREEMEM(self->filestoreBasepath); +#endif +#endif + GLOBAL_FREEMEM(self); } +void +MmsConnection_setFilestoreBasepath(MmsConnection self, const char* basepath) +{ +#if (MMS_OBTAIN_FILE_SERVICE == 1) +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + if (self->filestoreBasepath != NULL) { + GLOBAL_FREEMEM(self->filestoreBasepath); + self->filestoreBasepath = NULL; + } + + if (basepath != NULL) + self->filestoreBasepath = StringUtils_copyString(basepath); +#endif +#endif +} + +char* +MmsConnection_getFilestoreBasepath(MmsConnection self) +{ +#if (MMS_OBTAIN_FILE_SERVICE == 1) +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + if (self->filestoreBasepath != NULL) + return self->filestoreBasepath; + else + return CONFIG_VIRTUAL_FILESTORE_BASEPATH; +#else + return CONFIG_VIRTUAL_FILESTORE_BASEPATH; +#endif + +#else + return CONFIG_VIRTUAL_FILESTORE_BASEPATH; +#endif +} + void MmsConnection_setRawMessageHandler(MmsConnection self, MmsRawMessageHandler handler, void* parameter) { diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index b0e75494..5ac38e36 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -80,57 +80,6 @@ getNextFrsmId(MmsConnection connection) return nextFrsmId; } -//TODO remove redundancy (with server implementation) -static void -createExtendedFilename(char* extendedFileName, char* fileName) -{ - strcpy(extendedFileName, CONFIG_VIRTUAL_FILESTORE_BASEPATH); - strncat(extendedFileName, fileName, sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256); -} - -//TODO remove redundancy (with server implementation) -static FileHandle -openFile(char* fileName, bool readWrite) -{ - char extendedFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; - - createExtendedFilename(extendedFileName, fileName); - - return FileSystem_openFile(extendedFileName, readWrite); -} - -//TODO remove redundancy (with server implementation) -static bool -parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint32_t invokeId, ByteBuffer* response) -{ - uint8_t tag = buffer[(*bufPos)++]; - int length; - - if (tag != 0x19) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); - return false; - } - - *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); - - if (*bufPos < 0) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); - return false; - } - - if (length > 255) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); - return false; - } - - memcpy(filename, buffer + *bufPos, length); - filename[length] = 0; - *bufPos += length; - - return true; -} - - void mmsClient_handleFileOpenRequest( MmsConnection connection, @@ -152,7 +101,7 @@ mmsClient_handleFileOpenRequest( switch(tag) { case 0xa0: /* filename */ - if (!parseFileName(filename, buffer, &bufPos, bufPos + length, invokeId, response)) + if (!mmsMsg_parseFileName(filename, buffer, &bufPos, bufPos + length, invokeId, response)) return; hasFileName = true; @@ -175,14 +124,15 @@ mmsClient_handleFileOpenRequest( MmsFileReadStateMachine* frsm = getFreeFrsm(connection); if (frsm != NULL) { - FileHandle fileHandle = openFile(filename, false); + FileHandle fileHandle = mmsMsg_openFile(MmsConnection_getFilestoreBasepath(connection), filename, false); if (fileHandle != NULL) { frsm->fileHandle = fileHandle; frsm->readPosition = filePosition; frsm->frsmId = getNextFrsmId(connection); - mmsMsg_createFileOpenResponse(invokeId, response, filename, frsm); + mmsMsg_createFileOpenResponse(MmsConnection_getFilestoreBasepath(connection), + invokeId, response, filename, frsm); } else mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); diff --git a/src/mms/iso_mms/common/mms_common_msg.c b/src/mms/iso_mms/common/mms_common_msg.c index 36bdd7ef..55da14df 100644 --- a/src/mms/iso_mms/common/mms_common_msg.c +++ b/src/mms/iso_mms/common/mms_common_msg.c @@ -1,7 +1,7 @@ /* * mms_common_msg.c * - * Copyright 2013 Michael Zillgith + * Copyright 2013 - 2017 Michael Zillgith * * This file is part of libIEC61850. * @@ -25,6 +25,7 @@ #include "mms_common_internal.h" #include "stack_config.h" #include "mms_value_internal.h" +#include "ber_decode.h" static void mmsMsg_createFloatData(MmsValue* value, int* size, uint8_t** buf) @@ -342,3 +343,72 @@ mmsMsg_copyAsn1IdentifierToStringBuffer(Identifier_t identifier, char* buffer, i buffer[0] = 0; } } + +void +mmsMsg_createExtendedFilename(const char* basepath, char* extendedFileName, char* fileName) +{ +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + // strncpy(extendedFileName, MmsServerConnection_getFilesystemBasepath(self), 512); + strncpy(extendedFileName, basepath, 512); + strncat(extendedFileName, fileName, 512); +#else + strcpy(extendedFileName, CONFIG_VIRTUAL_FILESTORE_BASEPATH); + strncat(extendedFileName, fileName, sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256); +#endif +} + + + +FileHandle +mmsMsg_openFile(const char* basepath, char* fileName, bool readWrite) +{ +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char extendedFileName[512]; +#else + char extendedFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; +#endif + + mmsMsg_createExtendedFilename(basepath, extendedFileName, fileName); + + return FileSystem_openFile(extendedFileName, readWrite); +} + + +bool +mmsMsg_parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint32_t invokeId, ByteBuffer* response) +{ + uint8_t tag = buffer[(*bufPos)++]; + int length; + + if (tag != 0x19) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + return false; + } + + *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); + + if (*bufPos < 0) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + return false; + } + + if (length > 255) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + return false; + } + + memcpy(filename, buffer + *bufPos, length); + filename[length] = 0; + *bufPos += length; + + /* Check if path contains invalid characters (prevent escaping the virtual filestore by using "..") + * TODO this may be platform dependent. Also depending of the platform there might be other evil + * characters. + */ + if (strstr(filename, "..") != NULL) { + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILENAME_SYNTAX_ERROR); + return false; + } + + return true; +} diff --git a/src/mms/iso_mms/server/mms_file_service.c b/src/mms/iso_mms/server/mms_file_service.c index ead75715..0bc5dcc8 100644 --- a/src/mms/iso_mms/server/mms_file_service.c +++ b/src/mms/iso_mms/server/mms_file_service.c @@ -122,69 +122,85 @@ encodeFileAttributes(uint8_t tag, uint32_t fileSize, char* gtString, uint8_t* bu } } -static void -createExtendedFilename(char* extendedFileName, char* fileName) -{ - strcpy(extendedFileName, CONFIG_VIRTUAL_FILESTORE_BASEPATH); - strncat(extendedFileName, fileName, sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256); -} - static bool -getFileInfo(char* filename, uint32_t* fileSize, uint64_t* lastModificationTimestamp) +getFileInfo(const char* basepath, char* filename, uint32_t* fileSize, uint64_t* lastModificationTimestamp) { +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char extendedFileName[512]; +#else char extendedFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; +#endif - createExtendedFilename(extendedFileName, filename); + mmsMsg_createExtendedFilename(basepath, extendedFileName, filename); return FileSystem_getFileInfo(extendedFileName, fileSize, lastModificationTimestamp); } static FileHandle -openFile(char* fileName, bool readWrite) +openFile(const char* basepath, char* fileName, bool readWrite) { +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char extendedFileName[512]; +#else char extendedFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; +#endif - createExtendedFilename(extendedFileName, fileName); + mmsMsg_createExtendedFilename(basepath, extendedFileName, fileName); return FileSystem_openFile(extendedFileName, readWrite); } static DirectoryHandle -openDirectory(char* directoryName) +openDirectory(const char* basepath, char* directoryName) { +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char extendedFileName[512]; +#else char extendedFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; +#endif - createExtendedFilename(extendedFileName, directoryName); + mmsMsg_createExtendedFilename(basepath, extendedFileName, directoryName); return FileSystem_openDirectory(extendedFileName); } static bool -renameFile(char* oldFilename, char* newFilename) { +renameFile(const char* basepath, char* oldFilename, char* newFilename) { + +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char extendedOldFileName[512]; + char extendedNewFileName[512]; +#else char extendedOldFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; char extendedNewFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; +#endif - createExtendedFilename(extendedOldFileName, oldFilename); - createExtendedFilename(extendedNewFileName, newFilename); + mmsMsg_createExtendedFilename(basepath, extendedOldFileName, oldFilename); + mmsMsg_createExtendedFilename(basepath, extendedNewFileName, newFilename); return FileSystem_renameFile(extendedOldFileName, extendedNewFileName); } static bool -deleteFile(char* fileName) { +deleteFile(const char* basepath, char* fileName) { +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char extendedFileName[512]; +#else char extendedFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; +#endif - createExtendedFilename(extendedFileName, fileName); + mmsMsg_createExtendedFilename(basepath, extendedFileName, fileName); return FileSystem_deleteFile(extendedFileName); } void -mmsMsg_createFileOpenResponse(uint32_t invokeId, ByteBuffer* response, char* fullPath, MmsFileReadStateMachine* frsm) +mmsMsg_createFileOpenResponse(const char* basepath, uint32_t invokeId, ByteBuffer* response, + char* filename, MmsFileReadStateMachine* frsm) { uint64_t msTime; - getFileInfo(fullPath, &(frsm->fileSize), &msTime); + getFileInfo(basepath, filename, &(frsm->fileSize), &msTime); char gtString[30]; @@ -219,35 +235,7 @@ mmsMsg_createFileOpenResponse(uint32_t invokeId, ByteBuffer* response, char* ful response->size = bufPos; } -static bool -parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint32_t invokeId, ByteBuffer* response) -{ - uint8_t tag = buffer[(*bufPos)++]; - int length; - - if (tag != 0x19) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); - return false; - } - - *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); - - if (*bufPos < 0) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); - return false; - } - - if (length > 255) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); - return false; - } - memcpy(filename, buffer + *bufPos, length); - filename[length] = 0; - *bufPos += length; - - return true; -} void mmsServer_handleFileDeleteRequest( @@ -271,7 +259,17 @@ mmsServer_handleFileDeleteRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: mms_file_service.c: Delete file (%s)\n", filename); - if (!getFileInfo(filename, NULL, NULL)) { + if (connection->server->fileAccessHandler != NULL) { + MmsError access = connection->server->fileAccessHandler(connection->server->fileAccessHandlerParameter, + connection, MMS_FILE_ACCESS_TYPE_DELETE, filename, NULL); + + if (access != MMS_ERROR_NONE) { + mmsMsg_createServiceErrorPdu(invokeId, response, access); + return; + } + } + + if (!getFileInfo(MmsServerConnection_getFilesystemBasepath(connection), filename, NULL, NULL)) { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: mms_file_service.c: File (%s) not found\n", filename); @@ -279,7 +277,7 @@ mmsServer_handleFileDeleteRequest( return; } - if (!deleteFile(filename)) { + if (!deleteFile(MmsServerConnection_getFilesystemBasepath(connection), filename)) { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: mms_file_service.c: Delete file (%s) failed\n", filename); @@ -316,7 +314,7 @@ mmsServer_handleFileOpenRequest( switch(tag) { case 0xa0: /* filename */ - if (!parseFileName(filename, buffer, &bufPos, bufPos + length, invokeId, response)) + if (!mmsMsg_parseFileName(filename, buffer, &bufPos, bufPos + length, invokeId, response)) return; hasFileName = true; @@ -336,17 +334,28 @@ mmsServer_handleFileOpenRequest( if (hasFileName) { + if (connection->server->fileAccessHandler != NULL) { + MmsError access = connection->server->fileAccessHandler(connection->server->fileAccessHandlerParameter, + connection, MMS_FILE_ACCESS_TYPE_OPEN, filename, NULL); + + if (access != MMS_ERROR_NONE) { + mmsMsg_createServiceErrorPdu(invokeId, response, access); + return; + } + } + MmsFileReadStateMachine* frsm = getFreeFrsm(connection); if (frsm != NULL) { - FileHandle fileHandle = openFile(filename, false); + FileHandle fileHandle = openFile(MmsServerConnection_getFilesystemBasepath(connection), filename, false); if (fileHandle != NULL) { frsm->fileHandle = fileHandle; frsm->readPosition = filePosition; frsm->frsmId = getNextFrsmId(connection); - mmsMsg_createFileOpenResponse(invokeId, response, filename, frsm); + mmsMsg_createFileOpenResponse(MmsServerConnection_getFilesystemBasepath(connection), + invokeId, response, filename, frsm); } else mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_FILE_FILE_NON_EXISTENT); @@ -394,9 +403,6 @@ createObtainFileResponse(uint32_t invokeId, ByteBuffer* response) void mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) { - - //printf("mmsServer_fileUploadTask: state: %i\n", task->state); - switch (task->state) { case MMS_FILE_UPLOAD_STATE_NOT_USED: @@ -412,7 +418,7 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; FileSystem_closeFile(task->fileHandle); - deleteFile(task->destinationFilename); + deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); } } break; @@ -446,7 +452,7 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; FileSystem_closeFile(task->fileHandle); - deleteFile(task->destinationFilename); + deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); } break; @@ -479,7 +485,7 @@ mmsServer_fileUploadTask(MmsServer self, MmsObtainFileTask task) task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_SOURCE; FileSystem_closeFile(task->fileHandle); - deleteFile(task->destinationFilename); + deleteFile(MmsServerConnection_getFilesystemBasepath(task->connection), task->destinationFilename); } break; @@ -568,7 +574,7 @@ mmsServer_handleObtainFileRequest( case 0xa1: /* source filename */ - if (!parseFileName(sourceFilename, buffer, &bufPos, bufPos + length, invokeId, response)) + if (!mmsMsg_parseFileName(sourceFilename, buffer, &bufPos, bufPos + length, invokeId, response)) return; hasSourceFileName = true; @@ -577,7 +583,7 @@ mmsServer_handleObtainFileRequest( case 0xa2: /* destination filename */ - if (!parseFileName(destinationFilename, buffer, &bufPos, bufPos + length, invokeId, response)) + if (!mmsMsg_parseFileName(destinationFilename, buffer, &bufPos, bufPos + length, invokeId, response)) return; hasDestinationFilename = true; @@ -592,14 +598,31 @@ mmsServer_handleObtainFileRequest( if (hasSourceFileName && hasDestinationFilename) { - /* call callback to check if access is allowed */ + /* Call user to check if access is allowed */ + if (connection->server->fileAccessHandler != NULL) { + MmsError access = connection->server->fileAccessHandler(connection->server->fileAccessHandlerParameter, + connection, MMS_FILE_ACCESS_TYPE_OBTAIN, destinationFilename, sourceFilename); + + if (access != MMS_ERROR_NONE) { + mmsMsg_createServiceErrorPdu(invokeId, response, access); + return; + } + } + + /* call callback to check if access is allowed -- DEPRECATED */ if (connection->server->obtainFileHandler) if (connection->server->obtainFileHandler(connection->server->obtainFileHandlerParameter, connection, sourceFilename, destinationFilename) == false) goto exit_access_denied; /* check if destination file already exists. If exists return error message */ + +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + char extendedFileName[512]; +#else char extendedFileName[sizeof(CONFIG_VIRTUAL_FILESTORE_BASEPATH) + 256]; - createExtendedFilename(extendedFileName, destinationFilename); +#endif + mmsMsg_createExtendedFilename(MmsServerConnection_getFilesystemBasepath(connection), + extendedFileName, destinationFilename); if (FileSystem_getFileInfo(extendedFileName, NULL, NULL)) { if (DEBUG_MMS_SERVER) @@ -614,7 +637,8 @@ mmsServer_handleObtainFileRequest( if (task != NULL) { - FileHandle fileHandle = openFile(destinationFilename, true); + FileHandle fileHandle = openFile(MmsServerConnection_getFilesystemBasepath(connection), + destinationFilename, true); if (fileHandle == NULL) { task->state = MMS_FILE_UPLOAD_STATE_SEND_OBTAIN_FILE_ERROR_DESTINATION; @@ -792,11 +816,11 @@ encodeFileSpecification(uint8_t tag, char* fileSpecification, uint8_t* buffer, i } static int -addFileEntriesToResponse(uint8_t* buffer, int bufPos, int maxBufSize, char* directoryName, char** continueAfterFileName, bool* moreFollows) +addFileEntriesToResponse(const char* basepath, uint8_t* buffer, int bufPos, int maxBufSize, char* directoryName, char** continueAfterFileName, bool* moreFollows) { int directoryNameLength = strlen(directoryName); - DirectoryHandle directory = openDirectory(directoryName); + DirectoryHandle directory = openDirectory(basepath, directoryName); if (directory != NULL) { @@ -813,7 +837,7 @@ addFileEntriesToResponse(uint8_t* buffer, int bufPos, int maxBufSize, char* dire strcat(directoryName, fileName); - bufPos = addFileEntriesToResponse(buffer, bufPos, maxBufSize, directoryName, continueAfterFileName, moreFollows); + bufPos = addFileEntriesToResponse(basepath, buffer, bufPos, maxBufSize, directoryName, continueAfterFileName, moreFollows); if (*moreFollows == true) break; @@ -835,7 +859,7 @@ addFileEntriesToResponse(uint8_t* buffer, int bufPos, int maxBufSize, char* dire uint32_t fileSize; - if (getFileInfo(directoryName, &fileSize, &msTime)) { + if (getFileInfo(basepath, directoryName, &fileSize, &msTime)) { char gtString[30]; Conversions_msTimeToGeneralizedTime(msTime, (uint8_t*) gtString); @@ -873,7 +897,7 @@ addFileEntriesToResponse(uint8_t* buffer, int bufPos, int maxBufSize, char* dire } static void -createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, int maxPduSize, char* directoryName, char* continueAfterFileName) +createFileDirectoryResponse(const char* basepath, uint32_t invokeId, ByteBuffer* response, int maxPduSize, char* directoryName, char* continueAfterFileName) { int maxSize = maxPduSize - 3; /* reserve space for moreFollows */ uint8_t* buffer = response->buffer; @@ -889,7 +913,7 @@ createFileDirectoryResponse(uint32_t invokeId, ByteBuffer* response, int maxPduS continueAfterFileName = NULL; } - tempCurPos = addFileEntriesToResponse(buffer, tempCurPos, maxSize, directoryName, &continueAfterFileName, &moreFollows); + tempCurPos = addFileEntriesToResponse(basepath, buffer, tempCurPos, maxSize, directoryName, &continueAfterFileName, &moreFollows); if (tempCurPos < 0) { @@ -965,7 +989,7 @@ mmsServer_handleFileRenameRequest( switch(tag) { case 0xa0: /* currentFilename */ - if (!parseFileName(currentFileName, buffer, &bufPos, bufPos + length, invokeId, response)) + if (!mmsMsg_parseFileName(currentFileName, buffer, &bufPos, bufPos + length, invokeId, response)) return; if (DEBUG_MMS_SERVER) @@ -974,7 +998,7 @@ mmsServer_handleFileRenameRequest( break; case 0xa1: /* newFilename */ - if (!parseFileName(newFileName, buffer, &bufPos, bufPos + length, invokeId, response)) + if (!mmsMsg_parseFileName(newFileName, buffer, &bufPos, bufPos + length, invokeId, response)) return; if (DEBUG_MMS_SERVER) @@ -991,7 +1015,19 @@ mmsServer_handleFileRenameRequest( } if ((strlen(currentFileName) != 0) && (strlen(newFileName) != 0)) { - if (renameFile(currentFileName, newFileName)){ + + /* Call user to check if access is allowed */ + if (connection->server->fileAccessHandler != NULL) { + MmsError access = connection->server->fileAccessHandler(connection->server->fileAccessHandlerParameter, + connection, MMS_FILE_ACCESS_TYPE_RENAME, currentFileName, newFileName); + + if (access != MMS_ERROR_NONE) { + mmsMsg_createServiceErrorPdu(invokeId, response, access); + return; + } + } + + if (renameFile(MmsServerConnection_getFilesystemBasepath(connection), currentFileName, newFileName)){ /* send positive response */ createNullResponseExtendedTag(invokeId, response, 0x4b); } @@ -1037,7 +1073,7 @@ mmsServer_handleFileDirectoryRequest( switch(tag) { case 0xa0: /* filename */ - if (!parseFileName(filename, buffer, &bufPos, bufPos + length, invokeId, response)) + if (!mmsMsg_parseFileName(filename, buffer, &bufPos, bufPos + length, invokeId, response)) return; /* check for wildcard character(*) */ @@ -1047,7 +1083,7 @@ mmsServer_handleFileDirectoryRequest( break; case 0xa1: /* continue-after */ - if (!parseFileName(continueAfterFileName, buffer, &bufPos, bufPos + length, invokeId, response)) + if (!mmsMsg_parseFileName(continueAfterFileName, buffer, &bufPos, bufPos + length, invokeId, response)) return; continueAfter = continueAfterFileName; @@ -1066,7 +1102,19 @@ mmsServer_handleFileDirectoryRequest( int maxPduSize = connection->maxPduSize; - createFileDirectoryResponse(invokeId, response, maxPduSize, filename, continueAfter); + /* Call user to check if access is allowed */ + if (connection->server->fileAccessHandler != NULL) { + MmsError access = connection->server->fileAccessHandler(connection->server->fileAccessHandlerParameter, + connection, MMS_FILE_ACCESS_TYPE_READ_DIRECTORY, filename, continueAfter); + + if (access != MMS_ERROR_NONE) { + mmsMsg_createServiceErrorPdu(invokeId, response, access); + return; + } + } + + createFileDirectoryResponse(MmsServerConnection_getFilesystemBasepath(connection), + invokeId, response, maxPduSize, filename, continueAfter); } #endif /* MMS_FILE_SERVICE == 1 */ diff --git a/src/mms/iso_mms/server/mms_server.c b/src/mms/iso_mms/server/mms_server.c index efb7dbbf..75985d64 100644 --- a/src/mms/iso_mms/server/mms_server.c +++ b/src/mms/iso_mms/server/mms_server.c @@ -50,9 +50,7 @@ createValueCaches(MmsDevice* device) MmsServer MmsServer_create(IsoServer isoServer, MmsDevice* device) { - MmsServer self = (MmsServer) GLOBAL_MALLOC(sizeof(struct sMmsServer)); - - memset(self, 0, sizeof(struct sMmsServer)); + MmsServer self = (MmsServer) GLOBAL_CALLOC(1, sizeof(struct sMmsServer)); self->isoServer = isoServer; self->device = device; @@ -72,6 +70,22 @@ MmsServer_create(IsoServer isoServer, MmsDevice* device) return self; } + +void +MmsServer_setFilestoreBasepath(MmsServer self, const char* basepath) +{ +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + if (self->filestoreBasepath != NULL) { + GLOBAL_FREEMEM(self->filestoreBasepath); + self->filestoreBasepath = NULL; + } + + if (basepath != NULL) + self->filestoreBasepath = StringUtils_copyString(basepath); +#endif /* (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) */ +} + + void MmsServer_lockModel(MmsServer self) { @@ -169,6 +183,15 @@ MmsServer_setClientAuthenticator(MmsServer self, AcseAuthenticator authenticator IsoServer_setAuthenticator(self->isoServer, authenticator, authenticatorParameter); } +#if (MMS_FILE_SERVICE == 1) +void +MmsServer_installFileAccessHandler(MmsServer self, MmsFileAccessHandler handler, void* parameter) +{ + self->fileAccessHandler = handler; + self->fileAccessHandlerParameter = parameter; +} +#endif /* (MMS_FILE_SERVICE == 1) */ + #if (MMS_OBTAIN_FILE_SERVICE == 1) void MmsServer_installObtainFileHandler(MmsServer self, MmsObtainFileHandler handler, void* parameter) @@ -212,6 +235,11 @@ MmsServer_destroy(MmsServer self) ByteBuffer_destroy(self->transmitBuffer); +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + if (self->filestoreBasepath != NULL) + GLOBAL_FREEMEM(self->filestoreBasepath); +#endif + GLOBAL_FREEMEM(self); } @@ -298,12 +326,6 @@ MmsServer_getDevice(MmsServer self) return self->device; } -inline void -MmsServer_setDevice(MmsServer server, MmsDevice* device) -{ - server->device = device; -} - static void /* will be called by ISO server stack */ isoConnectionIndicationHandler(IsoConnectionIndication indication, void* parameter, IsoConnection connection) diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 87249e72..494a6069 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -634,3 +634,20 @@ MmsServerConnection_getNextRequestInvokeId(MmsServerConnection self) return self->lastRequestInvokeId; } #endif /* (MMS_OBTAIN_FILE_SERVICE == 1) */ + + +const char* +MmsServerConnection_getFilesystemBasepath(MmsServerConnection self) +{ +#if (CONFIG_SET_FILESTORE_BASEPATH_AT_RUNTIME == 1) + if (self->server->filestoreBasepath != NULL) + return self->server->filestoreBasepath; + else + return CONFIG_VIRTUAL_FILESTORE_BASEPATH; +#else + return CONFIG_VIRTUAL_FILESTORE_BASEPATH; +#endif +} + + + diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 4a8cfc14..0efd5834 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -563,3 +563,9 @@ EXPORTS Timestamp_setByMmsUtcTime IedServer_setLocalIpAddress Timestamp_toMmsValue + MmsServer_installFileAccessHandler + MmsServer_setFilestoreBasepath + MmsConnection_setFilestoreBasepath + IedConnection_setFilestoreBasepath + IedServer_setFilestoreBasepath + \ No newline at end of file diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 1769ee94..48534664 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -641,3 +641,8 @@ EXPORTS Timestamp_setByMmsUtcTime IedServer_setLocalIpAddress Timestamp_toMmsValue + MmsServer_installFileAccessHandler + MmsServer_setFilestoreBasepath + MmsConnection_setFilestoreBasepath + IedConnection_setFilestoreBasepath + IedServer_setFilestoreBasepath From 6badf692fed506323cf6dabe0ddc4bda3c1fa16e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 30 May 2017 11:50:30 +0200 Subject: [PATCH 07/64] - updated client example for IEC 61850 file services --- .../CMakeLists.txt | 6 +- .../iec61850_client_example_files/Makefile | 4 +- .../client_example_files.c | 107 ------- .../iec61850_client_example_files/file-tool.c | 261 ++++++++++++++++++ .../server_example_files.c | 2 +- 5 files changed, 267 insertions(+), 113 deletions(-) delete mode 100644 examples/iec61850_client_example_files/client_example_files.c create mode 100644 examples/iec61850_client_example_files/file-tool.c diff --git a/examples/iec61850_client_example_files/CMakeLists.txt b/examples/iec61850_client_example_files/CMakeLists.txt index 36cba273..9178d240 100644 --- a/examples/iec61850_client_example_files/CMakeLists.txt +++ b/examples/iec61850_client_example_files/CMakeLists.txt @@ -1,6 +1,6 @@ set(iec61850_client_example_files_SRCS - client_example_files.c + file-tool.c ) IF(MSVC) @@ -8,10 +8,10 @@ set_source_files_properties(${iec61850_client_example_files_SRCS} PROPERTIES LANGUAGE CXX) ENDIF(MSVC) -add_executable(iec61850_client_example_files +add_executable(file-tool ${iec61850_client_example_files_SRCS} ) -target_link_libraries(iec61850_client_example_files +target_link_libraries(file-tool iec61850 ) diff --git a/examples/iec61850_client_example_files/Makefile b/examples/iec61850_client_example_files/Makefile index eea5d9f8..c4d0ecbc 100644 --- a/examples/iec61850_client_example_files/Makefile +++ b/examples/iec61850_client_example_files/Makefile @@ -1,7 +1,7 @@ LIBIEC_HOME=../.. -PROJECT_BINARY_NAME = client_example_files -PROJECT_SOURCES = client_example_files.c +PROJECT_BINARY_NAME = file-tool +PROJECT_SOURCES = file-tool.c include $(LIBIEC_HOME)/make/target_system.mk include $(LIBIEC_HOME)/make/stack_includes.mk diff --git a/examples/iec61850_client_example_files/client_example_files.c b/examples/iec61850_client_example_files/client_example_files.c deleted file mode 100644 index f321f832..00000000 --- a/examples/iec61850_client_example_files/client_example_files.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * client_example_files.c - * - * This example demonstrates the usage of the file services - * - * - How to browse the file system of the server - * - How to download a file from the server - * - * Note: intended to be used with server_example3 - * - */ - -#include "iec61850_client.h" - -#include -#include - -#include "hal_thread.h" - -#define MAX_BUFFER_SIZE 2000000 - -static uint8_t downloadBuffer[MAX_BUFFER_SIZE]; -static int bufferPosition = 0; - -static bool -downloadHandler(void* parameter, uint8_t* buffer, uint32_t bytesRead) -{ - printf("received %i bytes\n", bytesRead); - - if (bufferPosition + bytesRead < MAX_BUFFER_SIZE) { - memcpy(downloadBuffer + bufferPosition, buffer, bytesRead); - - bufferPosition += bytesRead; - - return true; - } - else - return false; -} - -int main(int argc, char** argv) { - - char* hostname; - int tcpPort = 102; - - if (argc > 1) - hostname = argv[1]; - else - hostname = "localhost"; - - if (argc > 2) - tcpPort = atoi(argv[2]); - - IedClientError error; - - IedConnection con = IedConnection_create(); - - IedConnection_connect(con, &error, hostname, tcpPort); - - if (error == IED_ERROR_OK) { - - /* Get the root directory */ - LinkedList rootDirectory = - IedConnection_getFileDirectory(con, &error, NULL); - - if (error != IED_ERROR_OK) { - printf("Error retrieving file directory\n"); - goto abort_connection; - } - - - LinkedList directoryEntry = LinkedList_getNext(rootDirectory); - - while (directoryEntry != NULL) { - - FileDirectoryEntry entry = (FileDirectoryEntry) directoryEntry->data; - - printf("%s %i\n", FileDirectoryEntry_getFileName(entry), FileDirectoryEntry_getFileSize(entry)); - - directoryEntry = LinkedList_getNext(directoryEntry); - } - - - /* Download a file from the server */ - IedConnection_getFile(con, &error, "IEDSERVER.BIN", downloadHandler, NULL); - - if (error != IED_ERROR_OK) - printf("Failed to get file!\n"); - - /* Delete file at server */ - IedConnection_deleteFile(con, &error, "IEDSERVER.BIN"); - - if (error != IED_ERROR_OK) - printf("Failed to delete file! (code=%i)\n", error); - - abort_connection: - - IedConnection_abort(con, &error); - } - else { - printf("Failed to connect to %s:%i\n", hostname, tcpPort); - } - - IedConnection_destroy(con); -} - - diff --git a/examples/iec61850_client_example_files/file-tool.c b/examples/iec61850_client_example_files/file-tool.c new file mode 100644 index 00000000..492dd0c1 --- /dev/null +++ b/examples/iec61850_client_example_files/file-tool.c @@ -0,0 +1,261 @@ +/* + * file-tool.c + * + * This example demonstrates the usage of the file services + * + * - How to browse the file system of the server + * - How to download a file from the server + * + * Note: intended to be used with server_example3 or server_example_files + * + */ + +#include "iec61850_client.h" + +#include +#include +#include + +static char* hostname = "localhost"; +static int tcpPort = 102; +static char* filename = NULL; + +typedef enum { + FileOperationType_None = 0, + FileOperationType_Dir, + FileOperationType_Info, + FileOperationType_Del, + FileOperationType_Get, + FileOperationType_Set +} FileOperationType; + +static FileOperationType operation = FileOperationType_None; + + + +static bool +downloadHandler(void* parameter, uint8_t* buffer, uint32_t bytesRead) +{ + FILE* fp = (FILE*) parameter; + + printf("received %i bytes\n", bytesRead); + + if (fwrite(buffer, bytesRead, 1, fp) == 1) + return true; + else { + printf("Failed to write local file!\n"); + return false; + } + +} + +static void +printHelp() +{ + printf("file-tool [options] []\n"); + printf(" Options:\n"); + printf(" -h \n"); + printf(" -p portnumber\n"); + printf(" Operations\n"); + printf(" dir - show directory\n"); + printf(" info - show file info\n"); + printf(" del - delete file\n"); + printf(" get - get file\n"); + printf(" set - set file\n"); +} + + +static int +parseOptions(int argc, char** argv) +{ + int currentArgc = 1; + + int retVal = 0; + + while (currentArgc < argc) { + if (strcmp(argv[currentArgc], "-h") == 0) { + hostname = argv[++currentArgc]; + } + else if (strcmp(argv[currentArgc], "-p") == 0) { + tcpPort = atoi(argv[++currentArgc]); + } + else if (strcmp(argv[currentArgc], "del") == 0) { + operation = FileOperationType_Del; + filename = argv[++currentArgc]; + } + else if (strcmp(argv[currentArgc], "dir") == 0) { + operation = FileOperationType_Dir; + } + else if (strcmp(argv[currentArgc], "info") == 0) { + operation = FileOperationType_Info; + filename = argv[++currentArgc]; + } + else if (strcmp(argv[currentArgc], "get") == 0) { + operation = FileOperationType_Get; + filename = argv[++currentArgc]; + } + else if (strcmp(argv[currentArgc], "set") == 0) { + operation = FileOperationType_Set; + filename = argv[++currentArgc]; + } + else { + printf("Unknown operation!\n"); + return 1; + } + + currentArgc++; + } + + return retVal; +} + +void +showDirectory(IedConnection con) +{ + IedClientError error; + + /* Get the root directory */ + LinkedList rootDirectory = + IedConnection_getFileDirectory(con, &error, NULL); + + if (error != IED_ERROR_OK) { + printf("Error retrieving file directory\n"); + } + else { + LinkedList directoryEntry = LinkedList_getNext(rootDirectory); + + while (directoryEntry != NULL) { + + FileDirectoryEntry entry = (FileDirectoryEntry) directoryEntry->data; + + printf("%s %i\n", FileDirectoryEntry_getFileName(entry), FileDirectoryEntry_getFileSize(entry)); + + directoryEntry = LinkedList_getNext(directoryEntry); + } + + LinkedList_destroyDeep(rootDirectory, (LinkedListValueDeleteFunction) FileDirectoryEntry_destroy); + } +} + +void +getFile(IedConnection con) +{ + IedClientError error; + + char* bname = strdup(filename); + + char* localFilename = basename(bname); + + FILE* fp = fopen(localFilename, "w"); + + if (fp != NULL) { + + /* Download a file from the server */ + IedConnection_getFile(con, &error, filename, downloadHandler, (void*) fp); + + if (error != IED_ERROR_OK) + printf("Failed to get file!\n"); + + fclose(fp); + } + else + printf("Failed to open file %s\n", localFilename); + + free(bname); +} + +void +setFile(IedConnection con) +{ + IedClientError error; + + char* dirc = strdup(filename); + char* basec = strdup(filename); + + char* localDirName = dirname(dirc); + char* localFileName = basename(basec); + + printf("local dir: %s\n", localDirName); + printf("local file: %s\n", localFileName); + + /* IedConnection_setFilestoreBasepath requires the file separator at the end! */ + strcpy(dirc, localDirName); + strcat(dirc, "/"); + + printf("filestore basepath: %s\n", dirc); + + IedConnection_setFilestoreBasepath(con, dirc); + + IedConnection_setFile(con, &error, localFileName, localFileName); + + if (error != IED_ERROR_OK) + printf("Failed to set file! (code=%i)\n", error); + + free(dirc); + free(basec); +} + +void +deleteFile(IedConnection con) +{ + IedClientError error; + + /* Delete file at server */ + IedConnection_deleteFile(con, &error, filename); + + if (error != IED_ERROR_OK) + printf("Failed to delete file! (code=%i)\n", error); +} + +int +main(int argc, char** argv) +{ + if (argc < 2) { + printHelp(); + return 0; + } + + parseOptions(argc, argv); + + if (operation == FileOperationType_None) { + printHelp(); + return 0; + } + + IedClientError error; + + IedConnection con = IedConnection_create(); + + IedConnection_connect(con, &error, hostname, tcpPort); + + if (error == IED_ERROR_OK) { + + + switch (operation) { + case FileOperationType_Dir: + showDirectory(con); + break; + case FileOperationType_Get: + getFile(con); + break; + case FileOperationType_Del: + deleteFile(con); + break; + case FileOperationType_Info: + break; + case FileOperationType_Set: + setFile(con); + break; + } + + + IedConnection_abort(con, &error); + } + else { + printf("Failed to connect to %s:%i\n", hostname, tcpPort); + } + + IedConnection_destroy(con); +} + + diff --git a/examples/server_example_files/server_example_files.c b/examples/server_example_files/server_example_files.c index 9b263bb3..b2a1b07c 100644 --- a/examples/server_example_files/server_example_files.c +++ b/examples/server_example_files/server_example_files.c @@ -39,7 +39,7 @@ static MmsError fileAccessHandler (void* parameter, MmsServerConnection connection, MmsFileServiceType service, const char* localFilename, const char* otherFilename) { - printf("fileAccessHanlder: service = %i, local-file: %s other-file: %s\n", service, localFilename, otherFilename); + printf("fileAccessHandler: service = %i, local-file: %s other-file: %s\n", service, localFilename, otherFilename); /* Don't allow client to rename files */ if (service == MMS_FILE_ACCESS_TYPE_RENAME) From 3ac4cd88dfe670ead6a0faf9a1163b1e58fdcba8 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 12 Jun 2017 22:22:45 +0200 Subject: [PATCH 08/64] - fixed memory cleanup in GOOSE subscriber - added GooseReceiver_isRunning function - updated goose_subscriber example --- examples/CMakeLists.txt | 3 ++ .../goose_subscriber_example.c | 21 +++------ .../iec61850_client_example_files/file-tool.c | 2 + src/goose/goose_receiver.c | 44 +++++++++++++++---- src/goose/goose_receiver.h | 10 ++++- src/iec61850/inc/iec61850_client.h | 5 ++- src/iec61850/inc/iec61850_model.h | 3 +- src/iec61850/server/mms_mapping/mms_mapping.c | 2 +- src/vs/libiec61850-wo-goose.def | 2 +- src/vs/libiec61850.def | 1 + 10 files changed, 65 insertions(+), 28 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a09192d7..cfb8f63e 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -17,7 +17,10 @@ add_subdirectory(iec61850_client_example2) add_subdirectory(iec61850_client_example3) add_subdirectory(iec61850_client_example4) add_subdirectory(iec61850_client_example5) +IF(WIN32) +else() add_subdirectory(iec61850_client_example_files) +endif() add_subdirectory(iec61850_client_example_reporting) add_subdirectory(iec61850_client_example_log) add_subdirectory(mms_client_example1) diff --git a/examples/goose_subscriber/goose_subscriber_example.c b/examples/goose_subscriber/goose_subscriber_example.c index c9a7e103..5d28534b 100644 --- a/examples/goose_subscriber/goose_subscriber_example.c +++ b/examples/goose_subscriber/goose_subscriber_example.c @@ -12,8 +12,6 @@ #include #include #include -#define __STDC_FORMAT_MACROS /* otherwise PRIu64 is not defined for MinGW */ -#include static int running = 1; @@ -29,9 +27,10 @@ gooseListener(GooseSubscriber subscriber, void* parameter) printf(" stNum: %u sqNum: %u\n", GooseSubscriber_getStNum(subscriber), GooseSubscriber_getSqNum(subscriber)); printf(" timeToLive: %u\n", GooseSubscriber_getTimeAllowedToLive(subscriber)); -#ifndef _WIN32 - printf(" timestamp: %"PRIu64"\n", GooseSubscriber_getTimestamp(subscriber)); -#endif + + uint64_t timestamp = GooseSubscriber_getTimestamp(subscriber); + + printf(" timestamp: %u.%u\n", (uint32_t) (timestamp / 1000), (uint32_t) (timestamp % 1000)); MmsValue* values = GooseSubscriber_getDataSetValues(subscriber); @@ -45,14 +44,6 @@ gooseListener(GooseSubscriber subscriber, void* parameter) int main(int argc, char** argv) { - MmsValue* dataSetValues = MmsValue_createEmptyArray(4); - - int i; - for (i = 0; i < 4; i++) { - MmsValue* dataSetEntry = MmsValue_newBoolean(false); - MmsValue_setElement(dataSetValues, i, dataSetEntry); - } - GooseReceiver receiver = GooseReceiver_create(); if (argc > 1) { @@ -80,5 +71,7 @@ main(int argc, char** argv) Thread_sleep(100); } - GooseSubscriber_destroy(subscriber); + GooseReceiver_stop(receiver); + + GooseReceiver_destroy(receiver); } diff --git a/examples/iec61850_client_example_files/file-tool.c b/examples/iec61850_client_example_files/file-tool.c index 492dd0c1..4610c7bd 100644 --- a/examples/iec61850_client_example_files/file-tool.c +++ b/examples/iec61850_client_example_files/file-tool.c @@ -8,6 +8,8 @@ * * Note: intended to be used with server_example3 or server_example_files * + * Note: DOES NOT WORK WITH VISUAL STUDIO because of libgen.h + * */ #include "iec61850_client.h" diff --git a/src/goose/goose_receiver.c b/src/goose/goose_receiver.c index 26618ee8..0f1b5355 100644 --- a/src/goose/goose_receiver.c +++ b/src/goose/goose_receiver.c @@ -1,7 +1,7 @@ /* * goose_receiver.c * - * Copyright 2014, 2015 Michael Zillgith + * Copyright 2014-2017 Michael Zillgith * * This file is part of libIEC61850. * @@ -52,6 +52,9 @@ struct sGooseReceiver { uint8_t* buffer; EthernetSocket ethSocket; LinkedList subscriberList; +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Thread thread; +#endif }; @@ -66,6 +69,9 @@ GooseReceiver_create() self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH); self->ethSocket = NULL; self->subscriberList = LinkedList_create(); +#if (CONFIG_MMS_THREADLESS_STACK == 0) + self->thread = NULL; +#endif } return self; @@ -712,33 +718,52 @@ gooseReceiverLoop(void* threadParameter) void GooseReceiver_start(GooseReceiver self) { - Thread thread = Thread_create((ThreadExecutionFunction) gooseReceiverLoop, (void*) self, true); +#if (CONFIG_MMS_THREADLESS_STACK == 0) + self->thread = Thread_create((ThreadExecutionFunction) gooseReceiverLoop, (void*) self, false); - if (thread != NULL) { + if (self->thread != NULL) { if (DEBUG_GOOSE_SUBSCRIBER) printf("GOOSE_SUBSCRIBER: GOOSE receiver started for interface %s\n", self->interfaceId); - Thread_start(thread); + Thread_start(self->thread); } else { if (DEBUG_GOOSE_SUBSCRIBER) printf("GOOSE_SUBSCRIBER: Starting GOOSE receiver failed for interface %s\n", self->interfaceId); } +#endif +} +bool +GooseReceiver_isRunning(GooseReceiver self) +{ + return self->running; } void GooseReceiver_stop(GooseReceiver self) { +#if (CONFIG_MMS_THREADLESS_STACK == 0) self->running = false; + Thread_destroy(self->thread); + while (self->stopped == false) Thread_sleep(1); +#endif } void GooseReceiver_destroy(GooseReceiver self) { +#if (CONFIG_MMS_THREADLESS_STACK == 0) + if ((self->thread != NULL) && (GooseReceiver_isRunning(self))) + GooseReceiver_stop(self); +#endif + + if (self->interfaceId != NULL) + GLOBAL_FREEMEM(self->interfaceId); + LinkedList_destroyDeep(self->subscriberList, (LinkedListValueDeleteFunction) GooseSubscriber_destroy); @@ -757,9 +782,12 @@ GooseReceiver_startThreadless(GooseReceiver self) else self->ethSocket = Ethernet_createSocket(self->interfaceId, NULL); - Ethernet_setProtocolFilter(self->ethSocket, ETH_P_GOOSE); - - self->running = true; + if (self->ethSocket != NULL) { + Ethernet_setProtocolFilter(self->ethSocket, ETH_P_GOOSE); + self->running = true; + } + else + self->running = false; } void @@ -770,7 +798,7 @@ GooseReceiver_stopThreadless(GooseReceiver self) self->running = false; } -// call after reception of ethernet frame and periodically to to house keeping tasks +// call after reception of ethernet frame bool GooseReceiver_tick(GooseReceiver self) { diff --git a/src/goose/goose_receiver.h b/src/goose/goose_receiver.h index 51bdebc3..8ba5648c 100644 --- a/src/goose/goose_receiver.h +++ b/src/goose/goose_receiver.h @@ -92,7 +92,7 @@ void GooseReceiver_start(GooseReceiver self); /** - * \brief stop the GOOSE receiver running in a speparate thread + * \brief stop the GOOSE receiver running in a separate thread * * This function is used to stop the receiver thread started with GooseReceiver_start * @@ -101,6 +101,14 @@ GooseReceiver_start(GooseReceiver self); void GooseReceiver_stop(GooseReceiver self); +bool +GooseReceiver_isRunning(GooseReceiver self); + +/** + * \brief Free all resource of the GooseReceiver and all installed GooseSubscribers + * + * \param self the GooseReceiver instance + */ void GooseReceiver_destroy(GooseReceiver self); diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 3319eba1..deec194c 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -625,7 +625,7 @@ IedConnection_setGoCBValues(IedConnection self, IedClientError* error, ClientGoo * * The requested RCB has to be specified by its object reference. E.g. * - * "simpleIOGernericIO/LLN0.RP.EventsRCB01" + * "simpleIOGenericIO/LLN0.RP.EventsRCB01" * * or * @@ -1218,7 +1218,8 @@ IedConnection_readUnsigned32Value(IedConnection self, IedClientError* error, con * \brief read a functional constrained data attribute (FCDA) of type Timestamp (UTC Time) * * NOTE: If the timestamp parameter is set to NULL the function allocates a new timestamp instance. Otherwise the - * return value is a pointer to the user provided timestamp instance. + * return value is a pointer to the user provided timestamp instance. The new timestamp instance has to be freed by + * the caller of the function. * * \param self the connection object to operate on * \param error the error code if an error occurs diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index 9dad53c2..0b370074 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -151,7 +151,8 @@ typedef enum { GENERIC_BITSTRING = 26, CONSTRUCTED = 27, ENTRY_TIME = 28, - PHYCOMADDR = 29 + PHYCOMADDR = 29, + CURRENCY = 30 #endif } DataAttributeType; diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index 7e9e5d9c..cdd0be68 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -2032,7 +2032,7 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, } #endif - /* Call writer access handlers */ + /* Call write access handlers */ LinkedList writeHandlerListElement = LinkedList_getNext(self->attributeAccessHandlers); while (writeHandlerListElement != NULL) { diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 0efd5834..757cbcc3 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -568,4 +568,4 @@ EXPORTS MmsConnection_setFilestoreBasepath IedConnection_setFilestoreBasepath IedServer_setFilestoreBasepath - \ No newline at end of file + GooseReceiver_isRunning diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 48534664..ef9e200a 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -646,3 +646,4 @@ EXPORTS MmsConnection_setFilestoreBasepath IedConnection_setFilestoreBasepath IedServer_setFilestoreBasepath + GooseReceiver_isRunning From c08fe41cbb77bb4190720cec2155a817d4fe67ba Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 13 Jun 2017 17:35:15 +0200 Subject: [PATCH 09/64] - SV publisher: Changed SampledValuesPublisher_create to support setting of Communication parameters at runtime --- .../iec61850_9_2_LE_example.c | 2 +- examples/sv_publisher/sv_publisher_example.c | 4 ++-- src/goose/goose_publisher.h | 5 +++++ src/iec61850/server/impl/ied_server.c | 9 +++++++-- src/mms/iso_mms/server/mms_access_result.c | 4 ++-- src/sampled_values/sv_publisher.c | 13 ++----------- src/sampled_values/sv_publisher.h | 13 ++++++++++++- 7 files changed, 31 insertions(+), 19 deletions(-) diff --git a/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c b/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c index b2c3ed08..e4c9407d 100644 --- a/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c +++ b/examples/iec61850_9_2_LE_example/iec61850_9_2_LE_example.c @@ -59,7 +59,7 @@ static SV_ASDU asdu; static void setupSVPublisher(const char* svInterface) { - svPublisher = SampledValuesPublisher_create(svInterface); + svPublisher = SampledValuesPublisher_create(NULL, svInterface); asdu = SampledValuesPublisher_addASDU(svPublisher, "xxxxMUnn01", NULL, 1); diff --git a/examples/sv_publisher/sv_publisher_example.c b/examples/sv_publisher/sv_publisher_example.c index 133f453a..e1128602 100644 --- a/examples/sv_publisher/sv_publisher_example.c +++ b/examples/sv_publisher/sv_publisher_example.c @@ -29,7 +29,7 @@ main(int argc, char** argv) printf("Using interface %s\n", interface); - SampledValuesPublisher svPublisher = SampledValuesPublisher_create(interface); + SampledValuesPublisher svPublisher = SampledValuesPublisher_create(NULL, interface); SV_ASDU asdu1 = SampledValuesPublisher_addASDU(svPublisher, "svpub1", NULL, 1); @@ -60,7 +60,7 @@ main(int argc, char** argv) SampledValuesPublisher_publish(svPublisher); - //Thread_sleep(50); + Thread_sleep(50); } SampledValuesPublisher_destroy(svPublisher); diff --git a/src/goose/goose_publisher.h b/src/goose/goose_publisher.h index 29ed6c68..a206e69e 100644 --- a/src/goose/goose_publisher.h +++ b/src/goose/goose_publisher.h @@ -31,6 +31,9 @@ extern "C" { #endif +#ifndef GOOSE_SV_COMM_PARAMETERS +#define GOOSE_SV_COMM_PARAMETERS + typedef struct sCommParameters { uint8_t vlanPriority; uint16_t vlanId; @@ -38,6 +41,8 @@ typedef struct sCommParameters { uint8_t dstAddress[6]; } CommParameters; +#endif + typedef struct sGoosePublisher* GoosePublisher; GoosePublisher diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index e82af82e..8dfa507f 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -1274,8 +1274,13 @@ IedServer_setWriteAccessPolicy(IedServer self, FunctionalConstraint fc, AccessPo void IedServer_handleWriteAccess(IedServer self, DataAttribute* dataAttribute, WriteAccessHandler handler, void* parameter) { - if (dataAttribute == NULL) - *((int*) NULL) = 1; + if (dataAttribute == NULL) { + if (DEBUG_IED_SERVER) + printf("IED_SERVER: IedServer_handleWriteAccess - dataAttribute == NULL!\n"); + + /* Cause a trap */ + *((volatile int*) NULL) = 1; + } MmsMapping_installWriteAccessHandler(self->mmsMapping, dataAttribute, handler, parameter); } diff --git a/src/mms/iso_mms/server/mms_access_result.c b/src/mms/iso_mms/server/mms_access_result.c index 03485f90..0e093955 100644 --- a/src/mms/iso_mms/server/mms_access_result.c +++ b/src/mms/iso_mms/server/mms_access_result.c @@ -154,6 +154,8 @@ exit_with_error: MmsValue* MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) { + MmsValue* value = NULL; + int dataEndBufPos = bufPos + bufferLength; uint8_t tag = buffer[bufPos++]; @@ -165,8 +167,6 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) if (bufPos + dataLength > dataEndBufPos) goto exit_with_error; - MmsValue* value = NULL; - switch (tag) { case 0xa1: /* MMS_ARRAY */ diff --git a/src/sampled_values/sv_publisher.c b/src/sampled_values/sv_publisher.c index d550b57e..bc777fe8 100644 --- a/src/sampled_values/sv_publisher.c +++ b/src/sampled_values/sv_publisher.c @@ -42,15 +42,6 @@ #define SV_MAX_MESSAGE_SIZE 1518 -typedef struct sCommParameters { - uint8_t vlanPriority; - uint16_t vlanId; - uint16_t appId; - uint8_t dstAddress[6]; -} CommParameters; - - - struct sSV_ASDU { char* svID; char* datset; @@ -264,13 +255,13 @@ encodeUtcTime(uint64_t timeval, uint8_t* buffer, int bufPos) } SampledValuesPublisher -SampledValuesPublisher_create(const char* interfaceId) +SampledValuesPublisher_create(CommParameters* parameters, const char* interfaceId) { SampledValuesPublisher self = (SampledValuesPublisher) GLOBAL_CALLOC(1, sizeof(struct sSampledValuesPublisher)); self->asduLIst = NULL; - preparePacketBuffer(self, NULL, interfaceId); + preparePacketBuffer(self, parameters, interfaceId); return self; } diff --git a/src/sampled_values/sv_publisher.h b/src/sampled_values/sv_publisher.h index eeaf70e3..458b00b2 100644 --- a/src/sampled_values/sv_publisher.h +++ b/src/sampled_values/sv_publisher.h @@ -31,6 +31,17 @@ extern "C" { #endif +#ifndef GOOSE_SV_COMM_PARAMETERS +#define GOOSE_SV_COMM_PARAMETERS + +typedef struct sCommParameters { + uint8_t vlanPriority; + uint16_t vlanId; + uint16_t appId; + uint8_t dstAddress[6]; +} CommParameters; + +#endif #define IEC61850_SV_SMPSYNC_NOT_SYNCHRONIZED 0 #define IEC61850_SV_SMPSYNC_SYNCED_UNSPEC_LOCAL_CLOCK 1 @@ -45,7 +56,7 @@ typedef struct sSampledValuesPublisher* SampledValuesPublisher; typedef struct sSV_ASDU* SV_ASDU; SampledValuesPublisher -SampledValuesPublisher_create(const char* interfaceId); +SampledValuesPublisher_create(CommParameters* parameters, const char* interfaceId); SV_ASDU SampledValuesPublisher_addASDU(SampledValuesPublisher self, char* svID, char* datset, uint32_t confRev); From 15ec6c7a7c56b13c6f7587312231e44774204e36 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 21 Jun 2017 23:49:24 +0200 Subject: [PATCH 10/64] - added additional check to MmsValue_update for structure size mismatch --- src/mms/iso_mms/common/mms_value.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/mms/iso_mms/common/mms_value.c b/src/mms/iso_mms/common/mms_value.c index 199e3ec4..f95d159e 100644 --- a/src/mms/iso_mms/common/mms_value.c +++ b/src/mms/iso_mms/common/mms_value.c @@ -47,21 +47,25 @@ MmsValue_getBitStringByteSize(const MmsValue* self) return bitStringByteSize(self); } -static void +static bool updateStructuredComponent(MmsValue* self, const MmsValue* update) { - int componentCount; MmsValue** selfValues; MmsValue** updateValues; - componentCount = self->value.structure.size; + if (self->value.structure.size != update->value.structure.size) + return false; + selfValues = self->value.structure.components; updateValues = update->value.structure.components; int i; - for (i = 0; i < componentCount; i++) { - MmsValue_update(selfValues[i], updateValues[i]); + for (i = 0; i < self->value.structure.size; i++) { + if (MmsValue_update(selfValues[i], updateValues[i]) == false) + return false; } + + return true; } MmsValue* @@ -223,7 +227,8 @@ MmsValue_update(MmsValue* self, const MmsValue* update) switch (self->type) { case MMS_STRUCTURE: case MMS_ARRAY: - updateStructuredComponent(self, update); + if (updateStructuredComponent(self, update) == false) + return false; break; case MMS_BOOLEAN: self->value.boolean = update->value.boolean; From 99c0c8bc75a3189ca11bfa9c5a487c0273541e53 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 23 Jun 2017 23:41:07 +0200 Subject: [PATCH 11/64] - added IedModel_getDeviceByInst function --- src/iec61850/inc/iec61850_model.h | 92 +++++++++++++++++++++++-------- src/iec61850/server/model/model.c | 30 +++++++--- src/vs/libiec61850-wo-goose.def | 2 + src/vs/libiec61850.def | 2 + 4 files changed, 96 insertions(+), 30 deletions(-) diff --git a/src/iec61850/inc/iec61850_model.h b/src/iec61850/inc/iec61850_model.h index 0b370074..d4fbcb76 100644 --- a/src/iec61850/inc/iec61850_model.h +++ b/src/iec61850/inc/iec61850_model.h @@ -389,7 +389,11 @@ char* ModelNode_getObjectReference(ModelNode* self, char* objectReference); /** + * \brief Get the type of the ModelNode * + * \param self the ModelNode instance + * + * \return the type of the ModelNode (one of LD, LN, DO, DA) */ ModelNodeType ModelNode_getType(ModelNode* self); @@ -413,13 +417,13 @@ IedModel_setIedName(IedModel* self, const char* iedName); * as it happens to appear on the wire. E.g. if IED name in SCL file would be "IED1" * and the logical device "WD1" the resulting LD name would be "IED1WD". * - * \param model the IedModel instance that holds the model node + * \param self the IedModel instance that holds the model node * \param objectReference the IEC 61850 object reference * * \return the model node instance or NULL if model node does not exist. */ ModelNode* -IedModel_getModelNodeByObjectReference(IedModel* model, const char* objectReference); +IedModel_getModelNodeByObjectReference(IedModel* self, const char* objectReference); SVControlBlock* IedModel_getSVControlBlock(IedModel* self, LogicalNode* parentLN, const char* svcbName); @@ -431,13 +435,13 @@ IedModel_getSVControlBlock(IedModel* self, LogicalNode* parentLN, const char* sv * IED name as part of the logical device name. This function is useful for * devices where the IED name can be configured. * - * \param model the IedModel instance that holds the model node + * \param self the IedModel instance that holds the model node * \param objectReference the IEC 61850 object reference * * \return the model node instance or NULL if model node does not exist. */ ModelNode* -IedModel_getModelNodeByShortObjectReference(IedModel* model, const char* objectReference); +IedModel_getModelNodeByShortObjectReference(IedModel* self, const char* objectReference); /** * \brief Lookup a model node by its short address @@ -445,13 +449,25 @@ IedModel_getModelNodeByShortObjectReference(IedModel* model, const char* objectR * Short address is a 32 bit unsigned integer as specified in the "sAddr" attribute of * the ICD file or in the configuration file. * - * \param model the IedModel instance that holds the model node + * \param self the IedModel instance that holds the model node * \param shortAddress * * \return the model node instance or NULL if model node does not exist. */ ModelNode* -IedModel_getModelNodeByShortAddress(IedModel* model, uint32_t shortAddress); +IedModel_getModelNodeByShortAddress(IedModel* self, uint32_t shortAddress); + +/** + * \brief Lookup logical device (LD) by device instance name (SCL attribute "inst") + * + * \param self IedModel instance + * \param ldInst the logical device instance name (SCL attribute "inst") + * + * \return The matching LogicalDevice instance + */ +LogicalDevice* +IedModel_getDeviceByInst(IedModel* self, const char* ldInst); + /** * \brief Lookup a logical node by name that is part of the given logical device @@ -462,7 +478,7 @@ IedModel_getModelNodeByShortAddress(IedModel* model, uint32_t shortAddress); * \return the logical device instance or NULL if it does not exist */ LogicalNode* -LogicalDevice_getLogicalNode(LogicalDevice* device, const char* lnName); +LogicalDevice_getLogicalNode(LogicalDevice* self, const char* lnName); /** * \brief Get the setting group control block (SGCB) of the logical device @@ -472,7 +488,7 @@ LogicalDevice_getLogicalNode(LogicalDevice* device, const char* lnName); * \return the SGCB instance or NULL if no SGCB is available */ SettingGroupControlBlock* -LogicalDevice_getSettingGroupControlBlock(LogicalDevice* device); +LogicalDevice_getSettingGroupControlBlock(LogicalDevice* self); /**@}*/ @@ -482,37 +498,69 @@ LogicalDevice_getSettingGroupControlBlock(LogicalDevice* device); /** * \brief unset all MmsValue references in the data model * - * \param model the IedModel instance that holds the model node + * \param self the IedModel instance that holds the model node */ void -IedModel_setAttributeValuesToNull(IedModel* iedModel); +IedModel_setAttributeValuesToNull(IedModel* self); +/** + * \brief Lookup logical device (LD) by device name + * + * \param self IedModel instance + * \param ldInst the logical device name (as it is seen from the protocol side - MMS domain name) + * + * \return The matching LogicalDevice instance + */ LogicalDevice* -IedModel_getDevice(IedModel* model, const char* deviceName); +IedModel_getDevice(IedModel* self, const char* ldName); -/* - * \param dataSetReference MMS mapping object reference! e.g. ied1Inverter/LLN0$dataset1 +/** + * \brief Lookup a data set in the IED model + * + * \param self IedModel instance + * \param dataSetReference MMS mapping object reference! e.g. ied1Inverter/LLN0$dataset1 + * + * \return The matching DataSet instance */ DataSet* -IedModel_lookupDataSet(IedModel* model, const char* dataSetReference); +IedModel_lookupDataSet(IedModel* self, const char* dataSetReference); + +/** + * \brief Lookup a DataAttribute instance with the corresponding MmsValue instance + * + * \param self IedModel instance + * \param value the MmsValue instance (from the MMS value cache) + * + * \return the matching DataAttribute instance + */ +DataAttribute* +IedModel_lookupDataAttributeByMmsValue(IedModel* self, MmsValue* value); + +/** + * \brief Get the number of logical devices + * + * \param self IedModel instance + * + * \return the number of logical devices + */ int -IedModel_getLogicalDeviceCount(IedModel* iedModel); +IedModel_getLogicalDeviceCount(IedModel* self); int -LogicalDevice_getLogicalNodeCount(LogicalDevice* logicalDevice); +LogicalDevice_getLogicalNodeCount(LogicalDevice* self); ModelNode* -LogicalDevice_getChildByMmsVariableName(LogicalDevice* logicalDevice, const char* mmsVariableName); +LogicalDevice_getChildByMmsVariableName(LogicalDevice* self, const char* mmsVariableName); bool -LogicalNode_hasFCData(LogicalNode* node, FunctionalConstraint fc); +LogicalNode_hasFCData(LogicalNode* self, FunctionalConstraint fc); bool -LogicalNode_hasBufferedReports(LogicalNode* node); +LogicalNode_hasBufferedReports(LogicalNode* self); bool -LogicalNode_hasUnbufferedReports(LogicalNode* node); +LogicalNode_hasUnbufferedReports(LogicalNode* self); /** * \brief get a data set instance @@ -526,10 +574,8 @@ DataSet* LogicalNode_getDataSet(LogicalNode* self, const char* dataSetName); bool -DataObject_hasFCData(DataObject* dataObject, FunctionalConstraint fc); +DataObject_hasFCData(DataObject* self, FunctionalConstraint fc); -DataAttribute* -IedModel_lookupDataAttributeByMmsValue(IedModel* model, MmsValue* value); #ifdef __cplusplus } diff --git a/src/iec61850/server/model/model.c b/src/iec61850/server/model/model.c index 03a00928..6c709b95 100644 --- a/src/iec61850/server/model/model.c +++ b/src/iec61850/server/model/model.c @@ -93,9 +93,9 @@ IedModel_getLogicalDeviceCount(IedModel* iedModel) } DataSet* -IedModel_lookupDataSet(IedModel* model, const char* dataSetReference /* e.g. ied1Inverter/LLN0$dataset1 */) +IedModel_lookupDataSet(IedModel* self, const char* dataSetReference /* e.g. ied1Inverter/LLN0$dataset1 */) { - DataSet* dataSet = model->dataSets; + DataSet* dataSet = self->dataSets; const char* separator = strchr(dataSetReference, '/'); @@ -106,9 +106,9 @@ IedModel_lookupDataSet(IedModel* model, const char* dataSetReference /* e.g. ie char domainName[65]; - int modelNameLen = strlen(model->name); + int modelNameLen = strlen(self->name); - memcpy(domainName, model->name, modelNameLen); + memcpy(domainName, self->name, modelNameLen); while (dataSet != NULL) { @@ -129,15 +129,15 @@ IedModel_lookupDataSet(IedModel* model, const char* dataSetReference /* e.g. ie } LogicalDevice* -IedModel_getDevice(IedModel* model, const char* deviceName) +IedModel_getDevice(IedModel* self, const char* deviceName) { - LogicalDevice* device = model->firstChild; + LogicalDevice* device = self->firstChild; while (device != NULL) { char domainName[65]; - strncpy(domainName, model->name, 64); + strncpy(domainName, self->name, 64); strncat(domainName, device->name, 64); if (strcmp(domainName, deviceName) == 0) @@ -149,6 +149,22 @@ IedModel_getDevice(IedModel* model, const char* deviceName) return NULL; } +LogicalDevice* +IedModel_getDeviceByInst(IedModel* self, const char* ldInst) +{ + LogicalDevice* device = self->firstChild; + + while (device != NULL) { + + if (strcmp(device->name, ldInst) == 0) + return device; + + device = (LogicalDevice*) device->sibling; + } + + return NULL; +} + static DataAttribute* ModelNode_getDataAttributeByMmsValue(ModelNode* self, MmsValue* value) { diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 757cbcc3..f7388f52 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -569,3 +569,5 @@ EXPORTS IedConnection_setFilestoreBasepath IedServer_setFilestoreBasepath GooseReceiver_isRunning + IedModel_getDeviceByInst + \ No newline at end of file diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index ef9e200a..52e6cbfc 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -647,3 +647,5 @@ EXPORTS IedConnection_setFilestoreBasepath IedServer_setFilestoreBasepath GooseReceiver_isRunning + IedModel_getDeviceByInst + \ No newline at end of file From b931b773ebbd4b67cc5c39e11ea990dfec1eaf07 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 5 Jul 2017 10:44:22 +0200 Subject: [PATCH 12/64] - C# API: server - keep references to internal control handler delegates to avoid garbage collection --- dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs index b3fbc53a..fc08dd8f 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ServerAPI.cs @@ -659,7 +659,9 @@ namespace IEC61850 private IntPtr self = IntPtr.Zero; - + private InternalControlHandler internalControlHandlerRef = null; + private InternalControlPerformCheckHandler internalControlPerformCheckHandlerRef = null; + private InternalControlWaitForExecutionHandler internalControlWaitForExecutionHandlerRef = null; private class ControlHandlerInfo { public DataObject controlObject = null; @@ -884,7 +886,10 @@ namespace IEC61850 info.controlHandler = handler; info.controlHandlerParameter = parameter; - IedServer_setControlHandler(self, controlObject.self, internalControlHandler, GCHandle.ToIntPtr(info.handle)); + if (internalControlHandlerRef == null) + internalControlHandlerRef = new InternalControlHandler (internalControlHandler); + + IedServer_setControlHandler(self, controlObject.self, internalControlHandlerRef, GCHandle.ToIntPtr(info.handle)); } public void SetCheckHandler (DataObject controlObject, CheckHandler handler, object parameter) @@ -894,7 +899,10 @@ namespace IEC61850 info.checkHandler = handler; info.checkHandlerParameter = parameter; - IedServer_setPerformCheckHandler(self, controlObject.self, internalCheckHandler, GCHandle.ToIntPtr(info.handle)); + if (internalControlPerformCheckHandlerRef == null) + internalControlPerformCheckHandlerRef = new InternalControlPerformCheckHandler (internalCheckHandler); + + IedServer_setPerformCheckHandler(self, controlObject.self, internalControlPerformCheckHandlerRef, GCHandle.ToIntPtr(info.handle)); } public void SetWaitForExecutionHandler (DataObject controlObject, ControlWaitForExecutionHandler handler, object parameter) @@ -904,7 +912,10 @@ namespace IEC61850 info.waitForExecHandler = handler; info.waitForExecHandlerParameter = parameter; - IedServer_setWaitForExecutionHandler(self, controlObject.self, internalControlWaitForExecutionHandler, GCHandle.ToIntPtr(info.handle)); + if (internalControlWaitForExecutionHandlerRef == null) + internalControlWaitForExecutionHandlerRef = new InternalControlWaitForExecutionHandler (internalControlWaitForExecutionHandler); + + IedServer_setWaitForExecutionHandler(self, controlObject.self, internalControlWaitForExecutionHandlerRef, GCHandle.ToIntPtr(info.handle)); } public void HandleWriteAccess (DataAttribute dataAttr, WriteAccessHandler handler, object parameter) From 4b8a6ff3e7f2cba657dd5f2f60cbc0c1454be100 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 11 Jul 2017 08:14:22 +0200 Subject: [PATCH 13/64] - client API: updated function documentation --- src/iec61850/inc/iec61850_client.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index deec194c..c72784a2 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -1640,13 +1640,12 @@ IedConnection_getServerDirectory(IedConnection self, IedClientError* error, bool /** * \brief Get the list of logical nodes (LN) of a logical device * - * LGetLogicalDeviceDirectory ACSI service implementation. Returns the list of logical nodes present - * in a logical device. The list is returned as a linked list of type LinkedList where the elements - * are C style strings. + * GetLogicalDeviceDirectory ACSI service implementation. Returns the list of logical nodes names present + * in a logical device. The list is returned as a linked list of type LinkedList with c style string elements. * * \param self the connection object * \param error the error code if an error occurs - * \param getFileNames get list of files instead of logical device names (TO BE IMPLEMENTED) + * \param logicalDeviceName the name of the logical device (LD) of interest * * \return LinkedList with string elements representing the logical node names */ From a0af20defc17d4ef0af3a29ce4fbef1e59dedaa8 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 20 Jul 2017 17:04:00 +0200 Subject: [PATCH 14/64] - socket_win32.c: replaced free by GLOBAL_FREEMEM --- src/hal/socket/win32/socket_win32.c | 4 ++-- third_party/sqlite/README | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/hal/socket/win32/socket_win32.c b/src/hal/socket/win32/socket_win32.c index 0e944455..a8d65600 100644 --- a/src/hal/socket/win32/socket_win32.c +++ b/src/hal/socket/win32/socket_win32.c @@ -253,7 +253,7 @@ ServerSocket_destroy(ServerSocket self) { closesocket(self->fd); WSACleanup(); - free(self); + GLOBAL_FREEMEM(self); } Socket @@ -401,5 +401,5 @@ Socket_destroy(Socket self) closesocket(self->fd); } - free(self); + GLOBAL_FREEMEM(self); } diff --git a/third_party/sqlite/README b/third_party/sqlite/README index 2e1781bf..02bb67e0 100644 --- a/third_party/sqlite/README +++ b/third_party/sqlite/README @@ -1 +1,2 @@ -Copy the sqlite amalagamation source code files (sqlite3.c sqlite3ext.h sqlite3.h) in this directory. You can download an archive withan archive with the files here: https://www.sqlite.org/download.html +Copy the sqlite amalagamation source code files (sqlite3.c sqlite3ext.h sqlite3.h) in this directory. You can download an archive with the files here: https://www.sqlite.org/download.html + From 8d2b8b087ea080081847999a09f4d354822b80ba Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 4 Aug 2017 17:49:47 +0200 Subject: [PATCH 15/64] - fixed problem with windows def file when winpcap not present --- src/vs/libiec61850-wo-goose.def | 3 +-- third_party/winpcap/README | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 third_party/winpcap/README diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index f7388f52..c3a28922 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -568,6 +568,5 @@ EXPORTS MmsConnection_setFilestoreBasepath IedConnection_setFilestoreBasepath IedServer_setFilestoreBasepath - GooseReceiver_isRunning IedModel_getDeviceByInst - \ No newline at end of file + diff --git a/third_party/winpcap/README b/third_party/winpcap/README deleted file mode 100644 index 9050673d..00000000 --- a/third_party/winpcap/README +++ /dev/null @@ -1,2 +0,0 @@ -For GOOSE support add winpcap source and headers here. Rerun cmake to configure the build system for GOOSE support. - From b1641b82ff2690f6f224160637d869f620c1329f Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 15 Aug 2017 08:15:33 +0200 Subject: [PATCH 16/64] - MMS client/server: extended BER encoder to support MMS PDU sizes with more than 64k --- config/stack_config.h | 2 +- examples/mms_utility/mms_utility.c | 23 +++++++++++++++++- src/mms/asn1/ber_encoder.c | 13 ++++++++-- .../iso_mms/server/mms_server_connection.c | 2 -- tools/model_generator/modelviewer.jar | Bin 84523 -> 88152 bytes 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index c11d32ff..770353c2 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -28,7 +28,7 @@ #define DEBUG_HAL_ETHERNET 0 /* Maximum MMS PDU SIZE - default is 65000 */ -#define CONFIG_MMS_MAXIMUM_PDU_SIZE 65000 +#define CONFIG_MMS_MAXIMUM_PDU_SIZE 120000 /* * Enable single threaded mode diff --git a/examples/mms_utility/mms_utility.c b/examples/mms_utility/mms_utility.c index e2511c69..d6c537b6 100644 --- a/examples/mms_utility/mms_utility.c +++ b/examples/mms_utility/mms_utility.c @@ -23,6 +23,7 @@ print_help() printf("-g get file attributes\n"); printf("-x delete file\n"); printf("-j read journal\n"); + printf("-v read domain variable list\n"); printf("-m print raw MMS messages\n"); } @@ -117,10 +118,11 @@ int main(int argc, char** argv) { int readJournal = 0; int printRawMmsMessages = 0; int deleteFile = 0; + int readVariableList = 0; int c; - while ((c = getopt(argc, argv, "mifdh:p:l:t:a:r:g:j:x:")) != -1) + while ((c = getopt(argc, argv, "mifdh:p:l:t:a:r:g:j:x:v:")) != -1) switch (c) { case 'm': printRawMmsMessages = 1; @@ -153,6 +155,10 @@ int main(int argc, char** argv) { readVariable = 1; variableName = StringUtils_copyString(optarg); break; + case 'v': + readVariableList = 1; + variableName = StringUtils_copyString(optarg); + break; case 'f': showFileList = 1; break; @@ -342,6 +348,21 @@ int main(int argc, char** argv) { printf("Reading VMD scope variable not yet supported!\n"); } + if (readVariableList) { + if (readWriteHasDomain) { + MmsValue* variables = MmsConnection_readNamedVariableListValues(con, &error, domainName, variableName, true); + + if (error != MMS_ERROR_NONE) { + printf("Reading variable failed: (ERROR %i)\n", error); + } + else { + printf("Read SUCCESS\n"); + } + } + else + printf("Reading VMD scope variable list not yet supported!\n"); + } + if (showFileList) { char lastName[300]; lastName[0] = 0; diff --git a/src/mms/asn1/ber_encoder.c b/src/mms/asn1/ber_encoder.c index 49c9b679..2417c1fa 100644 --- a/src/mms/asn1/ber_encoder.c +++ b/src/mms/asn1/ber_encoder.c @@ -34,12 +34,19 @@ BerEncoder_encodeLength(uint32_t length, uint8_t* buffer, int bufPos) buffer[bufPos++] = 0x81; buffer[bufPos++] = (uint8_t) length; } - else { + else if (length < 65535) { buffer[bufPos++] = 0x82; buffer[bufPos++] = length / 256; buffer[bufPos++] = length % 256; } + else { + buffer[bufPos++] = 0x83; + + buffer[bufPos++] = length / 0x10000; + buffer[bufPos++] = (length & 0xffff) / 0x100; + buffer[bufPos++] = length % 256; + } return bufPos; } @@ -362,8 +369,10 @@ BerEncoder_determineLengthSize(uint32_t length) return 1; if (length < 256) return 2; - else + if (length < 65536) return 3; + else + return 4; } int diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 494a6069..fabc6213 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -252,8 +252,6 @@ handleConfirmedErrorPdu( uint32_t invokeId; MmsServiceError serviceError; - - if (mmsMsg_parseConfirmedErrorPDU(buffer, bufPos, maxBufPos, &invokeId, &serviceError)) { if (DEBUG_MMS_SERVER) diff --git a/tools/model_generator/modelviewer.jar b/tools/model_generator/modelviewer.jar index 9beb17fe403106f59e8a11bddfbc294e0dbf06ee..4c6360d56d14e4308af01251f55d5b78a9570a33 100644 GIT binary patch delta 34116 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 Date: Sat, 19 Aug 2017 11:24:00 +0200 Subject: [PATCH 17/64] - IEC 61850 client: Changed result strings of IedConnection_getDataDirectoryByFC. Removed appended FC string. --- dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs | 2 +- dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj | 2 -- examples/iec61850_client_example1/client_example1.c | 2 ++ src/iec61850/client/ied_connection.c | 8 ++------ src/iec61850/inc/iec61850_client.h | 6 ++++-- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs index 374d3a88..98d1bad5 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs @@ -823,7 +823,7 @@ namespace IEC61850 return QueryLogByTime (logRef, startTimeMs, stopTimeMs, out moreFollows); } - /// Read the variable specification (type description of a DA or FDCO + /// Read the variable specification (type description of a DA or FCDO /// The object reference of a DA or FCDO. /// The functional constraint (FC) of the object /// This exception is thrown if there is a connection or service error diff --git a/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj b/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj index 1c22e5ad..dc2a4dc5 100644 --- a/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj +++ b/dotnet/IEC61850forCSharp/IEC61850forCSharp.csproj @@ -7,8 +7,6 @@ Library iec61850dotnet iec61850dotnet - 8.0.30703 - 2.0
true diff --git a/examples/iec61850_client_example1/client_example1.c b/examples/iec61850_client_example1/client_example1.c index e20a2327..1142c768 100644 --- a/examples/iec61850_client_example1/client_example1.c +++ b/examples/iec61850_client_example1/client_example1.c @@ -50,6 +50,8 @@ int main(int argc, char** argv) { if (error == IED_ERROR_OK) { + IedConnection_getServerDirectory(con, &error, false); + /* read an analog measurement value from server */ MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX); diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index 29ba1b41..ac91bf6f 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -1981,13 +1981,9 @@ getDataDirectoryByFc(IedConnection self, IedClientError* error, int elementNameLen = strlen(subElementName); - char* elementName = (char*) GLOBAL_MALLOC(elementNameLen + 5); + char* elementName = (char*) GLOBAL_MALLOC(elementNameLen + 1); memcpy(elementName, subElementName, elementNameLen); - elementName[elementNameLen] = '['; - elementName[elementNameLen + 1] = *(fcPos + 1); - elementName[elementNameLen + 2] = *(fcPos + 2); - elementName[elementNameLen + 3] = ']'; - elementName[elementNameLen + 4] = 0; + elementName[elementNameLen] = 0; if (!addToStringSet(dataDirectory, elementName)) GLOBAL_FREEMEM(elementName); diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index c72784a2..254abb69 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -1740,8 +1740,10 @@ IedConnection_getDataDirectoryFC(IedConnection self, IedClientError* error, cons * \brief returns the directory of the given data object/data attribute with the given FC * * Implementation of the GetDataDirectory ACSI service. This will return the list of - * C strings with all data attributes or sub data objects as elements. The returned - * strings will contain the functional constraint appended in square brackets when appropriate. + * C strings with all data attributes or sub data objects as elements. + * + * WARNING: Starting with version 1.0.3 the functional constraint will no longer be appended to + * the name string. * * \param self the connection object * \param error the error code if an error occurs From 311c70ea30c92d1ed4ed91692b2e5228f93f66d6 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sun, 20 Aug 2017 10:22:54 +0200 Subject: [PATCH 18/64] - some code cleanup in mms_client_connection.c --- .../iso_mms/client/mms_client_connection.c | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 3428c190..84743ea2 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -285,11 +285,9 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* { ByteBuffer* receivedMessage = NULL; - uint64_t startTime = Hal_getTimeInMs(); - - uint64_t waitUntilTime = startTime + self->requestTimeout; + uint64_t currentTime = Hal_getTimeInMs(); - uint64_t currentTime = startTime; + uint64_t waitUntilTime = currentTime + self->requestTimeout; bool success = false; @@ -311,15 +309,20 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* goto connection_lost; Semaphore_wait(self->lastResponseLock); + receivedInvokeId = self->responseInvokeId; - Semaphore_post(self->lastResponseLock); if (receivedInvokeId == invokeId) { + receivedMessage = self->lastResponse; + Semaphore_post(self->lastResponseLock); + success = true; break; } + Semaphore_post(self->lastResponseLock); + Thread_sleep(10); currentTime = Hal_getTimeInMs(); @@ -331,7 +334,7 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* self->lastResponseError = MMS_ERROR_SERVICE_TIMEOUT; } - connection_lost: +connection_lost: removeFromOutstandingCalls(self, invokeId); @@ -662,7 +665,7 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) self->concludeState = CONCLUDE_STATE_REQUESTED; - /* TODO block all new user requests */ + /* TODO block all new user requests? */ IsoClientConnection_releaseReceiveBuffer(self->isoClient); } @@ -697,6 +700,7 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) else { if (checkForOutstandingCall(self, invokeId)) { + /* wait for application thread to handle last received response */ waitUntilLastResponseHasBeenProcessed(self); Semaphore_wait(self->lastResponseLock); @@ -1047,11 +1051,9 @@ MmsConnection_getMmsConnectionParameters(MmsConnection self) static void waitForConnectResponse(MmsConnection self) { - uint64_t startTime = Hal_getTimeInMs(); + uint64_t currentTime = Hal_getTimeInMs(); - uint64_t waitUntilTime = startTime + self->requestTimeout; - - uint64_t currentTime = startTime; + uint64_t waitUntilTime = currentTime + self->requestTimeout; while (currentTime < waitUntilTime) { if (self->connectionState != MMS_CON_WAITING) @@ -1061,7 +1063,6 @@ waitForConnectResponse(MmsConnection self) currentTime = Hal_getTimeInMs(); } - } bool From 325867b5f480cbaeeeaedfe9d57c1c0515ec6049 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sun, 20 Aug 2017 17:44:20 +0200 Subject: [PATCH 19/64] - MMS client: replaced asn1c code in mms_client_initiate.c --- src/mms/inc_private/mms_client_internal.h | 2 +- src/mms/iso_mms/client/mms_client_initiate.c | 231 +++++++++++++------ 2 files changed, 159 insertions(+), 74 deletions(-) diff --git a/src/mms/inc_private/mms_client_internal.h b/src/mms/inc_private/mms_client_internal.h index 8eb23a42..bc52d6a0 100644 --- a/src/mms/inc_private/mms_client_internal.h +++ b/src/mms/inc_private/mms_client_internal.h @@ -133,7 +133,7 @@ mmsClient_getInvokeId(ConfirmedResponsePdu_t* confirmedResponse); int mmsClient_write_out(void *buffer, size_t size, void *app_key); -int +void mmsClient_createInitiateRequest(MmsConnection self, ByteBuffer* writeBuffer); MmsPdu_t* diff --git a/src/mms/iso_mms/client/mms_client_initiate.c b/src/mms/iso_mms/client/mms_client_initiate.c index e8c7d7d4..5cf93b43 100644 --- a/src/mms/iso_mms/client/mms_client_initiate.c +++ b/src/mms/iso_mms/client/mms_client_initiate.c @@ -1,28 +1,27 @@ /* * mms_client_initiate.c * - * Copyright 2013, 2014 Michael Zillgith + * Copyright 2013-2017 Michael Zillgith * - * This file is part of libIEC61850. + * 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 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. + * 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 . + * 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. + * See COPYING file for the complete license text. */ #include "libiec61850_platform_includes.h" -#include #include "mms_common.h" #include "mms_common_internal.h" #include "mms_indication.h" @@ -33,63 +32,80 @@ #include "mms_client_internal.h" +#include "ber_encoder.h" + /* servicesSupported = {GetNameList} - required by initiate request, other services are required by some servers to work properly */ static uint8_t servicesSupported[] = { 0xee, 0x1c, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x79, 0xef, 0x18 }; -static InitiateRequestPdu_t -createInitiateRequestPdu(MmsConnection self) +void +mmsClient_createInitiateRequest(MmsConnection self, ByteBuffer* message) { - InitiateRequestPdu_t request; + int maxServerOutstandingCalling = DEFAULT_MAX_SERV_OUTSTANDING_CALLING; + int maxServerOutstandingCalled = DEFAULT_MAX_SERV_OUTSTANDING_CALLED; + int dataStructureNestingLevel = DEFAULT_DATA_STRUCTURE_NESTING_LEVEL; - request.localDetailCalling = (Integer32_t*) GLOBAL_CALLOC(1, sizeof(Integer32_t)); - *(request.localDetailCalling) = self->parameters.maxPduSize; + uint32_t localDetailSize = + BerEncoder_UInt32determineEncodedSize(self->parameters.maxPduSize); - request.proposedMaxServOutstandingCalled = DEFAULT_MAX_SERV_OUTSTANDING_CALLED; - request.proposedMaxServOutstandingCalling = DEFAULT_MAX_SERV_OUTSTANDING_CALLING; + uint32_t proposedMaxServerOutstandingCallingSize = + BerEncoder_UInt32determineEncodedSize(maxServerOutstandingCalling); - request.proposedDataStructureNestingLevel = (Integer8_t*) GLOBAL_CALLOC(1, sizeof(Integer8_t)); - *(request.proposedDataStructureNestingLevel) = DEFAULT_DATA_STRUCTURE_NESTING_LEVEL; + uint32_t proposedMaxServerOutstandingCalledSize = + BerEncoder_UInt32determineEncodedSize(maxServerOutstandingCalled); - request.mmsInitRequestDetail.proposedParameterCBB.size = 2; - request.mmsInitRequestDetail.proposedParameterCBB.bits_unused = 5; - request.mmsInitRequestDetail.proposedParameterCBB.buf = (uint8_t*) GLOBAL_CALLOC(2, sizeof(uint8_t)); - request.mmsInitRequestDetail.proposedParameterCBB.buf[0] = 0xf1; - request.mmsInitRequestDetail.proposedParameterCBB.buf[1] = 0x00; + uint32_t dataStructureNestingLevelSize = + BerEncoder_UInt32determineEncodedSize(dataStructureNestingLevel); - request.mmsInitRequestDetail.proposedVersionNumber = 1; + uint32_t initRequestDetailSize = 3 + 5 + 14; - request.mmsInitRequestDetail.servicesSupportedCalling.size = 11; - request.mmsInitRequestDetail.servicesSupportedCalling.bits_unused = 3; + uint32_t initiateRequestPduSize = 2 + localDetailSize + + 2 + proposedMaxServerOutstandingCallingSize + + 2 + proposedMaxServerOutstandingCalledSize + + 2 + dataStructureNestingLevelSize + + 2 + initRequestDetailSize; - request.mmsInitRequestDetail.servicesSupportedCalling.buf = servicesSupported; + /* encode message (InitiateRequestPdu) */ - return request; -} + int bufPos = 0; + uint8_t* buffer = message->buffer; -static void -freeInitiateRequestPdu(InitiateRequestPdu_t request) -{ - GLOBAL_FREEMEM(request.localDetailCalling); - GLOBAL_FREEMEM(request.proposedDataStructureNestingLevel); - GLOBAL_FREEMEM(request.mmsInitRequestDetail.proposedParameterCBB.buf); -} + bufPos = BerEncoder_encodeTL(0xa8, initiateRequestPduSize, buffer, bufPos); -int -mmsClient_createInitiateRequest(MmsConnection self, ByteBuffer* message) -{ - MmsPdu_t* mmsPdu = (MmsPdu_t*) GLOBAL_CALLOC(1, sizeof(MmsPdu_t)); + /* localDetail */ + bufPos = BerEncoder_encodeTL(0x80, localDetailSize, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(self->parameters.maxPduSize, buffer, bufPos); + + /* proposedMaxServerOutstandingCalling */ + bufPos = BerEncoder_encodeTL(0x81, proposedMaxServerOutstandingCallingSize, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(maxServerOutstandingCalling, buffer, bufPos); - mmsPdu->present = MmsPdu_PR_initiateRequestPdu; + /* proposedMaxServerOutstandingCalled */ + bufPos = BerEncoder_encodeTL(0x82, proposedMaxServerOutstandingCalledSize, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(maxServerOutstandingCalled, buffer, bufPos); - mmsPdu->choice.initiateRequestPdu = createInitiateRequestPdu(self); + /* proposedDataStructureNestingLevel */ + bufPos = BerEncoder_encodeTL(0x83, dataStructureNestingLevelSize, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(dataStructureNestingLevel, buffer, bufPos); - asn_enc_rval_t rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, - (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) message); + /* initRequestDetail */ + bufPos = BerEncoder_encodeTL(0xa4, initRequestDetailSize, buffer, bufPos); - freeInitiateRequestPdu(mmsPdu->choice.initiateRequestPdu); - GLOBAL_FREEMEM(mmsPdu); + /* proposedVersionNumber = 1 */ + buffer[bufPos++] = 0x80; + buffer[bufPos++] = 0x01; + buffer[bufPos++] = 0x01; - return rval.encoded; + /* proposedParameterCBC */ + buffer[bufPos++] = 0x81; + buffer[bufPos++] = 0x03; + buffer[bufPos++] = 0x05; /* padding */ + buffer[bufPos++] = 0xf1; + buffer[bufPos++] = 0x00; + + /* servicesSupportedCalling */ + bufPos = BerEncoder_encodeBitString(0x82, 85, servicesSupported, buffer, bufPos); + + message->size = bufPos; } int @@ -105,43 +121,112 @@ mmsClient_createConcludeRequest(MmsConnection self, ByteBuffer* message) return -1; } +static bool +parseInitResponseDetail(MmsConnection self, uint8_t* buffer, int bufPos, int maxBufPos) +{ + while (bufPos < maxBufPos) { + uint8_t tag = buffer[bufPos++]; + int length; + + bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); + + if (bufPos < 0) + return false; + + switch (tag) { + + case 0x80: /* negotiated protocol version */ + break; + + case 0x81: /* parameter CBB */ + break; + + case 0x82: /* services supported called */ + { + int i; + + for (i = 0; i < 11; i++) + self->parameters.servicesSupported[i] = buffer[bufPos + i]; + } + break; + + default: + break; + } + + bufPos += length; + } + + return true; +} + bool mmsClient_parseInitiateResponse(MmsConnection self) { bool result = false; - MmsPdu_t* mmsPdu = 0; - asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, - (void**) &mmsPdu, ByteBuffer_getBuffer(self->lastResponse), - ByteBuffer_getSize(self->lastResponse)); + self->parameters.maxPduSize = CONFIG_MMS_MAXIMUM_PDU_SIZE; + self->parameters.dataStructureNestingLevel = DEFAULT_DATA_STRUCTURE_NESTING_LEVEL; + self->parameters.maxServOutstandingCalled = DEFAULT_MAX_SERV_OUTSTANDING_CALLED; + self->parameters.maxServOutstandingCalling = DEFAULT_MAX_SERV_OUTSTANDING_CALLING; - if (rval.code != RC_OK) goto exit_function; + int bufPos = 0; + int maxBufPos = ByteBuffer_getSize(self->lastResponse); + uint8_t* buffer = ByteBuffer_getBuffer(self->lastResponse); - if (mmsPdu->present == MmsPdu_PR_initiateResponsePdu) { - InitiateResponsePdu_t* initiateResponse = &(mmsPdu->choice.initiateResponsePdu); + while (bufPos < maxBufPos) { + uint8_t tag = buffer[bufPos++]; + int length; - if (initiateResponse->localDetailCalled != NULL) - self->parameters.maxPduSize = *(initiateResponse->localDetailCalled); + bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); - if (initiateResponse->negotiatedDataStructureNestingLevel != NULL) - self->parameters.dataStructureNestingLevel = *(initiateResponse->negotiatedDataStructureNestingLevel);; + if (bufPos < 0) { + // TODO write initiate error PDU! + return false; + } - self->parameters.maxServOutstandingCalled = initiateResponse->negotiatedMaxServOutstandingCalled; + switch (tag) { + case 0x80: /* local-detail-calling */ + self->parameters.maxPduSize = BerDecoder_decodeUint32(buffer, length, bufPos); - self->parameters.maxServOutstandingCalling = initiateResponse->negotiatedMaxServOutstandingCalling; + if (self->parameters.maxPduSize > CONFIG_MMS_MAXIMUM_PDU_SIZE) + self->parameters.maxPduSize = CONFIG_MMS_MAXIMUM_PDU_SIZE; - int i; + break; - for (i = 0; i < 11; i++) - self->parameters.servicesSupported[i] = initiateResponse->mmsInitResponseDetail.servicesSupportedCalled.buf[i]; + case 0x81: /* proposed-max-serv-outstanding-calling */ + self->parameters.maxServOutstandingCalling = BerDecoder_decodeUint32(buffer, length, bufPos); - result = true; + if (self->parameters.maxServOutstandingCalling > DEFAULT_MAX_SERV_OUTSTANDING_CALLING) + self->parameters.maxServOutstandingCalling = DEFAULT_MAX_SERV_OUTSTANDING_CALLING; + + break; + + case 0x82: /* proposed-max-serv-outstanding-called */ + self->parameters.maxServOutstandingCalled = BerDecoder_decodeUint32(buffer, length, bufPos); + + if (self->parameters.maxServOutstandingCalled > DEFAULT_MAX_SERV_OUTSTANDING_CALLED) + self->parameters.maxServOutstandingCalled = DEFAULT_MAX_SERV_OUTSTANDING_CALLED; + + break; + case 0x83: /* proposed-data-structure-nesting-level */ + self->parameters.dataStructureNestingLevel = BerDecoder_decodeUint32(buffer, length, bufPos); + break; + + case 0xa4: /* mms-init-request-detail */ + { + if (parseInitResponseDetail(self, buffer, bufPos, bufPos + length) == false) + return false; + } + break; + + default: + break; /* Ignore unknown tags */ + } + + bufPos += length; } - else - result = false; - asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); -exit_function: return result; } From 4822a1ab7b8efd07182c6601ba21916185d08434 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 24 Aug 2017 08:53:07 +0200 Subject: [PATCH 20/64] - SV subscriber: added functions SVClientASDU_hasRefrTm and SVClientASDU_getRefrTmAsMs --- src/sampled_values/sv_subscriber.c | 51 ++++++++++++++++++++++++++++++ src/sampled_values/sv_subscriber.h | 20 ++++++++++++ 2 files changed, 71 insertions(+) diff --git a/src/sampled_values/sv_subscriber.c b/src/sampled_values/sv_subscriber.c index 3f5333e3..5ebaadb3 100644 --- a/src/sampled_values/sv_subscriber.c +++ b/src/sampled_values/sv_subscriber.c @@ -67,6 +67,7 @@ struct sSVClientASDU { uint8_t* smpCnt; uint8_t* confRev; + uint8_t* refrTm; uint8_t* smpSynch; @@ -232,6 +233,10 @@ parseASDU(SVReceiver self, SVSubscriber subscriber, uint8_t* buffer, int length) asdu.confRev = buffer + bufPos; break; + case 0x84: + asdu.refrTm = buffer + bufPos; + break; + case 0x85: asdu.smpSynch = buffer + bufPos; break; @@ -491,6 +496,52 @@ SVClientASDU_getSmpCnt(SVClientASDU self) return retVal; } +static uint64_t +decodeUtcTime(uint8_t* buffer, uint8_t* timeQuality) +{ + uint32_t timeval32; + + timeval32 = buffer[3]; + timeval32 += buffer[2] * 0x100; + timeval32 += buffer[1] * 0x10000; + timeval32 += buffer[0] * 0x1000000; + + uint32_t msVal; + + uint32_t fractionOfSecond; + + fractionOfSecond = buffer[6]; + fractionOfSecond += buffer[5] * 0x100; + fractionOfSecond += buffer[4] * 0x10000; + + msVal = (uint32_t) (((uint64_t) fractionOfSecond * 1000) / 16777215); + + if (timeQuality != NULL) + *timeQuality = buffer[7]; + + uint64_t timeval64 = (uint64_t) timeval32 * 1000 + (uint64_t) msVal; + + return timeval64; +} + +uint64_t +SVClientASDU_getRefrTmAsMs(SVClientASDU self) +{ + uint64_t msTime = 0; + + if (self->refrTm != NULL) + msTime = decodeUtcTime(self->refrTm, NULL); + + return msTime; +} + +bool +SVClientASDU_hasRefrTm(SVClientASDU self) +{ + return (self->refrTm != NULL); +} + + const char* SVClientASDU_getSvId(SVClientASDU self) { diff --git a/src/sampled_values/sv_subscriber.h b/src/sampled_values/sv_subscriber.h index c463e5bd..eefcbaa4 100644 --- a/src/sampled_values/sv_subscriber.h +++ b/src/sampled_values/sv_subscriber.h @@ -268,6 +268,26 @@ SVClientASDU_getSvId(SVClientASDU self); uint32_t SVClientASDU_getConfRev(SVClientASDU self); +/** + * \brief Check if RefrTm value is included in the SV ASDU + * + * \param self ASDU object instance + * + * \return true if RefrTm value is present, false otherwise + */ +bool +SVClientASDU_hasRefrTm(SVClientASDU self); + +/** + * \brief Get the RefrTim value included in SV ASDU as ms timestamp + * + * \param self ASDU object instance + * + * \return the time value as ms timestamp or 0 if RefrTm is not present in the SV ASDU + */ +uint64_t +SVClientASDU_getRefrTmAsMs(SVClientASDU self); + /** * \brief Get an INT8 data value in the data part of the ASDU * From d0ac21e487081b2d1e6d9d3997132c3fb940f250 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 25 Aug 2017 00:02:51 +0200 Subject: [PATCH 21/64] - client/server: added set data set service (MMS write named variable list) - client/server: improved write access to array elements and sub arrays --- CMakeLists.txt | 4 +- dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs | 53 ++ .../inc/libiec61850_platform_includes.h | 2 +- src/doxygen.config | 2 +- src/iec61850/client/ied_connection.c | 58 ++ src/iec61850/inc/iec61850_client.h | 26 + src/mms/inc/mms_client_connection.h | 52 +- src/mms/inc/mms_value.h | 16 +- src/mms/inc_private/mms_client_internal.h | 11 +- src/mms/inc_private/mms_server_internal.h | 4 +- .../iso_mms/client/mms_client_connection.c | 69 +- src/mms/iso_mms/client/mms_client_journals.c | 2 +- src/mms/iso_mms/client/mms_client_write.c | 285 ++++++- src/mms/iso_mms/server/mms_access_result.c | 21 +- src/mms/iso_mms/server/mms_read_service.c | 36 +- .../iso_mms/server/mms_server_connection.c | 121 ++- src/mms/iso_mms/server/mms_write_service.c | 700 ++++++++++++++---- src/sampled_values/sv_subscriber.c | 51 ++ src/sampled_values/sv_subscriber.h | 20 + src/vs/libiec61850-wo-goose.def | 3 +- src/vs/libiec61850.def | 5 +- 21 files changed, 1306 insertions(+), 235 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cd880bbb..f398a87b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,8 @@ project(libiec61850) ENABLE_TESTING() set(LIB_VERSION_MAJOR "1") -set(LIB_VERSION_MINOR "0") -set(LIB_VERSION_PATCH "2") +set(LIB_VERSION_MINOR "1") +set(LIB_VERSION_PATCH "0") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/third_party/cmake/modules/") diff --git a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs index 98d1bad5..aef42ee1 100644 --- a/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850ClientAPI.cs @@ -335,6 +335,9 @@ namespace IEC61850 [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] static extern IntPtr IedConnection_readDataSetValues (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr dataSet); + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] + static extern void IedConnection_writeDataSetValues (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr values, out IntPtr accessResults); + [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] static extern IntPtr IedConnection_createDataSet (IntPtr self, out int error, [MarshalAs(UnmanagedType.LPStr)] string dataSetReference, IntPtr dataSet); @@ -1241,6 +1244,56 @@ namespace IEC61850 return dataSet; } + /// + /// Writes the values of a data set (SetDataSetValues service). + /// + /// The list of access results + /// The object reference of the data set + /// The new values for the data set members. The values have to be of the same number and type as the data set members + public List WriteDataSetValues(string dataSetReference, List values) + { + int error; + IntPtr accessResults = IntPtr.Zero; + + IntPtr valueList = LinkedList_create (); + + foreach (MmsValue mmsValue in values) { + LinkedList_add (valueList, mmsValue.valueReference); + } + + IedConnection_writeDataSetValues (connection, out error, dataSetReference, valueList, out accessResults); + + LinkedList_destroyStatic (valueList); + + /* handle access results */ + + List accessResultList = null; + + if (accessResults != IntPtr.Zero) { + + IntPtr element = LinkedList_getNext (accessResults); + + while (element != IntPtr.Zero) { + IntPtr elementData = LinkedList_getData (element); + + MmsValue accessResultValue = new MmsValue (elementData, true); + + MmsDataAccessError dataAccessError = accessResultValue.GetDataAccessError (); + + accessResultList.Add (dataAccessError); + + element = LinkedList_getNext (element); + } + + LinkedList_destroyStatic (accessResults); + } + + if (error != 0) + throw new IedConnectionException ("Writing data set failed", error); + + return accessResultList; + } + /// /// Create a new data set. /// diff --git a/src/common/inc/libiec61850_platform_includes.h b/src/common/inc/libiec61850_platform_includes.h index 4dc01c29..fcc50c6b 100644 --- a/src/common/inc/libiec61850_platform_includes.h +++ b/src/common/inc/libiec61850_platform_includes.h @@ -15,7 +15,7 @@ #include "platform_endian.h" -#define LIBIEC61850_VERSION "1.0.2" +#define LIBIEC61850_VERSION "1.1" #ifndef CONFIG_DEFAULT_MMS_VENDOR_NAME #define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" diff --git a/src/doxygen.config b/src/doxygen.config index f188266a..2970a10b 100644 --- a/src/doxygen.config +++ b/src/doxygen.config @@ -18,7 +18,7 @@ DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "libIEC61850" -PROJECT_NUMBER = 1.0.2 +PROJECT_NUMBER = 1.1 PROJECT_BRIEF = "Open-source IEC 61850 MMS/GOOSE/SV server and client library" diff --git a/src/iec61850/client/ied_connection.c b/src/iec61850/client/ied_connection.c index ac91bf6f..fdad55db 100644 --- a/src/iec61850/client/ied_connection.c +++ b/src/iec61850/client/ied_connection.c @@ -2326,6 +2326,64 @@ exit_function: return dataSet; } +void +IedConnection_writeDataSetValues(IedConnection self, IedClientError* error, const char* dataSetReference, + LinkedList/**/ values, /* OUTPUT */LinkedList* /* */accessResults) +{ + char domainIdBuffer[65]; + char itemIdBuffer[DATA_SET_MAX_NAME_LENGTH + 1]; + + const char* domainId = NULL; + const char* itemId = NULL; + + bool isAssociationSpecific = false; + + if (dataSetReference[0] != '@') { + + if ((dataSetReference[0] == '/') || (strchr(dataSetReference, '/') == NULL)) { + domainId = NULL; + + if (dataSetReference[0] == '/') + itemId = dataSetReference + 1; + else + itemId = dataSetReference; + } + else { + domainId = MmsMapping_getMmsDomainFromObjectReference(dataSetReference, domainIdBuffer); + + if (domainId == NULL) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } + + const char* itemIdRefOrig = dataSetReference + strlen(domainId) + 1; + + if (strlen(itemIdRefOrig) > DATA_SET_MAX_NAME_LENGTH) { + *error = IED_ERROR_OBJECT_REFERENCE_INVALID; + goto exit_function; + } + + char* itemIdRef = StringUtils_copyStringToBuffer(itemIdRefOrig, itemIdBuffer); + + StringUtils_replace(itemIdRef, '.', '$'); + itemId = itemIdRef; + } + } + else { + itemId = dataSetReference + 1; + isAssociationSpecific = true; + } + + MmsError mmsError; + + MmsConnection_writeNamedVariableList(self->connection, &mmsError, isAssociationSpecific, domainId, itemId, values, accessResults); + + *error = iedConnection_mapMmsErrorToIedError(mmsError); + +exit_function: + return; +} + LinkedList /* */ IedConnection_queryLogByTime(IedConnection self, IedClientError* error, const char* logReference, uint64_t startTime, uint64_t endTime, bool* moreFollows) diff --git a/src/iec61850/inc/iec61850_client.h b/src/iec61850/inc/iec61850_client.h index 254abb69..d319c109 100644 --- a/src/iec61850/inc/iec61850_client.h +++ b/src/iec61850/inc/iec61850_client.h @@ -1321,6 +1321,12 @@ IedConnection_writeOctetString(IedConnection self, IedClientError* error, const /** * \brief get data set values from a server device * + * The parameter dataSetReference is the name of the data set to read. It is either in the form LDName/LNodeName.dataSetName + * for permanent domain or VMD scope data sets or @dataSetName for an association specific data set. + * If the LDName part of the reference is missing the resulting data set will be of VMD scope. + * The received data set values are stored in a container object of type ClientDataSet that can be reused in a further + * read request. + * * \param connection the connection object * \param error the error code if an error occurs * \param dataSetReference object reference of the data set @@ -1386,6 +1392,26 @@ IedConnection_deleteDataSet(IedConnection self, IedClientError* error, const cha LinkedList /* */ IedConnection_getDataSetDirectory(IedConnection self, IedClientError* error, const char* dataSetReference, bool* isDeletable); +/** + * \brief Write the data set values to the server + * + * The parameter dataSetReference is the name of the data set to write. It is either in the form LDName/LNodeName.dataSetName + * for permanent domain or VMD scope data sets or @dataSetName for an association specific data set. + * If the LDName part of the reference is missing the resulting data set will be of VMD scope. + * The values parameter has to be the same number of elements as are members in the data set. The accessResult return parameter + * contains a value for each data set member. + * + * \param connection the connection object + * \param error the error code if an error occurs + * \param dataSetReference object reference of the data set + * \param values the new data set values + * \param accessResults the access results for each data set member + */ +void +IedConnection_writeDataSetValues(IedConnection self, IedClientError* error, const char* dataSetReference, + LinkedList/**/ values, /* OUTPUT */LinkedList* /* */accessResults); + + /******************************************************** * Data set object (local representation of a data set) *******************************************************/ diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index 1f60c1c7..48c9c8e2 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -399,20 +399,47 @@ MmsConnection_readMultipleVariables(MmsConnection self, MmsError* mmsError, cons /** * \brief Write a single variable to the server. * + * NOTE: added return value in version 1.1 + * * \param self MmsConnection instance to operate on * \param mmsError user provided variable to store error code * \param domainId the domain name of the variable to be written * \param itemId name of the variable to be written * \param value value of the variable to be written + * + * \return when successful, the data access error value returned by the server */ -void +MmsDataAccessError MmsConnection_writeVariable(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId, MmsValue* value); +/** + * \brief Write a single array element or a sub array to an array type variable + * + * When a single array element is address the MmsValue object value has to be of the type + * of the array elements. When multiple array elements have to be written (index range) the + * MmsValue object value has to be of type MMS_ARRAY containing "numberOfElements" elements. + * + * \param self MmsConnection instance to operate on + * \param mmsError user provided variable to store error code + * \param domainId the domain name of the variable to be written + * \param index the index of the array element or the start index of a index range + * \param numberOfElements the number of array elements to write starting with index. If 0 only one array element is written. + * \param itemId name of the variable to be written + * \param value value of the array element(s) to be written. Has to be of the type of + * the array elements or of type MMS_ARRAY when it is a sub array (index range) + * + * \return when successful, the data access error value returned by the server + */ +MmsDataAccessError +MmsConnection_writeArrayElements(MmsConnection self, MmsError* mmsError, + const char* domainId, const char* itemId, int index, int numberOfElements, + MmsValue* value); + /** * \brief Write multiple variables to the server. * - * This function will write multiple variables at the server. + * This function will write multiple variables to the server. * * The parameter accessResults is a pointer to a LinkedList reference. The methods will create a new LinkedList * object that contains the AccessResults of the single variable write attempts. It is up to the user to free this @@ -431,6 +458,27 @@ MmsConnection_writeMultipleVariables(MmsConnection self, MmsError* mmsError, con LinkedList /**/ items, LinkedList /* */ values, LinkedList* /* */ accessResults); +/** + * \brief Write named variable list values to the server. + * + * The parameter accessResults is a pointer to a LinkedList reference. The methods will create a new LinkedList + * object that contains the AccessResults of the single variable write attempts. It is in the responsibility of + * the user to free this objects properly (e.g. with LinkedList_destroyDeep(accessResults, MmsValue_delete)). + * If accessResult is the to NULL the result will not be stored. + * + * \param self MmsConnection instance to operate on + * \param mmsError user provided variable to store error code + * \param isAssociationSpecifc true if the named variable list is an association specific named variable list + * \param domainId the common domain name of all variables to be written + * \param values values of the variables to be written + * \param (OUTPUT) the MmsValue objects of type MMS_DATA_ACCESS_ERROR representing the write success of a single variable + * write. + */ +void +MmsConnection_writeNamedVariableList(MmsConnection self, MmsError* mmsError, bool isAssociationSpecific, + const char* domainId, const char* itemId, LinkedList /* */values, + /* OUTPUT */LinkedList* /* */accessResults); + /** * \brief Get the variable access attributes of a MMS named variable of the server * diff --git a/src/mms/inc/mms_value.h b/src/mms/inc/mms_value.h index 61253fb6..71082009 100644 --- a/src/mms/inc/mms_value.h +++ b/src/mms/inc/mms_value.h @@ -953,14 +953,28 @@ MmsValue_printToBuffer(const MmsValue* self, char* buffer, int bufferSize); /** * \brief create a new MmsValue instance from a BER encoded MMS Data element (deserialize) * + * WARNING: API changed with version 1.0.3 (added endBufPos parameter) + * + * \param buffer the buffer to read from + * \param bufPos the start position of the mms value data in the buffer + * \param bufferLength the length of the buffer + * \param endBufPos the position in the buffer after the read MMS data element (NULL if not required) + * + * \return the MmsValue instance created from the buffer */ MmsValue* -MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength); +MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength, int* endBufPos); /** * \brief Serialize the MmsValue instance as BER encoded MMS Data element * * \param self the MmsValue instance + * + * \param buffer the buffer to encode the MMS data element + * \param bufPos the position in the buffer where to start encoding + * \param encode encode to buffer (true) or calculate length only (false) + * + * \return the encoded length of the corresponding MMS data element */ int MmsValue_encodeMmsData(MmsValue* self, uint8_t* buffer, int bufPos, bool encode); diff --git a/src/mms/inc_private/mms_client_internal.h b/src/mms/inc_private/mms_client_internal.h index bc52d6a0..86253325 100644 --- a/src/mms/inc_private/mms_client_internal.h +++ b/src/mms/inc_private/mms_client_internal.h @@ -195,7 +195,7 @@ mmsClient_createGetVariableAccessAttributesRequest( MmsVariableSpecification* mmsClient_parseGetVariableAccessAttributesResponse(ByteBuffer* message, uint32_t* invokeId); -void +MmsDataAccessError mmsClient_parseWriteResponse(ByteBuffer* message, int32_t bufPos, MmsError* mmsError); void @@ -210,6 +210,15 @@ int mmsClient_createWriteMultipleItemsRequest(uint32_t invokeId, const char* domainId, LinkedList itemIds, LinkedList values, ByteBuffer* writeBuffer); +int +mmsClient_createWriteRequestNamedVariableList(uint32_t invokeId, bool isAssociationSpecific, const char* domainId, const char* itemId, + LinkedList values, ByteBuffer* writeBuffer); + +int +mmsClient_createWriteRequestArray(uint32_t invokeId, const char* domainId, const char* itemId, + int startIndex, int elementCount, + MmsValue* value, ByteBuffer* writeBuffer); + void mmsClient_createDefineNamedVariableListRequest(uint32_t invokeId, ByteBuffer* writeBuffer, const char* domainId, const char* listNameId, LinkedList /**/ listOfVariables, diff --git a/src/mms/inc_private/mms_server_internal.h b/src/mms/inc_private/mms_server_internal.h index 58655c87..6c8df614 100644 --- a/src/mms/inc_private/mms_server_internal.h +++ b/src/mms/inc_private/mms_server_internal.h @@ -370,9 +370,9 @@ mmsServer_setValue(MmsServer self, MmsDomain* domain, char* itemId, MmsValue* va MmsValue* mmsServer_getValue(MmsServer self, MmsDomain* domain, char* itemId, MmsServerConnection connection); -int +void mmsServer_createMmsWriteResponse(MmsServerConnection connection, - int invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults); + uint32_t invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults); void mmsMsg_createMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response); diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 84743ea2..128c8100 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -2166,11 +2166,13 @@ MmsConnection_obtainFile(MmsConnection self, MmsError* mmsError, const char* sou *mmsError = MMS_ERROR_CONNECTION_LOST; } -void +MmsDataAccessError MmsConnection_writeVariable(MmsConnection self, MmsError* mmsError, const char* domainId, const char* itemId, MmsValue* value) { + MmsDataAccessError retVal = DATA_ACCESS_ERROR_UNKNOWN; + ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); *mmsError = MMS_ERROR_NONE; @@ -2184,12 +2186,14 @@ MmsConnection_writeVariable(MmsConnection self, MmsError* mmsError, if (self->lastResponseError != MMS_ERROR_NONE) *mmsError = self->lastResponseError; else if (responseMessage != NULL) - mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError); + retVal = mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError); releaseResponse(self); if (self->associationState == MMS_STATE_CLOSED) *mmsError = MMS_ERROR_CONNECTION_LOST; + + return retVal; } void @@ -2224,6 +2228,67 @@ MmsConnection_writeMultipleVariables(MmsConnection self, MmsError* mmsError, con *mmsError = MMS_ERROR_CONNECTION_LOST; } +MmsDataAccessError +MmsConnection_writeArrayElements(MmsConnection self, MmsError* mmsError, + const char* domainId, const char* itemId, int index, int numberOfElements, + MmsValue* value) +{ + MmsDataAccessError retVal = DATA_ACCESS_ERROR_UNKNOWN; + + *mmsError = MMS_ERROR_NONE; + + uint32_t invokeId = getNextInvokeId(self); + + ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); + + mmsClient_createWriteRequestArray(invokeId, domainId, itemId, index, numberOfElements, value, payload); + + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + + if (self->lastResponseError != MMS_ERROR_NONE) + *mmsError = self->lastResponseError; + else if (responseMessage != NULL) + retVal = mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError); + + releaseResponse(self); + + if (self->associationState == MMS_STATE_CLOSED) + *mmsError = MMS_ERROR_CONNECTION_LOST; + + return retVal; +} + +void +MmsConnection_writeNamedVariableList(MmsConnection self, MmsError* mmsError, bool isAssociationSpecific, + const char* domainId, const char* itemId, LinkedList /* */values, + /* OUTPUT */LinkedList* /* */accessResults) +{ + *mmsError = MMS_ERROR_NONE; + + uint32_t invokeId = getNextInvokeId(self); + + ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); + + mmsClient_createWriteRequestNamedVariableList(invokeId, isAssociationSpecific, domainId, itemId, values, payload); + + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + + if (self->lastResponseError != MMS_ERROR_NONE) + *mmsError = self->lastResponseError; + else if (responseMessage != NULL) { + + int numberOfItems = LinkedList_size(values); + + mmsClient_parseWriteMultipleItemsResponse(self->lastResponse, self->lastResponseBufPos, mmsError, + numberOfItems, accessResults); + } + + releaseResponse(self); + + if (self->associationState == MMS_STATE_CLOSED) + *mmsError = MMS_ERROR_CONNECTION_LOST; +} + void MmsServerIdentity_destroy(MmsServerIdentity* self) { diff --git a/src/mms/iso_mms/client/mms_client_journals.c b/src/mms/iso_mms/client/mms_client_journals.c index 919e2c57..cf59685e 100644 --- a/src/mms/iso_mms/client/mms_client_journals.c +++ b/src/mms/iso_mms/client/mms_client_journals.c @@ -67,7 +67,7 @@ parseJournalVariable(uint8_t* buffer, int bufPos, int maxLength, MmsJournalVaria case 0xa1: /* valueSpec */ if (journalVariable->value == NULL) { - journalVariable->value = MmsValue_decodeMmsData(buffer, bufPos, length); + journalVariable->value = MmsValue_decodeMmsData(buffer, bufPos, length, NULL); } break; diff --git a/src/mms/iso_mms/client/mms_client_write.c b/src/mms/iso_mms/client/mms_client_write.c index 8163cdd8..1b7353ab 100644 --- a/src/mms/iso_mms/client/mms_client_write.c +++ b/src/mms/iso_mms/client/mms_client_write.c @@ -87,7 +87,8 @@ mmsClient_parseWriteMultipleItemsResponse(ByteBuffer* message, int32_t bufPos, M return; } - *accessResults = LinkedList_create(); + if (accessResults != NULL) + *accessResults = LinkedList_create(); int endPos = bufPos + length; @@ -101,17 +102,16 @@ mmsClient_parseWriteMultipleItemsResponse(ByteBuffer* message, int32_t bufPos, M if (bufPos == -1) goto exit_with_error; if (tag == 0x81) { - MmsValue* value = MmsValue_newDataAccessError(DATA_ACCESS_ERROR_SUCCESS); - LinkedList_add(*accessResults, (void*) value); + if (accessResults != NULL) + LinkedList_add(*accessResults, (void*) MmsValue_newDataAccessError(DATA_ACCESS_ERROR_SUCCESS)); } if (tag == 0x80) { uint32_t dataAccessErrorCode = BerDecoder_decodeUint32(buf, length, bufPos); - MmsValue* value = MmsValue_newDataAccessError((MmsDataAccessError) dataAccessErrorCode); - - LinkedList_add(*accessResults, (void*) value); + if (accessResults != NULL) + LinkedList_add(*accessResults, (void*) MmsValue_newDataAccessError((MmsDataAccessError) dataAccessErrorCode)); } bufPos += length; @@ -129,13 +129,17 @@ mmsClient_parseWriteMultipleItemsResponse(ByteBuffer* message, int32_t bufPos, M exit_with_error: *mmsError = MMS_ERROR_PARSING_RESPONSE; - LinkedList_destroyDeep(*accessResults, (LinkedListValueDeleteFunction) MmsValue_delete); + + if (accessResults != NULL) + LinkedList_destroyDeep(*accessResults, (LinkedListValueDeleteFunction) MmsValue_delete); } -void +MmsDataAccessError mmsClient_parseWriteResponse(ByteBuffer* message, int32_t bufPos, MmsError* mmsError) { + MmsDataAccessError retVal = DATA_ACCESS_ERROR_UNKNOWN; + uint8_t* buf = message->buffer; int size = message->size; @@ -151,13 +155,16 @@ mmsClient_parseWriteResponse(ByteBuffer* message, int32_t bufPos, MmsError* mmsE if (bufPos == -1) { *mmsError = MMS_ERROR_PARSING_RESPONSE; - return; + retVal = DATA_ACCESS_ERROR_UNKNOWN; + goto exit_function; } tag = buf[bufPos++]; - if (tag == 0x81) - return; + if (tag == 0x81) { + retVal = DATA_ACCESS_ERROR_SUCCESS; + goto exit_function; + } if (tag == 0x80) { bufPos = BerDecoder_decodeLength(buf, &length, bufPos, size); @@ -165,26 +172,104 @@ mmsClient_parseWriteResponse(ByteBuffer* message, int32_t bufPos, MmsError* mmsE uint32_t dataAccessErrorCode = BerDecoder_decodeUint32(buf, length, bufPos); - *mmsError = mapDataAccessErrorToMmsError(dataAccessErrorCode); + if ((dataAccessErrorCode >= 0) || (dataAccessErrorCode < 13)) { + *mmsError = mapDataAccessErrorToMmsError(dataAccessErrorCode); + retVal = (MmsDataAccessError) dataAccessErrorCode; + } + else { + *mmsError = MMS_ERROR_PARSING_RESPONSE; + retVal = DATA_ACCESS_ERROR_UNKNOWN; + } } } else *mmsError = MMS_ERROR_PARSING_RESPONSE; + +exit_function: + return retVal; +} + +//TODO remove redundant code (see mms_client_read.c) + +static AlternateAccess_t* +createAlternateAccess(uint32_t index, uint32_t elementCount) +{ + AlternateAccess_t* alternateAccess = (AlternateAccess_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccess_t)); + alternateAccess->list.count = 1; + alternateAccess->list.array = (struct AlternateAccess__Member**) GLOBAL_CALLOC(1, sizeof(struct AlternateAccess__Member*)); + alternateAccess->list.array[0] = (struct AlternateAccess__Member*) GLOBAL_CALLOC(1, sizeof(struct AlternateAccess__Member)); + alternateAccess->list.array[0]->present = AlternateAccess__Member_PR_unnamed; + + alternateAccess->list.array[0]->choice.unnamed = (AlternateAccessSelection_t*) GLOBAL_CALLOC(1, sizeof(AlternateAccessSelection_t)); + + alternateAccess->list.array[0]->choice.unnamed->present = AlternateAccessSelection_PR_selectAccess; + + if (elementCount > 0) { + alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.present = + AlternateAccessSelection__selectAccess_PR_indexRange; + + INTEGER_t* asnIndex = + &(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.lowIndex); + + asn_long2INTEGER(asnIndex, index); + + asnIndex = + &(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.numberOfElements); + + asn_long2INTEGER(asnIndex, elementCount); + } + else { + alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.present = + AlternateAccessSelection__selectAccess_PR_index; + + INTEGER_t* asnIndex = + &(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.index); + + asn_long2INTEGER(asnIndex, index); + } + + return alternateAccess; } -static VariableSpecification_t* +static void +deleteAlternateAccess(AlternateAccess_t* alternateAccess) +{ + if (alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.lowIndex.buf != NULL) { + GLOBAL_FREEMEM(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.lowIndex.buf); + alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.lowIndex.buf = NULL; + } + + if (alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.numberOfElements.buf != NULL) { + GLOBAL_FREEMEM(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.numberOfElements.buf); + alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.indexRange.numberOfElements.buf = NULL; + } + + if (alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.index.buf != NULL) { + GLOBAL_FREEMEM(alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.index.buf); + alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.index.buf = NULL; + } + + GLOBAL_FREEMEM(alternateAccess->list.array[0]->choice.unnamed); + GLOBAL_FREEMEM(alternateAccess->list.array[0]); + GLOBAL_FREEMEM(alternateAccess->list.array); + GLOBAL_FREEMEM(alternateAccess); + +} + + +static ListOfVariableSeq_t* createNewDomainVariableSpecification(const char* domainId, const char* itemId) { - VariableSpecification_t* varSpec = (VariableSpecification_t*) GLOBAL_CALLOC(1, sizeof(ListOfVariableSeq_t)); + ListOfVariableSeq_t* varSpec = (ListOfVariableSeq_t*) GLOBAL_CALLOC(1, sizeof(ListOfVariableSeq_t)); - varSpec->present = VariableSpecification_PR_name; - varSpec->choice.name.present = ObjectName_PR_domainspecific; - varSpec->choice.name.choice.domainspecific.domainId.buf = (uint8_t*) domainId; - varSpec->choice.name.choice.domainspecific.domainId.size = strlen(domainId); - varSpec->choice.name.choice.domainspecific.itemId.buf = (uint8_t*) itemId; - varSpec->choice.name.choice.domainspecific.itemId.size = strlen(itemId); + varSpec->variableSpecification.present = VariableSpecification_PR_name; + varSpec->variableSpecification.choice.name.present = ObjectName_PR_domainspecific; + varSpec->variableSpecification.choice.name.choice.domainspecific.domainId.buf = (uint8_t*) domainId; + varSpec->variableSpecification.choice.name.choice.domainspecific.domainId.size = strlen(domainId); + varSpec->variableSpecification.choice.name.choice.domainspecific.itemId.buf = (uint8_t*) itemId; + varSpec->variableSpecification.choice.name.choice.domainspecific.itemId.size = strlen(itemId); - return varSpec; + return varSpec; } static void @@ -262,7 +347,7 @@ mmsClient_createWriteMultipleItemsRequest(uint32_t invokeId, const char* domainI char* itemId = (char*) item->data; MmsValue* value = (MmsValue*) valueElement->data; - request->variableAccessSpecification.choice.listOfVariable.list.array[i] = (ListOfVariableSeq_t*) + request->variableAccessSpecification.choice.listOfVariable.list.array[i] = createNewDomainVariableSpecification(domainId, itemId); request->listOfData.list.array[i] = mmsMsg_createBasicDataElement(value); @@ -314,7 +399,7 @@ mmsClient_createWriteRequest(uint32_t invokeId, const char* domainId, const char request->variableAccessSpecification.choice.listOfVariable.list.size = 1; request->variableAccessSpecification.choice.listOfVariable.list.array = (ListOfVariableSeq_t**) GLOBAL_CALLOC(1, sizeof(ListOfVariableSeq_t*)); - request->variableAccessSpecification.choice.listOfVariable.list.array[0] = (ListOfVariableSeq_t*) + request->variableAccessSpecification.choice.listOfVariable.list.array[0] = createNewDomainVariableSpecification(domainId, itemId); /* Create list of typed data values */ @@ -346,3 +431,157 @@ mmsClient_createWriteRequest(uint32_t invokeId, const char* domainId, const char return rval.encoded; } + +/** + * \brief Encode request to write a named variable list (SetDataSet) + * + * The named variable list can be + * - VMD specific (domainId = NULL and isAssociationSpecific = false) + * - Domain specific (domainID != NULL and isAssociationSpecific = false) + * - association specific (isAssociationSpecific = true, domainId will be ignored) + * + * \param invokeId invoke ID of the new request + * \param isAssociationSpecific true = create an association specific request, false = create domain of VMD specific request + * \param domainId name of the MMS domain or NULL for association of VMD specific request + * \param itemId named variable list name + * \param values the list of the named variable list element values + * \param writeBuffer the buffer to write the request + * + * \return number of bytes encoded + */ +int +mmsClient_createWriteRequestNamedVariableList(uint32_t invokeId, bool isAssociationSpecific, const char* domainId, const char* itemId, + LinkedList values, ByteBuffer* writeBuffer) +{ + MmsPdu_t* mmsPdu = mmsClient_createConfirmedRequestPdu(invokeId); + + mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.present = + ConfirmedServiceRequest_PR_write; + WriteRequest_t* request = + &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); + + /* Create list of variable specifications */ + request->variableAccessSpecification.present = VariableAccessSpecification_PR_variableListName; + + if (isAssociationSpecific) { + request->variableAccessSpecification.choice.variableListName.present = ObjectName_PR_aaspecific; + request->variableAccessSpecification.choice.variableListName.choice.aaspecific.buf = (uint8_t*) StringUtils_copyString(itemId); + request->variableAccessSpecification.choice.variableListName.choice.aaspecific.size = strlen(itemId); + } + else { + if (domainId != NULL) { + request->variableAccessSpecification.choice.variableListName.present = ObjectName_PR_domainspecific; + request->variableAccessSpecification.choice.variableListName.choice.domainspecific.domainId.buf = (uint8_t*) StringUtils_copyString(domainId); + request->variableAccessSpecification.choice.variableListName.choice.domainspecific.domainId.size = strlen(domainId); + request->variableAccessSpecification.choice.variableListName.choice.domainspecific.itemId.buf = (uint8_t*) StringUtils_copyString(itemId); + request->variableAccessSpecification.choice.variableListName.choice.domainspecific.itemId.size = strlen(itemId); + } + else { + request->variableAccessSpecification.choice.variableListName.present = ObjectName_PR_vmdspecific; + request->variableAccessSpecification.choice.variableListName.choice.vmdspecific.buf = (uint8_t*) StringUtils_copyString(itemId); + request->variableAccessSpecification.choice.variableListName.choice.vmdspecific.size = strlen(itemId); + } + } + + /* Create list of typed data values */ + + int numberOfItems = LinkedList_size(values); + + request->listOfData.list.count = numberOfItems; + request->listOfData.list.size = numberOfItems; + request->listOfData.list.array = (Data_t**) GLOBAL_CALLOC(numberOfItems, sizeof(struct Data*)); + + int i; + + LinkedList valueElement = LinkedList_getNext(values); + + for (i = 0; i < numberOfItems; i++) { + + if (valueElement == NULL) return -1; + + MmsValue* value = (MmsValue*) valueElement->data; + + request->listOfData.list.array[i] = mmsMsg_createBasicDataElement(value); + + valueElement = LinkedList_getNext(valueElement); + } + + /* Encode complete ASN1 structure */ + + asn_enc_rval_t rval; + + rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, + (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); + + /* Free ASN structure */ + + for (i = 0; i < numberOfItems; i++) + deleteDataElement(request->listOfData.list.array[i]); + + request->listOfData.list.count = 0; + GLOBAL_FREEMEM(request->listOfData.list.array); + request->listOfData.list.array = 0; + + asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); + + return rval.encoded; +} + +int +mmsClient_createWriteRequestArray(uint32_t invokeId, const char* domainId, const char* itemId, + int startIndex, int elementCount, + MmsValue* value, + ByteBuffer* writeBuffer) +{ + MmsPdu_t* mmsPdu = mmsClient_createConfirmedRequestPdu(invokeId); + + mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.present = + ConfirmedServiceRequest_PR_write; + WriteRequest_t* request = + &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); + + /* Create list of variable specifications */ + request->variableAccessSpecification.present = VariableAccessSpecification_PR_listOfVariable; + request->variableAccessSpecification.choice.listOfVariable.list.count = 1; + request->variableAccessSpecification.choice.listOfVariable.list.size = 1; + request->variableAccessSpecification.choice.listOfVariable.list.array = + (ListOfVariableSeq_t**) GLOBAL_CALLOC(1, sizeof(ListOfVariableSeq_t*)); + + ListOfVariableSeq_t* variableIdentifier = createNewDomainVariableSpecification(domainId, itemId); + variableIdentifier->alternateAccess = createAlternateAccess(startIndex, elementCount); + request->variableAccessSpecification.choice.listOfVariable.list.array[0] = variableIdentifier; + + /* Create list of typed data values */ + request->listOfData.list.count = 1; + request->listOfData.list.size = 1; + request->listOfData.list.array = (Data_t**) GLOBAL_CALLOC(1, sizeof(struct Data*)); + request->listOfData.list.array[0] = mmsMsg_createBasicDataElement(value); + + /* Encode complete ASN1 structure */ + + asn_enc_rval_t rval; + + rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, + (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); + + /* Free ASN structure */ + deleteAlternateAccess(variableIdentifier->alternateAccess); + + request->variableAccessSpecification.choice.listOfVariable.list.count = 0; + + GLOBAL_FREEMEM(request->variableAccessSpecification.choice.listOfVariable.list.array[0]); + GLOBAL_FREEMEM(request->variableAccessSpecification.choice.listOfVariable.list.array); + request->variableAccessSpecification.choice.listOfVariable.list.array = 0; + + + request->listOfData.list.count = 0; + + deleteDataElement(request->listOfData.list.array[0]); + + GLOBAL_FREEMEM(request->listOfData.list.array); + request->listOfData.list.array = 0; + + asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); + + return rval.encoded; +} diff --git a/src/mms/iso_mms/server/mms_access_result.c b/src/mms/iso_mms/server/mms_access_result.c index 0e093955..0dafbf7d 100644 --- a/src/mms/iso_mms/server/mms_access_result.c +++ b/src/mms/iso_mms/server/mms_access_result.c @@ -152,7 +152,7 @@ exit_with_error: } MmsValue* -MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) +MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength, int* endBufPos) { MmsValue* value = NULL; @@ -191,7 +191,7 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) if (newBufPos == -1) goto exit_with_error; - MmsValue* elementValue = MmsValue_decodeMmsData(buffer, bufPos, dataLength); + MmsValue* elementValue = MmsValue_decodeMmsData(buffer, bufPos, dataLength, NULL); if (elementValue == NULL) goto exit_with_error; @@ -209,12 +209,12 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) case 0x80: /* MMS_DATA_ACCESS_ERROR */ value = MmsValue_newDataAccessError((MmsDataAccessError) BerDecoder_decodeUint32(buffer, dataLength, bufPos)); - + bufPos += dataLength; break; case 0x83: /* MMS_BOOLEAN */ value = MmsValue_newBoolean(BerDecoder_decodeBoolean(buffer, bufPos)); - + bufPos += dataLength; break; case 0x84: /* MMS_BIT_STRING */ @@ -223,6 +223,7 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) int bitStringLength = (8 * (dataLength - 1)) - padding; value = MmsValue_newBitString(bitStringLength); memcpy(value->value.bitString.buf, buffer + bufPos + 1, dataLength - 1); + bufPos += dataLength; } break; @@ -230,12 +231,14 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) value = MmsValue_newInteger(dataLength * 8); memcpy(value->value.integer->octets, buffer + bufPos, dataLength); value->value.integer->size = dataLength; + bufPos += dataLength; break; case 0x86: /* MMS_UNSIGNED */ value = MmsValue_newUnsigned(dataLength * 8); memcpy(value->value.integer->octets, buffer + bufPos, dataLength); value->value.integer->size = dataLength; + bufPos += dataLength; break; case 0x87: /* MMS_FLOAT */ @@ -243,15 +246,18 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) value = MmsValue_newDouble(BerDecoder_decodeDouble(buffer, bufPos)); else if (dataLength == 5) value = MmsValue_newFloat(BerDecoder_decodeFloat(buffer, bufPos)); + bufPos += dataLength; break; case 0x89: /* MMS_OCTET_STRING */ value = MmsValue_newOctetString(dataLength, dataLength); memcpy(value->value.octetString.buf, buffer + bufPos, dataLength); + bufPos += dataLength; break; case 0x8a: /* MMS_VISIBLE_STRING */ value = MmsValue_newVisibleStringFromByteArray(buffer + bufPos, dataLength); + bufPos += dataLength; break; case 0x8c: /* MMS_BINARY_TIME */ @@ -263,11 +269,14 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) if ((dataLength == 4) || (dataLength == 6)) memcpy(value->value.binaryTime.buf, buffer + bufPos, dataLength); + bufPos += dataLength; + break; case 0x90: /* MMS_STRING */ value = MmsValue_newVisibleStringFromByteArray(buffer + bufPos, dataLength); value->type = MMS_STRING; + bufPos += dataLength; break; @@ -275,6 +284,7 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) if (dataLength == 8) { value = MmsValue_newUtcTime(0); MmsValue_setUtcTimeByBuffer(value, buffer + bufPos); + bufPos += dataLength; } else goto exit_with_error; @@ -285,6 +295,9 @@ MmsValue_decodeMmsData(uint8_t* buffer, int bufPos, int bufferLength) goto exit_with_error; } + if (endBufPos != NULL) + *endBufPos = bufPos; + return value; exit_with_error: diff --git a/src/mms/iso_mms/server/mms_read_service.c b/src/mms/iso_mms/server/mms_read_service.c index 2840ff5b..6f8f0b32 100644 --- a/src/mms/iso_mms/server/mms_read_service.c +++ b/src/mms/iso_mms/server/mms_read_service.c @@ -115,8 +115,8 @@ appendValueToResultList(MmsValue* value, LinkedList values) } static void -appendErrorToResultList(LinkedList values, uint32_t errorCode) { - MmsValue* value = MmsValue_newDataAccessError((MmsDataAccessError) errorCode); +appendErrorToResultList(LinkedList values, MmsDataAccessError errorType) { + MmsValue* value = MmsValue_newDataAccessError(errorType); MmsValue_setDeletable(value); appendValueToResultList(value, values); } @@ -246,13 +246,13 @@ alternateArrayAccess(MmsServerConnection connection, } else /* access error */ - appendErrorToResultList(values, 10 /* object-non-existant*/); + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); } else { // invalid access if (DEBUG_MMS_SERVER) printf("Invalid alternate access\n"); - appendErrorToResultList(values, 10 /* object-non-existant*/); + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); } } @@ -295,7 +295,7 @@ addNamedVariableToResultList(MmsVariableSpecification* namedVariable, MmsDomain* if (DEBUG_MMS_SERVER) printf("MMS read: value of known variable is not found. Maybe illegal access to array element!\n"); - appendErrorToResultList(values, 10 /* object-non-existant*/); + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); } else appendValueToResultList(value, values); @@ -303,7 +303,7 @@ addNamedVariableToResultList(MmsVariableSpecification* namedVariable, MmsDomain* } else - appendErrorToResultList(values, 10 /* object-non-existant*/); + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); } @@ -479,6 +479,14 @@ exit_function: return; } +/** + * \brief implements access to list of variables (multiple MMS variables) + * + * \param connection the client connection that received the request + * \param read read request information + * \param invokeId the invoke ID of the confirmed request PDU + * \param response byte buffer to encode the response + */ static void handleReadListOfVariablesRequest( MmsServerConnection connection, @@ -524,13 +532,13 @@ handleReadListOfVariablesRequest( if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ domain %s not found!\n", domainIdStr); - appendErrorToResultList(values, (uint32_t) DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT /* object-non-existent*/); + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); } else { MmsVariableSpecification* namedVariable = MmsDomain_getNamedVariable(domain, nameIdStr); if (namedVariable == NULL) - appendErrorToResultList(values, (uint32_t) DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT /* object-non-existent*/); + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); else addNamedVariableToResultList(namedVariable, domain, nameIdStr, values, connection, alternateAccess); @@ -549,7 +557,7 @@ handleReadListOfVariablesRequest( MmsVariableSpecification* namedVariable = MmsDevice_getNamedVariable(MmsServer_getDevice(connection->server), nameIdStr); if (namedVariable == NULL) - appendErrorToResultList(values, 10 /* object-non-existent*/); + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); else addNamedVariableToResultList(namedVariable, (MmsDomain*) MmsServer_getDevice(connection->server), nameIdStr, values, connection, alternateAccess); @@ -558,7 +566,7 @@ handleReadListOfVariablesRequest( #endif /* (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) */ else { - appendErrorToResultList(values, (uint32_t) DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT /* object-non-existent*/); + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ object name type not supported!\n"); } @@ -617,6 +625,14 @@ createNamedVariableListResponse(MmsServerConnection connection, MmsNamedVariable deleteValueList(values); } +/** + * \brief implements access to named variable lists (data sets) + * + * \param connection the client connection that received the request + * \param read read request information + * \param invokeId the invoke ID of the confirmed request PDU + * \param response byte buffer to encode the response + */ static void handleReadNamedVariableListRequest( MmsServerConnection connection, diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index fabc6213..67644571 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -36,47 +36,98 @@ * MMS Common support functions *********************************************************************************************/ -void -mmsMsg_createMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response) +#define MMS_REJECT_CONFIRMED_REQUEST 1 +#define MMS_REJECT_CONFIRMED_RESPONSE 2 +#define MMS_REJECT_CONFIRMED_ERROR 3 +#define MMS_REJECT_UNCONFIRMED 4 +#define MMS_REJECT_PDU_ERROR 5 +#define MMS_REJECT_CANCEL_REQUEST 6 +#define MMS_REJECT_CANCEL_RESPONSE 7 +#define MMS_REJECT_CANCEL_ERROR 8 +#define MMS_REJECT_CONCLUDE_REQUEST 9 +#define MMS_REJECT_CONCLUDE_RESPONSE 10 +#define MMS_REJECT_CONCLUDE_ERROR 11 + +#define MMS_REJECT_CONFIRMED_REQUEST_OTHER 0 +#define MMS_REJECT_CONFIRMED_REQUEST_UNRECOGNIZED_SERVICE 1 +#define MMS_REJECT_CONFIRMED_REQUEST_UNRECOGNIZED_MODIFIER 2 +#define MMS_REJECT_CONFIRMED_REQUEST_INVALID_INVOKE_ID 3 +#define MMS_REJECT_CONFIRMED_REQUEST_INVALID_ARGUMENT 4 +#define MMS_REJECT_CONFIRMED_REQUEST_INVALID_MODIFIER 5 +#define MMS_REJECT_CONFIRMED_REQUEST_MAX_SERV_OUTSTANDING_EXCEEDED 6 +#define MMS_REJECT_CONFIRMED_REQUEST_MAX_RECURSION_EXCEEDED 8 +#define MMS_REJECT_CONFIRMED_REQUEST_VALUE_OUT_OF_RANGE 9 + +#define MMS_REJECT_PDU_ERROR_UNKNOWN_PDU_TYPE 0 +#define MMS_REJECT_PDU_ERROR_INVALID_PDU 1 +#define MMS_REJECT_PDU_ERROR_ILLEGAL_ACSI_MAPPING 2 + + +static void +mmsMsg_encodeMmsRejectPdu(uint32_t* invokeId, int rejectType, int rejectReason, ByteBuffer* response) { - MmsPdu_t* mmsPdu = (MmsPdu_t*) GLOBAL_CALLOC(1, sizeof(MmsPdu_t)); + int bufPos = 0; + uint8_t* buffer = response->buffer; - mmsPdu->present = MmsPdu_PR_rejectPDU; + uint32_t invokeIdLength = 0; - if (invokeId != NULL) { - mmsPdu->choice.rejectPDU.originalInvokeID = (Unsigned32_t*) GLOBAL_CALLOC(1, sizeof(Unsigned32_t)); - asn_long2INTEGER(mmsPdu->choice.rejectPDU.originalInvokeID, *invokeId); - } + uint32_t rejectPduLength = 3; - if (reason == MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE) { - mmsPdu->choice.rejectPDU.rejectReason.present = RejectPDU__rejectReason_PR_confirmedRequestPDU; - mmsPdu->choice.rejectPDU.rejectReason.choice.confirmedResponsePDU = - RejectPDU__rejectReason__confirmedRequestPDU_unrecognizedService; - } - else if(reason == MMS_ERROR_REJECT_UNKNOWN_PDU_TYPE) { - mmsPdu->choice.rejectPDU.rejectReason.present = RejectPDU__rejectReason_PR_pduError; - asn_long2INTEGER(&mmsPdu->choice.rejectPDU.rejectReason.choice.pduError, - RejectPDU__rejectReason__pduError_unknownPduType); - } - else if (reason == MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT) { - mmsPdu->choice.rejectPDU.rejectReason.present = RejectPDU__rejectReason_PR_confirmedRequestPDU; - mmsPdu->choice.rejectPDU.rejectReason.choice.confirmedResponsePDU = - RejectPDU__rejectReason__confirmedRequestPDU_invalidArgument; - } - else if (reason == MMS_ERROR_REJECT_INVALID_PDU) { - mmsPdu->choice.rejectPDU.rejectReason.present = RejectPDU__rejectReason_PR_pduError; - asn_long2INTEGER(&mmsPdu->choice.rejectPDU.rejectReason.choice.pduError, - RejectPDU__rejectReason__pduError_invalidPdu); - } - else { - mmsPdu->choice.rejectPDU.rejectReason.present = RejectPDU__rejectReason_PR_confirmedRequestPDU; - mmsPdu->choice.rejectPDU.rejectReason.choice.confirmedResponsePDU = - RejectPDU__rejectReason__confirmedRequestPDU_other; - } + if (invokeId != NULL) { + invokeIdLength = BerEncoder_UInt32determineEncodedSize(*invokeId); + rejectPduLength += 2 + invokeIdLength; + } + + /* Encode reject PDU */ + bufPos = BerEncoder_encodeTL(0xa4, rejectPduLength, buffer, bufPos); + + if (invokeId != NULL) { + /* original invokeId */ + bufPos = BerEncoder_encodeTL(0x80, invokeIdLength, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(*invokeId, buffer, bufPos); + } + + buffer[bufPos++] = (uint8_t) (0x80 + rejectType); + buffer[bufPos++] = 0x01; + buffer[bufPos++] = (uint8_t) rejectReason; - der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response); + response->size = bufPos; +} + +void +mmsMsg_createMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response) +{ + int rejectType = 0; + int rejectReason = 0; + + switch (reason) { + + case MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE: + rejectType = MMS_REJECT_CONFIRMED_REQUEST; + rejectReason = MMS_REJECT_CONFIRMED_REQUEST_UNRECOGNIZED_SERVICE; + break; + + case MMS_ERROR_REJECT_UNKNOWN_PDU_TYPE: + rejectType = MMS_REJECT_PDU_ERROR; + rejectReason = MMS_REJECT_PDU_ERROR_UNKNOWN_PDU_TYPE; + break; + + case MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT: + rejectType = MMS_REJECT_CONFIRMED_REQUEST; + rejectReason = MMS_REJECT_CONFIRMED_REQUEST_INVALID_ARGUMENT; + break; + + case MMS_ERROR_REJECT_INVALID_PDU: + rejectType = MMS_REJECT_PDU_ERROR; + rejectReason = MMS_REJECT_PDU_ERROR_INVALID_PDU; + break; + + default: + rejectType = MMS_REJECT_CONFIRMED_REQUEST; + rejectReason = MMS_REJECT_CONFIRMED_REQUEST_OTHER; + } - asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); + mmsMsg_encodeMmsRejectPdu(invokeId, rejectType, rejectReason, response); } /********************************************************************************************** diff --git a/src/mms/iso_mms/server/mms_write_service.c b/src/mms/iso_mms/server/mms_write_service.c index 7014e217..b3364dcd 100644 --- a/src/mms/iso_mms/server/mms_write_service.c +++ b/src/mms/iso_mms/server/mms_write_service.c @@ -1,7 +1,7 @@ /* * mms_write_service.c * - * Copyright 2013 Michael Zillgith + * Copyright 2013-2017 Michael Zillgith * * This file is part of libIEC61850. * @@ -30,46 +30,54 @@ #define CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS 100 -/********************************************************************************************** - * MMS Write Service - *********************************************************************************************/ - -int +void mmsServer_createMmsWriteResponse(MmsServerConnection connection, - int invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults) + uint32_t invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults) { - //TODO remove asn1c code - MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId); + int bufPos = 0; + uint8_t* buffer = response->buffer; - mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present = - ConfirmedServiceResponse_PR_write; + /* Determine length fields */ - WriteResponse_t* writeResponse = - &(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.choice.write); + uint32_t invokeIdLength = BerEncoder_UInt32determineEncodedSize(invokeId); - writeResponse->list.count = numberOfItems; - writeResponse->list.size = numberOfItems; - writeResponse->list.array = (struct WriteResponse__Member**) GLOBAL_CALLOC(numberOfItems, - sizeof(struct WriteResponse__Member*)); + uint32_t accessResultsLength = 0; - int i; + int i; + for (i = 0; i < numberOfItems; i++) { + if (accessResults[i] < 0) + accessResultsLength += 2; + else + accessResultsLength += 3; + } - for (i = 0; i < numberOfItems; i++) { - writeResponse->list.array[i] = (struct WriteResponse__Member*) GLOBAL_CALLOC(1, sizeof(struct WriteResponse__Member)); + uint32_t writeResponseLength = 2 + invokeIdLength + + 1 + BerEncoder_determineLengthSize(accessResultsLength) + + accessResultsLength; - if (accessResults[i] == DATA_ACCESS_ERROR_SUCCESS) - writeResponse->list.array[i]->present = WriteResponse__Member_PR_success; - else { - writeResponse->list.array[i]->present = WriteResponse__Member_PR_failure; - asn_long2INTEGER(&writeResponse->list.array[i]->choice.failure, (long) accessResults[i]); - } - } + /* Encode write response */ - der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response); + bufPos = BerEncoder_encodeTL(0xa1, writeResponseLength, buffer, bufPos); - asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); + /* invokeId */ + bufPos = BerEncoder_encodeTL(0x02, invokeIdLength, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32(invokeId, buffer, bufPos); + + bufPos = BerEncoder_encodeTL(0xa5, accessResultsLength, buffer, bufPos); + + for (i = 0; i < numberOfItems; i++) { + if (accessResults[i] < 0) { + buffer[bufPos++] = 0x81; + buffer[bufPos++] = 0x00; + } + else { + buffer[bufPos++] = 0x80; + buffer[bufPos++] = 0x01; + buffer[bufPos++] = (uint8_t) accessResults[i]; + } + } - return 0; + response->size = bufPos; } @@ -87,6 +95,376 @@ MmsServerConnection_sendWriteResponse(MmsServerConnection self, uint32_t invokeI MmsServer_releaseTransmitBuffer(self->server); } + +typedef struct { + uint8_t type; /* 0 = vmd-specific, 1 = domain-specific, 2 = association-specific */ + uint8_t* name; + uint8_t nameLength; + uint8_t* domain; + uint8_t domainLength; +} _MmsObjectName; + +/** + * \brief Decode MMS ObjectName + * + * \return true = valid data, false = decoding error + */ +static bool +decodeObjectName(uint8_t* buffer, int bufPos, int length, int* endPos, _MmsObjectName* objName) +{ + int dataEndBufPos = bufPos + length; + + uint8_t tag = buffer[bufPos++]; + + int dataLength; + + bufPos = BerDecoder_decodeLength(buffer, &dataLength, bufPos, dataEndBufPos); + + printf(" decodeObjectName - bufPos: %i endPos: %i tag: %02x\n", bufPos, bufPos + dataLength, tag); + + if (bufPos == -1) + return false; + + switch (tag) { + case 0x80: /* VMD specific */ + objName->type = 0; + objName->name = buffer + bufPos; + objName->nameLength = dataLength; + objName->domain = NULL; + if (bufPos + dataLength > dataEndBufPos) + return false; + + bufPos += dataLength; + break; + + case 0xa1: /* domain specific */ + objName->type = 1; + { + if (buffer[bufPos++] != 0x1a) + return false; + + int nameLength; + + bufPos = BerDecoder_decodeLength(buffer, &nameLength, bufPos, dataEndBufPos); + + if (bufPos == -1) + return false; + + objName->domainLength = nameLength; + objName->domain = buffer + bufPos; + + if (bufPos + nameLength >= dataEndBufPos) + return false; + + bufPos += nameLength; + + if (buffer[bufPos++] != 0x1a) + return false; + + bufPos = BerDecoder_decodeLength(buffer, &nameLength, bufPos, dataEndBufPos); + + objName->nameLength = nameLength; + objName->name = buffer + bufPos; + + if (bufPos + nameLength > dataEndBufPos) + return false; + + bufPos += nameLength; + } + break; + + case 0x82: /* association specific */ + objName->type = 2; + objName->name = buffer + bufPos; + objName->nameLength = dataLength; + objName->domain = NULL; + if (bufPos + dataLength > dataEndBufPos) + return false; + + bufPos += dataLength; + break; + } + + if (endPos != NULL) + *endPos = bufPos; + + return true; +} + +static bool +decodeVarSpec(uint8_t* buffer, int bufPos, int length, int* endPos) +{ + int dataEndBufPos = bufPos + length; + + uint8_t tag = buffer[bufPos++]; + + printf(" varSpec - bufPos: %i endPos: %i tag: %02x\n", bufPos - 1, bufPos + length, tag); + + if (tag != 0x30) + return false; + + int dataLength; + + bufPos = BerDecoder_decodeLength(buffer, &dataLength, bufPos, dataEndBufPos); + + printf("dataLength = %i - bufPos: %i\n", dataLength, bufPos); + + if (bufPos < 0) + return false; + + tag = buffer[bufPos++]; + + printf(" varSpec - bufPos: %i endPos: %i tag: %02x\n", bufPos - 1, bufPos + length, tag); + + if (tag != 0xa0) + return false; + + bufPos = BerDecoder_decodeLength(buffer, &dataLength, bufPos, dataEndBufPos); + + if (bufPos < 0) + return false; + + printf("dataLength = %i - bufPos: %i\n", dataLength, bufPos); + + _MmsObjectName objName; + + if (decodeObjectName(buffer, bufPos, bufPos + dataLength, &bufPos, &objName) == false) + return false; + + if (objName.domain != NULL) + printf("domain name: %.*s\n", objName.domainLength, objName.domain); + if (objName.name != NULL) + printf("item name: %.*s\n", objName.nameLength, objName.name); + + if (endPos != NULL) + *endPos = bufPos; + + return true; +} + +void +mmsServer_handleWriteRequest2( + MmsServerConnection connection, + uint8_t* buffer, int bufPos, int maxBufPos, + uint32_t invokeId, + ByteBuffer* response) +{ + + bool isAccessSpecification = true; + + while (bufPos < maxBufPos) { + uint8_t tag = buffer[bufPos++]; + int length; + + bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); + + if (bufPos < 0) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + return; + } + + if (tag == 0xa1) { /* variable access specification - variable list name (data set) */ + isAccessSpecification = false; + + + } + if (tag == 0xa0) { + if (isAccessSpecification) { /* variable access specification - list of variable names */ + printf("VAR ACCESS SPEC\n"); + + isAccessSpecification = false; + + int dataBufPos = bufPos; + + while (dataBufPos < (bufPos + length)) { + + + if (decodeVarSpec(buffer, dataBufPos, length, &dataBufPos) == false) { + printf("Failed to decode MMS var access spec\n"); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + return; + } + } + } + else { + printf("LIST OF DATA\n"); + + + int dataBufPos = bufPos; + + while (dataBufPos < (bufPos + length)) { + printf("lod - dataBufPos: %i endPos: %i\n", dataBufPos, bufPos + length); + + MmsValue* newValue = MmsValue_decodeMmsData(buffer, dataBufPos, length, &dataBufPos); + + if (newValue != NULL) { + printf(" Decoded MMS data value:\n"); + + uint8_t printBuf[1024]; + + MmsValue_printToBuffer(newValue, printBuf, 1024); + + printf(" %s\n", printBuf); + } + else { + //TODO cleanup already decoded MmsValue instances + printf(" Failed to decode MMS data value\n"); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + return; + } + } + } + } + + bufPos += length; + } +} + +static void +createWriteNamedVariableListResponse( + MmsServerConnection connection, + WriteRequest_t* writeRequest, + uint32_t invokeId, + MmsNamedVariableList namedList, + ByteBuffer* response) +{ + bool sendResponse = true; + + LinkedList variables = MmsNamedVariableList_getVariableList(namedList); + + int numberOfWriteItems = LinkedList_size(variables); + + if (numberOfWriteItems > CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_OTHER, response); + return; + } + + /* write variables and send response */ + + MmsDataAccessError accessResults[CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS * sizeof(MmsDataAccessError)]; + + LinkedList element; + + int i = 0; + + for (element = LinkedList_getNext(variables); element != NULL; element = LinkedList_getNext(element)) { + MmsNamedVariableListEntry variableListEntry = (MmsNamedVariableListEntry) LinkedList_getData(element); + + MmsDomain* variableDomain = MmsNamedVariableListEntry_getDomain(variableListEntry); + char* variableName = MmsNamedVariableListEntry_getVariableName(variableListEntry); + + MmsValue* oldValue = mmsServer_getValue(connection->server, variableDomain, variableName, connection); + + Data_t* dataElement = writeRequest->listOfData.list.array[i]; + + MmsValue* newValue = mmsMsg_parseDataElement(dataElement); + + if (newValue == NULL) { + accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT; + } + else if (MmsValue_equalTypes(oldValue, newValue) == false) { + MmsValue_delete(newValue); + accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; + } + else { + MmsDataAccessError valueIndication = + mmsServer_setValue(connection->server, variableDomain, variableName, newValue, connection); + + accessResults[i] = valueIndication; + + if (valueIndication == DATA_ACCESS_ERROR_NO_RESPONSE) + sendResponse = false; + + MmsValue_delete(newValue); + } + + i++; + } + + if (sendResponse) + mmsServer_createMmsWriteResponse(connection, invokeId, response, numberOfWriteItems, accessResults); +} + +static void +handleWriteNamedVariableListRequest( + MmsServerConnection connection, + WriteRequest_t* writeRequest, + uint32_t invokeId, + ByteBuffer* response) +{ + if (writeRequest->variableAccessSpecification.choice.variableListName.present == ObjectName_PR_domainspecific) + { + char domainIdStr[65]; + char nameIdStr[65]; + + mmsMsg_copyAsn1IdentifierToStringBuffer(writeRequest->variableAccessSpecification.choice.variableListName.choice.domainspecific.domainId, + domainIdStr, 65); + + mmsMsg_copyAsn1IdentifierToStringBuffer(writeRequest->variableAccessSpecification.choice.variableListName.choice.domainspecific.itemId, + nameIdStr, 65); + + MmsDomain* domain = MmsDevice_getDomain(MmsServer_getDevice(connection->server), domainIdStr); + + if (domain == NULL) { + if (DEBUG_MMS_SERVER) + printf("MMS write: domain %s not found!\n", domainIdStr); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + + return; + } + else { + MmsNamedVariableList namedList = MmsDomain_getNamedVariableList(domain, nameIdStr); + + if (namedList != NULL) { + createWriteNamedVariableListResponse(connection, writeRequest, invokeId, namedList, response); + } + else { + if (DEBUG_MMS_SERVER) printf("MMS write: named variable list %s not found!\n", nameIdStr); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + } + } + + } + else if (writeRequest->variableAccessSpecification.choice.variableListName.present == ObjectName_PR_vmdspecific) { + char listName[65]; + + mmsMsg_copyAsn1IdentifierToStringBuffer(writeRequest->variableAccessSpecification.choice.variableListName.choice.vmdspecific, + listName, 65); + + MmsNamedVariableList namedList = mmsServer_getNamedVariableListWithName(connection->server->device->namedVariableLists, listName); + + if (namedList != NULL) { + createWriteNamedVariableListResponse(connection, writeRequest, invokeId, namedList, response); + } + else { + if (DEBUG_MMS_SERVER) printf("MMS write: vmd specific named variable list %s not found!\n", listName); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + } + } +#if (MMS_DYNAMIC_DATA_SETS == 1) + else if (writeRequest->variableAccessSpecification.choice.variableListName.present == ObjectName_PR_aaspecific) { + char listName[65]; + + mmsMsg_copyAsn1IdentifierToStringBuffer(writeRequest->variableAccessSpecification.choice.variableListName.choice.aaspecific, + listName, 65); + + MmsNamedVariableList namedList = MmsServerConnection_getNamedVariableList(connection, listName); + + if (namedList != NULL) { + createWriteNamedVariableListResponse(connection, writeRequest, invokeId, namedList, response); + } + else { + if (DEBUG_MMS_SERVER) printf("MMS write: association specific named variable list %s not found!\n", listName); + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + } + } +#endif /* (MMS_DYNAMIC_DATA_SETS == 1) */ + else + mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); + +} + + void mmsServer_handleWriteRequest( MmsServerConnection connection, @@ -94,8 +472,6 @@ mmsServer_handleWriteRequest( uint32_t invokeId, ByteBuffer* response) { - WriteRequest_t* writeRequest = 0; - MmsPdu_t* mmsPdu = 0; asn_dec_rval_t rval; /* Decoder return value */ @@ -107,178 +483,206 @@ mmsServer_handleWriteRequest( return; } - writeRequest = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); + WriteRequest_t* writeRequest = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); - int numberOfWriteItems = writeRequest->variableAccessSpecification.choice.listOfVariable.list.count; - - if (numberOfWriteItems < 1) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); - return; + if (writeRequest->variableAccessSpecification.present == VariableAccessSpecification_PR_variableListName) { + handleWriteNamedVariableListRequest(connection, writeRequest, invokeId, response); + goto exit_function; } + else if (writeRequest->variableAccessSpecification.present == VariableAccessSpecification_PR_listOfVariable) { - if (numberOfWriteItems > CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_OTHER, response); - return; - } + int numberOfWriteItems = writeRequest->variableAccessSpecification.choice.listOfVariable.list.count; - if (writeRequest->listOfData.list.count != numberOfWriteItems) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); - return; - } + if (numberOfWriteItems < 1) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + goto exit_function; + } - MmsDataAccessError accessResults[CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS * sizeof(MmsDataAccessError)]; + if (numberOfWriteItems > CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_OTHER, response); + goto exit_function; + } - bool sendResponse = true; + if (writeRequest->listOfData.list.count != numberOfWriteItems) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + goto exit_function; + } - int i; + MmsDataAccessError accessResults[CONFIG_MMS_WRITE_SERVICE_MAX_NUMBER_OF_WRITE_ITEMS * sizeof(MmsDataAccessError)]; - for (i = 0; i < numberOfWriteItems; i++) { - ListOfVariableSeq_t* varSpec = - writeRequest->variableAccessSpecification.choice.listOfVariable.list.array[i]; + bool sendResponse = true; - if (varSpec->variableSpecification.present != VariableSpecification_PR_name) { - accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ACCESS_UNSUPPORTED; - continue; - } + int i; - MmsVariableSpecification* variable; + for (i = 0; i < numberOfWriteItems; i++) { + ListOfVariableSeq_t* varSpec = + writeRequest->variableAccessSpecification.choice.listOfVariable.list.array[i]; - MmsDevice* device = MmsServer_getDevice(connection->server); + if (varSpec->variableSpecification.present != VariableSpecification_PR_name) { + accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ACCESS_UNSUPPORTED; + continue; + } - MmsDomain* domain = NULL; + MmsVariableSpecification* variable; - char* nameIdStr; + MmsDevice* device = MmsServer_getDevice(connection->server); - if (varSpec->variableSpecification.choice.name.present == ObjectName_PR_domainspecific) { - Identifier_t domainId = varSpec->variableSpecification.choice.name.choice.domainspecific.domainId; - char* domainIdStr = StringUtils_createStringFromBuffer(domainId.buf, domainId.size); + MmsDomain* domain = NULL; - domain = MmsDevice_getDomain(device, domainIdStr); + char nameIdStr[65]; - GLOBAL_FREEMEM(domainIdStr); + if (varSpec->variableSpecification.choice.name.present == ObjectName_PR_domainspecific) { + Identifier_t domainId = varSpec->variableSpecification.choice.name.choice.domainspecific.domainId; - if (domain == NULL) { - accessResults[i] = DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT; - continue; - } + char domainIdStr[65]; - Identifier_t nameId = varSpec->variableSpecification.choice.name.choice.domainspecific.itemId; - nameIdStr = StringUtils_createStringFromBuffer(nameId.buf, nameId.size); + mmsMsg_copyAsn1IdentifierToStringBuffer(domainId, domainIdStr, 65); - variable = MmsDomain_getNamedVariable(domain, nameIdStr); - } + domain = MmsDevice_getDomain(device, domainIdStr); -#if (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) - else if (varSpec->variableSpecification.choice.name.present == ObjectName_PR_vmdspecific) { + if (domain == NULL) { + accessResults[i] = DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT; + continue; + } - Identifier_t nameId = varSpec->variableSpecification.choice.name.choice.vmdspecific; - nameIdStr = StringUtils_createStringFromBuffer(nameId.buf, nameId.size); + Identifier_t nameId = varSpec->variableSpecification.choice.name.choice.domainspecific.itemId; - variable = MmsDevice_getNamedVariable(device, nameIdStr); - } -#endif /* (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) */ + mmsMsg_copyAsn1IdentifierToStringBuffer(nameId, nameIdStr, 65); - else { - accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ACCESS_UNSUPPORTED; - continue; - } + variable = MmsDomain_getNamedVariable(domain, nameIdStr); + } - if (variable == NULL) { - GLOBAL_FREEMEM(nameIdStr); - accessResults[i] = DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT; - continue; - } + #if (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) + else if (varSpec->variableSpecification.choice.name.present == ObjectName_PR_vmdspecific) { + Identifier_t nameId = varSpec->variableSpecification.choice.name.choice.vmdspecific; - AlternateAccess_t* alternateAccess = varSpec->alternateAccess; + mmsMsg_copyAsn1IdentifierToStringBuffer(nameId, nameIdStr, 65); - if (alternateAccess != NULL) { - if (variable->type != MMS_ARRAY) { - GLOBAL_FREEMEM(nameIdStr); - accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT; - continue; + variable = MmsDevice_getNamedVariable(device, nameIdStr); } + #endif /* (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) */ - if (!mmsServer_isIndexAccess(alternateAccess)) { - GLOBAL_FREEMEM(nameIdStr); + else { accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ACCESS_UNSUPPORTED; continue; } - } - Data_t* dataElement = writeRequest->listOfData.list.array[i]; - - MmsValue* value = mmsMsg_parseDataElement(dataElement); + if (variable == NULL) { + accessResults[i] = DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT; + continue; + } - if (value == NULL) { - GLOBAL_FREEMEM(nameIdStr); - accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT; - continue; - } + AlternateAccess_t* alternateAccess = varSpec->alternateAccess; - /* Check for correct type */ - if (MmsValue_getType(value) != MmsVariableSpecification_getType(variable)) { - GLOBAL_FREEMEM(nameIdStr); - MmsValue_delete(value); - accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; - continue; - } + if (alternateAccess != NULL) { + if (variable->type != MMS_ARRAY) { + accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT; + continue; + } - if (alternateAccess != NULL) { + if (!mmsServer_isIndexAccess(alternateAccess)) { + accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ACCESS_UNSUPPORTED; + continue; + } + } - if (domain != NULL) - domain = (MmsDomain*) device; + Data_t* dataElement = writeRequest->listOfData.list.array[i]; - MmsValue* cachedArray = MmsServer_getValueFromCache(connection->server, domain, nameIdStr); + MmsValue* value = mmsMsg_parseDataElement(dataElement); - if (cachedArray == NULL) { - GLOBAL_FREEMEM(nameIdStr); - MmsValue_delete(value); + if (value == NULL) { accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT; continue; } - int index = mmsServer_getLowIndex(alternateAccess); + if (alternateAccess != NULL) { - MmsValue* elementValue = MmsValue_getElement(cachedArray, index); + if (domain == NULL) + domain = (MmsDomain*) device; + + MmsValue* cachedArray = MmsServer_getValueFromCache(connection->server, domain, nameIdStr); + + if (cachedArray == NULL) { + accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT; + goto end_of_main_loop; + } + + int index = mmsServer_getLowIndex(alternateAccess); + int numberOfElements = mmsServer_getNumberOfElements(alternateAccess); + + if (numberOfElements == 0) { /* select single array element with index */ + + MmsValue* elementValue = MmsValue_getElement(cachedArray, index); + + if (elementValue == NULL) { + accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT; + goto end_of_main_loop; + } + + if (MmsValue_update(elementValue, value) == false) { + accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; + goto end_of_main_loop; + } + } + else { /* select sub-array with start-index and number-of-elements */ + + if (MmsValue_getType(value) != MMS_ARRAY) { + accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; + goto end_of_main_loop; + } + + int elementNo; + + for (elementNo = 0; elementNo < numberOfElements; elementNo++) { + MmsValue* newElement = MmsValue_getElement(value, elementNo); + MmsValue* elementValue = MmsValue_getElement(cachedArray, index++); + + if ((elementValue == NULL) || (newElement == NULL) ) { + accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; + goto end_of_main_loop; + } + + if (MmsValue_update(elementValue, newElement) == false) { + accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; + goto end_of_main_loop; + } + + } + } + + accessResults[i] = DATA_ACCESS_ERROR_SUCCESS; + goto end_of_main_loop; - if (elementValue == NULL) { - GLOBAL_FREEMEM(nameIdStr); - MmsValue_delete(value); - accessResults[i] = DATA_ACCESS_ERROR_OBJECT_ATTRIBUTE_INCONSISTENT; - continue; } - if (MmsValue_update(elementValue, value) == false) { - GLOBAL_FREEMEM(nameIdStr); - MmsValue_delete(value); + /* Check for correct type */ + if (MmsValue_getType(value) != MmsVariableSpecification_getType(variable)) { accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; - continue; + goto end_of_main_loop; } - GLOBAL_FREEMEM(nameIdStr); - MmsValue_delete(value); - accessResults[i] = DATA_ACCESS_ERROR_SUCCESS; - continue; - - } + MmsDataAccessError valueIndication = + mmsServer_setValue(connection->server, domain, nameIdStr, value, connection); - MmsDataAccessError valueIndication = - mmsServer_setValue(connection->server, domain, nameIdStr, value, connection); + if (valueIndication == DATA_ACCESS_ERROR_NO_RESPONSE) + sendResponse = false; - if (valueIndication == DATA_ACCESS_ERROR_NO_RESPONSE) - sendResponse = false; + accessResults[i] = valueIndication; - accessResults[i] = valueIndication; +end_of_main_loop: - MmsValue_delete(value); - - GLOBAL_FREEMEM(nameIdStr); - } + MmsValue_delete(value); + } - if (sendResponse) { - mmsServer_createMmsWriteResponse(connection, invokeId, response, numberOfWriteItems, accessResults); + if (sendResponse) + mmsServer_createMmsWriteResponse(connection, invokeId, response, numberOfWriteItems, accessResults); + } + else { /* unknown request type */ + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + goto exit_function; } +exit_function: asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); } diff --git a/src/sampled_values/sv_subscriber.c b/src/sampled_values/sv_subscriber.c index 3f5333e3..5ebaadb3 100644 --- a/src/sampled_values/sv_subscriber.c +++ b/src/sampled_values/sv_subscriber.c @@ -67,6 +67,7 @@ struct sSVClientASDU { uint8_t* smpCnt; uint8_t* confRev; + uint8_t* refrTm; uint8_t* smpSynch; @@ -232,6 +233,10 @@ parseASDU(SVReceiver self, SVSubscriber subscriber, uint8_t* buffer, int length) asdu.confRev = buffer + bufPos; break; + case 0x84: + asdu.refrTm = buffer + bufPos; + break; + case 0x85: asdu.smpSynch = buffer + bufPos; break; @@ -491,6 +496,52 @@ SVClientASDU_getSmpCnt(SVClientASDU self) return retVal; } +static uint64_t +decodeUtcTime(uint8_t* buffer, uint8_t* timeQuality) +{ + uint32_t timeval32; + + timeval32 = buffer[3]; + timeval32 += buffer[2] * 0x100; + timeval32 += buffer[1] * 0x10000; + timeval32 += buffer[0] * 0x1000000; + + uint32_t msVal; + + uint32_t fractionOfSecond; + + fractionOfSecond = buffer[6]; + fractionOfSecond += buffer[5] * 0x100; + fractionOfSecond += buffer[4] * 0x10000; + + msVal = (uint32_t) (((uint64_t) fractionOfSecond * 1000) / 16777215); + + if (timeQuality != NULL) + *timeQuality = buffer[7]; + + uint64_t timeval64 = (uint64_t) timeval32 * 1000 + (uint64_t) msVal; + + return timeval64; +} + +uint64_t +SVClientASDU_getRefrTmAsMs(SVClientASDU self) +{ + uint64_t msTime = 0; + + if (self->refrTm != NULL) + msTime = decodeUtcTime(self->refrTm, NULL); + + return msTime; +} + +bool +SVClientASDU_hasRefrTm(SVClientASDU self) +{ + return (self->refrTm != NULL); +} + + const char* SVClientASDU_getSvId(SVClientASDU self) { diff --git a/src/sampled_values/sv_subscriber.h b/src/sampled_values/sv_subscriber.h index c463e5bd..eefcbaa4 100644 --- a/src/sampled_values/sv_subscriber.h +++ b/src/sampled_values/sv_subscriber.h @@ -268,6 +268,26 @@ SVClientASDU_getSvId(SVClientASDU self); uint32_t SVClientASDU_getConfRev(SVClientASDU self); +/** + * \brief Check if RefrTm value is included in the SV ASDU + * + * \param self ASDU object instance + * + * \return true if RefrTm value is present, false otherwise + */ +bool +SVClientASDU_hasRefrTm(SVClientASDU self); + +/** + * \brief Get the RefrTim value included in SV ASDU as ms timestamp + * + * \param self ASDU object instance + * + * \return the time value as ms timestamp or 0 if RefrTm is not present in the SV ASDU + */ +uint64_t +SVClientASDU_getRefrTmAsMs(SVClientASDU self); + /** * \brief Get an INT8 data value in the data part of the ASDU * diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index c3a28922..228dab86 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -569,4 +569,5 @@ EXPORTS IedConnection_setFilestoreBasepath IedServer_setFilestoreBasepath IedModel_getDeviceByInst - + MmsConnection_writeNamedVariableList + IedConnection_writeDataSetValues \ No newline at end of file diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 52e6cbfc..87146bd9 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -648,4 +648,7 @@ EXPORTS IedServer_setFilestoreBasepath GooseReceiver_isRunning IedModel_getDeviceByInst - \ No newline at end of file + MmsConnection_writeNamedVariableList + SVClientASDU_hasRefrTm + SVClientASDU_getRefrTmAsMs + IedConnection_writeDataSetValues From 17bc388ae58065103c7f9d326f2c7c9b3555217e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 25 Aug 2017 08:31:35 +0200 Subject: [PATCH 22/64] - updated CHANGELOG for release 1.1.0 --- CHANGELOG | 15 +++++++++++++++ src/common/inc/libiec61850_platform_includes.h | 2 +- src/mms/iso_acse/acse.c | 1 - src/mms/iso_mms/client/mms_client_write.c | 2 +- src/mms/iso_mms/server/mms_write_service.c | 3 ++- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index de833d8a..f0245329 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,18 @@ +Changes to version 1.1.0 +------------------------ + +- MMS client/server: added write support for named variable lists +- IEC 61850 client/server: added support for SetDataSet service +- C# API: client - added support to write data set values +- IEC 61850 client: Changed result strings of IedConnection_getDataDirectoryByFC. Removed appended FC string. +- MMS client/server: extended BER encoder to support MMS PDU sizes with more than 64k +- C# API: server - keep references to internal control handler delegates to avoid garbage collection +- IEC 61850 server: added IedModel_getDeviceByInst function +- SV subscriber: added subscriber side handling for RefrTm +- SV publisher: Changed SampledValuesPublisher_create to support setting of Communication parameters at runtime +- all: small fixes and code optimizations + + Changes to version 1.0.2 ------------------------ - server: added MmsFileAccessHandler for server side monitoring and control of file services diff --git a/src/common/inc/libiec61850_platform_includes.h b/src/common/inc/libiec61850_platform_includes.h index fcc50c6b..9130f50f 100644 --- a/src/common/inc/libiec61850_platform_includes.h +++ b/src/common/inc/libiec61850_platform_includes.h @@ -15,7 +15,7 @@ #include "platform_endian.h" -#define LIBIEC61850_VERSION "1.1" +#define LIBIEC61850_VERSION "1.1.0" #ifndef CONFIG_DEFAULT_MMS_VENDOR_NAME #define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" diff --git a/src/mms/iso_acse/acse.c b/src/mms/iso_acse/acse.c index 67f0ad15..6125003a 100644 --- a/src/mms/iso_acse/acse.c +++ b/src/mms/iso_acse/acse.c @@ -88,7 +88,6 @@ checkAuthentication(AcseConnection* self, uint8_t* authMechanism, int authMechLe } - static int parseUserInformation(AcseConnection* self, uint8_t* buffer, int bufPos, int maxBufPos, bool* userInfoValid) { diff --git a/src/mms/iso_mms/client/mms_client_write.c b/src/mms/iso_mms/client/mms_client_write.c index 1b7353ab..ed0c6665 100644 --- a/src/mms/iso_mms/client/mms_client_write.c +++ b/src/mms/iso_mms/client/mms_client_write.c @@ -172,7 +172,7 @@ mmsClient_parseWriteResponse(ByteBuffer* message, int32_t bufPos, MmsError* mmsE uint32_t dataAccessErrorCode = BerDecoder_decodeUint32(buf, length, bufPos); - if ((dataAccessErrorCode >= 0) || (dataAccessErrorCode < 13)) { + if (dataAccessErrorCode < 13) { *mmsError = mapDataAccessErrorToMmsError(dataAccessErrorCode); retVal = (MmsDataAccessError) dataAccessErrorCode; } diff --git a/src/mms/iso_mms/server/mms_write_service.c b/src/mms/iso_mms/server/mms_write_service.c index b3364dcd..c616f4df 100644 --- a/src/mms/iso_mms/server/mms_write_service.c +++ b/src/mms/iso_mms/server/mms_write_service.c @@ -95,7 +95,7 @@ MmsServerConnection_sendWriteResponse(MmsServerConnection self, uint32_t invokeI MmsServer_releaseTransmitBuffer(self->server); } - +#if 0 typedef struct { uint8_t type; /* 0 = vmd-specific, 1 = domain-specific, 2 = association-specific */ uint8_t* name; @@ -319,6 +319,7 @@ mmsServer_handleWriteRequest2( bufPos += length; } } +#endif static void createWriteNamedVariableListResponse( From 63510d7ee872f0b56fa9fba6d9d796d868a33dfc Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 25 Aug 2017 14:57:06 +0200 Subject: [PATCH 23/64] - socket-win32: updated WSA initialization handling --- CHANGELOG | 1 + src/hal/socket/win32/socket_win32.c | 66 +++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f0245329..2fc311be 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,6 +10,7 @@ Changes to version 1.1.0 - IEC 61850 server: added IedModel_getDeviceByInst function - SV subscriber: added subscriber side handling for RefrTm - SV publisher: Changed SampledValuesPublisher_create to support setting of Communication parameters at runtime +- socket-win32: updated WSA initialization handling - all: small fixes and code optimizations diff --git a/src/hal/socket/win32/socket_win32.c b/src/hal/socket/win32/socket_win32.c index a8d65600..777d17c8 100644 --- a/src/hal/socket/win32/socket_win32.c +++ b/src/hal/socket/win32/socket_win32.c @@ -24,6 +24,7 @@ #include #include #include +#include #pragma comment (lib, "Ws2_32.lib") @@ -104,6 +105,9 @@ Handleset_destroy(HandleSet self) GLOBAL_FREEMEM(self); } +static bool wsaStartupCalled = false; +static int socketCount = 0; + static void activateKeepAlive(SOCKET s) { @@ -162,19 +166,47 @@ prepareServerAddress(const char* address, int port, struct sockaddr_in* sockaddr return true; } +static bool wsaStartUp() +{ + if (wsaStartupCalled == false) { + int ec; + WSADATA wsa; + + if ((ec = WSAStartup(MAKEWORD(2, 0), &wsa)) != 0) { + if (DEBUG_SOCKET) + printf("WIN32_SOCKET: winsock error: code %i\n", ec); + return false; + } + else { + wsaStartupCalled = true; + return true; + } + + } + else + return true; +} + +static void wsaShutdown() +{ + if (wsaStartupCalled) { + if (socketCount == 0) { + WSACleanup(); + wsaStartupCalled = false; + } + + } +} + ServerSocket TcpServerSocket_create(const char* address, int port) { ServerSocket serverSocket = NULL; int ec; - WSADATA wsa; SOCKET listen_socket = INVALID_SOCKET; - if ((ec = WSAStartup(MAKEWORD(2,0), &wsa)) != 0) { - if (DEBUG_SOCKET) - printf("WIN32_SOCKET: winsock error: code %i\n", ec); + if (wsaStartUp() == false) return NULL; - } struct sockaddr_in server_addr; @@ -190,7 +222,9 @@ TcpServerSocket_create(const char* address, int port) if (listen_socket == INVALID_SOCKET) { if (DEBUG_SOCKET) printf("WIN32_SOCKET: socket failed with error: %i\n", WSAGetLastError()); - WSACleanup(); + + wsaShutdown(); + return NULL; } @@ -203,7 +237,9 @@ TcpServerSocket_create(const char* address, int port) if (DEBUG_SOCKET) printf("WIN32_SOCKET: bind failed with error:%i\n", WSAGetLastError()); closesocket(listen_socket); - WSACleanup(); + + wsaShutdown(); + return NULL; } @@ -214,6 +250,8 @@ TcpServerSocket_create(const char* address, int port) setSocketNonBlocking((Socket) serverSocket); + socketCount++; + return serverSocket; } @@ -252,7 +290,8 @@ void ServerSocket_destroy(ServerSocket self) { closesocket(self->fd); - WSACleanup(); + socketCount--; + wsaShutdown(); GLOBAL_FREEMEM(self); } @@ -264,6 +303,8 @@ TcpSocket_create() self->fd = INVALID_SOCKET; self->connectTimeout = 5000; + socketCount++; + return self; } @@ -277,14 +318,10 @@ bool Socket_connect(Socket self, const char* address, int port) { struct sockaddr_in serverAddress; - WSADATA wsa; int ec; - if ((ec = WSAStartup(MAKEWORD(2,0), &wsa)) != 0) { - if (DEBUG_SOCKET) - printf("WIN32_SOCKET: winsock error: code %i\n", ec); + if (wsaStartUp() == false) return false; - } if (!prepareServerAddress(address, port, &serverAddress)) return false; @@ -401,5 +438,8 @@ Socket_destroy(Socket self) closesocket(self->fd); } + socketCount--; + wsaShutdown(); + GLOBAL_FREEMEM(self); } From 0651b94be51d6e67fcb4a4fd89fdd2912e6a283e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 25 Aug 2017 15:15:44 +0200 Subject: [PATCH 24/64] - prepared for release 1.1 --- src/iec61850/server/mms_mapping/mms_mapping.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index cdd0be68..b3dab218 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -1993,12 +1993,16 @@ mmsWriteHandler(void* parameter, MmsDomain* domain, FunctionalConstraint fc = getFunctionalConstraintForWritableNode(self, separator); #if (CONFIG_IEC61850_SETTING_GROUPS == 1) - if (fc == IEC61850_FC_SE) { - SettingGroup* sg = getSettingGroupByMmsDomain(self, domain); + if (fc == IEC61850_FC_SE) { + SettingGroup* sg = getSettingGroupByMmsDomain(self, domain); - if (sg->editingClient != (ClientConnection) connection) - return DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; - } + if (sg != NULL) { + if (sg->editingClient != (ClientConnection) connection) + return DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; + } + else + return DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT; + } #endif /* (CONFIG_IEC61850_SETTING_GROUPS == 1) */ /* writable data model elements - SP, SV, CF, DC */ From fe8deb9a0ade07f61a5e53f50d6a0a295c5e3575 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 5 Sep 2017 12:09:03 +0200 Subject: [PATCH 25/64] - Java SCL parser: added support for "Val" elements for Octet64 types --- tools/model_generator/genmodel.jar | Bin 88161 -> 88749 bytes .../libiec61850/scl/model/DataModelValue.java | 11 +++++++ .../tools/StaticModelGenerator.java | 29 ++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/tools/model_generator/genmodel.jar b/tools/model_generator/genmodel.jar index aa36640bb54d6afe0faa915ae672774970e26c27..6c45543a5955fce6e250f35cd2c183409d70b2e4 100644 GIT binary patch delta 24543 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 GjQ;}xCx#jT delta 23922 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 Date: Fri, 15 Sep 2017 17:52:40 +0200 Subject: [PATCH 26/64] - MMS client: improved error handling --- src/mms/inc/mms_common.h | 1 + .../iso_mms/client/mms_client_connection.c | 338 ++++-------------- 2 files changed, 78 insertions(+), 261 deletions(-) diff --git a/src/mms/inc/mms_common.h b/src/mms/inc/mms_common.h index c1a8169e..10e35379 100644 --- a/src/mms/inc/mms_common.h +++ b/src/mms/inc/mms_common.h @@ -46,6 +46,7 @@ typedef enum MMS_ERROR_HARDWARE_FAULT = 5, MMS_ERROR_CONCLUDE_REJECTED = 6, MMS_ERROR_INVALID_ARGUMENTS = 7, + MMS_ERROR_OUTSTANDING_CALL_LIMIT = 8, MMS_ERROR_OTHER = 9, diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 128c8100..041748a1 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -281,7 +281,7 @@ removeFromOutstandingCalls(MmsConnection self, uint32_t invokeId) } static ByteBuffer* -sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* message) +sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* message, MmsError* mmsError) { ByteBuffer* receivedMessage = NULL; @@ -291,7 +291,12 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* bool success = false; - addToOutstandingCalls(self, invokeId); + if (addToOutstandingCalls(self, invokeId) == false) { + *mmsError = MMS_ERROR_OUTSTANDING_CALL_LIMIT; + return NULL; + } + + *mmsError = MMS_ERROR_NONE; #if (CONFIG_MMS_RAW_MESSAGE_LOGGING == 1) if (self->rawMmsMessageHandler != NULL) { @@ -305,8 +310,10 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* while (currentTime < waitUntilTime) { uint32_t receivedInvokeId; - if (self->associationState == MMS_STATE_CLOSED) + if (self->associationState == MMS_STATE_CLOSED) { + *mmsError = MMS_ERROR_CONNECTION_LOST; goto connection_lost; + } Semaphore_wait(self->lastResponseLock); @@ -331,7 +338,14 @@ sendRequestAndWaitForResponse(MmsConnection self, uint32_t invokeId, ByteBuffer* if (!success) { if (DEBUG_MMS_CLIENT) printf("MMS_CLIENT: TIMEOUT for request %u: \n", invokeId); - self->lastResponseError = MMS_ERROR_SERVICE_TIMEOUT; + + *mmsError = MMS_ERROR_SERVICE_TIMEOUT; + } + else { + *mmsError = self->lastResponseError; + + if (*mmsError != MMS_ERROR_NONE) + receivedMessage = NULL; } connection_lost: @@ -1248,8 +1262,6 @@ mmsClient_getNameListSingleRequest( goto exit_function; } - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); @@ -1267,19 +1279,13 @@ mmsClient_getNameListSingleRequest( payload, objectClass, continueAfter); } - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); if (responseMessage != NULL) moreFollows = mmsClient_parseGetNameListResponse(nameList, self->lastResponse, NULL); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return moreFollows; } @@ -1361,24 +1367,17 @@ MmsConnection_readVariable(MmsConnection self, MmsError* mmsError, ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createReadRequest(invokeId, domainId, itemId, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) value = mmsClient_parseReadResponse(self->lastResponse, NULL, false); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return value; } @@ -1397,25 +1396,18 @@ MmsConnection_readArrayElements(MmsConnection self, MmsError* mmsError, ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createReadRequestAlternateAccessIndex(invokeId, domainId, itemId, startIndex, numberOfElements, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) value = mmsClient_parseReadResponse(self->lastResponse, NULL, false); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return value; } @@ -1433,24 +1425,17 @@ MmsConnection_readMultipleVariables(MmsConnection self, MmsError* mmsError, ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createReadRequestMultipleValues(invokeId, domainId, items, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) value = mmsClient_parseReadResponse(self->lastResponse, NULL, true); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return value; } @@ -1469,27 +1454,18 @@ MmsConnection_readNamedVariableListValues(MmsConnection self, MmsError* mmsError ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createReadNamedVariableListRequest(invokeId, domainId, listName, payload, specWithResult); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) { - *mmsError = self->lastResponseError; - } - else if (responseMessage != NULL) { + if (responseMessage != NULL) value = mmsClient_parseReadResponse(self->lastResponse, NULL, true); - } releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return value; } @@ -1509,25 +1485,18 @@ MmsConnection_readNamedVariableListValuesAssociationSpecific( ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createReadAssociationSpecificNamedVariableListRequest(invokeId, listName, payload, specWithResult); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) value = mmsClient_parseReadResponse(self->lastResponse, NULL, true); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return value; } @@ -1545,26 +1514,19 @@ MmsConnection_readNamedVariableListDirectory(MmsConnection self, MmsError* mmsEr ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createGetNamedVariableListAttributesRequest(invokeId, payload, domainId, listName); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) attributes = mmsClient_parseGetNamedVariableListAttributesResponse(self->lastResponse, NULL, deletable); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return attributes; } @@ -1582,26 +1544,19 @@ MmsConnection_readNamedVariableListDirectoryAssociationSpecific(MmsConnection se ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createGetNamedVariableListAttributesRequestAssociationSpecific(invokeId, payload, listName); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) attributes = mmsClient_parseGetNamedVariableListAttributesResponse(self->lastResponse, NULL, deletable); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return attributes; } @@ -1617,26 +1572,19 @@ MmsConnection_defineNamedVariableList(MmsConnection self, MmsError* mmsError, ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createDefineNamedVariableListRequest(invokeId, payload, domainId, listName, variableSpecs, false); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) if (!mmsClient_parseDefineNamedVariableResponse(self->lastResponse, NULL)) - *mmsError = MMS_ERROR_DEFINITION_OTHER; + *mmsError = MMS_ERROR_PARSING_RESPONSE; releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return; } @@ -1652,25 +1600,19 @@ MmsConnection_defineNamedVariableListAssociationSpecific(MmsConnection self, ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createDefineNamedVariableListRequest(invokeId, payload, NULL, listName, variableSpecs, true); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) if (!mmsClient_parseDefineNamedVariableResponse(self->lastResponse, NULL)) - *mmsError = MMS_ERROR_DEFINITION_OTHER; + *mmsError = MMS_ERROR_PARSING_RESPONSE; releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; exit_function: return; @@ -1689,25 +1631,18 @@ MmsConnection_deleteNamedVariableList(MmsConnection self, MmsError* mmsError, ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createDeleteNamedVariableListRequest(invokeId, payload, domainId, listName); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) if (mmsClient_parseDeleteNamedVariableListResponse(self->lastResponse, NULL)) isDeleted = true; releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return isDeleted; } @@ -1725,26 +1660,19 @@ MmsConnection_deleteAssociationSpecificNamedVariableList(MmsConnection self, ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createDeleteAssociationSpecificNamedVariableListRequest( invokeId, payload, listName); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) if (mmsClient_parseDeleteNamedVariableListResponse(self->lastResponse, NULL)) isDeleted = true; releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return isDeleted; } @@ -1762,24 +1690,17 @@ MmsConnection_getVariableAccessAttributes(MmsConnection self, MmsError* mmsError ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createGetVariableAccessAttributesRequest(invokeId, domainId, itemId, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) typeSpec = mmsClient_parseGetVariableAccessAttributesResponse(self->lastResponse, NULL); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return typeSpec; } @@ -1796,24 +1717,17 @@ MmsConnection_identify(MmsConnection self, MmsError* mmsError) ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createIdentifyRequest(invokeId, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) identity = mmsClient_parseIdentifyResponse(self); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - exit_function: return identity; } @@ -1824,41 +1738,28 @@ MmsConnection_getServerStatus(MmsConnection self, MmsError* mmsError, int* vmdLo { ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createStatusRequest(invokeId, payload, extendedDerivation); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) { + if (responseMessage != NULL) { if (mmsClient_parseStatusResponse(self, vmdLogicalStatus, vmdPhysicalStatus) == false) *mmsError = MMS_ERROR_PARSING_RESPONSE; } releaseResponse(self); - - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - - } static LinkedList readJournal(MmsConnection self, MmsError* mmsError, uint32_t invokeId, ByteBuffer* payload, bool* moreFollows) { - *mmsError = MMS_ERROR_NONE; - - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); LinkedList response = NULL; - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) { + if (responseMessage != NULL) { if (mmsClient_parseReadJournalResponse(self, moreFollows, &response) == false) *mmsError = MMS_ERROR_PARSING_RESPONSE; @@ -1866,9 +1767,6 @@ readJournal(MmsConnection self, MmsError* mmsError, uint32_t invokeId, ByteBuff releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - return response; } @@ -1972,19 +1870,15 @@ MmsConnection_fileOpen(MmsConnection self, MmsError* mmsError, const char* filen { ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); int32_t frsmId = -1; mmsClient_createFileOpenRequest(invokeId, payload, filename, initialPosition); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) { + if (responseMessage != NULL) { uint8_t* buffer = self->lastResponse->buffer; int maxBufPos = self->lastResponse->size; @@ -1996,9 +1890,6 @@ MmsConnection_fileOpen(MmsConnection self, MmsError* mmsError, const char* filen releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - return frsmId; } @@ -2007,23 +1898,15 @@ MmsConnection_fileClose(MmsConnection self, MmsError* mmsError, int32_t frsmId) { ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - - uint32_t invokeId = getNextInvokeId(self); - - mmsClient_createFileCloseRequest(invokeId, payload, frsmId); - - sendRequestAndWaitForResponse(self, invokeId, payload); + uint32_t invokeId = getNextInvokeId(self); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; + mmsClient_createFileCloseRequest(invokeId, payload, frsmId); - /* nothing to do - response contains no data to evaluate */ + sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - releaseResponse(self); + /* nothing to do - response contains no data to evaluate */ - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; + releaseResponse(self); } void @@ -2031,24 +1914,15 @@ MmsConnection_fileDelete(MmsConnection self, MmsError* mmsError, const char* fil { ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - - uint32_t invokeId = getNextInvokeId(self); - - mmsClient_createFileDeleteRequest(invokeId, payload, fileName); - - - sendRequestAndWaitForResponse(self, invokeId, payload); + uint32_t invokeId = getNextInvokeId(self); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; + mmsClient_createFileDeleteRequest(invokeId, payload, fileName); - /* nothing to do - response contains no data to evaluate */ + sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - releaseResponse(self); + /* nothing to do - response contains no data to evaluate */ - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; + releaseResponse(self); } bool @@ -2057,18 +1931,14 @@ MmsConnection_fileRead(MmsConnection self, MmsError* mmsError, int32_t frsmId, M { ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); bool moreFollows = false; mmsClient_createFileReadRequest(invokeId, payload, frsmId); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) { + if (responseMessage != NULL) { uint8_t* buffer = self->lastResponse->buffer; int maxBufPos = self->lastResponse->size; int bufPos = self->lastResponseBufPos; @@ -2079,9 +1949,6 @@ MmsConnection_fileRead(MmsConnection self, MmsError* mmsError, int32_t frsmId, M releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - return moreFollows; } @@ -2092,28 +1959,21 @@ MmsConnection_getFileDirectory(MmsConnection self, MmsError* mmsError, const cha { ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createFileDirectoryRequest(invokeId, payload, fileSpecification, continueAfter); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); bool moreFollows = false; - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) { + if (responseMessage != NULL) { if (mmsClient_parseFileDirectoryResponse(self, handler, handlerParameter, &moreFollows) == false) *mmsError = MMS_ERROR_PARSING_RESPONSE; } releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - return moreFollows; } @@ -2122,23 +1982,15 @@ MmsConnection_fileRename(MmsConnection self, MmsError* mmsError, const char* cur { ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createFileRenameRequest(invokeId, payload, currentFileName, newFileName); - sendRequestAndWaitForResponse(self, invokeId, payload); - - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; + sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); /* nothing to do - response contains no data to evaluate */ releaseResponse(self); - - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; } @@ -2147,23 +1999,15 @@ MmsConnection_obtainFile(MmsConnection self, MmsError* mmsError, const char* sou { ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createObtainFileRequest(invokeId, payload, sourceFile, destinationFile); - sendRequestAndWaitForResponse(self, invokeId, payload); - - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; + sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); /* nothing to do - response contains no data to evaluate */ releaseResponse(self); - - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; } MmsDataAccessError @@ -2175,24 +2019,17 @@ MmsConnection_writeVariable(MmsConnection self, MmsError* mmsError, ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); mmsClient_createWriteRequest(invokeId, domainId, itemId, value, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) retVal = mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - return retVal; } @@ -2202,19 +2039,15 @@ MmsConnection_writeMultipleVariables(MmsConnection self, MmsError* mmsError, con LinkedList /* */values, /* OUTPUT */LinkedList* /* */accessResults) { - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); mmsClient_createWriteMultipleItemsRequest(invokeId, domainId, items, values, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) { + if (responseMessage != NULL) { int numberOfItems = LinkedList_size(items); @@ -2223,9 +2056,6 @@ MmsConnection_writeMultipleVariables(MmsConnection self, MmsError* mmsError, con } releaseResponse(self); - - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; } MmsDataAccessError @@ -2235,26 +2065,19 @@ MmsConnection_writeArrayElements(MmsConnection self, MmsError* mmsError, { MmsDataAccessError retVal = DATA_ACCESS_ERROR_UNKNOWN; - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); mmsClient_createWriteRequestArray(invokeId, domainId, itemId, index, numberOfElements, value, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) + if (responseMessage != NULL) retVal = mmsClient_parseWriteResponse(self->lastResponse, self->lastResponseBufPos, mmsError); releaseResponse(self); - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; - return retVal; } @@ -2263,19 +2086,15 @@ MmsConnection_writeNamedVariableList(MmsConnection self, MmsError* mmsError, boo const char* domainId, const char* itemId, LinkedList /* */values, /* OUTPUT */LinkedList* /* */accessResults) { - *mmsError = MMS_ERROR_NONE; - uint32_t invokeId = getNextInvokeId(self); ByteBuffer* payload = IsoClientConnection_allocateTransmitBuffer(self->isoClient); mmsClient_createWriteRequestNamedVariableList(invokeId, isAssociationSpecific, domainId, itemId, values, payload); - ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload); + ByteBuffer* responseMessage = sendRequestAndWaitForResponse(self, invokeId, payload, mmsError); - if (self->lastResponseError != MMS_ERROR_NONE) - *mmsError = self->lastResponseError; - else if (responseMessage != NULL) { + if (responseMessage != NULL) { int numberOfItems = LinkedList_size(values); @@ -2284,9 +2103,6 @@ MmsConnection_writeNamedVariableList(MmsConnection self, MmsError* mmsError, boo } releaseResponse(self); - - if (self->associationState == MMS_STATE_CLOSED) - *mmsError = MMS_ERROR_CONNECTION_LOST; } void From c3043290ac0dfb488740f9489ba936eec2fa1a6a Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 21 Sep 2017 21:57:01 +0200 Subject: [PATCH 27/64] - MMS client: MmsConnection_getVariableAccessAttributes support for VMD specific variables --- src/mms/inc/mms_client_connection.h | 2 +- .../client/mms_client_get_var_access.c | 31 +++++++++++++------ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index 48c9c8e2..bbe0beae 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -484,7 +484,7 @@ MmsConnection_writeNamedVariableList(MmsConnection self, MmsError* mmsError, boo * * \param self MmsConnection instance to operate on * \param mmsError user provided variable to store error code - * \param domainId the domain name of the variable + * \param domainId the domain name of the variable or NULL for a VMD specific request * \param itemId name of the variable * * \return Returns a MmsTypeSpecification object or NULL if the request failed. diff --git a/src/mms/iso_mms/client/mms_client_get_var_access.c b/src/mms/iso_mms/client/mms_client_get_var_access.c index d4104af4..af926022 100644 --- a/src/mms/iso_mms/client/mms_client_get_var_access.c +++ b/src/mms/iso_mms/client/mms_client_get_var_access.c @@ -179,22 +179,35 @@ mmsClient_createGetVariableAccessAttributesRequest( request->present = GetVariableAccessAttributesRequest_PR_name; - request->choice.name.present = ObjectName_PR_domainspecific; + if (domainId != NULL) { + request->choice.name.present = ObjectName_PR_domainspecific; - request->choice.name.choice.domainspecific.domainId.buf = (uint8_t*) domainId; - request->choice.name.choice.domainspecific.domainId.size = strlen(domainId); - request->choice.name.choice.domainspecific.itemId.buf = (uint8_t*) itemId; - request->choice.name.choice.domainspecific.itemId.size = strlen(itemId); + request->choice.name.choice.domainspecific.domainId.buf = (uint8_t*) domainId; + request->choice.name.choice.domainspecific.domainId.size = strlen(domainId); + request->choice.name.choice.domainspecific.itemId.buf = (uint8_t*) itemId; + request->choice.name.choice.domainspecific.itemId.size = strlen(itemId); + } + else { + request->choice.name.present = ObjectName_PR_vmdspecific; + request->choice.name.choice.vmdspecific.buf = (uint8_t*) itemId; + request->choice.name.choice.vmdspecific.size = strlen(itemId); + } asn_enc_rval_t rval; rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); - request->choice.name.choice.domainspecific.domainId.buf = 0; - request->choice.name.choice.domainspecific.domainId.size = 0; - request->choice.name.choice.domainspecific.itemId.buf = 0; - request->choice.name.choice.domainspecific.itemId.size = 0; + if (domainId != NULL) { + request->choice.name.choice.domainspecific.domainId.buf = 0; + request->choice.name.choice.domainspecific.domainId.size = 0; + request->choice.name.choice.domainspecific.itemId.buf = 0; + request->choice.name.choice.domainspecific.itemId.size = 0; + } + else { + request->choice.name.choice.vmdspecific.buf = 0; + request->choice.name.choice.vmdspecific.size = 0; + } asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); From 5b470f740c5958dd85bef2e58e90fe3c544bdf91 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 27 Sep 2017 15:30:23 +0200 Subject: [PATCH 28/64] - MMS server: MMS read handler sets domain to NULL for VMD scope variable --- src/iec61850/server/mms_mapping/logging.c | 2 +- src/mms/inc/mms_client_connection.h | 4 ++-- src/mms/iso_mms/server/mms_server.c | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/iec61850/server/mms_mapping/logging.c b/src/iec61850/server/mms_mapping/logging.c index 4733f14d..2a59c43f 100644 --- a/src/iec61850/server/mms_mapping/logging.c +++ b/src/iec61850/server/mms_mapping/logging.c @@ -882,7 +882,7 @@ Logging_processIntegrityLogs(MmsMapping* self, uint64_t currentTimeInMs) if (currentTimeInMs >= logControl->nextIntegrityScan) { - //if (DEBUG_IED_SERVER) + if (DEBUG_IED_SERVER) printf("IED_SERVER: INTEGRITY SCAN for log %s\n", logControl->name); LogControl_logAllDatasetEntries(logControl, self->mmsDevice->deviceName); diff --git a/src/mms/inc/mms_client_connection.h b/src/mms/inc/mms_client_connection.h index bbe0beae..b0a08084 100644 --- a/src/mms/inc/mms_client_connection.h +++ b/src/mms/inc/mms_client_connection.h @@ -306,13 +306,13 @@ LinkedList /* */ MmsConnection_getDomainVariableNames(MmsConnection self, MmsError* mmsError, const char* domainId); /** - * \brief Get the names of all named variable lists present in a MMS domain of the server. + * \brief Get the names of all named variable lists present in a MMS domain or VMD scope of the server. * * This will result in a domain specific GetNameList request. * * \param self MmsConnection instance to operate on * \param mmsError user provided variable to store error code - * \param domainId the domain name for the domain specific request + * \param domainId the domain name for the domain specific request or NULL for a VMD scope request * * \return the domain specific named variable list names or NULL if the request failed. */ diff --git a/src/mms/iso_mms/server/mms_server.c b/src/mms/iso_mms/server/mms_server.c index 75985d64..f3c2cf89 100644 --- a/src/mms/iso_mms/server/mms_server.c +++ b/src/mms/iso_mms/server/mms_server.c @@ -299,7 +299,8 @@ mmsServer_getValue(MmsServer self, MmsDomain* domain, char* itemId, MmsServerCon if (self->readAccessHandler != NULL) { MmsDataAccessError accessError = - self->readAccessHandler(self->readAccessHandlerParameter, domain, itemId, connection); + self->readAccessHandler(self->readAccessHandlerParameter, (domain == (MmsDomain*) self->device) ? NULL : domain, + itemId, connection); if (accessError != DATA_ACCESS_ERROR_SUCCESS) { value = MmsValue_newDataAccessError(accessError); @@ -312,7 +313,7 @@ mmsServer_getValue(MmsServer self, MmsDomain* domain, char* itemId, MmsServerCon if (value == NULL) if (self->readHandler != NULL) - value = self->readHandler(self->readHandlerParameter, domain, + value = self->readHandler(self->readHandlerParameter, (domain == (MmsDomain*) self->device) ? NULL : domain, itemId, connection); exit_function: From a008275f37553a8cf6fd72ec817a613f42c74bc6 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 27 Sep 2017 23:32:23 +0200 Subject: [PATCH 29/64] - MMS client: parse reject PDU - MMS: improved BER decoder stability --- src/mms/asn1/ber_decode.c | 6 + src/mms/inc_private/mms_common_internal.h | 2 + .../iso_mms/client/mms_client_connection.c | 116 ++++++++++++++++-- .../iso_mms/server/mms_server_connection.c | 9 +- 4 files changed, 124 insertions(+), 9 deletions(-) diff --git a/src/mms/asn1/ber_decode.c b/src/mms/asn1/ber_decode.c index 4acc260b..38188999 100644 --- a/src/mms/asn1/ber_decode.c +++ b/src/mms/asn1/ber_decode.c @@ -56,6 +56,12 @@ BerDecoder_decodeLength(uint8_t* buffer, int* length, int bufPos, int maxBufPos) *length = len1; } + if (*length < 0) + return -1; + + if (bufPos + (*length) > maxBufPos) + return -1; + return bufPos; } diff --git a/src/mms/inc_private/mms_common_internal.h b/src/mms/inc_private/mms_common_internal.h index e987fd12..6bb28486 100644 --- a/src/mms/inc_private/mms_common_internal.h +++ b/src/mms/inc_private/mms_common_internal.h @@ -90,6 +90,8 @@ mmsMsg_createMmsRejectPdu(uint32_t* invokeId, int reason, ByteBuffer* response); int mmsMsg_parseConfirmedErrorPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t* invokeId, MmsServiceError* serviceError); +int +mmsMsg_parseRejectPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t* invokeId, int* rejectType, int* rejectReason); MmsValue* mmsMsg_parseDataElement(Data_t* dataElement); diff --git a/src/mms/iso_mms/client/mms_client_connection.c b/src/mms/iso_mms/client/mms_client_connection.c index 041748a1..7111b657 100644 --- a/src/mms/iso_mms/client/mms_client_connection.c +++ b/src/mms/iso_mms/client/mms_client_connection.c @@ -389,6 +389,21 @@ waitUntilLastResponseHasBeenProcessed(MmsConnection self) } } +static MmsError +convertRejectCodesToMmsError(int rejectType, int rejectReason) +{ + if ((rejectType == 1) && (rejectReason == 1)) + return MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE; + else if ((rejectType == 5) && (rejectReason == 0)) + return MMS_ERROR_REJECT_UNKNOWN_PDU_TYPE; + else if ((rejectType == 1) && (rejectReason == 4)) + return MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT; + else if ((rejectType == 5) && (rejectReason == 1)) + return MMS_ERROR_REJECT_INVALID_PDU; + else + return MMS_ERROR_REJECT_OTHER; +} + static MmsError convertServiceErrorToMmsError(MmsServiceError serviceError) { @@ -569,11 +584,8 @@ mmsMsg_parseConfirmedErrorPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32 int endPos = bufPos + length; - if (endPos > maxBufPos) { - if (DEBUG_MMS_CLIENT) - printf("parseConfirmedErrorPDU: message to short!\n"); + if (endPos > maxBufPos) goto exit_error; - } while (bufPos < endPos) { tag = buffer[bufPos++]; @@ -605,6 +617,63 @@ mmsMsg_parseConfirmedErrorPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32 return bufPos; exit_error: + if (DEBUG_MMS_CLIENT) + printf("MMS_CLIENT: error parsing confirmed error PDU\n"); + + return -1; +} + +int +mmsMsg_parseRejectPDU(uint8_t* buffer, int bufPos, int maxBufPos, uint32_t* invokeId, int* rejectType, int* rejectReason) +{ + int length; + + uint8_t tag = buffer[bufPos++]; + + if (tag != 0xa4) + goto exit_error; + + bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); + if (bufPos < 0) + goto exit_error; + + if (bufPos + length > maxBufPos) + goto exit_error; + + int endPos = bufPos + length; + + if (endPos > maxBufPos) + goto exit_error; + + while (bufPos < endPos) { + tag = buffer[bufPos++]; + bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); + + if (bufPos < 0) + goto exit_error; + + + if (tag == 0x80) { /* invoke id */ + if (invokeId != NULL) + *invokeId = BerDecoder_decodeUint32(buffer, length, bufPos); + } + else if (tag > 0x80 && tag < 0x8c) { + *rejectType = tag - 0x80; + *rejectReason = BerDecoder_decodeInt32(buffer, length, bufPos); + } + else { + /* unknown - ignore */ + } + + bufPos += length; + } + + return bufPos; + +exit_error: + if (DEBUG_MMS_CLIENT) + printf("MMS_CLIENT: error parsing reject PDU\n"); + return -1; } @@ -710,6 +779,8 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) if (mmsMsg_parseConfirmedErrorPDU(payload->buffer, 0, payload->size, &invokeId, &serviceError) < 0) { if (DEBUG_MMS_CLIENT) printf("MMS_CLIENT: Error parsing confirmedErrorPDU!\n"); + + goto exit_with_error; } else { if (checkForOutstandingCall(self, invokeId)) { @@ -730,6 +801,37 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) } } } + else if (tag == 0xa4) { /* reject PDU */ + if (DEBUG_MMS_CLIENT) + printf("MMS_CLIENT: reject PDU!\n"); + + uint32_t invokeId; + int rejectType; + int rejectReason; + + if (mmsMsg_parseRejectPDU(payload->buffer, 0, payload->size, &invokeId, &rejectType, &rejectReason) >= 0) { + + if (DEBUG_MMS_CLIENT) + printf("MMS_CLIENT: reject PDU invokeID: %i type: %i reason: %i\n", (int) invokeId, rejectType, rejectReason); + + if (checkForOutstandingCall(self, invokeId)) { + + /* wait for application thread to handle last received response */ + waitUntilLastResponseHasBeenProcessed(self); + + Semaphore_wait(self->lastResponseLock); + self->lastResponseError = convertRejectCodesToMmsError(rejectType, rejectReason); + self->responseInvokeId = invokeId; + Semaphore_post(self->lastResponseLock); + } + else { + IsoClientConnection_releaseReceiveBuffer(self->isoClient); + return; + } + } + else + goto exit_with_error; + } else if (tag == 0xa1) { /* confirmed response PDU */ int length; @@ -897,16 +999,16 @@ mmsIsoCallback(IsoIndication indication, void* parameter, ByteBuffer* payload) return; - exit_with_error: +exit_with_error: if (DEBUG_MMS_CLIENT) - printf("received malformed message from server!\n"); + printf("MMS_CLIENT: received malformed message from server!\n"); IsoClientConnection_releaseReceiveBuffer(self->isoClient); if (DEBUG_MMS_CLIENT) - printf("LEAVE mmsIsoCallback - NOT OK!\n"); + printf("MMS_CLIENT: LEAVE mmsIsoCallback - NOT OK!\n"); return; } diff --git a/src/mms/iso_mms/server/mms_server_connection.c b/src/mms/iso_mms/server/mms_server_connection.c index 67644571..c80b0680 100644 --- a/src/mms/iso_mms/server/mms_server_connection.c +++ b/src/mms/iso_mms/server/mms_server_connection.c @@ -156,9 +156,14 @@ handleConfirmedRequestPdu( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); if (bufPos < 0) { - mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_UNRECOGNIZED_SERVICE, response); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; - } + } + + if (bufPos + length > maxBufPos) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); + return; + } if (extendedTag) { switch(tag) { From 90d910625bb621430d620f4f571d47741a0d3738 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 28 Sep 2017 08:43:34 +0200 Subject: [PATCH 30/64] - MMS: asn1 parser - removed debugging code --- src/mms/iso_mms/asn1c/OCTET_STRING.c | 77 +------------------------ src/mms/iso_mms/asn1c/ber_decoder.c | 32 ++-------- src/mms/iso_mms/asn1c/ber_tlv_tag.c | 44 -------------- src/mms/iso_mms/asn1c/constr_CHOICE.c | 74 +++--------------------- src/mms/iso_mms/asn1c/constr_SEQUENCE.c | 49 ++-------------- src/mms/iso_mms/asn1c/constr_SET_OF.c | 46 ++------------- 6 files changed, 26 insertions(+), 296 deletions(-) diff --git a/src/mms/iso_mms/asn1c/OCTET_STRING.c b/src/mms/iso_mms/asn1c/OCTET_STRING.c index 0e2ae4fa..9c908d3d 100644 --- a/src/mms/iso_mms/asn1c/OCTET_STRING.c +++ b/src/mms/iso_mms/asn1c/OCTET_STRING.c @@ -94,7 +94,6 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { } else { \ RETURN(RC_FAIL); \ } \ - ASN_DEBUG("Reallocating into %ld", (long)_ns); \ } \ memcpy(st->buf + st->size, bufptr, _bs); \ /* Convenient nul-termination */ \ @@ -187,12 +186,6 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, int tlv_constr; OS_type_e type_variant = (OS_type_e)specs->subvariant; - ASN_DEBUG("Decoding %s as %s (frame %ld)", - td->name, - (type_variant == _TT_GENERIC) ? - "OCTET STRING" : "OS-SpecialCase", - (long)size); - /* * Create the string if does not exist. */ @@ -254,12 +247,6 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ssize_t Left = ((!sel||(size_t)sel->left >= size) ?(ssize_t)size:sel->left); - - ASN_DEBUG("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", sel, - (long)(sel?sel->left:0), - (long)(sel?sel->want_nulls:0), - (long)(sel?sel->got:0) - ); if(sel && sel->left <= 0 && sel->want_nulls == 0) { if(sel->prev) { struct _stack_el *prev = sel->prev; @@ -280,11 +267,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); - ASN_DEBUG("fetch tag(size=%ld,L=%ld), %sstack, left=%ld, wn=%ld, tl=%ld", - (long)size, (long)Left, sel?"":"!", - (long)(sel?sel->left:0), - (long)(sel?sel->want_nulls:0), - (long)tl); + switch(tl) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -294,9 +277,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, ll = ber_fetch_length(tlv_constr, (const char *)buf_ptr + tl,Left - tl,&tlv_len); - ASN_DEBUG("Got tag=%s, tc=%d, left=%ld, tl=%ld, len=%ld, ll=%ld", - ber_tlv_tag_string(tlv_tag), tlv_constr, - (long)Left, (long)tl, (long)tlv_len, (long)ll); + switch(ll) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -307,8 +288,6 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, && ((const uint8_t *)buf_ptr)[1] == 0) { - ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); - if(type_variant == _TT_ANY && (tag_mode != 1 || sel->cont_level)) APPEND("\0\0", 2); @@ -359,21 +338,12 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, if(tlv_tag != expected_tag) { - char buf[2][32]; - ber_tlv_tag_snprint(tlv_tag, - buf[0], sizeof(buf[0])); - ber_tlv_tag_snprint(td->tags[td->tags_count-1], - buf[1], sizeof(buf[1])); - ASN_DEBUG("Tag does not match expectation: %s != %s", - buf[0], buf[1]); RETURN(RC_FAIL); } tlvl = tl + ll; /* Combined length of T and L encoding */ if((tlv_len + tlvl) < 0) { /* tlv_len value is too big */ - ASN_DEBUG("TLV encoding + length (%ld) is too big", - (long)tlv_len); RETURN(RC_FAIL); } @@ -403,14 +373,9 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, sel->got += tlvl; ADVANCE(tlvl); - ASN_DEBUG("+EXPECT2 got=%ld left=%ld, wn=%d, clvl=%d", - (long)sel->got, (long)sel->left, - sel->want_nulls, sel->cont_level); - } while(tlv_constr); if(sel == NULL) { /* Finished operation, "phase out" */ - ASN_DEBUG("Phase out"); _CH_PHASE(ctx, +3); break; } @@ -420,9 +385,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, case 2: stck = (struct _stack *)ctx->ptr; sel = stck->cur_ptr; - ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d", - (long)sel->left, (long)size, (long)sel->got, - sel->want_nulls); + { ber_tlv_len_t len; @@ -446,8 +409,6 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } if(sel->left) { - ASN_DEBUG("OS left %ld, size = %ld, wn=%d\n", - (long)sel->left, (long)size, sel->want_nulls); RETURN(RC_WMORE); } @@ -491,9 +452,6 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, } if(sel) { - ASN_DEBUG("3sel p=%p, wn=%d, l=%ld, g=%ld, size=%ld", - sel->prev, sel->want_nulls, - (long)sel->left, (long)sel->got, (long)size); if(sel->prev || sel->want_nulls > 1 || sel->left > 0) { RETURN(RC_WMORE); } @@ -507,12 +465,6 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, st->buf[st->size-1] &= 0xff << st->bits_unused; } - ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld", - (long)consumed_myself, td->name, - (type_variant == _TT_GENERIC) ? (char *)st->buf : "", - (long)st->size); - - RETURN(RC_OK); } @@ -531,9 +483,6 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, OS_type_e type_variant = (OS_type_e)specs->subvariant; int fix_last_byte = 0; - ASN_DEBUG("%s %s as OCTET STRING", - cb?"Estimating":"Encoding", td->name); - /* * Write tags. */ @@ -1274,9 +1223,6 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, if(len_bits < 0) RETURN(RC_WMORE); len_bits += ct->lower_bound; - ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", - (long)ct->effective_bits, (long)len_bits, - repeat ? "repeat" : "once", td->name); if(unit_bits == 1) { len_bytes = (len_bits + 7) >> 3; if(len_bits & 0x7) @@ -1323,17 +1269,9 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODE_FAILED; if(unit_bits == 1) { - ASN_DEBUG("BIT STRING of %d bytes, %d bits unused", - sizeinunits, st->bits_unused); sizeinunits = sizeinunits * 8 - (st->bits_unused & 0x07); } - ASN_DEBUG("Encoding %s into %d units of %d bits" - " (%d..%d, effective %d)%s", - td->name, sizeinunits, unit_bits, - ct->lower_bound, ct->upper_bound, - ct->effective_bits, ct_extensible ? " EXT" : ""); - /* Figure out wheter size lies within PER visible consrtaint */ if(ct->effective_bits >= 0) { @@ -1359,9 +1297,6 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ if(ct->effective_bits >= 0) { - ASN_DEBUG("Encoding %d bytes (%ld), length in %d bits", - st->size, sizeinunits - ct->lower_bound, - ct->effective_bits); ret = per_put_few_bits(po, sizeinunits - ct->lower_bound, ct->effective_bits); if(ret) _ASN_ENCODE_FAILED; @@ -1370,8 +1305,6 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODED_OK(er); } - ASN_DEBUG("Encoding %d bytes", st->size); - if(sizeinunits == 0) { if(uper_put_length(po, 0)) _ASN_ENCODE_FAILED; @@ -1383,8 +1316,6 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, ssize_t maySave = uper_put_length(po, sizeinunits); if(maySave < 0) _ASN_ENCODE_FAILED; - ASN_DEBUG("Encoding %d of %d", maySave, sizeinunits); - ret = per_put_many_bits(po, buf, maySave * unit_bits); if(ret) _ASN_ENCODE_FAILED; @@ -1468,8 +1399,6 @@ OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { if(!td || !st) return; - ASN_DEBUG("Freeing %s as OCTET STRING", td->name); - if(st->buf) { FREEMEM(st->buf); } diff --git a/src/mms/iso_mms/asn1c/ber_decoder.c b/src/mms/iso_mms/asn1c/ber_decoder.c index 601f66c0..de0695ae 100644 --- a/src/mms/iso_mms/asn1c/ber_decoder.c +++ b/src/mms/iso_mms/asn1c/ber_decoder.c @@ -108,8 +108,7 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, tagno = step /* Continuing where left previously */ + (tag_mode==1?-1:0) ; - ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", - td->name, (long)size, tag_mode, step, tagno); + /* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */ if(tag_mode == 0 && tagno == td->tags_count) { @@ -130,8 +129,7 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); } - ASN_DEBUG("Advancing %ld in ANY case", - (long)(tag_len + len_len)); + ADVANCE(tag_len + len_len); } else { assert(tagno < td->tags_count); /* At least one loop */ @@ -142,11 +140,7 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, * Fetch and process T from TLV. */ tag_len = ber_fetch_tag(ptr, size, &tlv_tag); - ASN_DEBUG("Fetching tag from {%p,%ld}: " - "len %ld, step %d, tagno %d got %s", - ptr, (long)size, - (long)tag_len, step, tagno, - ber_tlv_tag_string(tlv_tag)); + switch(tag_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -170,12 +164,7 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, /* * Unexpected tag. Too bad. */ - ASN_DEBUG("Expected: %s, " - "expectation failed (tn=%d, tm=%d)", - ber_tlv_tag_string(td->tags[tagno]), - tagno, tag_mode - ); - RETURN(RC_FAIL); + RETURN(RC_FAIL); } } @@ -188,15 +177,11 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, */ if(tagno < (td->tags_count - 1)) { if(tlv_constr == 0) { - ASN_DEBUG("tlv_constr = %d, expfail", - tlv_constr); RETURN(RC_FAIL); } } else { if(last_tag_form != tlv_constr && last_tag_form != -1) { - ASN_DEBUG("last_tag_form %d != %d", - last_tag_form, tlv_constr); RETURN(RC_FAIL); } } @@ -206,7 +191,7 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, */ len_len = ber_fetch_length(tlv_constr, (const char *)ptr + tag_len, size - tag_len, &tlv_len); - ASN_DEBUG("Fetchinig len = %ld", (long)len_len); + switch(len_len) { case -1: RETURN(RC_FAIL); case 0: RETURN(RC_WMORE); @@ -226,16 +211,12 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, if(limit_len == -1) { expect_00_terminators++; } else { - ASN_DEBUG("Unexpected indefinite length " - "in a chain of definite lengths"); RETURN(RC_FAIL); } ADVANCE(tag_len + len_len); continue; } else { if(expect_00_terminators) { - ASN_DEBUG("Unexpected definite length " - "in a chain of indefinite lengths"); RETURN(RC_FAIL); } } @@ -255,8 +236,7 @@ ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, * Inner TLV specifies length which is inconsistent * with the outer TLV's length value. */ - ASN_DEBUG("Outer TLV is %ld and inner is %ld", - (long)limit_len, (long)tlv_len); + RETURN(RC_FAIL); } diff --git a/src/mms/iso_mms/asn1c/ber_tlv_tag.c b/src/mms/iso_mms/asn1c/ber_tlv_tag.c index 588d9ee0..24588f90 100644 --- a/src/mms/iso_mms/asn1c/ber_tlv_tag.c +++ b/src/mms/iso_mms/asn1c/ber_tlv_tag.c @@ -56,50 +56,6 @@ ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { return 0; /* Want more */ } - - -ssize_t -ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) { - char buf[sizeof("[APPLICATION ]") + 32]; - ssize_t ret; - - ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf)); - if(ret >= (ssize_t)sizeof(buf) || ret < 2) { - errno = EPERM; - return -1; - } - - return fwrite(buf, 1, ret, f); -} - -ssize_t -ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) { - char *type = 0; - int ret; - - switch(tag & 0x3) { - case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break; - case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break; - case ASN_TAG_CLASS_CONTEXT: type = ""; break; - case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break; - } - - ret = snprintf(buf, size, "[%s%u](%02x)", type, ((unsigned)tag) >> 2, tag); - if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */ - - return ret; -} - -char * -ber_tlv_tag_string(ber_tlv_tag_t tag) { - static char buf[sizeof("[APPLICATION ]") + 32]; - - (void)ber_tlv_tag_snprint(tag, buf, sizeof(buf)); - - return buf; -} - - size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { int tclass = BER_TAG_CLASS(tag); diff --git a/src/mms/iso_mms/asn1c/constr_CHOICE.c b/src/mms/iso_mms/asn1c/constr_CHOICE.c index b8d6fa9a..de2cc3a4 100644 --- a/src/mms/iso_mms/asn1c/constr_CHOICE.c +++ b/src/mms/iso_mms/asn1c/constr_CHOICE.c @@ -117,8 +117,6 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ - ASN_DEBUG("Decoding %s as CHOICE", td->name); - /* * Create the target structure if it is not present already. */ @@ -149,8 +147,6 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, -1, &ctx->left, 0); if(rval.code != RC_OK) { - ASN_DEBUG("%s tagging check failed: %d", - td->name, rval.code); return rval; } @@ -165,16 +161,13 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, NEXT_PHASE(ctx); - ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", - (long)ctx->left, (long)size); - /* Fall through */ case 1: /* * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); - ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); + switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ @@ -197,17 +190,11 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->step = t2m->el_no; break; } else if(specs->ext_start == -1) { - ASN_DEBUG("Unexpected tag %s " - "in non-extensible CHOICE %s", - ber_tlv_tag_string(tlv_tag), td->name); RETURN(RC_FAIL); } else { /* Skip this tag */ ssize_t skip; - ASN_DEBUG("Skipping unknown tag %s", - ber_tlv_tag_string(tlv_tag)); - skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), (const char *)ptr + tag_len, @@ -280,9 +267,6 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* Fall through */ case 3: - ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", - td->name, (long)ctx->left, (long)size, - tag_mode, td->tags_count); if(ctx->left > 0) { /* @@ -335,8 +319,6 @@ CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, continue; } } else { - ASN_DEBUG("Unexpected continuation in %s", - td->name); RETURN(RC_FAIL); } @@ -365,9 +347,6 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, if(!sptr) _ASN_ENCODE_FAILED; - ASN_DEBUG("%s %s as CHOICE", - cb?"Encoding":"Estimating", td->name); - present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); @@ -435,9 +414,6 @@ CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, if(erval.encoded == -1) return erval; - ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", - (long)erval.encoded, (long)computed_size); - erval.encoded += computed_size; return erval; @@ -482,9 +458,6 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, int present; if(!sptr) { - _ASN_CTFAIL(app_key, td, - "%s: value not given (%s:%d)", - td->name, __FILE__, __LINE__); return -1; } @@ -501,9 +474,7 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, if(!memb_ptr) { if(elm->optional) return 0; - _ASN_CTFAIL(app_key, td, - "%s: mandatory CHOICE element %s absent (%s:%d)", - td->name, elm->name, __FILE__, __LINE__); + return -1; } } else { @@ -524,9 +495,6 @@ CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return ret; } } else { - _ASN_CTFAIL(app_key, td, - "%s: no CHOICE element given (%s:%d)", - td->name, __FILE__, __LINE__); return -1; } } @@ -616,8 +584,7 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, elm->type, memb_ptr2, elm->name, buf_ptr, size); XER_ADVANCE(tmprval.consumed); - ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", - elm->type->name, tmprval.code); + if(tmprval.code != RC_OK) RETURN(tmprval.code); assert(_fetch_present_idx(st, @@ -654,17 +621,10 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); - ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", - ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', - ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', - ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', - ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', - xml_tag, tcv); /* Skip the extensions section */ if(ctx->phase == 4) { - ASN_DEBUG("skip_unknown(%d, %ld)", - tcv, (long)ctx->left); + switch(xer_skip_unknown(tcv, &ctx->left)) { case -1: ctx->phase = 5; @@ -733,7 +693,6 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* It is expected extension */ if(specs->ext_start != -1) { - ASN_DEBUG("Got anticipated extension"); /* * Check for (XCT_BOTH or XCT_UNKNOWN_BO) * By using a mask. Only record a pure @@ -755,13 +714,6 @@ CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, break; } - ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" - " (ph=%d, tag=%s)", - ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', - ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', - ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', - ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', - td->name, ctx->phase, xml_tag); break; } @@ -859,8 +811,7 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(ct && ct->range_bits >= 0) { value = per_get_few_bits(pd, ct->range_bits); if(value < 0) _ASN_DECODE_STARVED; - ASN_DEBUG("CHOICE %s got index %d in range %d", - td->name, value, ct->range_bits); + if(value > ct->upper_bound) _ASN_DECODE_FAILED; } else { @@ -871,7 +822,7 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, value += specs->ext_start; if(value >= td->elements_count) _ASN_DECODE_FAILED; - ASN_DEBUG("NOT IMPLEMENTED YET"); + _ASN_DECODE_FAILED; } @@ -890,13 +841,10 @@ CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, memb_ptr = (char *)st + elm->memb_offset; memb_ptr2 = &memb_ptr; } - ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, elm->per_constraints, memb_ptr2, pd); - if(rv.code != RC_OK) - ASN_DEBUG("Failed to decode %s in %s (CHOICE)", - elm->name, td->name); + return rv; } @@ -911,8 +859,6 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td, if(!sptr) _ASN_ENCODE_FAILED; - ASN_DEBUG("Encoding %s as CHOICE", td->name); - if(constraints) ct = &constraints->value; else if(td->per_constraints) ct = &td->per_constraints->value; else ct = 0; @@ -933,8 +879,6 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td, if(specs->canonical_order) present = specs->canonical_order[present]; - ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); - if(ct && ct->range_bits >= 0) { if(present < ct->lower_bound || present > ct->upper_bound) { @@ -959,7 +903,7 @@ CHOICE_encode_uper(asn_TYPE_descriptor_t *td, _ASN_ENCODE_FAILED; if(uper_put_nsnnwn(po, present - specs->ext_start)) _ASN_ENCODE_FAILED; - ASN_DEBUG("NOT IMPLEMENTED YET"); + _ASN_ENCODE_FAILED; } @@ -1026,8 +970,6 @@ CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(!td || !ptr) return; - ASN_DEBUG("Freeing %s as CHOICE", td->name); - /* * Figure out which CHOICE element is encoded. */ diff --git a/src/mms/iso_mms/asn1c/constr_SEQUENCE.c b/src/mms/iso_mms/asn1c/constr_SEQUENCE.c index b7694343..72043f5d 100644 --- a/src/mms/iso_mms/asn1c/constr_SEQUENCE.c +++ b/src/mms/iso_mms/asn1c/constr_SEQUENCE.c @@ -127,8 +127,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ int edx; /* SEQUENCE element's index */ - - ASN_DEBUG("Decoding %s as SEQUENCE", td->name); /* * Create the target structure if it is not present already. @@ -159,8 +157,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { - ASN_DEBUG("%s tagging check failed: %d", - td->name, rval.code); return rval; } @@ -170,9 +166,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, NEXT_PHASE(ctx); - ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", - (long)ctx->left, (long)size); - /* Fall through */ case 1: /* @@ -200,11 +193,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, /* * MICROPHASE 1: Synchronize decoding. */ - ASN_DEBUG("In %s SEQUENCE left %d, edx=%d flags=%d" - " opt=%d ec=%d", - td->name, (int)ctx->left, edx, - elements[edx].flags, elements[edx].optional, - td->elements_count); if(ctx->left == 0 /* No more stuff is expected */ && ( @@ -217,7 +205,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, && specs->ext_before > td->elements_count) ) ) { - ASN_DEBUG("End of SEQUENCE %s", td->name); /* * Found the legitimate end of the structure. */ @@ -229,10 +216,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * Fetch the T from TLV. */ tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); - ASN_DEBUG("Current tag in %s SEQUENCE for element %d " - "(%s) is %s encoded in %d bytes, of frame %ld", - td->name, edx, elements[edx].name, - ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); + switch(tag_len) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ @@ -246,9 +230,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, else RETURN(RC_WMORE); } else if(((const uint8_t *)ptr)[1] == 0) { - ASN_DEBUG("edx = %d, opt = %d, ec=%d", - edx, elements[edx].optional, - td->elements_count); + if((edx + elements[edx].optional == td->elements_count) || (IN_EXTENSION_GROUP(specs, edx) @@ -347,13 +329,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * or an end of the indefinite-length structure. */ if(!IN_EXTENSION_GROUP(specs, edx)) { - ASN_DEBUG("Unexpected tag %s (at %d)", - ber_tlv_tag_string(tlv_tag), edx); - ASN_DEBUG("Expected tag %s (%s)%s", - ber_tlv_tag_string(elements[edx].tag), - elements[edx].name, - elements[edx].optional - ?" or alternatives":""); RETURN(RC_FAIL); } else { /* Skip this tag */ @@ -363,8 +338,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, BER_TLV_CONSTRUCTED(ptr), (const char *)ptr + tag_len, LEFT - tag_len); - ASN_DEBUG("Skip length %d in %s", - (int)skip, td->name); + switch(skip) { case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); /* Fall through */ @@ -383,7 +357,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ ctx->step |= 1; /* Confirm entering next microphase */ microphase2: - ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); /* * Compute the position of the member inside a structure, @@ -408,10 +381,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, elements[edx].type, memb_ptr2, ptr, LEFT, elements[edx].tag_mode); - ASN_DEBUG("In %s SEQUENCE decoded %d %s of %d " - "in %d bytes rval.code %d, size=%d", - td->name, edx, elements[edx].type->name, - (int)LEFT, (int)rval.consumed, rval.code, (int)size); + switch(rval.code) { case RC_OK: break; @@ -420,8 +390,7 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ADVANCE(rval.consumed); RETURN(RC_WMORE); } - ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", - (long)ctx->left, (long)size); + /* Fall through */ case RC_FAIL: /* Fatal error */ RETURN(RC_FAIL); @@ -435,9 +404,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case 3: /* 00 and other tags expected */ case 4: /* only 00's expected */ - ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", - td->name, (long)ctx->left, (long)size); - /* * Skip everything until the end of the SEQUENCE. */ @@ -474,11 +440,6 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(!IN_EXTENSION_GROUP(specs, td->elements_count) || ctx->phase == 4) { - ASN_DEBUG("Unexpected continuation " - "of a non-extensible type " - "%s (SEQUENCE): %s", - td->name, - ber_tlv_tag_string(tlv_tag)); RETURN(RC_FAIL); } diff --git a/src/mms/iso_mms/asn1c/constr_SET_OF.c b/src/mms/iso_mms/asn1c/constr_SET_OF.c index c4928e2e..7e9e3f6d 100644 --- a/src/mms/iso_mms/asn1c/constr_SET_OF.c +++ b/src/mms/iso_mms/asn1c/constr_SET_OF.c @@ -84,8 +84,6 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_dec_rval_t rval; /* Return code from subparsers */ ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ - - ASN_DEBUG("Decoding %s as SET OF", td->name); /* * Create the target structure if it is not present already. @@ -116,8 +114,6 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, tag_mode, 1, &ctx->left, 0); if(rval.code != RC_OK) { - ASN_DEBUG("%s tagging check failed: %d", - td->name, rval.code); return rval; } @@ -125,9 +121,6 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, ctx->left += rval.consumed; /* ?Substracted below! */ ADVANCE(rval.consumed); - ASN_DEBUG("Structure consumes %ld bytes, " - "buffer %ld", (long)ctx->left, (long)size); - NEXT_PHASE(ctx); /* Fall through */ case 1: @@ -147,7 +140,6 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ if(ctx->left == 0) { - ASN_DEBUG("End of SET OF %s", td->name); /* * No more things to decode. * Exit out of here. @@ -188,10 +180,6 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * The new list member of expected type has arrived. */ } else { - ASN_DEBUG("Unexpected tag %s fixed SET OF %s", - ber_tlv_tag_string(tlv_tag), td->name); - ASN_DEBUG("%s SET OF has tag %s", - td->name, ber_tlv_tag_string(elm->tag)); RETURN(RC_FAIL); } } @@ -207,9 +195,7 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, */ rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, &ctx->ptr, ptr, LEFT, 0); - ASN_DEBUG("In %s SET OF %s code %d consumed %d", - td->name, elm->type->name, - rval.code, (int)rval.consumed); + switch(rval.code) { case RC_OK: { @@ -324,8 +310,6 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, int ret; int edx; - ASN_DEBUG("Estimating size for SET OF %s", td->name); - /* * Gather the length of the underlying members sequence. */ @@ -374,8 +358,6 @@ SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, return erval; } - ASN_DEBUG("Encoding members of %s SET OF", td->name); - /* * Encode all members. */ @@ -523,7 +505,6 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_dec_rval_t tmprval; /* Invoke the inner type decoder, m.b. multiple times */ - ASN_DEBUG("XER/SET OF element [%s]", elm_tag); tmprval = element->type->xer_decoder(opt_codec_ctx, element->type, &ctx->ptr, elm_tag, buf_ptr, size); @@ -538,7 +519,6 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, RETURN(tmprval.code); } ctx->phase = 1; /* Back to body processing */ - ASN_DEBUG("XER/SET OF phase => %d", ctx->phase); /* Fall through */ } @@ -562,8 +542,7 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); - ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", - tcv, ctx->phase, xml_tag); + switch(tcv) { case XCT_CLOSING: if(ctx->phase == 0) break; @@ -587,7 +566,6 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, case XCT_UNKNOWN_OP: case XCT_UNKNOWN_BO: - ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); if(ctx->phase == 1) { /* * Process a single possible member. @@ -600,7 +578,6 @@ SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, break; } - ASN_DEBUG("Unexpected XML tag in SET OF"); break; } @@ -819,9 +796,6 @@ SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, int i; if(!sptr) { - _ASN_CTFAIL(app_key, td, - "%s: value not given (%s:%d)", - td->name, __FILE__, __LINE__); return -1; } @@ -890,8 +864,7 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, if(ct && ct->effective_bits >= 0) { /* X.691, #19.5: No length determinant */ nelems = per_get_few_bits(pd, ct->effective_bits); - ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", - (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) _ASN_DECODE_STARVED; nelems += ct->lower_bound; } else { @@ -908,20 +881,11 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, for(i = 0; i < nelems; i++) { void *ptr = 0; - ASN_DEBUG("SET OF %s decoding", elm->type->name); - rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, - elm->per_constraints, &ptr, pd); - ASN_DEBUG("%s SET OF %s decoded %d, %p", - td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { if(ASN_SET_ADD(list, ptr) == 0) continue; - ASN_DEBUG("Failed to add element into %s", - td->name); /* Fall through */ - } else { - ASN_DEBUG("Failed decoding %s of %s (SET OF)", - elm->type->name, td->name); } if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); return rv; @@ -930,8 +894,6 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, nelems = -1; /* Allow uper_get_length() */ } while(repeat); - ASN_DEBUG("Decoded %s as SET OF", td->name); - rv.code = RC_OK; rv.consumed = 0; return rv; From 922dac1a34c5496f1c449dd3c397358a8e1e74ef Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 28 Sep 2017 13:23:15 +0200 Subject: [PATCH 31/64] - MMS: fixed potential memory leak in asn1 code that can be caused by malformed MMS messages --- src/mms/iso_mms/asn1c/constr_SEQUENCE.c | 6 +++--- src/mms/iso_mms/asn1c/constr_SET_OF.c | 11 +++++++++++ .../iso_mms/server/mms_named_variable_list_service.c | 7 ++++--- src/mms/iso_mms/server/mms_read_service.c | 3 ++- src/mms/iso_mms/server/mms_write_service.c | 2 +- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/mms/iso_mms/asn1c/constr_SEQUENCE.c b/src/mms/iso_mms/asn1c/constr_SEQUENCE.c index 72043f5d..35aec840 100644 --- a/src/mms/iso_mms/asn1c/constr_SEQUENCE.c +++ b/src/mms/iso_mms/asn1c/constr_SEQUENCE.c @@ -33,7 +33,7 @@ #undef ADVANCE #define ADVANCE(num_bytes) do { \ size_t num = num_bytes; \ - ptr = ((const char *)ptr) + num;\ + ptr = ((const char *)ptr) + num; \ size -= num; \ if(ctx->left >= 0) \ ctx->left -= num; \ @@ -328,11 +328,12 @@ SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, * or an extension (...), * or an end of the indefinite-length structure. */ - if(!IN_EXTENSION_GROUP(specs, edx)) { + if(!IN_EXTENSION_GROUP(specs, edx + elements[edx].optional)) { RETURN(RC_FAIL); } else { /* Skip this tag */ ssize_t skip; + edx += elements[edx].optional; skip = ber_skip_length(opt_codec_ctx, BER_TLV_CONSTRUCTED(ptr), @@ -1135,7 +1136,6 @@ SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, er.encoded = 0; - ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); if(specs->ext_before >= 0) _ASN_ENCODE_FAILED; /* We don't encode extensions yet */ diff --git a/src/mms/iso_mms/asn1c/constr_SET_OF.c b/src/mms/iso_mms/asn1c/constr_SET_OF.c index 7e9e3f6d..e183de47 100644 --- a/src/mms/iso_mms/asn1c/constr_SET_OF.c +++ b/src/mms/iso_mms/asn1c/constr_SET_OF.c @@ -213,6 +213,8 @@ SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, } /* Fall through */ case RC_FAIL: /* Fatal error */ + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; RETURN(RC_FAIL); } /* switch(rval) */ @@ -764,8 +766,10 @@ SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, void SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { if(td && ptr) { + asn_SET_OF_specifics_t *specs; asn_TYPE_member_t *elm = td->elements; asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); + asn_struct_ctx_t *ctx; /* Decoder context */ int i; /* @@ -781,6 +785,13 @@ SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { asn_set_empty(list); /* Remove (list->array) */ + specs = (asn_SET_OF_specifics_t *)td->specifics; + ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); + if(ctx->ptr) { + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + } + if(!contents_only) { FREEMEM(ptr); } diff --git a/src/mms/iso_mms/server/mms_named_variable_list_service.c b/src/mms/iso_mms/server/mms_named_variable_list_service.c index 2a48b02b..c56f6ca6 100644 --- a/src/mms/iso_mms/server/mms_named_variable_list_service.c +++ b/src/mms/iso_mms/server/mms_named_variable_list_service.c @@ -233,9 +233,10 @@ mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection, mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } +exit_function: + asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); -exit_function: return; } @@ -420,7 +421,7 @@ mmsServer_handleDefineNamedVariableListRequest( if (rval.code != RC_OK) { mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); - goto exit_function; + goto exit_free_struct; } request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.defineNamedVariableList); @@ -666,7 +667,7 @@ mmsServer_handleGetNamedVariableListAttributesRequest( if (rval.code != RC_OK) { mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); - return; + goto exit_function; } if (request->present == ObjectName_PR_domainspecific) { diff --git a/src/mms/iso_mms/server/mms_read_service.c b/src/mms/iso_mms/server/mms_read_service.c index 6f8f0b32..7d69193c 100644 --- a/src/mms/iso_mms/server/mms_read_service.c +++ b/src/mms/iso_mms/server/mms_read_service.c @@ -747,7 +747,7 @@ mmsServer_handleReadRequest( if (rval.code != RC_OK) { mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); - return; + goto exit_function; } request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.read); @@ -764,6 +764,7 @@ mmsServer_handleReadRequest( mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } +exit_function: asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); } diff --git a/src/mms/iso_mms/server/mms_write_service.c b/src/mms/iso_mms/server/mms_write_service.c index c616f4df..41c0a708 100644 --- a/src/mms/iso_mms/server/mms_write_service.c +++ b/src/mms/iso_mms/server/mms_write_service.c @@ -481,7 +481,7 @@ mmsServer_handleWriteRequest( if (rval.code != RC_OK) { mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); - return; + goto exit_function; } WriteRequest_t* writeRequest = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); From 53e741852eab3e35ef61dc2b69046e7bf6d594a4 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 19 Oct 2017 08:54:13 +0200 Subject: [PATCH 32/64] - example directory cleanup --- examples/CMakeLists.txt | 13 +- examples/Makefile | 25 +- examples/mms_client_example1/CMakeLists.txt | 17 - examples/mms_client_example1/Makefile | 17 - .../mms_client_example1/mms_client_example1.c | 51 - examples/mms_client_example2/CMakeLists.txt | 17 - examples/mms_client_example2/Makefile | 17 - .../mms_client_example2/mms_client_example2.c | 64 - examples/mms_client_example3/CMakeLists.txt | 17 - examples/mms_client_example3/Makefile | 17 - .../mms_client_example3/mms_client_example3.c | 41 - examples/mms_client_example4/CMakeLists.txt | 17 - examples/mms_client_example4/Makefile | 17 - .../mms_client_example4/mms_client_example4.c | 87 - examples/mms_client_example5/CMakeLists.txt | 17 - examples/mms_client_example5/Makefile | 17 - .../mms_client_example5/mms_client_example5.c | 50 - examples/server_example1/CMakeLists.txt | 21 - examples/server_example1/Makefile | 25 - .../sampleModel_with_dataset.icd | 184 - examples/server_example1/server_example1.c | 76 - examples/server_example1/static_model.c | 1627 -------- examples/server_example1/static_model.h | 281 -- examples/server_example2/CMakeLists.txt | 21 - examples/server_example2/Makefile | 24 - examples/server_example2/complexModel.icd | 347 -- examples/server_example2/server_example2.c | 91 - examples/server_example2/static_model.c | 3621 ----------------- examples/server_example2/static_model.h | 609 --- examples/server_example3/CMakeLists.txt | 21 - examples/server_example3/Makefile | 31 - examples/server_example3/server_example3.c | 171 - .../simpleIO_direct_control.icd | 281 -- .../server_example3/simpleIO_sbo_control.icd | 287 -- examples/server_example3/static_model.c | 2003 --------- examples/server_example3/static_model.h | 301 -- .../server_example3/vmd-filestore/SYSTEM.BIN | 0 examples/server_example4/CMakeLists.txt | 21 - examples/server_example4/Makefile | 25 - examples/server_example4/server_example4.c | 157 - .../simpleIO_direct_control.icd | 223 - examples/server_example4/static_model.c | 1812 --------- examples/server_example4/static_model.h | 299 -- examples/server_example5/CMakeLists.txt | 21 - examples/server_example5/Makefile | 25 - examples/server_example5/complexModel.icd | 347 -- examples/server_example5/server_example5.c | 78 - examples/server_example5/static_model.c | 3621 ----------------- examples/server_example5/static_model.h | 609 --- src/mms/inc/iso_connection_parameters.h | 16 +- src/mms/iso_acse/acse.c | 4 +- 51 files changed, 30 insertions(+), 17751 deletions(-) delete mode 100644 examples/mms_client_example1/CMakeLists.txt delete mode 100644 examples/mms_client_example1/Makefile delete mode 100644 examples/mms_client_example1/mms_client_example1.c delete mode 100644 examples/mms_client_example2/CMakeLists.txt delete mode 100644 examples/mms_client_example2/Makefile delete mode 100644 examples/mms_client_example2/mms_client_example2.c delete mode 100644 examples/mms_client_example3/CMakeLists.txt delete mode 100644 examples/mms_client_example3/Makefile delete mode 100644 examples/mms_client_example3/mms_client_example3.c delete mode 100644 examples/mms_client_example4/CMakeLists.txt delete mode 100644 examples/mms_client_example4/Makefile delete mode 100644 examples/mms_client_example4/mms_client_example4.c delete mode 100644 examples/mms_client_example5/CMakeLists.txt delete mode 100644 examples/mms_client_example5/Makefile delete mode 100644 examples/mms_client_example5/mms_client_example5.c delete mode 100644 examples/server_example1/CMakeLists.txt delete mode 100644 examples/server_example1/Makefile delete mode 100644 examples/server_example1/sampleModel_with_dataset.icd delete mode 100644 examples/server_example1/server_example1.c delete mode 100644 examples/server_example1/static_model.c delete mode 100644 examples/server_example1/static_model.h delete mode 100644 examples/server_example2/CMakeLists.txt delete mode 100644 examples/server_example2/Makefile delete mode 100644 examples/server_example2/complexModel.icd delete mode 100644 examples/server_example2/server_example2.c delete mode 100644 examples/server_example2/static_model.c delete mode 100644 examples/server_example2/static_model.h delete mode 100644 examples/server_example3/CMakeLists.txt delete mode 100644 examples/server_example3/Makefile delete mode 100644 examples/server_example3/server_example3.c delete mode 100644 examples/server_example3/simpleIO_direct_control.icd delete mode 100644 examples/server_example3/simpleIO_sbo_control.icd delete mode 100644 examples/server_example3/static_model.c delete mode 100644 examples/server_example3/static_model.h delete mode 100644 examples/server_example3/vmd-filestore/SYSTEM.BIN delete mode 100644 examples/server_example4/CMakeLists.txt delete mode 100644 examples/server_example4/Makefile delete mode 100644 examples/server_example4/server_example4.c delete mode 100644 examples/server_example4/simpleIO_direct_control.icd delete mode 100644 examples/server_example4/static_model.c delete mode 100644 examples/server_example4/static_model.h delete mode 100644 examples/server_example5/CMakeLists.txt delete mode 100644 examples/server_example5/Makefile delete mode 100644 examples/server_example5/complexModel.icd delete mode 100644 examples/server_example5/server_example5.c delete mode 100644 examples/server_example5/static_model.c delete mode 100644 examples/server_example5/static_model.h diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cfb8f63e..dba5285f 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,8 +1,7 @@ -add_subdirectory(server_example1) -add_subdirectory(server_example2) -add_subdirectory(server_example3) -add_subdirectory(server_example4) -add_subdirectory(server_example5) +add_subdirectory(server_example_simple) +add_subdirectory(server_example_basic_io) +add_subdirectory(server_example_password_auth) +add_subdirectory(server_example_write_handler) add_subdirectory(server_example_control) add_subdirectory(server_example_dynamic) add_subdirectory(server_example_config_file) @@ -23,10 +22,6 @@ add_subdirectory(iec61850_client_example_files) endif() add_subdirectory(iec61850_client_example_reporting) add_subdirectory(iec61850_client_example_log) -add_subdirectory(mms_client_example1) -add_subdirectory(mms_client_example2) -add_subdirectory(mms_client_example3) -add_subdirectory(mms_client_example4) IF(WIN32) if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/Lib/wpcap.lib") diff --git a/examples/Makefile b/examples/Makefile index 3e8fcc38..543cb03b 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,21 +1,15 @@ -EXAMPLE_DIRS = mms_client_example1 -EXAMPLE_DIRS += mms_client_example2 -EXAMPLE_DIRS += mms_client_example3 -EXAMPLE_DIRS += mms_client_example4 -EXAMPLE_DIRS += mms_client_example5 -EXAMPLE_DIRS += iec61850_client_example1 +EXAMPLE_DIRS = iec61850_client_example1 EXAMPLE_DIRS += iec61850_client_example2 EXAMPLE_DIRS += iec61850_client_example3 EXAMPLE_DIRS += iec61850_client_example4 EXAMPLE_DIRS += iec61850_client_example5 EXAMPLE_DIRS += iec61850_client_example_reporting EXAMPLE_DIRS += iec61850_client_example_log -EXAMPLE_DIRS += server_example1 -EXAMPLE_DIRS += server_example2 -EXAMPLE_DIRS += server_example3 -EXAMPLE_DIRS += server_example4 -EXAMPLE_DIRS += server_example5 +EXAMPLE_DIRS += server_example_simple +EXAMPLE_DIRS += server_example_basic_io +EXAMPLE_DIRS += server_example_password_auth +EXAMPLE_DIRS += server_example_write_handler EXAMPLE_DIRS += server_example_goose EXAMPLE_DIRS += server_example_control EXAMPLE_DIRS += server_example_config_file @@ -35,11 +29,10 @@ EXAMPLE_DIRS += iec61850_sv_client_example EXAMPLE_DIRS += sv_publisher EXAMPLE_DIRS += sv_subscriber -MODEL_DIRS += server_example1 -MODEL_DIRS += server_example2 -MODEL_DIRS += server_example3 -MODEL_DIRS += server_example4 -MODEL_DIRS += server_example5 +MODEL_DIRS += server_example_simple +MODEL_DIRS += server_example_basic_io +MODEL_DIRS += server_example_password_auth +MODEL_DIRS += server_example_write_handler MODEL_DIRS += server_example_goose MODEL_DIRS += server_example_control MODEL_DIRS += server_example_config_file diff --git a/examples/mms_client_example1/CMakeLists.txt b/examples/mms_client_example1/CMakeLists.txt deleted file mode 100644 index 5f5a0273..00000000 --- a/examples/mms_client_example1/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ - -set(mms_client_example1_SRCS - mms_client_example1.c -) - -IF(WIN32) -set_source_files_properties(${mms_client_example1_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(WIN32) - -add_executable(mms_client_example1 - ${mms_client_example1_SRCS} -) - -target_link_libraries(mms_client_example1 - iec61850 -) diff --git a/examples/mms_client_example1/Makefile b/examples/mms_client_example1/Makefile deleted file mode 100644 index 0e1aeffd..00000000 --- a/examples/mms_client_example1/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = mms_client_example1 -PROJECT_SOURCES = mms_client_example1.c - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) diff --git a/examples/mms_client_example1/mms_client_example1.c b/examples/mms_client_example1/mms_client_example1.c deleted file mode 100644 index d8ad47c6..00000000 --- a/examples/mms_client_example1/mms_client_example1.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * mms_client_example.c - * - * This is the most simple example. It illustrates how to create an MmsConnection - * object and connect to a MMS server. - * - * Copyright 2013 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. - */ - -#include -#include -#include "mms_client_connection.h" -#include "hal_thread.h" - -int main(int argc, char** argv) { - - MmsConnection con = MmsConnection_create(); - - MmsError mmsError; - - if (MmsConnection_connect(con, &mmsError, "localhost", 102)) { - // add application code here - - Thread_sleep(1000); - - printf("Send abort\n"); - MmsConnection_abort(con, &mmsError); - } - else - printf("Connect to server failed!\n"); - - MmsConnection_destroy(con); -} - diff --git a/examples/mms_client_example2/CMakeLists.txt b/examples/mms_client_example2/CMakeLists.txt deleted file mode 100644 index 15016df7..00000000 --- a/examples/mms_client_example2/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ - -set(mms_client_example2_SRCS - mms_client_example2.c -) - -IF(MSVC) -set_source_files_properties(${mms_client_example2_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(MSVC) - -add_executable(mms_client_example2 - ${mms_client_example2_SRCS} -) - -target_link_libraries(mms_client_example2 - iec61850 -) diff --git a/examples/mms_client_example2/Makefile b/examples/mms_client_example2/Makefile deleted file mode 100644 index 47f34679..00000000 --- a/examples/mms_client_example2/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = mms_client_example2 -PROJECT_SOURCES = mms_client_example2.c - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) diff --git a/examples/mms_client_example2/mms_client_example2.c b/examples/mms_client_example2/mms_client_example2.c deleted file mode 100644 index 908cb912..00000000 --- a/examples/mms_client_example2/mms_client_example2.c +++ /dev/null @@ -1,64 +0,0 @@ - -#include -#include -#include "mms_client_connection.h" - -int main(int argc, char** argv) { - - char* hostname; - int tcpPort = 102; - - if (argc > 1) - hostname = argv[1]; - else - hostname = "localhost"; - - if (argc > 2) - tcpPort = atoi(argv[2]); - - MmsConnection con = MmsConnection_create(); - - MmsError mmsError; - - /* Set maximum MMS PDU size (local detail) to 2000 byte */ - MmsConnection_setLocalDetail(con, 2000); - - if (!MmsConnection_connect(con, &mmsError, hostname, tcpPort)) { - printf("MMS connect failed!\n"); - goto exit; - } - else - printf("MMS connected.\n\n"); - - printf("Domains present on server:\n--------------------------\n"); - LinkedList nameList = MmsConnection_getDomainNames(con, &mmsError); - LinkedList_printStringList(nameList); - printf("\n"); - - LinkedList element = nameList; - - while ((element = LinkedList_getNext(element)) != NULL) { - printf("\nNamed variables in domain: %s\n-------------------------------------------------\n", (char*) element->data); - - LinkedList variableList = MmsConnection_getDomainVariableNames(con, &mmsError, (char*) element->data); - - LinkedList_printStringList(variableList); - - LinkedList_destroy(variableList); - - printf("\nNamed variable lists (data sets) in domain: %s\n", (char*) element->data); - - LinkedList dataSetList = MmsConnection_getDomainVariableListNames(con, &mmsError, (char*) element->data); - - LinkedList_printStringList(dataSetList); - - LinkedList_destroy(dataSetList); - - } - - LinkedList_destroy(nameList); - -exit: - MmsConnection_destroy(con); -} - diff --git a/examples/mms_client_example3/CMakeLists.txt b/examples/mms_client_example3/CMakeLists.txt deleted file mode 100644 index df110000..00000000 --- a/examples/mms_client_example3/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ - -set(mms_client_example3_SRCS - mms_client_example3.c -) - -IF(MSVC) -set_source_files_properties(${mms_client_example3_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(MSVC) - -add_executable(mms_client_example3 - ${mms_client_example3_SRCS} -) - -target_link_libraries(mms_client_example3 - iec61850 -) diff --git a/examples/mms_client_example3/Makefile b/examples/mms_client_example3/Makefile deleted file mode 100644 index eb6fa6c2..00000000 --- a/examples/mms_client_example3/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = mms_client_example3 -PROJECT_SOURCES = mms_client_example3.c - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) diff --git a/examples/mms_client_example3/mms_client_example3.c b/examples/mms_client_example3/mms_client_example3.c deleted file mode 100644 index eb04c1cc..00000000 --- a/examples/mms_client_example3/mms_client_example3.c +++ /dev/null @@ -1,41 +0,0 @@ - -#include -#include -#include "mms_client_connection.h" - -int main(int argc, char** argv) { - - char* hostname; - int tcpPort = 102; - - if (argc > 1) - hostname = argv[1]; - else - hostname = "localhost"; - - if (argc > 2) - tcpPort = atoi(argv[2]); - - MmsConnection con = MmsConnection_create(); - - MmsError error; - - if (!MmsConnection_connect(con, &error, hostname, tcpPort)) { - printf("MMS connect failed!\n"); - goto exit; - } - else - printf("MMS connected.\n\n"); - - MmsValue* value = - MmsConnection_readVariable(con, &error, "simpleIOGenericIO", "LLN0$GO"); - - if (value == NULL) - printf("reading value failed!\n"); - else - MmsValue_delete(value); - -exit: - MmsConnection_destroy(con); -} - diff --git a/examples/mms_client_example4/CMakeLists.txt b/examples/mms_client_example4/CMakeLists.txt deleted file mode 100644 index 96b9edfc..00000000 --- a/examples/mms_client_example4/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ - -set(mms_client_example4_SRCS - mms_client_example4.c -) - -IF(MSVC) -set_source_files_properties(${mms_client_example4_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(MSVC) - -add_executable(mms_client_example4 - ${mms_client_example4_SRCS} -) - -target_link_libraries(mms_client_example4 - iec61850 -) diff --git a/examples/mms_client_example4/Makefile b/examples/mms_client_example4/Makefile deleted file mode 100644 index 30451ce5..00000000 --- a/examples/mms_client_example4/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = mms_client_example4 -PROJECT_SOURCES = mms_client_example4.c - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) diff --git a/examples/mms_client_example4/mms_client_example4.c b/examples/mms_client_example4/mms_client_example4.c deleted file mode 100644 index 13a8d225..00000000 --- a/examples/mms_client_example4/mms_client_example4.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * mms_client_example.c - * - * Copyright 2013 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. - */ - -#include -#include -#include "mms_client_connection.h" - -int main(int argc, char** argv) { - - char* hostname; - int tcpPort = 102; - - if (argc > 1) - hostname = argv[1]; - else - hostname = "localhost"; - - if (argc > 2) - tcpPort = atoi(argv[2]); - - MmsConnection con = MmsConnection_create(); - - MmsError mmsError; - - char* password = "testpw"; - - /* use authentication */ - AcseAuthenticationParameter auth = (AcseAuthenticationParameter) calloc(1, sizeof(struct sAcseAuthenticationParameter)); - auth->mechanism = ACSE_AUTH_PASSWORD; - auth->value.password.octetString= (uint8_t*) password; - auth->value.password.passwordLength = strlen(password); - - IsoConnectionParameters connectionParameters = - MmsConnection_getIsoConnectionParameters(con); - - IsoConnectionParameters_setAcseAuthenticationParameter(connectionParameters, auth); - - if (!MmsConnection_connect(con, &mmsError, hostname, tcpPort)) { - printf("MMS connect failed!\n"); - goto exit; - } - else - printf("MMS connected.\n\n"); - - printf("Domains present on server:\n--------------------------\n"); - LinkedList nameList = MmsConnection_getDomainNames(con, &mmsError); - LinkedList_printStringList(nameList); - LinkedList_destroy(nameList); - printf("\n"); - - - printf("Named variables for domain SampleIEDDevice1:\n--------------------------------------------\n"); - nameList = MmsConnection_getDomainVariableNames(con, &mmsError, "SampleIEDDevice1"); - LinkedList_printStringList(nameList); - LinkedList_destroy(nameList); - printf("\n"); - - printf("Data sets for domain SampleIEDDevice1:\n--------------------------------------------\n"); - nameList = MmsConnection_getDomainVariableListNames(con, &mmsError, "SampleIEDDevice1"); - LinkedList_printStringList(nameList); - LinkedList_destroy(nameList); - printf("\n"); - -exit: - MmsConnection_destroy(con); -} - diff --git a/examples/mms_client_example5/CMakeLists.txt b/examples/mms_client_example5/CMakeLists.txt deleted file mode 100644 index fdc6f0a5..00000000 --- a/examples/mms_client_example5/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ - -set(mms_client_example5_SRCS - mms_client_example5.c -) - -IF(WIN32) -set_source_files_properties(${mms_client_example5_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(WIN32) - -add_executable(mms_client_example5 - ${mms_client_example5_SRCS} -) - -target_link_libraries(mms_client_example5 - iec61850 -) diff --git a/examples/mms_client_example5/Makefile b/examples/mms_client_example5/Makefile deleted file mode 100644 index 72d220c2..00000000 --- a/examples/mms_client_example5/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = mms_client_example5 -PROJECT_SOURCES = mms_client_example5.c - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) diff --git a/examples/mms_client_example5/mms_client_example5.c b/examples/mms_client_example5/mms_client_example5.c deleted file mode 100644 index ae050406..00000000 --- a/examples/mms_client_example5/mms_client_example5.c +++ /dev/null @@ -1,50 +0,0 @@ - -#include -#include -#include "mms_client_connection.h" - -int main(int argc, char** argv) { - - char* hostname; - int tcpPort = 102; - - if (argc > 1) - hostname = argv[1]; - else - hostname = "localhost"; - - if (argc > 2) - tcpPort = atoi(argv[2]); - - MmsConnection con = MmsConnection_create(); - - MmsError error; - - if (!MmsConnection_connect(con, &error, hostname, tcpPort)) { - printf("MMS connect failed!\n"); - goto exit; - } - else - printf("MMS connected.\n\n"); - - LinkedList dataSetEntries = LinkedList_create(); - - MmsVariableAccessSpecification* dataSetEntry = - MmsVariableAccessSpecification_create("BayControllerQ", "QA1CSWI1$ST$Pos"); - - LinkedList_add(dataSetEntries, (void*) dataSetEntry); - - dataSetEntry = - MmsVariableAccessSpecification_create("BayControllerQ", "QA1XCBR1$ST$Pos"); - - LinkedList_add(dataSetEntries, (void*) dataSetEntry); - - MmsConnection_defineNamedVariableList(con, &error, "BayControllerQ", "LLN0$LIBIEC61850_CLIENT", dataSetEntries); - - /* delete list and all elements */ - LinkedList_destroy(dataSetEntries); - -exit: - MmsConnection_destroy(con); -} - diff --git a/examples/server_example1/CMakeLists.txt b/examples/server_example1/CMakeLists.txt deleted file mode 100644 index 35210905..00000000 --- a/examples/server_example1/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -include_directories( - . -) - -set(server_example1_SRCS - server_example1.c - static_model.c -) - -IF(WIN32) -set_source_files_properties(${server_example1_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(WIN32) - -add_executable(server_example1 - ${server_example1_SRCS} -) - -target_link_libraries(server_example1 - iec61850 -) diff --git a/examples/server_example1/Makefile b/examples/server_example1/Makefile deleted file mode 100644 index 0643046e..00000000 --- a/examples/server_example1/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = server_example1 -PROJECT_SOURCES = server_example1.c -PROJECT_SOURCES += static_model.c - -PROJECT_ICD_FILE = sampleModel_with_dataset.icd - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -model: $(PROJECT_ICD_FILE) - java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) - - diff --git a/examples/server_example1/sampleModel_with_dataset.icd b/examples/server_example1/sampleModel_with_dataset.icd deleted file mode 100644 index 9b2c0fc1..00000000 --- a/examples/server_example1/sampleModel_with_dataset.icd +++ /dev/null @@ -1,184 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - - - - - - - - status-only - - - - - - - status-only - - - - - - - status-only - - - - - - - status-only - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - direct-with-normal-security - sbo-with-normal-security - direct-with-enhanced-security - sbo-with-enhanced-security - - - diff --git a/examples/server_example1/server_example1.c b/examples/server_example1/server_example1.c deleted file mode 100644 index f702b1ad..00000000 --- a/examples/server_example1/server_example1.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * server_example1.c - * - * Copyright 2013 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. - */ - -#include "iec61850_server.h" -#include "hal_thread.h" -#include -#include -#include - -#include "static_model.h" - -/* import IEC 61850 device model created from SCL-File */ -extern IedModel iedModel; - -static int running = 0; - -void sigint_handler(int signalId) -{ - running = 0; -} - -int main(int argc, char** argv) { - - int tcpPort = 102; - - if (argc > 1) { - tcpPort = atoi(argv[1]); - } - - IedServer iedServer = IedServer_create(&iedModel); - - // set initial measurement and status values from process - - /* MMS server will be instructed to start listening to client connections. */ - IedServer_start(iedServer, tcpPort); - - if (!IedServer_isRunning(iedServer)) { - printf("Starting server failed! Exit.\n"); - IedServer_destroy(iedServer); - exit(-1); - } - - running = 1; - - signal(SIGINT, sigint_handler); - - while (running) { - Thread_sleep(1); - } - - /* stop MMS server - close TCP server socket and all client sockets */ - IedServer_stop(iedServer); - - /* Cleanup - free all resources */ - IedServer_destroy(iedServer); -} /* main() */ diff --git a/examples/server_example1/static_model.c b/examples/server_example1/static_model.c deleted file mode 100644 index f4bb1e61..00000000 --- a/examples/server_example1/static_model.c +++ /dev/null @@ -1,1627 +0,0 @@ -/* - * static_model.c - * - * automatically generated from sampleModel_with_dataset.icd - */ -#include "static_model.h" - -static void initializeValues(); - -extern DataSet iedModelds_Device1_LLN0_dataset1; - - -extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda0; -extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda1; -extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda2; - -DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda0 = { - "Device1", - false, - "LLN0$ST$Mod$q", - -1, - NULL, - NULL, - &iedModelds_Device1_LLN0_dataset1_fcda1 -}; - -DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda1 = { - "Device1", - false, - "MMXU1$ST$Mod$q", - -1, - NULL, - NULL, - &iedModelds_Device1_LLN0_dataset1_fcda2 -}; - -DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda2 = { - "Device1", - false, - "MMXU1$CF$Mod$ctlModel", - -1, - NULL, - NULL, - NULL -}; - -DataSet iedModelds_Device1_LLN0_dataset1 = { - "Device1", - "LLN0$dataset1", - 3, - &iedModelds_Device1_LLN0_dataset1_fcda0, - NULL -}; - -LogicalDevice iedModel_Device1 = { - LogicalDeviceModelType, - "Device1", - (ModelNode*) &iedModel, - NULL, - (ModelNode*) &iedModel_Device1_LLN0 -}; - -LogicalNode iedModel_Device1_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_Device1, - (ModelNode*) &iedModel_Device1_LPHD1, - (ModelNode*) &iedModel_Device1_LLN0_Mod, -}; - -DataObject iedModel_Device1_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Device1_LLN0, - (ModelNode*) &iedModel_Device1_LLN0_Beh, - (ModelNode*) &iedModel_Device1_LLN0_Mod_q, - 0 -}; - -DataAttribute iedModel_Device1_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_LLN0_Mod, - (ModelNode*) &iedModel_Device1_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_LLN0_Mod, - (ModelNode*) &iedModel_Device1_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Device1_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Device1_LLN0, - (ModelNode*) &iedModel_Device1_LLN0_Health, - (ModelNode*) &iedModel_Device1_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Device1_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_LLN0_Beh, - (ModelNode*) &iedModel_Device1_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_LLN0_Beh, - (ModelNode*) &iedModel_Device1_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Device1_LLN0, - (ModelNode*) &iedModel_Device1_LLN0_NamPlt, - (ModelNode*) &iedModel_Device1_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_Device1_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_LLN0_Health, - (ModelNode*) &iedModel_Device1_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_LLN0_Health, - (ModelNode*) &iedModel_Device1_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Device1_LLN0, - NULL, - (ModelNode*) &iedModel_Device1_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Device1_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Device1_LLN0_NamPlt, - (ModelNode*) &iedModel_Device1_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Device1_LLN0_NamPlt, - (ModelNode*) &iedModel_Device1_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Device1_LLN0_NamPlt, - (ModelNode*) &iedModel_Device1_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_Device1_LLN0_NamPlt, - (ModelNode*) &iedModel_Device1_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_Device1_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_Device1_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_Device1, - (ModelNode*) &iedModel_Device1_DGEN1, - (ModelNode*) &iedModel_Device1_LPHD1_PhyNam, -}; - -DataObject iedModel_Device1_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_Device1_LPHD1, - (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Device1_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_Device1_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Device1_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_Device1_LPHD1, - (ModelNode*) &iedModel_Device1_LPHD1_Proxy, - (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_Device1_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_Device1_LPHD1, - NULL, - (ModelNode*) &iedModel_Device1_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_Device1_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_LPHD1_Proxy, - (ModelNode*) &iedModel_Device1_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_LPHD1_Proxy, - (ModelNode*) &iedModel_Device1_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_Device1_DGEN1 = { - LogicalNodeModelType, - "DGEN1", - (ModelNode*) &iedModel_Device1, - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DGEN1_Mod, -}; - -DataObject iedModel_Device1_DGEN1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Device1_DGEN1, - (ModelNode*) &iedModel_Device1_DGEN1_Beh, - (ModelNode*) &iedModel_Device1_DGEN1_Mod_q, - 0 -}; - -DataAttribute iedModel_Device1_DGEN1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DGEN1_Mod, - (ModelNode*) &iedModel_Device1_DGEN1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DGEN1_Mod, - (ModelNode*) &iedModel_Device1_DGEN1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Device1_DGEN1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DGEN1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Device1_DGEN1, - (ModelNode*) &iedModel_Device1_DGEN1_Health, - (ModelNode*) &iedModel_Device1_DGEN1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Device1_DGEN1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_DGEN1_Beh, - (ModelNode*) &iedModel_Device1_DGEN1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DGEN1_Beh, - (ModelNode*) &iedModel_Device1_DGEN1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DGEN1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DGEN1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Device1_DGEN1, - (ModelNode*) &iedModel_Device1_DGEN1_NamPlt, - (ModelNode*) &iedModel_Device1_DGEN1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Device1_DGEN1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_DGEN1_Health, - (ModelNode*) &iedModel_Device1_DGEN1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DGEN1_Health, - (ModelNode*) &iedModel_Device1_DGEN1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DGEN1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DGEN1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Device1_DGEN1, - (ModelNode*) &iedModel_Device1_DGEN1_OpTmh, - (ModelNode*) &iedModel_Device1_DGEN1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Device1_DGEN1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Device1_DGEN1_NamPlt, - (ModelNode*) &iedModel_Device1_DGEN1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Device1_DGEN1_NamPlt, - (ModelNode*) &iedModel_Device1_DGEN1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Device1_DGEN1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DGEN1_OpTmh = { - DataObjectModelType, - "OpTmh", - (ModelNode*) &iedModel_Device1_DGEN1, - (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt, - (ModelNode*) &iedModel_Device1_DGEN1_OpTmh_stVal, - 0 -}; - -DataAttribute iedModel_Device1_DGEN1_OpTmh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_DGEN1_OpTmh, - (ModelNode*) &iedModel_Device1_DGEN1_OpTmh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_OpTmh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DGEN1_OpTmh, - (ModelNode*) &iedModel_Device1_DGEN1_OpTmh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_OpTmh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DGEN1_OpTmh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DGEN1_GnOpSt = { - DataObjectModelType, - "GnOpSt", - (ModelNode*) &iedModel_Device1_DGEN1, - (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs, - (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt_stVal, - 0 -}; - -DataAttribute iedModel_Device1_DGEN1_GnOpSt_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt, - (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_GnOpSt_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt, - (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_GnOpSt_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DGEN1_OpTmsRs = { - DataObjectModelType, - "OpTmsRs", - (ModelNode*) &iedModel_Device1_DGEN1, - (ModelNode*) &iedModel_Device1_DGEN1_TotWh, - (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs_stVal, - 0 -}; - -DataAttribute iedModel_Device1_DGEN1_OpTmsRs_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs, - (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_OpTmsRs_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs, - (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_OpTmsRs_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DGEN1_TotWh = { - DataObjectModelType, - "TotWh", - (ModelNode*) &iedModel_Device1_DGEN1, - NULL, - (ModelNode*) &iedModel_Device1_DGEN1_TotWh_mag, - 0 -}; - -DataAttribute iedModel_Device1_DGEN1_TotWh_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Device1_DGEN1_TotWh, - (ModelNode*) &iedModel_Device1_DGEN1_TotWh_q, - (ModelNode*) &iedModel_Device1_DGEN1_TotWh_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_TotWh_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Device1_DGEN1_TotWh_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_TotWh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DGEN1_TotWh, - (ModelNode*) &iedModel_Device1_DGEN1_TotWh_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DGEN1_TotWh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DGEN1_TotWh, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_Device1_DSCH1 = { - LogicalNodeModelType, - "DSCH1", - (ModelNode*) &iedModel_Device1, - (ModelNode*) &iedModel_Device1_MMXU1, - (ModelNode*) &iedModel_Device1_DSCH1_Mod, -}; - -DataObject iedModel_Device1_DSCH1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DSCH1_Beh, - (ModelNode*) &iedModel_Device1_DSCH1_Mod_q, - 0 -}; - -DataAttribute iedModel_Device1_DSCH1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DSCH1_Mod, - (ModelNode*) &iedModel_Device1_DSCH1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DSCH1_Mod, - (ModelNode*) &iedModel_Device1_DSCH1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Device1_DSCH1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DSCH1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DSCH1_Health, - (ModelNode*) &iedModel_Device1_DSCH1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Device1_DSCH1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_DSCH1_Beh, - (ModelNode*) &iedModel_Device1_DSCH1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DSCH1_Beh, - (ModelNode*) &iedModel_Device1_DSCH1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DSCH1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DSCH1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DSCH1_NamPlt, - (ModelNode*) &iedModel_Device1_DSCH1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Device1_DSCH1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_DSCH1_Health, - (ModelNode*) &iedModel_Device1_DSCH1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DSCH1_Health, - (ModelNode*) &iedModel_Device1_DSCH1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DSCH1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DSCH1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DSCH1_SchdSt, - (ModelNode*) &iedModel_Device1_DSCH1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Device1_DSCH1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Device1_DSCH1_NamPlt, - (ModelNode*) &iedModel_Device1_DSCH1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Device1_DSCH1_NamPlt, - (ModelNode*) &iedModel_Device1_DSCH1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Device1_DSCH1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DSCH1_SchdSt = { - DataObjectModelType, - "SchdSt", - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DSCH1_SchdId, - (ModelNode*) &iedModel_Device1_DSCH1_SchdSt_stVal, - 0 -}; - -DataAttribute iedModel_Device1_DSCH1_SchdSt_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_DSCH1_SchdSt, - (ModelNode*) &iedModel_Device1_DSCH1_SchdSt_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_SchdSt_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_DSCH1_SchdSt, - (ModelNode*) &iedModel_Device1_DSCH1_SchdSt_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_SchdSt_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_DSCH1_SchdSt, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_DSCH1_SchdId = { - DataObjectModelType, - "SchdId", - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DSCH1_SchdCat, - NULL, - 0 -}; - -DataObject iedModel_Device1_DSCH1_SchdCat = { - DataObjectModelType, - "SchdCat", - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DSCH1_SchdTyp, - NULL, - 0 -}; - -DataObject iedModel_Device1_DSCH1_SchdTyp = { - DataObjectModelType, - "SchdTyp", - (ModelNode*) &iedModel_Device1_DSCH1, - (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm, - NULL, - 0 -}; - -DataObject iedModel_Device1_DSCH1_SchdAbsTm = { - DataObjectModelType, - "SchdAbsTm", - (ModelNode*) &iedModel_Device1_DSCH1, - NULL, - (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm_val, - 0 -}; - -DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_val = { - DataAttributeModelType, - "val", - (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm, - (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm_time, - NULL, - 255, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_time = { - DataAttributeModelType, - "time", - (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm, - NULL, - NULL, - 255, - IEC61850_FC_SP, - IEC61850_TIMESTAMP, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -LogicalNode iedModel_Device1_MMXU1 = { - LogicalNodeModelType, - "MMXU1", - (ModelNode*) &iedModel_Device1, - (ModelNode*) &iedModel_Device1_MMXU2, - (ModelNode*) &iedModel_Device1_MMXU1_Mod, -}; - -DataObject iedModel_Device1_MMXU1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Device1_MMXU1, - (ModelNode*) &iedModel_Device1_MMXU1_Beh, - (ModelNode*) &iedModel_Device1_MMXU1_Mod_q, - 0 -}; - -DataAttribute iedModel_Device1_MMXU1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_MMXU1_Mod, - (ModelNode*) &iedModel_Device1_MMXU1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_MMXU1_Mod, - (ModelNode*) &iedModel_Device1_MMXU1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Device1_MMXU1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_MMXU1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Device1_MMXU1, - (ModelNode*) &iedModel_Device1_MMXU1_Health, - (ModelNode*) &iedModel_Device1_MMXU1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Device1_MMXU1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_MMXU1_Beh, - (ModelNode*) &iedModel_Device1_MMXU1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_MMXU1_Beh, - (ModelNode*) &iedModel_Device1_MMXU1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_MMXU1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_MMXU1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Device1_MMXU1, - (ModelNode*) &iedModel_Device1_MMXU1_NamPlt, - (ModelNode*) &iedModel_Device1_MMXU1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Device1_MMXU1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_MMXU1_Health, - (ModelNode*) &iedModel_Device1_MMXU1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_MMXU1_Health, - (ModelNode*) &iedModel_Device1_MMXU1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_MMXU1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_MMXU1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Device1_MMXU1, - NULL, - (ModelNode*) &iedModel_Device1_MMXU1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Device1_MMXU1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Device1_MMXU1_NamPlt, - (ModelNode*) &iedModel_Device1_MMXU1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Device1_MMXU1_NamPlt, - (ModelNode*) &iedModel_Device1_MMXU1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Device1_MMXU1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_Device1_MMXU2 = { - LogicalNodeModelType, - "MMXU2", - (ModelNode*) &iedModel_Device1, - NULL, - (ModelNode*) &iedModel_Device1_MMXU2_Mod, -}; - -DataObject iedModel_Device1_MMXU2_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Device1_MMXU2, - (ModelNode*) &iedModel_Device1_MMXU2_Beh, - (ModelNode*) &iedModel_Device1_MMXU2_Mod_q, - 0 -}; - -DataAttribute iedModel_Device1_MMXU2_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_MMXU2_Mod, - (ModelNode*) &iedModel_Device1_MMXU2_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_MMXU2_Mod, - (ModelNode*) &iedModel_Device1_MMXU2_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Device1_MMXU2_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_MMXU2_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Device1_MMXU2, - (ModelNode*) &iedModel_Device1_MMXU2_Health, - (ModelNode*) &iedModel_Device1_MMXU2_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Device1_MMXU2_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_MMXU2_Beh, - (ModelNode*) &iedModel_Device1_MMXU2_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_MMXU2_Beh, - (ModelNode*) &iedModel_Device1_MMXU2_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_MMXU2_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_MMXU2_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Device1_MMXU2, - (ModelNode*) &iedModel_Device1_MMXU2_NamPlt, - (ModelNode*) &iedModel_Device1_MMXU2_Health_stVal, - 0 -}; - -DataAttribute iedModel_Device1_MMXU2_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Device1_MMXU2_Health, - (ModelNode*) &iedModel_Device1_MMXU2_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_MMXU2_Health, - (ModelNode*) &iedModel_Device1_MMXU2_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_MMXU2_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_MMXU2_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Device1_MMXU2, - (ModelNode*) &iedModel_Device1_MMXU2_TotW, - (ModelNode*) &iedModel_Device1_MMXU2_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Device1_MMXU2_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Device1_MMXU2_NamPlt, - (ModelNode*) &iedModel_Device1_MMXU2_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Device1_MMXU2_NamPlt, - (ModelNode*) &iedModel_Device1_MMXU2_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Device1_MMXU2_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Device1_MMXU2_TotW = { - DataObjectModelType, - "TotW", - (ModelNode*) &iedModel_Device1_MMXU2, - NULL, - (ModelNode*) &iedModel_Device1_MMXU2_TotW_mag, - 0 -}; - -DataAttribute iedModel_Device1_MMXU2_TotW_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Device1_MMXU2_TotW, - (ModelNode*) &iedModel_Device1_MMXU2_TotW_q, - (ModelNode*) &iedModel_Device1_MMXU2_TotW_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_TotW_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Device1_MMXU2_TotW_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_TotW_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Device1_MMXU2_TotW, - (ModelNode*) &iedModel_Device1_MMXU2_TotW_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Device1_MMXU2_TotW_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Device1_MMXU2_TotW, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -extern ReportControlBlock iedModel_Device1_LLN0_report0; - -ReportControlBlock iedModel_Device1_LLN0_report0 = {&iedModel_Device1_LLN0, "LLN0_Events_BuffRep01", "LLN0$RP$brcbEV1", true, "dataset1", 1, 25, 239, 50, 900000, NULL}; - - - - - - - -IedModel iedModel = { - "SampleIED", - &iedModel_Device1, - &iedModelds_Device1_LLN0_dataset1, - &iedModel_Device1_LLN0_report0, - NULL, - NULL, - NULL, - NULL, - NULL, - initializeValues -}; - -static void -initializeValues() -{ - -iedModel_Device1_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Device1_DGEN1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Device1_DSCH1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Device1_MMXU1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Device1_MMXU2_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); -} diff --git a/examples/server_example1/static_model.h b/examples/server_example1/static_model.h deleted file mode 100644 index 208787e3..00000000 --- a/examples/server_example1/static_model.h +++ /dev/null @@ -1,281 +0,0 @@ -/* - * static_model.h - * - * automatically generated from sampleModel_with_dataset.icd - */ - -#ifndef STATIC_MODEL_H_ -#define STATIC_MODEL_H_ - -#include -#include "iec61850_model.h" - -extern IedModel iedModel; -extern LogicalDevice iedModel_Device1; -extern LogicalNode iedModel_Device1_LLN0; -extern DataObject iedModel_Device1_LLN0_Mod; -extern DataAttribute iedModel_Device1_LLN0_Mod_q; -extern DataAttribute iedModel_Device1_LLN0_Mod_t; -extern DataAttribute iedModel_Device1_LLN0_Mod_ctlModel; -extern DataObject iedModel_Device1_LLN0_Beh; -extern DataAttribute iedModel_Device1_LLN0_Beh_stVal; -extern DataAttribute iedModel_Device1_LLN0_Beh_q; -extern DataAttribute iedModel_Device1_LLN0_Beh_t; -extern DataObject iedModel_Device1_LLN0_Health; -extern DataAttribute iedModel_Device1_LLN0_Health_stVal; -extern DataAttribute iedModel_Device1_LLN0_Health_q; -extern DataAttribute iedModel_Device1_LLN0_Health_t; -extern DataObject iedModel_Device1_LLN0_NamPlt; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_d; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Device1_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Device1_LPHD1; -extern DataObject iedModel_Device1_LPHD1_PhyNam; -extern DataAttribute iedModel_Device1_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Device1_LPHD1_PhyHealth; -extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_t; -extern DataObject iedModel_Device1_LPHD1_Proxy; -extern DataAttribute iedModel_Device1_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Device1_LPHD1_Proxy_q; -extern DataAttribute iedModel_Device1_LPHD1_Proxy_t; -extern LogicalNode iedModel_Device1_DGEN1; -extern DataObject iedModel_Device1_DGEN1_Mod; -extern DataAttribute iedModel_Device1_DGEN1_Mod_q; -extern DataAttribute iedModel_Device1_DGEN1_Mod_t; -extern DataAttribute iedModel_Device1_DGEN1_Mod_ctlModel; -extern DataObject iedModel_Device1_DGEN1_Beh; -extern DataAttribute iedModel_Device1_DGEN1_Beh_stVal; -extern DataAttribute iedModel_Device1_DGEN1_Beh_q; -extern DataAttribute iedModel_Device1_DGEN1_Beh_t; -extern DataObject iedModel_Device1_DGEN1_Health; -extern DataAttribute iedModel_Device1_DGEN1_Health_stVal; -extern DataAttribute iedModel_Device1_DGEN1_Health_q; -extern DataAttribute iedModel_Device1_DGEN1_Health_t; -extern DataObject iedModel_Device1_DGEN1_NamPlt; -extern DataAttribute iedModel_Device1_DGEN1_NamPlt_vendor; -extern DataAttribute iedModel_Device1_DGEN1_NamPlt_swRev; -extern DataAttribute iedModel_Device1_DGEN1_NamPlt_d; -extern DataObject iedModel_Device1_DGEN1_OpTmh; -extern DataAttribute iedModel_Device1_DGEN1_OpTmh_stVal; -extern DataAttribute iedModel_Device1_DGEN1_OpTmh_q; -extern DataAttribute iedModel_Device1_DGEN1_OpTmh_t; -extern DataObject iedModel_Device1_DGEN1_GnOpSt; -extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_stVal; -extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_q; -extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_t; -extern DataObject iedModel_Device1_DGEN1_OpTmsRs; -extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_stVal; -extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_q; -extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_t; -extern DataObject iedModel_Device1_DGEN1_TotWh; -extern DataAttribute iedModel_Device1_DGEN1_TotWh_mag; -extern DataAttribute iedModel_Device1_DGEN1_TotWh_mag_f; -extern DataAttribute iedModel_Device1_DGEN1_TotWh_q; -extern DataAttribute iedModel_Device1_DGEN1_TotWh_t; -extern LogicalNode iedModel_Device1_DSCH1; -extern DataObject iedModel_Device1_DSCH1_Mod; -extern DataAttribute iedModel_Device1_DSCH1_Mod_q; -extern DataAttribute iedModel_Device1_DSCH1_Mod_t; -extern DataAttribute iedModel_Device1_DSCH1_Mod_ctlModel; -extern DataObject iedModel_Device1_DSCH1_Beh; -extern DataAttribute iedModel_Device1_DSCH1_Beh_stVal; -extern DataAttribute iedModel_Device1_DSCH1_Beh_q; -extern DataAttribute iedModel_Device1_DSCH1_Beh_t; -extern DataObject iedModel_Device1_DSCH1_Health; -extern DataAttribute iedModel_Device1_DSCH1_Health_stVal; -extern DataAttribute iedModel_Device1_DSCH1_Health_q; -extern DataAttribute iedModel_Device1_DSCH1_Health_t; -extern DataObject iedModel_Device1_DSCH1_NamPlt; -extern DataAttribute iedModel_Device1_DSCH1_NamPlt_vendor; -extern DataAttribute iedModel_Device1_DSCH1_NamPlt_swRev; -extern DataAttribute iedModel_Device1_DSCH1_NamPlt_d; -extern DataObject iedModel_Device1_DSCH1_SchdSt; -extern DataAttribute iedModel_Device1_DSCH1_SchdSt_stVal; -extern DataAttribute iedModel_Device1_DSCH1_SchdSt_q; -extern DataAttribute iedModel_Device1_DSCH1_SchdSt_t; -extern DataObject iedModel_Device1_DSCH1_SchdId; -extern DataObject iedModel_Device1_DSCH1_SchdCat; -extern DataObject iedModel_Device1_DSCH1_SchdTyp; -extern DataObject iedModel_Device1_DSCH1_SchdAbsTm; -extern DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_val; -extern DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_time; -extern LogicalNode iedModel_Device1_MMXU1; -extern DataObject iedModel_Device1_MMXU1_Mod; -extern DataAttribute iedModel_Device1_MMXU1_Mod_q; -extern DataAttribute iedModel_Device1_MMXU1_Mod_t; -extern DataAttribute iedModel_Device1_MMXU1_Mod_ctlModel; -extern DataObject iedModel_Device1_MMXU1_Beh; -extern DataAttribute iedModel_Device1_MMXU1_Beh_stVal; -extern DataAttribute iedModel_Device1_MMXU1_Beh_q; -extern DataAttribute iedModel_Device1_MMXU1_Beh_t; -extern DataObject iedModel_Device1_MMXU1_Health; -extern DataAttribute iedModel_Device1_MMXU1_Health_stVal; -extern DataAttribute iedModel_Device1_MMXU1_Health_q; -extern DataAttribute iedModel_Device1_MMXU1_Health_t; -extern DataObject iedModel_Device1_MMXU1_NamPlt; -extern DataAttribute iedModel_Device1_MMXU1_NamPlt_vendor; -extern DataAttribute iedModel_Device1_MMXU1_NamPlt_swRev; -extern DataAttribute iedModel_Device1_MMXU1_NamPlt_d; -extern LogicalNode iedModel_Device1_MMXU2; -extern DataObject iedModel_Device1_MMXU2_Mod; -extern DataAttribute iedModel_Device1_MMXU2_Mod_q; -extern DataAttribute iedModel_Device1_MMXU2_Mod_t; -extern DataAttribute iedModel_Device1_MMXU2_Mod_ctlModel; -extern DataObject iedModel_Device1_MMXU2_Beh; -extern DataAttribute iedModel_Device1_MMXU2_Beh_stVal; -extern DataAttribute iedModel_Device1_MMXU2_Beh_q; -extern DataAttribute iedModel_Device1_MMXU2_Beh_t; -extern DataObject iedModel_Device1_MMXU2_Health; -extern DataAttribute iedModel_Device1_MMXU2_Health_stVal; -extern DataAttribute iedModel_Device1_MMXU2_Health_q; -extern DataAttribute iedModel_Device1_MMXU2_Health_t; -extern DataObject iedModel_Device1_MMXU2_NamPlt; -extern DataAttribute iedModel_Device1_MMXU2_NamPlt_vendor; -extern DataAttribute iedModel_Device1_MMXU2_NamPlt_swRev; -extern DataAttribute iedModel_Device1_MMXU2_NamPlt_d; -extern DataObject iedModel_Device1_MMXU2_TotW; -extern DataAttribute iedModel_Device1_MMXU2_TotW_mag; -extern DataAttribute iedModel_Device1_MMXU2_TotW_mag_f; -extern DataAttribute iedModel_Device1_MMXU2_TotW_q; -extern DataAttribute iedModel_Device1_MMXU2_TotW_t; - - - -#define IEDMODEL_Device1 (&iedModel_Device1) -#define IEDMODEL_Device1_LLN0 (&iedModel_Device1_LLN0) -#define IEDMODEL_Device1_LLN0_Mod (&iedModel_Device1_LLN0_Mod) -#define IEDMODEL_Device1_LLN0_Mod_q (&iedModel_Device1_LLN0_Mod_q) -#define IEDMODEL_Device1_LLN0_Mod_t (&iedModel_Device1_LLN0_Mod_t) -#define IEDMODEL_Device1_LLN0_Mod_ctlModel (&iedModel_Device1_LLN0_Mod_ctlModel) -#define IEDMODEL_Device1_LLN0_Beh (&iedModel_Device1_LLN0_Beh) -#define IEDMODEL_Device1_LLN0_Beh_stVal (&iedModel_Device1_LLN0_Beh_stVal) -#define IEDMODEL_Device1_LLN0_Beh_q (&iedModel_Device1_LLN0_Beh_q) -#define IEDMODEL_Device1_LLN0_Beh_t (&iedModel_Device1_LLN0_Beh_t) -#define IEDMODEL_Device1_LLN0_Health (&iedModel_Device1_LLN0_Health) -#define IEDMODEL_Device1_LLN0_Health_stVal (&iedModel_Device1_LLN0_Health_stVal) -#define IEDMODEL_Device1_LLN0_Health_q (&iedModel_Device1_LLN0_Health_q) -#define IEDMODEL_Device1_LLN0_Health_t (&iedModel_Device1_LLN0_Health_t) -#define IEDMODEL_Device1_LLN0_NamPlt (&iedModel_Device1_LLN0_NamPlt) -#define IEDMODEL_Device1_LLN0_NamPlt_vendor (&iedModel_Device1_LLN0_NamPlt_vendor) -#define IEDMODEL_Device1_LLN0_NamPlt_swRev (&iedModel_Device1_LLN0_NamPlt_swRev) -#define IEDMODEL_Device1_LLN0_NamPlt_d (&iedModel_Device1_LLN0_NamPlt_d) -#define IEDMODEL_Device1_LLN0_NamPlt_configRev (&iedModel_Device1_LLN0_NamPlt_configRev) -#define IEDMODEL_Device1_LLN0_NamPlt_ldNs (&iedModel_Device1_LLN0_NamPlt_ldNs) -#define IEDMODEL_Device1_LPHD1 (&iedModel_Device1_LPHD1) -#define IEDMODEL_Device1_LPHD1_PhyNam (&iedModel_Device1_LPHD1_PhyNam) -#define IEDMODEL_Device1_LPHD1_PhyNam_vendor (&iedModel_Device1_LPHD1_PhyNam_vendor) -#define IEDMODEL_Device1_LPHD1_PhyHealth (&iedModel_Device1_LPHD1_PhyHealth) -#define IEDMODEL_Device1_LPHD1_PhyHealth_stVal (&iedModel_Device1_LPHD1_PhyHealth_stVal) -#define IEDMODEL_Device1_LPHD1_PhyHealth_q (&iedModel_Device1_LPHD1_PhyHealth_q) -#define IEDMODEL_Device1_LPHD1_PhyHealth_t (&iedModel_Device1_LPHD1_PhyHealth_t) -#define IEDMODEL_Device1_LPHD1_Proxy (&iedModel_Device1_LPHD1_Proxy) -#define IEDMODEL_Device1_LPHD1_Proxy_stVal (&iedModel_Device1_LPHD1_Proxy_stVal) -#define IEDMODEL_Device1_LPHD1_Proxy_q (&iedModel_Device1_LPHD1_Proxy_q) -#define IEDMODEL_Device1_LPHD1_Proxy_t (&iedModel_Device1_LPHD1_Proxy_t) -#define IEDMODEL_Device1_DGEN1 (&iedModel_Device1_DGEN1) -#define IEDMODEL_Device1_DGEN1_Mod (&iedModel_Device1_DGEN1_Mod) -#define IEDMODEL_Device1_DGEN1_Mod_q (&iedModel_Device1_DGEN1_Mod_q) -#define IEDMODEL_Device1_DGEN1_Mod_t (&iedModel_Device1_DGEN1_Mod_t) -#define IEDMODEL_Device1_DGEN1_Mod_ctlModel (&iedModel_Device1_DGEN1_Mod_ctlModel) -#define IEDMODEL_Device1_DGEN1_Beh (&iedModel_Device1_DGEN1_Beh) -#define IEDMODEL_Device1_DGEN1_Beh_stVal (&iedModel_Device1_DGEN1_Beh_stVal) -#define IEDMODEL_Device1_DGEN1_Beh_q (&iedModel_Device1_DGEN1_Beh_q) -#define IEDMODEL_Device1_DGEN1_Beh_t (&iedModel_Device1_DGEN1_Beh_t) -#define IEDMODEL_Device1_DGEN1_Health (&iedModel_Device1_DGEN1_Health) -#define IEDMODEL_Device1_DGEN1_Health_stVal (&iedModel_Device1_DGEN1_Health_stVal) -#define IEDMODEL_Device1_DGEN1_Health_q (&iedModel_Device1_DGEN1_Health_q) -#define IEDMODEL_Device1_DGEN1_Health_t (&iedModel_Device1_DGEN1_Health_t) -#define IEDMODEL_Device1_DGEN1_NamPlt (&iedModel_Device1_DGEN1_NamPlt) -#define IEDMODEL_Device1_DGEN1_NamPlt_vendor (&iedModel_Device1_DGEN1_NamPlt_vendor) -#define IEDMODEL_Device1_DGEN1_NamPlt_swRev (&iedModel_Device1_DGEN1_NamPlt_swRev) -#define IEDMODEL_Device1_DGEN1_NamPlt_d (&iedModel_Device1_DGEN1_NamPlt_d) -#define IEDMODEL_Device1_DGEN1_OpTmh (&iedModel_Device1_DGEN1_OpTmh) -#define IEDMODEL_Device1_DGEN1_OpTmh_stVal (&iedModel_Device1_DGEN1_OpTmh_stVal) -#define IEDMODEL_Device1_DGEN1_OpTmh_q (&iedModel_Device1_DGEN1_OpTmh_q) -#define IEDMODEL_Device1_DGEN1_OpTmh_t (&iedModel_Device1_DGEN1_OpTmh_t) -#define IEDMODEL_Device1_DGEN1_GnOpSt (&iedModel_Device1_DGEN1_GnOpSt) -#define IEDMODEL_Device1_DGEN1_GnOpSt_stVal (&iedModel_Device1_DGEN1_GnOpSt_stVal) -#define IEDMODEL_Device1_DGEN1_GnOpSt_q (&iedModel_Device1_DGEN1_GnOpSt_q) -#define IEDMODEL_Device1_DGEN1_GnOpSt_t (&iedModel_Device1_DGEN1_GnOpSt_t) -#define IEDMODEL_Device1_DGEN1_OpTmsRs (&iedModel_Device1_DGEN1_OpTmsRs) -#define IEDMODEL_Device1_DGEN1_OpTmsRs_stVal (&iedModel_Device1_DGEN1_OpTmsRs_stVal) -#define IEDMODEL_Device1_DGEN1_OpTmsRs_q (&iedModel_Device1_DGEN1_OpTmsRs_q) -#define IEDMODEL_Device1_DGEN1_OpTmsRs_t (&iedModel_Device1_DGEN1_OpTmsRs_t) -#define IEDMODEL_Device1_DGEN1_TotWh (&iedModel_Device1_DGEN1_TotWh) -#define IEDMODEL_Device1_DGEN1_TotWh_mag (&iedModel_Device1_DGEN1_TotWh_mag) -#define IEDMODEL_Device1_DGEN1_TotWh_mag_f (&iedModel_Device1_DGEN1_TotWh_mag_f) -#define IEDMODEL_Device1_DGEN1_TotWh_q (&iedModel_Device1_DGEN1_TotWh_q) -#define IEDMODEL_Device1_DGEN1_TotWh_t (&iedModel_Device1_DGEN1_TotWh_t) -#define IEDMODEL_Device1_DSCH1 (&iedModel_Device1_DSCH1) -#define IEDMODEL_Device1_DSCH1_Mod (&iedModel_Device1_DSCH1_Mod) -#define IEDMODEL_Device1_DSCH1_Mod_q (&iedModel_Device1_DSCH1_Mod_q) -#define IEDMODEL_Device1_DSCH1_Mod_t (&iedModel_Device1_DSCH1_Mod_t) -#define IEDMODEL_Device1_DSCH1_Mod_ctlModel (&iedModel_Device1_DSCH1_Mod_ctlModel) -#define IEDMODEL_Device1_DSCH1_Beh (&iedModel_Device1_DSCH1_Beh) -#define IEDMODEL_Device1_DSCH1_Beh_stVal (&iedModel_Device1_DSCH1_Beh_stVal) -#define IEDMODEL_Device1_DSCH1_Beh_q (&iedModel_Device1_DSCH1_Beh_q) -#define IEDMODEL_Device1_DSCH1_Beh_t (&iedModel_Device1_DSCH1_Beh_t) -#define IEDMODEL_Device1_DSCH1_Health (&iedModel_Device1_DSCH1_Health) -#define IEDMODEL_Device1_DSCH1_Health_stVal (&iedModel_Device1_DSCH1_Health_stVal) -#define IEDMODEL_Device1_DSCH1_Health_q (&iedModel_Device1_DSCH1_Health_q) -#define IEDMODEL_Device1_DSCH1_Health_t (&iedModel_Device1_DSCH1_Health_t) -#define IEDMODEL_Device1_DSCH1_NamPlt (&iedModel_Device1_DSCH1_NamPlt) -#define IEDMODEL_Device1_DSCH1_NamPlt_vendor (&iedModel_Device1_DSCH1_NamPlt_vendor) -#define IEDMODEL_Device1_DSCH1_NamPlt_swRev (&iedModel_Device1_DSCH1_NamPlt_swRev) -#define IEDMODEL_Device1_DSCH1_NamPlt_d (&iedModel_Device1_DSCH1_NamPlt_d) -#define IEDMODEL_Device1_DSCH1_SchdSt (&iedModel_Device1_DSCH1_SchdSt) -#define IEDMODEL_Device1_DSCH1_SchdSt_stVal (&iedModel_Device1_DSCH1_SchdSt_stVal) -#define IEDMODEL_Device1_DSCH1_SchdSt_q (&iedModel_Device1_DSCH1_SchdSt_q) -#define IEDMODEL_Device1_DSCH1_SchdSt_t (&iedModel_Device1_DSCH1_SchdSt_t) -#define IEDMODEL_Device1_DSCH1_SchdId (&iedModel_Device1_DSCH1_SchdId) -#define IEDMODEL_Device1_DSCH1_SchdCat (&iedModel_Device1_DSCH1_SchdCat) -#define IEDMODEL_Device1_DSCH1_SchdTyp (&iedModel_Device1_DSCH1_SchdTyp) -#define IEDMODEL_Device1_DSCH1_SchdAbsTm (&iedModel_Device1_DSCH1_SchdAbsTm) -#define IEDMODEL_Device1_DSCH1_SchdAbsTm_val (&iedModel_Device1_DSCH1_SchdAbsTm_val) -#define IEDMODEL_Device1_DSCH1_SchdAbsTm_time (&iedModel_Device1_DSCH1_SchdAbsTm_time) -#define IEDMODEL_Device1_MMXU1 (&iedModel_Device1_MMXU1) -#define IEDMODEL_Device1_MMXU1_Mod (&iedModel_Device1_MMXU1_Mod) -#define IEDMODEL_Device1_MMXU1_Mod_q (&iedModel_Device1_MMXU1_Mod_q) -#define IEDMODEL_Device1_MMXU1_Mod_t (&iedModel_Device1_MMXU1_Mod_t) -#define IEDMODEL_Device1_MMXU1_Mod_ctlModel (&iedModel_Device1_MMXU1_Mod_ctlModel) -#define IEDMODEL_Device1_MMXU1_Beh (&iedModel_Device1_MMXU1_Beh) -#define IEDMODEL_Device1_MMXU1_Beh_stVal (&iedModel_Device1_MMXU1_Beh_stVal) -#define IEDMODEL_Device1_MMXU1_Beh_q (&iedModel_Device1_MMXU1_Beh_q) -#define IEDMODEL_Device1_MMXU1_Beh_t (&iedModel_Device1_MMXU1_Beh_t) -#define IEDMODEL_Device1_MMXU1_Health (&iedModel_Device1_MMXU1_Health) -#define IEDMODEL_Device1_MMXU1_Health_stVal (&iedModel_Device1_MMXU1_Health_stVal) -#define IEDMODEL_Device1_MMXU1_Health_q (&iedModel_Device1_MMXU1_Health_q) -#define IEDMODEL_Device1_MMXU1_Health_t (&iedModel_Device1_MMXU1_Health_t) -#define IEDMODEL_Device1_MMXU1_NamPlt (&iedModel_Device1_MMXU1_NamPlt) -#define IEDMODEL_Device1_MMXU1_NamPlt_vendor (&iedModel_Device1_MMXU1_NamPlt_vendor) -#define IEDMODEL_Device1_MMXU1_NamPlt_swRev (&iedModel_Device1_MMXU1_NamPlt_swRev) -#define IEDMODEL_Device1_MMXU1_NamPlt_d (&iedModel_Device1_MMXU1_NamPlt_d) -#define IEDMODEL_Device1_MMXU2 (&iedModel_Device1_MMXU2) -#define IEDMODEL_Device1_MMXU2_Mod (&iedModel_Device1_MMXU2_Mod) -#define IEDMODEL_Device1_MMXU2_Mod_q (&iedModel_Device1_MMXU2_Mod_q) -#define IEDMODEL_Device1_MMXU2_Mod_t (&iedModel_Device1_MMXU2_Mod_t) -#define IEDMODEL_Device1_MMXU2_Mod_ctlModel (&iedModel_Device1_MMXU2_Mod_ctlModel) -#define IEDMODEL_Device1_MMXU2_Beh (&iedModel_Device1_MMXU2_Beh) -#define IEDMODEL_Device1_MMXU2_Beh_stVal (&iedModel_Device1_MMXU2_Beh_stVal) -#define IEDMODEL_Device1_MMXU2_Beh_q (&iedModel_Device1_MMXU2_Beh_q) -#define IEDMODEL_Device1_MMXU2_Beh_t (&iedModel_Device1_MMXU2_Beh_t) -#define IEDMODEL_Device1_MMXU2_Health (&iedModel_Device1_MMXU2_Health) -#define IEDMODEL_Device1_MMXU2_Health_stVal (&iedModel_Device1_MMXU2_Health_stVal) -#define IEDMODEL_Device1_MMXU2_Health_q (&iedModel_Device1_MMXU2_Health_q) -#define IEDMODEL_Device1_MMXU2_Health_t (&iedModel_Device1_MMXU2_Health_t) -#define IEDMODEL_Device1_MMXU2_NamPlt (&iedModel_Device1_MMXU2_NamPlt) -#define IEDMODEL_Device1_MMXU2_NamPlt_vendor (&iedModel_Device1_MMXU2_NamPlt_vendor) -#define IEDMODEL_Device1_MMXU2_NamPlt_swRev (&iedModel_Device1_MMXU2_NamPlt_swRev) -#define IEDMODEL_Device1_MMXU2_NamPlt_d (&iedModel_Device1_MMXU2_NamPlt_d) -#define IEDMODEL_Device1_MMXU2_TotW (&iedModel_Device1_MMXU2_TotW) -#define IEDMODEL_Device1_MMXU2_TotW_mag (&iedModel_Device1_MMXU2_TotW_mag) -#define IEDMODEL_Device1_MMXU2_TotW_mag_f (&iedModel_Device1_MMXU2_TotW_mag_f) -#define IEDMODEL_Device1_MMXU2_TotW_q (&iedModel_Device1_MMXU2_TotW_q) -#define IEDMODEL_Device1_MMXU2_TotW_t (&iedModel_Device1_MMXU2_TotW_t) - -#endif /* STATIC_MODEL_H_ */ - diff --git a/examples/server_example2/CMakeLists.txt b/examples/server_example2/CMakeLists.txt deleted file mode 100644 index 994caae3..00000000 --- a/examples/server_example2/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -include_directories( - . -) - -set(server_example2_SRCS - server_example2.c - static_model.c -) - -IF(WIN32) -set_source_files_properties(${server_example2_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(WIN32) - -add_executable(server_example2 - ${server_example2_SRCS} -) - -target_link_libraries(server_example2 - iec61850 -) diff --git a/examples/server_example2/Makefile b/examples/server_example2/Makefile deleted file mode 100644 index 3781758b..00000000 --- a/examples/server_example2/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = server_example2 -PROJECT_SOURCES = server_example2.c -PROJECT_SOURCES += static_model.c - -PROJECT_ICD_FILE = complexModel.icd - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -model: $(PROJECT_ICD_FILE) - java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDFLAGS) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) - diff --git a/examples/server_example2/complexModel.icd b/examples/server_example2/complexModel.icd deleted file mode 100644 index 52cfec61..00000000 --- a/examples/server_example2/complexModel.icd +++ /dev/null @@ -1,347 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - - - - - - - - status-only - - - - - - - status-only - - - - - - - - - status-only - - - - - - - - status-only - - - - - - - status-only - - - - - - - - - status-only - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - direct-with-normal-security - sbo-with-normal-security - direct-with-enhanced-security - sbo-with-enhanced-security - - - - - rad - sr - m - Gy - q - °C - Sv - F - C - S - H - V - kg - ohm - J - N - Hz - Ix - Lm - Wb - T - W - Pa - s - m² - m³ - m/s - m/s² - m³/s - m/m³ - M - kg/m³ - m²/s - A - W/m K - J/K - ppm - 1/s - rad/s - K - VA - Watts - VAr - theta - cos(theta) - Vs - V² - As - A² - mol - A²t - VAh - Wh - VArh - V/Hz - cd - deg - - - Yocto - Zepto - Atto - Femto - Pico - Nano - Micro - Milli - Centi - Deci - zeroNoValue - Deca - Hecto - Kilo - Mega - Giga - Tera - Petra - Exa - Zetta - Yotta - - - normal - high - low - high-high - low-low - - - diff --git a/examples/server_example2/server_example2.c b/examples/server_example2/server_example2.c deleted file mode 100644 index 6d7f3519..00000000 --- a/examples/server_example2/server_example2.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * server_example2.c - * - * Copyright 2013 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. - */ - -#include "iec61850_server.h" -#include "hal_thread.h" -#include -#include -#include - - -/* Include the generated header with the model access handles */ -#include "static_model.h" - -/* import IEC 61850 device model created from SCL-File */ -extern IedModel iedModel; - -static int running = 0; - -void sigint_handler(int signalId) -{ - running = 0; -} - -int -main(int argc, char** argv) -{ - IedServer iedServer = IedServer_create(&iedModel); - - // TODO get stored values from persistent storage - - // TODO set initial measurement and status values from process - - /* MMS server will be instructed to start listening to client connections. */ - IedServer_start(iedServer, 102); - - if (!IedServer_isRunning(iedServer)) { - printf("Starting server failed! Exit.\n"); - IedServer_destroy(iedServer); - exit(-1); - } - - running = 1; - - signal(SIGINT, sigint_handler); - - float power = 500.f; - - while (running) { - - uint64_t timeval = Hal_getTimeInMs(); - - IedServer_lockDataModel(iedServer); - - IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_Inverter_MMXU1_TotW_t, timeval); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_Inverter_MMXU1_TotW_mag_f, power); - - IedServer_unlockDataModel(iedServer); - - power += 0.1f; - - Thread_sleep(500); - } - - /* stop MMS server - close TCP server socket and all client sockets */ - IedServer_stop(iedServer); - - /* Cleanup - free all resources */ - IedServer_destroy(iedServer); - - return 0; -} /* main() */ diff --git a/examples/server_example2/static_model.c b/examples/server_example2/static_model.c deleted file mode 100644 index 91d0dcb0..00000000 --- a/examples/server_example2/static_model.c +++ /dev/null @@ -1,3621 +0,0 @@ -/* - * static_model.c - * - * automatically generated from complexModel.icd - */ -#include "static_model.h" - -static void initializeValues(); - -extern DataSet iedModelds_Inverter_LLN0_dataset1; - - -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0; -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1; -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2; -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3; -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0 = { - "Inverter", - false, - "LLN0$ST$Mod$q", - -1, - NULL, - NULL, - &iedModelds_Inverter_LLN0_dataset1_fcda1 -}; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1 = { - "Battery", - false, - "LLN0$ST$Mod$q", - -1, - NULL, - NULL, - &iedModelds_Inverter_LLN0_dataset1_fcda2 -}; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2 = { - "Inverter", - false, - "MMXU1$ST$Mod$q", - -1, - NULL, - NULL, - &iedModelds_Inverter_LLN0_dataset1_fcda3 -}; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3 = { - "Inverter", - false, - "MMXU1$CF$Mod$ctlModel", - -1, - NULL, - NULL, - &iedModelds_Inverter_LLN0_dataset1_fcda4 -}; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4 = { - "Inverter", - false, - "MMXU1$MX$TotW$mag", - -1, - NULL, - NULL, - NULL -}; - -DataSet iedModelds_Inverter_LLN0_dataset1 = { - "Inverter", - "LLN0$dataset1", - 5, - &iedModelds_Inverter_LLN0_dataset1_fcda0, - NULL -}; - -LogicalDevice iedModel_Inverter = { - LogicalDeviceModelType, - "Inverter", - (ModelNode*) &iedModel, - (ModelNode*) &iedModel_Battery, - (ModelNode*) &iedModel_Inverter_LLN0 -}; - -LogicalNode iedModel_Inverter_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_Inverter, - (ModelNode*) &iedModel_Inverter_LPHD1, - (ModelNode*) &iedModel_Inverter_LLN0_Mod, -}; - -DataObject iedModel_Inverter_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Inverter_LLN0, - (ModelNode*) &iedModel_Inverter_LLN0_Beh, - (ModelNode*) &iedModel_Inverter_LLN0_Mod_q, - 0 -}; - -DataAttribute iedModel_Inverter_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LLN0_Mod, - (ModelNode*) &iedModel_Inverter_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LLN0_Mod, - (ModelNode*) &iedModel_Inverter_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Inverter_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Inverter_LLN0, - (ModelNode*) &iedModel_Inverter_LLN0_Health, - (ModelNode*) &iedModel_Inverter_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_LLN0_Beh, - (ModelNode*) &iedModel_Inverter_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LLN0_Beh, - (ModelNode*) &iedModel_Inverter_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Inverter_LLN0, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_LLN0_Health, - (ModelNode*) &iedModel_Inverter_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LLN0_Health, - (ModelNode*) &iedModel_Inverter_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Inverter_LLN0, - NULL, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_Inverter_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_Inverter, - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam, -}; - -DataObject iedModel_Inverter_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_Inverter_LPHD1, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_Inverter_LPHD1, - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_Inverter_LPHD1, - NULL, - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_Inverter_ZINV1 = { - LogicalNodeModelType, - "ZINV1", - (ModelNode*) &iedModel_Inverter, - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_ZINV1_Mod, -}; - -DataObject iedModel_Inverter_ZINV1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_Beh, - (ModelNode*) &iedModel_Inverter_ZINV1_Mod_q, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_ZINV1_Mod, - (ModelNode*) &iedModel_Inverter_ZINV1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_ZINV1_Mod, - (ModelNode*) &iedModel_Inverter_ZINV1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Inverter_ZINV1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_Health, - (ModelNode*) &iedModel_Inverter_ZINV1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_ZINV1_Beh, - (ModelNode*) &iedModel_Inverter_ZINV1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_ZINV1_Beh, - (ModelNode*) &iedModel_Inverter_ZINV1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_ZINV1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, - (ModelNode*) &iedModel_Inverter_ZINV1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_ZINV1_Health, - (ModelNode*) &iedModel_Inverter_ZINV1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_ZINV1_Health, - (ModelNode*) &iedModel_Inverter_ZINV1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_ZINV1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_WRtg = { - DataObjectModelType, - "WRtg", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag = { - DataAttributeModelType, - "setMag", - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag_f, - 0, - IEC61850_FC_SP, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_WRtg_units = { - DataAttributeModelType, - "units", - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units_SIUnit, - 0, - IEC61850_FC_CF, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit = { - DataAttributeModelType, - "SIUnit", - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_VarRtg = { - DataObjectModelType, - "VarRtg", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag = { - DataAttributeModelType, - "setMag", - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag_f, - 0, - IEC61850_FC_SP, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_VarRtg_units = { - DataAttributeModelType, - "units", - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units_SIUnit, - 0, - IEC61850_FC_CF, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit = { - DataAttributeModelType, - "SIUnit", - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_ACTyp = { - DataObjectModelType, - "ACTyp", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, - (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp_setVal, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal = { - DataAttributeModelType, - "setVal", - (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_INT32, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_OutWSet = { - DataObjectModelType, - "OutWSet", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag = { - DataAttributeModelType, - "setMag", - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag_f, - 0, - IEC61850_FC_SP, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutWSet_units = { - DataAttributeModelType, - "units", - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units_SIUnit, - 0, - IEC61850_FC_CF, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit = { - DataAttributeModelType, - "SIUnit", - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_OutVarSet = { - DataObjectModelType, - "OutVarSet", - (ModelNode*) &iedModel_Inverter_ZINV1, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag = { - DataAttributeModelType, - "setMag", - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag_f, - 0, - IEC61850_FC_SP, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units = { - DataAttributeModelType, - "units", - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit, - 0, - IEC61850_FC_CF, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit = { - DataAttributeModelType, - "SIUnit", - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -LogicalNode iedModel_Inverter_MMXU1 = { - LogicalNodeModelType, - "MMXU1", - (ModelNode*) &iedModel_Inverter, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_Mod, -}; - -DataObject iedModel_Inverter_MMXU1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_Beh, - (ModelNode*) &iedModel_Inverter_MMXU1_Mod_q, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_Mod, - (ModelNode*) &iedModel_Inverter_MMXU1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_Mod, - (ModelNode*) &iedModel_Inverter_MMXU1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Inverter_MMXU1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_Health, - (ModelNode*) &iedModel_Inverter_MMXU1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_MMXU1_Beh, - (ModelNode*) &iedModel_Inverter_MMXU1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_Beh, - (ModelNode*) &iedModel_Inverter_MMXU1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, - (ModelNode*) &iedModel_Inverter_MMXU1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_MMXU1_Health, - (ModelNode*) &iedModel_Inverter_MMXU1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_Health, - (ModelNode*) &iedModel_Inverter_MMXU1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW, - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_TotW = { - DataObjectModelType, - "TotW", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_TotW_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_TotW, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_q, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotW_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_TotW, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotW_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_TotW, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_TotVAr = { - DataObjectModelType, - "TotVAr", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_q, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVAr_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVAr_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_TotVA = { - DataObjectModelType, - "TotVA", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_TotVA_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_q, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_Hz = { - DataObjectModelType, - "Hz", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_Hz_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_Hz, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_q, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Hz_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_Hz, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Hz_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_Hz, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_PhV = { - DataObjectModelType, - "PhV", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_A, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, - 0 -}; - -DataObject iedModel_Inverter_MMXU1_PhV_phsA = { - DataObjectModelType, - "phsA", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_q, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_PhV_phsB = { - DataObjectModelType, - "phsB", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_q, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_PhV_phsC = { - DataObjectModelType, - "phsC", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_q, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_PhV_neut = { - DataObjectModelType, - "neut", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_q, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_A = { - DataObjectModelType, - "A", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_W, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, - 0 -}; - -DataObject iedModel_Inverter_MMXU1_A_phsA = { - DataObjectModelType, - "phsA", - (ModelNode*) &iedModel_Inverter_MMXU1_A, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_q, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_A_phsB = { - DataObjectModelType, - "phsB", - (ModelNode*) &iedModel_Inverter_MMXU1_A, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_q, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_A_phsC = { - DataObjectModelType, - "phsC", - (ModelNode*) &iedModel_Inverter_MMXU1_A, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_q, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_A_neut = { - DataObjectModelType, - "neut", - (ModelNode*) &iedModel_Inverter_MMXU1_A, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_q, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_W = { - DataObjectModelType, - "W", - (ModelNode*) &iedModel_Inverter_MMXU1, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, - 0 -}; - -DataObject iedModel_Inverter_MMXU1_W_phsA = { - DataObjectModelType, - "phsA", - (ModelNode*) &iedModel_Inverter_MMXU1_W, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_q, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_W_phsB = { - DataObjectModelType, - "phsB", - (ModelNode*) &iedModel_Inverter_MMXU1_W, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_q, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_W_phsC = { - DataObjectModelType, - "phsC", - (ModelNode*) &iedModel_Inverter_MMXU1_W, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_q, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - - -LogicalDevice iedModel_Battery = { - LogicalDeviceModelType, - "Battery", - (ModelNode*) &iedModel, - (ModelNode*) &iedModel_Physical_Measurements, - (ModelNode*) &iedModel_Battery_LLN0 -}; - -LogicalNode iedModel_Battery_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_Battery, - (ModelNode*) &iedModel_Battery_LPHD1, - (ModelNode*) &iedModel_Battery_LLN0_Mod, -}; - -DataObject iedModel_Battery_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Battery_LLN0, - (ModelNode*) &iedModel_Battery_LLN0_Beh, - (ModelNode*) &iedModel_Battery_LLN0_Mod_q, - 0 -}; - -DataAttribute iedModel_Battery_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LLN0_Mod, - (ModelNode*) &iedModel_Battery_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LLN0_Mod, - (ModelNode*) &iedModel_Battery_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Battery_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Battery_LLN0, - (ModelNode*) &iedModel_Battery_LLN0_Health, - (ModelNode*) &iedModel_Battery_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Battery_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_LLN0_Beh, - (ModelNode*) &iedModel_Battery_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LLN0_Beh, - (ModelNode*) &iedModel_Battery_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Battery_LLN0, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_Battery_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_LLN0_Health, - (ModelNode*) &iedModel_Battery_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LLN0_Health, - (ModelNode*) &iedModel_Battery_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Battery_LLN0, - NULL, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_Battery_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_Battery, - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_LPHD1_PhyNam, -}; - -DataObject iedModel_Battery_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_Battery_LPHD1, - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Battery_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Battery_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_Battery_LPHD1, - (ModelNode*) &iedModel_Battery_LPHD1_Proxy, - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_Battery_LPHD1, - NULL, - (ModelNode*) &iedModel_Battery_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_Battery_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_LPHD1_Proxy, - (ModelNode*) &iedModel_Battery_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LPHD1_Proxy, - (ModelNode*) &iedModel_Battery_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_Battery_ZBAT1 = { - LogicalNodeModelType, - "ZBAT1", - (ModelNode*) &iedModel_Battery, - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBAT1_Mod, -}; - -DataObject iedModel_Battery_ZBAT1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_Beh, - (ModelNode*) &iedModel_Battery_ZBAT1_Mod_q, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Mod, - (ModelNode*) &iedModel_Battery_ZBAT1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Mod, - (ModelNode*) &iedModel_Battery_ZBAT1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Battery_ZBAT1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_Health, - (ModelNode*) &iedModel_Battery_ZBAT1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_ZBAT1_Beh, - (ModelNode*) &iedModel_Battery_ZBAT1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Beh, - (ModelNode*) &iedModel_Battery_ZBAT1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBAT1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_ZBAT1_Health, - (ModelNode*) &iedModel_Battery_ZBAT1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Health, - (ModelNode*) &iedModel_Battery_ZBAT1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol, - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_Vol = { - DataObjectModelType, - "Vol", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Vol_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Battery_ZBAT1_Vol, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_q, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Vol_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Vol, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Vol_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Vol, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_Amp = { - DataObjectModelType, - "Amp", - (ModelNode*) &iedModel_Battery_ZBAT1, - NULL, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Amp_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Battery_ZBAT1_Amp, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_q, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Amp_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Amp, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Amp_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Amp, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_Battery_ZBTC1 = { - LogicalNodeModelType, - "ZBTC1", - (ModelNode*) &iedModel_Battery, - NULL, - (ModelNode*) &iedModel_Battery_ZBTC1_Mod, -}; - -DataObject iedModel_Battery_ZBTC1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_Beh, - (ModelNode*) &iedModel_Battery_ZBTC1_Mod_q, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_Mod, - (ModelNode*) &iedModel_Battery_ZBTC1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_Mod, - (ModelNode*) &iedModel_Battery_ZBTC1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Battery_ZBTC1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_Health, - (ModelNode*) &iedModel_Battery_ZBTC1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_ZBTC1_Beh, - (ModelNode*) &iedModel_Battery_ZBTC1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_Beh, - (ModelNode*) &iedModel_Battery_ZBTC1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBTC1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_ZBTC1_Health, - (ModelNode*) &iedModel_Battery_ZBTC1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_Health, - (ModelNode*) &iedModel_Battery_ZBTC1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_BatChaSt, - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_BatChaSt = { - DataObjectModelType, - "BatChaSt", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_BatChaPwr, - NULL, - 0 -}; - -DataObject iedModel_Battery_ZBTC1_BatChaPwr = { - DataObjectModelType, - "BatChaPwr", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_BatChaMod, - NULL, - 0 -}; - -DataObject iedModel_Battery_ZBTC1_BatChaMod = { - DataObjectModelType, - "BatChaMod", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, - NULL, - 0 -}; - -DataObject iedModel_Battery_ZBTC1_ChaV = { - DataObjectModelType, - "ChaV", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_ChaV_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_q, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaV_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaV_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_ChaA = { - DataObjectModelType, - "ChaA", - (ModelNode*) &iedModel_Battery_ZBTC1, - NULL, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_ChaA_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_q, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - - -LogicalDevice iedModel_Physical_Measurements = { - LogicalDeviceModelType, - "Physical_Measurements", - (ModelNode*) &iedModel, - NULL, - (ModelNode*) &iedModel_Physical_Measurements_LLN0 -}; - -LogicalNode iedModel_Physical_Measurements_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_Physical_Measurements, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, -}; - -DataObject iedModel_Physical_Measurements_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Physical_Measurements_LLN0, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_q, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Physical_Measurements_LLN0, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Physical_Measurements_LLN0, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Physical_Measurements_LLN0, - NULL, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_Physical_Measurements_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_Physical_Measurements, - NULL, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam, -}; - -DataObject iedModel_Physical_Measurements_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1, - NULL, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -extern ReportControlBlock iedModel_Inverter_LLN0_report0; - -ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 19, 32, 0, 0, NULL}; - - - - - - - -IedModel iedModel = { - "ied1", - &iedModel_Inverter, - &iedModelds_Inverter_LLN0_dataset1, - &iedModel_Inverter_LLN0_report0, - NULL, - NULL, - NULL, - NULL, - NULL, - initializeValues -}; - -static void -initializeValues() -{ - -iedModel_Inverter_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Inverter_ZINV1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Inverter_MMXU1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Battery_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Battery_ZBAT1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Battery_ZBTC1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Physical_Measurements_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); -} diff --git a/examples/server_example2/static_model.h b/examples/server_example2/static_model.h deleted file mode 100644 index 34623f80..00000000 --- a/examples/server_example2/static_model.h +++ /dev/null @@ -1,609 +0,0 @@ -/* - * static_model.h - * - * automatically generated from complexModel.icd - */ - -#ifndef STATIC_MODEL_H_ -#define STATIC_MODEL_H_ - -#include -#include "iec61850_model.h" - -extern IedModel iedModel; -extern LogicalDevice iedModel_Inverter; -extern LogicalNode iedModel_Inverter_LLN0; -extern DataObject iedModel_Inverter_LLN0_Mod; -extern DataAttribute iedModel_Inverter_LLN0_Mod_q; -extern DataAttribute iedModel_Inverter_LLN0_Mod_t; -extern DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel; -extern DataObject iedModel_Inverter_LLN0_Beh; -extern DataAttribute iedModel_Inverter_LLN0_Beh_stVal; -extern DataAttribute iedModel_Inverter_LLN0_Beh_q; -extern DataAttribute iedModel_Inverter_LLN0_Beh_t; -extern DataObject iedModel_Inverter_LLN0_Health; -extern DataAttribute iedModel_Inverter_LLN0_Health_stVal; -extern DataAttribute iedModel_Inverter_LLN0_Health_q; -extern DataAttribute iedModel_Inverter_LLN0_Health_t; -extern DataObject iedModel_Inverter_LLN0_NamPlt; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_d; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Inverter_LPHD1; -extern DataObject iedModel_Inverter_LPHD1_PhyNam; -extern DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Inverter_LPHD1_PhyHealth; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t; -extern DataObject iedModel_Inverter_LPHD1_Proxy; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_q; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_t; -extern LogicalNode iedModel_Inverter_ZINV1; -extern DataObject iedModel_Inverter_ZINV1_Mod; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_q; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_t; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel; -extern DataObject iedModel_Inverter_ZINV1_Beh; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_stVal; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_q; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_t; -extern DataObject iedModel_Inverter_ZINV1_Health; -extern DataAttribute iedModel_Inverter_ZINV1_Health_stVal; -extern DataAttribute iedModel_Inverter_ZINV1_Health_q; -extern DataAttribute iedModel_Inverter_ZINV1_Health_t; -extern DataObject iedModel_Inverter_ZINV1_NamPlt; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_d; -extern DataObject iedModel_Inverter_ZINV1_WRtg; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_VarRtg; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_ACTyp; -extern DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal; -extern DataObject iedModel_Inverter_ZINV1_OutWSet; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_OutVarSet; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit; -extern LogicalNode iedModel_Inverter_MMXU1; -extern DataObject iedModel_Inverter_MMXU1_Mod; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_q; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_t; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel; -extern DataObject iedModel_Inverter_MMXU1_Beh; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_stVal; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_q; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_t; -extern DataObject iedModel_Inverter_MMXU1_Health; -extern DataAttribute iedModel_Inverter_MMXU1_Health_stVal; -extern DataAttribute iedModel_Inverter_MMXU1_Health_q; -extern DataAttribute iedModel_Inverter_MMXU1_Health_t; -extern DataObject iedModel_Inverter_MMXU1_NamPlt; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_d; -extern DataObject iedModel_Inverter_MMXU1_TotW; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_t; -extern DataObject iedModel_Inverter_MMXU1_TotVAr; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_t; -extern DataObject iedModel_Inverter_MMXU1_TotVA; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_t; -extern DataObject iedModel_Inverter_MMXU1_Hz; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_q; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_t; -extern DataObject iedModel_Inverter_MMXU1_PhV; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_neut; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t; -extern DataObject iedModel_Inverter_MMXU1_A; -extern DataObject iedModel_Inverter_MMXU1_A_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_A_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_A_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_t; -extern DataObject iedModel_Inverter_MMXU1_A_neut; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_t; -extern DataObject iedModel_Inverter_MMXU1_W; -extern DataObject iedModel_Inverter_MMXU1_W_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_W_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_W_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_t; -extern LogicalDevice iedModel_Battery; -extern LogicalNode iedModel_Battery_LLN0; -extern DataObject iedModel_Battery_LLN0_Mod; -extern DataAttribute iedModel_Battery_LLN0_Mod_q; -extern DataAttribute iedModel_Battery_LLN0_Mod_t; -extern DataAttribute iedModel_Battery_LLN0_Mod_ctlModel; -extern DataObject iedModel_Battery_LLN0_Beh; -extern DataAttribute iedModel_Battery_LLN0_Beh_stVal; -extern DataAttribute iedModel_Battery_LLN0_Beh_q; -extern DataAttribute iedModel_Battery_LLN0_Beh_t; -extern DataObject iedModel_Battery_LLN0_Health; -extern DataAttribute iedModel_Battery_LLN0_Health_stVal; -extern DataAttribute iedModel_Battery_LLN0_Health_q; -extern DataAttribute iedModel_Battery_LLN0_Health_t; -extern DataObject iedModel_Battery_LLN0_NamPlt; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_d; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Battery_LPHD1; -extern DataObject iedModel_Battery_LPHD1_PhyNam; -extern DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Battery_LPHD1_PhyHealth; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_t; -extern DataObject iedModel_Battery_LPHD1_Proxy; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_q; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_t; -extern LogicalNode iedModel_Battery_ZBAT1; -extern DataObject iedModel_Battery_ZBAT1_Mod; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_q; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_t; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel; -extern DataObject iedModel_Battery_ZBAT1_Beh; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_stVal; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_q; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_t; -extern DataObject iedModel_Battery_ZBAT1_Health; -extern DataAttribute iedModel_Battery_ZBAT1_Health_stVal; -extern DataAttribute iedModel_Battery_ZBAT1_Health_q; -extern DataAttribute iedModel_Battery_ZBAT1_Health_t; -extern DataObject iedModel_Battery_ZBAT1_NamPlt; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_d; -extern DataObject iedModel_Battery_ZBAT1_Vol; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_q; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_t; -extern DataObject iedModel_Battery_ZBAT1_Amp; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_q; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_t; -extern LogicalNode iedModel_Battery_ZBTC1; -extern DataObject iedModel_Battery_ZBTC1_Mod; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_q; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_t; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel; -extern DataObject iedModel_Battery_ZBTC1_Beh; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_stVal; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_q; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_t; -extern DataObject iedModel_Battery_ZBTC1_Health; -extern DataAttribute iedModel_Battery_ZBTC1_Health_stVal; -extern DataAttribute iedModel_Battery_ZBTC1_Health_q; -extern DataAttribute iedModel_Battery_ZBTC1_Health_t; -extern DataObject iedModel_Battery_ZBTC1_NamPlt; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_d; -extern DataObject iedModel_Battery_ZBTC1_BatChaSt; -extern DataObject iedModel_Battery_ZBTC1_BatChaPwr; -extern DataObject iedModel_Battery_ZBTC1_BatChaMod; -extern DataObject iedModel_Battery_ZBTC1_ChaV; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_q; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_t; -extern DataObject iedModel_Battery_ZBTC1_ChaA; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_q; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_t; -extern LogicalDevice iedModel_Physical_Measurements; -extern LogicalNode iedModel_Physical_Measurements_LLN0; -extern DataObject iedModel_Physical_Measurements_LLN0_Mod; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel; -extern DataObject iedModel_Physical_Measurements_LLN0_Beh; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t; -extern DataObject iedModel_Physical_Measurements_LLN0_Health; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_t; -extern DataObject iedModel_Physical_Measurements_LLN0_NamPlt; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Physical_Measurements_LPHD1; -extern DataObject iedModel_Physical_Measurements_LPHD1_PhyNam; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t; -extern DataObject iedModel_Physical_Measurements_LPHD1_Proxy; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t; - - - -#define IEDMODEL_Inverter (&iedModel_Inverter) -#define IEDMODEL_Inverter_LLN0 (&iedModel_Inverter_LLN0) -#define IEDMODEL_Inverter_LLN0_Mod (&iedModel_Inverter_LLN0_Mod) -#define IEDMODEL_Inverter_LLN0_Mod_q (&iedModel_Inverter_LLN0_Mod_q) -#define IEDMODEL_Inverter_LLN0_Mod_t (&iedModel_Inverter_LLN0_Mod_t) -#define IEDMODEL_Inverter_LLN0_Mod_ctlModel (&iedModel_Inverter_LLN0_Mod_ctlModel) -#define IEDMODEL_Inverter_LLN0_Beh (&iedModel_Inverter_LLN0_Beh) -#define IEDMODEL_Inverter_LLN0_Beh_stVal (&iedModel_Inverter_LLN0_Beh_stVal) -#define IEDMODEL_Inverter_LLN0_Beh_q (&iedModel_Inverter_LLN0_Beh_q) -#define IEDMODEL_Inverter_LLN0_Beh_t (&iedModel_Inverter_LLN0_Beh_t) -#define IEDMODEL_Inverter_LLN0_Health (&iedModel_Inverter_LLN0_Health) -#define IEDMODEL_Inverter_LLN0_Health_stVal (&iedModel_Inverter_LLN0_Health_stVal) -#define IEDMODEL_Inverter_LLN0_Health_q (&iedModel_Inverter_LLN0_Health_q) -#define IEDMODEL_Inverter_LLN0_Health_t (&iedModel_Inverter_LLN0_Health_t) -#define IEDMODEL_Inverter_LLN0_NamPlt (&iedModel_Inverter_LLN0_NamPlt) -#define IEDMODEL_Inverter_LLN0_NamPlt_vendor (&iedModel_Inverter_LLN0_NamPlt_vendor) -#define IEDMODEL_Inverter_LLN0_NamPlt_swRev (&iedModel_Inverter_LLN0_NamPlt_swRev) -#define IEDMODEL_Inverter_LLN0_NamPlt_d (&iedModel_Inverter_LLN0_NamPlt_d) -#define IEDMODEL_Inverter_LLN0_NamPlt_configRev (&iedModel_Inverter_LLN0_NamPlt_configRev) -#define IEDMODEL_Inverter_LLN0_NamPlt_ldNs (&iedModel_Inverter_LLN0_NamPlt_ldNs) -#define IEDMODEL_Inverter_LPHD1 (&iedModel_Inverter_LPHD1) -#define IEDMODEL_Inverter_LPHD1_PhyNam (&iedModel_Inverter_LPHD1_PhyNam) -#define IEDMODEL_Inverter_LPHD1_PhyNam_vendor (&iedModel_Inverter_LPHD1_PhyNam_vendor) -#define IEDMODEL_Inverter_LPHD1_PhyHealth (&iedModel_Inverter_LPHD1_PhyHealth) -#define IEDMODEL_Inverter_LPHD1_PhyHealth_stVal (&iedModel_Inverter_LPHD1_PhyHealth_stVal) -#define IEDMODEL_Inverter_LPHD1_PhyHealth_q (&iedModel_Inverter_LPHD1_PhyHealth_q) -#define IEDMODEL_Inverter_LPHD1_PhyHealth_t (&iedModel_Inverter_LPHD1_PhyHealth_t) -#define IEDMODEL_Inverter_LPHD1_Proxy (&iedModel_Inverter_LPHD1_Proxy) -#define IEDMODEL_Inverter_LPHD1_Proxy_stVal (&iedModel_Inverter_LPHD1_Proxy_stVal) -#define IEDMODEL_Inverter_LPHD1_Proxy_q (&iedModel_Inverter_LPHD1_Proxy_q) -#define IEDMODEL_Inverter_LPHD1_Proxy_t (&iedModel_Inverter_LPHD1_Proxy_t) -#define IEDMODEL_Inverter_ZINV1 (&iedModel_Inverter_ZINV1) -#define IEDMODEL_Inverter_ZINV1_Mod (&iedModel_Inverter_ZINV1_Mod) -#define IEDMODEL_Inverter_ZINV1_Mod_q (&iedModel_Inverter_ZINV1_Mod_q) -#define IEDMODEL_Inverter_ZINV1_Mod_t (&iedModel_Inverter_ZINV1_Mod_t) -#define IEDMODEL_Inverter_ZINV1_Mod_ctlModel (&iedModel_Inverter_ZINV1_Mod_ctlModel) -#define IEDMODEL_Inverter_ZINV1_Beh (&iedModel_Inverter_ZINV1_Beh) -#define IEDMODEL_Inverter_ZINV1_Beh_stVal (&iedModel_Inverter_ZINV1_Beh_stVal) -#define IEDMODEL_Inverter_ZINV1_Beh_q (&iedModel_Inverter_ZINV1_Beh_q) -#define IEDMODEL_Inverter_ZINV1_Beh_t (&iedModel_Inverter_ZINV1_Beh_t) -#define IEDMODEL_Inverter_ZINV1_Health (&iedModel_Inverter_ZINV1_Health) -#define IEDMODEL_Inverter_ZINV1_Health_stVal (&iedModel_Inverter_ZINV1_Health_stVal) -#define IEDMODEL_Inverter_ZINV1_Health_q (&iedModel_Inverter_ZINV1_Health_q) -#define IEDMODEL_Inverter_ZINV1_Health_t (&iedModel_Inverter_ZINV1_Health_t) -#define IEDMODEL_Inverter_ZINV1_NamPlt (&iedModel_Inverter_ZINV1_NamPlt) -#define IEDMODEL_Inverter_ZINV1_NamPlt_vendor (&iedModel_Inverter_ZINV1_NamPlt_vendor) -#define IEDMODEL_Inverter_ZINV1_NamPlt_swRev (&iedModel_Inverter_ZINV1_NamPlt_swRev) -#define IEDMODEL_Inverter_ZINV1_NamPlt_d (&iedModel_Inverter_ZINV1_NamPlt_d) -#define IEDMODEL_Inverter_ZINV1_WRtg (&iedModel_Inverter_ZINV1_WRtg) -#define IEDMODEL_Inverter_ZINV1_WRtg_setMag (&iedModel_Inverter_ZINV1_WRtg_setMag) -#define IEDMODEL_Inverter_ZINV1_WRtg_setMag_f (&iedModel_Inverter_ZINV1_WRtg_setMag_f) -#define IEDMODEL_Inverter_ZINV1_WRtg_units (&iedModel_Inverter_ZINV1_WRtg_units) -#define IEDMODEL_Inverter_ZINV1_WRtg_units_SIUnit (&iedModel_Inverter_ZINV1_WRtg_units_SIUnit) -#define IEDMODEL_Inverter_ZINV1_VarRtg (&iedModel_Inverter_ZINV1_VarRtg) -#define IEDMODEL_Inverter_ZINV1_VarRtg_setMag (&iedModel_Inverter_ZINV1_VarRtg_setMag) -#define IEDMODEL_Inverter_ZINV1_VarRtg_setMag_f (&iedModel_Inverter_ZINV1_VarRtg_setMag_f) -#define IEDMODEL_Inverter_ZINV1_VarRtg_units (&iedModel_Inverter_ZINV1_VarRtg_units) -#define IEDMODEL_Inverter_ZINV1_VarRtg_units_SIUnit (&iedModel_Inverter_ZINV1_VarRtg_units_SIUnit) -#define IEDMODEL_Inverter_ZINV1_ACTyp (&iedModel_Inverter_ZINV1_ACTyp) -#define IEDMODEL_Inverter_ZINV1_ACTyp_setVal (&iedModel_Inverter_ZINV1_ACTyp_setVal) -#define IEDMODEL_Inverter_ZINV1_OutWSet (&iedModel_Inverter_ZINV1_OutWSet) -#define IEDMODEL_Inverter_ZINV1_OutWSet_setMag (&iedModel_Inverter_ZINV1_OutWSet_setMag) -#define IEDMODEL_Inverter_ZINV1_OutWSet_setMag_f (&iedModel_Inverter_ZINV1_OutWSet_setMag_f) -#define IEDMODEL_Inverter_ZINV1_OutWSet_units (&iedModel_Inverter_ZINV1_OutWSet_units) -#define IEDMODEL_Inverter_ZINV1_OutWSet_units_SIUnit (&iedModel_Inverter_ZINV1_OutWSet_units_SIUnit) -#define IEDMODEL_Inverter_ZINV1_OutVarSet (&iedModel_Inverter_ZINV1_OutVarSet) -#define IEDMODEL_Inverter_ZINV1_OutVarSet_setMag (&iedModel_Inverter_ZINV1_OutVarSet_setMag) -#define IEDMODEL_Inverter_ZINV1_OutVarSet_setMag_f (&iedModel_Inverter_ZINV1_OutVarSet_setMag_f) -#define IEDMODEL_Inverter_ZINV1_OutVarSet_units (&iedModel_Inverter_ZINV1_OutVarSet_units) -#define IEDMODEL_Inverter_ZINV1_OutVarSet_units_SIUnit (&iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit) -#define IEDMODEL_Inverter_MMXU1 (&iedModel_Inverter_MMXU1) -#define IEDMODEL_Inverter_MMXU1_Mod (&iedModel_Inverter_MMXU1_Mod) -#define IEDMODEL_Inverter_MMXU1_Mod_q (&iedModel_Inverter_MMXU1_Mod_q) -#define IEDMODEL_Inverter_MMXU1_Mod_t (&iedModel_Inverter_MMXU1_Mod_t) -#define IEDMODEL_Inverter_MMXU1_Mod_ctlModel (&iedModel_Inverter_MMXU1_Mod_ctlModel) -#define IEDMODEL_Inverter_MMXU1_Beh (&iedModel_Inverter_MMXU1_Beh) -#define IEDMODEL_Inverter_MMXU1_Beh_stVal (&iedModel_Inverter_MMXU1_Beh_stVal) -#define IEDMODEL_Inverter_MMXU1_Beh_q (&iedModel_Inverter_MMXU1_Beh_q) -#define IEDMODEL_Inverter_MMXU1_Beh_t (&iedModel_Inverter_MMXU1_Beh_t) -#define IEDMODEL_Inverter_MMXU1_Health (&iedModel_Inverter_MMXU1_Health) -#define IEDMODEL_Inverter_MMXU1_Health_stVal (&iedModel_Inverter_MMXU1_Health_stVal) -#define IEDMODEL_Inverter_MMXU1_Health_q (&iedModel_Inverter_MMXU1_Health_q) -#define IEDMODEL_Inverter_MMXU1_Health_t (&iedModel_Inverter_MMXU1_Health_t) -#define IEDMODEL_Inverter_MMXU1_NamPlt (&iedModel_Inverter_MMXU1_NamPlt) -#define IEDMODEL_Inverter_MMXU1_NamPlt_vendor (&iedModel_Inverter_MMXU1_NamPlt_vendor) -#define IEDMODEL_Inverter_MMXU1_NamPlt_swRev (&iedModel_Inverter_MMXU1_NamPlt_swRev) -#define IEDMODEL_Inverter_MMXU1_NamPlt_d (&iedModel_Inverter_MMXU1_NamPlt_d) -#define IEDMODEL_Inverter_MMXU1_TotW (&iedModel_Inverter_MMXU1_TotW) -#define IEDMODEL_Inverter_MMXU1_TotW_mag (&iedModel_Inverter_MMXU1_TotW_mag) -#define IEDMODEL_Inverter_MMXU1_TotW_mag_f (&iedModel_Inverter_MMXU1_TotW_mag_f) -#define IEDMODEL_Inverter_MMXU1_TotW_q (&iedModel_Inverter_MMXU1_TotW_q) -#define IEDMODEL_Inverter_MMXU1_TotW_t (&iedModel_Inverter_MMXU1_TotW_t) -#define IEDMODEL_Inverter_MMXU1_TotVAr (&iedModel_Inverter_MMXU1_TotVAr) -#define IEDMODEL_Inverter_MMXU1_TotVAr_mag (&iedModel_Inverter_MMXU1_TotVAr_mag) -#define IEDMODEL_Inverter_MMXU1_TotVAr_mag_f (&iedModel_Inverter_MMXU1_TotVAr_mag_f) -#define IEDMODEL_Inverter_MMXU1_TotVAr_q (&iedModel_Inverter_MMXU1_TotVAr_q) -#define IEDMODEL_Inverter_MMXU1_TotVAr_t (&iedModel_Inverter_MMXU1_TotVAr_t) -#define IEDMODEL_Inverter_MMXU1_TotVA (&iedModel_Inverter_MMXU1_TotVA) -#define IEDMODEL_Inverter_MMXU1_TotVA_mag (&iedModel_Inverter_MMXU1_TotVA_mag) -#define IEDMODEL_Inverter_MMXU1_TotVA_mag_f (&iedModel_Inverter_MMXU1_TotVA_mag_f) -#define IEDMODEL_Inverter_MMXU1_TotVA_q (&iedModel_Inverter_MMXU1_TotVA_q) -#define IEDMODEL_Inverter_MMXU1_TotVA_t (&iedModel_Inverter_MMXU1_TotVA_t) -#define IEDMODEL_Inverter_MMXU1_Hz (&iedModel_Inverter_MMXU1_Hz) -#define IEDMODEL_Inverter_MMXU1_Hz_mag (&iedModel_Inverter_MMXU1_Hz_mag) -#define IEDMODEL_Inverter_MMXU1_Hz_mag_f (&iedModel_Inverter_MMXU1_Hz_mag_f) -#define IEDMODEL_Inverter_MMXU1_Hz_q (&iedModel_Inverter_MMXU1_Hz_q) -#define IEDMODEL_Inverter_MMXU1_Hz_t (&iedModel_Inverter_MMXU1_Hz_t) -#define IEDMODEL_Inverter_MMXU1_PhV (&iedModel_Inverter_MMXU1_PhV) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA (&iedModel_Inverter_MMXU1_PhV_phsA) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal (&iedModel_Inverter_MMXU1_PhV_phsA_cVal) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_q (&iedModel_Inverter_MMXU1_PhV_phsA_q) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_t (&iedModel_Inverter_MMXU1_PhV_phsA_t) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB (&iedModel_Inverter_MMXU1_PhV_phsB) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal (&iedModel_Inverter_MMXU1_PhV_phsB_cVal) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_q (&iedModel_Inverter_MMXU1_PhV_phsB_q) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_t (&iedModel_Inverter_MMXU1_PhV_phsB_t) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC (&iedModel_Inverter_MMXU1_PhV_phsC) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal (&iedModel_Inverter_MMXU1_PhV_phsC_cVal) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_q (&iedModel_Inverter_MMXU1_PhV_phsC_q) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_t (&iedModel_Inverter_MMXU1_PhV_phsC_t) -#define IEDMODEL_Inverter_MMXU1_PhV_neut (&iedModel_Inverter_MMXU1_PhV_neut) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal (&iedModel_Inverter_MMXU1_PhV_neut_cVal) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal_mag (&iedModel_Inverter_MMXU1_PhV_neut_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_q (&iedModel_Inverter_MMXU1_PhV_neut_q) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_t (&iedModel_Inverter_MMXU1_PhV_neut_t) -#define IEDMODEL_Inverter_MMXU1_A (&iedModel_Inverter_MMXU1_A) -#define IEDMODEL_Inverter_MMXU1_A_phsA (&iedModel_Inverter_MMXU1_A_phsA) -#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal (&iedModel_Inverter_MMXU1_A_phsA_cVal) -#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal_mag (&iedModel_Inverter_MMXU1_A_phsA_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_A_phsA_q (&iedModel_Inverter_MMXU1_A_phsA_q) -#define IEDMODEL_Inverter_MMXU1_A_phsA_t (&iedModel_Inverter_MMXU1_A_phsA_t) -#define IEDMODEL_Inverter_MMXU1_A_phsB (&iedModel_Inverter_MMXU1_A_phsB) -#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal (&iedModel_Inverter_MMXU1_A_phsB_cVal) -#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal_mag (&iedModel_Inverter_MMXU1_A_phsB_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_A_phsB_q (&iedModel_Inverter_MMXU1_A_phsB_q) -#define IEDMODEL_Inverter_MMXU1_A_phsB_t (&iedModel_Inverter_MMXU1_A_phsB_t) -#define IEDMODEL_Inverter_MMXU1_A_phsC (&iedModel_Inverter_MMXU1_A_phsC) -#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal (&iedModel_Inverter_MMXU1_A_phsC_cVal) -#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal_mag (&iedModel_Inverter_MMXU1_A_phsC_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_A_phsC_q (&iedModel_Inverter_MMXU1_A_phsC_q) -#define IEDMODEL_Inverter_MMXU1_A_phsC_t (&iedModel_Inverter_MMXU1_A_phsC_t) -#define IEDMODEL_Inverter_MMXU1_A_neut (&iedModel_Inverter_MMXU1_A_neut) -#define IEDMODEL_Inverter_MMXU1_A_neut_cVal (&iedModel_Inverter_MMXU1_A_neut_cVal) -#define IEDMODEL_Inverter_MMXU1_A_neut_cVal_mag (&iedModel_Inverter_MMXU1_A_neut_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_A_neut_cVal_mag_f (&iedModel_Inverter_MMXU1_A_neut_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_A_neut_q (&iedModel_Inverter_MMXU1_A_neut_q) -#define IEDMODEL_Inverter_MMXU1_A_neut_t (&iedModel_Inverter_MMXU1_A_neut_t) -#define IEDMODEL_Inverter_MMXU1_W (&iedModel_Inverter_MMXU1_W) -#define IEDMODEL_Inverter_MMXU1_W_phsA (&iedModel_Inverter_MMXU1_W_phsA) -#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal (&iedModel_Inverter_MMXU1_W_phsA_cVal) -#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal_mag (&iedModel_Inverter_MMXU1_W_phsA_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_W_phsA_q (&iedModel_Inverter_MMXU1_W_phsA_q) -#define IEDMODEL_Inverter_MMXU1_W_phsA_t (&iedModel_Inverter_MMXU1_W_phsA_t) -#define IEDMODEL_Inverter_MMXU1_W_phsB (&iedModel_Inverter_MMXU1_W_phsB) -#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal (&iedModel_Inverter_MMXU1_W_phsB_cVal) -#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal_mag (&iedModel_Inverter_MMXU1_W_phsB_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_W_phsB_q (&iedModel_Inverter_MMXU1_W_phsB_q) -#define IEDMODEL_Inverter_MMXU1_W_phsB_t (&iedModel_Inverter_MMXU1_W_phsB_t) -#define IEDMODEL_Inverter_MMXU1_W_phsC (&iedModel_Inverter_MMXU1_W_phsC) -#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal (&iedModel_Inverter_MMXU1_W_phsC_cVal) -#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal_mag (&iedModel_Inverter_MMXU1_W_phsC_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_W_phsC_q (&iedModel_Inverter_MMXU1_W_phsC_q) -#define IEDMODEL_Inverter_MMXU1_W_phsC_t (&iedModel_Inverter_MMXU1_W_phsC_t) -#define IEDMODEL_Battery (&iedModel_Battery) -#define IEDMODEL_Battery_LLN0 (&iedModel_Battery_LLN0) -#define IEDMODEL_Battery_LLN0_Mod (&iedModel_Battery_LLN0_Mod) -#define IEDMODEL_Battery_LLN0_Mod_q (&iedModel_Battery_LLN0_Mod_q) -#define IEDMODEL_Battery_LLN0_Mod_t (&iedModel_Battery_LLN0_Mod_t) -#define IEDMODEL_Battery_LLN0_Mod_ctlModel (&iedModel_Battery_LLN0_Mod_ctlModel) -#define IEDMODEL_Battery_LLN0_Beh (&iedModel_Battery_LLN0_Beh) -#define IEDMODEL_Battery_LLN0_Beh_stVal (&iedModel_Battery_LLN0_Beh_stVal) -#define IEDMODEL_Battery_LLN0_Beh_q (&iedModel_Battery_LLN0_Beh_q) -#define IEDMODEL_Battery_LLN0_Beh_t (&iedModel_Battery_LLN0_Beh_t) -#define IEDMODEL_Battery_LLN0_Health (&iedModel_Battery_LLN0_Health) -#define IEDMODEL_Battery_LLN0_Health_stVal (&iedModel_Battery_LLN0_Health_stVal) -#define IEDMODEL_Battery_LLN0_Health_q (&iedModel_Battery_LLN0_Health_q) -#define IEDMODEL_Battery_LLN0_Health_t (&iedModel_Battery_LLN0_Health_t) -#define IEDMODEL_Battery_LLN0_NamPlt (&iedModel_Battery_LLN0_NamPlt) -#define IEDMODEL_Battery_LLN0_NamPlt_vendor (&iedModel_Battery_LLN0_NamPlt_vendor) -#define IEDMODEL_Battery_LLN0_NamPlt_swRev (&iedModel_Battery_LLN0_NamPlt_swRev) -#define IEDMODEL_Battery_LLN0_NamPlt_d (&iedModel_Battery_LLN0_NamPlt_d) -#define IEDMODEL_Battery_LLN0_NamPlt_configRev (&iedModel_Battery_LLN0_NamPlt_configRev) -#define IEDMODEL_Battery_LLN0_NamPlt_ldNs (&iedModel_Battery_LLN0_NamPlt_ldNs) -#define IEDMODEL_Battery_LPHD1 (&iedModel_Battery_LPHD1) -#define IEDMODEL_Battery_LPHD1_PhyNam (&iedModel_Battery_LPHD1_PhyNam) -#define IEDMODEL_Battery_LPHD1_PhyNam_vendor (&iedModel_Battery_LPHD1_PhyNam_vendor) -#define IEDMODEL_Battery_LPHD1_PhyHealth (&iedModel_Battery_LPHD1_PhyHealth) -#define IEDMODEL_Battery_LPHD1_PhyHealth_stVal (&iedModel_Battery_LPHD1_PhyHealth_stVal) -#define IEDMODEL_Battery_LPHD1_PhyHealth_q (&iedModel_Battery_LPHD1_PhyHealth_q) -#define IEDMODEL_Battery_LPHD1_PhyHealth_t (&iedModel_Battery_LPHD1_PhyHealth_t) -#define IEDMODEL_Battery_LPHD1_Proxy (&iedModel_Battery_LPHD1_Proxy) -#define IEDMODEL_Battery_LPHD1_Proxy_stVal (&iedModel_Battery_LPHD1_Proxy_stVal) -#define IEDMODEL_Battery_LPHD1_Proxy_q (&iedModel_Battery_LPHD1_Proxy_q) -#define IEDMODEL_Battery_LPHD1_Proxy_t (&iedModel_Battery_LPHD1_Proxy_t) -#define IEDMODEL_Battery_ZBAT1 (&iedModel_Battery_ZBAT1) -#define IEDMODEL_Battery_ZBAT1_Mod (&iedModel_Battery_ZBAT1_Mod) -#define IEDMODEL_Battery_ZBAT1_Mod_q (&iedModel_Battery_ZBAT1_Mod_q) -#define IEDMODEL_Battery_ZBAT1_Mod_t (&iedModel_Battery_ZBAT1_Mod_t) -#define IEDMODEL_Battery_ZBAT1_Mod_ctlModel (&iedModel_Battery_ZBAT1_Mod_ctlModel) -#define IEDMODEL_Battery_ZBAT1_Beh (&iedModel_Battery_ZBAT1_Beh) -#define IEDMODEL_Battery_ZBAT1_Beh_stVal (&iedModel_Battery_ZBAT1_Beh_stVal) -#define IEDMODEL_Battery_ZBAT1_Beh_q (&iedModel_Battery_ZBAT1_Beh_q) -#define IEDMODEL_Battery_ZBAT1_Beh_t (&iedModel_Battery_ZBAT1_Beh_t) -#define IEDMODEL_Battery_ZBAT1_Health (&iedModel_Battery_ZBAT1_Health) -#define IEDMODEL_Battery_ZBAT1_Health_stVal (&iedModel_Battery_ZBAT1_Health_stVal) -#define IEDMODEL_Battery_ZBAT1_Health_q (&iedModel_Battery_ZBAT1_Health_q) -#define IEDMODEL_Battery_ZBAT1_Health_t (&iedModel_Battery_ZBAT1_Health_t) -#define IEDMODEL_Battery_ZBAT1_NamPlt (&iedModel_Battery_ZBAT1_NamPlt) -#define IEDMODEL_Battery_ZBAT1_NamPlt_vendor (&iedModel_Battery_ZBAT1_NamPlt_vendor) -#define IEDMODEL_Battery_ZBAT1_NamPlt_swRev (&iedModel_Battery_ZBAT1_NamPlt_swRev) -#define IEDMODEL_Battery_ZBAT1_NamPlt_d (&iedModel_Battery_ZBAT1_NamPlt_d) -#define IEDMODEL_Battery_ZBAT1_Vol (&iedModel_Battery_ZBAT1_Vol) -#define IEDMODEL_Battery_ZBAT1_Vol_mag (&iedModel_Battery_ZBAT1_Vol_mag) -#define IEDMODEL_Battery_ZBAT1_Vol_mag_f (&iedModel_Battery_ZBAT1_Vol_mag_f) -#define IEDMODEL_Battery_ZBAT1_Vol_q (&iedModel_Battery_ZBAT1_Vol_q) -#define IEDMODEL_Battery_ZBAT1_Vol_t (&iedModel_Battery_ZBAT1_Vol_t) -#define IEDMODEL_Battery_ZBAT1_Amp (&iedModel_Battery_ZBAT1_Amp) -#define IEDMODEL_Battery_ZBAT1_Amp_mag (&iedModel_Battery_ZBAT1_Amp_mag) -#define IEDMODEL_Battery_ZBAT1_Amp_mag_f (&iedModel_Battery_ZBAT1_Amp_mag_f) -#define IEDMODEL_Battery_ZBAT1_Amp_q (&iedModel_Battery_ZBAT1_Amp_q) -#define IEDMODEL_Battery_ZBAT1_Amp_t (&iedModel_Battery_ZBAT1_Amp_t) -#define IEDMODEL_Battery_ZBTC1 (&iedModel_Battery_ZBTC1) -#define IEDMODEL_Battery_ZBTC1_Mod (&iedModel_Battery_ZBTC1_Mod) -#define IEDMODEL_Battery_ZBTC1_Mod_q (&iedModel_Battery_ZBTC1_Mod_q) -#define IEDMODEL_Battery_ZBTC1_Mod_t (&iedModel_Battery_ZBTC1_Mod_t) -#define IEDMODEL_Battery_ZBTC1_Mod_ctlModel (&iedModel_Battery_ZBTC1_Mod_ctlModel) -#define IEDMODEL_Battery_ZBTC1_Beh (&iedModel_Battery_ZBTC1_Beh) -#define IEDMODEL_Battery_ZBTC1_Beh_stVal (&iedModel_Battery_ZBTC1_Beh_stVal) -#define IEDMODEL_Battery_ZBTC1_Beh_q (&iedModel_Battery_ZBTC1_Beh_q) -#define IEDMODEL_Battery_ZBTC1_Beh_t (&iedModel_Battery_ZBTC1_Beh_t) -#define IEDMODEL_Battery_ZBTC1_Health (&iedModel_Battery_ZBTC1_Health) -#define IEDMODEL_Battery_ZBTC1_Health_stVal (&iedModel_Battery_ZBTC1_Health_stVal) -#define IEDMODEL_Battery_ZBTC1_Health_q (&iedModel_Battery_ZBTC1_Health_q) -#define IEDMODEL_Battery_ZBTC1_Health_t (&iedModel_Battery_ZBTC1_Health_t) -#define IEDMODEL_Battery_ZBTC1_NamPlt (&iedModel_Battery_ZBTC1_NamPlt) -#define IEDMODEL_Battery_ZBTC1_NamPlt_vendor (&iedModel_Battery_ZBTC1_NamPlt_vendor) -#define IEDMODEL_Battery_ZBTC1_NamPlt_swRev (&iedModel_Battery_ZBTC1_NamPlt_swRev) -#define IEDMODEL_Battery_ZBTC1_NamPlt_d (&iedModel_Battery_ZBTC1_NamPlt_d) -#define IEDMODEL_Battery_ZBTC1_BatChaSt (&iedModel_Battery_ZBTC1_BatChaSt) -#define IEDMODEL_Battery_ZBTC1_BatChaPwr (&iedModel_Battery_ZBTC1_BatChaPwr) -#define IEDMODEL_Battery_ZBTC1_BatChaMod (&iedModel_Battery_ZBTC1_BatChaMod) -#define IEDMODEL_Battery_ZBTC1_ChaV (&iedModel_Battery_ZBTC1_ChaV) -#define IEDMODEL_Battery_ZBTC1_ChaV_mag (&iedModel_Battery_ZBTC1_ChaV_mag) -#define IEDMODEL_Battery_ZBTC1_ChaV_mag_f (&iedModel_Battery_ZBTC1_ChaV_mag_f) -#define IEDMODEL_Battery_ZBTC1_ChaV_q (&iedModel_Battery_ZBTC1_ChaV_q) -#define IEDMODEL_Battery_ZBTC1_ChaV_t (&iedModel_Battery_ZBTC1_ChaV_t) -#define IEDMODEL_Battery_ZBTC1_ChaA (&iedModel_Battery_ZBTC1_ChaA) -#define IEDMODEL_Battery_ZBTC1_ChaA_mag (&iedModel_Battery_ZBTC1_ChaA_mag) -#define IEDMODEL_Battery_ZBTC1_ChaA_mag_f (&iedModel_Battery_ZBTC1_ChaA_mag_f) -#define IEDMODEL_Battery_ZBTC1_ChaA_q (&iedModel_Battery_ZBTC1_ChaA_q) -#define IEDMODEL_Battery_ZBTC1_ChaA_t (&iedModel_Battery_ZBTC1_ChaA_t) -#define IEDMODEL_Physical_Measurements (&iedModel_Physical_Measurements) -#define IEDMODEL_Physical_Measurements_LLN0 (&iedModel_Physical_Measurements_LLN0) -#define IEDMODEL_Physical_Measurements_LLN0_Mod (&iedModel_Physical_Measurements_LLN0_Mod) -#define IEDMODEL_Physical_Measurements_LLN0_Mod_q (&iedModel_Physical_Measurements_LLN0_Mod_q) -#define IEDMODEL_Physical_Measurements_LLN0_Mod_t (&iedModel_Physical_Measurements_LLN0_Mod_t) -#define IEDMODEL_Physical_Measurements_LLN0_Mod_ctlModel (&iedModel_Physical_Measurements_LLN0_Mod_ctlModel) -#define IEDMODEL_Physical_Measurements_LLN0_Beh (&iedModel_Physical_Measurements_LLN0_Beh) -#define IEDMODEL_Physical_Measurements_LLN0_Beh_stVal (&iedModel_Physical_Measurements_LLN0_Beh_stVal) -#define IEDMODEL_Physical_Measurements_LLN0_Beh_q (&iedModel_Physical_Measurements_LLN0_Beh_q) -#define IEDMODEL_Physical_Measurements_LLN0_Beh_t (&iedModel_Physical_Measurements_LLN0_Beh_t) -#define IEDMODEL_Physical_Measurements_LLN0_Health (&iedModel_Physical_Measurements_LLN0_Health) -#define IEDMODEL_Physical_Measurements_LLN0_Health_stVal (&iedModel_Physical_Measurements_LLN0_Health_stVal) -#define IEDMODEL_Physical_Measurements_LLN0_Health_q (&iedModel_Physical_Measurements_LLN0_Health_q) -#define IEDMODEL_Physical_Measurements_LLN0_Health_t (&iedModel_Physical_Measurements_LLN0_Health_t) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt (&iedModel_Physical_Measurements_LLN0_NamPlt) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_vendor (&iedModel_Physical_Measurements_LLN0_NamPlt_vendor) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_swRev (&iedModel_Physical_Measurements_LLN0_NamPlt_swRev) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_d (&iedModel_Physical_Measurements_LLN0_NamPlt_d) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_configRev (&iedModel_Physical_Measurements_LLN0_NamPlt_configRev) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_ldNs (&iedModel_Physical_Measurements_LLN0_NamPlt_ldNs) -#define IEDMODEL_Physical_Measurements_LPHD1 (&iedModel_Physical_Measurements_LPHD1) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyNam (&iedModel_Physical_Measurements_LPHD1_PhyNam) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyNam_vendor (&iedModel_Physical_Measurements_LPHD1_PhyNam_vendor) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth (&iedModel_Physical_Measurements_LPHD1_PhyHealth) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_stVal (&iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_q (&iedModel_Physical_Measurements_LPHD1_PhyHealth_q) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_t (&iedModel_Physical_Measurements_LPHD1_PhyHealth_t) -#define IEDMODEL_Physical_Measurements_LPHD1_Proxy (&iedModel_Physical_Measurements_LPHD1_Proxy) -#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_stVal (&iedModel_Physical_Measurements_LPHD1_Proxy_stVal) -#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_q (&iedModel_Physical_Measurements_LPHD1_Proxy_q) -#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_t (&iedModel_Physical_Measurements_LPHD1_Proxy_t) - -#endif /* STATIC_MODEL_H_ */ - diff --git a/examples/server_example3/CMakeLists.txt b/examples/server_example3/CMakeLists.txt deleted file mode 100644 index e3dbe438..00000000 --- a/examples/server_example3/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -include_directories( - . -) - -set(server_example3_SRCS - server_example3.c - static_model.c -) - -IF(WIN32) -set_source_files_properties(${server_example3_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(WIN32) - -add_executable(server_example3 - ${server_example3_SRCS} -) - -target_link_libraries(server_example3 - iec61850 -) diff --git a/examples/server_example3/Makefile b/examples/server_example3/Makefile deleted file mode 100644 index 65e2509d..00000000 --- a/examples/server_example3/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = server_example3 -PROJECT_SOURCES = server_example3.c -PROJECT_SOURCES += static_model.c - -PROJECT_ICD_FILE = simpleIO_direct_control.icd - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -LDLIBS += -lm - -CP = cp - -model: $(PROJECT_ICD_FILE) - java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - $(CP) $(PROJECT_BINARY_NAME) vmd-filestore/IEDSERVER.BIN - -clean: - rm -f $(PROJECT_BINARY_NAME) - rm -f vmd-filestore/IEDSERVER.BIN - - diff --git a/examples/server_example3/server_example3.c b/examples/server_example3/server_example3.c deleted file mode 100644 index 2e49ef92..00000000 --- a/examples/server_example3/server_example3.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * server_example3.c - * - * - How to use simple control models - * - How to serve analog measurement data - */ - -#include "iec61850_server.h" -#include "hal_thread.h" -#include -#include -#include -#include - -#include "static_model.h" - -/* import IEC 61850 device model created from SCL-File */ -extern IedModel iedModel; - -static int running = 0; -static IedServer iedServer = NULL; - -void -sigint_handler(int signalId) -{ - running = 0; -} - -static ControlHandlerResult -controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) -{ - if (test) - return CONTROL_RESULT_FAILED; - - if (MmsValue_getType(value) == MMS_BOOLEAN) { - printf("received binary control command: "); - - if (MmsValue_getBoolean(value)) - printf("on\n"); - else - printf("off\n"); - } - else - return CONTROL_RESULT_FAILED; - - uint64_t timeStamp = Hal_getTimeInMs(); - - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { - IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp); - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); - } - - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { - IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp); - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); - } - - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { - IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp); - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); - } - - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { - IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp); - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); - } - - return CONTROL_RESULT_OK; -} - - -static void -connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter) -{ - if (connected) - printf("Connection opened\n"); - else - printf("Connection closed\n"); -} - -int -main(int argc, char** argv) -{ - printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString()); - - iedServer = IedServer_create(&iedModel); - - /* Set the base path for the MMS file services */ - MmsServer mmsServer = IedServer_getMmsServer(iedServer); - MmsServer_setFilestoreBasepath(mmsServer, "./vmd-filestore/"); - - /* Install handler for operate command */ - IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, - (ControlHandler) controlHandlerForBinaryOutput, - IEDMODEL_GenericIO_GGIO1_SPCSO1); - - IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, - (ControlHandler) controlHandlerForBinaryOutput, - IEDMODEL_GenericIO_GGIO1_SPCSO2); - - IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, - (ControlHandler) controlHandlerForBinaryOutput, - IEDMODEL_GenericIO_GGIO1_SPCSO3); - - IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, - (ControlHandler) controlHandlerForBinaryOutput, - IEDMODEL_GenericIO_GGIO1_SPCSO4); - - IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL); - - /* MMS server will be instructed to start listening to client connections. */ - IedServer_start(iedServer, 102); - - if (!IedServer_isRunning(iedServer)) { - printf("Starting server failed! Exit.\n"); - IedServer_destroy(iedServer); - exit(-1); - } - - running = 1; - - signal(SIGINT, sigint_handler); - - float t = 0.f; - - while (running) { - uint64_t timestamp = Hal_getTimeInMs(); - - t += 0.1f; - - float an1 = sinf(t); - float an2 = sinf(t + 1.f); - float an3 = sinf(t + 2.f); - float an4 = sinf(t + 3.f); - - IedServer_lockDataModel(iedServer); - - Timestamp iecTimestamp; - - Timestamp_clearFlags(&iecTimestamp); - Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp); - Timestamp_setLeapSecondKnown(&iecTimestamp, true); - - /* toggle clock-not-synchronized flag in timestamp */ - if (((int) t % 2) == 0) - Timestamp_setClockNotSynchronized(&iecTimestamp, true); - - IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, &iecTimestamp); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1); - - IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, &iecTimestamp); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2); - - IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, &iecTimestamp); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3); - - IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, &iecTimestamp); - IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4); - - IedServer_unlockDataModel(iedServer); - - Thread_sleep(100); - } - - /* stop MMS server - close TCP server socket and all client sockets */ - IedServer_stop(iedServer); - - /* Cleanup - free all resources */ - IedServer_destroy(iedServer); - -} /* main() */ diff --git a/examples/server_example3/simpleIO_direct_control.icd b/examples/server_example3/simpleIO_direct_control.icd deleted file mode 100644 index 0a0c6355..00000000 --- a/examples/server_example3/simpleIO_direct_control.icd +++ /dev/null @@ -1,281 +0,0 @@ - - -
-
- - - Station bus - 10 - -
-

10.0.0.2

-

255.255.255.0

-

10.0.0.1

-

0001

-

00000001

-

0001

-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - - - - - - MZ Automation - - - 0.7.3 - - - libiec61850 server example - - - - - - - - status-only - - - - - direct-with-normal-security - - - - - direct-with-normal-security - - - - - direct-with-normal-security - - - - - direct-with-normal-security - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - direct-with-normal-security - sbo-with-normal-security - direct-with-enhanced-security - sbo-with-enhanced-security - - - not-supported - bay-control - station-control - remote-control - automatic-bay - automatic-station - automatic-remote - maintenance - process - - -
diff --git a/examples/server_example3/simpleIO_sbo_control.icd b/examples/server_example3/simpleIO_sbo_control.icd deleted file mode 100644 index 5f65ff6a..00000000 --- a/examples/server_example3/simpleIO_sbo_control.icd +++ /dev/null @@ -1,287 +0,0 @@ - - -
-
- - - Station bus - 10 - -
-

10.0.0.2

-

255.255.255.0

-

10.0.0.1

-

0001

-

00000001

-

0001

-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - - - - - - - - status-only - - - - - sbo-with-normal-security - - - 30000 - - - operate-once - - - - - sbo-with-normal-security - - - 30000 - - - operate-once - - - - - sbo-with-normal-security - - - 30000 - - - operate-once - - - - - sbo-with-normal-security - - - 30000 - - - operate-once - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - direct-with-normal-security - sbo-with-normal-security - direct-with-enhanced-security - sbo-with-enhanced-security - - - - operate-once - operate-many - - - - not-supported - bay-control - station-control - remote-control - automatic-bay - automatic-station - automatic-remote - maintenance - process - - -
diff --git a/examples/server_example3/static_model.c b/examples/server_example3/static_model.c deleted file mode 100644 index 05926022..00000000 --- a/examples/server_example3/static_model.c +++ /dev/null @@ -1,2003 +0,0 @@ -/* - * static_model.c - * - * automatically generated from simpleIO_direct_control.icd - */ -#include "static_model.h" - -static void initializeValues(); - -extern DataSet iedModelds_GenericIO_LLN0_Events; -extern DataSet iedModelds_GenericIO_LLN0_Events2; -extern DataSet iedModelds_GenericIO_LLN0_Measurements; - - -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 iedModelds_GenericIO_LLN0_Events_fcda0 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO1$stVal", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events_fcda1 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO2$stVal", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events_fcda2 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO3$stVal", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events_fcda3 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO4$stVal", - -1, - NULL, - NULL, - NULL -}; - -DataSet iedModelds_GenericIO_LLN0_Events = { - "GenericIO", - "LLN0$Events", - 4, - &iedModelds_GenericIO_LLN0_Events_fcda0, - &iedModelds_GenericIO_LLN0_Events2 -}; - -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 iedModelds_GenericIO_LLN0_Events2_fcda0 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO1", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events2_fcda1 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO2", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events2_fcda2 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO3", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events2_fcda3 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO4", - -1, - NULL, - NULL, - NULL -}; - -DataSet iedModelds_GenericIO_LLN0_Events2 = { - "GenericIO", - "LLN0$Events2", - 4, - &iedModelds_GenericIO_LLN0_Events2_fcda0, - &iedModelds_GenericIO_LLN0_Measurements -}; - -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 iedModelds_GenericIO_LLN0_Measurements_fcda0 = { - "GenericIO", - false, - "GGIO1$MX$AnIn1$mag$f", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Measurements_fcda1 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda1 = { - "GenericIO", - false, - "GGIO1$MX$AnIn1$q", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Measurements_fcda2 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda2 = { - "GenericIO", - false, - "GGIO1$MX$AnIn2$mag$f", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Measurements_fcda3 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda3 = { - "GenericIO", - false, - "GGIO1$MX$AnIn2$q", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Measurements_fcda4 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda4 = { - "GenericIO", - false, - "GGIO1$MX$AnIn3$mag$f", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Measurements_fcda5 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda5 = { - "GenericIO", - false, - "GGIO1$MX$AnIn3$q", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Measurements_fcda6 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda6 = { - "GenericIO", - false, - "GGIO1$MX$AnIn4$mag$f", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Measurements_fcda7 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda7 = { - "GenericIO", - false, - "GGIO1$MX$AnIn4$q", - -1, - NULL, - NULL, - NULL -}; - -DataSet iedModelds_GenericIO_LLN0_Measurements = { - "GenericIO", - "LLN0$Measurements", - 8, - &iedModelds_GenericIO_LLN0_Measurements_fcda0, - NULL -}; - -LogicalDevice iedModel_GenericIO = { - LogicalDeviceModelType, - "GenericIO", - (ModelNode*) &iedModel, - NULL, - (ModelNode*) &iedModel_GenericIO_LLN0 -}; - -LogicalNode iedModel_GenericIO_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_GenericIO, - (ModelNode*) &iedModel_GenericIO_LPHD1, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, -}; - -DataObject iedModel_GenericIO_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_GenericIO_LLN0, - (ModelNode*) &iedModel_GenericIO_LLN0_Beh, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LLN0_Mod_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_GenericIO_LLN0, - (ModelNode*) &iedModel_GenericIO_LLN0_Health, - (ModelNode*) &iedModel_GenericIO_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LLN0_Beh, - (ModelNode*) &iedModel_GenericIO_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LLN0_Beh, - (ModelNode*) &iedModel_GenericIO_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_GenericIO_LLN0, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LLN0_Health, - (ModelNode*) &iedModel_GenericIO_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LLN0_Health, - (ModelNode*) &iedModel_GenericIO_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_GenericIO_LLN0, - NULL, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_GenericIO_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_GenericIO, - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, -}; - -DataObject iedModel_GenericIO_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_GenericIO_LPHD1, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_GenericIO_LPHD1, - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_GenericIO_LPHD1, - NULL, - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_GenericIO_GGIO1 = { - LogicalNodeModelType, - "GGIO1", - (ModelNode*) &iedModel_GenericIO, - NULL, - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, -}; - -DataObject iedModel_GenericIO_GGIO1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_q, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Health, - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, - (ModelNode*) &iedModel_GenericIO_GGIO1_Health_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Health, - (ModelNode*) &iedModel_GenericIO_GGIO1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Health, - (ModelNode*) &iedModel_GenericIO_GGIO1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_AnIn1 = { - DataObjectModelType, - "AnIn1", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_q, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_AnIn2 = { - DataObjectModelType, - "AnIn2", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_q, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_AnIn3 = { - DataObjectModelType, - "AnIn3", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_q, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_AnIn4 = { - DataObjectModelType, - "AnIn4", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_q, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_SPCSO1 = { - DataObjectModelType, - "SPCSO1", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { - DataAttributeModelType, - "Oper", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlModel, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { - DataAttributeModelType, - "ctlVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { - DataAttributeModelType, - "origin", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { - DataAttributeModelType, - "orCat", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { - DataAttributeModelType, - "orIdent", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_OCTET_STRING_64, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { - DataAttributeModelType, - "ctlNum", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_T, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_INT8U, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { - DataAttributeModelType, - "T", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { - DataAttributeModelType, - "Test", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { - DataAttributeModelType, - "Check", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_CHECK, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_t, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_SPCSO2 = { - DataObjectModelType, - "SPCSO2", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { - DataAttributeModelType, - "Oper", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { - DataAttributeModelType, - "ctlVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { - DataAttributeModelType, - "origin", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { - DataAttributeModelType, - "orCat", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { - DataAttributeModelType, - "orIdent", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_OCTET_STRING_64, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { - DataAttributeModelType, - "ctlNum", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_T, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_INT8U, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { - DataAttributeModelType, - "T", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { - DataAttributeModelType, - "Test", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { - DataAttributeModelType, - "Check", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_CHECK, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_t, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_SPCSO3 = { - DataObjectModelType, - "SPCSO3", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { - DataAttributeModelType, - "Oper", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlModel, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { - DataAttributeModelType, - "ctlVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { - DataAttributeModelType, - "origin", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { - DataAttributeModelType, - "orCat", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { - DataAttributeModelType, - "orIdent", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_OCTET_STRING_64, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { - DataAttributeModelType, - "ctlNum", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_T, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_INT8U, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { - DataAttributeModelType, - "T", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { - DataAttributeModelType, - "Test", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { - DataAttributeModelType, - "Check", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_CHECK, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_t, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_SPCSO4 = { - DataObjectModelType, - "SPCSO4", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { - DataAttributeModelType, - "Oper", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { - DataAttributeModelType, - "ctlVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { - DataAttributeModelType, - "origin", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { - DataAttributeModelType, - "orCat", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { - DataAttributeModelType, - "orIdent", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_OCTET_STRING_64, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { - DataAttributeModelType, - "ctlNum", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_T, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_INT8U, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { - DataAttributeModelType, - "T", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { - DataAttributeModelType, - "Test", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { - DataAttributeModelType, - "Check", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_CHECK, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Ind1 = { - DataObjectModelType, - "Ind1", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Ind2 = { - DataObjectModelType, - "Ind2", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Ind3 = { - DataObjectModelType, - "Ind3", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Ind4 = { - DataObjectModelType, - "Ind4", - (ModelNode*) &iedModel_GenericIO_GGIO1, - NULL, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -extern ReportControlBlock iedModel_GenericIO_LLN0_report0; -extern ReportControlBlock iedModel_GenericIO_LLN0_report1; -extern ReportControlBlock iedModel_GenericIO_LLN0_report2; -extern ReportControlBlock iedModel_GenericIO_LLN0_report3; -extern ReportControlBlock iedModel_GenericIO_LLN0_report4; -extern ReportControlBlock iedModel_GenericIO_LLN0_report5; -extern ReportControlBlock iedModel_GenericIO_LLN0_report6; - -ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report1}; -ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report2}; -ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report3}; -ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report4}; -ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report5}; -ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report6}; -ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, NULL}; - - - - -extern LogControlBlock iedModel_GenericIO_LLN0_lcb0; -extern LogControlBlock iedModel_GenericIO_LLN0_lcb1; -LogControlBlock iedModel_GenericIO_LLN0_lcb0 = {&iedModel_GenericIO_LLN0, "EventLog", "Events", "GenericIO/LLN0$EventLog", 3, 0, true, true, &iedModel_GenericIO_LLN0_lcb1}; -LogControlBlock iedModel_GenericIO_LLN0_lcb1 = {&iedModel_GenericIO_LLN0, "GeneralLog", NULL, NULL, 3, 0, true, true, NULL}; - -extern Log iedModel_GenericIO_LLN0_log0; -extern Log iedModel_GenericIO_LLN0_log1; -Log iedModel_GenericIO_LLN0_log0 = {&iedModel_GenericIO_LLN0, "GeneralLog", &iedModel_GenericIO_LLN0_log1}; -Log iedModel_GenericIO_LLN0_log1 = {&iedModel_GenericIO_LLN0, "EventLog", NULL}; - - -IedModel iedModel = { - "simpleIO", - &iedModel_GenericIO, - &iedModelds_GenericIO_LLN0_Events, - &iedModel_GenericIO_LLN0_report0, - NULL, - NULL, - NULL, - &iedModel_GenericIO_LLN0_lcb0, - &iedModel_GenericIO_LLN0_log0, - initializeValues -}; - -static void -initializeValues() -{ - -iedModel_GenericIO_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_GenericIO_LLN0_NamPlt_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation"); - -iedModel_GenericIO_LLN0_NamPlt_swRev.mmsValue = MmsValue_newVisibleString("0.7.3"); - -iedModel_GenericIO_LLN0_NamPlt_d.mmsValue = MmsValue_newVisibleString("libiec61850 server example"); - -iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); - -iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); - -iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); - -iedModel_GenericIO_GGIO1_SPCSO4_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); -} diff --git a/examples/server_example3/static_model.h b/examples/server_example3/static_model.h deleted file mode 100644 index b5670e9f..00000000 --- a/examples/server_example3/static_model.h +++ /dev/null @@ -1,301 +0,0 @@ -/* - * static_model.h - * - * automatically generated from simpleIO_direct_control.icd - */ - -#ifndef STATIC_MODEL_H_ -#define STATIC_MODEL_H_ - -#include -#include "iec61850_model.h" - -extern IedModel iedModel; -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; - - - -#define IEDMODEL_GenericIO (&iedModel_GenericIO) -#define IEDMODEL_GenericIO_LLN0 (&iedModel_GenericIO_LLN0) -#define IEDMODEL_GenericIO_LLN0_Mod (&iedModel_GenericIO_LLN0_Mod) -#define IEDMODEL_GenericIO_LLN0_Mod_stVal (&iedModel_GenericIO_LLN0_Mod_stVal) -#define IEDMODEL_GenericIO_LLN0_Mod_q (&iedModel_GenericIO_LLN0_Mod_q) -#define IEDMODEL_GenericIO_LLN0_Mod_t (&iedModel_GenericIO_LLN0_Mod_t) -#define IEDMODEL_GenericIO_LLN0_Mod_ctlModel (&iedModel_GenericIO_LLN0_Mod_ctlModel) -#define IEDMODEL_GenericIO_LLN0_Beh (&iedModel_GenericIO_LLN0_Beh) -#define IEDMODEL_GenericIO_LLN0_Beh_stVal (&iedModel_GenericIO_LLN0_Beh_stVal) -#define IEDMODEL_GenericIO_LLN0_Beh_q (&iedModel_GenericIO_LLN0_Beh_q) -#define IEDMODEL_GenericIO_LLN0_Beh_t (&iedModel_GenericIO_LLN0_Beh_t) -#define IEDMODEL_GenericIO_LLN0_Health (&iedModel_GenericIO_LLN0_Health) -#define IEDMODEL_GenericIO_LLN0_Health_stVal (&iedModel_GenericIO_LLN0_Health_stVal) -#define IEDMODEL_GenericIO_LLN0_Health_q (&iedModel_GenericIO_LLN0_Health_q) -#define IEDMODEL_GenericIO_LLN0_Health_t (&iedModel_GenericIO_LLN0_Health_t) -#define IEDMODEL_GenericIO_LLN0_NamPlt (&iedModel_GenericIO_LLN0_NamPlt) -#define IEDMODEL_GenericIO_LLN0_NamPlt_vendor (&iedModel_GenericIO_LLN0_NamPlt_vendor) -#define IEDMODEL_GenericIO_LLN0_NamPlt_swRev (&iedModel_GenericIO_LLN0_NamPlt_swRev) -#define IEDMODEL_GenericIO_LLN0_NamPlt_d (&iedModel_GenericIO_LLN0_NamPlt_d) -#define IEDMODEL_GenericIO_LLN0_NamPlt_configRev (&iedModel_GenericIO_LLN0_NamPlt_configRev) -#define IEDMODEL_GenericIO_LLN0_NamPlt_ldNs (&iedModel_GenericIO_LLN0_NamPlt_ldNs) -#define IEDMODEL_GenericIO_LPHD1 (&iedModel_GenericIO_LPHD1) -#define IEDMODEL_GenericIO_LPHD1_PhyNam (&iedModel_GenericIO_LPHD1_PhyNam) -#define IEDMODEL_GenericIO_LPHD1_PhyNam_vendor (&iedModel_GenericIO_LPHD1_PhyNam_vendor) -#define IEDMODEL_GenericIO_LPHD1_PhyHealth (&iedModel_GenericIO_LPHD1_PhyHealth) -#define IEDMODEL_GenericIO_LPHD1_PhyHealth_stVal (&iedModel_GenericIO_LPHD1_PhyHealth_stVal) -#define IEDMODEL_GenericIO_LPHD1_PhyHealth_q (&iedModel_GenericIO_LPHD1_PhyHealth_q) -#define IEDMODEL_GenericIO_LPHD1_PhyHealth_t (&iedModel_GenericIO_LPHD1_PhyHealth_t) -#define IEDMODEL_GenericIO_LPHD1_Proxy (&iedModel_GenericIO_LPHD1_Proxy) -#define IEDMODEL_GenericIO_LPHD1_Proxy_stVal (&iedModel_GenericIO_LPHD1_Proxy_stVal) -#define IEDMODEL_GenericIO_LPHD1_Proxy_q (&iedModel_GenericIO_LPHD1_Proxy_q) -#define IEDMODEL_GenericIO_LPHD1_Proxy_t (&iedModel_GenericIO_LPHD1_Proxy_t) -#define IEDMODEL_GenericIO_GGIO1 (&iedModel_GenericIO_GGIO1) -#define IEDMODEL_GenericIO_GGIO1_Mod (&iedModel_GenericIO_GGIO1_Mod) -#define IEDMODEL_GenericIO_GGIO1_Mod_q (&iedModel_GenericIO_GGIO1_Mod_q) -#define IEDMODEL_GenericIO_GGIO1_Mod_t (&iedModel_GenericIO_GGIO1_Mod_t) -#define IEDMODEL_GenericIO_GGIO1_Mod_ctlModel (&iedModel_GenericIO_GGIO1_Mod_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_Beh (&iedModel_GenericIO_GGIO1_Beh) -#define IEDMODEL_GenericIO_GGIO1_Beh_stVal (&iedModel_GenericIO_GGIO1_Beh_stVal) -#define IEDMODEL_GenericIO_GGIO1_Beh_q (&iedModel_GenericIO_GGIO1_Beh_q) -#define IEDMODEL_GenericIO_GGIO1_Beh_t (&iedModel_GenericIO_GGIO1_Beh_t) -#define IEDMODEL_GenericIO_GGIO1_Health (&iedModel_GenericIO_GGIO1_Health) -#define IEDMODEL_GenericIO_GGIO1_Health_stVal (&iedModel_GenericIO_GGIO1_Health_stVal) -#define IEDMODEL_GenericIO_GGIO1_Health_q (&iedModel_GenericIO_GGIO1_Health_q) -#define IEDMODEL_GenericIO_GGIO1_Health_t (&iedModel_GenericIO_GGIO1_Health_t) -#define IEDMODEL_GenericIO_GGIO1_NamPlt (&iedModel_GenericIO_GGIO1_NamPlt) -#define IEDMODEL_GenericIO_GGIO1_NamPlt_vendor (&iedModel_GenericIO_GGIO1_NamPlt_vendor) -#define IEDMODEL_GenericIO_GGIO1_NamPlt_swRev (&iedModel_GenericIO_GGIO1_NamPlt_swRev) -#define IEDMODEL_GenericIO_GGIO1_NamPlt_d (&iedModel_GenericIO_GGIO1_NamPlt_d) -#define IEDMODEL_GenericIO_GGIO1_AnIn1 (&iedModel_GenericIO_GGIO1_AnIn1) -#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag (&iedModel_GenericIO_GGIO1_AnIn1_mag) -#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f (&iedModel_GenericIO_GGIO1_AnIn1_mag_f) -#define IEDMODEL_GenericIO_GGIO1_AnIn1_q (&iedModel_GenericIO_GGIO1_AnIn1_q) -#define IEDMODEL_GenericIO_GGIO1_AnIn1_t (&iedModel_GenericIO_GGIO1_AnIn1_t) -#define IEDMODEL_GenericIO_GGIO1_AnIn2 (&iedModel_GenericIO_GGIO1_AnIn2) -#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag (&iedModel_GenericIO_GGIO1_AnIn2_mag) -#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f (&iedModel_GenericIO_GGIO1_AnIn2_mag_f) -#define IEDMODEL_GenericIO_GGIO1_AnIn2_q (&iedModel_GenericIO_GGIO1_AnIn2_q) -#define IEDMODEL_GenericIO_GGIO1_AnIn2_t (&iedModel_GenericIO_GGIO1_AnIn2_t) -#define IEDMODEL_GenericIO_GGIO1_AnIn3 (&iedModel_GenericIO_GGIO1_AnIn3) -#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag (&iedModel_GenericIO_GGIO1_AnIn3_mag) -#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f (&iedModel_GenericIO_GGIO1_AnIn3_mag_f) -#define IEDMODEL_GenericIO_GGIO1_AnIn3_q (&iedModel_GenericIO_GGIO1_AnIn3_q) -#define IEDMODEL_GenericIO_GGIO1_AnIn3_t (&iedModel_GenericIO_GGIO1_AnIn3_t) -#define IEDMODEL_GenericIO_GGIO1_AnIn4 (&iedModel_GenericIO_GGIO1_AnIn4) -#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag (&iedModel_GenericIO_GGIO1_AnIn4_mag) -#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f (&iedModel_GenericIO_GGIO1_AnIn4_mag_f) -#define IEDMODEL_GenericIO_GGIO1_AnIn4_q (&iedModel_GenericIO_GGIO1_AnIn4_q) -#define IEDMODEL_GenericIO_GGIO1_AnIn4_t (&iedModel_GenericIO_GGIO1_AnIn4_t) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1 (&iedModel_GenericIO_GGIO1_SPCSO1) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal (&iedModel_GenericIO_GGIO1_SPCSO1_stVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_q (&iedModel_GenericIO_GGIO1_SPCSO1_q) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper (&iedModel_GenericIO_GGIO1_SPCSO1_Oper) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_T) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO1_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_t (&iedModel_GenericIO_GGIO1_SPCSO1_t) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal (&iedModel_GenericIO_GGIO1_SPCSO2_stVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_q (&iedModel_GenericIO_GGIO1_SPCSO2_q) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper (&iedModel_GenericIO_GGIO1_SPCSO2_Oper) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_T) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO2_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_t (&iedModel_GenericIO_GGIO1_SPCSO2_t) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3 (&iedModel_GenericIO_GGIO1_SPCSO3) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal (&iedModel_GenericIO_GGIO1_SPCSO3_stVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_q (&iedModel_GenericIO_GGIO1_SPCSO3_q) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper (&iedModel_GenericIO_GGIO1_SPCSO3_Oper) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_T) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_t (&iedModel_GenericIO_GGIO1_SPCSO3_t) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4 (&iedModel_GenericIO_GGIO1_SPCSO4) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal (&iedModel_GenericIO_GGIO1_SPCSO4_stVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_q (&iedModel_GenericIO_GGIO1_SPCSO4_q) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper (&iedModel_GenericIO_GGIO1_SPCSO4_Oper) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_T) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_t (&iedModel_GenericIO_GGIO1_SPCSO4_t) -#define IEDMODEL_GenericIO_GGIO1_Ind1 (&iedModel_GenericIO_GGIO1_Ind1) -#define IEDMODEL_GenericIO_GGIO1_Ind1_stVal (&iedModel_GenericIO_GGIO1_Ind1_stVal) -#define IEDMODEL_GenericIO_GGIO1_Ind1_q (&iedModel_GenericIO_GGIO1_Ind1_q) -#define IEDMODEL_GenericIO_GGIO1_Ind1_t (&iedModel_GenericIO_GGIO1_Ind1_t) -#define IEDMODEL_GenericIO_GGIO1_Ind2 (&iedModel_GenericIO_GGIO1_Ind2) -#define IEDMODEL_GenericIO_GGIO1_Ind2_stVal (&iedModel_GenericIO_GGIO1_Ind2_stVal) -#define IEDMODEL_GenericIO_GGIO1_Ind2_q (&iedModel_GenericIO_GGIO1_Ind2_q) -#define IEDMODEL_GenericIO_GGIO1_Ind2_t (&iedModel_GenericIO_GGIO1_Ind2_t) -#define IEDMODEL_GenericIO_GGIO1_Ind3 (&iedModel_GenericIO_GGIO1_Ind3) -#define IEDMODEL_GenericIO_GGIO1_Ind3_stVal (&iedModel_GenericIO_GGIO1_Ind3_stVal) -#define IEDMODEL_GenericIO_GGIO1_Ind3_q (&iedModel_GenericIO_GGIO1_Ind3_q) -#define IEDMODEL_GenericIO_GGIO1_Ind3_t (&iedModel_GenericIO_GGIO1_Ind3_t) -#define IEDMODEL_GenericIO_GGIO1_Ind4 (&iedModel_GenericIO_GGIO1_Ind4) -#define IEDMODEL_GenericIO_GGIO1_Ind4_stVal (&iedModel_GenericIO_GGIO1_Ind4_stVal) -#define IEDMODEL_GenericIO_GGIO1_Ind4_q (&iedModel_GenericIO_GGIO1_Ind4_q) -#define IEDMODEL_GenericIO_GGIO1_Ind4_t (&iedModel_GenericIO_GGIO1_Ind4_t) - -#endif /* STATIC_MODEL_H_ */ - diff --git a/examples/server_example3/vmd-filestore/SYSTEM.BIN b/examples/server_example3/vmd-filestore/SYSTEM.BIN deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/server_example4/CMakeLists.txt b/examples/server_example4/CMakeLists.txt deleted file mode 100644 index d738b0f7..00000000 --- a/examples/server_example4/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -include_directories( - . -) - -set(server_example4_SRCS - server_example4.c - static_model.c -) - -IF(WIN32) -set_source_files_properties(${server_example4_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(WIN32) - -add_executable(server_example4 - ${server_example4_SRCS} -) - -target_link_libraries(server_example4 - iec61850 -) diff --git a/examples/server_example4/Makefile b/examples/server_example4/Makefile deleted file mode 100644 index 4907673e..00000000 --- a/examples/server_example4/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = server_example4 -PROJECT_SOURCES = server_example4.c -PROJECT_SOURCES += static_model.c - -PROJECT_ICD_FILE = simpleIO_direct_control.icd - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -model: $(PROJECT_ICD_FILE) - java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) - - diff --git a/examples/server_example4/server_example4.c b/examples/server_example4/server_example4.c deleted file mode 100644 index b3aa07fc..00000000 --- a/examples/server_example4/server_example4.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * server_example4.c - * - * Example server application with password authentication. - * - * - How to use a authenticator with password authentication - * - How to distinguish between different clients for control actions and set points - * - * The server accepts only connections by clients using one of the two passwords: - * - * user1@testpw - * user2@testpw - * - * Only clients using the second password are allowed to perform control actions. - */ - -#include "iec61850_server.h" -#include "static_model.h" -#include "hal_thread.h" -#include -#include -#include - -/* import IEC 61850 device model created from SCL-File */ -extern IedModel iedModel; - -static int running = 0; - -static IedServer iedServer; - -void sigint_handler(int signalId) -{ - running = 0; -} - -/* password "database" */ -static char* password1 = "user1@testpw"; -static char* password2 = "user2@testpw"; - -/** - * This is the AcseAuthenticator callback function that is invoked on each client connection attempt. - * When returning true the server stack accepts the client. Otherwise the connection is rejected. - */ -static bool -clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken) -{ - if (authParameter->mechanism == ACSE_AUTH_PASSWORD) { - if (authParameter->value.password.passwordLength == strlen(password1)) { - if (memcmp(authParameter->value.password.octetString, password1, - authParameter->value.password.passwordLength) == 0) - { - *securityToken = (void*) password1; - return true; - } - - } - if (authParameter->value.password.passwordLength == strlen(password2)) { - if (memcmp(authParameter->value.password.octetString, password2, - authParameter->value.password.passwordLength) == 0) - { - *securityToken = (void*) password2; - return true; - } - } - } - - return false; -} - -static CheckHandlerResult -performCheckHandler (void* parameter, MmsValue* ctlVal, bool test, bool interlockCheck, ClientConnection connection) -{ - void* securityToken = ClientConnection_getSecurityToken(connection); - - if (securityToken == password2) - return CONTROL_ACCEPTED; - else - return CONTROL_OBJECT_ACCESS_DENIED; -} - -static void -controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) -{ - MmsValue* timeStamp = MmsValue_newUtcTimeByMsTime(Hal_getTimeInMs()); - - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp); - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); - } - - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp); - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); - } - - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp); - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); - } - - if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp); - IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); - } - - MmsValue_delete(timeStamp); -} - -int main(int argc, char** argv) { - - iedServer = IedServer_create(&iedModel); - - /* Activate authentication */ - IedServer_setAuthenticator(iedServer, clientAuthenticator, NULL); - - /* Set handler for control permission check for each control object */ - IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, - (ControlPerformCheckHandler) performCheckHandler, NULL); - IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, - (ControlPerformCheckHandler) performCheckHandler, NULL); - IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, - (ControlPerformCheckHandler) performCheckHandler, NULL); - IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, - (ControlPerformCheckHandler) performCheckHandler, NULL); - - /* Set control handler for each control object */ - IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, - (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO1); - IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, - (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO2); - IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, - (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO3); - IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, - (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO4); - - /* MMS server will be instructed to start listening to client connections. */ - IedServer_start(iedServer, 102); - - if (!IedServer_isRunning(iedServer)) { - printf("Starting server failed! Exit.\n"); - IedServer_destroy(iedServer); - exit(-1); - } - - running = 1; - - signal(SIGINT, sigint_handler); - - while (running) - Thread_sleep(100); - - /* stop MMS server - close TCP server socket and all client sockets */ - IedServer_stop(iedServer); - - /* Cleanup - free all resources */ - IedServer_destroy(iedServer); -} /* main() */ diff --git a/examples/server_example4/simpleIO_direct_control.icd b/examples/server_example4/simpleIO_direct_control.icd deleted file mode 100644 index 3081dffe..00000000 --- a/examples/server_example4/simpleIO_direct_control.icd +++ /dev/null @@ -1,223 +0,0 @@ - - -
-
- - - Station bus - 10 - -
-

10.0.0.2

-

255.255.255.0

-

10.0.0.1

-

0001

-

00000001

-

0001

-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - - - - - - - - status-only - - - - - direct-with-normal-security - - - - - direct-with-normal-security - - - - - direct-with-normal-security - - - - - direct-with-normal-security - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - direct-with-normal-security - sbo-with-normal-security - direct-with-enhanced-security - sbo-with-enhanced-security - - - not-supported - bay-control - station-control - remote-control - automatic-bay - automatic-station - automatic-remote - maintenance - process - - -
diff --git a/examples/server_example4/static_model.c b/examples/server_example4/static_model.c deleted file mode 100644 index bf02f9d5..00000000 --- a/examples/server_example4/static_model.c +++ /dev/null @@ -1,1812 +0,0 @@ -/* - * static_model.c - * - * automatically generated from simpleIO_direct_control.icd - */ -#include "static_model.h" - -static void initializeValues(); - -extern DataSet iedModelds_GenericIO_LLN0_Events; - - -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 iedModelds_GenericIO_LLN0_Events_fcda0 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO1$stVal", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events_fcda1 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO2$stVal", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events_fcda2 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO3$stVal", - -1, - NULL, - NULL, - &iedModelds_GenericIO_LLN0_Events_fcda3 -}; - -DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { - "GenericIO", - false, - "GGIO1$ST$SPCSO4$stVal", - -1, - NULL, - NULL, - NULL -}; - -DataSet iedModelds_GenericIO_LLN0_Events = { - "GenericIO", - "LLN0$Events", - 4, - &iedModelds_GenericIO_LLN0_Events_fcda0, - NULL -}; - -LogicalDevice iedModel_GenericIO = { - LogicalDeviceModelType, - "GenericIO", - (ModelNode*) &iedModel, - NULL, - (ModelNode*) &iedModel_GenericIO_LLN0 -}; - -LogicalNode iedModel_GenericIO_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_GenericIO, - (ModelNode*) &iedModel_GenericIO_LPHD1, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, -}; - -DataObject iedModel_GenericIO_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_GenericIO_LLN0, - (ModelNode*) &iedModel_GenericIO_LLN0_Beh, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod_q, - 0 -}; - -DataAttribute iedModel_GenericIO_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, - (ModelNode*) &iedModel_GenericIO_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_GenericIO_LLN0, - (ModelNode*) &iedModel_GenericIO_LLN0_Health, - (ModelNode*) &iedModel_GenericIO_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LLN0_Beh, - (ModelNode*) &iedModel_GenericIO_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LLN0_Beh, - (ModelNode*) &iedModel_GenericIO_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_GenericIO_LLN0, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LLN0_Health, - (ModelNode*) &iedModel_GenericIO_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LLN0_Health, - (ModelNode*) &iedModel_GenericIO_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_GenericIO_LLN0, - NULL, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_GenericIO_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_GenericIO, - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, -}; - -DataObject iedModel_GenericIO_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_GenericIO_LPHD1, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_GenericIO_LPHD1, - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_GenericIO_LPHD1, - NULL, - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_GenericIO_GGIO1 = { - LogicalNodeModelType, - "GGIO1", - (ModelNode*) &iedModel_GenericIO, - NULL, - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, -}; - -DataObject iedModel_GenericIO_GGIO1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_q, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Health, - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, - (ModelNode*) &iedModel_GenericIO_GGIO1_Health_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Health, - (ModelNode*) &iedModel_GenericIO_GGIO1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Health, - (ModelNode*) &iedModel_GenericIO_GGIO1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_AnIn1 = { - DataObjectModelType, - "AnIn1", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_q, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_AnIn2 = { - DataObjectModelType, - "AnIn2", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_q, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_AnIn3 = { - DataObjectModelType, - "AnIn3", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_q, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_AnIn4 = { - DataObjectModelType, - "AnIn4", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_q, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_SPCSO1 = { - DataObjectModelType, - "SPCSO1", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { - DataAttributeModelType, - "Oper", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlModel, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { - DataAttributeModelType, - "ctlVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { - DataAttributeModelType, - "origin", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { - DataAttributeModelType, - "orCat", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { - DataAttributeModelType, - "orIdent", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_OCTET_STRING_64, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { - DataAttributeModelType, - "ctlNum", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_T, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_INT8U, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { - DataAttributeModelType, - "T", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { - DataAttributeModelType, - "Test", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { - DataAttributeModelType, - "Check", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_CHECK, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_t, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_SPCSO2 = { - DataObjectModelType, - "SPCSO2", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { - DataAttributeModelType, - "Oper", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { - DataAttributeModelType, - "ctlVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { - DataAttributeModelType, - "origin", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { - DataAttributeModelType, - "orCat", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { - DataAttributeModelType, - "orIdent", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_OCTET_STRING_64, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { - DataAttributeModelType, - "ctlNum", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_T, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_INT8U, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { - DataAttributeModelType, - "T", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { - DataAttributeModelType, - "Test", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { - DataAttributeModelType, - "Check", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_CHECK, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_t, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_SPCSO3 = { - DataObjectModelType, - "SPCSO3", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { - DataAttributeModelType, - "Oper", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlModel, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { - DataAttributeModelType, - "ctlVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { - DataAttributeModelType, - "origin", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { - DataAttributeModelType, - "orCat", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { - DataAttributeModelType, - "orIdent", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_OCTET_STRING_64, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { - DataAttributeModelType, - "ctlNum", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_T, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_INT8U, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { - DataAttributeModelType, - "T", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { - DataAttributeModelType, - "Test", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { - DataAttributeModelType, - "Check", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_CHECK, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_t, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_SPCSO4 = { - DataObjectModelType, - "SPCSO4", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { - DataAttributeModelType, - "Oper", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { - DataAttributeModelType, - "ctlVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { - DataAttributeModelType, - "origin", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, - 0, - IEC61850_FC_CO, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { - DataAttributeModelType, - "orCat", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { - DataAttributeModelType, - "orIdent", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_OCTET_STRING_64, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { - DataAttributeModelType, - "ctlNum", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_T, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_INT8U, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { - DataAttributeModelType, - "T", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { - DataAttributeModelType, - "Test", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_BOOLEAN, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { - DataAttributeModelType, - "Check", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, - NULL, - NULL, - 0, - IEC61850_FC_CO, - IEC61850_CHECK, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Ind1 = { - DataObjectModelType, - "Ind1", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Ind2 = { - DataObjectModelType, - "Ind2", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Ind3 = { - DataObjectModelType, - "Ind3", - (ModelNode*) &iedModel_GenericIO_GGIO1, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_GenericIO_GGIO1_Ind4 = { - DataObjectModelType, - "Ind4", - (ModelNode*) &iedModel_GenericIO_GGIO1, - NULL, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_stVal, - 0 -}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -extern ReportControlBlock iedModel_GenericIO_LLN0_report0; - -ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 111, 50, 1000, NULL}; - - - - - - - -IedModel iedModel = { - "simpleIO", - &iedModel_GenericIO, - &iedModelds_GenericIO_LLN0_Events, - &iedModel_GenericIO_LLN0_report0, - NULL, - NULL, - NULL, - NULL, - NULL, - initializeValues -}; - -static void -initializeValues() -{ - -iedModel_GenericIO_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); - -iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); - -iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); - -iedModel_GenericIO_GGIO1_SPCSO4_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); -} diff --git a/examples/server_example4/static_model.h b/examples/server_example4/static_model.h deleted file mode 100644 index 58dd28b5..00000000 --- a/examples/server_example4/static_model.h +++ /dev/null @@ -1,299 +0,0 @@ -/* - * static_model.h - * - * automatically generated from simpleIO_direct_control.icd - */ - -#ifndef STATIC_MODEL_H_ -#define STATIC_MODEL_H_ - -#include -#include "iec61850_model.h" - -extern IedModel iedModel; -extern LogicalDevice iedModel_GenericIO; -extern LogicalNode iedModel_GenericIO_LLN0; -extern DataObject iedModel_GenericIO_LLN0_Mod; -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; - - - -#define IEDMODEL_GenericIO (&iedModel_GenericIO) -#define IEDMODEL_GenericIO_LLN0 (&iedModel_GenericIO_LLN0) -#define IEDMODEL_GenericIO_LLN0_Mod (&iedModel_GenericIO_LLN0_Mod) -#define IEDMODEL_GenericIO_LLN0_Mod_q (&iedModel_GenericIO_LLN0_Mod_q) -#define IEDMODEL_GenericIO_LLN0_Mod_t (&iedModel_GenericIO_LLN0_Mod_t) -#define IEDMODEL_GenericIO_LLN0_Mod_ctlModel (&iedModel_GenericIO_LLN0_Mod_ctlModel) -#define IEDMODEL_GenericIO_LLN0_Beh (&iedModel_GenericIO_LLN0_Beh) -#define IEDMODEL_GenericIO_LLN0_Beh_stVal (&iedModel_GenericIO_LLN0_Beh_stVal) -#define IEDMODEL_GenericIO_LLN0_Beh_q (&iedModel_GenericIO_LLN0_Beh_q) -#define IEDMODEL_GenericIO_LLN0_Beh_t (&iedModel_GenericIO_LLN0_Beh_t) -#define IEDMODEL_GenericIO_LLN0_Health (&iedModel_GenericIO_LLN0_Health) -#define IEDMODEL_GenericIO_LLN0_Health_stVal (&iedModel_GenericIO_LLN0_Health_stVal) -#define IEDMODEL_GenericIO_LLN0_Health_q (&iedModel_GenericIO_LLN0_Health_q) -#define IEDMODEL_GenericIO_LLN0_Health_t (&iedModel_GenericIO_LLN0_Health_t) -#define IEDMODEL_GenericIO_LLN0_NamPlt (&iedModel_GenericIO_LLN0_NamPlt) -#define IEDMODEL_GenericIO_LLN0_NamPlt_vendor (&iedModel_GenericIO_LLN0_NamPlt_vendor) -#define IEDMODEL_GenericIO_LLN0_NamPlt_swRev (&iedModel_GenericIO_LLN0_NamPlt_swRev) -#define IEDMODEL_GenericIO_LLN0_NamPlt_d (&iedModel_GenericIO_LLN0_NamPlt_d) -#define IEDMODEL_GenericIO_LLN0_NamPlt_configRev (&iedModel_GenericIO_LLN0_NamPlt_configRev) -#define IEDMODEL_GenericIO_LLN0_NamPlt_ldNs (&iedModel_GenericIO_LLN0_NamPlt_ldNs) -#define IEDMODEL_GenericIO_LPHD1 (&iedModel_GenericIO_LPHD1) -#define IEDMODEL_GenericIO_LPHD1_PhyNam (&iedModel_GenericIO_LPHD1_PhyNam) -#define IEDMODEL_GenericIO_LPHD1_PhyNam_vendor (&iedModel_GenericIO_LPHD1_PhyNam_vendor) -#define IEDMODEL_GenericIO_LPHD1_PhyHealth (&iedModel_GenericIO_LPHD1_PhyHealth) -#define IEDMODEL_GenericIO_LPHD1_PhyHealth_stVal (&iedModel_GenericIO_LPHD1_PhyHealth_stVal) -#define IEDMODEL_GenericIO_LPHD1_PhyHealth_q (&iedModel_GenericIO_LPHD1_PhyHealth_q) -#define IEDMODEL_GenericIO_LPHD1_PhyHealth_t (&iedModel_GenericIO_LPHD1_PhyHealth_t) -#define IEDMODEL_GenericIO_LPHD1_Proxy (&iedModel_GenericIO_LPHD1_Proxy) -#define IEDMODEL_GenericIO_LPHD1_Proxy_stVal (&iedModel_GenericIO_LPHD1_Proxy_stVal) -#define IEDMODEL_GenericIO_LPHD1_Proxy_q (&iedModel_GenericIO_LPHD1_Proxy_q) -#define IEDMODEL_GenericIO_LPHD1_Proxy_t (&iedModel_GenericIO_LPHD1_Proxy_t) -#define IEDMODEL_GenericIO_GGIO1 (&iedModel_GenericIO_GGIO1) -#define IEDMODEL_GenericIO_GGIO1_Mod (&iedModel_GenericIO_GGIO1_Mod) -#define IEDMODEL_GenericIO_GGIO1_Mod_q (&iedModel_GenericIO_GGIO1_Mod_q) -#define IEDMODEL_GenericIO_GGIO1_Mod_t (&iedModel_GenericIO_GGIO1_Mod_t) -#define IEDMODEL_GenericIO_GGIO1_Mod_ctlModel (&iedModel_GenericIO_GGIO1_Mod_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_Beh (&iedModel_GenericIO_GGIO1_Beh) -#define IEDMODEL_GenericIO_GGIO1_Beh_stVal (&iedModel_GenericIO_GGIO1_Beh_stVal) -#define IEDMODEL_GenericIO_GGIO1_Beh_q (&iedModel_GenericIO_GGIO1_Beh_q) -#define IEDMODEL_GenericIO_GGIO1_Beh_t (&iedModel_GenericIO_GGIO1_Beh_t) -#define IEDMODEL_GenericIO_GGIO1_Health (&iedModel_GenericIO_GGIO1_Health) -#define IEDMODEL_GenericIO_GGIO1_Health_stVal (&iedModel_GenericIO_GGIO1_Health_stVal) -#define IEDMODEL_GenericIO_GGIO1_Health_q (&iedModel_GenericIO_GGIO1_Health_q) -#define IEDMODEL_GenericIO_GGIO1_Health_t (&iedModel_GenericIO_GGIO1_Health_t) -#define IEDMODEL_GenericIO_GGIO1_NamPlt (&iedModel_GenericIO_GGIO1_NamPlt) -#define IEDMODEL_GenericIO_GGIO1_NamPlt_vendor (&iedModel_GenericIO_GGIO1_NamPlt_vendor) -#define IEDMODEL_GenericIO_GGIO1_NamPlt_swRev (&iedModel_GenericIO_GGIO1_NamPlt_swRev) -#define IEDMODEL_GenericIO_GGIO1_NamPlt_d (&iedModel_GenericIO_GGIO1_NamPlt_d) -#define IEDMODEL_GenericIO_GGIO1_AnIn1 (&iedModel_GenericIO_GGIO1_AnIn1) -#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag (&iedModel_GenericIO_GGIO1_AnIn1_mag) -#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f (&iedModel_GenericIO_GGIO1_AnIn1_mag_f) -#define IEDMODEL_GenericIO_GGIO1_AnIn1_q (&iedModel_GenericIO_GGIO1_AnIn1_q) -#define IEDMODEL_GenericIO_GGIO1_AnIn1_t (&iedModel_GenericIO_GGIO1_AnIn1_t) -#define IEDMODEL_GenericIO_GGIO1_AnIn2 (&iedModel_GenericIO_GGIO1_AnIn2) -#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag (&iedModel_GenericIO_GGIO1_AnIn2_mag) -#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f (&iedModel_GenericIO_GGIO1_AnIn2_mag_f) -#define IEDMODEL_GenericIO_GGIO1_AnIn2_q (&iedModel_GenericIO_GGIO1_AnIn2_q) -#define IEDMODEL_GenericIO_GGIO1_AnIn2_t (&iedModel_GenericIO_GGIO1_AnIn2_t) -#define IEDMODEL_GenericIO_GGIO1_AnIn3 (&iedModel_GenericIO_GGIO1_AnIn3) -#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag (&iedModel_GenericIO_GGIO1_AnIn3_mag) -#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f (&iedModel_GenericIO_GGIO1_AnIn3_mag_f) -#define IEDMODEL_GenericIO_GGIO1_AnIn3_q (&iedModel_GenericIO_GGIO1_AnIn3_q) -#define IEDMODEL_GenericIO_GGIO1_AnIn3_t (&iedModel_GenericIO_GGIO1_AnIn3_t) -#define IEDMODEL_GenericIO_GGIO1_AnIn4 (&iedModel_GenericIO_GGIO1_AnIn4) -#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag (&iedModel_GenericIO_GGIO1_AnIn4_mag) -#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f (&iedModel_GenericIO_GGIO1_AnIn4_mag_f) -#define IEDMODEL_GenericIO_GGIO1_AnIn4_q (&iedModel_GenericIO_GGIO1_AnIn4_q) -#define IEDMODEL_GenericIO_GGIO1_AnIn4_t (&iedModel_GenericIO_GGIO1_AnIn4_t) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1 (&iedModel_GenericIO_GGIO1_SPCSO1) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal (&iedModel_GenericIO_GGIO1_SPCSO1_stVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_q (&iedModel_GenericIO_GGIO1_SPCSO1_q) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper (&iedModel_GenericIO_GGIO1_SPCSO1_Oper) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_T) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO1_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_SPCSO1_t (&iedModel_GenericIO_GGIO1_SPCSO1_t) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal (&iedModel_GenericIO_GGIO1_SPCSO2_stVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_q (&iedModel_GenericIO_GGIO1_SPCSO2_q) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper (&iedModel_GenericIO_GGIO1_SPCSO2_Oper) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_T) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO2_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_SPCSO2_t (&iedModel_GenericIO_GGIO1_SPCSO2_t) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3 (&iedModel_GenericIO_GGIO1_SPCSO3) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal (&iedModel_GenericIO_GGIO1_SPCSO3_stVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_q (&iedModel_GenericIO_GGIO1_SPCSO3_q) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper (&iedModel_GenericIO_GGIO1_SPCSO3_Oper) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_T) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_SPCSO3_t (&iedModel_GenericIO_GGIO1_SPCSO3_t) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4 (&iedModel_GenericIO_GGIO1_SPCSO4) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal (&iedModel_GenericIO_GGIO1_SPCSO4_stVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_q (&iedModel_GenericIO_GGIO1_SPCSO4_q) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper (&iedModel_GenericIO_GGIO1_SPCSO4_Oper) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_T) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel) -#define IEDMODEL_GenericIO_GGIO1_SPCSO4_t (&iedModel_GenericIO_GGIO1_SPCSO4_t) -#define IEDMODEL_GenericIO_GGIO1_Ind1 (&iedModel_GenericIO_GGIO1_Ind1) -#define IEDMODEL_GenericIO_GGIO1_Ind1_stVal (&iedModel_GenericIO_GGIO1_Ind1_stVal) -#define IEDMODEL_GenericIO_GGIO1_Ind1_q (&iedModel_GenericIO_GGIO1_Ind1_q) -#define IEDMODEL_GenericIO_GGIO1_Ind1_t (&iedModel_GenericIO_GGIO1_Ind1_t) -#define IEDMODEL_GenericIO_GGIO1_Ind2 (&iedModel_GenericIO_GGIO1_Ind2) -#define IEDMODEL_GenericIO_GGIO1_Ind2_stVal (&iedModel_GenericIO_GGIO1_Ind2_stVal) -#define IEDMODEL_GenericIO_GGIO1_Ind2_q (&iedModel_GenericIO_GGIO1_Ind2_q) -#define IEDMODEL_GenericIO_GGIO1_Ind2_t (&iedModel_GenericIO_GGIO1_Ind2_t) -#define IEDMODEL_GenericIO_GGIO1_Ind3 (&iedModel_GenericIO_GGIO1_Ind3) -#define IEDMODEL_GenericIO_GGIO1_Ind3_stVal (&iedModel_GenericIO_GGIO1_Ind3_stVal) -#define IEDMODEL_GenericIO_GGIO1_Ind3_q (&iedModel_GenericIO_GGIO1_Ind3_q) -#define IEDMODEL_GenericIO_GGIO1_Ind3_t (&iedModel_GenericIO_GGIO1_Ind3_t) -#define IEDMODEL_GenericIO_GGIO1_Ind4 (&iedModel_GenericIO_GGIO1_Ind4) -#define IEDMODEL_GenericIO_GGIO1_Ind4_stVal (&iedModel_GenericIO_GGIO1_Ind4_stVal) -#define IEDMODEL_GenericIO_GGIO1_Ind4_q (&iedModel_GenericIO_GGIO1_Ind4_q) -#define IEDMODEL_GenericIO_GGIO1_Ind4_t (&iedModel_GenericIO_GGIO1_Ind4_t) - -#endif /* STATIC_MODEL_H_ */ - diff --git a/examples/server_example5/CMakeLists.txt b/examples/server_example5/CMakeLists.txt deleted file mode 100644 index 8ca7c4c1..00000000 --- a/examples/server_example5/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -include_directories( - . -) - -set(server_example5_SRCS - server_example5.c - static_model.c -) - -IF(WIN32) -set_source_files_properties(${server_example5_SRCS} - PROPERTIES LANGUAGE CXX) -ENDIF(WIN32) - -add_executable(server_example5 - ${server_example5_SRCS} -) - -target_link_libraries(server_example5 - iec61850 -) diff --git a/examples/server_example5/Makefile b/examples/server_example5/Makefile deleted file mode 100644 index 4a2c4199..00000000 --- a/examples/server_example5/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -LIBIEC_HOME=../.. - -PROJECT_BINARY_NAME = server_example5 -PROJECT_SOURCES = server_example5.c -PROJECT_SOURCES += static_model.c - -PROJECT_ICD_FILE = complexModel.icd - -include $(LIBIEC_HOME)/make/target_system.mk -include $(LIBIEC_HOME)/make/stack_includes.mk - -all: $(PROJECT_BINARY_NAME) - -include $(LIBIEC_HOME)/make/common_targets.mk - -model: $(PROJECT_ICD_FILE) - java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) - -$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) - $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) - -clean: - rm -f $(PROJECT_BINARY_NAME) - - diff --git a/examples/server_example5/complexModel.icd b/examples/server_example5/complexModel.icd deleted file mode 100644 index 9d5ccea7..00000000 --- a/examples/server_example5/complexModel.icd +++ /dev/null @@ -1,347 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - - - - - - - - status-only - - - - - - - status-only - - - - - - - - - status-only - - - - - - - - status-only - - - - - - - status-only - - - - - - - - - status-only - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - status-only - direct-with-normal-security - sbo-with-normal-security - direct-with-enhanced-security - sbo-with-enhanced-security - - - - - rad - sr - m - Gy - q - °C - Sv - F - C - S - H - V - kg - ohm - J - N - Hz - Ix - Lm - Wb - T - W - Pa - s - m² - m³ - m/s - m/s² - m³/s - m/m³ - M - kg/m³ - m²/s - A - W/m K - J/K - ppm - 1/s - rad/s - K - VA - Watts - VAr - theta - cos(theta) - Vs - V² - As - A² - mol - A²t - VAh - Wh - VArh - V/Hz - cd - deg - - - Yocto - Zepto - Atto - Femto - Pico - Nano - Micro - Milli - Centi - Deci - zeroNoValue - Deca - Hecto - Kilo - Mega - Giga - Tera - Petra - Exa - Zetta - Yotta - - - normal - high - low - high-high - low-low - - - diff --git a/examples/server_example5/server_example5.c b/examples/server_example5/server_example5.c deleted file mode 100644 index 1d6d90ee..00000000 --- a/examples/server_example5/server_example5.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * server_example5.c - */ - -#include "iec61850_server.h" -#include "hal_thread.h" -#include -#include -#include - -#include "static_model.h" - -/* import IEC 61850 device model created from SCL-File */ -extern IedModel iedModel; - -static int running = 0; -static IedServer iedServer = NULL; - -void sigint_handler(int signalId) -{ - running = 0; -} - -static MmsDataAccessError -writeAccessHandler (DataAttribute* dataAttribute, MmsValue* value, ClientConnection connection, void* parameter) -{ - if (dataAttribute == IEDMODEL_Inverter_ZINV1_OutVarSet_setMag_f) { - - float newValue = MmsValue_toFloat(value); - - printf("New value for OutVarSet_setMag_f = %f\n", newValue); - - /* Check if value is inside of valid range */ - if ((newValue >= 0.f) && (newValue <= 1000.1f)) - return DATA_ACCESS_ERROR_SUCCESS; - else - return DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; - - } - - return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; -} - -int main(int argc, char** argv) { - - iedServer = IedServer_create(&iedModel); - - /* MMS server will be instructed to start listening to client connections. */ - IedServer_start(iedServer, 102); - - /* Don't allow access to SP variables by default */ - IedServer_setWriteAccessPolicy(iedServer, IEC61850_FC_SP, ACCESS_POLICY_DENY); - - /* Instruct the server that we will be informed if a clients writes to a - * certain variables we are interested in. - */ - IedServer_handleWriteAccess(iedServer, IEDMODEL_Inverter_ZINV1_OutVarSet_setMag_f, writeAccessHandler, NULL); - - if (!IedServer_isRunning(iedServer)) { - printf("Starting server failed! Exit.\n"); - IedServer_destroy(iedServer); - exit(-1); - } - - running = 1; - - signal(SIGINT, sigint_handler); - - while (running) { - Thread_sleep(1); - } - - /* stop MMS server - close TCP server socket and all client sockets */ - IedServer_stop(iedServer); - - /* Cleanup - free all resources */ - IedServer_destroy(iedServer); -} /* main() */ diff --git a/examples/server_example5/static_model.c b/examples/server_example5/static_model.c deleted file mode 100644 index 91d0dcb0..00000000 --- a/examples/server_example5/static_model.c +++ /dev/null @@ -1,3621 +0,0 @@ -/* - * static_model.c - * - * automatically generated from complexModel.icd - */ -#include "static_model.h" - -static void initializeValues(); - -extern DataSet iedModelds_Inverter_LLN0_dataset1; - - -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0; -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1; -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2; -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3; -extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0 = { - "Inverter", - false, - "LLN0$ST$Mod$q", - -1, - NULL, - NULL, - &iedModelds_Inverter_LLN0_dataset1_fcda1 -}; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1 = { - "Battery", - false, - "LLN0$ST$Mod$q", - -1, - NULL, - NULL, - &iedModelds_Inverter_LLN0_dataset1_fcda2 -}; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2 = { - "Inverter", - false, - "MMXU1$ST$Mod$q", - -1, - NULL, - NULL, - &iedModelds_Inverter_LLN0_dataset1_fcda3 -}; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3 = { - "Inverter", - false, - "MMXU1$CF$Mod$ctlModel", - -1, - NULL, - NULL, - &iedModelds_Inverter_LLN0_dataset1_fcda4 -}; - -DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4 = { - "Inverter", - false, - "MMXU1$MX$TotW$mag", - -1, - NULL, - NULL, - NULL -}; - -DataSet iedModelds_Inverter_LLN0_dataset1 = { - "Inverter", - "LLN0$dataset1", - 5, - &iedModelds_Inverter_LLN0_dataset1_fcda0, - NULL -}; - -LogicalDevice iedModel_Inverter = { - LogicalDeviceModelType, - "Inverter", - (ModelNode*) &iedModel, - (ModelNode*) &iedModel_Battery, - (ModelNode*) &iedModel_Inverter_LLN0 -}; - -LogicalNode iedModel_Inverter_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_Inverter, - (ModelNode*) &iedModel_Inverter_LPHD1, - (ModelNode*) &iedModel_Inverter_LLN0_Mod, -}; - -DataObject iedModel_Inverter_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Inverter_LLN0, - (ModelNode*) &iedModel_Inverter_LLN0_Beh, - (ModelNode*) &iedModel_Inverter_LLN0_Mod_q, - 0 -}; - -DataAttribute iedModel_Inverter_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LLN0_Mod, - (ModelNode*) &iedModel_Inverter_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LLN0_Mod, - (ModelNode*) &iedModel_Inverter_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Inverter_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Inverter_LLN0, - (ModelNode*) &iedModel_Inverter_LLN0_Health, - (ModelNode*) &iedModel_Inverter_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_LLN0_Beh, - (ModelNode*) &iedModel_Inverter_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LLN0_Beh, - (ModelNode*) &iedModel_Inverter_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Inverter_LLN0, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_LLN0_Health, - (ModelNode*) &iedModel_Inverter_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LLN0_Health, - (ModelNode*) &iedModel_Inverter_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Inverter_LLN0, - NULL, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_Inverter_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_Inverter, - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam, -}; - -DataObject iedModel_Inverter_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_Inverter_LPHD1, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_Inverter_LPHD1, - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_Inverter_LPHD1, - NULL, - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_Inverter_ZINV1 = { - LogicalNodeModelType, - "ZINV1", - (ModelNode*) &iedModel_Inverter, - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_ZINV1_Mod, -}; - -DataObject iedModel_Inverter_ZINV1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_Beh, - (ModelNode*) &iedModel_Inverter_ZINV1_Mod_q, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_ZINV1_Mod, - (ModelNode*) &iedModel_Inverter_ZINV1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_ZINV1_Mod, - (ModelNode*) &iedModel_Inverter_ZINV1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Inverter_ZINV1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_Health, - (ModelNode*) &iedModel_Inverter_ZINV1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_ZINV1_Beh, - (ModelNode*) &iedModel_Inverter_ZINV1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_ZINV1_Beh, - (ModelNode*) &iedModel_Inverter_ZINV1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_ZINV1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, - (ModelNode*) &iedModel_Inverter_ZINV1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_ZINV1_Health, - (ModelNode*) &iedModel_Inverter_ZINV1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_ZINV1_Health, - (ModelNode*) &iedModel_Inverter_ZINV1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_ZINV1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_WRtg = { - DataObjectModelType, - "WRtg", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag = { - DataAttributeModelType, - "setMag", - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag_f, - 0, - IEC61850_FC_SP, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_WRtg_units = { - DataAttributeModelType, - "units", - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units_SIUnit, - 0, - IEC61850_FC_CF, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit = { - DataAttributeModelType, - "SIUnit", - (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_VarRtg = { - DataObjectModelType, - "VarRtg", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag = { - DataAttributeModelType, - "setMag", - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag_f, - 0, - IEC61850_FC_SP, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_VarRtg_units = { - DataAttributeModelType, - "units", - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units_SIUnit, - 0, - IEC61850_FC_CF, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit = { - DataAttributeModelType, - "SIUnit", - (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_ACTyp = { - DataObjectModelType, - "ACTyp", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, - (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp_setVal, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal = { - DataAttributeModelType, - "setVal", - (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_INT32, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_OutWSet = { - DataObjectModelType, - "OutWSet", - (ModelNode*) &iedModel_Inverter_ZINV1, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag = { - DataAttributeModelType, - "setMag", - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag_f, - 0, - IEC61850_FC_SP, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutWSet_units = { - DataAttributeModelType, - "units", - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units_SIUnit, - 0, - IEC61850_FC_CF, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit = { - DataAttributeModelType, - "SIUnit", - (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_ZINV1_OutVarSet = { - DataObjectModelType, - "OutVarSet", - (ModelNode*) &iedModel_Inverter_ZINV1, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag, - 0 -}; - -DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag = { - DataAttributeModelType, - "setMag", - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag_f, - 0, - IEC61850_FC_SP, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag, - NULL, - NULL, - 0, - IEC61850_FC_SP, - IEC61850_FLOAT32, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units = { - DataAttributeModelType, - "units", - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, - NULL, - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit, - 0, - IEC61850_FC_CF, - IEC61850_CONSTRUCTED, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit = { - DataAttributeModelType, - "SIUnit", - (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -LogicalNode iedModel_Inverter_MMXU1 = { - LogicalNodeModelType, - "MMXU1", - (ModelNode*) &iedModel_Inverter, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_Mod, -}; - -DataObject iedModel_Inverter_MMXU1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_Beh, - (ModelNode*) &iedModel_Inverter_MMXU1_Mod_q, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_Mod, - (ModelNode*) &iedModel_Inverter_MMXU1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_Mod, - (ModelNode*) &iedModel_Inverter_MMXU1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Inverter_MMXU1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_Health, - (ModelNode*) &iedModel_Inverter_MMXU1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_MMXU1_Beh, - (ModelNode*) &iedModel_Inverter_MMXU1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_Beh, - (ModelNode*) &iedModel_Inverter_MMXU1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, - (ModelNode*) &iedModel_Inverter_MMXU1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Inverter_MMXU1_Health, - (ModelNode*) &iedModel_Inverter_MMXU1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_Health, - (ModelNode*) &iedModel_Inverter_MMXU1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW, - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_TotW = { - DataObjectModelType, - "TotW", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_TotW_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_TotW, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_q, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotW_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_TotW, - (ModelNode*) &iedModel_Inverter_MMXU1_TotW_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotW_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_TotW, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_TotVAr = { - DataObjectModelType, - "TotVAr", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_q, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVAr_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVAr_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_TotVA = { - DataObjectModelType, - "TotVA", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_TotVA_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_q, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_TotVA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_Hz = { - DataObjectModelType, - "Hz", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_Hz_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_Hz, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_q, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Hz_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_Hz, - (ModelNode*) &iedModel_Inverter_MMXU1_Hz_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_Hz_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_Hz, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_PhV = { - DataObjectModelType, - "PhV", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_A, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, - 0 -}; - -DataObject iedModel_Inverter_MMXU1_PhV_phsA = { - DataObjectModelType, - "phsA", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_q, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_PhV_phsB = { - DataObjectModelType, - "phsB", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_q, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_PhV_phsC = { - DataObjectModelType, - "phsC", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_q, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_PhV_neut = { - DataObjectModelType, - "neut", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_q, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_A = { - DataObjectModelType, - "A", - (ModelNode*) &iedModel_Inverter_MMXU1, - (ModelNode*) &iedModel_Inverter_MMXU1_W, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, - 0 -}; - -DataObject iedModel_Inverter_MMXU1_A_phsA = { - DataObjectModelType, - "phsA", - (ModelNode*) &iedModel_Inverter_MMXU1_A, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_q, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_A_phsB = { - DataObjectModelType, - "phsB", - (ModelNode*) &iedModel_Inverter_MMXU1_A, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_q, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsB_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_A_phsC = { - DataObjectModelType, - "phsC", - (ModelNode*) &iedModel_Inverter_MMXU1_A, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_q, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_phsC_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_A_neut = { - DataObjectModelType, - "neut", - (ModelNode*) &iedModel_Inverter_MMXU1_A, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_q, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_A_neut_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_W = { - DataObjectModelType, - "W", - (ModelNode*) &iedModel_Inverter_MMXU1, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, - 0 -}; - -DataObject iedModel_Inverter_MMXU1_W_phsA = { - DataObjectModelType, - "phsA", - (ModelNode*) &iedModel_Inverter_MMXU1_W, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_q, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_W_phsB = { - DataObjectModelType, - "phsB", - (ModelNode*) &iedModel_Inverter_MMXU1_W, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_q, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsB_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Inverter_MMXU1_W_phsC = { - DataObjectModelType, - "phsC", - (ModelNode*) &iedModel_Inverter_MMXU1_W, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal, - 0 -}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal = { - DataAttributeModelType, - "cVal", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_q, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal, - NULL, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Inverter_MMXU1_W_phsC_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - - -LogicalDevice iedModel_Battery = { - LogicalDeviceModelType, - "Battery", - (ModelNode*) &iedModel, - (ModelNode*) &iedModel_Physical_Measurements, - (ModelNode*) &iedModel_Battery_LLN0 -}; - -LogicalNode iedModel_Battery_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_Battery, - (ModelNode*) &iedModel_Battery_LPHD1, - (ModelNode*) &iedModel_Battery_LLN0_Mod, -}; - -DataObject iedModel_Battery_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Battery_LLN0, - (ModelNode*) &iedModel_Battery_LLN0_Beh, - (ModelNode*) &iedModel_Battery_LLN0_Mod_q, - 0 -}; - -DataAttribute iedModel_Battery_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LLN0_Mod, - (ModelNode*) &iedModel_Battery_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LLN0_Mod, - (ModelNode*) &iedModel_Battery_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Battery_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Battery_LLN0, - (ModelNode*) &iedModel_Battery_LLN0_Health, - (ModelNode*) &iedModel_Battery_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Battery_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_LLN0_Beh, - (ModelNode*) &iedModel_Battery_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LLN0_Beh, - (ModelNode*) &iedModel_Battery_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Battery_LLN0, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_Battery_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_LLN0_Health, - (ModelNode*) &iedModel_Battery_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LLN0_Health, - (ModelNode*) &iedModel_Battery_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Battery_LLN0, - NULL, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - (ModelNode*) &iedModel_Battery_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_Battery_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_Battery_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_Battery, - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_LPHD1_PhyNam, -}; - -DataObject iedModel_Battery_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_Battery_LPHD1, - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Battery_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Battery_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_Battery_LPHD1, - (ModelNode*) &iedModel_Battery_LPHD1_Proxy, - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_Battery_LPHD1, - NULL, - (ModelNode*) &iedModel_Battery_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_Battery_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_LPHD1_Proxy, - (ModelNode*) &iedModel_Battery_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_LPHD1_Proxy, - (ModelNode*) &iedModel_Battery_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_Battery_ZBAT1 = { - LogicalNodeModelType, - "ZBAT1", - (ModelNode*) &iedModel_Battery, - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBAT1_Mod, -}; - -DataObject iedModel_Battery_ZBAT1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_Beh, - (ModelNode*) &iedModel_Battery_ZBAT1_Mod_q, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Mod, - (ModelNode*) &iedModel_Battery_ZBAT1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Mod, - (ModelNode*) &iedModel_Battery_ZBAT1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Battery_ZBAT1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_Health, - (ModelNode*) &iedModel_Battery_ZBAT1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_ZBAT1_Beh, - (ModelNode*) &iedModel_Battery_ZBAT1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Beh, - (ModelNode*) &iedModel_Battery_ZBAT1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBAT1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_ZBAT1_Health, - (ModelNode*) &iedModel_Battery_ZBAT1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Health, - (ModelNode*) &iedModel_Battery_ZBAT1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol, - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_Vol = { - DataObjectModelType, - "Vol", - (ModelNode*) &iedModel_Battery_ZBAT1, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Vol_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Battery_ZBAT1_Vol, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_q, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Vol_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Vol, - (ModelNode*) &iedModel_Battery_ZBAT1_Vol_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Vol_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Vol, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBAT1_Amp = { - DataObjectModelType, - "Amp", - (ModelNode*) &iedModel_Battery_ZBAT1, - NULL, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag, - 0 -}; - -DataAttribute iedModel_Battery_ZBAT1_Amp_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Battery_ZBAT1_Amp, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_q, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Amp_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBAT1_Amp, - (ModelNode*) &iedModel_Battery_ZBAT1_Amp_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBAT1_Amp_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBAT1_Amp, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -LogicalNode iedModel_Battery_ZBTC1 = { - LogicalNodeModelType, - "ZBTC1", - (ModelNode*) &iedModel_Battery, - NULL, - (ModelNode*) &iedModel_Battery_ZBTC1_Mod, -}; - -DataObject iedModel_Battery_ZBTC1_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_Beh, - (ModelNode*) &iedModel_Battery_ZBTC1_Mod_q, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_Mod, - (ModelNode*) &iedModel_Battery_ZBTC1_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_Mod, - (ModelNode*) &iedModel_Battery_ZBTC1_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Battery_ZBTC1_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_Health, - (ModelNode*) &iedModel_Battery_ZBTC1_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_ZBTC1_Beh, - (ModelNode*) &iedModel_Battery_ZBTC1_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_Beh, - (ModelNode*) &iedModel_Battery_ZBTC1_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBTC1_Health_stVal, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Battery_ZBTC1_Health, - (ModelNode*) &iedModel_Battery_ZBTC1_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_Health, - (ModelNode*) &iedModel_Battery_ZBTC1_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_BatChaSt, - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_BatChaSt = { - DataObjectModelType, - "BatChaSt", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_BatChaPwr, - NULL, - 0 -}; - -DataObject iedModel_Battery_ZBTC1_BatChaPwr = { - DataObjectModelType, - "BatChaPwr", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_BatChaMod, - NULL, - 0 -}; - -DataObject iedModel_Battery_ZBTC1_BatChaMod = { - DataObjectModelType, - "BatChaMod", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, - NULL, - 0 -}; - -DataObject iedModel_Battery_ZBTC1_ChaV = { - DataObjectModelType, - "ChaV", - (ModelNode*) &iedModel_Battery_ZBTC1, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_ChaV_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_q, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaV_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaV_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Battery_ZBTC1_ChaA = { - DataObjectModelType, - "ChaA", - (ModelNode*) &iedModel_Battery_ZBTC1, - NULL, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag, - 0 -}; - -DataAttribute iedModel_Battery_ZBTC1_ChaA_mag = { - DataAttributeModelType, - "mag", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_q, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag_f, - 0, - IEC61850_FC_MX, - IEC61850_CONSTRUCTED, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f = { - DataAttributeModelType, - "f", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_FLOAT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaA_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_t, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Battery_ZBTC1_ChaA_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, - NULL, - NULL, - 0, - IEC61850_FC_MX, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - - -LogicalDevice iedModel_Physical_Measurements = { - LogicalDeviceModelType, - "Physical_Measurements", - (ModelNode*) &iedModel, - NULL, - (ModelNode*) &iedModel_Physical_Measurements_LLN0 -}; - -LogicalNode iedModel_Physical_Measurements_LLN0 = { - LogicalNodeModelType, - "LLN0", - (ModelNode*) &iedModel_Physical_Measurements, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, -}; - -DataObject iedModel_Physical_Measurements_LLN0_Mod = { - DataObjectModelType, - "Mod", - (ModelNode*) &iedModel_Physical_Measurements_LLN0, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_q, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_ctlModel, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel = { - DataAttributeModelType, - "ctlModel", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, - NULL, - NULL, - 0, - IEC61850_FC_CF, - IEC61850_ENUMERATED, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LLN0_Beh = { - DataObjectModelType, - "Beh", - (ModelNode*) &iedModel_Physical_Measurements_LLN0, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_stVal, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LLN0_Health = { - DataObjectModelType, - "Health", - (ModelNode*) &iedModel_Physical_Measurements_LLN0, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_stVal, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Health_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_Health_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LLN0_NamPlt = { - DataObjectModelType, - "NamPlt", - (ModelNode*) &iedModel_Physical_Measurements_LLN0, - NULL, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_vendor, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_swRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev = { - DataAttributeModelType, - "swRev", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_d, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d = { - DataAttributeModelType, - "d", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_configRev, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev = { - DataAttributeModelType, - "configRev", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_ldNs, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs = { - DataAttributeModelType, - "ldNs", - (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, - NULL, - NULL, - 0, - IEC61850_FC_EX, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -LogicalNode iedModel_Physical_Measurements_LPHD1 = { - LogicalNodeModelType, - "LPHD1", - (ModelNode*) &iedModel_Physical_Measurements, - NULL, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam, -}; - -DataObject iedModel_Physical_Measurements_LPHD1_PhyNam = { - DataObjectModelType, - "PhyNam", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam_vendor, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor = { - DataAttributeModelType, - "vendor", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam, - NULL, - NULL, - 0, - IEC61850_FC_DC, - IEC61850_VISIBLE_STRING_255, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth = { - DataObjectModelType, - "PhyHealth", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_INT32, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -DataObject iedModel_Physical_Measurements_LPHD1_Proxy = { - DataObjectModelType, - "Proxy", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1, - NULL, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_stVal, - 0 -}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal = { - DataAttributeModelType, - "stVal", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_q, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_BOOLEAN, - 0 + TRG_OPT_DATA_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q = { - DataAttributeModelType, - "q", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_t, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_QUALITY, - 0 + TRG_OPT_QUALITY_CHANGED, - NULL, - 0}; - -DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t = { - DataAttributeModelType, - "t", - (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, - NULL, - NULL, - 0, - IEC61850_FC_ST, - IEC61850_TIMESTAMP, - 0, - NULL, - 0}; - -extern ReportControlBlock iedModel_Inverter_LLN0_report0; - -ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 19, 32, 0, 0, NULL}; - - - - - - - -IedModel iedModel = { - "ied1", - &iedModel_Inverter, - &iedModelds_Inverter_LLN0_dataset1, - &iedModel_Inverter_LLN0_report0, - NULL, - NULL, - NULL, - NULL, - NULL, - initializeValues -}; - -static void -initializeValues() -{ - -iedModel_Inverter_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Inverter_ZINV1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Inverter_MMXU1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Battery_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Battery_ZBAT1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Battery_ZBTC1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); - -iedModel_Physical_Measurements_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); -} diff --git a/examples/server_example5/static_model.h b/examples/server_example5/static_model.h deleted file mode 100644 index 34623f80..00000000 --- a/examples/server_example5/static_model.h +++ /dev/null @@ -1,609 +0,0 @@ -/* - * static_model.h - * - * automatically generated from complexModel.icd - */ - -#ifndef STATIC_MODEL_H_ -#define STATIC_MODEL_H_ - -#include -#include "iec61850_model.h" - -extern IedModel iedModel; -extern LogicalDevice iedModel_Inverter; -extern LogicalNode iedModel_Inverter_LLN0; -extern DataObject iedModel_Inverter_LLN0_Mod; -extern DataAttribute iedModel_Inverter_LLN0_Mod_q; -extern DataAttribute iedModel_Inverter_LLN0_Mod_t; -extern DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel; -extern DataObject iedModel_Inverter_LLN0_Beh; -extern DataAttribute iedModel_Inverter_LLN0_Beh_stVal; -extern DataAttribute iedModel_Inverter_LLN0_Beh_q; -extern DataAttribute iedModel_Inverter_LLN0_Beh_t; -extern DataObject iedModel_Inverter_LLN0_Health; -extern DataAttribute iedModel_Inverter_LLN0_Health_stVal; -extern DataAttribute iedModel_Inverter_LLN0_Health_q; -extern DataAttribute iedModel_Inverter_LLN0_Health_t; -extern DataObject iedModel_Inverter_LLN0_NamPlt; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_d; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Inverter_LPHD1; -extern DataObject iedModel_Inverter_LPHD1_PhyNam; -extern DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Inverter_LPHD1_PhyHealth; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t; -extern DataObject iedModel_Inverter_LPHD1_Proxy; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_q; -extern DataAttribute iedModel_Inverter_LPHD1_Proxy_t; -extern LogicalNode iedModel_Inverter_ZINV1; -extern DataObject iedModel_Inverter_ZINV1_Mod; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_q; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_t; -extern DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel; -extern DataObject iedModel_Inverter_ZINV1_Beh; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_stVal; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_q; -extern DataAttribute iedModel_Inverter_ZINV1_Beh_t; -extern DataObject iedModel_Inverter_ZINV1_Health; -extern DataAttribute iedModel_Inverter_ZINV1_Health_stVal; -extern DataAttribute iedModel_Inverter_ZINV1_Health_q; -extern DataAttribute iedModel_Inverter_ZINV1_Health_t; -extern DataObject iedModel_Inverter_ZINV1_NamPlt; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_d; -extern DataObject iedModel_Inverter_ZINV1_WRtg; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units; -extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_VarRtg; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units; -extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_ACTyp; -extern DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal; -extern DataObject iedModel_Inverter_ZINV1_OutWSet; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units; -extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit; -extern DataObject iedModel_Inverter_ZINV1_OutVarSet; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units; -extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit; -extern LogicalNode iedModel_Inverter_MMXU1; -extern DataObject iedModel_Inverter_MMXU1_Mod; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_q; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_t; -extern DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel; -extern DataObject iedModel_Inverter_MMXU1_Beh; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_stVal; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_q; -extern DataAttribute iedModel_Inverter_MMXU1_Beh_t; -extern DataObject iedModel_Inverter_MMXU1_Health; -extern DataAttribute iedModel_Inverter_MMXU1_Health_stVal; -extern DataAttribute iedModel_Inverter_MMXU1_Health_q; -extern DataAttribute iedModel_Inverter_MMXU1_Health_t; -extern DataObject iedModel_Inverter_MMXU1_NamPlt; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev; -extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_d; -extern DataObject iedModel_Inverter_MMXU1_TotW; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotW_t; -extern DataObject iedModel_Inverter_MMXU1_TotVAr; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_t; -extern DataObject iedModel_Inverter_MMXU1_TotVA; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_q; -extern DataAttribute iedModel_Inverter_MMXU1_TotVA_t; -extern DataObject iedModel_Inverter_MMXU1_Hz; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_q; -extern DataAttribute iedModel_Inverter_MMXU1_Hz_t; -extern DataObject iedModel_Inverter_MMXU1_PhV; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t; -extern DataObject iedModel_Inverter_MMXU1_PhV_neut; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q; -extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t; -extern DataObject iedModel_Inverter_MMXU1_A; -extern DataObject iedModel_Inverter_MMXU1_A_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_A_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_A_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_t; -extern DataObject iedModel_Inverter_MMXU1_A_neut; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_q; -extern DataAttribute iedModel_Inverter_MMXU1_A_neut_t; -extern DataObject iedModel_Inverter_MMXU1_W; -extern DataObject iedModel_Inverter_MMXU1_W_phsA; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_t; -extern DataObject iedModel_Inverter_MMXU1_W_phsB; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_t; -extern DataObject iedModel_Inverter_MMXU1_W_phsC; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_q; -extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_t; -extern LogicalDevice iedModel_Battery; -extern LogicalNode iedModel_Battery_LLN0; -extern DataObject iedModel_Battery_LLN0_Mod; -extern DataAttribute iedModel_Battery_LLN0_Mod_q; -extern DataAttribute iedModel_Battery_LLN0_Mod_t; -extern DataAttribute iedModel_Battery_LLN0_Mod_ctlModel; -extern DataObject iedModel_Battery_LLN0_Beh; -extern DataAttribute iedModel_Battery_LLN0_Beh_stVal; -extern DataAttribute iedModel_Battery_LLN0_Beh_q; -extern DataAttribute iedModel_Battery_LLN0_Beh_t; -extern DataObject iedModel_Battery_LLN0_Health; -extern DataAttribute iedModel_Battery_LLN0_Health_stVal; -extern DataAttribute iedModel_Battery_LLN0_Health_q; -extern DataAttribute iedModel_Battery_LLN0_Health_t; -extern DataObject iedModel_Battery_LLN0_NamPlt; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_d; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Battery_LPHD1; -extern DataObject iedModel_Battery_LPHD1_PhyNam; -extern DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Battery_LPHD1_PhyHealth; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_t; -extern DataObject iedModel_Battery_LPHD1_Proxy; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_q; -extern DataAttribute iedModel_Battery_LPHD1_Proxy_t; -extern LogicalNode iedModel_Battery_ZBAT1; -extern DataObject iedModel_Battery_ZBAT1_Mod; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_q; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_t; -extern DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel; -extern DataObject iedModel_Battery_ZBAT1_Beh; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_stVal; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_q; -extern DataAttribute iedModel_Battery_ZBAT1_Beh_t; -extern DataObject iedModel_Battery_ZBAT1_Health; -extern DataAttribute iedModel_Battery_ZBAT1_Health_stVal; -extern DataAttribute iedModel_Battery_ZBAT1_Health_q; -extern DataAttribute iedModel_Battery_ZBAT1_Health_t; -extern DataObject iedModel_Battery_ZBAT1_NamPlt; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev; -extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_d; -extern DataObject iedModel_Battery_ZBAT1_Vol; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_q; -extern DataAttribute iedModel_Battery_ZBAT1_Vol_t; -extern DataObject iedModel_Battery_ZBAT1_Amp; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_q; -extern DataAttribute iedModel_Battery_ZBAT1_Amp_t; -extern LogicalNode iedModel_Battery_ZBTC1; -extern DataObject iedModel_Battery_ZBTC1_Mod; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_q; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_t; -extern DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel; -extern DataObject iedModel_Battery_ZBTC1_Beh; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_stVal; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_q; -extern DataAttribute iedModel_Battery_ZBTC1_Beh_t; -extern DataObject iedModel_Battery_ZBTC1_Health; -extern DataAttribute iedModel_Battery_ZBTC1_Health_stVal; -extern DataAttribute iedModel_Battery_ZBTC1_Health_q; -extern DataAttribute iedModel_Battery_ZBTC1_Health_t; -extern DataObject iedModel_Battery_ZBTC1_NamPlt; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev; -extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_d; -extern DataObject iedModel_Battery_ZBTC1_BatChaSt; -extern DataObject iedModel_Battery_ZBTC1_BatChaPwr; -extern DataObject iedModel_Battery_ZBTC1_BatChaMod; -extern DataObject iedModel_Battery_ZBTC1_ChaV; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_q; -extern DataAttribute iedModel_Battery_ZBTC1_ChaV_t; -extern DataObject iedModel_Battery_ZBTC1_ChaA; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_q; -extern DataAttribute iedModel_Battery_ZBTC1_ChaA_t; -extern LogicalDevice iedModel_Physical_Measurements; -extern LogicalNode iedModel_Physical_Measurements_LLN0; -extern DataObject iedModel_Physical_Measurements_LLN0_Mod; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel; -extern DataObject iedModel_Physical_Measurements_LLN0_Beh; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t; -extern DataObject iedModel_Physical_Measurements_LLN0_Health; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_q; -extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_t; -extern DataObject iedModel_Physical_Measurements_LLN0_NamPlt; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev; -extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs; -extern LogicalNode iedModel_Physical_Measurements_LPHD1; -extern DataObject iedModel_Physical_Measurements_LPHD1_PhyNam; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor; -extern DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t; -extern DataObject iedModel_Physical_Measurements_LPHD1_Proxy; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q; -extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t; - - - -#define IEDMODEL_Inverter (&iedModel_Inverter) -#define IEDMODEL_Inverter_LLN0 (&iedModel_Inverter_LLN0) -#define IEDMODEL_Inverter_LLN0_Mod (&iedModel_Inverter_LLN0_Mod) -#define IEDMODEL_Inverter_LLN0_Mod_q (&iedModel_Inverter_LLN0_Mod_q) -#define IEDMODEL_Inverter_LLN0_Mod_t (&iedModel_Inverter_LLN0_Mod_t) -#define IEDMODEL_Inverter_LLN0_Mod_ctlModel (&iedModel_Inverter_LLN0_Mod_ctlModel) -#define IEDMODEL_Inverter_LLN0_Beh (&iedModel_Inverter_LLN0_Beh) -#define IEDMODEL_Inverter_LLN0_Beh_stVal (&iedModel_Inverter_LLN0_Beh_stVal) -#define IEDMODEL_Inverter_LLN0_Beh_q (&iedModel_Inverter_LLN0_Beh_q) -#define IEDMODEL_Inverter_LLN0_Beh_t (&iedModel_Inverter_LLN0_Beh_t) -#define IEDMODEL_Inverter_LLN0_Health (&iedModel_Inverter_LLN0_Health) -#define IEDMODEL_Inverter_LLN0_Health_stVal (&iedModel_Inverter_LLN0_Health_stVal) -#define IEDMODEL_Inverter_LLN0_Health_q (&iedModel_Inverter_LLN0_Health_q) -#define IEDMODEL_Inverter_LLN0_Health_t (&iedModel_Inverter_LLN0_Health_t) -#define IEDMODEL_Inverter_LLN0_NamPlt (&iedModel_Inverter_LLN0_NamPlt) -#define IEDMODEL_Inverter_LLN0_NamPlt_vendor (&iedModel_Inverter_LLN0_NamPlt_vendor) -#define IEDMODEL_Inverter_LLN0_NamPlt_swRev (&iedModel_Inverter_LLN0_NamPlt_swRev) -#define IEDMODEL_Inverter_LLN0_NamPlt_d (&iedModel_Inverter_LLN0_NamPlt_d) -#define IEDMODEL_Inverter_LLN0_NamPlt_configRev (&iedModel_Inverter_LLN0_NamPlt_configRev) -#define IEDMODEL_Inverter_LLN0_NamPlt_ldNs (&iedModel_Inverter_LLN0_NamPlt_ldNs) -#define IEDMODEL_Inverter_LPHD1 (&iedModel_Inverter_LPHD1) -#define IEDMODEL_Inverter_LPHD1_PhyNam (&iedModel_Inverter_LPHD1_PhyNam) -#define IEDMODEL_Inverter_LPHD1_PhyNam_vendor (&iedModel_Inverter_LPHD1_PhyNam_vendor) -#define IEDMODEL_Inverter_LPHD1_PhyHealth (&iedModel_Inverter_LPHD1_PhyHealth) -#define IEDMODEL_Inverter_LPHD1_PhyHealth_stVal (&iedModel_Inverter_LPHD1_PhyHealth_stVal) -#define IEDMODEL_Inverter_LPHD1_PhyHealth_q (&iedModel_Inverter_LPHD1_PhyHealth_q) -#define IEDMODEL_Inverter_LPHD1_PhyHealth_t (&iedModel_Inverter_LPHD1_PhyHealth_t) -#define IEDMODEL_Inverter_LPHD1_Proxy (&iedModel_Inverter_LPHD1_Proxy) -#define IEDMODEL_Inverter_LPHD1_Proxy_stVal (&iedModel_Inverter_LPHD1_Proxy_stVal) -#define IEDMODEL_Inverter_LPHD1_Proxy_q (&iedModel_Inverter_LPHD1_Proxy_q) -#define IEDMODEL_Inverter_LPHD1_Proxy_t (&iedModel_Inverter_LPHD1_Proxy_t) -#define IEDMODEL_Inverter_ZINV1 (&iedModel_Inverter_ZINV1) -#define IEDMODEL_Inverter_ZINV1_Mod (&iedModel_Inverter_ZINV1_Mod) -#define IEDMODEL_Inverter_ZINV1_Mod_q (&iedModel_Inverter_ZINV1_Mod_q) -#define IEDMODEL_Inverter_ZINV1_Mod_t (&iedModel_Inverter_ZINV1_Mod_t) -#define IEDMODEL_Inverter_ZINV1_Mod_ctlModel (&iedModel_Inverter_ZINV1_Mod_ctlModel) -#define IEDMODEL_Inverter_ZINV1_Beh (&iedModel_Inverter_ZINV1_Beh) -#define IEDMODEL_Inverter_ZINV1_Beh_stVal (&iedModel_Inverter_ZINV1_Beh_stVal) -#define IEDMODEL_Inverter_ZINV1_Beh_q (&iedModel_Inverter_ZINV1_Beh_q) -#define IEDMODEL_Inverter_ZINV1_Beh_t (&iedModel_Inverter_ZINV1_Beh_t) -#define IEDMODEL_Inverter_ZINV1_Health (&iedModel_Inverter_ZINV1_Health) -#define IEDMODEL_Inverter_ZINV1_Health_stVal (&iedModel_Inverter_ZINV1_Health_stVal) -#define IEDMODEL_Inverter_ZINV1_Health_q (&iedModel_Inverter_ZINV1_Health_q) -#define IEDMODEL_Inverter_ZINV1_Health_t (&iedModel_Inverter_ZINV1_Health_t) -#define IEDMODEL_Inverter_ZINV1_NamPlt (&iedModel_Inverter_ZINV1_NamPlt) -#define IEDMODEL_Inverter_ZINV1_NamPlt_vendor (&iedModel_Inverter_ZINV1_NamPlt_vendor) -#define IEDMODEL_Inverter_ZINV1_NamPlt_swRev (&iedModel_Inverter_ZINV1_NamPlt_swRev) -#define IEDMODEL_Inverter_ZINV1_NamPlt_d (&iedModel_Inverter_ZINV1_NamPlt_d) -#define IEDMODEL_Inverter_ZINV1_WRtg (&iedModel_Inverter_ZINV1_WRtg) -#define IEDMODEL_Inverter_ZINV1_WRtg_setMag (&iedModel_Inverter_ZINV1_WRtg_setMag) -#define IEDMODEL_Inverter_ZINV1_WRtg_setMag_f (&iedModel_Inverter_ZINV1_WRtg_setMag_f) -#define IEDMODEL_Inverter_ZINV1_WRtg_units (&iedModel_Inverter_ZINV1_WRtg_units) -#define IEDMODEL_Inverter_ZINV1_WRtg_units_SIUnit (&iedModel_Inverter_ZINV1_WRtg_units_SIUnit) -#define IEDMODEL_Inverter_ZINV1_VarRtg (&iedModel_Inverter_ZINV1_VarRtg) -#define IEDMODEL_Inverter_ZINV1_VarRtg_setMag (&iedModel_Inverter_ZINV1_VarRtg_setMag) -#define IEDMODEL_Inverter_ZINV1_VarRtg_setMag_f (&iedModel_Inverter_ZINV1_VarRtg_setMag_f) -#define IEDMODEL_Inverter_ZINV1_VarRtg_units (&iedModel_Inverter_ZINV1_VarRtg_units) -#define IEDMODEL_Inverter_ZINV1_VarRtg_units_SIUnit (&iedModel_Inverter_ZINV1_VarRtg_units_SIUnit) -#define IEDMODEL_Inverter_ZINV1_ACTyp (&iedModel_Inverter_ZINV1_ACTyp) -#define IEDMODEL_Inverter_ZINV1_ACTyp_setVal (&iedModel_Inverter_ZINV1_ACTyp_setVal) -#define IEDMODEL_Inverter_ZINV1_OutWSet (&iedModel_Inverter_ZINV1_OutWSet) -#define IEDMODEL_Inverter_ZINV1_OutWSet_setMag (&iedModel_Inverter_ZINV1_OutWSet_setMag) -#define IEDMODEL_Inverter_ZINV1_OutWSet_setMag_f (&iedModel_Inverter_ZINV1_OutWSet_setMag_f) -#define IEDMODEL_Inverter_ZINV1_OutWSet_units (&iedModel_Inverter_ZINV1_OutWSet_units) -#define IEDMODEL_Inverter_ZINV1_OutWSet_units_SIUnit (&iedModel_Inverter_ZINV1_OutWSet_units_SIUnit) -#define IEDMODEL_Inverter_ZINV1_OutVarSet (&iedModel_Inverter_ZINV1_OutVarSet) -#define IEDMODEL_Inverter_ZINV1_OutVarSet_setMag (&iedModel_Inverter_ZINV1_OutVarSet_setMag) -#define IEDMODEL_Inverter_ZINV1_OutVarSet_setMag_f (&iedModel_Inverter_ZINV1_OutVarSet_setMag_f) -#define IEDMODEL_Inverter_ZINV1_OutVarSet_units (&iedModel_Inverter_ZINV1_OutVarSet_units) -#define IEDMODEL_Inverter_ZINV1_OutVarSet_units_SIUnit (&iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit) -#define IEDMODEL_Inverter_MMXU1 (&iedModel_Inverter_MMXU1) -#define IEDMODEL_Inverter_MMXU1_Mod (&iedModel_Inverter_MMXU1_Mod) -#define IEDMODEL_Inverter_MMXU1_Mod_q (&iedModel_Inverter_MMXU1_Mod_q) -#define IEDMODEL_Inverter_MMXU1_Mod_t (&iedModel_Inverter_MMXU1_Mod_t) -#define IEDMODEL_Inverter_MMXU1_Mod_ctlModel (&iedModel_Inverter_MMXU1_Mod_ctlModel) -#define IEDMODEL_Inverter_MMXU1_Beh (&iedModel_Inverter_MMXU1_Beh) -#define IEDMODEL_Inverter_MMXU1_Beh_stVal (&iedModel_Inverter_MMXU1_Beh_stVal) -#define IEDMODEL_Inverter_MMXU1_Beh_q (&iedModel_Inverter_MMXU1_Beh_q) -#define IEDMODEL_Inverter_MMXU1_Beh_t (&iedModel_Inverter_MMXU1_Beh_t) -#define IEDMODEL_Inverter_MMXU1_Health (&iedModel_Inverter_MMXU1_Health) -#define IEDMODEL_Inverter_MMXU1_Health_stVal (&iedModel_Inverter_MMXU1_Health_stVal) -#define IEDMODEL_Inverter_MMXU1_Health_q (&iedModel_Inverter_MMXU1_Health_q) -#define IEDMODEL_Inverter_MMXU1_Health_t (&iedModel_Inverter_MMXU1_Health_t) -#define IEDMODEL_Inverter_MMXU1_NamPlt (&iedModel_Inverter_MMXU1_NamPlt) -#define IEDMODEL_Inverter_MMXU1_NamPlt_vendor (&iedModel_Inverter_MMXU1_NamPlt_vendor) -#define IEDMODEL_Inverter_MMXU1_NamPlt_swRev (&iedModel_Inverter_MMXU1_NamPlt_swRev) -#define IEDMODEL_Inverter_MMXU1_NamPlt_d (&iedModel_Inverter_MMXU1_NamPlt_d) -#define IEDMODEL_Inverter_MMXU1_TotW (&iedModel_Inverter_MMXU1_TotW) -#define IEDMODEL_Inverter_MMXU1_TotW_mag (&iedModel_Inverter_MMXU1_TotW_mag) -#define IEDMODEL_Inverter_MMXU1_TotW_mag_f (&iedModel_Inverter_MMXU1_TotW_mag_f) -#define IEDMODEL_Inverter_MMXU1_TotW_q (&iedModel_Inverter_MMXU1_TotW_q) -#define IEDMODEL_Inverter_MMXU1_TotW_t (&iedModel_Inverter_MMXU1_TotW_t) -#define IEDMODEL_Inverter_MMXU1_TotVAr (&iedModel_Inverter_MMXU1_TotVAr) -#define IEDMODEL_Inverter_MMXU1_TotVAr_mag (&iedModel_Inverter_MMXU1_TotVAr_mag) -#define IEDMODEL_Inverter_MMXU1_TotVAr_mag_f (&iedModel_Inverter_MMXU1_TotVAr_mag_f) -#define IEDMODEL_Inverter_MMXU1_TotVAr_q (&iedModel_Inverter_MMXU1_TotVAr_q) -#define IEDMODEL_Inverter_MMXU1_TotVAr_t (&iedModel_Inverter_MMXU1_TotVAr_t) -#define IEDMODEL_Inverter_MMXU1_TotVA (&iedModel_Inverter_MMXU1_TotVA) -#define IEDMODEL_Inverter_MMXU1_TotVA_mag (&iedModel_Inverter_MMXU1_TotVA_mag) -#define IEDMODEL_Inverter_MMXU1_TotVA_mag_f (&iedModel_Inverter_MMXU1_TotVA_mag_f) -#define IEDMODEL_Inverter_MMXU1_TotVA_q (&iedModel_Inverter_MMXU1_TotVA_q) -#define IEDMODEL_Inverter_MMXU1_TotVA_t (&iedModel_Inverter_MMXU1_TotVA_t) -#define IEDMODEL_Inverter_MMXU1_Hz (&iedModel_Inverter_MMXU1_Hz) -#define IEDMODEL_Inverter_MMXU1_Hz_mag (&iedModel_Inverter_MMXU1_Hz_mag) -#define IEDMODEL_Inverter_MMXU1_Hz_mag_f (&iedModel_Inverter_MMXU1_Hz_mag_f) -#define IEDMODEL_Inverter_MMXU1_Hz_q (&iedModel_Inverter_MMXU1_Hz_q) -#define IEDMODEL_Inverter_MMXU1_Hz_t (&iedModel_Inverter_MMXU1_Hz_t) -#define IEDMODEL_Inverter_MMXU1_PhV (&iedModel_Inverter_MMXU1_PhV) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA (&iedModel_Inverter_MMXU1_PhV_phsA) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal (&iedModel_Inverter_MMXU1_PhV_phsA_cVal) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_q (&iedModel_Inverter_MMXU1_PhV_phsA_q) -#define IEDMODEL_Inverter_MMXU1_PhV_phsA_t (&iedModel_Inverter_MMXU1_PhV_phsA_t) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB (&iedModel_Inverter_MMXU1_PhV_phsB) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal (&iedModel_Inverter_MMXU1_PhV_phsB_cVal) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_q (&iedModel_Inverter_MMXU1_PhV_phsB_q) -#define IEDMODEL_Inverter_MMXU1_PhV_phsB_t (&iedModel_Inverter_MMXU1_PhV_phsB_t) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC (&iedModel_Inverter_MMXU1_PhV_phsC) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal (&iedModel_Inverter_MMXU1_PhV_phsC_cVal) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_q (&iedModel_Inverter_MMXU1_PhV_phsC_q) -#define IEDMODEL_Inverter_MMXU1_PhV_phsC_t (&iedModel_Inverter_MMXU1_PhV_phsC_t) -#define IEDMODEL_Inverter_MMXU1_PhV_neut (&iedModel_Inverter_MMXU1_PhV_neut) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal (&iedModel_Inverter_MMXU1_PhV_neut_cVal) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal_mag (&iedModel_Inverter_MMXU1_PhV_neut_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_q (&iedModel_Inverter_MMXU1_PhV_neut_q) -#define IEDMODEL_Inverter_MMXU1_PhV_neut_t (&iedModel_Inverter_MMXU1_PhV_neut_t) -#define IEDMODEL_Inverter_MMXU1_A (&iedModel_Inverter_MMXU1_A) -#define IEDMODEL_Inverter_MMXU1_A_phsA (&iedModel_Inverter_MMXU1_A_phsA) -#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal (&iedModel_Inverter_MMXU1_A_phsA_cVal) -#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal_mag (&iedModel_Inverter_MMXU1_A_phsA_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_A_phsA_q (&iedModel_Inverter_MMXU1_A_phsA_q) -#define IEDMODEL_Inverter_MMXU1_A_phsA_t (&iedModel_Inverter_MMXU1_A_phsA_t) -#define IEDMODEL_Inverter_MMXU1_A_phsB (&iedModel_Inverter_MMXU1_A_phsB) -#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal (&iedModel_Inverter_MMXU1_A_phsB_cVal) -#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal_mag (&iedModel_Inverter_MMXU1_A_phsB_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_A_phsB_q (&iedModel_Inverter_MMXU1_A_phsB_q) -#define IEDMODEL_Inverter_MMXU1_A_phsB_t (&iedModel_Inverter_MMXU1_A_phsB_t) -#define IEDMODEL_Inverter_MMXU1_A_phsC (&iedModel_Inverter_MMXU1_A_phsC) -#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal (&iedModel_Inverter_MMXU1_A_phsC_cVal) -#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal_mag (&iedModel_Inverter_MMXU1_A_phsC_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_A_phsC_q (&iedModel_Inverter_MMXU1_A_phsC_q) -#define IEDMODEL_Inverter_MMXU1_A_phsC_t (&iedModel_Inverter_MMXU1_A_phsC_t) -#define IEDMODEL_Inverter_MMXU1_A_neut (&iedModel_Inverter_MMXU1_A_neut) -#define IEDMODEL_Inverter_MMXU1_A_neut_cVal (&iedModel_Inverter_MMXU1_A_neut_cVal) -#define IEDMODEL_Inverter_MMXU1_A_neut_cVal_mag (&iedModel_Inverter_MMXU1_A_neut_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_A_neut_cVal_mag_f (&iedModel_Inverter_MMXU1_A_neut_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_A_neut_q (&iedModel_Inverter_MMXU1_A_neut_q) -#define IEDMODEL_Inverter_MMXU1_A_neut_t (&iedModel_Inverter_MMXU1_A_neut_t) -#define IEDMODEL_Inverter_MMXU1_W (&iedModel_Inverter_MMXU1_W) -#define IEDMODEL_Inverter_MMXU1_W_phsA (&iedModel_Inverter_MMXU1_W_phsA) -#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal (&iedModel_Inverter_MMXU1_W_phsA_cVal) -#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal_mag (&iedModel_Inverter_MMXU1_W_phsA_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_W_phsA_q (&iedModel_Inverter_MMXU1_W_phsA_q) -#define IEDMODEL_Inverter_MMXU1_W_phsA_t (&iedModel_Inverter_MMXU1_W_phsA_t) -#define IEDMODEL_Inverter_MMXU1_W_phsB (&iedModel_Inverter_MMXU1_W_phsB) -#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal (&iedModel_Inverter_MMXU1_W_phsB_cVal) -#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal_mag (&iedModel_Inverter_MMXU1_W_phsB_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_W_phsB_q (&iedModel_Inverter_MMXU1_W_phsB_q) -#define IEDMODEL_Inverter_MMXU1_W_phsB_t (&iedModel_Inverter_MMXU1_W_phsB_t) -#define IEDMODEL_Inverter_MMXU1_W_phsC (&iedModel_Inverter_MMXU1_W_phsC) -#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal (&iedModel_Inverter_MMXU1_W_phsC_cVal) -#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal_mag (&iedModel_Inverter_MMXU1_W_phsC_cVal_mag) -#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f) -#define IEDMODEL_Inverter_MMXU1_W_phsC_q (&iedModel_Inverter_MMXU1_W_phsC_q) -#define IEDMODEL_Inverter_MMXU1_W_phsC_t (&iedModel_Inverter_MMXU1_W_phsC_t) -#define IEDMODEL_Battery (&iedModel_Battery) -#define IEDMODEL_Battery_LLN0 (&iedModel_Battery_LLN0) -#define IEDMODEL_Battery_LLN0_Mod (&iedModel_Battery_LLN0_Mod) -#define IEDMODEL_Battery_LLN0_Mod_q (&iedModel_Battery_LLN0_Mod_q) -#define IEDMODEL_Battery_LLN0_Mod_t (&iedModel_Battery_LLN0_Mod_t) -#define IEDMODEL_Battery_LLN0_Mod_ctlModel (&iedModel_Battery_LLN0_Mod_ctlModel) -#define IEDMODEL_Battery_LLN0_Beh (&iedModel_Battery_LLN0_Beh) -#define IEDMODEL_Battery_LLN0_Beh_stVal (&iedModel_Battery_LLN0_Beh_stVal) -#define IEDMODEL_Battery_LLN0_Beh_q (&iedModel_Battery_LLN0_Beh_q) -#define IEDMODEL_Battery_LLN0_Beh_t (&iedModel_Battery_LLN0_Beh_t) -#define IEDMODEL_Battery_LLN0_Health (&iedModel_Battery_LLN0_Health) -#define IEDMODEL_Battery_LLN0_Health_stVal (&iedModel_Battery_LLN0_Health_stVal) -#define IEDMODEL_Battery_LLN0_Health_q (&iedModel_Battery_LLN0_Health_q) -#define IEDMODEL_Battery_LLN0_Health_t (&iedModel_Battery_LLN0_Health_t) -#define IEDMODEL_Battery_LLN0_NamPlt (&iedModel_Battery_LLN0_NamPlt) -#define IEDMODEL_Battery_LLN0_NamPlt_vendor (&iedModel_Battery_LLN0_NamPlt_vendor) -#define IEDMODEL_Battery_LLN0_NamPlt_swRev (&iedModel_Battery_LLN0_NamPlt_swRev) -#define IEDMODEL_Battery_LLN0_NamPlt_d (&iedModel_Battery_LLN0_NamPlt_d) -#define IEDMODEL_Battery_LLN0_NamPlt_configRev (&iedModel_Battery_LLN0_NamPlt_configRev) -#define IEDMODEL_Battery_LLN0_NamPlt_ldNs (&iedModel_Battery_LLN0_NamPlt_ldNs) -#define IEDMODEL_Battery_LPHD1 (&iedModel_Battery_LPHD1) -#define IEDMODEL_Battery_LPHD1_PhyNam (&iedModel_Battery_LPHD1_PhyNam) -#define IEDMODEL_Battery_LPHD1_PhyNam_vendor (&iedModel_Battery_LPHD1_PhyNam_vendor) -#define IEDMODEL_Battery_LPHD1_PhyHealth (&iedModel_Battery_LPHD1_PhyHealth) -#define IEDMODEL_Battery_LPHD1_PhyHealth_stVal (&iedModel_Battery_LPHD1_PhyHealth_stVal) -#define IEDMODEL_Battery_LPHD1_PhyHealth_q (&iedModel_Battery_LPHD1_PhyHealth_q) -#define IEDMODEL_Battery_LPHD1_PhyHealth_t (&iedModel_Battery_LPHD1_PhyHealth_t) -#define IEDMODEL_Battery_LPHD1_Proxy (&iedModel_Battery_LPHD1_Proxy) -#define IEDMODEL_Battery_LPHD1_Proxy_stVal (&iedModel_Battery_LPHD1_Proxy_stVal) -#define IEDMODEL_Battery_LPHD1_Proxy_q (&iedModel_Battery_LPHD1_Proxy_q) -#define IEDMODEL_Battery_LPHD1_Proxy_t (&iedModel_Battery_LPHD1_Proxy_t) -#define IEDMODEL_Battery_ZBAT1 (&iedModel_Battery_ZBAT1) -#define IEDMODEL_Battery_ZBAT1_Mod (&iedModel_Battery_ZBAT1_Mod) -#define IEDMODEL_Battery_ZBAT1_Mod_q (&iedModel_Battery_ZBAT1_Mod_q) -#define IEDMODEL_Battery_ZBAT1_Mod_t (&iedModel_Battery_ZBAT1_Mod_t) -#define IEDMODEL_Battery_ZBAT1_Mod_ctlModel (&iedModel_Battery_ZBAT1_Mod_ctlModel) -#define IEDMODEL_Battery_ZBAT1_Beh (&iedModel_Battery_ZBAT1_Beh) -#define IEDMODEL_Battery_ZBAT1_Beh_stVal (&iedModel_Battery_ZBAT1_Beh_stVal) -#define IEDMODEL_Battery_ZBAT1_Beh_q (&iedModel_Battery_ZBAT1_Beh_q) -#define IEDMODEL_Battery_ZBAT1_Beh_t (&iedModel_Battery_ZBAT1_Beh_t) -#define IEDMODEL_Battery_ZBAT1_Health (&iedModel_Battery_ZBAT1_Health) -#define IEDMODEL_Battery_ZBAT1_Health_stVal (&iedModel_Battery_ZBAT1_Health_stVal) -#define IEDMODEL_Battery_ZBAT1_Health_q (&iedModel_Battery_ZBAT1_Health_q) -#define IEDMODEL_Battery_ZBAT1_Health_t (&iedModel_Battery_ZBAT1_Health_t) -#define IEDMODEL_Battery_ZBAT1_NamPlt (&iedModel_Battery_ZBAT1_NamPlt) -#define IEDMODEL_Battery_ZBAT1_NamPlt_vendor (&iedModel_Battery_ZBAT1_NamPlt_vendor) -#define IEDMODEL_Battery_ZBAT1_NamPlt_swRev (&iedModel_Battery_ZBAT1_NamPlt_swRev) -#define IEDMODEL_Battery_ZBAT1_NamPlt_d (&iedModel_Battery_ZBAT1_NamPlt_d) -#define IEDMODEL_Battery_ZBAT1_Vol (&iedModel_Battery_ZBAT1_Vol) -#define IEDMODEL_Battery_ZBAT1_Vol_mag (&iedModel_Battery_ZBAT1_Vol_mag) -#define IEDMODEL_Battery_ZBAT1_Vol_mag_f (&iedModel_Battery_ZBAT1_Vol_mag_f) -#define IEDMODEL_Battery_ZBAT1_Vol_q (&iedModel_Battery_ZBAT1_Vol_q) -#define IEDMODEL_Battery_ZBAT1_Vol_t (&iedModel_Battery_ZBAT1_Vol_t) -#define IEDMODEL_Battery_ZBAT1_Amp (&iedModel_Battery_ZBAT1_Amp) -#define IEDMODEL_Battery_ZBAT1_Amp_mag (&iedModel_Battery_ZBAT1_Amp_mag) -#define IEDMODEL_Battery_ZBAT1_Amp_mag_f (&iedModel_Battery_ZBAT1_Amp_mag_f) -#define IEDMODEL_Battery_ZBAT1_Amp_q (&iedModel_Battery_ZBAT1_Amp_q) -#define IEDMODEL_Battery_ZBAT1_Amp_t (&iedModel_Battery_ZBAT1_Amp_t) -#define IEDMODEL_Battery_ZBTC1 (&iedModel_Battery_ZBTC1) -#define IEDMODEL_Battery_ZBTC1_Mod (&iedModel_Battery_ZBTC1_Mod) -#define IEDMODEL_Battery_ZBTC1_Mod_q (&iedModel_Battery_ZBTC1_Mod_q) -#define IEDMODEL_Battery_ZBTC1_Mod_t (&iedModel_Battery_ZBTC1_Mod_t) -#define IEDMODEL_Battery_ZBTC1_Mod_ctlModel (&iedModel_Battery_ZBTC1_Mod_ctlModel) -#define IEDMODEL_Battery_ZBTC1_Beh (&iedModel_Battery_ZBTC1_Beh) -#define IEDMODEL_Battery_ZBTC1_Beh_stVal (&iedModel_Battery_ZBTC1_Beh_stVal) -#define IEDMODEL_Battery_ZBTC1_Beh_q (&iedModel_Battery_ZBTC1_Beh_q) -#define IEDMODEL_Battery_ZBTC1_Beh_t (&iedModel_Battery_ZBTC1_Beh_t) -#define IEDMODEL_Battery_ZBTC1_Health (&iedModel_Battery_ZBTC1_Health) -#define IEDMODEL_Battery_ZBTC1_Health_stVal (&iedModel_Battery_ZBTC1_Health_stVal) -#define IEDMODEL_Battery_ZBTC1_Health_q (&iedModel_Battery_ZBTC1_Health_q) -#define IEDMODEL_Battery_ZBTC1_Health_t (&iedModel_Battery_ZBTC1_Health_t) -#define IEDMODEL_Battery_ZBTC1_NamPlt (&iedModel_Battery_ZBTC1_NamPlt) -#define IEDMODEL_Battery_ZBTC1_NamPlt_vendor (&iedModel_Battery_ZBTC1_NamPlt_vendor) -#define IEDMODEL_Battery_ZBTC1_NamPlt_swRev (&iedModel_Battery_ZBTC1_NamPlt_swRev) -#define IEDMODEL_Battery_ZBTC1_NamPlt_d (&iedModel_Battery_ZBTC1_NamPlt_d) -#define IEDMODEL_Battery_ZBTC1_BatChaSt (&iedModel_Battery_ZBTC1_BatChaSt) -#define IEDMODEL_Battery_ZBTC1_BatChaPwr (&iedModel_Battery_ZBTC1_BatChaPwr) -#define IEDMODEL_Battery_ZBTC1_BatChaMod (&iedModel_Battery_ZBTC1_BatChaMod) -#define IEDMODEL_Battery_ZBTC1_ChaV (&iedModel_Battery_ZBTC1_ChaV) -#define IEDMODEL_Battery_ZBTC1_ChaV_mag (&iedModel_Battery_ZBTC1_ChaV_mag) -#define IEDMODEL_Battery_ZBTC1_ChaV_mag_f (&iedModel_Battery_ZBTC1_ChaV_mag_f) -#define IEDMODEL_Battery_ZBTC1_ChaV_q (&iedModel_Battery_ZBTC1_ChaV_q) -#define IEDMODEL_Battery_ZBTC1_ChaV_t (&iedModel_Battery_ZBTC1_ChaV_t) -#define IEDMODEL_Battery_ZBTC1_ChaA (&iedModel_Battery_ZBTC1_ChaA) -#define IEDMODEL_Battery_ZBTC1_ChaA_mag (&iedModel_Battery_ZBTC1_ChaA_mag) -#define IEDMODEL_Battery_ZBTC1_ChaA_mag_f (&iedModel_Battery_ZBTC1_ChaA_mag_f) -#define IEDMODEL_Battery_ZBTC1_ChaA_q (&iedModel_Battery_ZBTC1_ChaA_q) -#define IEDMODEL_Battery_ZBTC1_ChaA_t (&iedModel_Battery_ZBTC1_ChaA_t) -#define IEDMODEL_Physical_Measurements (&iedModel_Physical_Measurements) -#define IEDMODEL_Physical_Measurements_LLN0 (&iedModel_Physical_Measurements_LLN0) -#define IEDMODEL_Physical_Measurements_LLN0_Mod (&iedModel_Physical_Measurements_LLN0_Mod) -#define IEDMODEL_Physical_Measurements_LLN0_Mod_q (&iedModel_Physical_Measurements_LLN0_Mod_q) -#define IEDMODEL_Physical_Measurements_LLN0_Mod_t (&iedModel_Physical_Measurements_LLN0_Mod_t) -#define IEDMODEL_Physical_Measurements_LLN0_Mod_ctlModel (&iedModel_Physical_Measurements_LLN0_Mod_ctlModel) -#define IEDMODEL_Physical_Measurements_LLN0_Beh (&iedModel_Physical_Measurements_LLN0_Beh) -#define IEDMODEL_Physical_Measurements_LLN0_Beh_stVal (&iedModel_Physical_Measurements_LLN0_Beh_stVal) -#define IEDMODEL_Physical_Measurements_LLN0_Beh_q (&iedModel_Physical_Measurements_LLN0_Beh_q) -#define IEDMODEL_Physical_Measurements_LLN0_Beh_t (&iedModel_Physical_Measurements_LLN0_Beh_t) -#define IEDMODEL_Physical_Measurements_LLN0_Health (&iedModel_Physical_Measurements_LLN0_Health) -#define IEDMODEL_Physical_Measurements_LLN0_Health_stVal (&iedModel_Physical_Measurements_LLN0_Health_stVal) -#define IEDMODEL_Physical_Measurements_LLN0_Health_q (&iedModel_Physical_Measurements_LLN0_Health_q) -#define IEDMODEL_Physical_Measurements_LLN0_Health_t (&iedModel_Physical_Measurements_LLN0_Health_t) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt (&iedModel_Physical_Measurements_LLN0_NamPlt) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_vendor (&iedModel_Physical_Measurements_LLN0_NamPlt_vendor) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_swRev (&iedModel_Physical_Measurements_LLN0_NamPlt_swRev) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_d (&iedModel_Physical_Measurements_LLN0_NamPlt_d) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_configRev (&iedModel_Physical_Measurements_LLN0_NamPlt_configRev) -#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_ldNs (&iedModel_Physical_Measurements_LLN0_NamPlt_ldNs) -#define IEDMODEL_Physical_Measurements_LPHD1 (&iedModel_Physical_Measurements_LPHD1) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyNam (&iedModel_Physical_Measurements_LPHD1_PhyNam) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyNam_vendor (&iedModel_Physical_Measurements_LPHD1_PhyNam_vendor) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth (&iedModel_Physical_Measurements_LPHD1_PhyHealth) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_stVal (&iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_q (&iedModel_Physical_Measurements_LPHD1_PhyHealth_q) -#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_t (&iedModel_Physical_Measurements_LPHD1_PhyHealth_t) -#define IEDMODEL_Physical_Measurements_LPHD1_Proxy (&iedModel_Physical_Measurements_LPHD1_Proxy) -#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_stVal (&iedModel_Physical_Measurements_LPHD1_Proxy_stVal) -#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_q (&iedModel_Physical_Measurements_LPHD1_Proxy_q) -#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_t (&iedModel_Physical_Measurements_LPHD1_Proxy_t) - -#endif /* STATIC_MODEL_H_ */ - diff --git a/src/mms/inc/iso_connection_parameters.h b/src/mms/inc/iso_connection_parameters.h index b966491c..539ba3eb 100644 --- a/src/mms/inc/iso_connection_parameters.h +++ b/src/mms/inc/iso_connection_parameters.h @@ -34,10 +34,17 @@ extern "C" { /**@{*/ +/** + * \brief authentication mechanism úsed by AcseAuthenticator + */ typedef enum { ACSE_AUTH_NONE = 0, - ACSE_AUTH_PASSWORD = 1 + ACSE_AUTH_PASSWORD = 1, + ACSE_AUTH_CERTIFICATE = 2, + + /** Use TLS certificate for client authentication */ + ACSE_AUTH_TLS = 3 } AcseAuthenticationMechanism; @@ -63,6 +70,13 @@ struct sAcseAuthenticationParameter uint8_t* octetString; int passwordLength; } password; + + struct + { + uint8_t* buf; + int length; + } certificate; + } value; }; diff --git a/src/mms/iso_acse/acse.c b/src/mms/iso_acse/acse.c index 6125003a..76b6f7af 100644 --- a/src/mms/iso_acse/acse.c +++ b/src/mms/iso_acse/acse.c @@ -497,7 +497,7 @@ AcseConnection_createAssociateRequestMessage(AcseConnection* self, calledAEQualifierLength = BerEncoder_UInt32determineEncodedSize(isoParameters->remoteAEQualifier); - /* called AP qualifier */ + /* called AE qualifier */ contentLength += (4 + calledAEQualifierLength); } @@ -509,7 +509,7 @@ AcseConnection_createAssociateRequestMessage(AcseConnection* self, callingAEQualifierLength = BerEncoder_UInt32determineEncodedSize(isoParameters->localAEQualifier); - /* calling AP qualifier */ + /* calling AE qualifier */ contentLength += (4 + callingAEQualifierLength); } From 34dff85ed6d92912472b69402450a809cbc43f89 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 19 Oct 2017 09:02:29 +0200 Subject: [PATCH 33/64] - added missing examples --- .../server_example_basic_io/CMakeLists.txt | 21 + examples/server_example_basic_io/Makefile | 31 + .../server_example_basic_io.c | 171 + .../simpleIO_direct_control.icd | 281 ++ .../simpleIO_sbo_control.icd | 287 ++ .../server_example_basic_io/static_model.c | 2003 +++++++++ .../server_example_basic_io/static_model.h | 301 ++ .../CMakeLists.txt | 21 + .../server_example_password_auth/Makefile | 25 + .../server_example_password_auth.c | 157 + .../simpleIO_direct_control.icd | 223 + .../static_model.c | 1812 +++++++++ .../static_model.h | 299 ++ examples/server_example_simple/CMakeLists.txt | 21 + examples/server_example_simple/Makefile | 25 + .../sampleModel_with_dataset.icd | 184 + .../server_example_simple.c | 76 + examples/server_example_simple/static_model.c | 1627 ++++++++ examples/server_example_simple/static_model.h | 281 ++ .../CMakeLists.txt | 21 + .../server_example_write_handler/Makefile | 25 + .../complexModel.icd | 347 ++ .../server_example_write_handler.c | 78 + .../static_model.c | 3621 +++++++++++++++++ .../static_model.h | 609 +++ 25 files changed, 12547 insertions(+) create mode 100644 examples/server_example_basic_io/CMakeLists.txt create mode 100644 examples/server_example_basic_io/Makefile create mode 100644 examples/server_example_basic_io/server_example_basic_io.c create mode 100644 examples/server_example_basic_io/simpleIO_direct_control.icd create mode 100644 examples/server_example_basic_io/simpleIO_sbo_control.icd create mode 100644 examples/server_example_basic_io/static_model.c create mode 100644 examples/server_example_basic_io/static_model.h create mode 100644 examples/server_example_password_auth/CMakeLists.txt create mode 100644 examples/server_example_password_auth/Makefile create mode 100644 examples/server_example_password_auth/server_example_password_auth.c create mode 100644 examples/server_example_password_auth/simpleIO_direct_control.icd create mode 100644 examples/server_example_password_auth/static_model.c create mode 100644 examples/server_example_password_auth/static_model.h create mode 100644 examples/server_example_simple/CMakeLists.txt create mode 100644 examples/server_example_simple/Makefile create mode 100644 examples/server_example_simple/sampleModel_with_dataset.icd create mode 100644 examples/server_example_simple/server_example_simple.c create mode 100644 examples/server_example_simple/static_model.c create mode 100644 examples/server_example_simple/static_model.h create mode 100644 examples/server_example_write_handler/CMakeLists.txt create mode 100644 examples/server_example_write_handler/Makefile create mode 100644 examples/server_example_write_handler/complexModel.icd create mode 100644 examples/server_example_write_handler/server_example_write_handler.c create mode 100644 examples/server_example_write_handler/static_model.c create mode 100644 examples/server_example_write_handler/static_model.h diff --git a/examples/server_example_basic_io/CMakeLists.txt b/examples/server_example_basic_io/CMakeLists.txt new file mode 100644 index 00000000..6ff774a9 --- /dev/null +++ b/examples/server_example_basic_io/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + . +) + +set(server_example_SRCS + server_example_basic_io.c + static_model.c +) + +IF(WIN32) +set_source_files_properties(${server_example_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(server_example_basic_io + ${server_example_SRCS} +) + +target_link_libraries(server_example_basic_io + iec61850 +) diff --git a/examples/server_example_basic_io/Makefile b/examples/server_example_basic_io/Makefile new file mode 100644 index 00000000..4e4e5956 --- /dev/null +++ b/examples/server_example_basic_io/Makefile @@ -0,0 +1,31 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = server_example_basic_io +PROJECT_SOURCES = server_example_basic_io.c +PROJECT_SOURCES += static_model.c + +PROJECT_ICD_FILE = simpleIO_direct_control.icd + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +LDLIBS += -lm + +CP = cp + +model: $(PROJECT_ICD_FILE) + java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) + $(CP) $(PROJECT_BINARY_NAME) vmd-filestore/IEDSERVER.BIN + +clean: + rm -f $(PROJECT_BINARY_NAME) + rm -f vmd-filestore/IEDSERVER.BIN + + diff --git a/examples/server_example_basic_io/server_example_basic_io.c b/examples/server_example_basic_io/server_example_basic_io.c new file mode 100644 index 00000000..30faf6e4 --- /dev/null +++ b/examples/server_example_basic_io/server_example_basic_io.c @@ -0,0 +1,171 @@ +/* + * server_example_basic_io.c + * + * - How to use simple control models + * - How to serve analog measurement data + */ + +#include "iec61850_server.h" +#include "hal_thread.h" +#include +#include +#include +#include + +#include "../server_example_basic_io/static_model.h" + +/* import IEC 61850 device model created from SCL-File */ +extern IedModel iedModel; + +static int running = 0; +static IedServer iedServer = NULL; + +void +sigint_handler(int signalId) +{ + running = 0; +} + +static ControlHandlerResult +controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) +{ + if (test) + return CONTROL_RESULT_FAILED; + + if (MmsValue_getType(value) == MMS_BOOLEAN) { + printf("received binary control command: "); + + if (MmsValue_getBoolean(value)) + printf("on\n"); + else + printf("off\n"); + } + else + return CONTROL_RESULT_FAILED; + + uint64_t timeStamp = Hal_getTimeInMs(); + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); + } + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); + } + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); + } + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { + IedServer_updateUTCTimeAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); + } + + return CONTROL_RESULT_OK; +} + + +static void +connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter) +{ + if (connected) + printf("Connection opened\n"); + else + printf("Connection closed\n"); +} + +int +main(int argc, char** argv) +{ + printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString()); + + iedServer = IedServer_create(&iedModel); + + /* Set the base path for the MMS file services */ + MmsServer mmsServer = IedServer_getMmsServer(iedServer); + MmsServer_setFilestoreBasepath(mmsServer, "./vmd-filestore/"); + + /* Install handler for operate command */ + IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, + (ControlHandler) controlHandlerForBinaryOutput, + IEDMODEL_GenericIO_GGIO1_SPCSO1); + + IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, + (ControlHandler) controlHandlerForBinaryOutput, + IEDMODEL_GenericIO_GGIO1_SPCSO2); + + IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, + (ControlHandler) controlHandlerForBinaryOutput, + IEDMODEL_GenericIO_GGIO1_SPCSO3); + + IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, + (ControlHandler) controlHandlerForBinaryOutput, + IEDMODEL_GenericIO_GGIO1_SPCSO4); + + IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL); + + /* MMS server will be instructed to start listening to client connections. */ + IedServer_start(iedServer, 102); + + if (!IedServer_isRunning(iedServer)) { + printf("Starting server failed! Exit.\n"); + IedServer_destroy(iedServer); + exit(-1); + } + + running = 1; + + signal(SIGINT, sigint_handler); + + float t = 0.f; + + while (running) { + uint64_t timestamp = Hal_getTimeInMs(); + + t += 0.1f; + + float an1 = sinf(t); + float an2 = sinf(t + 1.f); + float an3 = sinf(t + 2.f); + float an4 = sinf(t + 3.f); + + IedServer_lockDataModel(iedServer); + + Timestamp iecTimestamp; + + Timestamp_clearFlags(&iecTimestamp); + Timestamp_setTimeInMilliseconds(&iecTimestamp, timestamp); + Timestamp_setLeapSecondKnown(&iecTimestamp, true); + + /* toggle clock-not-synchronized flag in timestamp */ + if (((int) t % 2) == 0) + Timestamp_setClockNotSynchronized(&iecTimestamp, true); + + IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_t, &iecTimestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, an1); + + IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_t, &iecTimestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f, an2); + + IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_t, &iecTimestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f, an3); + + IedServer_updateTimestampAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_t, &iecTimestamp); + IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f, an4); + + IedServer_unlockDataModel(iedServer); + + Thread_sleep(100); + } + + /* stop MMS server - close TCP server socket and all client sockets */ + IedServer_stop(iedServer); + + /* Cleanup - free all resources */ + IedServer_destroy(iedServer); + +} /* main() */ diff --git a/examples/server_example_basic_io/simpleIO_direct_control.icd b/examples/server_example_basic_io/simpleIO_direct_control.icd new file mode 100644 index 00000000..0a0c6355 --- /dev/null +++ b/examples/server_example_basic_io/simpleIO_direct_control.icd @@ -0,0 +1,281 @@ + + +
+
+ + + Station bus + 10 + +
+

10.0.0.2

+

255.255.255.0

+

10.0.0.1

+

0001

+

00000001

+

0001

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + + + + + + MZ Automation + + + 0.7.3 + + + libiec61850 server example + + + + + + + + status-only + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + direct-with-normal-security + sbo-with-normal-security + direct-with-enhanced-security + sbo-with-enhanced-security + + + not-supported + bay-control + station-control + remote-control + automatic-bay + automatic-station + automatic-remote + maintenance + process + + +
diff --git a/examples/server_example_basic_io/simpleIO_sbo_control.icd b/examples/server_example_basic_io/simpleIO_sbo_control.icd new file mode 100644 index 00000000..5f65ff6a --- /dev/null +++ b/examples/server_example_basic_io/simpleIO_sbo_control.icd @@ -0,0 +1,287 @@ + + +
+
+ + + Station bus + 10 + +
+

10.0.0.2

+

255.255.255.0

+

10.0.0.1

+

0001

+

00000001

+

0001

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + + + + + + + + status-only + + + + + sbo-with-normal-security + + + 30000 + + + operate-once + + + + + sbo-with-normal-security + + + 30000 + + + operate-once + + + + + sbo-with-normal-security + + + 30000 + + + operate-once + + + + + sbo-with-normal-security + + + 30000 + + + operate-once + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + direct-with-normal-security + sbo-with-normal-security + direct-with-enhanced-security + sbo-with-enhanced-security + + + + operate-once + operate-many + + + + not-supported + bay-control + station-control + remote-control + automatic-bay + automatic-station + automatic-remote + maintenance + process + + +
diff --git a/examples/server_example_basic_io/static_model.c b/examples/server_example_basic_io/static_model.c new file mode 100644 index 00000000..ddc8dd64 --- /dev/null +++ b/examples/server_example_basic_io/static_model.c @@ -0,0 +1,2003 @@ +/* + * static_model.c + * + * automatically generated from simpleIO_direct_control.icd + */ +#include "../server_example_basic_io/static_model.h" + +static void initializeValues(); + +extern DataSet iedModelds_GenericIO_LLN0_Events; +extern DataSet iedModelds_GenericIO_LLN0_Events2; +extern DataSet iedModelds_GenericIO_LLN0_Measurements; + + +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 iedModelds_GenericIO_LLN0_Events_fcda0 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO1$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda1 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO2$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda2 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO3$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda3 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO4$stVal", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_GenericIO_LLN0_Events = { + "GenericIO", + "LLN0$Events", + 4, + &iedModelds_GenericIO_LLN0_Events_fcda0, + &iedModelds_GenericIO_LLN0_Events2 +}; + +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 iedModelds_GenericIO_LLN0_Events2_fcda0 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO1", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda1 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda1 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO2", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda2 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda2 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO3", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events2_fcda3 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events2_fcda3 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO4", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_GenericIO_LLN0_Events2 = { + "GenericIO", + "LLN0$Events2", + 4, + &iedModelds_GenericIO_LLN0_Events2_fcda0, + &iedModelds_GenericIO_LLN0_Measurements +}; + +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 iedModelds_GenericIO_LLN0_Measurements_fcda0 = { + "GenericIO", + false, + "GGIO1$MX$AnIn1$mag$f", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda1 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda1 = { + "GenericIO", + false, + "GGIO1$MX$AnIn1$q", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda2 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda2 = { + "GenericIO", + false, + "GGIO1$MX$AnIn2$mag$f", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda3 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda3 = { + "GenericIO", + false, + "GGIO1$MX$AnIn2$q", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda4 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda4 = { + "GenericIO", + false, + "GGIO1$MX$AnIn3$mag$f", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda5 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda5 = { + "GenericIO", + false, + "GGIO1$MX$AnIn3$q", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda6 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda6 = { + "GenericIO", + false, + "GGIO1$MX$AnIn4$mag$f", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Measurements_fcda7 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Measurements_fcda7 = { + "GenericIO", + false, + "GGIO1$MX$AnIn4$q", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_GenericIO_LLN0_Measurements = { + "GenericIO", + "LLN0$Measurements", + 8, + &iedModelds_GenericIO_LLN0_Measurements_fcda0, + NULL +}; + +LogicalDevice iedModel_GenericIO = { + LogicalDeviceModelType, + "GenericIO", + (ModelNode*) &iedModel, + NULL, + (ModelNode*) &iedModel_GenericIO_LLN0 +}; + +LogicalNode iedModel_GenericIO_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_GenericIO, + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, +}; + +DataObject iedModel_GenericIO_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_GenericIO_LLN0, + NULL, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_configRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { + DataAttributeModelType, + "configRev", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_ldNs, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { + DataAttributeModelType, + "ldNs", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +LogicalNode iedModel_GenericIO_LPHD1 = { + LogicalNodeModelType, + "LPHD1", + (ModelNode*) &iedModel_GenericIO, + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, +}; + +DataObject iedModel_GenericIO_LPHD1_PhyNam = { + DataObjectModelType, + "PhyNam", + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LPHD1_PhyHealth = { + DataObjectModelType, + "PhyHealth", + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LPHD1_Proxy = { + DataObjectModelType, + "Proxy", + (ModelNode*) &iedModel_GenericIO_LPHD1, + NULL, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_GenericIO_GGIO1 = { + LogicalNodeModelType, + "GGIO1", + (ModelNode*) &iedModel_GenericIO, + NULL, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, +}; + +DataObject iedModel_GenericIO_GGIO1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_q, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn1 = { + DataObjectModelType, + "AnIn1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn2 = { + DataObjectModelType, + "AnIn2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn3 = { + DataObjectModelType, + "AnIn3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn4 = { + DataObjectModelType, + "AnIn4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO1 = { + DataObjectModelType, + "SPCSO1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO2 = { + DataObjectModelType, + "SPCSO2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO3 = { + DataObjectModelType, + "SPCSO3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO4 = { + DataObjectModelType, + "SPCSO4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind1 = { + DataObjectModelType, + "Ind1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind2 = { + DataObjectModelType, + "Ind2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind3 = { + DataObjectModelType, + "Ind3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind4 = { + DataObjectModelType, + "Ind4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + NULL, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +extern ReportControlBlock iedModel_GenericIO_LLN0_report0; +extern ReportControlBlock iedModel_GenericIO_LLN0_report1; +extern ReportControlBlock iedModel_GenericIO_LLN0_report2; +extern ReportControlBlock iedModel_GenericIO_LLN0_report3; +extern ReportControlBlock iedModel_GenericIO_LLN0_report4; +extern ReportControlBlock iedModel_GenericIO_LLN0_report5; +extern ReportControlBlock iedModel_GenericIO_LLN0_report6; + +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events1", false, "Events", 4294967295, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report1}; +ReportControlBlock iedModel_GenericIO_LLN0_report1 = {&iedModel_GenericIO_LLN0, "EventsIndexed01", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report2}; +ReportControlBlock iedModel_GenericIO_LLN0_report2 = {&iedModel_GenericIO_LLN0, "EventsIndexed02", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report3}; +ReportControlBlock iedModel_GenericIO_LLN0_report3 = {&iedModel_GenericIO_LLN0, "EventsIndexed03", "Events2", false, "Events", 1, 24, 239, 50, 1000, &iedModel_GenericIO_LLN0_report4}; +ReportControlBlock iedModel_GenericIO_LLN0_report4 = {&iedModel_GenericIO_LLN0, "Measurements01", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report5}; +ReportControlBlock iedModel_GenericIO_LLN0_report5 = {&iedModel_GenericIO_LLN0, "Measurements02", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, &iedModel_GenericIO_LLN0_report6}; +ReportControlBlock iedModel_GenericIO_LLN0_report6 = {&iedModel_GenericIO_LLN0, "Measurements03", "Measurements", true, "Measurements", 1, 16, 239, 50, 1000, NULL}; + + + + +extern LogControlBlock iedModel_GenericIO_LLN0_lcb0; +extern LogControlBlock iedModel_GenericIO_LLN0_lcb1; +LogControlBlock iedModel_GenericIO_LLN0_lcb0 = {&iedModel_GenericIO_LLN0, "EventLog", "Events", "GenericIO/LLN0$EventLog", 3, 0, true, true, &iedModel_GenericIO_LLN0_lcb1}; +LogControlBlock iedModel_GenericIO_LLN0_lcb1 = {&iedModel_GenericIO_LLN0, "GeneralLog", NULL, NULL, 3, 0, true, true, NULL}; + +extern Log iedModel_GenericIO_LLN0_log0; +extern Log iedModel_GenericIO_LLN0_log1; +Log iedModel_GenericIO_LLN0_log0 = {&iedModel_GenericIO_LLN0, "GeneralLog", &iedModel_GenericIO_LLN0_log1}; +Log iedModel_GenericIO_LLN0_log1 = {&iedModel_GenericIO_LLN0, "EventLog", NULL}; + + +IedModel iedModel = { + "simpleIO", + &iedModel_GenericIO, + &iedModelds_GenericIO_LLN0_Events, + &iedModel_GenericIO_LLN0_report0, + NULL, + NULL, + NULL, + &iedModel_GenericIO_LLN0_lcb0, + &iedModel_GenericIO_LLN0_log0, + initializeValues +}; + +static void +initializeValues() +{ + +iedModel_GenericIO_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_GenericIO_LLN0_NamPlt_vendor.mmsValue = MmsValue_newVisibleString("MZ Automation"); + +iedModel_GenericIO_LLN0_NamPlt_swRev.mmsValue = MmsValue_newVisibleString("0.7.3"); + +iedModel_GenericIO_LLN0_NamPlt_d.mmsValue = MmsValue_newVisibleString("libiec61850 server example"); + +iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO4_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); +} diff --git a/examples/server_example_basic_io/static_model.h b/examples/server_example_basic_io/static_model.h new file mode 100644 index 00000000..b5670e9f --- /dev/null +++ b/examples/server_example_basic_io/static_model.h @@ -0,0 +1,301 @@ +/* + * static_model.h + * + * automatically generated from simpleIO_direct_control.icd + */ + +#ifndef STATIC_MODEL_H_ +#define STATIC_MODEL_H_ + +#include +#include "iec61850_model.h" + +extern IedModel iedModel; +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; + + + +#define IEDMODEL_GenericIO (&iedModel_GenericIO) +#define IEDMODEL_GenericIO_LLN0 (&iedModel_GenericIO_LLN0) +#define IEDMODEL_GenericIO_LLN0_Mod (&iedModel_GenericIO_LLN0_Mod) +#define IEDMODEL_GenericIO_LLN0_Mod_stVal (&iedModel_GenericIO_LLN0_Mod_stVal) +#define IEDMODEL_GenericIO_LLN0_Mod_q (&iedModel_GenericIO_LLN0_Mod_q) +#define IEDMODEL_GenericIO_LLN0_Mod_t (&iedModel_GenericIO_LLN0_Mod_t) +#define IEDMODEL_GenericIO_LLN0_Mod_ctlModel (&iedModel_GenericIO_LLN0_Mod_ctlModel) +#define IEDMODEL_GenericIO_LLN0_Beh (&iedModel_GenericIO_LLN0_Beh) +#define IEDMODEL_GenericIO_LLN0_Beh_stVal (&iedModel_GenericIO_LLN0_Beh_stVal) +#define IEDMODEL_GenericIO_LLN0_Beh_q (&iedModel_GenericIO_LLN0_Beh_q) +#define IEDMODEL_GenericIO_LLN0_Beh_t (&iedModel_GenericIO_LLN0_Beh_t) +#define IEDMODEL_GenericIO_LLN0_Health (&iedModel_GenericIO_LLN0_Health) +#define IEDMODEL_GenericIO_LLN0_Health_stVal (&iedModel_GenericIO_LLN0_Health_stVal) +#define IEDMODEL_GenericIO_LLN0_Health_q (&iedModel_GenericIO_LLN0_Health_q) +#define IEDMODEL_GenericIO_LLN0_Health_t (&iedModel_GenericIO_LLN0_Health_t) +#define IEDMODEL_GenericIO_LLN0_NamPlt (&iedModel_GenericIO_LLN0_NamPlt) +#define IEDMODEL_GenericIO_LLN0_NamPlt_vendor (&iedModel_GenericIO_LLN0_NamPlt_vendor) +#define IEDMODEL_GenericIO_LLN0_NamPlt_swRev (&iedModel_GenericIO_LLN0_NamPlt_swRev) +#define IEDMODEL_GenericIO_LLN0_NamPlt_d (&iedModel_GenericIO_LLN0_NamPlt_d) +#define IEDMODEL_GenericIO_LLN0_NamPlt_configRev (&iedModel_GenericIO_LLN0_NamPlt_configRev) +#define IEDMODEL_GenericIO_LLN0_NamPlt_ldNs (&iedModel_GenericIO_LLN0_NamPlt_ldNs) +#define IEDMODEL_GenericIO_LPHD1 (&iedModel_GenericIO_LPHD1) +#define IEDMODEL_GenericIO_LPHD1_PhyNam (&iedModel_GenericIO_LPHD1_PhyNam) +#define IEDMODEL_GenericIO_LPHD1_PhyNam_vendor (&iedModel_GenericIO_LPHD1_PhyNam_vendor) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth (&iedModel_GenericIO_LPHD1_PhyHealth) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_stVal (&iedModel_GenericIO_LPHD1_PhyHealth_stVal) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_q (&iedModel_GenericIO_LPHD1_PhyHealth_q) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_t (&iedModel_GenericIO_LPHD1_PhyHealth_t) +#define IEDMODEL_GenericIO_LPHD1_Proxy (&iedModel_GenericIO_LPHD1_Proxy) +#define IEDMODEL_GenericIO_LPHD1_Proxy_stVal (&iedModel_GenericIO_LPHD1_Proxy_stVal) +#define IEDMODEL_GenericIO_LPHD1_Proxy_q (&iedModel_GenericIO_LPHD1_Proxy_q) +#define IEDMODEL_GenericIO_LPHD1_Proxy_t (&iedModel_GenericIO_LPHD1_Proxy_t) +#define IEDMODEL_GenericIO_GGIO1 (&iedModel_GenericIO_GGIO1) +#define IEDMODEL_GenericIO_GGIO1_Mod (&iedModel_GenericIO_GGIO1_Mod) +#define IEDMODEL_GenericIO_GGIO1_Mod_q (&iedModel_GenericIO_GGIO1_Mod_q) +#define IEDMODEL_GenericIO_GGIO1_Mod_t (&iedModel_GenericIO_GGIO1_Mod_t) +#define IEDMODEL_GenericIO_GGIO1_Mod_ctlModel (&iedModel_GenericIO_GGIO1_Mod_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_Beh (&iedModel_GenericIO_GGIO1_Beh) +#define IEDMODEL_GenericIO_GGIO1_Beh_stVal (&iedModel_GenericIO_GGIO1_Beh_stVal) +#define IEDMODEL_GenericIO_GGIO1_Beh_q (&iedModel_GenericIO_GGIO1_Beh_q) +#define IEDMODEL_GenericIO_GGIO1_Beh_t (&iedModel_GenericIO_GGIO1_Beh_t) +#define IEDMODEL_GenericIO_GGIO1_Health (&iedModel_GenericIO_GGIO1_Health) +#define IEDMODEL_GenericIO_GGIO1_Health_stVal (&iedModel_GenericIO_GGIO1_Health_stVal) +#define IEDMODEL_GenericIO_GGIO1_Health_q (&iedModel_GenericIO_GGIO1_Health_q) +#define IEDMODEL_GenericIO_GGIO1_Health_t (&iedModel_GenericIO_GGIO1_Health_t) +#define IEDMODEL_GenericIO_GGIO1_NamPlt (&iedModel_GenericIO_GGIO1_NamPlt) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_vendor (&iedModel_GenericIO_GGIO1_NamPlt_vendor) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_swRev (&iedModel_GenericIO_GGIO1_NamPlt_swRev) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_d (&iedModel_GenericIO_GGIO1_NamPlt_d) +#define IEDMODEL_GenericIO_GGIO1_AnIn1 (&iedModel_GenericIO_GGIO1_AnIn1) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag (&iedModel_GenericIO_GGIO1_AnIn1_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f (&iedModel_GenericIO_GGIO1_AnIn1_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_q (&iedModel_GenericIO_GGIO1_AnIn1_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_t (&iedModel_GenericIO_GGIO1_AnIn1_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn2 (&iedModel_GenericIO_GGIO1_AnIn2) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag (&iedModel_GenericIO_GGIO1_AnIn2_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f (&iedModel_GenericIO_GGIO1_AnIn2_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_q (&iedModel_GenericIO_GGIO1_AnIn2_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_t (&iedModel_GenericIO_GGIO1_AnIn2_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn3 (&iedModel_GenericIO_GGIO1_AnIn3) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag (&iedModel_GenericIO_GGIO1_AnIn3_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f (&iedModel_GenericIO_GGIO1_AnIn3_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_q (&iedModel_GenericIO_GGIO1_AnIn3_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_t (&iedModel_GenericIO_GGIO1_AnIn3_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn4 (&iedModel_GenericIO_GGIO1_AnIn4) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag (&iedModel_GenericIO_GGIO1_AnIn4_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f (&iedModel_GenericIO_GGIO1_AnIn4_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_q (&iedModel_GenericIO_GGIO1_AnIn4_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_t (&iedModel_GenericIO_GGIO1_AnIn4_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1 (&iedModel_GenericIO_GGIO1_SPCSO1) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal (&iedModel_GenericIO_GGIO1_SPCSO1_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_q (&iedModel_GenericIO_GGIO1_SPCSO1_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper (&iedModel_GenericIO_GGIO1_SPCSO1_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO1_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_t (&iedModel_GenericIO_GGIO1_SPCSO1_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal (&iedModel_GenericIO_GGIO1_SPCSO2_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_q (&iedModel_GenericIO_GGIO1_SPCSO2_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper (&iedModel_GenericIO_GGIO1_SPCSO2_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO2_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_t (&iedModel_GenericIO_GGIO1_SPCSO2_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3 (&iedModel_GenericIO_GGIO1_SPCSO3) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal (&iedModel_GenericIO_GGIO1_SPCSO3_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_q (&iedModel_GenericIO_GGIO1_SPCSO3_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper (&iedModel_GenericIO_GGIO1_SPCSO3_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_t (&iedModel_GenericIO_GGIO1_SPCSO3_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4 (&iedModel_GenericIO_GGIO1_SPCSO4) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal (&iedModel_GenericIO_GGIO1_SPCSO4_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_q (&iedModel_GenericIO_GGIO1_SPCSO4_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper (&iedModel_GenericIO_GGIO1_SPCSO4_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_t (&iedModel_GenericIO_GGIO1_SPCSO4_t) +#define IEDMODEL_GenericIO_GGIO1_Ind1 (&iedModel_GenericIO_GGIO1_Ind1) +#define IEDMODEL_GenericIO_GGIO1_Ind1_stVal (&iedModel_GenericIO_GGIO1_Ind1_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind1_q (&iedModel_GenericIO_GGIO1_Ind1_q) +#define IEDMODEL_GenericIO_GGIO1_Ind1_t (&iedModel_GenericIO_GGIO1_Ind1_t) +#define IEDMODEL_GenericIO_GGIO1_Ind2 (&iedModel_GenericIO_GGIO1_Ind2) +#define IEDMODEL_GenericIO_GGIO1_Ind2_stVal (&iedModel_GenericIO_GGIO1_Ind2_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind2_q (&iedModel_GenericIO_GGIO1_Ind2_q) +#define IEDMODEL_GenericIO_GGIO1_Ind2_t (&iedModel_GenericIO_GGIO1_Ind2_t) +#define IEDMODEL_GenericIO_GGIO1_Ind3 (&iedModel_GenericIO_GGIO1_Ind3) +#define IEDMODEL_GenericIO_GGIO1_Ind3_stVal (&iedModel_GenericIO_GGIO1_Ind3_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind3_q (&iedModel_GenericIO_GGIO1_Ind3_q) +#define IEDMODEL_GenericIO_GGIO1_Ind3_t (&iedModel_GenericIO_GGIO1_Ind3_t) +#define IEDMODEL_GenericIO_GGIO1_Ind4 (&iedModel_GenericIO_GGIO1_Ind4) +#define IEDMODEL_GenericIO_GGIO1_Ind4_stVal (&iedModel_GenericIO_GGIO1_Ind4_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind4_q (&iedModel_GenericIO_GGIO1_Ind4_q) +#define IEDMODEL_GenericIO_GGIO1_Ind4_t (&iedModel_GenericIO_GGIO1_Ind4_t) + +#endif /* STATIC_MODEL_H_ */ + diff --git a/examples/server_example_password_auth/CMakeLists.txt b/examples/server_example_password_auth/CMakeLists.txt new file mode 100644 index 00000000..db7376d2 --- /dev/null +++ b/examples/server_example_password_auth/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + . +) + +set(server_example_SRCS + server_example_password_auth.c + static_model.c +) + +IF(WIN32) +set_source_files_properties(${server_example_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(server_example_password_auth + ${server_example_SRCS} +) + +target_link_libraries(server_example_password_auth + iec61850 +) diff --git a/examples/server_example_password_auth/Makefile b/examples/server_example_password_auth/Makefile new file mode 100644 index 00000000..62a92580 --- /dev/null +++ b/examples/server_example_password_auth/Makefile @@ -0,0 +1,25 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = server_example_password_auth +PROJECT_SOURCES = server_example_password_auth.c +PROJECT_SOURCES += static_model.c + +PROJECT_ICD_FILE = simpleIO_direct_control.icd + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +model: $(PROJECT_ICD_FILE) + java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) + + diff --git a/examples/server_example_password_auth/server_example_password_auth.c b/examples/server_example_password_auth/server_example_password_auth.c new file mode 100644 index 00000000..6c6661c9 --- /dev/null +++ b/examples/server_example_password_auth/server_example_password_auth.c @@ -0,0 +1,157 @@ +/* + * server_example_password_auth.c + * + * Example server application with password authentication. + * + * - How to use a authenticator with password authentication + * - How to distinguish between different clients for control actions and set points + * + * The server accepts only connections by clients using one of the two passwords: + * + * user1@testpw + * user2@testpw + * + * Only clients using the second password are allowed to perform control actions. + */ + +#include "iec61850_server.h" +#include "hal_thread.h" +#include +#include +#include +#include "../server_example_password_auth/static_model.h" + +/* import IEC 61850 device model created from SCL-File */ +extern IedModel iedModel; + +static int running = 0; + +static IedServer iedServer; + +void sigint_handler(int signalId) +{ + running = 0; +} + +/* password "database" */ +static char* password1 = "user1@testpw"; +static char* password2 = "user2@testpw"; + +/** + * This is the AcseAuthenticator callback function that is invoked on each client connection attempt. + * When returning true the server stack accepts the client. Otherwise the connection is rejected. + */ +static bool +clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken) +{ + if (authParameter->mechanism == ACSE_AUTH_PASSWORD) { + if (authParameter->value.password.passwordLength == strlen(password1)) { + if (memcmp(authParameter->value.password.octetString, password1, + authParameter->value.password.passwordLength) == 0) + { + *securityToken = (void*) password1; + return true; + } + + } + if (authParameter->value.password.passwordLength == strlen(password2)) { + if (memcmp(authParameter->value.password.octetString, password2, + authParameter->value.password.passwordLength) == 0) + { + *securityToken = (void*) password2; + return true; + } + } + } + + return false; +} + +static CheckHandlerResult +performCheckHandler (void* parameter, MmsValue* ctlVal, bool test, bool interlockCheck, ClientConnection connection) +{ + void* securityToken = ClientConnection_getSecurityToken(connection); + + if (securityToken == password2) + return CONTROL_ACCEPTED; + else + return CONTROL_OBJECT_ACCESS_DENIED; +} + +static void +controlHandlerForBinaryOutput(void* parameter, MmsValue* value, bool test) +{ + MmsValue* timeStamp = MmsValue_newUtcTimeByMsTime(Hal_getTimeInMs()); + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO1) { + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal, value); + } + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO2) { + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal, value); + } + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO3) { + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal, value); + } + + if (parameter == IEDMODEL_GenericIO_GGIO1_SPCSO4) { + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_t, timeStamp); + IedServer_updateAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal, value); + } + + MmsValue_delete(timeStamp); +} + +int main(int argc, char** argv) { + + iedServer = IedServer_create(&iedModel); + + /* Activate authentication */ + IedServer_setAuthenticator(iedServer, clientAuthenticator, NULL); + + /* Set handler for control permission check for each control object */ + IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, + (ControlPerformCheckHandler) performCheckHandler, NULL); + IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, + (ControlPerformCheckHandler) performCheckHandler, NULL); + IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, + (ControlPerformCheckHandler) performCheckHandler, NULL); + IedServer_setPerformCheckHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, + (ControlPerformCheckHandler) performCheckHandler, NULL); + + /* Set control handler for each control object */ + IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, + (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO1); + IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO2, + (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO2); + IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO3, + (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO3); + IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO4, + (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO4); + + /* MMS server will be instructed to start listening to client connections. */ + IedServer_start(iedServer, 102); + + if (!IedServer_isRunning(iedServer)) { + printf("Starting server failed! Exit.\n"); + IedServer_destroy(iedServer); + exit(-1); + } + + running = 1; + + signal(SIGINT, sigint_handler); + + while (running) + Thread_sleep(100); + + /* stop MMS server - close TCP server socket and all client sockets */ + IedServer_stop(iedServer); + + /* Cleanup - free all resources */ + IedServer_destroy(iedServer); +} /* main() */ diff --git a/examples/server_example_password_auth/simpleIO_direct_control.icd b/examples/server_example_password_auth/simpleIO_direct_control.icd new file mode 100644 index 00000000..3081dffe --- /dev/null +++ b/examples/server_example_password_auth/simpleIO_direct_control.icd @@ -0,0 +1,223 @@ + + +
+
+ + + Station bus + 10 + +
+

10.0.0.2

+

255.255.255.0

+

10.0.0.1

+

0001

+

00000001

+

0001

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + + + + + + + + status-only + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + direct-with-normal-security + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + direct-with-normal-security + sbo-with-normal-security + direct-with-enhanced-security + sbo-with-enhanced-security + + + not-supported + bay-control + station-control + remote-control + automatic-bay + automatic-station + automatic-remote + maintenance + process + + +
diff --git a/examples/server_example_password_auth/static_model.c b/examples/server_example_password_auth/static_model.c new file mode 100644 index 00000000..1db7d778 --- /dev/null +++ b/examples/server_example_password_auth/static_model.c @@ -0,0 +1,1812 @@ +/* + * static_model.c + * + * automatically generated from simpleIO_direct_control.icd + */ +#include "../server_example_password_auth/static_model.h" + +static void initializeValues(); + +extern DataSet iedModelds_GenericIO_LLN0_Events; + + +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 iedModelds_GenericIO_LLN0_Events_fcda0 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO1$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda1 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda1 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO2$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda2 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda2 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO3$stVal", + -1, + NULL, + NULL, + &iedModelds_GenericIO_LLN0_Events_fcda3 +}; + +DataSetEntry iedModelds_GenericIO_LLN0_Events_fcda3 = { + "GenericIO", + false, + "GGIO1$ST$SPCSO4$stVal", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_GenericIO_LLN0_Events = { + "GenericIO", + "LLN0$Events", + 4, + &iedModelds_GenericIO_LLN0_Events_fcda0, + NULL +}; + +LogicalDevice iedModel_GenericIO = { + LogicalDeviceModelType, + "GenericIO", + (ModelNode*) &iedModel, + NULL, + (ModelNode*) &iedModel_GenericIO_LLN0 +}; + +LogicalNode iedModel_GenericIO_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_GenericIO, + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, +}; + +DataObject iedModel_GenericIO_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_q, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + (ModelNode*) &iedModel_GenericIO_LLN0_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + (ModelNode*) &iedModel_GenericIO_LLN0_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_GenericIO_LLN0, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + (ModelNode*) &iedModel_GenericIO_LLN0_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LLN0_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LLN0_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_GenericIO_LLN0, + NULL, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_configRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_configRev = { + DataAttributeModelType, + "configRev", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt_ldNs, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LLN0_NamPlt_ldNs = { + DataAttributeModelType, + "ldNs", + (ModelNode*) &iedModel_GenericIO_LLN0_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +LogicalNode iedModel_GenericIO_LPHD1 = { + LogicalNodeModelType, + "LPHD1", + (ModelNode*) &iedModel_GenericIO, + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, +}; + +DataObject iedModel_GenericIO_LPHD1_PhyNam = { + DataObjectModelType, + "PhyNam", + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyNam_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyNam, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LPHD1_PhyHealth = { + DataObjectModelType, + "PhyHealth", + (ModelNode*) &iedModel_GenericIO_LPHD1, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_PhyHealth_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LPHD1_PhyHealth, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_LPHD1_Proxy = { + DataObjectModelType, + "Proxy", + (ModelNode*) &iedModel_GenericIO_LPHD1, + NULL, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_LPHD1_Proxy_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_GenericIO_GGIO1 = { + LogicalNodeModelType, + "GGIO1", + (ModelNode*) &iedModel_GenericIO, + NULL, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, +}; + +DataObject iedModel_GenericIO_GGIO1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_q, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + (ModelNode*) &iedModel_GenericIO_GGIO1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_GenericIO_GGIO1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn1 = { + DataObjectModelType, + "AnIn1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn1, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn2 = { + DataObjectModelType, + "AnIn2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn2, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn3 = { + DataObjectModelType, + "AnIn3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn3, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_AnIn4 = { + DataObjectModelType, + "AnIn4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_q, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_AnIn4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_AnIn4, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO1 = { + DataObjectModelType, + "SPCSO1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO1, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO2 = { + DataObjectModelType, + "SPCSO2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO2, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO3 = { + DataObjectModelType, + "SPCSO3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO3, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_SPCSO4 = { + DataObjectModelType, + "SPCSO4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper = { + DataAttributeModelType, + "Oper", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_ctlModel, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal = { + DataAttributeModelType, + "ctlVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin = { + DataAttributeModelType, + "origin", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat, + 0, + IEC61850_FC_CO, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat = { + DataAttributeModelType, + "orCat", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent = { + DataAttributeModelType, + "orIdent", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_OCTET_STRING_64, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum = { + DataAttributeModelType, + "ctlNum", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_T, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_INT8U, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_T = { + DataAttributeModelType, + "T", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test = { + DataAttributeModelType, + "Test", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_BOOLEAN, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check = { + DataAttributeModelType, + "Check", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_Oper, + NULL, + NULL, + 0, + IEC61850_FC_CO, + IEC61850_CHECK, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4_t, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_SPCSO4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_SPCSO4, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind1 = { + DataObjectModelType, + "Ind1", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind1_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind1, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind2 = { + DataObjectModelType, + "Ind2", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind2_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind2, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind3 = { + DataObjectModelType, + "Ind3", + (ModelNode*) &iedModel_GenericIO_GGIO1, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind3_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind3, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_GenericIO_GGIO1_Ind4 = { + DataObjectModelType, + "Ind4", + (ModelNode*) &iedModel_GenericIO_GGIO1, + NULL, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_stVal, + 0 +}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_GenericIO_GGIO1_Ind4, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +extern ReportControlBlock iedModel_GenericIO_LLN0_report0; + +ReportControlBlock iedModel_GenericIO_LLN0_report0 = {&iedModel_GenericIO_LLN0, "EventsRCB01", "Events", false, "Events", 1, 24, 111, 50, 1000, NULL}; + + + + + + + +IedModel iedModel = { + "simpleIO", + &iedModel_GenericIO, + &iedModelds_GenericIO_LLN0_Events, + &iedModel_GenericIO_LLN0_report0, + NULL, + NULL, + NULL, + NULL, + NULL, + initializeValues +}; + +static void +initializeValues() +{ + +iedModel_GenericIO_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_GenericIO_GGIO1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_GenericIO_GGIO1_SPCSO1_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO2_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO3_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); + +iedModel_GenericIO_GGIO1_SPCSO4_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(1); +} diff --git a/examples/server_example_password_auth/static_model.h b/examples/server_example_password_auth/static_model.h new file mode 100644 index 00000000..58dd28b5 --- /dev/null +++ b/examples/server_example_password_auth/static_model.h @@ -0,0 +1,299 @@ +/* + * static_model.h + * + * automatically generated from simpleIO_direct_control.icd + */ + +#ifndef STATIC_MODEL_H_ +#define STATIC_MODEL_H_ + +#include +#include "iec61850_model.h" + +extern IedModel iedModel; +extern LogicalDevice iedModel_GenericIO; +extern LogicalNode iedModel_GenericIO_LLN0; +extern DataObject iedModel_GenericIO_LLN0_Mod; +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; + + + +#define IEDMODEL_GenericIO (&iedModel_GenericIO) +#define IEDMODEL_GenericIO_LLN0 (&iedModel_GenericIO_LLN0) +#define IEDMODEL_GenericIO_LLN0_Mod (&iedModel_GenericIO_LLN0_Mod) +#define IEDMODEL_GenericIO_LLN0_Mod_q (&iedModel_GenericIO_LLN0_Mod_q) +#define IEDMODEL_GenericIO_LLN0_Mod_t (&iedModel_GenericIO_LLN0_Mod_t) +#define IEDMODEL_GenericIO_LLN0_Mod_ctlModel (&iedModel_GenericIO_LLN0_Mod_ctlModel) +#define IEDMODEL_GenericIO_LLN0_Beh (&iedModel_GenericIO_LLN0_Beh) +#define IEDMODEL_GenericIO_LLN0_Beh_stVal (&iedModel_GenericIO_LLN0_Beh_stVal) +#define IEDMODEL_GenericIO_LLN0_Beh_q (&iedModel_GenericIO_LLN0_Beh_q) +#define IEDMODEL_GenericIO_LLN0_Beh_t (&iedModel_GenericIO_LLN0_Beh_t) +#define IEDMODEL_GenericIO_LLN0_Health (&iedModel_GenericIO_LLN0_Health) +#define IEDMODEL_GenericIO_LLN0_Health_stVal (&iedModel_GenericIO_LLN0_Health_stVal) +#define IEDMODEL_GenericIO_LLN0_Health_q (&iedModel_GenericIO_LLN0_Health_q) +#define IEDMODEL_GenericIO_LLN0_Health_t (&iedModel_GenericIO_LLN0_Health_t) +#define IEDMODEL_GenericIO_LLN0_NamPlt (&iedModel_GenericIO_LLN0_NamPlt) +#define IEDMODEL_GenericIO_LLN0_NamPlt_vendor (&iedModel_GenericIO_LLN0_NamPlt_vendor) +#define IEDMODEL_GenericIO_LLN0_NamPlt_swRev (&iedModel_GenericIO_LLN0_NamPlt_swRev) +#define IEDMODEL_GenericIO_LLN0_NamPlt_d (&iedModel_GenericIO_LLN0_NamPlt_d) +#define IEDMODEL_GenericIO_LLN0_NamPlt_configRev (&iedModel_GenericIO_LLN0_NamPlt_configRev) +#define IEDMODEL_GenericIO_LLN0_NamPlt_ldNs (&iedModel_GenericIO_LLN0_NamPlt_ldNs) +#define IEDMODEL_GenericIO_LPHD1 (&iedModel_GenericIO_LPHD1) +#define IEDMODEL_GenericIO_LPHD1_PhyNam (&iedModel_GenericIO_LPHD1_PhyNam) +#define IEDMODEL_GenericIO_LPHD1_PhyNam_vendor (&iedModel_GenericIO_LPHD1_PhyNam_vendor) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth (&iedModel_GenericIO_LPHD1_PhyHealth) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_stVal (&iedModel_GenericIO_LPHD1_PhyHealth_stVal) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_q (&iedModel_GenericIO_LPHD1_PhyHealth_q) +#define IEDMODEL_GenericIO_LPHD1_PhyHealth_t (&iedModel_GenericIO_LPHD1_PhyHealth_t) +#define IEDMODEL_GenericIO_LPHD1_Proxy (&iedModel_GenericIO_LPHD1_Proxy) +#define IEDMODEL_GenericIO_LPHD1_Proxy_stVal (&iedModel_GenericIO_LPHD1_Proxy_stVal) +#define IEDMODEL_GenericIO_LPHD1_Proxy_q (&iedModel_GenericIO_LPHD1_Proxy_q) +#define IEDMODEL_GenericIO_LPHD1_Proxy_t (&iedModel_GenericIO_LPHD1_Proxy_t) +#define IEDMODEL_GenericIO_GGIO1 (&iedModel_GenericIO_GGIO1) +#define IEDMODEL_GenericIO_GGIO1_Mod (&iedModel_GenericIO_GGIO1_Mod) +#define IEDMODEL_GenericIO_GGIO1_Mod_q (&iedModel_GenericIO_GGIO1_Mod_q) +#define IEDMODEL_GenericIO_GGIO1_Mod_t (&iedModel_GenericIO_GGIO1_Mod_t) +#define IEDMODEL_GenericIO_GGIO1_Mod_ctlModel (&iedModel_GenericIO_GGIO1_Mod_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_Beh (&iedModel_GenericIO_GGIO1_Beh) +#define IEDMODEL_GenericIO_GGIO1_Beh_stVal (&iedModel_GenericIO_GGIO1_Beh_stVal) +#define IEDMODEL_GenericIO_GGIO1_Beh_q (&iedModel_GenericIO_GGIO1_Beh_q) +#define IEDMODEL_GenericIO_GGIO1_Beh_t (&iedModel_GenericIO_GGIO1_Beh_t) +#define IEDMODEL_GenericIO_GGIO1_Health (&iedModel_GenericIO_GGIO1_Health) +#define IEDMODEL_GenericIO_GGIO1_Health_stVal (&iedModel_GenericIO_GGIO1_Health_stVal) +#define IEDMODEL_GenericIO_GGIO1_Health_q (&iedModel_GenericIO_GGIO1_Health_q) +#define IEDMODEL_GenericIO_GGIO1_Health_t (&iedModel_GenericIO_GGIO1_Health_t) +#define IEDMODEL_GenericIO_GGIO1_NamPlt (&iedModel_GenericIO_GGIO1_NamPlt) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_vendor (&iedModel_GenericIO_GGIO1_NamPlt_vendor) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_swRev (&iedModel_GenericIO_GGIO1_NamPlt_swRev) +#define IEDMODEL_GenericIO_GGIO1_NamPlt_d (&iedModel_GenericIO_GGIO1_NamPlt_d) +#define IEDMODEL_GenericIO_GGIO1_AnIn1 (&iedModel_GenericIO_GGIO1_AnIn1) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag (&iedModel_GenericIO_GGIO1_AnIn1_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f (&iedModel_GenericIO_GGIO1_AnIn1_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_q (&iedModel_GenericIO_GGIO1_AnIn1_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn1_t (&iedModel_GenericIO_GGIO1_AnIn1_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn2 (&iedModel_GenericIO_GGIO1_AnIn2) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag (&iedModel_GenericIO_GGIO1_AnIn2_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_mag_f (&iedModel_GenericIO_GGIO1_AnIn2_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_q (&iedModel_GenericIO_GGIO1_AnIn2_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn2_t (&iedModel_GenericIO_GGIO1_AnIn2_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn3 (&iedModel_GenericIO_GGIO1_AnIn3) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag (&iedModel_GenericIO_GGIO1_AnIn3_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_mag_f (&iedModel_GenericIO_GGIO1_AnIn3_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_q (&iedModel_GenericIO_GGIO1_AnIn3_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn3_t (&iedModel_GenericIO_GGIO1_AnIn3_t) +#define IEDMODEL_GenericIO_GGIO1_AnIn4 (&iedModel_GenericIO_GGIO1_AnIn4) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag (&iedModel_GenericIO_GGIO1_AnIn4_mag) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_mag_f (&iedModel_GenericIO_GGIO1_AnIn4_mag_f) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_q (&iedModel_GenericIO_GGIO1_AnIn4_q) +#define IEDMODEL_GenericIO_GGIO1_AnIn4_t (&iedModel_GenericIO_GGIO1_AnIn4_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1 (&iedModel_GenericIO_GGIO1_SPCSO1) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_stVal (&iedModel_GenericIO_GGIO1_SPCSO1_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_q (&iedModel_GenericIO_GGIO1_SPCSO1_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper (&iedModel_GenericIO_GGIO1_SPCSO1_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO1_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO1_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO1_t (&iedModel_GenericIO_GGIO1_SPCSO1_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2 (&iedModel_GenericIO_GGIO1_SPCSO2) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_stVal (&iedModel_GenericIO_GGIO1_SPCSO2_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_q (&iedModel_GenericIO_GGIO1_SPCSO2_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper (&iedModel_GenericIO_GGIO1_SPCSO2_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO2_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO2_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO2_t (&iedModel_GenericIO_GGIO1_SPCSO2_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3 (&iedModel_GenericIO_GGIO1_SPCSO3) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_stVal (&iedModel_GenericIO_GGIO1_SPCSO3_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_q (&iedModel_GenericIO_GGIO1_SPCSO3_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper (&iedModel_GenericIO_GGIO1_SPCSO3_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO3_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO3_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO3_t (&iedModel_GenericIO_GGIO1_SPCSO3_t) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4 (&iedModel_GenericIO_GGIO1_SPCSO4) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_stVal (&iedModel_GenericIO_GGIO1_SPCSO4_stVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_q (&iedModel_GenericIO_GGIO1_SPCSO4_q) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper (&iedModel_GenericIO_GGIO1_SPCSO4_Oper) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlVal (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlVal) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orCat) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_origin_orIdent) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_ctlNum (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_ctlNum) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_T (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_T) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Test (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Test) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_Oper_Check (&iedModel_GenericIO_GGIO1_SPCSO4_Oper_Check) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_ctlModel (&iedModel_GenericIO_GGIO1_SPCSO4_ctlModel) +#define IEDMODEL_GenericIO_GGIO1_SPCSO4_t (&iedModel_GenericIO_GGIO1_SPCSO4_t) +#define IEDMODEL_GenericIO_GGIO1_Ind1 (&iedModel_GenericIO_GGIO1_Ind1) +#define IEDMODEL_GenericIO_GGIO1_Ind1_stVal (&iedModel_GenericIO_GGIO1_Ind1_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind1_q (&iedModel_GenericIO_GGIO1_Ind1_q) +#define IEDMODEL_GenericIO_GGIO1_Ind1_t (&iedModel_GenericIO_GGIO1_Ind1_t) +#define IEDMODEL_GenericIO_GGIO1_Ind2 (&iedModel_GenericIO_GGIO1_Ind2) +#define IEDMODEL_GenericIO_GGIO1_Ind2_stVal (&iedModel_GenericIO_GGIO1_Ind2_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind2_q (&iedModel_GenericIO_GGIO1_Ind2_q) +#define IEDMODEL_GenericIO_GGIO1_Ind2_t (&iedModel_GenericIO_GGIO1_Ind2_t) +#define IEDMODEL_GenericIO_GGIO1_Ind3 (&iedModel_GenericIO_GGIO1_Ind3) +#define IEDMODEL_GenericIO_GGIO1_Ind3_stVal (&iedModel_GenericIO_GGIO1_Ind3_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind3_q (&iedModel_GenericIO_GGIO1_Ind3_q) +#define IEDMODEL_GenericIO_GGIO1_Ind3_t (&iedModel_GenericIO_GGIO1_Ind3_t) +#define IEDMODEL_GenericIO_GGIO1_Ind4 (&iedModel_GenericIO_GGIO1_Ind4) +#define IEDMODEL_GenericIO_GGIO1_Ind4_stVal (&iedModel_GenericIO_GGIO1_Ind4_stVal) +#define IEDMODEL_GenericIO_GGIO1_Ind4_q (&iedModel_GenericIO_GGIO1_Ind4_q) +#define IEDMODEL_GenericIO_GGIO1_Ind4_t (&iedModel_GenericIO_GGIO1_Ind4_t) + +#endif /* STATIC_MODEL_H_ */ + diff --git a/examples/server_example_simple/CMakeLists.txt b/examples/server_example_simple/CMakeLists.txt new file mode 100644 index 00000000..f7884c94 --- /dev/null +++ b/examples/server_example_simple/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + . +) + +set(server_example_SRCS + server_example_simple.c + static_model.c +) + +IF(WIN32) +set_source_files_properties(${server_example_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(server_example_simple + ${server_example_SRCS} +) + +target_link_libraries(server_example_simple + iec61850 +) diff --git a/examples/server_example_simple/Makefile b/examples/server_example_simple/Makefile new file mode 100644 index 00000000..4d9c741f --- /dev/null +++ b/examples/server_example_simple/Makefile @@ -0,0 +1,25 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = server_example_simple +PROJECT_SOURCES = server_example_simple.c +PROJECT_SOURCES += static_model.c + +PROJECT_ICD_FILE = sampleModel_with_dataset.icd + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +model: $(PROJECT_ICD_FILE) + java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) + + diff --git a/examples/server_example_simple/sampleModel_with_dataset.icd b/examples/server_example_simple/sampleModel_with_dataset.icd new file mode 100644 index 00000000..9b2c0fc1 --- /dev/null +++ b/examples/server_example_simple/sampleModel_with_dataset.icd @@ -0,0 +1,184 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + + + + + + + + status-only + + + + + + + status-only + + + + + + + status-only + + + + + + + status-only + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + direct-with-normal-security + sbo-with-normal-security + direct-with-enhanced-security + sbo-with-enhanced-security + + + diff --git a/examples/server_example_simple/server_example_simple.c b/examples/server_example_simple/server_example_simple.c new file mode 100644 index 00000000..f531e577 --- /dev/null +++ b/examples/server_example_simple/server_example_simple.c @@ -0,0 +1,76 @@ +/* + * server_example_simple.c + * + * Copyright 2013 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. + */ + +#include "iec61850_server.h" +#include "hal_thread.h" +#include +#include +#include + +#include "../server_example_simple/static_model.h" + +/* import IEC 61850 device model created from SCL-File */ +extern IedModel iedModel; + +static int running = 0; + +void sigint_handler(int signalId) +{ + running = 0; +} + +int main(int argc, char** argv) { + + int tcpPort = 102; + + if (argc > 1) { + tcpPort = atoi(argv[1]); + } + + IedServer iedServer = IedServer_create(&iedModel); + + // set initial measurement and status values from process + + /* MMS server will be instructed to start listening to client connections. */ + IedServer_start(iedServer, tcpPort); + + if (!IedServer_isRunning(iedServer)) { + printf("Starting server failed! Exit.\n"); + IedServer_destroy(iedServer); + exit(-1); + } + + running = 1; + + signal(SIGINT, sigint_handler); + + while (running) { + Thread_sleep(1); + } + + /* stop MMS server - close TCP server socket and all client sockets */ + IedServer_stop(iedServer); + + /* Cleanup - free all resources */ + IedServer_destroy(iedServer); +} /* main() */ diff --git a/examples/server_example_simple/static_model.c b/examples/server_example_simple/static_model.c new file mode 100644 index 00000000..922e1c25 --- /dev/null +++ b/examples/server_example_simple/static_model.c @@ -0,0 +1,1627 @@ +/* + * static_model.c + * + * automatically generated from sampleModel_with_dataset.icd + */ +#include "../server_example_simple/static_model.h" + +static void initializeValues(); + +extern DataSet iedModelds_Device1_LLN0_dataset1; + + +extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda0; +extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda1; +extern DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda2; + +DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda0 = { + "Device1", + false, + "LLN0$ST$Mod$q", + -1, + NULL, + NULL, + &iedModelds_Device1_LLN0_dataset1_fcda1 +}; + +DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda1 = { + "Device1", + false, + "MMXU1$ST$Mod$q", + -1, + NULL, + NULL, + &iedModelds_Device1_LLN0_dataset1_fcda2 +}; + +DataSetEntry iedModelds_Device1_LLN0_dataset1_fcda2 = { + "Device1", + false, + "MMXU1$CF$Mod$ctlModel", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_Device1_LLN0_dataset1 = { + "Device1", + "LLN0$dataset1", + 3, + &iedModelds_Device1_LLN0_dataset1_fcda0, + NULL +}; + +LogicalDevice iedModel_Device1 = { + LogicalDeviceModelType, + "Device1", + (ModelNode*) &iedModel, + NULL, + (ModelNode*) &iedModel_Device1_LLN0 +}; + +LogicalNode iedModel_Device1_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_Device1, + (ModelNode*) &iedModel_Device1_LPHD1, + (ModelNode*) &iedModel_Device1_LLN0_Mod, +}; + +DataObject iedModel_Device1_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Device1_LLN0, + (ModelNode*) &iedModel_Device1_LLN0_Beh, + (ModelNode*) &iedModel_Device1_LLN0_Mod_q, + 0 +}; + +DataAttribute iedModel_Device1_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_LLN0_Mod, + (ModelNode*) &iedModel_Device1_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_LLN0_Mod, + (ModelNode*) &iedModel_Device1_LLN0_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Device1_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_LLN0_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Device1_LLN0, + (ModelNode*) &iedModel_Device1_LLN0_Health, + (ModelNode*) &iedModel_Device1_LLN0_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Device1_LLN0_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_LLN0_Beh, + (ModelNode*) &iedModel_Device1_LLN0_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_LLN0_Beh, + (ModelNode*) &iedModel_Device1_LLN0_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_LLN0_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_LLN0_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Device1_LLN0, + (ModelNode*) &iedModel_Device1_LLN0_NamPlt, + (ModelNode*) &iedModel_Device1_LLN0_Health_stVal, + 0 +}; + +DataAttribute iedModel_Device1_LLN0_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_LLN0_Health, + (ModelNode*) &iedModel_Device1_LLN0_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_LLN0_Health, + (ModelNode*) &iedModel_Device1_LLN0_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_LLN0_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_LLN0_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Device1_LLN0, + NULL, + (ModelNode*) &iedModel_Device1_LLN0_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Device1_LLN0_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Device1_LLN0_NamPlt, + (ModelNode*) &iedModel_Device1_LLN0_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Device1_LLN0_NamPlt, + (ModelNode*) &iedModel_Device1_LLN0_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Device1_LLN0_NamPlt, + (ModelNode*) &iedModel_Device1_LLN0_NamPlt_configRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_NamPlt_configRev = { + DataAttributeModelType, + "configRev", + (ModelNode*) &iedModel_Device1_LLN0_NamPlt, + (ModelNode*) &iedModel_Device1_LLN0_NamPlt_ldNs, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_LLN0_NamPlt_ldNs = { + DataAttributeModelType, + "ldNs", + (ModelNode*) &iedModel_Device1_LLN0_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +LogicalNode iedModel_Device1_LPHD1 = { + LogicalNodeModelType, + "LPHD1", + (ModelNode*) &iedModel_Device1, + (ModelNode*) &iedModel_Device1_DGEN1, + (ModelNode*) &iedModel_Device1_LPHD1_PhyNam, +}; + +DataObject iedModel_Device1_LPHD1_PhyNam = { + DataObjectModelType, + "PhyNam", + (ModelNode*) &iedModel_Device1_LPHD1, + (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Device1_LPHD1_PhyNam_vendor, + 0 +}; + +DataAttribute iedModel_Device1_LPHD1_PhyNam_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Device1_LPHD1_PhyNam, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_LPHD1_PhyHealth = { + DataObjectModelType, + "PhyHealth", + (ModelNode*) &iedModel_Device1_LPHD1, + (ModelNode*) &iedModel_Device1_LPHD1_Proxy, + (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth_stVal, + 0 +}; + +DataAttribute iedModel_Device1_LPHD1_PhyHealth_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LPHD1_PhyHealth_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LPHD1_PhyHealth_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_LPHD1_PhyHealth, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_LPHD1_Proxy = { + DataObjectModelType, + "Proxy", + (ModelNode*) &iedModel_Device1_LPHD1, + NULL, + (ModelNode*) &iedModel_Device1_LPHD1_Proxy_stVal, + 0 +}; + +DataAttribute iedModel_Device1_LPHD1_Proxy_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_LPHD1_Proxy, + (ModelNode*) &iedModel_Device1_LPHD1_Proxy_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LPHD1_Proxy_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_LPHD1_Proxy, + (ModelNode*) &iedModel_Device1_LPHD1_Proxy_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_LPHD1_Proxy_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_Device1_DGEN1 = { + LogicalNodeModelType, + "DGEN1", + (ModelNode*) &iedModel_Device1, + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DGEN1_Mod, +}; + +DataObject iedModel_Device1_DGEN1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Device1_DGEN1, + (ModelNode*) &iedModel_Device1_DGEN1_Beh, + (ModelNode*) &iedModel_Device1_DGEN1_Mod_q, + 0 +}; + +DataAttribute iedModel_Device1_DGEN1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DGEN1_Mod, + (ModelNode*) &iedModel_Device1_DGEN1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DGEN1_Mod, + (ModelNode*) &iedModel_Device1_DGEN1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Device1_DGEN1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DGEN1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Device1_DGEN1, + (ModelNode*) &iedModel_Device1_DGEN1_Health, + (ModelNode*) &iedModel_Device1_DGEN1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Device1_DGEN1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_DGEN1_Beh, + (ModelNode*) &iedModel_Device1_DGEN1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DGEN1_Beh, + (ModelNode*) &iedModel_Device1_DGEN1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DGEN1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DGEN1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Device1_DGEN1, + (ModelNode*) &iedModel_Device1_DGEN1_NamPlt, + (ModelNode*) &iedModel_Device1_DGEN1_Health_stVal, + 0 +}; + +DataAttribute iedModel_Device1_DGEN1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_DGEN1_Health, + (ModelNode*) &iedModel_Device1_DGEN1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DGEN1_Health, + (ModelNode*) &iedModel_Device1_DGEN1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DGEN1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DGEN1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Device1_DGEN1, + (ModelNode*) &iedModel_Device1_DGEN1_OpTmh, + (ModelNode*) &iedModel_Device1_DGEN1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Device1_DGEN1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Device1_DGEN1_NamPlt, + (ModelNode*) &iedModel_Device1_DGEN1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Device1_DGEN1_NamPlt, + (ModelNode*) &iedModel_Device1_DGEN1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Device1_DGEN1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DGEN1_OpTmh = { + DataObjectModelType, + "OpTmh", + (ModelNode*) &iedModel_Device1_DGEN1, + (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt, + (ModelNode*) &iedModel_Device1_DGEN1_OpTmh_stVal, + 0 +}; + +DataAttribute iedModel_Device1_DGEN1_OpTmh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_DGEN1_OpTmh, + (ModelNode*) &iedModel_Device1_DGEN1_OpTmh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_OpTmh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DGEN1_OpTmh, + (ModelNode*) &iedModel_Device1_DGEN1_OpTmh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_OpTmh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DGEN1_OpTmh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DGEN1_GnOpSt = { + DataObjectModelType, + "GnOpSt", + (ModelNode*) &iedModel_Device1_DGEN1, + (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs, + (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt_stVal, + 0 +}; + +DataAttribute iedModel_Device1_DGEN1_GnOpSt_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt, + (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_GnOpSt_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt, + (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_GnOpSt_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DGEN1_GnOpSt, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DGEN1_OpTmsRs = { + DataObjectModelType, + "OpTmsRs", + (ModelNode*) &iedModel_Device1_DGEN1, + (ModelNode*) &iedModel_Device1_DGEN1_TotWh, + (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs_stVal, + 0 +}; + +DataAttribute iedModel_Device1_DGEN1_OpTmsRs_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs, + (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_OpTmsRs_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs, + (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_OpTmsRs_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DGEN1_OpTmsRs, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DGEN1_TotWh = { + DataObjectModelType, + "TotWh", + (ModelNode*) &iedModel_Device1_DGEN1, + NULL, + (ModelNode*) &iedModel_Device1_DGEN1_TotWh_mag, + 0 +}; + +DataAttribute iedModel_Device1_DGEN1_TotWh_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Device1_DGEN1_TotWh, + (ModelNode*) &iedModel_Device1_DGEN1_TotWh_q, + (ModelNode*) &iedModel_Device1_DGEN1_TotWh_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_TotWh_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Device1_DGEN1_TotWh_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_TotWh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DGEN1_TotWh, + (ModelNode*) &iedModel_Device1_DGEN1_TotWh_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DGEN1_TotWh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DGEN1_TotWh, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_Device1_DSCH1 = { + LogicalNodeModelType, + "DSCH1", + (ModelNode*) &iedModel_Device1, + (ModelNode*) &iedModel_Device1_MMXU1, + (ModelNode*) &iedModel_Device1_DSCH1_Mod, +}; + +DataObject iedModel_Device1_DSCH1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DSCH1_Beh, + (ModelNode*) &iedModel_Device1_DSCH1_Mod_q, + 0 +}; + +DataAttribute iedModel_Device1_DSCH1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DSCH1_Mod, + (ModelNode*) &iedModel_Device1_DSCH1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DSCH1_Mod, + (ModelNode*) &iedModel_Device1_DSCH1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Device1_DSCH1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DSCH1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DSCH1_Health, + (ModelNode*) &iedModel_Device1_DSCH1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Device1_DSCH1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_DSCH1_Beh, + (ModelNode*) &iedModel_Device1_DSCH1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DSCH1_Beh, + (ModelNode*) &iedModel_Device1_DSCH1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DSCH1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DSCH1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DSCH1_NamPlt, + (ModelNode*) &iedModel_Device1_DSCH1_Health_stVal, + 0 +}; + +DataAttribute iedModel_Device1_DSCH1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_DSCH1_Health, + (ModelNode*) &iedModel_Device1_DSCH1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DSCH1_Health, + (ModelNode*) &iedModel_Device1_DSCH1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DSCH1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DSCH1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DSCH1_SchdSt, + (ModelNode*) &iedModel_Device1_DSCH1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Device1_DSCH1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Device1_DSCH1_NamPlt, + (ModelNode*) &iedModel_Device1_DSCH1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Device1_DSCH1_NamPlt, + (ModelNode*) &iedModel_Device1_DSCH1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Device1_DSCH1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DSCH1_SchdSt = { + DataObjectModelType, + "SchdSt", + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DSCH1_SchdId, + (ModelNode*) &iedModel_Device1_DSCH1_SchdSt_stVal, + 0 +}; + +DataAttribute iedModel_Device1_DSCH1_SchdSt_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_DSCH1_SchdSt, + (ModelNode*) &iedModel_Device1_DSCH1_SchdSt_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_SchdSt_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_DSCH1_SchdSt, + (ModelNode*) &iedModel_Device1_DSCH1_SchdSt_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_SchdSt_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_DSCH1_SchdSt, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_DSCH1_SchdId = { + DataObjectModelType, + "SchdId", + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DSCH1_SchdCat, + NULL, + 0 +}; + +DataObject iedModel_Device1_DSCH1_SchdCat = { + DataObjectModelType, + "SchdCat", + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DSCH1_SchdTyp, + NULL, + 0 +}; + +DataObject iedModel_Device1_DSCH1_SchdTyp = { + DataObjectModelType, + "SchdTyp", + (ModelNode*) &iedModel_Device1_DSCH1, + (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm, + NULL, + 0 +}; + +DataObject iedModel_Device1_DSCH1_SchdAbsTm = { + DataObjectModelType, + "SchdAbsTm", + (ModelNode*) &iedModel_Device1_DSCH1, + NULL, + (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm_val, + 0 +}; + +DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_val = { + DataAttributeModelType, + "val", + (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm, + (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm_time, + NULL, + 255, + IEC61850_FC_SP, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_time = { + DataAttributeModelType, + "time", + (ModelNode*) &iedModel_Device1_DSCH1_SchdAbsTm, + NULL, + NULL, + 255, + IEC61850_FC_SP, + IEC61850_TIMESTAMP, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +LogicalNode iedModel_Device1_MMXU1 = { + LogicalNodeModelType, + "MMXU1", + (ModelNode*) &iedModel_Device1, + (ModelNode*) &iedModel_Device1_MMXU2, + (ModelNode*) &iedModel_Device1_MMXU1_Mod, +}; + +DataObject iedModel_Device1_MMXU1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Device1_MMXU1, + (ModelNode*) &iedModel_Device1_MMXU1_Beh, + (ModelNode*) &iedModel_Device1_MMXU1_Mod_q, + 0 +}; + +DataAttribute iedModel_Device1_MMXU1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_MMXU1_Mod, + (ModelNode*) &iedModel_Device1_MMXU1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_MMXU1_Mod, + (ModelNode*) &iedModel_Device1_MMXU1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Device1_MMXU1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_MMXU1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Device1_MMXU1, + (ModelNode*) &iedModel_Device1_MMXU1_Health, + (ModelNode*) &iedModel_Device1_MMXU1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Device1_MMXU1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_MMXU1_Beh, + (ModelNode*) &iedModel_Device1_MMXU1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_MMXU1_Beh, + (ModelNode*) &iedModel_Device1_MMXU1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_MMXU1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_MMXU1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Device1_MMXU1, + (ModelNode*) &iedModel_Device1_MMXU1_NamPlt, + (ModelNode*) &iedModel_Device1_MMXU1_Health_stVal, + 0 +}; + +DataAttribute iedModel_Device1_MMXU1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_MMXU1_Health, + (ModelNode*) &iedModel_Device1_MMXU1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_MMXU1_Health, + (ModelNode*) &iedModel_Device1_MMXU1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_MMXU1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_MMXU1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Device1_MMXU1, + NULL, + (ModelNode*) &iedModel_Device1_MMXU1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Device1_MMXU1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Device1_MMXU1_NamPlt, + (ModelNode*) &iedModel_Device1_MMXU1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Device1_MMXU1_NamPlt, + (ModelNode*) &iedModel_Device1_MMXU1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Device1_MMXU1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +LogicalNode iedModel_Device1_MMXU2 = { + LogicalNodeModelType, + "MMXU2", + (ModelNode*) &iedModel_Device1, + NULL, + (ModelNode*) &iedModel_Device1_MMXU2_Mod, +}; + +DataObject iedModel_Device1_MMXU2_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Device1_MMXU2, + (ModelNode*) &iedModel_Device1_MMXU2_Beh, + (ModelNode*) &iedModel_Device1_MMXU2_Mod_q, + 0 +}; + +DataAttribute iedModel_Device1_MMXU2_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_MMXU2_Mod, + (ModelNode*) &iedModel_Device1_MMXU2_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_MMXU2_Mod, + (ModelNode*) &iedModel_Device1_MMXU2_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Device1_MMXU2_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_MMXU2_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Device1_MMXU2, + (ModelNode*) &iedModel_Device1_MMXU2_Health, + (ModelNode*) &iedModel_Device1_MMXU2_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Device1_MMXU2_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_MMXU2_Beh, + (ModelNode*) &iedModel_Device1_MMXU2_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_MMXU2_Beh, + (ModelNode*) &iedModel_Device1_MMXU2_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_MMXU2_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_MMXU2_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Device1_MMXU2, + (ModelNode*) &iedModel_Device1_MMXU2_NamPlt, + (ModelNode*) &iedModel_Device1_MMXU2_Health_stVal, + 0 +}; + +DataAttribute iedModel_Device1_MMXU2_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Device1_MMXU2_Health, + (ModelNode*) &iedModel_Device1_MMXU2_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_MMXU2_Health, + (ModelNode*) &iedModel_Device1_MMXU2_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_MMXU2_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_MMXU2_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Device1_MMXU2, + (ModelNode*) &iedModel_Device1_MMXU2_TotW, + (ModelNode*) &iedModel_Device1_MMXU2_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Device1_MMXU2_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Device1_MMXU2_NamPlt, + (ModelNode*) &iedModel_Device1_MMXU2_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Device1_MMXU2_NamPlt, + (ModelNode*) &iedModel_Device1_MMXU2_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Device1_MMXU2_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Device1_MMXU2_TotW = { + DataObjectModelType, + "TotW", + (ModelNode*) &iedModel_Device1_MMXU2, + NULL, + (ModelNode*) &iedModel_Device1_MMXU2_TotW_mag, + 0 +}; + +DataAttribute iedModel_Device1_MMXU2_TotW_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Device1_MMXU2_TotW, + (ModelNode*) &iedModel_Device1_MMXU2_TotW_q, + (ModelNode*) &iedModel_Device1_MMXU2_TotW_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_TotW_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Device1_MMXU2_TotW_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_TotW_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Device1_MMXU2_TotW, + (ModelNode*) &iedModel_Device1_MMXU2_TotW_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Device1_MMXU2_TotW_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Device1_MMXU2_TotW, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +extern ReportControlBlock iedModel_Device1_LLN0_report0; + +ReportControlBlock iedModel_Device1_LLN0_report0 = {&iedModel_Device1_LLN0, "LLN0_Events_BuffRep01", "LLN0$RP$brcbEV1", true, "dataset1", 1, 25, 239, 50, 900000, NULL}; + + + + + + + +IedModel iedModel = { + "SampleIED", + &iedModel_Device1, + &iedModelds_Device1_LLN0_dataset1, + &iedModel_Device1_LLN0_report0, + NULL, + NULL, + NULL, + NULL, + NULL, + initializeValues +}; + +static void +initializeValues() +{ + +iedModel_Device1_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Device1_DGEN1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Device1_DSCH1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Device1_MMXU1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Device1_MMXU2_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); +} diff --git a/examples/server_example_simple/static_model.h b/examples/server_example_simple/static_model.h new file mode 100644 index 00000000..208787e3 --- /dev/null +++ b/examples/server_example_simple/static_model.h @@ -0,0 +1,281 @@ +/* + * static_model.h + * + * automatically generated from sampleModel_with_dataset.icd + */ + +#ifndef STATIC_MODEL_H_ +#define STATIC_MODEL_H_ + +#include +#include "iec61850_model.h" + +extern IedModel iedModel; +extern LogicalDevice iedModel_Device1; +extern LogicalNode iedModel_Device1_LLN0; +extern DataObject iedModel_Device1_LLN0_Mod; +extern DataAttribute iedModel_Device1_LLN0_Mod_q; +extern DataAttribute iedModel_Device1_LLN0_Mod_t; +extern DataAttribute iedModel_Device1_LLN0_Mod_ctlModel; +extern DataObject iedModel_Device1_LLN0_Beh; +extern DataAttribute iedModel_Device1_LLN0_Beh_stVal; +extern DataAttribute iedModel_Device1_LLN0_Beh_q; +extern DataAttribute iedModel_Device1_LLN0_Beh_t; +extern DataObject iedModel_Device1_LLN0_Health; +extern DataAttribute iedModel_Device1_LLN0_Health_stVal; +extern DataAttribute iedModel_Device1_LLN0_Health_q; +extern DataAttribute iedModel_Device1_LLN0_Health_t; +extern DataObject iedModel_Device1_LLN0_NamPlt; +extern DataAttribute iedModel_Device1_LLN0_NamPlt_vendor; +extern DataAttribute iedModel_Device1_LLN0_NamPlt_swRev; +extern DataAttribute iedModel_Device1_LLN0_NamPlt_d; +extern DataAttribute iedModel_Device1_LLN0_NamPlt_configRev; +extern DataAttribute iedModel_Device1_LLN0_NamPlt_ldNs; +extern LogicalNode iedModel_Device1_LPHD1; +extern DataObject iedModel_Device1_LPHD1_PhyNam; +extern DataAttribute iedModel_Device1_LPHD1_PhyNam_vendor; +extern DataObject iedModel_Device1_LPHD1_PhyHealth; +extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_stVal; +extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_q; +extern DataAttribute iedModel_Device1_LPHD1_PhyHealth_t; +extern DataObject iedModel_Device1_LPHD1_Proxy; +extern DataAttribute iedModel_Device1_LPHD1_Proxy_stVal; +extern DataAttribute iedModel_Device1_LPHD1_Proxy_q; +extern DataAttribute iedModel_Device1_LPHD1_Proxy_t; +extern LogicalNode iedModel_Device1_DGEN1; +extern DataObject iedModel_Device1_DGEN1_Mod; +extern DataAttribute iedModel_Device1_DGEN1_Mod_q; +extern DataAttribute iedModel_Device1_DGEN1_Mod_t; +extern DataAttribute iedModel_Device1_DGEN1_Mod_ctlModel; +extern DataObject iedModel_Device1_DGEN1_Beh; +extern DataAttribute iedModel_Device1_DGEN1_Beh_stVal; +extern DataAttribute iedModel_Device1_DGEN1_Beh_q; +extern DataAttribute iedModel_Device1_DGEN1_Beh_t; +extern DataObject iedModel_Device1_DGEN1_Health; +extern DataAttribute iedModel_Device1_DGEN1_Health_stVal; +extern DataAttribute iedModel_Device1_DGEN1_Health_q; +extern DataAttribute iedModel_Device1_DGEN1_Health_t; +extern DataObject iedModel_Device1_DGEN1_NamPlt; +extern DataAttribute iedModel_Device1_DGEN1_NamPlt_vendor; +extern DataAttribute iedModel_Device1_DGEN1_NamPlt_swRev; +extern DataAttribute iedModel_Device1_DGEN1_NamPlt_d; +extern DataObject iedModel_Device1_DGEN1_OpTmh; +extern DataAttribute iedModel_Device1_DGEN1_OpTmh_stVal; +extern DataAttribute iedModel_Device1_DGEN1_OpTmh_q; +extern DataAttribute iedModel_Device1_DGEN1_OpTmh_t; +extern DataObject iedModel_Device1_DGEN1_GnOpSt; +extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_stVal; +extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_q; +extern DataAttribute iedModel_Device1_DGEN1_GnOpSt_t; +extern DataObject iedModel_Device1_DGEN1_OpTmsRs; +extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_stVal; +extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_q; +extern DataAttribute iedModel_Device1_DGEN1_OpTmsRs_t; +extern DataObject iedModel_Device1_DGEN1_TotWh; +extern DataAttribute iedModel_Device1_DGEN1_TotWh_mag; +extern DataAttribute iedModel_Device1_DGEN1_TotWh_mag_f; +extern DataAttribute iedModel_Device1_DGEN1_TotWh_q; +extern DataAttribute iedModel_Device1_DGEN1_TotWh_t; +extern LogicalNode iedModel_Device1_DSCH1; +extern DataObject iedModel_Device1_DSCH1_Mod; +extern DataAttribute iedModel_Device1_DSCH1_Mod_q; +extern DataAttribute iedModel_Device1_DSCH1_Mod_t; +extern DataAttribute iedModel_Device1_DSCH1_Mod_ctlModel; +extern DataObject iedModel_Device1_DSCH1_Beh; +extern DataAttribute iedModel_Device1_DSCH1_Beh_stVal; +extern DataAttribute iedModel_Device1_DSCH1_Beh_q; +extern DataAttribute iedModel_Device1_DSCH1_Beh_t; +extern DataObject iedModel_Device1_DSCH1_Health; +extern DataAttribute iedModel_Device1_DSCH1_Health_stVal; +extern DataAttribute iedModel_Device1_DSCH1_Health_q; +extern DataAttribute iedModel_Device1_DSCH1_Health_t; +extern DataObject iedModel_Device1_DSCH1_NamPlt; +extern DataAttribute iedModel_Device1_DSCH1_NamPlt_vendor; +extern DataAttribute iedModel_Device1_DSCH1_NamPlt_swRev; +extern DataAttribute iedModel_Device1_DSCH1_NamPlt_d; +extern DataObject iedModel_Device1_DSCH1_SchdSt; +extern DataAttribute iedModel_Device1_DSCH1_SchdSt_stVal; +extern DataAttribute iedModel_Device1_DSCH1_SchdSt_q; +extern DataAttribute iedModel_Device1_DSCH1_SchdSt_t; +extern DataObject iedModel_Device1_DSCH1_SchdId; +extern DataObject iedModel_Device1_DSCH1_SchdCat; +extern DataObject iedModel_Device1_DSCH1_SchdTyp; +extern DataObject iedModel_Device1_DSCH1_SchdAbsTm; +extern DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_val; +extern DataAttribute iedModel_Device1_DSCH1_SchdAbsTm_time; +extern LogicalNode iedModel_Device1_MMXU1; +extern DataObject iedModel_Device1_MMXU1_Mod; +extern DataAttribute iedModel_Device1_MMXU1_Mod_q; +extern DataAttribute iedModel_Device1_MMXU1_Mod_t; +extern DataAttribute iedModel_Device1_MMXU1_Mod_ctlModel; +extern DataObject iedModel_Device1_MMXU1_Beh; +extern DataAttribute iedModel_Device1_MMXU1_Beh_stVal; +extern DataAttribute iedModel_Device1_MMXU1_Beh_q; +extern DataAttribute iedModel_Device1_MMXU1_Beh_t; +extern DataObject iedModel_Device1_MMXU1_Health; +extern DataAttribute iedModel_Device1_MMXU1_Health_stVal; +extern DataAttribute iedModel_Device1_MMXU1_Health_q; +extern DataAttribute iedModel_Device1_MMXU1_Health_t; +extern DataObject iedModel_Device1_MMXU1_NamPlt; +extern DataAttribute iedModel_Device1_MMXU1_NamPlt_vendor; +extern DataAttribute iedModel_Device1_MMXU1_NamPlt_swRev; +extern DataAttribute iedModel_Device1_MMXU1_NamPlt_d; +extern LogicalNode iedModel_Device1_MMXU2; +extern DataObject iedModel_Device1_MMXU2_Mod; +extern DataAttribute iedModel_Device1_MMXU2_Mod_q; +extern DataAttribute iedModel_Device1_MMXU2_Mod_t; +extern DataAttribute iedModel_Device1_MMXU2_Mod_ctlModel; +extern DataObject iedModel_Device1_MMXU2_Beh; +extern DataAttribute iedModel_Device1_MMXU2_Beh_stVal; +extern DataAttribute iedModel_Device1_MMXU2_Beh_q; +extern DataAttribute iedModel_Device1_MMXU2_Beh_t; +extern DataObject iedModel_Device1_MMXU2_Health; +extern DataAttribute iedModel_Device1_MMXU2_Health_stVal; +extern DataAttribute iedModel_Device1_MMXU2_Health_q; +extern DataAttribute iedModel_Device1_MMXU2_Health_t; +extern DataObject iedModel_Device1_MMXU2_NamPlt; +extern DataAttribute iedModel_Device1_MMXU2_NamPlt_vendor; +extern DataAttribute iedModel_Device1_MMXU2_NamPlt_swRev; +extern DataAttribute iedModel_Device1_MMXU2_NamPlt_d; +extern DataObject iedModel_Device1_MMXU2_TotW; +extern DataAttribute iedModel_Device1_MMXU2_TotW_mag; +extern DataAttribute iedModel_Device1_MMXU2_TotW_mag_f; +extern DataAttribute iedModel_Device1_MMXU2_TotW_q; +extern DataAttribute iedModel_Device1_MMXU2_TotW_t; + + + +#define IEDMODEL_Device1 (&iedModel_Device1) +#define IEDMODEL_Device1_LLN0 (&iedModel_Device1_LLN0) +#define IEDMODEL_Device1_LLN0_Mod (&iedModel_Device1_LLN0_Mod) +#define IEDMODEL_Device1_LLN0_Mod_q (&iedModel_Device1_LLN0_Mod_q) +#define IEDMODEL_Device1_LLN0_Mod_t (&iedModel_Device1_LLN0_Mod_t) +#define IEDMODEL_Device1_LLN0_Mod_ctlModel (&iedModel_Device1_LLN0_Mod_ctlModel) +#define IEDMODEL_Device1_LLN0_Beh (&iedModel_Device1_LLN0_Beh) +#define IEDMODEL_Device1_LLN0_Beh_stVal (&iedModel_Device1_LLN0_Beh_stVal) +#define IEDMODEL_Device1_LLN0_Beh_q (&iedModel_Device1_LLN0_Beh_q) +#define IEDMODEL_Device1_LLN0_Beh_t (&iedModel_Device1_LLN0_Beh_t) +#define IEDMODEL_Device1_LLN0_Health (&iedModel_Device1_LLN0_Health) +#define IEDMODEL_Device1_LLN0_Health_stVal (&iedModel_Device1_LLN0_Health_stVal) +#define IEDMODEL_Device1_LLN0_Health_q (&iedModel_Device1_LLN0_Health_q) +#define IEDMODEL_Device1_LLN0_Health_t (&iedModel_Device1_LLN0_Health_t) +#define IEDMODEL_Device1_LLN0_NamPlt (&iedModel_Device1_LLN0_NamPlt) +#define IEDMODEL_Device1_LLN0_NamPlt_vendor (&iedModel_Device1_LLN0_NamPlt_vendor) +#define IEDMODEL_Device1_LLN0_NamPlt_swRev (&iedModel_Device1_LLN0_NamPlt_swRev) +#define IEDMODEL_Device1_LLN0_NamPlt_d (&iedModel_Device1_LLN0_NamPlt_d) +#define IEDMODEL_Device1_LLN0_NamPlt_configRev (&iedModel_Device1_LLN0_NamPlt_configRev) +#define IEDMODEL_Device1_LLN0_NamPlt_ldNs (&iedModel_Device1_LLN0_NamPlt_ldNs) +#define IEDMODEL_Device1_LPHD1 (&iedModel_Device1_LPHD1) +#define IEDMODEL_Device1_LPHD1_PhyNam (&iedModel_Device1_LPHD1_PhyNam) +#define IEDMODEL_Device1_LPHD1_PhyNam_vendor (&iedModel_Device1_LPHD1_PhyNam_vendor) +#define IEDMODEL_Device1_LPHD1_PhyHealth (&iedModel_Device1_LPHD1_PhyHealth) +#define IEDMODEL_Device1_LPHD1_PhyHealth_stVal (&iedModel_Device1_LPHD1_PhyHealth_stVal) +#define IEDMODEL_Device1_LPHD1_PhyHealth_q (&iedModel_Device1_LPHD1_PhyHealth_q) +#define IEDMODEL_Device1_LPHD1_PhyHealth_t (&iedModel_Device1_LPHD1_PhyHealth_t) +#define IEDMODEL_Device1_LPHD1_Proxy (&iedModel_Device1_LPHD1_Proxy) +#define IEDMODEL_Device1_LPHD1_Proxy_stVal (&iedModel_Device1_LPHD1_Proxy_stVal) +#define IEDMODEL_Device1_LPHD1_Proxy_q (&iedModel_Device1_LPHD1_Proxy_q) +#define IEDMODEL_Device1_LPHD1_Proxy_t (&iedModel_Device1_LPHD1_Proxy_t) +#define IEDMODEL_Device1_DGEN1 (&iedModel_Device1_DGEN1) +#define IEDMODEL_Device1_DGEN1_Mod (&iedModel_Device1_DGEN1_Mod) +#define IEDMODEL_Device1_DGEN1_Mod_q (&iedModel_Device1_DGEN1_Mod_q) +#define IEDMODEL_Device1_DGEN1_Mod_t (&iedModel_Device1_DGEN1_Mod_t) +#define IEDMODEL_Device1_DGEN1_Mod_ctlModel (&iedModel_Device1_DGEN1_Mod_ctlModel) +#define IEDMODEL_Device1_DGEN1_Beh (&iedModel_Device1_DGEN1_Beh) +#define IEDMODEL_Device1_DGEN1_Beh_stVal (&iedModel_Device1_DGEN1_Beh_stVal) +#define IEDMODEL_Device1_DGEN1_Beh_q (&iedModel_Device1_DGEN1_Beh_q) +#define IEDMODEL_Device1_DGEN1_Beh_t (&iedModel_Device1_DGEN1_Beh_t) +#define IEDMODEL_Device1_DGEN1_Health (&iedModel_Device1_DGEN1_Health) +#define IEDMODEL_Device1_DGEN1_Health_stVal (&iedModel_Device1_DGEN1_Health_stVal) +#define IEDMODEL_Device1_DGEN1_Health_q (&iedModel_Device1_DGEN1_Health_q) +#define IEDMODEL_Device1_DGEN1_Health_t (&iedModel_Device1_DGEN1_Health_t) +#define IEDMODEL_Device1_DGEN1_NamPlt (&iedModel_Device1_DGEN1_NamPlt) +#define IEDMODEL_Device1_DGEN1_NamPlt_vendor (&iedModel_Device1_DGEN1_NamPlt_vendor) +#define IEDMODEL_Device1_DGEN1_NamPlt_swRev (&iedModel_Device1_DGEN1_NamPlt_swRev) +#define IEDMODEL_Device1_DGEN1_NamPlt_d (&iedModel_Device1_DGEN1_NamPlt_d) +#define IEDMODEL_Device1_DGEN1_OpTmh (&iedModel_Device1_DGEN1_OpTmh) +#define IEDMODEL_Device1_DGEN1_OpTmh_stVal (&iedModel_Device1_DGEN1_OpTmh_stVal) +#define IEDMODEL_Device1_DGEN1_OpTmh_q (&iedModel_Device1_DGEN1_OpTmh_q) +#define IEDMODEL_Device1_DGEN1_OpTmh_t (&iedModel_Device1_DGEN1_OpTmh_t) +#define IEDMODEL_Device1_DGEN1_GnOpSt (&iedModel_Device1_DGEN1_GnOpSt) +#define IEDMODEL_Device1_DGEN1_GnOpSt_stVal (&iedModel_Device1_DGEN1_GnOpSt_stVal) +#define IEDMODEL_Device1_DGEN1_GnOpSt_q (&iedModel_Device1_DGEN1_GnOpSt_q) +#define IEDMODEL_Device1_DGEN1_GnOpSt_t (&iedModel_Device1_DGEN1_GnOpSt_t) +#define IEDMODEL_Device1_DGEN1_OpTmsRs (&iedModel_Device1_DGEN1_OpTmsRs) +#define IEDMODEL_Device1_DGEN1_OpTmsRs_stVal (&iedModel_Device1_DGEN1_OpTmsRs_stVal) +#define IEDMODEL_Device1_DGEN1_OpTmsRs_q (&iedModel_Device1_DGEN1_OpTmsRs_q) +#define IEDMODEL_Device1_DGEN1_OpTmsRs_t (&iedModel_Device1_DGEN1_OpTmsRs_t) +#define IEDMODEL_Device1_DGEN1_TotWh (&iedModel_Device1_DGEN1_TotWh) +#define IEDMODEL_Device1_DGEN1_TotWh_mag (&iedModel_Device1_DGEN1_TotWh_mag) +#define IEDMODEL_Device1_DGEN1_TotWh_mag_f (&iedModel_Device1_DGEN1_TotWh_mag_f) +#define IEDMODEL_Device1_DGEN1_TotWh_q (&iedModel_Device1_DGEN1_TotWh_q) +#define IEDMODEL_Device1_DGEN1_TotWh_t (&iedModel_Device1_DGEN1_TotWh_t) +#define IEDMODEL_Device1_DSCH1 (&iedModel_Device1_DSCH1) +#define IEDMODEL_Device1_DSCH1_Mod (&iedModel_Device1_DSCH1_Mod) +#define IEDMODEL_Device1_DSCH1_Mod_q (&iedModel_Device1_DSCH1_Mod_q) +#define IEDMODEL_Device1_DSCH1_Mod_t (&iedModel_Device1_DSCH1_Mod_t) +#define IEDMODEL_Device1_DSCH1_Mod_ctlModel (&iedModel_Device1_DSCH1_Mod_ctlModel) +#define IEDMODEL_Device1_DSCH1_Beh (&iedModel_Device1_DSCH1_Beh) +#define IEDMODEL_Device1_DSCH1_Beh_stVal (&iedModel_Device1_DSCH1_Beh_stVal) +#define IEDMODEL_Device1_DSCH1_Beh_q (&iedModel_Device1_DSCH1_Beh_q) +#define IEDMODEL_Device1_DSCH1_Beh_t (&iedModel_Device1_DSCH1_Beh_t) +#define IEDMODEL_Device1_DSCH1_Health (&iedModel_Device1_DSCH1_Health) +#define IEDMODEL_Device1_DSCH1_Health_stVal (&iedModel_Device1_DSCH1_Health_stVal) +#define IEDMODEL_Device1_DSCH1_Health_q (&iedModel_Device1_DSCH1_Health_q) +#define IEDMODEL_Device1_DSCH1_Health_t (&iedModel_Device1_DSCH1_Health_t) +#define IEDMODEL_Device1_DSCH1_NamPlt (&iedModel_Device1_DSCH1_NamPlt) +#define IEDMODEL_Device1_DSCH1_NamPlt_vendor (&iedModel_Device1_DSCH1_NamPlt_vendor) +#define IEDMODEL_Device1_DSCH1_NamPlt_swRev (&iedModel_Device1_DSCH1_NamPlt_swRev) +#define IEDMODEL_Device1_DSCH1_NamPlt_d (&iedModel_Device1_DSCH1_NamPlt_d) +#define IEDMODEL_Device1_DSCH1_SchdSt (&iedModel_Device1_DSCH1_SchdSt) +#define IEDMODEL_Device1_DSCH1_SchdSt_stVal (&iedModel_Device1_DSCH1_SchdSt_stVal) +#define IEDMODEL_Device1_DSCH1_SchdSt_q (&iedModel_Device1_DSCH1_SchdSt_q) +#define IEDMODEL_Device1_DSCH1_SchdSt_t (&iedModel_Device1_DSCH1_SchdSt_t) +#define IEDMODEL_Device1_DSCH1_SchdId (&iedModel_Device1_DSCH1_SchdId) +#define IEDMODEL_Device1_DSCH1_SchdCat (&iedModel_Device1_DSCH1_SchdCat) +#define IEDMODEL_Device1_DSCH1_SchdTyp (&iedModel_Device1_DSCH1_SchdTyp) +#define IEDMODEL_Device1_DSCH1_SchdAbsTm (&iedModel_Device1_DSCH1_SchdAbsTm) +#define IEDMODEL_Device1_DSCH1_SchdAbsTm_val (&iedModel_Device1_DSCH1_SchdAbsTm_val) +#define IEDMODEL_Device1_DSCH1_SchdAbsTm_time (&iedModel_Device1_DSCH1_SchdAbsTm_time) +#define IEDMODEL_Device1_MMXU1 (&iedModel_Device1_MMXU1) +#define IEDMODEL_Device1_MMXU1_Mod (&iedModel_Device1_MMXU1_Mod) +#define IEDMODEL_Device1_MMXU1_Mod_q (&iedModel_Device1_MMXU1_Mod_q) +#define IEDMODEL_Device1_MMXU1_Mod_t (&iedModel_Device1_MMXU1_Mod_t) +#define IEDMODEL_Device1_MMXU1_Mod_ctlModel (&iedModel_Device1_MMXU1_Mod_ctlModel) +#define IEDMODEL_Device1_MMXU1_Beh (&iedModel_Device1_MMXU1_Beh) +#define IEDMODEL_Device1_MMXU1_Beh_stVal (&iedModel_Device1_MMXU1_Beh_stVal) +#define IEDMODEL_Device1_MMXU1_Beh_q (&iedModel_Device1_MMXU1_Beh_q) +#define IEDMODEL_Device1_MMXU1_Beh_t (&iedModel_Device1_MMXU1_Beh_t) +#define IEDMODEL_Device1_MMXU1_Health (&iedModel_Device1_MMXU1_Health) +#define IEDMODEL_Device1_MMXU1_Health_stVal (&iedModel_Device1_MMXU1_Health_stVal) +#define IEDMODEL_Device1_MMXU1_Health_q (&iedModel_Device1_MMXU1_Health_q) +#define IEDMODEL_Device1_MMXU1_Health_t (&iedModel_Device1_MMXU1_Health_t) +#define IEDMODEL_Device1_MMXU1_NamPlt (&iedModel_Device1_MMXU1_NamPlt) +#define IEDMODEL_Device1_MMXU1_NamPlt_vendor (&iedModel_Device1_MMXU1_NamPlt_vendor) +#define IEDMODEL_Device1_MMXU1_NamPlt_swRev (&iedModel_Device1_MMXU1_NamPlt_swRev) +#define IEDMODEL_Device1_MMXU1_NamPlt_d (&iedModel_Device1_MMXU1_NamPlt_d) +#define IEDMODEL_Device1_MMXU2 (&iedModel_Device1_MMXU2) +#define IEDMODEL_Device1_MMXU2_Mod (&iedModel_Device1_MMXU2_Mod) +#define IEDMODEL_Device1_MMXU2_Mod_q (&iedModel_Device1_MMXU2_Mod_q) +#define IEDMODEL_Device1_MMXU2_Mod_t (&iedModel_Device1_MMXU2_Mod_t) +#define IEDMODEL_Device1_MMXU2_Mod_ctlModel (&iedModel_Device1_MMXU2_Mod_ctlModel) +#define IEDMODEL_Device1_MMXU2_Beh (&iedModel_Device1_MMXU2_Beh) +#define IEDMODEL_Device1_MMXU2_Beh_stVal (&iedModel_Device1_MMXU2_Beh_stVal) +#define IEDMODEL_Device1_MMXU2_Beh_q (&iedModel_Device1_MMXU2_Beh_q) +#define IEDMODEL_Device1_MMXU2_Beh_t (&iedModel_Device1_MMXU2_Beh_t) +#define IEDMODEL_Device1_MMXU2_Health (&iedModel_Device1_MMXU2_Health) +#define IEDMODEL_Device1_MMXU2_Health_stVal (&iedModel_Device1_MMXU2_Health_stVal) +#define IEDMODEL_Device1_MMXU2_Health_q (&iedModel_Device1_MMXU2_Health_q) +#define IEDMODEL_Device1_MMXU2_Health_t (&iedModel_Device1_MMXU2_Health_t) +#define IEDMODEL_Device1_MMXU2_NamPlt (&iedModel_Device1_MMXU2_NamPlt) +#define IEDMODEL_Device1_MMXU2_NamPlt_vendor (&iedModel_Device1_MMXU2_NamPlt_vendor) +#define IEDMODEL_Device1_MMXU2_NamPlt_swRev (&iedModel_Device1_MMXU2_NamPlt_swRev) +#define IEDMODEL_Device1_MMXU2_NamPlt_d (&iedModel_Device1_MMXU2_NamPlt_d) +#define IEDMODEL_Device1_MMXU2_TotW (&iedModel_Device1_MMXU2_TotW) +#define IEDMODEL_Device1_MMXU2_TotW_mag (&iedModel_Device1_MMXU2_TotW_mag) +#define IEDMODEL_Device1_MMXU2_TotW_mag_f (&iedModel_Device1_MMXU2_TotW_mag_f) +#define IEDMODEL_Device1_MMXU2_TotW_q (&iedModel_Device1_MMXU2_TotW_q) +#define IEDMODEL_Device1_MMXU2_TotW_t (&iedModel_Device1_MMXU2_TotW_t) + +#endif /* STATIC_MODEL_H_ */ + diff --git a/examples/server_example_write_handler/CMakeLists.txt b/examples/server_example_write_handler/CMakeLists.txt new file mode 100644 index 00000000..ebcf8d13 --- /dev/null +++ b/examples/server_example_write_handler/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( + . +) + +set(server_example_SRCS + server_example_write_handler.c + static_model.c +) + +IF(WIN32) +set_source_files_properties(${server_example_SRCS} + PROPERTIES LANGUAGE CXX) +ENDIF(WIN32) + +add_executable(server_example_write_handler + ${server_example_SRCS} +) + +target_link_libraries(server_example_write_handler + iec61850 +) diff --git a/examples/server_example_write_handler/Makefile b/examples/server_example_write_handler/Makefile new file mode 100644 index 00000000..639e88ef --- /dev/null +++ b/examples/server_example_write_handler/Makefile @@ -0,0 +1,25 @@ +LIBIEC_HOME=../.. + +PROJECT_BINARY_NAME = server_example_write_handler +PROJECT_SOURCES = server_example_write_handler.c +PROJECT_SOURCES += static_model.c + +PROJECT_ICD_FILE = complexModel.icd + +include $(LIBIEC_HOME)/make/target_system.mk +include $(LIBIEC_HOME)/make/stack_includes.mk + +all: $(PROJECT_BINARY_NAME) + +include $(LIBIEC_HOME)/make/common_targets.mk + +model: $(PROJECT_ICD_FILE) + java -jar $(LIBIEC_HOME)/tools/model_generator/genmodel.jar $(PROJECT_ICD_FILE) + +$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME) + $(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS) + +clean: + rm -f $(PROJECT_BINARY_NAME) + + diff --git a/examples/server_example_write_handler/complexModel.icd b/examples/server_example_write_handler/complexModel.icd new file mode 100644 index 00000000..9d5ccea7 --- /dev/null +++ b/examples/server_example_write_handler/complexModel.icd @@ -0,0 +1,347 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + + + + + + + + status-only + + + + + + + status-only + + + + + + + + + status-only + + + + + + + + status-only + + + + + + + status-only + + + + + + + + + status-only + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + status-only + direct-with-normal-security + sbo-with-normal-security + direct-with-enhanced-security + sbo-with-enhanced-security + + + + + rad + sr + m + Gy + q + °C + Sv + F + C + S + H + V + kg + ohm + J + N + Hz + Ix + Lm + Wb + T + W + Pa + s + m² + m³ + m/s + m/s² + m³/s + m/m³ + M + kg/m³ + m²/s + A + W/m K + J/K + ppm + 1/s + rad/s + K + VA + Watts + VAr + theta + cos(theta) + Vs + V² + As + A² + mol + A²t + VAh + Wh + VArh + V/Hz + cd + deg + + + Yocto + Zepto + Atto + Femto + Pico + Nano + Micro + Milli + Centi + Deci + zeroNoValue + Deca + Hecto + Kilo + Mega + Giga + Tera + Petra + Exa + Zetta + Yotta + + + normal + high + low + high-high + low-low + + + diff --git a/examples/server_example_write_handler/server_example_write_handler.c b/examples/server_example_write_handler/server_example_write_handler.c new file mode 100644 index 00000000..0666e817 --- /dev/null +++ b/examples/server_example_write_handler/server_example_write_handler.c @@ -0,0 +1,78 @@ +/* + * server_example_write_handler.c + */ + +#include "iec61850_server.h" +#include "hal_thread.h" +#include +#include +#include + +#include "../server_example_write_handler/static_model.h" + +/* import IEC 61850 device model created from SCL-File */ +extern IedModel iedModel; + +static int running = 0; +static IedServer iedServer = NULL; + +void sigint_handler(int signalId) +{ + running = 0; +} + +static MmsDataAccessError +writeAccessHandler (DataAttribute* dataAttribute, MmsValue* value, ClientConnection connection, void* parameter) +{ + if (dataAttribute == IEDMODEL_Inverter_ZINV1_OutVarSet_setMag_f) { + + float newValue = MmsValue_toFloat(value); + + printf("New value for OutVarSet_setMag_f = %f\n", newValue); + + /* Check if value is inside of valid range */ + if ((newValue >= 0.f) && (newValue <= 1000.1f)) + return DATA_ACCESS_ERROR_SUCCESS; + else + return DATA_ACCESS_ERROR_OBJECT_VALUE_INVALID; + + } + + return DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; +} + +int main(int argc, char** argv) { + + iedServer = IedServer_create(&iedModel); + + /* MMS server will be instructed to start listening to client connections. */ + IedServer_start(iedServer, 102); + + /* Don't allow access to SP variables by default */ + IedServer_setWriteAccessPolicy(iedServer, IEC61850_FC_SP, ACCESS_POLICY_DENY); + + /* Instruct the server that we will be informed if a clients writes to a + * certain variables we are interested in. + */ + IedServer_handleWriteAccess(iedServer, IEDMODEL_Inverter_ZINV1_OutVarSet_setMag_f, writeAccessHandler, NULL); + + if (!IedServer_isRunning(iedServer)) { + printf("Starting server failed! Exit.\n"); + IedServer_destroy(iedServer); + exit(-1); + } + + running = 1; + + signal(SIGINT, sigint_handler); + + while (running) { + Thread_sleep(1); + } + + /* stop MMS server - close TCP server socket and all client sockets */ + IedServer_stop(iedServer); + + /* Cleanup - free all resources */ + IedServer_destroy(iedServer); +} /* main() */ diff --git a/examples/server_example_write_handler/static_model.c b/examples/server_example_write_handler/static_model.c new file mode 100644 index 00000000..c0dba265 --- /dev/null +++ b/examples/server_example_write_handler/static_model.c @@ -0,0 +1,3621 @@ +/* + * static_model.c + * + * automatically generated from complexModel.icd + */ +#include "../server_example_write_handler/static_model.h" + +static void initializeValues(); + +extern DataSet iedModelds_Inverter_LLN0_dataset1; + + +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3; +extern DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4; + +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda0 = { + "Inverter", + false, + "LLN0$ST$Mod$q", + -1, + NULL, + NULL, + &iedModelds_Inverter_LLN0_dataset1_fcda1 +}; + +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda1 = { + "Battery", + false, + "LLN0$ST$Mod$q", + -1, + NULL, + NULL, + &iedModelds_Inverter_LLN0_dataset1_fcda2 +}; + +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda2 = { + "Inverter", + false, + "MMXU1$ST$Mod$q", + -1, + NULL, + NULL, + &iedModelds_Inverter_LLN0_dataset1_fcda3 +}; + +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda3 = { + "Inverter", + false, + "MMXU1$CF$Mod$ctlModel", + -1, + NULL, + NULL, + &iedModelds_Inverter_LLN0_dataset1_fcda4 +}; + +DataSetEntry iedModelds_Inverter_LLN0_dataset1_fcda4 = { + "Inverter", + false, + "MMXU1$MX$TotW$mag", + -1, + NULL, + NULL, + NULL +}; + +DataSet iedModelds_Inverter_LLN0_dataset1 = { + "Inverter", + "LLN0$dataset1", + 5, + &iedModelds_Inverter_LLN0_dataset1_fcda0, + NULL +}; + +LogicalDevice iedModel_Inverter = { + LogicalDeviceModelType, + "Inverter", + (ModelNode*) &iedModel, + (ModelNode*) &iedModel_Battery, + (ModelNode*) &iedModel_Inverter_LLN0 +}; + +LogicalNode iedModel_Inverter_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_Inverter, + (ModelNode*) &iedModel_Inverter_LPHD1, + (ModelNode*) &iedModel_Inverter_LLN0_Mod, +}; + +DataObject iedModel_Inverter_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Inverter_LLN0, + (ModelNode*) &iedModel_Inverter_LLN0_Beh, + (ModelNode*) &iedModel_Inverter_LLN0_Mod_q, + 0 +}; + +DataAttribute iedModel_Inverter_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_LLN0_Mod, + (ModelNode*) &iedModel_Inverter_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_LLN0_Mod, + (ModelNode*) &iedModel_Inverter_LLN0_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Inverter_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_LLN0_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Inverter_LLN0, + (ModelNode*) &iedModel_Inverter_LLN0_Health, + (ModelNode*) &iedModel_Inverter_LLN0_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Inverter_LLN0_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Inverter_LLN0_Beh, + (ModelNode*) &iedModel_Inverter_LLN0_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_LLN0_Beh, + (ModelNode*) &iedModel_Inverter_LLN0_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_LLN0_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_LLN0_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Inverter_LLN0, + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, + (ModelNode*) &iedModel_Inverter_LLN0_Health_stVal, + 0 +}; + +DataAttribute iedModel_Inverter_LLN0_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Inverter_LLN0_Health, + (ModelNode*) &iedModel_Inverter_LLN0_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_LLN0_Health, + (ModelNode*) &iedModel_Inverter_LLN0_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_LLN0_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_LLN0_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Inverter_LLN0, + NULL, + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_configRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev = { + DataAttributeModelType, + "configRev", + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt_ldNs, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs = { + DataAttributeModelType, + "ldNs", + (ModelNode*) &iedModel_Inverter_LLN0_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +LogicalNode iedModel_Inverter_LPHD1 = { + LogicalNodeModelType, + "LPHD1", + (ModelNode*) &iedModel_Inverter, + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam, +}; + +DataObject iedModel_Inverter_LPHD1_PhyNam = { + DataObjectModelType, + "PhyNam", + (ModelNode*) &iedModel_Inverter_LPHD1, + (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam_vendor, + 0 +}; + +DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Inverter_LPHD1_PhyNam, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_LPHD1_PhyHealth = { + DataObjectModelType, + "PhyHealth", + (ModelNode*) &iedModel_Inverter_LPHD1, + (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, + (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_stVal, + 0 +}; + +DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_LPHD1_PhyHealth, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_LPHD1_Proxy = { + DataObjectModelType, + "Proxy", + (ModelNode*) &iedModel_Inverter_LPHD1, + NULL, + (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_stVal, + 0 +}; + +DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, + (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LPHD1_Proxy_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, + (ModelNode*) &iedModel_Inverter_LPHD1_Proxy_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_LPHD1_Proxy_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_Inverter_ZINV1 = { + LogicalNodeModelType, + "ZINV1", + (ModelNode*) &iedModel_Inverter, + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_ZINV1_Mod, +}; + +DataObject iedModel_Inverter_ZINV1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_ZINV1_Beh, + (ModelNode*) &iedModel_Inverter_ZINV1_Mod_q, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_ZINV1_Mod, + (ModelNode*) &iedModel_Inverter_ZINV1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_ZINV1_Mod, + (ModelNode*) &iedModel_Inverter_ZINV1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Inverter_ZINV1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_ZINV1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_ZINV1_Health, + (ModelNode*) &iedModel_Inverter_ZINV1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Inverter_ZINV1_Beh, + (ModelNode*) &iedModel_Inverter_ZINV1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_ZINV1_Beh, + (ModelNode*) &iedModel_Inverter_ZINV1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_ZINV1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_ZINV1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, + (ModelNode*) &iedModel_Inverter_ZINV1_Health_stVal, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Inverter_ZINV1_Health, + (ModelNode*) &iedModel_Inverter_ZINV1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_ZINV1_Health, + (ModelNode*) &iedModel_Inverter_ZINV1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_ZINV1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_ZINV1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, + (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, + (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, + (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Inverter_ZINV1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_ZINV1_WRtg = { + DataObjectModelType, + "WRtg", + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag = { + DataAttributeModelType, + "setMag", + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units, + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag_f, + 0, + IEC61850_FC_SP, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_setMag, + NULL, + NULL, + 0, + IEC61850_FC_SP, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_WRtg_units = { + DataAttributeModelType, + "units", + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg, + NULL, + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units_SIUnit, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit = { + DataAttributeModelType, + "SIUnit", + (ModelNode*) &iedModel_Inverter_ZINV1_WRtg_units, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_ZINV1_VarRtg = { + DataObjectModelType, + "VarRtg", + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp, + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag = { + DataAttributeModelType, + "setMag", + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units, + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag_f, + 0, + IEC61850_FC_SP, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_setMag, + NULL, + NULL, + 0, + IEC61850_FC_SP, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_VarRtg_units = { + DataAttributeModelType, + "units", + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg, + NULL, + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units_SIUnit, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit = { + DataAttributeModelType, + "SIUnit", + (ModelNode*) &iedModel_Inverter_ZINV1_VarRtg_units, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_ZINV1_ACTyp = { + DataObjectModelType, + "ACTyp", + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, + (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp_setVal, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal = { + DataAttributeModelType, + "setVal", + (ModelNode*) &iedModel_Inverter_ZINV1_ACTyp, + NULL, + NULL, + 0, + IEC61850_FC_SP, + IEC61850_INT32, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_ZINV1_OutWSet = { + DataObjectModelType, + "OutWSet", + (ModelNode*) &iedModel_Inverter_ZINV1, + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag = { + DataAttributeModelType, + "setMag", + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units, + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag_f, + 0, + IEC61850_FC_SP, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_setMag, + NULL, + NULL, + 0, + IEC61850_FC_SP, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_OutWSet_units = { + DataAttributeModelType, + "units", + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet, + NULL, + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units_SIUnit, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit = { + DataAttributeModelType, + "SIUnit", + (ModelNode*) &iedModel_Inverter_ZINV1_OutWSet_units, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_ZINV1_OutVarSet = { + DataObjectModelType, + "OutVarSet", + (ModelNode*) &iedModel_Inverter_ZINV1, + NULL, + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag, + 0 +}; + +DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag = { + DataAttributeModelType, + "setMag", + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units, + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag_f, + 0, + IEC61850_FC_SP, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_setMag, + NULL, + NULL, + 0, + IEC61850_FC_SP, + IEC61850_FLOAT32, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units = { + DataAttributeModelType, + "units", + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet, + NULL, + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit, + 0, + IEC61850_FC_CF, + IEC61850_CONSTRUCTED, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit = { + DataAttributeModelType, + "SIUnit", + (ModelNode*) &iedModel_Inverter_ZINV1_OutVarSet_units, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +LogicalNode iedModel_Inverter_MMXU1 = { + LogicalNodeModelType, + "MMXU1", + (ModelNode*) &iedModel_Inverter, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_Mod, +}; + +DataObject iedModel_Inverter_MMXU1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_Beh, + (ModelNode*) &iedModel_Inverter_MMXU1_Mod_q, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_Mod, + (ModelNode*) &iedModel_Inverter_MMXU1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_Mod, + (ModelNode*) &iedModel_Inverter_MMXU1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Inverter_MMXU1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_Health, + (ModelNode*) &iedModel_Inverter_MMXU1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Inverter_MMXU1_Beh, + (ModelNode*) &iedModel_Inverter_MMXU1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_Beh, + (ModelNode*) &iedModel_Inverter_MMXU1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, + (ModelNode*) &iedModel_Inverter_MMXU1_Health_stVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Inverter_MMXU1_Health, + (ModelNode*) &iedModel_Inverter_MMXU1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_Health, + (ModelNode*) &iedModel_Inverter_MMXU1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_TotW, + (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, + (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, + (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Inverter_MMXU1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_TotW = { + DataObjectModelType, + "TotW", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, + (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_TotW_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_TotW, + (ModelNode*) &iedModel_Inverter_MMXU1_TotW_q, + (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_TotW_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotW_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_TotW, + (ModelNode*) &iedModel_Inverter_MMXU1_TotW_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotW_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_TotW, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_TotVAr = { + DataObjectModelType, + "TotVAr", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_q, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotVAr_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotVAr_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_TotVAr, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_TotVA = { + DataObjectModelType, + "TotVA", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_Hz, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_TotVA_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_q, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotVA_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_TotVA_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_TotVA, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_Hz = { + DataObjectModelType, + "Hz", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV, + (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_Hz_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_Hz, + (ModelNode*) &iedModel_Inverter_MMXU1_Hz_q, + (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_Hz_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Hz_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_Hz, + (ModelNode*) &iedModel_Inverter_MMXU1_Hz_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_Hz_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_Hz, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_PhV = { + DataObjectModelType, + "PhV", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_A, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, + 0 +}; + +DataObject iedModel_Inverter_MMXU1_PhV_phsA = { + DataObjectModelType, + "phsA", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_q, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsA, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_PhV_phsB = { + DataObjectModelType, + "phsB", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_q, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsB, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_PhV_phsC = { + DataObjectModelType, + "phsC", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_q, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_phsC, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_PhV_neut = { + DataObjectModelType, + "neut", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_q, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_PhV_neut, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_A = { + DataObjectModelType, + "A", + (ModelNode*) &iedModel_Inverter_MMXU1, + (ModelNode*) &iedModel_Inverter_MMXU1_W, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, + 0 +}; + +DataObject iedModel_Inverter_MMXU1_A_phsA = { + DataObjectModelType, + "phsA", + (ModelNode*) &iedModel_Inverter_MMXU1_A, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_q, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsA_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsA_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsA, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_A_phsB = { + DataObjectModelType, + "phsB", + (ModelNode*) &iedModel_Inverter_MMXU1_A, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_q, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsB_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsB_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsB, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_A_phsC = { + DataObjectModelType, + "phsC", + (ModelNode*) &iedModel_Inverter_MMXU1_A, + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_q, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsC_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_phsC_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_A_phsC, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_A_neut = { + DataObjectModelType, + "neut", + (ModelNode*) &iedModel_Inverter_MMXU1_A, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_q, + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_neut_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_A_neut_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_A_neut, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_W = { + DataObjectModelType, + "W", + (ModelNode*) &iedModel_Inverter_MMXU1, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, + 0 +}; + +DataObject iedModel_Inverter_MMXU1_W_phsA = { + DataObjectModelType, + "phsA", + (ModelNode*) &iedModel_Inverter_MMXU1_W, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_q, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsA_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsA_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsA, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_W_phsB = { + DataObjectModelType, + "phsB", + (ModelNode*) &iedModel_Inverter_MMXU1_W, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_q, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsB_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsB_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsB, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Inverter_MMXU1_W_phsC = { + DataObjectModelType, + "phsC", + (ModelNode*) &iedModel_Inverter_MMXU1_W, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal, + 0 +}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal = { + DataAttributeModelType, + "cVal", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_q, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal, + NULL, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_cVal_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsC_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Inverter_MMXU1_W_phsC_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Inverter_MMXU1_W_phsC, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + + +LogicalDevice iedModel_Battery = { + LogicalDeviceModelType, + "Battery", + (ModelNode*) &iedModel, + (ModelNode*) &iedModel_Physical_Measurements, + (ModelNode*) &iedModel_Battery_LLN0 +}; + +LogicalNode iedModel_Battery_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_Battery, + (ModelNode*) &iedModel_Battery_LPHD1, + (ModelNode*) &iedModel_Battery_LLN0_Mod, +}; + +DataObject iedModel_Battery_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Battery_LLN0, + (ModelNode*) &iedModel_Battery_LLN0_Beh, + (ModelNode*) &iedModel_Battery_LLN0_Mod_q, + 0 +}; + +DataAttribute iedModel_Battery_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_LLN0_Mod, + (ModelNode*) &iedModel_Battery_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_LLN0_Mod, + (ModelNode*) &iedModel_Battery_LLN0_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Battery_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_LLN0_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Battery_LLN0, + (ModelNode*) &iedModel_Battery_LLN0_Health, + (ModelNode*) &iedModel_Battery_LLN0_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Battery_LLN0_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Battery_LLN0_Beh, + (ModelNode*) &iedModel_Battery_LLN0_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_LLN0_Beh, + (ModelNode*) &iedModel_Battery_LLN0_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_LLN0_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_LLN0_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Battery_LLN0, + (ModelNode*) &iedModel_Battery_LLN0_NamPlt, + (ModelNode*) &iedModel_Battery_LLN0_Health_stVal, + 0 +}; + +DataAttribute iedModel_Battery_LLN0_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Battery_LLN0_Health, + (ModelNode*) &iedModel_Battery_LLN0_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_LLN0_Health, + (ModelNode*) &iedModel_Battery_LLN0_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_LLN0_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_LLN0_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Battery_LLN0, + NULL, + (ModelNode*) &iedModel_Battery_LLN0_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Battery_LLN0_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Battery_LLN0_NamPlt, + (ModelNode*) &iedModel_Battery_LLN0_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Battery_LLN0_NamPlt, + (ModelNode*) &iedModel_Battery_LLN0_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Battery_LLN0_NamPlt, + (ModelNode*) &iedModel_Battery_LLN0_NamPlt_configRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_NamPlt_configRev = { + DataAttributeModelType, + "configRev", + (ModelNode*) &iedModel_Battery_LLN0_NamPlt, + (ModelNode*) &iedModel_Battery_LLN0_NamPlt_ldNs, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs = { + DataAttributeModelType, + "ldNs", + (ModelNode*) &iedModel_Battery_LLN0_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +LogicalNode iedModel_Battery_LPHD1 = { + LogicalNodeModelType, + "LPHD1", + (ModelNode*) &iedModel_Battery, + (ModelNode*) &iedModel_Battery_ZBAT1, + (ModelNode*) &iedModel_Battery_LPHD1_PhyNam, +}; + +DataObject iedModel_Battery_LPHD1_PhyNam = { + DataObjectModelType, + "PhyNam", + (ModelNode*) &iedModel_Battery_LPHD1, + (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Battery_LPHD1_PhyNam_vendor, + 0 +}; + +DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Battery_LPHD1_PhyNam, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_LPHD1_PhyHealth = { + DataObjectModelType, + "PhyHealth", + (ModelNode*) &iedModel_Battery_LPHD1, + (ModelNode*) &iedModel_Battery_LPHD1_Proxy, + (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_stVal, + 0 +}; + +DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LPHD1_PhyHealth_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LPHD1_PhyHealth_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_LPHD1_PhyHealth, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_LPHD1_Proxy = { + DataObjectModelType, + "Proxy", + (ModelNode*) &iedModel_Battery_LPHD1, + NULL, + (ModelNode*) &iedModel_Battery_LPHD1_Proxy_stVal, + 0 +}; + +DataAttribute iedModel_Battery_LPHD1_Proxy_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Battery_LPHD1_Proxy, + (ModelNode*) &iedModel_Battery_LPHD1_Proxy_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LPHD1_Proxy_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_LPHD1_Proxy, + (ModelNode*) &iedModel_Battery_LPHD1_Proxy_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_LPHD1_Proxy_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_Battery_ZBAT1 = { + LogicalNodeModelType, + "ZBAT1", + (ModelNode*) &iedModel_Battery, + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBAT1_Mod, +}; + +DataObject iedModel_Battery_ZBAT1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Battery_ZBAT1, + (ModelNode*) &iedModel_Battery_ZBAT1_Beh, + (ModelNode*) &iedModel_Battery_ZBAT1_Mod_q, + 0 +}; + +DataAttribute iedModel_Battery_ZBAT1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBAT1_Mod, + (ModelNode*) &iedModel_Battery_ZBAT1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBAT1_Mod, + (ModelNode*) &iedModel_Battery_ZBAT1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Battery_ZBAT1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBAT1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Battery_ZBAT1, + (ModelNode*) &iedModel_Battery_ZBAT1_Health, + (ModelNode*) &iedModel_Battery_ZBAT1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Battery_ZBAT1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Battery_ZBAT1_Beh, + (ModelNode*) &iedModel_Battery_ZBAT1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBAT1_Beh, + (ModelNode*) &iedModel_Battery_ZBAT1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBAT1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBAT1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Battery_ZBAT1, + (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, + (ModelNode*) &iedModel_Battery_ZBAT1_Health_stVal, + 0 +}; + +DataAttribute iedModel_Battery_ZBAT1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Battery_ZBAT1_Health, + (ModelNode*) &iedModel_Battery_ZBAT1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBAT1_Health, + (ModelNode*) &iedModel_Battery_ZBAT1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBAT1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBAT1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Battery_ZBAT1, + (ModelNode*) &iedModel_Battery_ZBAT1_Vol, + (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, + (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, + (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Battery_ZBAT1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBAT1_Vol = { + DataObjectModelType, + "Vol", + (ModelNode*) &iedModel_Battery_ZBAT1, + (ModelNode*) &iedModel_Battery_ZBAT1_Amp, + (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag, + 0 +}; + +DataAttribute iedModel_Battery_ZBAT1_Vol_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Battery_ZBAT1_Vol, + (ModelNode*) &iedModel_Battery_ZBAT1_Vol_q, + (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Battery_ZBAT1_Vol_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Vol_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBAT1_Vol, + (ModelNode*) &iedModel_Battery_ZBAT1_Vol_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Vol_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBAT1_Vol, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBAT1_Amp = { + DataObjectModelType, + "Amp", + (ModelNode*) &iedModel_Battery_ZBAT1, + NULL, + (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag, + 0 +}; + +DataAttribute iedModel_Battery_ZBAT1_Amp_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Battery_ZBAT1_Amp, + (ModelNode*) &iedModel_Battery_ZBAT1_Amp_q, + (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Battery_ZBAT1_Amp_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Amp_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBAT1_Amp, + (ModelNode*) &iedModel_Battery_ZBAT1_Amp_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBAT1_Amp_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBAT1_Amp, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +LogicalNode iedModel_Battery_ZBTC1 = { + LogicalNodeModelType, + "ZBTC1", + (ModelNode*) &iedModel_Battery, + NULL, + (ModelNode*) &iedModel_Battery_ZBTC1_Mod, +}; + +DataObject iedModel_Battery_ZBTC1_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBTC1_Beh, + (ModelNode*) &iedModel_Battery_ZBTC1_Mod_q, + 0 +}; + +DataAttribute iedModel_Battery_ZBTC1_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBTC1_Mod, + (ModelNode*) &iedModel_Battery_ZBTC1_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBTC1_Mod, + (ModelNode*) &iedModel_Battery_ZBTC1_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Battery_ZBTC1_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBTC1_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBTC1_Health, + (ModelNode*) &iedModel_Battery_ZBTC1_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Battery_ZBTC1_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Battery_ZBTC1_Beh, + (ModelNode*) &iedModel_Battery_ZBTC1_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBTC1_Beh, + (ModelNode*) &iedModel_Battery_ZBTC1_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBTC1_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBTC1_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, + (ModelNode*) &iedModel_Battery_ZBTC1_Health_stVal, + 0 +}; + +DataAttribute iedModel_Battery_ZBTC1_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Battery_ZBTC1_Health, + (ModelNode*) &iedModel_Battery_ZBTC1_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBTC1_Health, + (ModelNode*) &iedModel_Battery_ZBTC1_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBTC1_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBTC1_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBTC1_BatChaSt, + (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, + (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, + (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Battery_ZBTC1_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBTC1_BatChaSt = { + DataObjectModelType, + "BatChaSt", + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBTC1_BatChaPwr, + NULL, + 0 +}; + +DataObject iedModel_Battery_ZBTC1_BatChaPwr = { + DataObjectModelType, + "BatChaPwr", + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBTC1_BatChaMod, + NULL, + 0 +}; + +DataObject iedModel_Battery_ZBTC1_BatChaMod = { + DataObjectModelType, + "BatChaMod", + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, + NULL, + 0 +}; + +DataObject iedModel_Battery_ZBTC1_ChaV = { + DataObjectModelType, + "ChaV", + (ModelNode*) &iedModel_Battery_ZBTC1, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag, + 0 +}; + +DataAttribute iedModel_Battery_ZBTC1_ChaV_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_q, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_ChaV_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_ChaV_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBTC1_ChaV, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Battery_ZBTC1_ChaA = { + DataObjectModelType, + "ChaA", + (ModelNode*) &iedModel_Battery_ZBTC1, + NULL, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag, + 0 +}; + +DataAttribute iedModel_Battery_ZBTC1_ChaA_mag = { + DataAttributeModelType, + "mag", + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_q, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag_f, + 0, + IEC61850_FC_MX, + IEC61850_CONSTRUCTED, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f = { + DataAttributeModelType, + "f", + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_mag, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_FLOAT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_ChaA_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA_t, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Battery_ZBTC1_ChaA_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Battery_ZBTC1_ChaA, + NULL, + NULL, + 0, + IEC61850_FC_MX, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + + +LogicalDevice iedModel_Physical_Measurements = { + LogicalDeviceModelType, + "Physical_Measurements", + (ModelNode*) &iedModel, + NULL, + (ModelNode*) &iedModel_Physical_Measurements_LLN0 +}; + +LogicalNode iedModel_Physical_Measurements_LLN0 = { + LogicalNodeModelType, + "LLN0", + (ModelNode*) &iedModel_Physical_Measurements, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, +}; + +DataObject iedModel_Physical_Measurements_LLN0_Mod = { + DataObjectModelType, + "Mod", + (ModelNode*) &iedModel_Physical_Measurements_LLN0, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_q, + 0 +}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod_ctlModel, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel = { + DataAttributeModelType, + "ctlModel", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Mod, + NULL, + NULL, + 0, + IEC61850_FC_CF, + IEC61850_ENUMERATED, + 0, + NULL, + 0}; + +DataObject iedModel_Physical_Measurements_LLN0_Beh = { + DataObjectModelType, + "Beh", + (ModelNode*) &iedModel_Physical_Measurements_LLN0, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_stVal, + 0 +}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Beh, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Physical_Measurements_LLN0_Health = { + DataObjectModelType, + "Health", + (ModelNode*) &iedModel_Physical_Measurements_LLN0, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_stVal, + 0 +}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Health_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_Health_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_Health, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Physical_Measurements_LLN0_NamPlt = { + DataObjectModelType, + "NamPlt", + (ModelNode*) &iedModel_Physical_Measurements_LLN0, + NULL, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_vendor, + 0 +}; + +DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_swRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev = { + DataAttributeModelType, + "swRev", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_d, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d = { + DataAttributeModelType, + "d", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_configRev, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev = { + DataAttributeModelType, + "configRev", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt_ldNs, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs = { + DataAttributeModelType, + "ldNs", + (ModelNode*) &iedModel_Physical_Measurements_LLN0_NamPlt, + NULL, + NULL, + 0, + IEC61850_FC_EX, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +LogicalNode iedModel_Physical_Measurements_LPHD1 = { + LogicalNodeModelType, + "LPHD1", + (ModelNode*) &iedModel_Physical_Measurements, + NULL, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam, +}; + +DataObject iedModel_Physical_Measurements_LPHD1_PhyNam = { + DataObjectModelType, + "PhyNam", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam_vendor, + 0 +}; + +DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor = { + DataAttributeModelType, + "vendor", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyNam, + NULL, + NULL, + 0, + IEC61850_FC_DC, + IEC61850_VISIBLE_STRING_255, + 0, + NULL, + 0}; + +DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth = { + DataObjectModelType, + "PhyHealth", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal, + 0 +}; + +DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_INT32, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_PhyHealth, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +DataObject iedModel_Physical_Measurements_LPHD1_Proxy = { + DataObjectModelType, + "Proxy", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1, + NULL, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_stVal, + 0 +}; + +DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal = { + DataAttributeModelType, + "stVal", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_q, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_BOOLEAN, + 0 + TRG_OPT_DATA_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q = { + DataAttributeModelType, + "q", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy_t, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_QUALITY, + 0 + TRG_OPT_QUALITY_CHANGED, + NULL, + 0}; + +DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t = { + DataAttributeModelType, + "t", + (ModelNode*) &iedModel_Physical_Measurements_LPHD1_Proxy, + NULL, + NULL, + 0, + IEC61850_FC_ST, + IEC61850_TIMESTAMP, + 0, + NULL, + 0}; + +extern ReportControlBlock iedModel_Inverter_LLN0_report0; + +ReportControlBlock iedModel_Inverter_LLN0_report0 = {&iedModel_Inverter_LLN0, "rcb101", "ID", false, "dataset1", 0, 19, 32, 0, 0, NULL}; + + + + + + + +IedModel iedModel = { + "ied1", + &iedModel_Inverter, + &iedModelds_Inverter_LLN0_dataset1, + &iedModel_Inverter_LLN0_report0, + NULL, + NULL, + NULL, + NULL, + NULL, + initializeValues +}; + +static void +initializeValues() +{ + +iedModel_Inverter_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Inverter_ZINV1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Inverter_MMXU1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Battery_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Battery_ZBAT1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Battery_ZBTC1_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); + +iedModel_Physical_Measurements_LLN0_Mod_ctlModel.mmsValue = MmsValue_newIntegerFromInt32(0); +} diff --git a/examples/server_example_write_handler/static_model.h b/examples/server_example_write_handler/static_model.h new file mode 100644 index 00000000..34623f80 --- /dev/null +++ b/examples/server_example_write_handler/static_model.h @@ -0,0 +1,609 @@ +/* + * static_model.h + * + * automatically generated from complexModel.icd + */ + +#ifndef STATIC_MODEL_H_ +#define STATIC_MODEL_H_ + +#include +#include "iec61850_model.h" + +extern IedModel iedModel; +extern LogicalDevice iedModel_Inverter; +extern LogicalNode iedModel_Inverter_LLN0; +extern DataObject iedModel_Inverter_LLN0_Mod; +extern DataAttribute iedModel_Inverter_LLN0_Mod_q; +extern DataAttribute iedModel_Inverter_LLN0_Mod_t; +extern DataAttribute iedModel_Inverter_LLN0_Mod_ctlModel; +extern DataObject iedModel_Inverter_LLN0_Beh; +extern DataAttribute iedModel_Inverter_LLN0_Beh_stVal; +extern DataAttribute iedModel_Inverter_LLN0_Beh_q; +extern DataAttribute iedModel_Inverter_LLN0_Beh_t; +extern DataObject iedModel_Inverter_LLN0_Health; +extern DataAttribute iedModel_Inverter_LLN0_Health_stVal; +extern DataAttribute iedModel_Inverter_LLN0_Health_q; +extern DataAttribute iedModel_Inverter_LLN0_Health_t; +extern DataObject iedModel_Inverter_LLN0_NamPlt; +extern DataAttribute iedModel_Inverter_LLN0_NamPlt_vendor; +extern DataAttribute iedModel_Inverter_LLN0_NamPlt_swRev; +extern DataAttribute iedModel_Inverter_LLN0_NamPlt_d; +extern DataAttribute iedModel_Inverter_LLN0_NamPlt_configRev; +extern DataAttribute iedModel_Inverter_LLN0_NamPlt_ldNs; +extern LogicalNode iedModel_Inverter_LPHD1; +extern DataObject iedModel_Inverter_LPHD1_PhyNam; +extern DataAttribute iedModel_Inverter_LPHD1_PhyNam_vendor; +extern DataObject iedModel_Inverter_LPHD1_PhyHealth; +extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_stVal; +extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_q; +extern DataAttribute iedModel_Inverter_LPHD1_PhyHealth_t; +extern DataObject iedModel_Inverter_LPHD1_Proxy; +extern DataAttribute iedModel_Inverter_LPHD1_Proxy_stVal; +extern DataAttribute iedModel_Inverter_LPHD1_Proxy_q; +extern DataAttribute iedModel_Inverter_LPHD1_Proxy_t; +extern LogicalNode iedModel_Inverter_ZINV1; +extern DataObject iedModel_Inverter_ZINV1_Mod; +extern DataAttribute iedModel_Inverter_ZINV1_Mod_q; +extern DataAttribute iedModel_Inverter_ZINV1_Mod_t; +extern DataAttribute iedModel_Inverter_ZINV1_Mod_ctlModel; +extern DataObject iedModel_Inverter_ZINV1_Beh; +extern DataAttribute iedModel_Inverter_ZINV1_Beh_stVal; +extern DataAttribute iedModel_Inverter_ZINV1_Beh_q; +extern DataAttribute iedModel_Inverter_ZINV1_Beh_t; +extern DataObject iedModel_Inverter_ZINV1_Health; +extern DataAttribute iedModel_Inverter_ZINV1_Health_stVal; +extern DataAttribute iedModel_Inverter_ZINV1_Health_q; +extern DataAttribute iedModel_Inverter_ZINV1_Health_t; +extern DataObject iedModel_Inverter_ZINV1_NamPlt; +extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_vendor; +extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_swRev; +extern DataAttribute iedModel_Inverter_ZINV1_NamPlt_d; +extern DataObject iedModel_Inverter_ZINV1_WRtg; +extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag; +extern DataAttribute iedModel_Inverter_ZINV1_WRtg_setMag_f; +extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units; +extern DataAttribute iedModel_Inverter_ZINV1_WRtg_units_SIUnit; +extern DataObject iedModel_Inverter_ZINV1_VarRtg; +extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag; +extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_setMag_f; +extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units; +extern DataAttribute iedModel_Inverter_ZINV1_VarRtg_units_SIUnit; +extern DataObject iedModel_Inverter_ZINV1_ACTyp; +extern DataAttribute iedModel_Inverter_ZINV1_ACTyp_setVal; +extern DataObject iedModel_Inverter_ZINV1_OutWSet; +extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag; +extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_setMag_f; +extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units; +extern DataAttribute iedModel_Inverter_ZINV1_OutWSet_units_SIUnit; +extern DataObject iedModel_Inverter_ZINV1_OutVarSet; +extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag; +extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_setMag_f; +extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units; +extern DataAttribute iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit; +extern LogicalNode iedModel_Inverter_MMXU1; +extern DataObject iedModel_Inverter_MMXU1_Mod; +extern DataAttribute iedModel_Inverter_MMXU1_Mod_q; +extern DataAttribute iedModel_Inverter_MMXU1_Mod_t; +extern DataAttribute iedModel_Inverter_MMXU1_Mod_ctlModel; +extern DataObject iedModel_Inverter_MMXU1_Beh; +extern DataAttribute iedModel_Inverter_MMXU1_Beh_stVal; +extern DataAttribute iedModel_Inverter_MMXU1_Beh_q; +extern DataAttribute iedModel_Inverter_MMXU1_Beh_t; +extern DataObject iedModel_Inverter_MMXU1_Health; +extern DataAttribute iedModel_Inverter_MMXU1_Health_stVal; +extern DataAttribute iedModel_Inverter_MMXU1_Health_q; +extern DataAttribute iedModel_Inverter_MMXU1_Health_t; +extern DataObject iedModel_Inverter_MMXU1_NamPlt; +extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_vendor; +extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_swRev; +extern DataAttribute iedModel_Inverter_MMXU1_NamPlt_d; +extern DataObject iedModel_Inverter_MMXU1_TotW; +extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag; +extern DataAttribute iedModel_Inverter_MMXU1_TotW_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_TotW_q; +extern DataAttribute iedModel_Inverter_MMXU1_TotW_t; +extern DataObject iedModel_Inverter_MMXU1_TotVAr; +extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag; +extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_q; +extern DataAttribute iedModel_Inverter_MMXU1_TotVAr_t; +extern DataObject iedModel_Inverter_MMXU1_TotVA; +extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag; +extern DataAttribute iedModel_Inverter_MMXU1_TotVA_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_TotVA_q; +extern DataAttribute iedModel_Inverter_MMXU1_TotVA_t; +extern DataObject iedModel_Inverter_MMXU1_Hz; +extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag; +extern DataAttribute iedModel_Inverter_MMXU1_Hz_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_Hz_q; +extern DataAttribute iedModel_Inverter_MMXU1_Hz_t; +extern DataObject iedModel_Inverter_MMXU1_PhV; +extern DataObject iedModel_Inverter_MMXU1_PhV_phsA; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_q; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsA_t; +extern DataObject iedModel_Inverter_MMXU1_PhV_phsB; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_q; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsB_t; +extern DataObject iedModel_Inverter_MMXU1_PhV_phsC; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_q; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_phsC_t; +extern DataObject iedModel_Inverter_MMXU1_PhV_neut; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_q; +extern DataAttribute iedModel_Inverter_MMXU1_PhV_neut_t; +extern DataObject iedModel_Inverter_MMXU1_A; +extern DataObject iedModel_Inverter_MMXU1_A_phsA; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_q; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsA_t; +extern DataObject iedModel_Inverter_MMXU1_A_phsB; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_q; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsB_t; +extern DataObject iedModel_Inverter_MMXU1_A_phsC; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_q; +extern DataAttribute iedModel_Inverter_MMXU1_A_phsC_t; +extern DataObject iedModel_Inverter_MMXU1_A_neut; +extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_A_neut_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_A_neut_q; +extern DataAttribute iedModel_Inverter_MMXU1_A_neut_t; +extern DataObject iedModel_Inverter_MMXU1_W; +extern DataObject iedModel_Inverter_MMXU1_W_phsA; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_q; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsA_t; +extern DataObject iedModel_Inverter_MMXU1_W_phsB; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_q; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsB_t; +extern DataObject iedModel_Inverter_MMXU1_W_phsC; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_q; +extern DataAttribute iedModel_Inverter_MMXU1_W_phsC_t; +extern LogicalDevice iedModel_Battery; +extern LogicalNode iedModel_Battery_LLN0; +extern DataObject iedModel_Battery_LLN0_Mod; +extern DataAttribute iedModel_Battery_LLN0_Mod_q; +extern DataAttribute iedModel_Battery_LLN0_Mod_t; +extern DataAttribute iedModel_Battery_LLN0_Mod_ctlModel; +extern DataObject iedModel_Battery_LLN0_Beh; +extern DataAttribute iedModel_Battery_LLN0_Beh_stVal; +extern DataAttribute iedModel_Battery_LLN0_Beh_q; +extern DataAttribute iedModel_Battery_LLN0_Beh_t; +extern DataObject iedModel_Battery_LLN0_Health; +extern DataAttribute iedModel_Battery_LLN0_Health_stVal; +extern DataAttribute iedModel_Battery_LLN0_Health_q; +extern DataAttribute iedModel_Battery_LLN0_Health_t; +extern DataObject iedModel_Battery_LLN0_NamPlt; +extern DataAttribute iedModel_Battery_LLN0_NamPlt_vendor; +extern DataAttribute iedModel_Battery_LLN0_NamPlt_swRev; +extern DataAttribute iedModel_Battery_LLN0_NamPlt_d; +extern DataAttribute iedModel_Battery_LLN0_NamPlt_configRev; +extern DataAttribute iedModel_Battery_LLN0_NamPlt_ldNs; +extern LogicalNode iedModel_Battery_LPHD1; +extern DataObject iedModel_Battery_LPHD1_PhyNam; +extern DataAttribute iedModel_Battery_LPHD1_PhyNam_vendor; +extern DataObject iedModel_Battery_LPHD1_PhyHealth; +extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_stVal; +extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_q; +extern DataAttribute iedModel_Battery_LPHD1_PhyHealth_t; +extern DataObject iedModel_Battery_LPHD1_Proxy; +extern DataAttribute iedModel_Battery_LPHD1_Proxy_stVal; +extern DataAttribute iedModel_Battery_LPHD1_Proxy_q; +extern DataAttribute iedModel_Battery_LPHD1_Proxy_t; +extern LogicalNode iedModel_Battery_ZBAT1; +extern DataObject iedModel_Battery_ZBAT1_Mod; +extern DataAttribute iedModel_Battery_ZBAT1_Mod_q; +extern DataAttribute iedModel_Battery_ZBAT1_Mod_t; +extern DataAttribute iedModel_Battery_ZBAT1_Mod_ctlModel; +extern DataObject iedModel_Battery_ZBAT1_Beh; +extern DataAttribute iedModel_Battery_ZBAT1_Beh_stVal; +extern DataAttribute iedModel_Battery_ZBAT1_Beh_q; +extern DataAttribute iedModel_Battery_ZBAT1_Beh_t; +extern DataObject iedModel_Battery_ZBAT1_Health; +extern DataAttribute iedModel_Battery_ZBAT1_Health_stVal; +extern DataAttribute iedModel_Battery_ZBAT1_Health_q; +extern DataAttribute iedModel_Battery_ZBAT1_Health_t; +extern DataObject iedModel_Battery_ZBAT1_NamPlt; +extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_vendor; +extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_swRev; +extern DataAttribute iedModel_Battery_ZBAT1_NamPlt_d; +extern DataObject iedModel_Battery_ZBAT1_Vol; +extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag; +extern DataAttribute iedModel_Battery_ZBAT1_Vol_mag_f; +extern DataAttribute iedModel_Battery_ZBAT1_Vol_q; +extern DataAttribute iedModel_Battery_ZBAT1_Vol_t; +extern DataObject iedModel_Battery_ZBAT1_Amp; +extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag; +extern DataAttribute iedModel_Battery_ZBAT1_Amp_mag_f; +extern DataAttribute iedModel_Battery_ZBAT1_Amp_q; +extern DataAttribute iedModel_Battery_ZBAT1_Amp_t; +extern LogicalNode iedModel_Battery_ZBTC1; +extern DataObject iedModel_Battery_ZBTC1_Mod; +extern DataAttribute iedModel_Battery_ZBTC1_Mod_q; +extern DataAttribute iedModel_Battery_ZBTC1_Mod_t; +extern DataAttribute iedModel_Battery_ZBTC1_Mod_ctlModel; +extern DataObject iedModel_Battery_ZBTC1_Beh; +extern DataAttribute iedModel_Battery_ZBTC1_Beh_stVal; +extern DataAttribute iedModel_Battery_ZBTC1_Beh_q; +extern DataAttribute iedModel_Battery_ZBTC1_Beh_t; +extern DataObject iedModel_Battery_ZBTC1_Health; +extern DataAttribute iedModel_Battery_ZBTC1_Health_stVal; +extern DataAttribute iedModel_Battery_ZBTC1_Health_q; +extern DataAttribute iedModel_Battery_ZBTC1_Health_t; +extern DataObject iedModel_Battery_ZBTC1_NamPlt; +extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_vendor; +extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_swRev; +extern DataAttribute iedModel_Battery_ZBTC1_NamPlt_d; +extern DataObject iedModel_Battery_ZBTC1_BatChaSt; +extern DataObject iedModel_Battery_ZBTC1_BatChaPwr; +extern DataObject iedModel_Battery_ZBTC1_BatChaMod; +extern DataObject iedModel_Battery_ZBTC1_ChaV; +extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag; +extern DataAttribute iedModel_Battery_ZBTC1_ChaV_mag_f; +extern DataAttribute iedModel_Battery_ZBTC1_ChaV_q; +extern DataAttribute iedModel_Battery_ZBTC1_ChaV_t; +extern DataObject iedModel_Battery_ZBTC1_ChaA; +extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag; +extern DataAttribute iedModel_Battery_ZBTC1_ChaA_mag_f; +extern DataAttribute iedModel_Battery_ZBTC1_ChaA_q; +extern DataAttribute iedModel_Battery_ZBTC1_ChaA_t; +extern LogicalDevice iedModel_Physical_Measurements; +extern LogicalNode iedModel_Physical_Measurements_LLN0; +extern DataObject iedModel_Physical_Measurements_LLN0_Mod; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_q; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_t; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Mod_ctlModel; +extern DataObject iedModel_Physical_Measurements_LLN0_Beh; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_stVal; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_q; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Beh_t; +extern DataObject iedModel_Physical_Measurements_LLN0_Health; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_stVal; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_q; +extern DataAttribute iedModel_Physical_Measurements_LLN0_Health_t; +extern DataObject iedModel_Physical_Measurements_LLN0_NamPlt; +extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_vendor; +extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_swRev; +extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_d; +extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_configRev; +extern DataAttribute iedModel_Physical_Measurements_LLN0_NamPlt_ldNs; +extern LogicalNode iedModel_Physical_Measurements_LPHD1; +extern DataObject iedModel_Physical_Measurements_LPHD1_PhyNam; +extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyNam_vendor; +extern DataObject iedModel_Physical_Measurements_LPHD1_PhyHealth; +extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal; +extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_q; +extern DataAttribute iedModel_Physical_Measurements_LPHD1_PhyHealth_t; +extern DataObject iedModel_Physical_Measurements_LPHD1_Proxy; +extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_stVal; +extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_q; +extern DataAttribute iedModel_Physical_Measurements_LPHD1_Proxy_t; + + + +#define IEDMODEL_Inverter (&iedModel_Inverter) +#define IEDMODEL_Inverter_LLN0 (&iedModel_Inverter_LLN0) +#define IEDMODEL_Inverter_LLN0_Mod (&iedModel_Inverter_LLN0_Mod) +#define IEDMODEL_Inverter_LLN0_Mod_q (&iedModel_Inverter_LLN0_Mod_q) +#define IEDMODEL_Inverter_LLN0_Mod_t (&iedModel_Inverter_LLN0_Mod_t) +#define IEDMODEL_Inverter_LLN0_Mod_ctlModel (&iedModel_Inverter_LLN0_Mod_ctlModel) +#define IEDMODEL_Inverter_LLN0_Beh (&iedModel_Inverter_LLN0_Beh) +#define IEDMODEL_Inverter_LLN0_Beh_stVal (&iedModel_Inverter_LLN0_Beh_stVal) +#define IEDMODEL_Inverter_LLN0_Beh_q (&iedModel_Inverter_LLN0_Beh_q) +#define IEDMODEL_Inverter_LLN0_Beh_t (&iedModel_Inverter_LLN0_Beh_t) +#define IEDMODEL_Inverter_LLN0_Health (&iedModel_Inverter_LLN0_Health) +#define IEDMODEL_Inverter_LLN0_Health_stVal (&iedModel_Inverter_LLN0_Health_stVal) +#define IEDMODEL_Inverter_LLN0_Health_q (&iedModel_Inverter_LLN0_Health_q) +#define IEDMODEL_Inverter_LLN0_Health_t (&iedModel_Inverter_LLN0_Health_t) +#define IEDMODEL_Inverter_LLN0_NamPlt (&iedModel_Inverter_LLN0_NamPlt) +#define IEDMODEL_Inverter_LLN0_NamPlt_vendor (&iedModel_Inverter_LLN0_NamPlt_vendor) +#define IEDMODEL_Inverter_LLN0_NamPlt_swRev (&iedModel_Inverter_LLN0_NamPlt_swRev) +#define IEDMODEL_Inverter_LLN0_NamPlt_d (&iedModel_Inverter_LLN0_NamPlt_d) +#define IEDMODEL_Inverter_LLN0_NamPlt_configRev (&iedModel_Inverter_LLN0_NamPlt_configRev) +#define IEDMODEL_Inverter_LLN0_NamPlt_ldNs (&iedModel_Inverter_LLN0_NamPlt_ldNs) +#define IEDMODEL_Inverter_LPHD1 (&iedModel_Inverter_LPHD1) +#define IEDMODEL_Inverter_LPHD1_PhyNam (&iedModel_Inverter_LPHD1_PhyNam) +#define IEDMODEL_Inverter_LPHD1_PhyNam_vendor (&iedModel_Inverter_LPHD1_PhyNam_vendor) +#define IEDMODEL_Inverter_LPHD1_PhyHealth (&iedModel_Inverter_LPHD1_PhyHealth) +#define IEDMODEL_Inverter_LPHD1_PhyHealth_stVal (&iedModel_Inverter_LPHD1_PhyHealth_stVal) +#define IEDMODEL_Inverter_LPHD1_PhyHealth_q (&iedModel_Inverter_LPHD1_PhyHealth_q) +#define IEDMODEL_Inverter_LPHD1_PhyHealth_t (&iedModel_Inverter_LPHD1_PhyHealth_t) +#define IEDMODEL_Inverter_LPHD1_Proxy (&iedModel_Inverter_LPHD1_Proxy) +#define IEDMODEL_Inverter_LPHD1_Proxy_stVal (&iedModel_Inverter_LPHD1_Proxy_stVal) +#define IEDMODEL_Inverter_LPHD1_Proxy_q (&iedModel_Inverter_LPHD1_Proxy_q) +#define IEDMODEL_Inverter_LPHD1_Proxy_t (&iedModel_Inverter_LPHD1_Proxy_t) +#define IEDMODEL_Inverter_ZINV1 (&iedModel_Inverter_ZINV1) +#define IEDMODEL_Inverter_ZINV1_Mod (&iedModel_Inverter_ZINV1_Mod) +#define IEDMODEL_Inverter_ZINV1_Mod_q (&iedModel_Inverter_ZINV1_Mod_q) +#define IEDMODEL_Inverter_ZINV1_Mod_t (&iedModel_Inverter_ZINV1_Mod_t) +#define IEDMODEL_Inverter_ZINV1_Mod_ctlModel (&iedModel_Inverter_ZINV1_Mod_ctlModel) +#define IEDMODEL_Inverter_ZINV1_Beh (&iedModel_Inverter_ZINV1_Beh) +#define IEDMODEL_Inverter_ZINV1_Beh_stVal (&iedModel_Inverter_ZINV1_Beh_stVal) +#define IEDMODEL_Inverter_ZINV1_Beh_q (&iedModel_Inverter_ZINV1_Beh_q) +#define IEDMODEL_Inverter_ZINV1_Beh_t (&iedModel_Inverter_ZINV1_Beh_t) +#define IEDMODEL_Inverter_ZINV1_Health (&iedModel_Inverter_ZINV1_Health) +#define IEDMODEL_Inverter_ZINV1_Health_stVal (&iedModel_Inverter_ZINV1_Health_stVal) +#define IEDMODEL_Inverter_ZINV1_Health_q (&iedModel_Inverter_ZINV1_Health_q) +#define IEDMODEL_Inverter_ZINV1_Health_t (&iedModel_Inverter_ZINV1_Health_t) +#define IEDMODEL_Inverter_ZINV1_NamPlt (&iedModel_Inverter_ZINV1_NamPlt) +#define IEDMODEL_Inverter_ZINV1_NamPlt_vendor (&iedModel_Inverter_ZINV1_NamPlt_vendor) +#define IEDMODEL_Inverter_ZINV1_NamPlt_swRev (&iedModel_Inverter_ZINV1_NamPlt_swRev) +#define IEDMODEL_Inverter_ZINV1_NamPlt_d (&iedModel_Inverter_ZINV1_NamPlt_d) +#define IEDMODEL_Inverter_ZINV1_WRtg (&iedModel_Inverter_ZINV1_WRtg) +#define IEDMODEL_Inverter_ZINV1_WRtg_setMag (&iedModel_Inverter_ZINV1_WRtg_setMag) +#define IEDMODEL_Inverter_ZINV1_WRtg_setMag_f (&iedModel_Inverter_ZINV1_WRtg_setMag_f) +#define IEDMODEL_Inverter_ZINV1_WRtg_units (&iedModel_Inverter_ZINV1_WRtg_units) +#define IEDMODEL_Inverter_ZINV1_WRtg_units_SIUnit (&iedModel_Inverter_ZINV1_WRtg_units_SIUnit) +#define IEDMODEL_Inverter_ZINV1_VarRtg (&iedModel_Inverter_ZINV1_VarRtg) +#define IEDMODEL_Inverter_ZINV1_VarRtg_setMag (&iedModel_Inverter_ZINV1_VarRtg_setMag) +#define IEDMODEL_Inverter_ZINV1_VarRtg_setMag_f (&iedModel_Inverter_ZINV1_VarRtg_setMag_f) +#define IEDMODEL_Inverter_ZINV1_VarRtg_units (&iedModel_Inverter_ZINV1_VarRtg_units) +#define IEDMODEL_Inverter_ZINV1_VarRtg_units_SIUnit (&iedModel_Inverter_ZINV1_VarRtg_units_SIUnit) +#define IEDMODEL_Inverter_ZINV1_ACTyp (&iedModel_Inverter_ZINV1_ACTyp) +#define IEDMODEL_Inverter_ZINV1_ACTyp_setVal (&iedModel_Inverter_ZINV1_ACTyp_setVal) +#define IEDMODEL_Inverter_ZINV1_OutWSet (&iedModel_Inverter_ZINV1_OutWSet) +#define IEDMODEL_Inverter_ZINV1_OutWSet_setMag (&iedModel_Inverter_ZINV1_OutWSet_setMag) +#define IEDMODEL_Inverter_ZINV1_OutWSet_setMag_f (&iedModel_Inverter_ZINV1_OutWSet_setMag_f) +#define IEDMODEL_Inverter_ZINV1_OutWSet_units (&iedModel_Inverter_ZINV1_OutWSet_units) +#define IEDMODEL_Inverter_ZINV1_OutWSet_units_SIUnit (&iedModel_Inverter_ZINV1_OutWSet_units_SIUnit) +#define IEDMODEL_Inverter_ZINV1_OutVarSet (&iedModel_Inverter_ZINV1_OutVarSet) +#define IEDMODEL_Inverter_ZINV1_OutVarSet_setMag (&iedModel_Inverter_ZINV1_OutVarSet_setMag) +#define IEDMODEL_Inverter_ZINV1_OutVarSet_setMag_f (&iedModel_Inverter_ZINV1_OutVarSet_setMag_f) +#define IEDMODEL_Inverter_ZINV1_OutVarSet_units (&iedModel_Inverter_ZINV1_OutVarSet_units) +#define IEDMODEL_Inverter_ZINV1_OutVarSet_units_SIUnit (&iedModel_Inverter_ZINV1_OutVarSet_units_SIUnit) +#define IEDMODEL_Inverter_MMXU1 (&iedModel_Inverter_MMXU1) +#define IEDMODEL_Inverter_MMXU1_Mod (&iedModel_Inverter_MMXU1_Mod) +#define IEDMODEL_Inverter_MMXU1_Mod_q (&iedModel_Inverter_MMXU1_Mod_q) +#define IEDMODEL_Inverter_MMXU1_Mod_t (&iedModel_Inverter_MMXU1_Mod_t) +#define IEDMODEL_Inverter_MMXU1_Mod_ctlModel (&iedModel_Inverter_MMXU1_Mod_ctlModel) +#define IEDMODEL_Inverter_MMXU1_Beh (&iedModel_Inverter_MMXU1_Beh) +#define IEDMODEL_Inverter_MMXU1_Beh_stVal (&iedModel_Inverter_MMXU1_Beh_stVal) +#define IEDMODEL_Inverter_MMXU1_Beh_q (&iedModel_Inverter_MMXU1_Beh_q) +#define IEDMODEL_Inverter_MMXU1_Beh_t (&iedModel_Inverter_MMXU1_Beh_t) +#define IEDMODEL_Inverter_MMXU1_Health (&iedModel_Inverter_MMXU1_Health) +#define IEDMODEL_Inverter_MMXU1_Health_stVal (&iedModel_Inverter_MMXU1_Health_stVal) +#define IEDMODEL_Inverter_MMXU1_Health_q (&iedModel_Inverter_MMXU1_Health_q) +#define IEDMODEL_Inverter_MMXU1_Health_t (&iedModel_Inverter_MMXU1_Health_t) +#define IEDMODEL_Inverter_MMXU1_NamPlt (&iedModel_Inverter_MMXU1_NamPlt) +#define IEDMODEL_Inverter_MMXU1_NamPlt_vendor (&iedModel_Inverter_MMXU1_NamPlt_vendor) +#define IEDMODEL_Inverter_MMXU1_NamPlt_swRev (&iedModel_Inverter_MMXU1_NamPlt_swRev) +#define IEDMODEL_Inverter_MMXU1_NamPlt_d (&iedModel_Inverter_MMXU1_NamPlt_d) +#define IEDMODEL_Inverter_MMXU1_TotW (&iedModel_Inverter_MMXU1_TotW) +#define IEDMODEL_Inverter_MMXU1_TotW_mag (&iedModel_Inverter_MMXU1_TotW_mag) +#define IEDMODEL_Inverter_MMXU1_TotW_mag_f (&iedModel_Inverter_MMXU1_TotW_mag_f) +#define IEDMODEL_Inverter_MMXU1_TotW_q (&iedModel_Inverter_MMXU1_TotW_q) +#define IEDMODEL_Inverter_MMXU1_TotW_t (&iedModel_Inverter_MMXU1_TotW_t) +#define IEDMODEL_Inverter_MMXU1_TotVAr (&iedModel_Inverter_MMXU1_TotVAr) +#define IEDMODEL_Inverter_MMXU1_TotVAr_mag (&iedModel_Inverter_MMXU1_TotVAr_mag) +#define IEDMODEL_Inverter_MMXU1_TotVAr_mag_f (&iedModel_Inverter_MMXU1_TotVAr_mag_f) +#define IEDMODEL_Inverter_MMXU1_TotVAr_q (&iedModel_Inverter_MMXU1_TotVAr_q) +#define IEDMODEL_Inverter_MMXU1_TotVAr_t (&iedModel_Inverter_MMXU1_TotVAr_t) +#define IEDMODEL_Inverter_MMXU1_TotVA (&iedModel_Inverter_MMXU1_TotVA) +#define IEDMODEL_Inverter_MMXU1_TotVA_mag (&iedModel_Inverter_MMXU1_TotVA_mag) +#define IEDMODEL_Inverter_MMXU1_TotVA_mag_f (&iedModel_Inverter_MMXU1_TotVA_mag_f) +#define IEDMODEL_Inverter_MMXU1_TotVA_q (&iedModel_Inverter_MMXU1_TotVA_q) +#define IEDMODEL_Inverter_MMXU1_TotVA_t (&iedModel_Inverter_MMXU1_TotVA_t) +#define IEDMODEL_Inverter_MMXU1_Hz (&iedModel_Inverter_MMXU1_Hz) +#define IEDMODEL_Inverter_MMXU1_Hz_mag (&iedModel_Inverter_MMXU1_Hz_mag) +#define IEDMODEL_Inverter_MMXU1_Hz_mag_f (&iedModel_Inverter_MMXU1_Hz_mag_f) +#define IEDMODEL_Inverter_MMXU1_Hz_q (&iedModel_Inverter_MMXU1_Hz_q) +#define IEDMODEL_Inverter_MMXU1_Hz_t (&iedModel_Inverter_MMXU1_Hz_t) +#define IEDMODEL_Inverter_MMXU1_PhV (&iedModel_Inverter_MMXU1_PhV) +#define IEDMODEL_Inverter_MMXU1_PhV_phsA (&iedModel_Inverter_MMXU1_PhV_phsA) +#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal (&iedModel_Inverter_MMXU1_PhV_phsA_cVal) +#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_PhV_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsA_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_PhV_phsA_q (&iedModel_Inverter_MMXU1_PhV_phsA_q) +#define IEDMODEL_Inverter_MMXU1_PhV_phsA_t (&iedModel_Inverter_MMXU1_PhV_phsA_t) +#define IEDMODEL_Inverter_MMXU1_PhV_phsB (&iedModel_Inverter_MMXU1_PhV_phsB) +#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal (&iedModel_Inverter_MMXU1_PhV_phsB_cVal) +#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_PhV_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsB_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_PhV_phsB_q (&iedModel_Inverter_MMXU1_PhV_phsB_q) +#define IEDMODEL_Inverter_MMXU1_PhV_phsB_t (&iedModel_Inverter_MMXU1_PhV_phsB_t) +#define IEDMODEL_Inverter_MMXU1_PhV_phsC (&iedModel_Inverter_MMXU1_PhV_phsC) +#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal (&iedModel_Inverter_MMXU1_PhV_phsC_cVal) +#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal_mag (&iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_PhV_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_phsC_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_PhV_phsC_q (&iedModel_Inverter_MMXU1_PhV_phsC_q) +#define IEDMODEL_Inverter_MMXU1_PhV_phsC_t (&iedModel_Inverter_MMXU1_PhV_phsC_t) +#define IEDMODEL_Inverter_MMXU1_PhV_neut (&iedModel_Inverter_MMXU1_PhV_neut) +#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal (&iedModel_Inverter_MMXU1_PhV_neut_cVal) +#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal_mag (&iedModel_Inverter_MMXU1_PhV_neut_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_PhV_neut_cVal_mag_f (&iedModel_Inverter_MMXU1_PhV_neut_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_PhV_neut_q (&iedModel_Inverter_MMXU1_PhV_neut_q) +#define IEDMODEL_Inverter_MMXU1_PhV_neut_t (&iedModel_Inverter_MMXU1_PhV_neut_t) +#define IEDMODEL_Inverter_MMXU1_A (&iedModel_Inverter_MMXU1_A) +#define IEDMODEL_Inverter_MMXU1_A_phsA (&iedModel_Inverter_MMXU1_A_phsA) +#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal (&iedModel_Inverter_MMXU1_A_phsA_cVal) +#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal_mag (&iedModel_Inverter_MMXU1_A_phsA_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_A_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsA_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_A_phsA_q (&iedModel_Inverter_MMXU1_A_phsA_q) +#define IEDMODEL_Inverter_MMXU1_A_phsA_t (&iedModel_Inverter_MMXU1_A_phsA_t) +#define IEDMODEL_Inverter_MMXU1_A_phsB (&iedModel_Inverter_MMXU1_A_phsB) +#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal (&iedModel_Inverter_MMXU1_A_phsB_cVal) +#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal_mag (&iedModel_Inverter_MMXU1_A_phsB_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_A_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsB_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_A_phsB_q (&iedModel_Inverter_MMXU1_A_phsB_q) +#define IEDMODEL_Inverter_MMXU1_A_phsB_t (&iedModel_Inverter_MMXU1_A_phsB_t) +#define IEDMODEL_Inverter_MMXU1_A_phsC (&iedModel_Inverter_MMXU1_A_phsC) +#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal (&iedModel_Inverter_MMXU1_A_phsC_cVal) +#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal_mag (&iedModel_Inverter_MMXU1_A_phsC_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_A_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_A_phsC_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_A_phsC_q (&iedModel_Inverter_MMXU1_A_phsC_q) +#define IEDMODEL_Inverter_MMXU1_A_phsC_t (&iedModel_Inverter_MMXU1_A_phsC_t) +#define IEDMODEL_Inverter_MMXU1_A_neut (&iedModel_Inverter_MMXU1_A_neut) +#define IEDMODEL_Inverter_MMXU1_A_neut_cVal (&iedModel_Inverter_MMXU1_A_neut_cVal) +#define IEDMODEL_Inverter_MMXU1_A_neut_cVal_mag (&iedModel_Inverter_MMXU1_A_neut_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_A_neut_cVal_mag_f (&iedModel_Inverter_MMXU1_A_neut_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_A_neut_q (&iedModel_Inverter_MMXU1_A_neut_q) +#define IEDMODEL_Inverter_MMXU1_A_neut_t (&iedModel_Inverter_MMXU1_A_neut_t) +#define IEDMODEL_Inverter_MMXU1_W (&iedModel_Inverter_MMXU1_W) +#define IEDMODEL_Inverter_MMXU1_W_phsA (&iedModel_Inverter_MMXU1_W_phsA) +#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal (&iedModel_Inverter_MMXU1_W_phsA_cVal) +#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal_mag (&iedModel_Inverter_MMXU1_W_phsA_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_W_phsA_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsA_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_W_phsA_q (&iedModel_Inverter_MMXU1_W_phsA_q) +#define IEDMODEL_Inverter_MMXU1_W_phsA_t (&iedModel_Inverter_MMXU1_W_phsA_t) +#define IEDMODEL_Inverter_MMXU1_W_phsB (&iedModel_Inverter_MMXU1_W_phsB) +#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal (&iedModel_Inverter_MMXU1_W_phsB_cVal) +#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal_mag (&iedModel_Inverter_MMXU1_W_phsB_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_W_phsB_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsB_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_W_phsB_q (&iedModel_Inverter_MMXU1_W_phsB_q) +#define IEDMODEL_Inverter_MMXU1_W_phsB_t (&iedModel_Inverter_MMXU1_W_phsB_t) +#define IEDMODEL_Inverter_MMXU1_W_phsC (&iedModel_Inverter_MMXU1_W_phsC) +#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal (&iedModel_Inverter_MMXU1_W_phsC_cVal) +#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal_mag (&iedModel_Inverter_MMXU1_W_phsC_cVal_mag) +#define IEDMODEL_Inverter_MMXU1_W_phsC_cVal_mag_f (&iedModel_Inverter_MMXU1_W_phsC_cVal_mag_f) +#define IEDMODEL_Inverter_MMXU1_W_phsC_q (&iedModel_Inverter_MMXU1_W_phsC_q) +#define IEDMODEL_Inverter_MMXU1_W_phsC_t (&iedModel_Inverter_MMXU1_W_phsC_t) +#define IEDMODEL_Battery (&iedModel_Battery) +#define IEDMODEL_Battery_LLN0 (&iedModel_Battery_LLN0) +#define IEDMODEL_Battery_LLN0_Mod (&iedModel_Battery_LLN0_Mod) +#define IEDMODEL_Battery_LLN0_Mod_q (&iedModel_Battery_LLN0_Mod_q) +#define IEDMODEL_Battery_LLN0_Mod_t (&iedModel_Battery_LLN0_Mod_t) +#define IEDMODEL_Battery_LLN0_Mod_ctlModel (&iedModel_Battery_LLN0_Mod_ctlModel) +#define IEDMODEL_Battery_LLN0_Beh (&iedModel_Battery_LLN0_Beh) +#define IEDMODEL_Battery_LLN0_Beh_stVal (&iedModel_Battery_LLN0_Beh_stVal) +#define IEDMODEL_Battery_LLN0_Beh_q (&iedModel_Battery_LLN0_Beh_q) +#define IEDMODEL_Battery_LLN0_Beh_t (&iedModel_Battery_LLN0_Beh_t) +#define IEDMODEL_Battery_LLN0_Health (&iedModel_Battery_LLN0_Health) +#define IEDMODEL_Battery_LLN0_Health_stVal (&iedModel_Battery_LLN0_Health_stVal) +#define IEDMODEL_Battery_LLN0_Health_q (&iedModel_Battery_LLN0_Health_q) +#define IEDMODEL_Battery_LLN0_Health_t (&iedModel_Battery_LLN0_Health_t) +#define IEDMODEL_Battery_LLN0_NamPlt (&iedModel_Battery_LLN0_NamPlt) +#define IEDMODEL_Battery_LLN0_NamPlt_vendor (&iedModel_Battery_LLN0_NamPlt_vendor) +#define IEDMODEL_Battery_LLN0_NamPlt_swRev (&iedModel_Battery_LLN0_NamPlt_swRev) +#define IEDMODEL_Battery_LLN0_NamPlt_d (&iedModel_Battery_LLN0_NamPlt_d) +#define IEDMODEL_Battery_LLN0_NamPlt_configRev (&iedModel_Battery_LLN0_NamPlt_configRev) +#define IEDMODEL_Battery_LLN0_NamPlt_ldNs (&iedModel_Battery_LLN0_NamPlt_ldNs) +#define IEDMODEL_Battery_LPHD1 (&iedModel_Battery_LPHD1) +#define IEDMODEL_Battery_LPHD1_PhyNam (&iedModel_Battery_LPHD1_PhyNam) +#define IEDMODEL_Battery_LPHD1_PhyNam_vendor (&iedModel_Battery_LPHD1_PhyNam_vendor) +#define IEDMODEL_Battery_LPHD1_PhyHealth (&iedModel_Battery_LPHD1_PhyHealth) +#define IEDMODEL_Battery_LPHD1_PhyHealth_stVal (&iedModel_Battery_LPHD1_PhyHealth_stVal) +#define IEDMODEL_Battery_LPHD1_PhyHealth_q (&iedModel_Battery_LPHD1_PhyHealth_q) +#define IEDMODEL_Battery_LPHD1_PhyHealth_t (&iedModel_Battery_LPHD1_PhyHealth_t) +#define IEDMODEL_Battery_LPHD1_Proxy (&iedModel_Battery_LPHD1_Proxy) +#define IEDMODEL_Battery_LPHD1_Proxy_stVal (&iedModel_Battery_LPHD1_Proxy_stVal) +#define IEDMODEL_Battery_LPHD1_Proxy_q (&iedModel_Battery_LPHD1_Proxy_q) +#define IEDMODEL_Battery_LPHD1_Proxy_t (&iedModel_Battery_LPHD1_Proxy_t) +#define IEDMODEL_Battery_ZBAT1 (&iedModel_Battery_ZBAT1) +#define IEDMODEL_Battery_ZBAT1_Mod (&iedModel_Battery_ZBAT1_Mod) +#define IEDMODEL_Battery_ZBAT1_Mod_q (&iedModel_Battery_ZBAT1_Mod_q) +#define IEDMODEL_Battery_ZBAT1_Mod_t (&iedModel_Battery_ZBAT1_Mod_t) +#define IEDMODEL_Battery_ZBAT1_Mod_ctlModel (&iedModel_Battery_ZBAT1_Mod_ctlModel) +#define IEDMODEL_Battery_ZBAT1_Beh (&iedModel_Battery_ZBAT1_Beh) +#define IEDMODEL_Battery_ZBAT1_Beh_stVal (&iedModel_Battery_ZBAT1_Beh_stVal) +#define IEDMODEL_Battery_ZBAT1_Beh_q (&iedModel_Battery_ZBAT1_Beh_q) +#define IEDMODEL_Battery_ZBAT1_Beh_t (&iedModel_Battery_ZBAT1_Beh_t) +#define IEDMODEL_Battery_ZBAT1_Health (&iedModel_Battery_ZBAT1_Health) +#define IEDMODEL_Battery_ZBAT1_Health_stVal (&iedModel_Battery_ZBAT1_Health_stVal) +#define IEDMODEL_Battery_ZBAT1_Health_q (&iedModel_Battery_ZBAT1_Health_q) +#define IEDMODEL_Battery_ZBAT1_Health_t (&iedModel_Battery_ZBAT1_Health_t) +#define IEDMODEL_Battery_ZBAT1_NamPlt (&iedModel_Battery_ZBAT1_NamPlt) +#define IEDMODEL_Battery_ZBAT1_NamPlt_vendor (&iedModel_Battery_ZBAT1_NamPlt_vendor) +#define IEDMODEL_Battery_ZBAT1_NamPlt_swRev (&iedModel_Battery_ZBAT1_NamPlt_swRev) +#define IEDMODEL_Battery_ZBAT1_NamPlt_d (&iedModel_Battery_ZBAT1_NamPlt_d) +#define IEDMODEL_Battery_ZBAT1_Vol (&iedModel_Battery_ZBAT1_Vol) +#define IEDMODEL_Battery_ZBAT1_Vol_mag (&iedModel_Battery_ZBAT1_Vol_mag) +#define IEDMODEL_Battery_ZBAT1_Vol_mag_f (&iedModel_Battery_ZBAT1_Vol_mag_f) +#define IEDMODEL_Battery_ZBAT1_Vol_q (&iedModel_Battery_ZBAT1_Vol_q) +#define IEDMODEL_Battery_ZBAT1_Vol_t (&iedModel_Battery_ZBAT1_Vol_t) +#define IEDMODEL_Battery_ZBAT1_Amp (&iedModel_Battery_ZBAT1_Amp) +#define IEDMODEL_Battery_ZBAT1_Amp_mag (&iedModel_Battery_ZBAT1_Amp_mag) +#define IEDMODEL_Battery_ZBAT1_Amp_mag_f (&iedModel_Battery_ZBAT1_Amp_mag_f) +#define IEDMODEL_Battery_ZBAT1_Amp_q (&iedModel_Battery_ZBAT1_Amp_q) +#define IEDMODEL_Battery_ZBAT1_Amp_t (&iedModel_Battery_ZBAT1_Amp_t) +#define IEDMODEL_Battery_ZBTC1 (&iedModel_Battery_ZBTC1) +#define IEDMODEL_Battery_ZBTC1_Mod (&iedModel_Battery_ZBTC1_Mod) +#define IEDMODEL_Battery_ZBTC1_Mod_q (&iedModel_Battery_ZBTC1_Mod_q) +#define IEDMODEL_Battery_ZBTC1_Mod_t (&iedModel_Battery_ZBTC1_Mod_t) +#define IEDMODEL_Battery_ZBTC1_Mod_ctlModel (&iedModel_Battery_ZBTC1_Mod_ctlModel) +#define IEDMODEL_Battery_ZBTC1_Beh (&iedModel_Battery_ZBTC1_Beh) +#define IEDMODEL_Battery_ZBTC1_Beh_stVal (&iedModel_Battery_ZBTC1_Beh_stVal) +#define IEDMODEL_Battery_ZBTC1_Beh_q (&iedModel_Battery_ZBTC1_Beh_q) +#define IEDMODEL_Battery_ZBTC1_Beh_t (&iedModel_Battery_ZBTC1_Beh_t) +#define IEDMODEL_Battery_ZBTC1_Health (&iedModel_Battery_ZBTC1_Health) +#define IEDMODEL_Battery_ZBTC1_Health_stVal (&iedModel_Battery_ZBTC1_Health_stVal) +#define IEDMODEL_Battery_ZBTC1_Health_q (&iedModel_Battery_ZBTC1_Health_q) +#define IEDMODEL_Battery_ZBTC1_Health_t (&iedModel_Battery_ZBTC1_Health_t) +#define IEDMODEL_Battery_ZBTC1_NamPlt (&iedModel_Battery_ZBTC1_NamPlt) +#define IEDMODEL_Battery_ZBTC1_NamPlt_vendor (&iedModel_Battery_ZBTC1_NamPlt_vendor) +#define IEDMODEL_Battery_ZBTC1_NamPlt_swRev (&iedModel_Battery_ZBTC1_NamPlt_swRev) +#define IEDMODEL_Battery_ZBTC1_NamPlt_d (&iedModel_Battery_ZBTC1_NamPlt_d) +#define IEDMODEL_Battery_ZBTC1_BatChaSt (&iedModel_Battery_ZBTC1_BatChaSt) +#define IEDMODEL_Battery_ZBTC1_BatChaPwr (&iedModel_Battery_ZBTC1_BatChaPwr) +#define IEDMODEL_Battery_ZBTC1_BatChaMod (&iedModel_Battery_ZBTC1_BatChaMod) +#define IEDMODEL_Battery_ZBTC1_ChaV (&iedModel_Battery_ZBTC1_ChaV) +#define IEDMODEL_Battery_ZBTC1_ChaV_mag (&iedModel_Battery_ZBTC1_ChaV_mag) +#define IEDMODEL_Battery_ZBTC1_ChaV_mag_f (&iedModel_Battery_ZBTC1_ChaV_mag_f) +#define IEDMODEL_Battery_ZBTC1_ChaV_q (&iedModel_Battery_ZBTC1_ChaV_q) +#define IEDMODEL_Battery_ZBTC1_ChaV_t (&iedModel_Battery_ZBTC1_ChaV_t) +#define IEDMODEL_Battery_ZBTC1_ChaA (&iedModel_Battery_ZBTC1_ChaA) +#define IEDMODEL_Battery_ZBTC1_ChaA_mag (&iedModel_Battery_ZBTC1_ChaA_mag) +#define IEDMODEL_Battery_ZBTC1_ChaA_mag_f (&iedModel_Battery_ZBTC1_ChaA_mag_f) +#define IEDMODEL_Battery_ZBTC1_ChaA_q (&iedModel_Battery_ZBTC1_ChaA_q) +#define IEDMODEL_Battery_ZBTC1_ChaA_t (&iedModel_Battery_ZBTC1_ChaA_t) +#define IEDMODEL_Physical_Measurements (&iedModel_Physical_Measurements) +#define IEDMODEL_Physical_Measurements_LLN0 (&iedModel_Physical_Measurements_LLN0) +#define IEDMODEL_Physical_Measurements_LLN0_Mod (&iedModel_Physical_Measurements_LLN0_Mod) +#define IEDMODEL_Physical_Measurements_LLN0_Mod_q (&iedModel_Physical_Measurements_LLN0_Mod_q) +#define IEDMODEL_Physical_Measurements_LLN0_Mod_t (&iedModel_Physical_Measurements_LLN0_Mod_t) +#define IEDMODEL_Physical_Measurements_LLN0_Mod_ctlModel (&iedModel_Physical_Measurements_LLN0_Mod_ctlModel) +#define IEDMODEL_Physical_Measurements_LLN0_Beh (&iedModel_Physical_Measurements_LLN0_Beh) +#define IEDMODEL_Physical_Measurements_LLN0_Beh_stVal (&iedModel_Physical_Measurements_LLN0_Beh_stVal) +#define IEDMODEL_Physical_Measurements_LLN0_Beh_q (&iedModel_Physical_Measurements_LLN0_Beh_q) +#define IEDMODEL_Physical_Measurements_LLN0_Beh_t (&iedModel_Physical_Measurements_LLN0_Beh_t) +#define IEDMODEL_Physical_Measurements_LLN0_Health (&iedModel_Physical_Measurements_LLN0_Health) +#define IEDMODEL_Physical_Measurements_LLN0_Health_stVal (&iedModel_Physical_Measurements_LLN0_Health_stVal) +#define IEDMODEL_Physical_Measurements_LLN0_Health_q (&iedModel_Physical_Measurements_LLN0_Health_q) +#define IEDMODEL_Physical_Measurements_LLN0_Health_t (&iedModel_Physical_Measurements_LLN0_Health_t) +#define IEDMODEL_Physical_Measurements_LLN0_NamPlt (&iedModel_Physical_Measurements_LLN0_NamPlt) +#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_vendor (&iedModel_Physical_Measurements_LLN0_NamPlt_vendor) +#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_swRev (&iedModel_Physical_Measurements_LLN0_NamPlt_swRev) +#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_d (&iedModel_Physical_Measurements_LLN0_NamPlt_d) +#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_configRev (&iedModel_Physical_Measurements_LLN0_NamPlt_configRev) +#define IEDMODEL_Physical_Measurements_LLN0_NamPlt_ldNs (&iedModel_Physical_Measurements_LLN0_NamPlt_ldNs) +#define IEDMODEL_Physical_Measurements_LPHD1 (&iedModel_Physical_Measurements_LPHD1) +#define IEDMODEL_Physical_Measurements_LPHD1_PhyNam (&iedModel_Physical_Measurements_LPHD1_PhyNam) +#define IEDMODEL_Physical_Measurements_LPHD1_PhyNam_vendor (&iedModel_Physical_Measurements_LPHD1_PhyNam_vendor) +#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth (&iedModel_Physical_Measurements_LPHD1_PhyHealth) +#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_stVal (&iedModel_Physical_Measurements_LPHD1_PhyHealth_stVal) +#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_q (&iedModel_Physical_Measurements_LPHD1_PhyHealth_q) +#define IEDMODEL_Physical_Measurements_LPHD1_PhyHealth_t (&iedModel_Physical_Measurements_LPHD1_PhyHealth_t) +#define IEDMODEL_Physical_Measurements_LPHD1_Proxy (&iedModel_Physical_Measurements_LPHD1_Proxy) +#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_stVal (&iedModel_Physical_Measurements_LPHD1_Proxy_stVal) +#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_q (&iedModel_Physical_Measurements_LPHD1_Proxy_q) +#define IEDMODEL_Physical_Measurements_LPHD1_Proxy_t (&iedModel_Physical_Measurements_LPHD1_Proxy_t) + +#endif /* STATIC_MODEL_H_ */ + From d8f964ac7c3f6524e2c594367197a93aa5168414 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 19 Oct 2017 15:09:17 +0200 Subject: [PATCH 34/64] - MMS server: ACSE authenticator passes application reference (ap-title and ae-qualifier) --- .../server_example_password_auth.c | 23 ++++++- src/mms/asn1/ber_decode.c | 69 ++++++++++--------- src/mms/inc/iso_connection_parameters.h | 13 +--- src/mms/inc/mms_common.h | 11 +++ src/mms/inc_private/acse.h | 1 + src/mms/inc_private/ber_decode.h | 3 + src/mms/iso_acse/acse.c | 26 ++++++- 7 files changed, 98 insertions(+), 48 deletions(-) diff --git a/examples/server_example_password_auth/server_example_password_auth.c b/examples/server_example_password_auth/server_example_password_auth.c index 6c6661c9..2551ac86 100644 --- a/examples/server_example_password_auth/server_example_password_auth.c +++ b/examples/server_example_password_auth/server_example_password_auth.c @@ -37,13 +37,34 @@ void sigint_handler(int signalId) static char* password1 = "user1@testpw"; static char* password2 = "user2@testpw"; +static void printAppTitle(ItuObjectIdentifier* oid) +{ + int i; + + for (i = 0; i < oid->arcCount; i++) { + printf("%i", oid->arc[i]); + + if (i != (oid->arcCount - 1)) + printf("."); + } + + printf("\n"); +} + /** * This is the AcseAuthenticator callback function that is invoked on each client connection attempt. * When returning true the server stack accepts the client. Otherwise the connection is rejected. + * + * The security token can be used to pass an application specific object to other library callbacks */ static bool -clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken) +clientAuthenticator(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken, IsoApplicationReference* appRef) { + printf("ACSE Authenticator:\n"); + printf(" client ap-title: "); printAppTitle(&(appRef->apTitle)); printf("\n"); + printf(" client ae-qualifier: %i\n", appRef->aeQualifier); + + if (authParameter->mechanism == ACSE_AUTH_PASSWORD) { if (authParameter->value.password.passwordLength == strlen(password1)) { if (memcmp(authParameter->value.password.octetString, password1, diff --git a/src/mms/asn1/ber_decode.c b/src/mms/asn1/ber_decode.c index 38188999..32be3975 100644 --- a/src/mms/asn1/ber_decode.c +++ b/src/mms/asn1/ber_decode.c @@ -89,39 +89,6 @@ BerDecoder_decodeUint32(uint8_t* buffer, int intLen, int bufPos) return value; } -#if 0 -int32_t -BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos) -{ - int32_t value = 0; - - bool isNegative = ((buffer[bufPos] & 0x80) == 0x80); - - int i = 0; - - if (isNegative) { - for (i = 0; i < 4; i++) { - - value <<= 8; - - if (i < (4 - intlen)) - value += 0xff; - else - value += buffer[bufPos + i - (4 - intlen)]; - } - } - else { - for (i = 0; i < intlen; i++) { - value <<= 8; - value += buffer[bufPos + i]; - } - } - - return value; -} -#endif - -#if 1 int32_t BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos) { @@ -142,7 +109,6 @@ BerDecoder_decodeInt32(uint8_t* buffer, int intlen, int bufPos) return value; } -#endif float BerDecoder_decodeFloat(uint8_t* buffer, int bufPos) @@ -197,3 +163,38 @@ BerDecoder_decodeBoolean(uint8_t* buffer, int bufPos) { else return false; } + +void +BerDecoder_decodeOID(uint8_t* buffer, int bufPos, int length, ItuObjectIdentifier* oid) +{ + int startPos = bufPos; + int currentArc = 0; + + /* clear all arcs */ + int i; + for (i = 0; i < 10; i++) + oid->arc[i] = 0; + + /* parse first two arcs */ + if (length > 0) { + oid->arc[0] = buffer[bufPos] / 40; + oid->arc[1] = buffer[bufPos] % 40; + + currentArc = 2; + bufPos++; + } + + /* parse remaining arcs */ + while ((bufPos - startPos < length) && (currentArc < 10)) { + oid->arc[currentArc] = oid->arc[currentArc]<<7; + + if (buffer[bufPos] < 0x80) + oid->arc[currentArc++] += buffer[bufPos]; + else + oid->arc[currentArc] += (buffer[bufPos] & 0x7f); + + bufPos++; + } + + oid->arcCount = currentArc; +} diff --git a/src/mms/inc/iso_connection_parameters.h b/src/mms/inc/iso_connection_parameters.h index 539ba3eb..6ab22704 100644 --- a/src/mms/inc/iso_connection_parameters.h +++ b/src/mms/inc/iso_connection_parameters.h @@ -48,16 +48,6 @@ typedef enum } AcseAuthenticationMechanism; -/* --> for compatibility with older versions (libiec61850 < 0.7.7) */ -#ifndef AUTH_NONE -#define AUTH_NONE ACSE_AUTH_NONE -#endif - -#ifndef AUTH_PASSWORD -#define AUTH_PASSWORD ACSE_AUTH_PASSWORD -#endif -/* <-- for compatibility with older versions (libiec61850 < 0.7.7) */ - typedef struct sAcseAuthenticationParameter* AcseAuthenticationParameter; struct sAcseAuthenticationParameter @@ -99,11 +89,12 @@ AcseAuthenticationParameter_setPassword(AcseAuthenticationParameter self, char* * \param parameter user provided parameter - set when user registers the authenticator * \param authParameter the authentication parameters provided by the client * \param securityToken pointer where to store an application specific security token - can be ignored if not used. + * \param appReference ISO application reference (ap-title + ae-qualifier) * * \return true if client connection is accepted, false otherwise */ typedef bool -(*AcseAuthenticator)(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken); +(*AcseAuthenticator)(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken, IsoApplicationReference* appReference); /** * \brief COTP T selector diff --git a/src/mms/inc/mms_common.h b/src/mms/inc/mms_common.h index 10e35379..0c3832e5 100644 --- a/src/mms/inc/mms_common.h +++ b/src/mms/inc/mms_common.h @@ -155,6 +155,17 @@ typedef struct typedef struct sMmsNamedVariableList* MmsNamedVariableList; typedef struct sMmsAccessSpecifier* MmsNamedVariableListEntry; + +typedef struct { + uint16_t arc[10]; + int arcCount; +} ItuObjectIdentifier; + +typedef struct { + ItuObjectIdentifier apTitle; + int aeQualifier; +} IsoApplicationReference; + /**@}*/ diff --git a/src/mms/inc_private/acse.h b/src/mms/inc_private/acse.h index 42825087..9b36bd3c 100644 --- a/src/mms/inc_private/acse.h +++ b/src/mms/inc_private/acse.h @@ -54,6 +54,7 @@ typedef struct sAcseConnection int userDataBufferSize; AcseAuthenticationParameter authentication; AcseAuthenticator authenticator; + IsoApplicationReference applicationReference; void* authenticatorParameter; void* securityToken; } AcseConnection; diff --git a/src/mms/inc_private/ber_decode.h b/src/mms/inc_private/ber_decode.h index 8bdbcc3e..56f3ed28 100644 --- a/src/mms/inc_private/ber_decode.h +++ b/src/mms/inc_private/ber_decode.h @@ -46,4 +46,7 @@ BerDecoder_decodeDouble(uint8_t* buffer, int bufPos); bool BerDecoder_decodeBoolean(uint8_t* buffer, int bufPos); +void +BerDecoder_decodeOID(uint8_t* buffer, int bufPos, int length, ItuObjectIdentifier* oid); + #endif /* BER_DECODER_H_ */ diff --git a/src/mms/iso_acse/acse.c b/src/mms/iso_acse/acse.c index 76b6f7af..7b872dc4 100644 --- a/src/mms/iso_acse/acse.c +++ b/src/mms/iso_acse/acse.c @@ -69,7 +69,10 @@ authenticateClient(AcseConnection* self, AcseAuthenticationMechanism mechanism, authParameter->value.password.passwordLength = authValueLen; } - return self->authenticator(self->authenticatorParameter, authParameter, &(self->securityToken)); + //TODO Check if we are in a TLS connection: if mechanism == ACSE_AUTH_NONE provide client certificate if present + // --> mechanism = ACSE_AUTH_TLS + + return self->authenticator(self->authenticatorParameter, authParameter, &(self->securityToken), &(self->applicationReference)); } static bool @@ -241,10 +244,28 @@ parseAarqPdu(AcseConnection* self, uint8_t* buffer, int bufPos, int maxBufPos) break; case 0xa6: /* calling AP title */ - bufPos += len; + { + if (buffer[bufPos] == 0x06) { /* ap-title-form2 */ + + int innerLength = buffer[bufPos+1]; + + if (innerLength == len - 2) + BerDecoder_decodeOID(buffer, bufPos + 2, innerLength, &(self->applicationReference.apTitle)); + } + } + bufPos += len; break; case 0xa7: /* calling AE qualifier */ + { + if (buffer[bufPos] == 0x02) { /* ae-qualifier-form2 */ + + int innerLength = buffer[bufPos+1]; + + if (innerLength == len - 2) + self->applicationReference.aeQualifier = BerDecoder_decodeInt32(buffer + 2, buffer[bufPos+1], bufPos); + } + } bufPos += len; break; @@ -315,6 +336,7 @@ AcseConnection_init(AcseConnection* self, AcseAuthenticator authenticator, void* self->userDataBufferSize = 0; self->authenticator= authenticator; self->authenticatorParameter = parameter; + memset(&(self->applicationReference), 0, sizeof(self->applicationReference)); } void From e26ac787d7810fd7a2a07c42faf24b669d93daf3 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Tue, 24 Oct 2017 11:41:25 +0200 Subject: [PATCH 35/64] - MMS client: file services -fixed encoding problem with long file names --- .../server_example_password_auth.c | 2 -- src/mms/iso_mms/client/mms_client_files.c | 27 ++++++++----------- src/mms/iso_mms/server/mms_file_service.c | 5 ++++ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/examples/server_example_password_auth/server_example_password_auth.c b/examples/server_example_password_auth/server_example_password_auth.c index 2551ac86..92f7aac5 100644 --- a/examples/server_example_password_auth/server_example_password_auth.c +++ b/examples/server_example_password_auth/server_example_password_auth.c @@ -47,8 +47,6 @@ static void printAppTitle(ItuObjectIdentifier* oid) if (i != (oid->arcCount - 1)) printf("."); } - - printf("\n"); } /** diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index 5ac38e36..19cfed83 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -202,13 +202,13 @@ mmsClient_createFileOpenRequest(uint32_t invokeId, ByteBuffer* request, const ch uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); uint32_t fileNameStringSize = strlen(fileName); - uint32_t fileNameSize = 1+ BerEncoder_determineLengthSize(fileNameStringSize) + fileNameStringSize; + uint32_t fileNameSize = 1 + BerEncoder_determineLengthSize(fileNameStringSize) + fileNameStringSize; uint32_t fileNameSeqSize = fileNameSize; - uint32_t fileOpenRequestSize = fileNameSeqSize + 2 + BerEncoder_UInt32determineEncodedSize(initialPosition) + 2; + uint32_t fileOpenRequestSize = 1 + BerEncoder_determineLengthSize(fileNameSeqSize) + fileNameSeqSize + 2 + BerEncoder_UInt32determineEncodedSize(initialPosition); - uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + fileOpenRequestSize; + uint32_t confirmedRequestPduSize = 2 + invokeIdSize + 2 + BerEncoder_determineLengthSize(fileOpenRequestSize) + fileOpenRequestSize; int bufPos = 0; uint8_t* buffer = request->buffer; @@ -221,9 +221,10 @@ mmsClient_createFileOpenRequest(uint32_t invokeId, ByteBuffer* request, const ch buffer[bufPos++] = 0xbf; buffer[bufPos++] = 0x48; bufPos = BerEncoder_encodeLength(fileOpenRequestSize, buffer, bufPos); - bufPos = BerEncoder_encodeTL(0xa0, fileNameSeqSize, buffer, bufPos); + bufPos = BerEncoder_encodeTL(0xa0, fileNameSeqSize, buffer, bufPos); bufPos = BerEncoder_encodeOctetString(0x19, (uint8_t*) fileName, fileNameStringSize, buffer, bufPos); + bufPos = BerEncoder_encodeUInt32WithTL(0x81, initialPosition, buffer, bufPos); request->size = bufPos; @@ -237,11 +238,9 @@ mmsClient_createFileDeleteRequest(uint32_t invokeId, ByteBuffer* request, const uint32_t fileNameStringSize = strlen(fileName); uint32_t fileNameSize = 1 + BerEncoder_determineLengthSize(fileNameStringSize) + fileNameStringSize; - uint32_t fileNameSeqSize = fileNameSize; - - uint32_t fileDeleteRequestSize = fileNameSeqSize; // + 2; + uint32_t fileDeleteRequestSize = fileNameSize; - uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + fileDeleteRequestSize; + uint32_t confirmedRequestPduSize = 1 + 2 + invokeIdSize + 1 + BerEncoder_determineLengthSize(fileDeleteRequestSize) + fileDeleteRequestSize; int bufPos = 0; uint8_t* buffer = request->buffer; @@ -314,7 +313,7 @@ mmsClient_createFileDirectoryRequest(uint32_t invokeId, ByteBuffer* request, con { uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); - uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize + 0; + uint32_t confirmedRequestPduSize = 1 + 2 + 1 + invokeIdSize; uint32_t parameterSize = 0; @@ -324,7 +323,7 @@ mmsClient_createFileDirectoryRequest(uint32_t invokeId, ByteBuffer* request, con if (continueAfter) parameterSize += encodeFileSpecification(0xa1, continueAfter, NULL, 0); - confirmedRequestPduSize += parameterSize; + confirmedRequestPduSize += BerEncoder_determineLengthSize(parameterSize) + parameterSize; int bufPos = 0; uint8_t* buffer = request->buffer; @@ -353,15 +352,13 @@ mmsClient_createFileRenameRequest(uint32_t invokeId, ByteBuffer* request, const { uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); - uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize; - uint32_t parameterSize = 0; parameterSize += encodeFileSpecification(0xa0, currentFileName, NULL, 0); parameterSize += encodeFileSpecification(0xa1, newFileName, NULL, 0); - confirmedRequestPduSize += parameterSize; + uint32_t confirmedRequestPduSize = 2 + invokeIdSize + 2 + BerEncoder_determineLengthSize(parameterSize) + parameterSize; int bufPos = 0; uint8_t* buffer = request->buffer; @@ -387,15 +384,13 @@ mmsClient_createObtainFileRequest(uint32_t invokeId, ByteBuffer* request, const { uint32_t invokeIdSize = BerEncoder_UInt32determineEncodedSize(invokeId); - uint32_t confirmedRequestPduSize = 1 + 2 + 2 + invokeIdSize; - uint32_t parameterSize = 0; parameterSize += encodeFileSpecification(0xa0, sourceFile, NULL, 0); parameterSize += encodeFileSpecification(0xa1, destinationFile, NULL, 0); - confirmedRequestPduSize += parameterSize; + uint32_t confirmedRequestPduSize = 2 + invokeIdSize + 2 + BerEncoder_determineLengthSize(parameterSize) + parameterSize; int bufPos = 0; uint8_t* buffer = request->buffer; diff --git a/src/mms/iso_mms/server/mms_file_service.c b/src/mms/iso_mms/server/mms_file_service.c index 0bc5dcc8..42feced2 100644 --- a/src/mms/iso_mms/server/mms_file_service.c +++ b/src/mms/iso_mms/server/mms_file_service.c @@ -251,6 +251,11 @@ mmsServer_handleFileDeleteRequest( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); + if (length > 255) { + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); + return; + } + char filename[256]; memcpy(filename, buffer + bufPos, length); From 8a67fcc00b0fa310335a4883ca2127b3f9b2500f Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 25 Oct 2017 18:20:22 +0200 Subject: [PATCH 36/64] - fixed problem with cmake include folders --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f398a87b..3bcabf08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,7 +62,7 @@ option(DEBUG_MMS_CLIENT "Enable MMS CLIENT printf debugging" OFF) # DEBUG_IED_CLIENT DEBUG_MMS_SERVER DEBUG_MMS_CLIENT) include_directories( - ${CMAKE_CURRENT_LIST_DIR}/config + ${CMAKE_CURRENT_BINARY_DIR}/config ${CMAKE_CURRENT_LIST_DIR}/src/common/inc ${CMAKE_CURRENT_LIST_DIR}/src/goose ${CMAKE_CURRENT_LIST_DIR}/src/sampled_values From 02689d1410109a2dc5b7323d2fd666b9e808a205 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 25 Oct 2017 21:51:35 +0200 Subject: [PATCH 37/64] - MMS server: more restrictive value type check when handling write access --- src/mms/inc/mms_type_spec.h | 11 ++++ src/mms/iso_mms/common/mms_type_spec.c | 58 ++++++++++++++++++++++ src/mms/iso_mms/server/mms_write_service.c | 2 +- src/vs/libiec61850-wo-goose.def | 3 +- src/vs/libiec61850.def | 1 + 5 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/mms/inc/mms_type_spec.h b/src/mms/inc/mms_type_spec.h index d9db23fb..20693584 100644 --- a/src/mms/inc/mms_type_spec.h +++ b/src/mms/inc/mms_type_spec.h @@ -91,6 +91,17 @@ MmsVariableSpecification_getNamedVariableRecursive(MmsVariableSpecification* sel MmsType MmsVariableSpecification_getType(MmsVariableSpecification* self); +/** + * \brief Check if the value has exactly the same type as this variable specfication + * + * \param self the MmsVariableSpecification instance + * \param value the value to check + * + * \return true if type is matching, false otherwise + */ +bool +MmsVariableSpecification_isValueOfType(MmsVariableSpecification* self, MmsValue* value); + /** * \brief get the name of the variable * diff --git a/src/mms/iso_mms/common/mms_type_spec.c b/src/mms/iso_mms/common/mms_type_spec.c index 3d3ea1f4..95f17ba9 100644 --- a/src/mms/iso_mms/common/mms_type_spec.c +++ b/src/mms/iso_mms/common/mms_type_spec.c @@ -95,6 +95,64 @@ MmsVariableSpecification_getType(MmsVariableSpecification* self) return self->type; } +bool +MmsVariableSpecification_isValueOfType(MmsVariableSpecification* self, MmsValue* value) +{ + if ((self->type) == (value->type)) { + + if ((self->type == MMS_STRUCTURE) || (self->type == MMS_ARRAY)) { + + int componentCount = self->typeSpec.structure.elementCount; + + if (componentCount != (int) MmsValue_getArraySize(value)) + return false; + + if (self->type == MMS_STRUCTURE) { + + int i; + for (i = 0; i < componentCount; i++) { + + if (MmsVariableSpecification_isValueOfType(self->typeSpec.structure.elements[i], MmsValue_getElement(value, i)) == false) + return false; + } + + return true; + } + else { + int i; + for (i = 0; i < componentCount; i++) { + + if (MmsVariableSpecification_isValueOfType(self->typeSpec.array.elementTypeSpec, MmsValue_getElement(value, i)) == false) + return false; + } + } + } + else if (self->type == MMS_BIT_STRING) { + if (self->typeSpec.bitString == value->value.bitString.size) + return true; + + if (self->typeSpec.bitString < 0) { + if (value->value.bitString.size <= (-self->typeSpec.bitString)) + return true; + } + } + else if (self->type == MMS_FLOAT) { + if ((self->typeSpec.floatingpoint.exponentWidth == value->value.floatingPoint.exponentWidth) && + (self->typeSpec.floatingpoint.formatWidth == value->value.floatingPoint.formatWidth)) + return true; + } + else if (self->type == MMS_BINARY_TIME) { + if (self->typeSpec.binaryTime == value->value.binaryTime.size) + return true; + } + else + return true; + + } + + return false; +} + const char* MmsVariableSpecification_getName(MmsVariableSpecification* self) { diff --git a/src/mms/iso_mms/server/mms_write_service.c b/src/mms/iso_mms/server/mms_write_service.c index 41c0a708..13eaec62 100644 --- a/src/mms/iso_mms/server/mms_write_service.c +++ b/src/mms/iso_mms/server/mms_write_service.c @@ -657,7 +657,7 @@ mmsServer_handleWriteRequest( } /* Check for correct type */ - if (MmsValue_getType(value) != MmsVariableSpecification_getType(variable)) { + if (MmsVariableSpecification_isValueOfType(variable, value) == false) { accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; goto end_of_main_loop; } diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 228dab86..29379a00 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -570,4 +570,5 @@ EXPORTS IedServer_setFilestoreBasepath IedModel_getDeviceByInst MmsConnection_writeNamedVariableList - IedConnection_writeDataSetValues \ No newline at end of file + IedConnection_writeDataSetValues + MmsVariableSpecification_isValueOfType diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index 87146bd9..d4589e1c 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -652,3 +652,4 @@ EXPORTS SVClientASDU_hasRefrTm SVClientASDU_getRefrTmAsMs IedConnection_writeDataSetValues + MmsVariableSpecification_isValueOfType From cd8f5f483dfbf8f3ff1f880a37e00f6344fe1181 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 26 Oct 2017 09:32:16 +0200 Subject: [PATCH 38/64] - IED server: added new function IedServer_udpateDbposValue; added new return code for control check callback function --- src/iec61850/inc/iec61850_server.h | 18 +++++++++++++++- src/iec61850/server/impl/ied_server.c | 21 +++++++++++++++++++ src/iec61850/server/mms_mapping/control.c | 25 ++--------------------- src/vs/libiec61850-wo-goose.def | 1 + src/vs/libiec61850.def | 1 + 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/iec61850/inc/iec61850_server.h b/src/iec61850/inc/iec61850_server.h index 90b266cb..8b08e149 100644 --- a/src/iec61850/inc/iec61850_server.h +++ b/src/iec61850/inc/iec61850_server.h @@ -560,6 +560,21 @@ IedServer_updateFloatAttributeValue(IedServer self, DataAttribute* dataAttribute void IedServer_updateInt32AttributeValue(IedServer self, DataAttribute* dataAttribute, int32_t value); +/** + * \brief Update the value of an IEC 61850 Dbpos (double point/position) data attribute. + * + * Update the value of a integer data attribute without handling with MmsValue instances. + * + * This function will also check if a trigger condition is satisfied in the case when a report or GOOSE + * control block is enabled. + * + * \param self the instance of IedServer to operate on. + * \param dataAttribute the data attribute handle + * \param value the new Dbpos value of the data attribute. + */ +void +IedServer_udpateDbposValue(IedServer self, DataAttribute* dataAttribute, Dbpos value); + /** * \brief Update the value of an IEC 61850 integer64 data attribute (like BCR actVal) * @@ -820,7 +835,8 @@ typedef enum { CONTROL_HARDWARE_FAULT = 1, /** check failed due to hardware fault */ CONTROL_TEMPORARILY_UNAVAILABLE = 2, /** control is already selected or operated */ CONTROL_OBJECT_ACCESS_DENIED = 3, /** check failed due to access control reason - access denied for this client or state */ - CONTROL_OBJECT_UNDEFINED = 4 /** object not visible in this security context ??? */ + CONTROL_OBJECT_UNDEFINED = 4, /** object not visible in this security context ??? */ + CONTROL_VALUE_INVALID = 11 /** ctlVal out of range */ } CheckHandlerResult; /** diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index 8dfa507f..60778bb2 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -985,6 +985,27 @@ IedServer_updateInt32AttributeValue(IedServer self, DataAttribute* dataAttribute } } +void +IedServer_udpateDbposValue(IedServer self, DataAttribute* dataAttribute, Dbpos value) +{ + Dbpos currentValue = Dbpos_fromMmsValue(dataAttribute->mmsValue); + + if (currentValue == value) { + checkForUpdateTrigger(self, dataAttribute); + } + else { +#if (CONFIG_MMS_THREADLESS_STACK != 1) + Semaphore_wait(self->dataModelLock); +#endif + Dbpos_toMmsValue(dataAttribute->mmsValue, value); +#if (CONFIG_MMS_THREADLESS_STACK != 1) + Semaphore_post(self->dataModelLock); +#endif + + checkForChangedTriggers(self, dataAttribute); + } +} + void IedServer_updateInt64AttributeValue(IedServer self, DataAttribute* dataAttribute, int64_t value) { diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 3759211c..71b3e5ac 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -1211,27 +1211,6 @@ checkValidityOfOriginParameter(MmsValue* origin) return true; } -static MmsDataAccessError -getDataAccessErrorFromCheckHandlerResult(CheckHandlerResult checkResult) -{ - MmsDataAccessError indication; - - if (checkResult == CONTROL_HARDWARE_FAULT) - indication = DATA_ACCESS_ERROR_HARDWARE_FAULT; - else - if (checkResult == CONTROL_TEMPORARILY_UNAVAILABLE) - indication = DATA_ACCESS_ERROR_TEMPORARILY_UNAVAILABLE; - else - if (checkResult == CONTROL_OBJECT_UNDEFINED) - indication = DATA_ACCESS_ERROR_OBJECT_UNDEFINED; - else if (checkResult == CONTROL_OBJECT_ACCESS_DENIED) - indication = DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED; - else - indication = DATA_ACCESS_ERROR_SUCCESS; - - return indication; -} - MmsDataAccessError Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* variableIdOrig, MmsValue* value, MmsServerConnection connection) @@ -1378,7 +1357,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari printf("SBOw: selected successful\n"); } else { - indication = getDataAccessErrorFromCheckHandlerResult(checkResult); + indication = (MmsDataAccessError) checkResult; ControlObject_sendLastApplError(controlObject, connection, "SBOw", 0, ADD_CAUSE_SELECT_FAILED, ctlNum, origin, true); @@ -1523,7 +1502,7 @@ Control_writeAccessControlObject(MmsMapping* self, MmsDomain* domain, char* vari } else { - indication = getDataAccessErrorFromCheckHandlerResult(checkResult); + indication = (MmsDataAccessError) checkResult; abortControlOperation(controlObject); } diff --git a/src/vs/libiec61850-wo-goose.def b/src/vs/libiec61850-wo-goose.def index 29379a00..e3dcaccb 100644 --- a/src/vs/libiec61850-wo-goose.def +++ b/src/vs/libiec61850-wo-goose.def @@ -572,3 +572,4 @@ EXPORTS MmsConnection_writeNamedVariableList IedConnection_writeDataSetValues MmsVariableSpecification_isValueOfType + IedServer_udpateDbposValue diff --git a/src/vs/libiec61850.def b/src/vs/libiec61850.def index d4589e1c..a69d7634 100644 --- a/src/vs/libiec61850.def +++ b/src/vs/libiec61850.def @@ -653,3 +653,4 @@ EXPORTS SVClientASDU_getRefrTmAsMs IedConnection_writeDataSetValues MmsVariableSpecification_isValueOfType + IedServer_udpateDbposValue From 5fb8c5b9845e4d551d4f587519e8691098a4f095 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 28 Oct 2017 13:13:13 +0200 Subject: [PATCH 39/64] - MMS: added more length checks in parsers for file services --- src/mms/iso_mms/client/mms_client_files.c | 2 ++ src/mms/iso_mms/common/mms_common_msg.c | 6 +++++- src/mms/iso_mms/server/mms_file_service.c | 8 ++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mms/iso_mms/client/mms_client_files.c b/src/mms/iso_mms/client/mms_client_files.c index 19cfed83..1eb79890 100644 --- a/src/mms/iso_mms/client/mms_client_files.c +++ b/src/mms/iso_mms/client/mms_client_files.c @@ -98,6 +98,8 @@ mmsClient_handleFileOpenRequest( if (bufPos < 0) goto exit_reject_invalid_pdu; + if (bufPos + length > maxBufPos) goto exit_reject_invalid_pdu; + switch(tag) { case 0xa0: /* filename */ diff --git a/src/mms/iso_mms/common/mms_common_msg.c b/src/mms/iso_mms/common/mms_common_msg.c index 55da14df..75443e72 100644 --- a/src/mms/iso_mms/common/mms_common_msg.c +++ b/src/mms/iso_mms/common/mms_common_msg.c @@ -377,14 +377,18 @@ mmsMsg_openFile(const char* basepath, char* fileName, bool readWrite) bool mmsMsg_parseFileName(char* filename, uint8_t* buffer, int* bufPos, int maxBufPos , uint32_t invokeId, ByteBuffer* response) { + if (*bufPos == maxBufPos) + return false; + uint8_t tag = buffer[(*bufPos)++]; - int length; if (tag != 0x19) { mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return false; } + int length; + *bufPos = BerDecoder_decodeLength(buffer, &length, *bufPos, maxBufPos); if (*bufPos < 0) { diff --git a/src/mms/iso_mms/server/mms_file_service.c b/src/mms/iso_mms/server/mms_file_service.c index 42feced2..a9f9b7c5 100644 --- a/src/mms/iso_mms/server/mms_file_service.c +++ b/src/mms/iso_mms/server/mms_file_service.c @@ -316,6 +316,8 @@ mmsServer_handleFileOpenRequest( if (bufPos < 0) goto exit_reject_invalid_pdu; + if (bufPos + length > maxBufPos) goto exit_reject_invalid_pdu; + switch(tag) { case 0xa0: /* filename */ @@ -575,6 +577,8 @@ mmsServer_handleObtainFileRequest( if (bufPos < 0) goto exit_reject_invalid_pdu; + if (bufPos + length > maxBufPos) goto exit_reject_invalid_pdu; + switch(tag) { case 0xa1: /* source filename */ @@ -987,7 +991,7 @@ mmsServer_handleFileRenameRequest( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); - if (bufPos < 0) { + if ((bufPos < 0) || (bufPos + length > maxBufPos)) { mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } @@ -1071,7 +1075,7 @@ mmsServer_handleFileDirectoryRequest( bufPos = BerDecoder_decodeLength(buffer, &length, bufPos, maxBufPos); - if (bufPos < 0) { + if ((bufPos < 0) || (bufPos + length > maxBufPos)) { mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); return; } From 0c09385462cd992372475baf9bf670e512dea333 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 28 Oct 2017 15:52:49 +0200 Subject: [PATCH 40/64] - .NET API: ControlObject implements IDisposable interface --- dotnet/IEC61850forCSharp/Control.cs | 20 +++++++++++++------- dotnet/control/ControlExample.cs | 5 ++++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/dotnet/IEC61850forCSharp/Control.cs b/dotnet/IEC61850forCSharp/Control.cs index 8604e3e5..711542c7 100644 --- a/dotnet/IEC61850forCSharp/Control.cs +++ b/dotnet/IEC61850forCSharp/Control.cs @@ -104,7 +104,7 @@ namespace IEC61850 /// /// Control object. /// - public class ControlObject + public class ControlObject : IDisposable { [DllImport("iec61850", CallingConvention = CallingConvention.Cdecl)] private static extern LastApplErrorInternal ControlObjectClient_getLastApplError(IntPtr self); @@ -183,12 +183,6 @@ namespace IEC61850 ControlObjectClient_setCommandTerminationHandler(controlObject, intCommandTerminationHandler, controlObject); } - ~ControlObject () - { - if (this.controlObject != System.IntPtr.Zero) - ControlObjectClient_destroy(controlObject); - } - /// /// Gets the control model. /// @@ -443,6 +437,18 @@ namespace IEC61850 this.commandTerminationHandlerParameter = parameter; } + protected virtual void Dispose(bool disposing) { + if (this.controlObject != System.IntPtr.Zero) { + ControlObjectClient_destroy (controlObject); + this.controlObject = System.IntPtr.Zero; + } + } + + public void Dispose() { + Dispose (true); + } + + } } diff --git a/dotnet/control/ControlExample.cs b/dotnet/control/ControlExample.cs index 5504f317..7bce2eec 100644 --- a/dotnet/control/ControlExample.cs +++ b/dotnet/control/ControlExample.cs @@ -86,7 +86,10 @@ namespace control Thread.Sleep(1000); } - con.Abort(); + // has to be called before IedConnection dispose method! + control.Dispose(); + + con.Abort(); } catch (IedConnectionException e) { From c291db5d959cd65f2145f54a2e9d6c0cbfd72f4f Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 8 Nov 2017 08:53:37 +0100 Subject: [PATCH 41/64] - updated README file - SV receiver: Added semaphore to make subscriber list thread-safe --- README.md | 12 +++--- .../server/mms_named_variable_list_service.c | 7 +--- src/sampled_values/sv_subscriber.c | 39 +++++++++++++++++++ 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 53f5cd97..e4e945c0 100644 --- a/README.md +++ b/README.md @@ -73,15 +73,17 @@ To build the library and run libiec61850 applications with GOOSE support on Wind ## Building with the cmake build script -With the help of the cmake build script it is possible to create platform independet project descriptions and let cmake create specific project or build files for other tools like Make or Visual Studio. +With the help of the cmake build script it is possible to create platform independent project descriptions and let cmake create specific project or build files for other tools like Make or Visual Studio. -If you have cmake installed fire up a command line (cmd.exe) and create a new subdirectory in the libiec61850 folder. Change to this subdirectory. Then you can invoke cmake. As an command line argument you have to supply a "generator" that is used by cmake to create the project file for the actual build tool (in our case Visual Studio). +If you have cmake installed fire up a command line (cmd.exe) and create a new subdirectory in the libiec61850 folder. Change to this subdirectory. Then you can invoke cmake. As an command line argument you have to supply a "generator" that is used by cmake to create the project file for the actual build tool (in our case Visual Studio 2015). -`cmake -G "Visual Studio 11" ..` +`cmake -G "Visual Studio 14 2015" ..` -will instruct cmake to create a "solution" for Visual Studio 2012. To do the same thing for Visual Studio 2010 type +will instruct cmake to create a "solution" for Visual Studio 2015. The resulting project files will be 32 bit. -`cmake -G "Visual Studio 10" ..` +To build 64 bit libraries the "Win64" generator option has to be added. + +`cmake -G "Visual Studio 14 2015 Win64" ..` Note: The ".." at the end of the command line tells cmake where to find the main build script file (called CMakeLists.txt). This should point to the folder libiec61850 which is in our case the parent directory (..). diff --git a/src/mms/iso_mms/server/mms_named_variable_list_service.c b/src/mms/iso_mms/server/mms_named_variable_list_service.c index c56f6ca6..9192f68b 100644 --- a/src/mms/iso_mms/server/mms_named_variable_list_service.c +++ b/src/mms/iso_mms/server/mms_named_variable_list_service.c @@ -498,8 +498,7 @@ mmsServer_handleDefineNamedVariableListRequest( char variableListName[65]; if (request->variableListName.choice.aaspecific.size > 64) { - //TODO send reject PDU instead? - mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); goto exit_free_struct; } @@ -543,8 +542,7 @@ mmsServer_handleDefineNamedVariableListRequest( char variableListName[65]; if (request->variableListName.choice.vmdspecific.size > 64) { - //TODO send reject PDU instead? - mmsMsg_createServiceErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT); + mmsMsg_createMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); goto exit_free_struct; } @@ -583,7 +581,6 @@ mmsServer_handleDefineNamedVariableListRequest( exit_free_struct: asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); -exit_function: return; } diff --git a/src/sampled_values/sv_subscriber.c b/src/sampled_values/sv_subscriber.c index 5ebaadb3..4d2f70fc 100644 --- a/src/sampled_values/sv_subscriber.c +++ b/src/sampled_values/sv_subscriber.c @@ -50,7 +50,13 @@ struct sSVReceiver { uint8_t* buffer; EthernetSocket ethSocket; + LinkedList subscriberList; + +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Semaphore subscriberListLock; +#endif + }; struct sSVSubscriber { @@ -88,6 +94,10 @@ SVReceiver_create(void) self->buffer = (uint8_t*) GLOBAL_MALLOC(ETH_BUFFER_LENGTH); self->checkDestAddr = false; + +#if (CONFIG_MMS_THREADLESS_STACK == 0) + self->subscriberListLock = Semaphore_create(1); +#endif } return self; @@ -111,13 +121,29 @@ SVReceiver_disableDestAddrCheck(SVReceiver self) void SVReceiver_addSubscriber(SVReceiver self, SVSubscriber subscriber) { +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Semaphore_wait(self->subscriberListLock); +#endif + LinkedList_add(self->subscriberList, (void*) subscriber); + +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Semaphore_post(self->subscriberListLock); +#endif } void SVReceiver_removeSubscriber(SVReceiver self, SVSubscriber subscriber) { +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Semaphore_wait(self->subscriberListLock); +#endif + LinkedList_remove(self->subscriberList, (void*) subscriber); + +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Semaphore_post(self->subscriberListLock); +#endif } static void @@ -174,6 +200,10 @@ SVReceiver_destroy(SVReceiver self) LinkedList_destroyDeep(self->subscriberList, (LinkedListValueDeleteFunction) SVSubscriber_destroy); +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Semaphore_destroy(self->subscriberListLock); +#endif + GLOBAL_FREEMEM(self->buffer); GLOBAL_FREEMEM(self); } @@ -398,6 +428,11 @@ parseSVMessage(SVReceiver self, int numbytes) /* check if there is a matching subscriber */ + +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Semaphore_wait(self->subscriberListLock); +#endif + LinkedList element = LinkedList_getNext(self->subscriberList); SVSubscriber subscriber; @@ -427,6 +462,10 @@ parseSVMessage(SVReceiver self, int numbytes) element = LinkedList_getNext(element); } +#if (CONFIG_MMS_THREADLESS_STACK == 0) + Semaphore_post(self->subscriberListLock); +#endif + if (subscriberFound) parseSVPayload(self, subscriber, buffer + bufPos, apduLength); From 09d5daf0b5ad5e7ec451b9827747819021e6c697 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 9 Nov 2017 22:48:58 +0100 Subject: [PATCH 42/64] sampled values: add support for 64 bit integers --- src/sampled_values/sv_publisher.c | 49 ++++++++++++++++++++++++- src/sampled_values/sv_publisher.h | 6 +++ src/sampled_values/sv_subscriber.c | 27 ++++++++++++++ src/sampled_values/sv_subscriber.h | 59 +++++++++++++++++++++--------- 4 files changed, 122 insertions(+), 19 deletions(-) diff --git a/src/sampled_values/sv_publisher.c b/src/sampled_values/sv_publisher.c index bc777fe8..9f395ec9 100644 --- a/src/sampled_values/sv_publisher.c +++ b/src/sampled_values/sv_publisher.c @@ -220,6 +220,34 @@ encodeInt32FixedSize(int32_t value, uint8_t* buffer, int bufPos) return bufPos; } +static int +encodeInt64FixedSize(int64_t value, uint8_t* buffer, int bufPos) +{ + uint8_t* valueArray = (uint8_t*) &value; + +#if (ORDER_LITTLE_ENDIAN == 1) + buffer[bufPos++] = valueArray[7]; + buffer[bufPos++] = valueArray[6]; + buffer[bufPos++] = valueArray[5]; + buffer[bufPos++] = valueArray[4]; + buffer[bufPos++] = valueArray[3]; + buffer[bufPos++] = valueArray[2]; + buffer[bufPos++] = valueArray[1]; + buffer[bufPos++] = valueArray[0]; +#else + buffer[bufPos++] = valueArray[0]; + buffer[bufPos++] = valueArray[1]; + buffer[bufPos++] = valueArray[2]; + buffer[bufPos++] = valueArray[3]; + buffer[bufPos++] = valueArray[4]; + buffer[bufPos++] = valueArray[5]; + buffer[bufPos++] = valueArray[6]; + buffer[bufPos++] = valueArray[7]; +#endif + + return bufPos; +} + static int encodeUtcTime(uint64_t timeval, uint8_t* buffer, int bufPos) { @@ -508,6 +536,22 @@ SV_ASDU_setINT32(SV_ASDU self, int index, int32_t value) encodeInt32FixedSize(value, self->_dataBuffer, index); } +int +SV_ASDU_addINT64(SV_ASDU self) +{ + int index = self->dataSize; + + self->dataSize += 8; + + return index; +} + +void +SV_ASDU_setINT64(SV_ASDU self, int index, int64_t value) +{ + encodeInt64FixedSize(value, self->_dataBuffer, index); +} + int SV_ASDU_addFLOAT(SV_ASDU self) { @@ -523,7 +567,6 @@ SV_ASDU_setFLOAT(SV_ASDU self, int index, float value) { uint8_t* buf = (uint8_t*) &value; - #if (ORDER_LITTLE_ENDIAN == 1) BerEncoder_revertByteOrder(buf, 4); #endif @@ -550,11 +593,15 @@ void SV_ASDU_setFLOAT64(SV_ASDU self, int index, double value) { uint8_t* buf = (uint8_t*) &value; + #if (ORDER_LITTLE_ENDIAN == 1) BerEncoder_revertByteOrder(buf, 8); #endif + int i; + uint8_t* buffer = self->_dataBuffer + index; + for (i = 0; i < 8; i++) { buffer[i] = buf[i]; } diff --git a/src/sampled_values/sv_publisher.h b/src/sampled_values/sv_publisher.h index 458b00b2..08ddf528 100644 --- a/src/sampled_values/sv_publisher.h +++ b/src/sampled_values/sv_publisher.h @@ -85,6 +85,12 @@ SV_ASDU_addINT32(SV_ASDU self); void SV_ASDU_setINT32(SV_ASDU self, int index, int32_t value); +int +SV_ASDU_addINT64(SV_ASDU self); + +void +SV_ASDU_setINT64(SV_ASDU self, int index, int64_t value); + int SV_ASDU_addFLOAT(SV_ASDU self); diff --git a/src/sampled_values/sv_subscriber.c b/src/sampled_values/sv_subscriber.c index 4d2f70fc..1a0e2583 100644 --- a/src/sampled_values/sv_subscriber.c +++ b/src/sampled_values/sv_subscriber.c @@ -637,6 +637,20 @@ SVClientASDU_getINT32(SVClientASDU self, int index) return retVal; } +int64_t +SVClientASDU_getINT64(SVClientASDU self, int index) +{ + int64_t retVal = *((int64_t*) (self->dataBuffer + index)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 8); +#endif + + return retVal; +} + uint8_t SVClientASDU_getINT8U(SVClientASDU self, int index) { @@ -673,6 +687,19 @@ SVClientASDU_getINT32U(SVClientASDU self, int index) return retVal; } +uint64_t +SVClientASDU_getINT64U(SVClientASDU self, int index) +{ + uint64_t retVal = *((uint64_t*) (self->dataBuffer + index)); + +#if (ORDER_LITTLE_ENDIAN == 1) + uint8_t* buf = (uint8_t*) (&retVal); + + BerEncoder_revertByteOrder(buf, 8); +#endif + + return retVal; +} float SVClientASDU_getFLOAT32(SVClientASDU self, int index) diff --git a/src/sampled_values/sv_subscriber.h b/src/sampled_values/sv_subscriber.h index eefcbaa4..16ae7443 100644 --- a/src/sampled_values/sv_subscriber.h +++ b/src/sampled_values/sv_subscriber.h @@ -52,24 +52,25 @@ extern "C" { * * | IEC 61850 type | required bytes | * | -------------- | -------------- | - * | BOOLEAN | 1 byte | - * | INT8 | 1 byte | - * | INT16 | 2 byte | - * | INT32 | 4 byte | - * | INT64 | 8 byte | - * | INT8U | 1 byte | - * | INT16U | 2 byte | - * | INT24U | 3 byte | - * | INT32U | 4 byte | - * | FLOAT32 | 4 byte | - * | FLOAT64 | 8 byte | - * | ENUMERATED | 4 byte | - * | CODED ENUM | 4 byte | - * | OCTET STRING | 20 byte | - * | VISIBLE STRING | 35 byte | - * | TimeStamp | 8 byte | - * | EntryTime | 6 byte | - * | BITSTRING | 4 byte | + * | BOOLEAN | 1 byte | + * | INT8 | 1 byte | + * | INT16 | 2 byte | + * | INT32 | 4 byte | + * | INT64 | 8 byte | + * | INT8U | 1 byte | + * | INT16U | 2 byte | + * | INT24U | 3 byte | + * | INT32U | 4 byte | + * | INT64U | 8 byte | + * | FLOAT32 | 4 byte | + * | FLOAT64 | 8 byte | + * | ENUMERATED | 4 byte | + * | CODED ENUM | 4 byte | + * | OCTET STRING | 20 byte | + * | VISIBLE STRING | 35 byte | + * | TimeStamp | 8 byte | + * | EntryTime | 6 byte | + * | BITSTRING | 4 byte | * * The SV subscriber API can be used independent of the IEC 61850 client API. In order to access the SVCB via MMS you * have to use the IEC 61850 client API. Please see \ref ClientSVControlBlock object in section \ref IEC61850_CLIENT_SV. @@ -321,6 +322,17 @@ SVClientASDU_getINT16(SVClientASDU self, int index); int32_t SVClientASDU_getINT32(SVClientASDU self, int index); +/** + * \brief Get an INT64 data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +int64_t +SVClientASDU_getINT64(SVClientASDU self, int index); + /** * \brief Get an INT8U data value in the data part of the ASDU * @@ -354,6 +366,17 @@ SVClientASDU_getINT16U(SVClientASDU self, int index); uint32_t SVClientASDU_getINT32U(SVClientASDU self, int index); +/** + * \brief Get an INT64U data value in the data part of the ASDU + * + * \param self ASDU object instance + * \param index the index (byte position of the start) of the data in the data part + * + * \return SV data + */ +uint64_t +SVClientASDU_getINT64U(SVClientASDU self, int index); + /** * \brief Get an FLOAT32 data value in the data part of the ASDU * From 304768185409c9c76801231bdac5560cfa9cb318 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 9 Nov 2017 22:11:47 +0100 Subject: [PATCH 43/64] refactoring: use spaces instead of tabs consistently --- src/sampled_values/sv_publisher.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sampled_values/sv_publisher.c b/src/sampled_values/sv_publisher.c index bc777fe8..77916c01 100644 --- a/src/sampled_values/sv_publisher.c +++ b/src/sampled_values/sv_publisher.c @@ -257,13 +257,13 @@ encodeUtcTime(uint64_t timeval, uint8_t* buffer, int bufPos) SampledValuesPublisher SampledValuesPublisher_create(CommParameters* parameters, const char* interfaceId) { - SampledValuesPublisher self = (SampledValuesPublisher) GLOBAL_CALLOC(1, sizeof(struct sSampledValuesPublisher)); + SampledValuesPublisher self = (SampledValuesPublisher) GLOBAL_CALLOC(1, sizeof(struct sSampledValuesPublisher)); - self->asduLIst = NULL; + self->asduLIst = NULL; - preparePacketBuffer(self, parameters, interfaceId); + preparePacketBuffer(self, parameters, interfaceId); - return self; + return self; } SV_ASDU @@ -465,7 +465,7 @@ SampledValuesPublisher_publish(SampledValuesPublisher self) void SampledValuesPublisher_destroy(SampledValuesPublisher self) { - GLOBAL_FREEMEM(self->buffer); + GLOBAL_FREEMEM(self->buffer); } From fc6e3892c68a44ece3997b6d4311194b7c3e41aa Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 11:43:14 +0100 Subject: [PATCH 44/64] added Travis-CI config --- .travis.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..72586d43 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +language: c +compiler: + - clang + - gcc + +addons: + apt: + packages: + - cmake + - time + +script: + - cmake . + - make + - make examples From 02bc54a8c25291f3d5cf63be4b3b68816778fc1b Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 11:51:22 +0100 Subject: [PATCH 45/64] fix wrong #cmakedefine01 statement --- config/stack_config.h.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/stack_config.h.cmake b/config/stack_config.h.cmake index c85e15d9..c36f782d 100644 --- a/config/stack_config.h.cmake +++ b/config/stack_config.h.cmake @@ -29,9 +29,9 @@ #cmakedefine01 DEBUG_MMS_SERVER #cmakedefine01 DEBUG_GOOSE_SUBSCRIBER #cmakedefine01 DEBUG_GOOSE_PUBLISHER -#cmakedefine01 DEBUG_SV_SUBSCRIBER 0 -#cmakedefine01 DEBUG_SV_PUBLISHER 0 -#cmakedefine01 DEBUG_HAL_ETHERNET 0 +#cmakedefine01 DEBUG_SV_SUBSCRIBER +#cmakedefine01 DEBUG_SV_PUBLISHER +#cmakedefine01 DEBUG_HAL_ETHERNET /* 1 ==> server runs in single threaded mode (one dedicated thread for the server) * 0 ==> server runs in multi threaded mode (one thread for each connection and From 4fb314108806d0ec0920533543127e8c8f4fef6f Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 12:11:54 +0100 Subject: [PATCH 46/64] enable build on OS X and Python bindings --- .travis.yml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 72586d43..3c601deb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,9 @@ language: c + +os: + - linux + - osx + compiler: - clang - gcc @@ -7,9 +12,15 @@ addons: apt: packages: - cmake - - time + - swig + - libsqlite3-dev + - python-dev + +before_install: + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then + brew update; + brew install swig python sqlite; + fi script: - - cmake . - - make - - make examples + - mkdir build && cd build && cmake .. -DBUILD_PYTHON_BINDINGS=ON && make From 064bfa902e91772fedc6a6158bb29c5318eec284 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 14:14:01 +0100 Subject: [PATCH 47/64] mostly cosmetical cleanup of CMakeLists --- CMakeLists.txt | 97 +++++++++++++++++++-------------------- examples/CMakeLists.txt | 41 ++++++++--------- pyiec61850/CMakeLists.txt | 55 +++++++++++++--------- 3 files changed, 100 insertions(+), 93 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bcabf08..440acaf5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,9 +2,9 @@ cmake_minimum_required(VERSION 2.8) # automagically detect if we should cross-compile if(DEFINED ENV{TOOLCHAIN}) - set(CMAKE_C_COMPILER $ENV{TOOLCHAIN}gcc) - set(CMAKE_CXX_COMPILER $ENV{TOOLCHAIN}g++) - set(CMAKE_AR "$ENV{TOOLCHAIN}ar" CACHE FILEPATH "CW archiver" FORCE) + set(CMAKE_C_COMPILER $ENV{TOOLCHAIN}gcc) + set(CMAKE_CXX_COMPILER $ENV{TOOLCHAIN}g++) + set(CMAKE_AR "$ENV{TOOLCHAIN}ar" CACHE FILEPATH "CW archiver" FORCE) endif() project(libiec61850) @@ -32,20 +32,15 @@ option(BUILD_PYTHON_BINDINGS "Build Python bindings" OFF) option(CONFIG_MMS_SINGLE_THREADED "Compile for single threaded version" ON) option(CONFIG_MMS_THREADLESS_STACK "Optimize stack for threadless operation (warning: single- or multi-threaded server will not work!)" OFF) - -# choose the library features which shall be included +option(CONFIG_ACTIVATE_TCP_KEEPALIVE "Activate TCP keepalive" ON) option(CONFIG_INCLUDE_GOOSE_SUPPORT "Build with GOOSE support" ON) +# choose the library features which shall be included option(CONFIG_IEC61850_CONTROL_SERVICE "Build with support for IEC 61850 control features" ON) - option(CONFIG_IEC61850_REPORT_SERVICE "Build with support for IEC 61850 reporting services" ON) - option(CONFIG_IEC61850_LOG_SERVICE "Build with support for IEC 61850 logging services" ON) - option(CONFIG_IEC61850_SETTING_GROUPS "Build with support for IEC 61850 setting group services" ON) -option(CONFIG_ACTIVATE_TCP_KEEPALIVE "Activate TCP keepalive" ON) - set(CONFIG_REPORTING_DEFAULT_REPORT_BUFFER_SIZE "8000" CACHE STRING "Default buffer size for buffered reports in byte" ) # advanced options @@ -62,17 +57,17 @@ option(DEBUG_MMS_CLIENT "Enable MMS CLIENT printf debugging" OFF) # DEBUG_IED_CLIENT DEBUG_MMS_SERVER DEBUG_MMS_CLIENT) include_directories( - ${CMAKE_CURRENT_BINARY_DIR}/config - ${CMAKE_CURRENT_LIST_DIR}/src/common/inc - ${CMAKE_CURRENT_LIST_DIR}/src/goose - ${CMAKE_CURRENT_LIST_DIR}/src/sampled_values - ${CMAKE_CURRENT_LIST_DIR}/src/hal/inc - ${CMAKE_CURRENT_LIST_DIR}/src/iec61850/inc - ${CMAKE_CURRENT_LIST_DIR}/src/iec61850/inc_private - ${CMAKE_CURRENT_LIST_DIR}/src/mms/inc - ${CMAKE_CURRENT_LIST_DIR}/src/mms/inc_private - ${CMAKE_CURRENT_LIST_DIR}/src/mms/iso_mms/asn1c - ${CMAKE_CURRENT_LIST_DIR}/src/logging + config + src/common/inc + src/goose + src/sampled_values + src/hal/inc + src/iec61850/inc + src/iec61850/inc_private + src/mms/inc + src/mms/inc_private + src/mms/iso_mms/asn1c + src/logging ) set(API_HEADERS @@ -114,42 +109,42 @@ set(API_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/config/stack_config.h ) -IF(MSVC) -include_directories( - src/vs -) -ENDIF(MSVC) +if(MSVC) + include_directories( + src/vs + ) +endif(MSVC) # write the detected stuff to this file configure_file(${CMAKE_CURRENT_LIST_DIR}/config/stack_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config/stack_config.h) if(BUILD_EXAMPLES) - add_subdirectory(examples) + add_subdirectory(examples) endif(BUILD_EXAMPLES) add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/src) -INSTALL(FILES ${API_HEADERS} DESTINATION include/libiec61850 COMPONENT Development) - -IF(BUILD_PYTHON_BINDINGS) - add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/pyiec61850) -ENDIF(BUILD_PYTHON_BINDINGS) - -IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") -INCLUDE(InstallRequiredSystemLibraries) - -SET(CPACK_PACKAGE_DESCRIPTION "IEC 61850 MMS/GOOSE client and server library") -SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "IEC 61850 MMS/GOOSE client and server library") -SET(CPACK_PACKAGE_VENDOR "MZ Automation GmbH") -SET(CPACK_PACKAGE_CONTACT "info@libiec61850.com") -SET(CPACK_PACKAGE_VERSION_MAJOR "${LIB_VERSION_MAJOR}") -SET(CPACK_PACKAGE_VERSION_MINOR "${LIB_VERSION_MINOR}") -SET(CPACK_PACKAGE_VERSION_PATCH "${LIB_VERSION_PATCH}") -SET(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}_${CMAKE_SYSTEM_PROCESSOR}") -SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") - -SET(CPACK_COMPONENTS_ALL Libraries Development Applications) -#set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}") -INCLUDE(CPack) - -ENDIF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") +install(FILES ${API_HEADERS} DESTINATION include/libiec61850 COMPONENT Development) + +if(BUILD_PYTHON_BINDINGS) + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/pyiec61850) +endif(BUILD_PYTHON_BINDINGS) + +if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") + include(InstallRequiredSystemLibraries) + + set(CPACK_PACKAGE_DESCRIPTION "IEC 61850 MMS/GOOSE client and server library") + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "IEC 61850 MMS/GOOSE client and server library") + set(CPACK_PACKAGE_VENDOR "MZ Automation GmbH") + set(CPACK_PACKAGE_CONTACT "info@libiec61850.com") + set(CPACK_PACKAGE_VERSION_MAJOR "${LIB_VERSION_MAJOR}") + set(CPACK_PACKAGE_VERSION_MINOR "${LIB_VERSION_MINOR}") + set(CPACK_PACKAGE_VERSION_PATCH "${LIB_VERSION_PATCH}") + set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}_${CMAKE_SYSTEM_PROCESSOR}") + set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}_${LIB_VERSION_MAJOR}.${LIB_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") + + set(CPACK_COMPONENTS_ALL Libraries Development Applications) + #set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}") + + include(CPack) +endif(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index dba5285f..2502ff10 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -11,35 +11,34 @@ add_subdirectory(server_example_61400_25) add_subdirectory(server_example_setting_groups) add_subdirectory(server_example_logging) add_subdirectory(server_example_files) + add_subdirectory(iec61850_client_example1) add_subdirectory(iec61850_client_example2) add_subdirectory(iec61850_client_example3) add_subdirectory(iec61850_client_example4) add_subdirectory(iec61850_client_example5) -IF(WIN32) -else() -add_subdirectory(iec61850_client_example_files) -endif() add_subdirectory(iec61850_client_example_reporting) add_subdirectory(iec61850_client_example_log) -IF(WIN32) -if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/Lib/wpcap.lib") -message("Found winpcap -> compile examples for GOOSE and SV") -add_subdirectory(server_example_goose) -add_subdirectory(goose_subscriber) -add_subdirectory(goose_publisher) -add_subdirectory(sv_subscriber) -add_subdirectory(iec61850_9_2_LE_example) -add_subdirectory(iec61850_sv_client_example) -add_subdirectory(sv_publisher) +if(NOT WIN32) + add_subdirectory(iec61850_client_example_files) endif() + +if(WIN32) + if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/winpcap/Lib/wpcap.lib") + set(BUILD_SV_GOOSE_EXAMPLES ON) + message("Found winpcap -> compile examples for GOOSE and SV") + endif() else() -add_subdirectory(server_example_goose) -add_subdirectory(goose_subscriber) -add_subdirectory(goose_publisher) -add_subdirectory(sv_subscriber) -add_subdirectory(iec61850_9_2_LE_example) -add_subdirectory(iec61850_sv_client_example) -add_subdirectory(sv_publisher) + set(BUILD_SV_GOOSE_EXAMPLES ON) +endif() + +if(${BUILD_SV_GOOSE_EXAMPLES}) + add_subdirectory(server_example_goose) + add_subdirectory(goose_subscriber) + add_subdirectory(goose_publisher) + add_subdirectory(sv_subscriber) + add_subdirectory(iec61850_9_2_LE_example) + add_subdirectory(iec61850_sv_client_example) + add_subdirectory(sv_publisher) endif() diff --git a/pyiec61850/CMakeLists.txt b/pyiec61850/CMakeLists.txt index f5f0f922..235b832e 100644 --- a/pyiec61850/CMakeLists.txt +++ b/pyiec61850/CMakeLists.txt @@ -1,23 +1,36 @@ -FIND_PACKAGE(SWIG REQUIRED) -INCLUDE(${SWIG_USE_FILE}) -FIND_PACKAGE(PythonLibs REQUIRED) -FIND_PACKAGE ( PythonInterp ${PYTHONLIBS_VERSION_STRING} EXACT REQUIRED ) -INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -SET(CMAKE_SWIG_FLAGS "") -SET_PROPERTY(SOURCE iec61850.i PROPERTY CPLUSPLUS ON) -SWIG_ADD_MODULE(iec61850 python iec61850.i) -IF(WIN32) - SWIG_LINK_LIBRARIES(iec61850 ${PYTHON_LIBRARIES} iec61850 ws2_32) -ELSE() - SWIG_LINK_LIBRARIES(iec61850 ${PYTHON_LIBRARIES} iec61850-shared) -ENDIF(WIN32) -EXECUTE_PROCESS ( #Finding python modules install path - COMMAND ${PYTHON_EXECUTABLE} -c - "import site, sys; sys.stdout.write(site.getsitepackages()[-1])" - OUTPUT_VARIABLE PYTHON_SITE_DIR - ) -INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/iec61850.py DESTINATION ${PYTHON_SITE_DIR}) -INSTALL ( TARGETS _iec61850 LIBRARY DESTINATION ${PYTHON_SITE_DIR}) +find_package(SWIG REQUIRED) +include(${SWIG_USE_FILE}) + +find_package(PythonLibs REQUIRED) +find_package(PythonInterp ${PYTHONLIBS_VERSION_STRING} EXACT REQUIRED) + +include_directories(${PYTHON_INCLUDE_PATH}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + +set(CMAKE_SWIG_FLAGS "") +set_property(SOURCE iec61850.i PROPERTY CPLUSPLUS ON) + +if(WIN32) + set(LIBS iec61850 ws2_32) +else() + set(LIBS iec61850 iec61850-shared) +endif() + +swig_add_library(iec61850 + LANGUAGE python + SOURCES iec61850.i +) + +swig_link_libraries(iec61850 ${PYTHON_LIBRARIES} ${LIBS}) + +# Finding python modules install path +execute_process( + COMMAND ${PYTHON_EXECUTABLE} -c + "import site, sys; sys.stdout.write(site.getsitepackages()[-1])" + OUTPUT_VARIABLE PYTHON_SITE_DIR +) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/iec61850.py DESTINATION ${PYTHON_SITE_DIR}) +install(TARGETS _iec61850 LIBRARY DESTINATION ${PYTHON_SITE_DIR}) add_test(test_pyiec61850 ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_LIST_DIR}/test_pyiec61850.py) From 403c3a9e931585404bc4fa351c20a24a50a9ba9e Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 14:14:30 +0100 Subject: [PATCH 48/64] added missing case to switch statement in order to silence compiler warnings --- examples/iec61850_client_example_files/file-tool.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/iec61850_client_example_files/file-tool.c b/examples/iec61850_client_example_files/file-tool.c index 4610c7bd..53f23086 100644 --- a/examples/iec61850_client_example_files/file-tool.c +++ b/examples/iec61850_client_example_files/file-tool.c @@ -248,6 +248,8 @@ main(int argc, char** argv) case FileOperationType_Set: setFile(con); break; + case FileOperationType_None: + break; } From 581bd6e9af4de1a94f78d2f413dad770eb322134 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 14:19:30 +0100 Subject: [PATCH 49/64] run tests in Travis-CI --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c601deb..42856c26 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,4 +23,7 @@ before_install: fi script: - - mkdir build && cd build && cmake .. -DBUILD_PYTHON_BINDINGS=ON && make + - mkdir build && cd build + - cmake .. -DBUILD_PYTHON_BINDINGS=ON + - make + - make test From dffe21930323f2b845bb7717cf7b1c28ca873101 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 14:36:49 +0100 Subject: [PATCH 50/64] fix version incompatability in Swig --- .travis.yml | 2 +- build/pyiec61850/CTestTestfile.cmake | 7 + build/pyiec61850/Makefile | 266 +++++++++++++++++++++++++++ pyiec61850/CMakeLists.txt | 14 +- 4 files changed, 283 insertions(+), 6 deletions(-) create mode 100644 build/pyiec61850/CTestTestfile.cmake create mode 100644 build/pyiec61850/Makefile diff --git a/.travis.yml b/.travis.yml index 42856c26..13ffe2b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,9 +21,9 @@ before_install: brew update; brew install swig python sqlite; fi + - mkdir -p build && cd build script: - - mkdir build && cd build - cmake .. -DBUILD_PYTHON_BINDINGS=ON - make - make test diff --git a/build/pyiec61850/CTestTestfile.cmake b/build/pyiec61850/CTestTestfile.cmake new file mode 100644 index 00000000..628a0177 --- /dev/null +++ b/build/pyiec61850/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/pyiec61850 +# Build directory: /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/pyiec61850 +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +add_test(test_pyiec61850 "/opt/local/bin/python3.6" "/Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/pyiec61850/test_pyiec61850.py") diff --git a/build/pyiec61850/Makefile b/build/pyiec61850/Makefile new file mode 100644 index 00000000..bd54c89f --- /dev/null +++ b/build/pyiec61850/Makefile @@ -0,0 +1,266 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.9 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /opt/local/bin/cmake + +# The command to remove a file. +RM = /opt/local/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /opt/local/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /opt/local/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /opt/local/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /opt/local/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Development\" \"Libraries\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /opt/local/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /opt/local/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /opt/local/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." + /opt/local/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /opt/local/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Run CPack packaging tool for source..." + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && /opt/local/bin/cpack --config ./CPackSourceConfig.cmake /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source + +.PHONY : package_source/fast + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Run CPack packaging tool..." + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && /opt/local/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package + +.PHONY : package/fast + +# The main all target +all: cmake_check_build_system + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(CMAKE_COMMAND) -E cmake_progress_start /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/CMakeFiles /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/pyiec61850/CMakeFiles/progress.marks + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/all + $(CMAKE_COMMAND) -E cmake_progress_start /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +pyiec61850/CMakeFiles/_iec61850.dir/rule: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/CMakeFiles/_iec61850.dir/rule +.PHONY : pyiec61850/CMakeFiles/_iec61850.dir/rule + +# Convenience name for target. +_iec61850: pyiec61850/CMakeFiles/_iec61850.dir/rule + +.PHONY : _iec61850 + +# fast build rule for target. +_iec61850/fast: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f pyiec61850/CMakeFiles/_iec61850.dir/build.make pyiec61850/CMakeFiles/_iec61850.dir/build +.PHONY : _iec61850/fast + +iec61850PYTHON_wrap.o: iec61850PYTHON_wrap.cxx.o + +.PHONY : iec61850PYTHON_wrap.o + +# target to build an object file +iec61850PYTHON_wrap.cxx.o: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f pyiec61850/CMakeFiles/_iec61850.dir/build.make pyiec61850/CMakeFiles/_iec61850.dir/iec61850PYTHON_wrap.cxx.o +.PHONY : iec61850PYTHON_wrap.cxx.o + +iec61850PYTHON_wrap.i: iec61850PYTHON_wrap.cxx.i + +.PHONY : iec61850PYTHON_wrap.i + +# target to preprocess a source file +iec61850PYTHON_wrap.cxx.i: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f pyiec61850/CMakeFiles/_iec61850.dir/build.make pyiec61850/CMakeFiles/_iec61850.dir/iec61850PYTHON_wrap.cxx.i +.PHONY : iec61850PYTHON_wrap.cxx.i + +iec61850PYTHON_wrap.s: iec61850PYTHON_wrap.cxx.s + +.PHONY : iec61850PYTHON_wrap.s + +# target to generate assembly for a file +iec61850PYTHON_wrap.cxx.s: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f pyiec61850/CMakeFiles/_iec61850.dir/build.make pyiec61850/CMakeFiles/_iec61850.dir/iec61850PYTHON_wrap.cxx.s +.PHONY : iec61850PYTHON_wrap.cxx.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install/strip" + @echo "... install" + @echo "... list_install_components" + @echo "... install/local" + @echo "... test" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... package_source" + @echo "... package" + @echo "... _iec61850" + @echo "... iec61850PYTHON_wrap.o" + @echo "... iec61850PYTHON_wrap.i" + @echo "... iec61850PYTHON_wrap.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/pyiec61850/CMakeLists.txt b/pyiec61850/CMakeLists.txt index 235b832e..156f90f2 100644 --- a/pyiec61850/CMakeLists.txt +++ b/pyiec61850/CMakeLists.txt @@ -13,13 +13,17 @@ set_property(SOURCE iec61850.i PROPERTY CPLUSPLUS ON) if(WIN32) set(LIBS iec61850 ws2_32) else() - set(LIBS iec61850 iec61850-shared) + set(LIBS iec61850-shared) endif() -swig_add_library(iec61850 - LANGUAGE python - SOURCES iec61850.i -) +if(${SWIG_VERSION} VERSION_LESS 3.0) + swig_add_module(iec61850 python iec61850.i) +else() + swig_add_library(iec61850 + LANGUAGE python + SOURCES iec61850.i + ) +endif() swig_link_libraries(iec61850 ${PYTHON_LIBRARIES} ${LIBS}) From 1d8d6211ca2962ea0aba7c2b2977f160ff7aa1a4 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 14:55:14 +0100 Subject: [PATCH 51/64] remove OS X to cut build time --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 13ffe2b3..c1b0da08 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,5 @@ language: c -os: - - linux - - osx - compiler: - clang - gcc From 628641cabbec0b9f8bb8b997d0bcd08821ca5800 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 15:45:34 +0100 Subject: [PATCH 52/64] sampled values: add support for sample rate attribute --- src/sampled_values/sv_publisher.c | 10 +++++++++- src/sampled_values/sv_publisher.h | 12 ++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/sampled_values/sv_publisher.c b/src/sampled_values/sv_publisher.c index bc777fe8..58b4e5aa 100644 --- a/src/sampled_values/sv_publisher.c +++ b/src/sampled_values/sv_publisher.c @@ -59,6 +59,7 @@ struct sSV_ASDU { uint64_t refrTm; uint8_t smpMod; + uint16_t smpRate; uint8_t* smpCntBuf; @@ -369,7 +370,8 @@ SV_ASDU_encodeToBuffer(SV_ASDU self, uint8_t* buffer, int bufPos) buffer[bufPos++] = self->smpSynch; /* SmpRate */ - //TODO implement me + bufPos = BerEncoder_encodeTL(0x86, 2, buffer, bufPos); + bufPos = encodeUInt16FixedSize(self->smpRate, buffer, bufPos); /* Sample */ bufPos = BerEncoder_encodeTL(0x87, self->dataSize, buffer, bufPos); @@ -596,3 +598,9 @@ SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod) self->smpMod = smpMod; } +void +SV_ASDU_setSmpRate(SV_ASDU self, uint8_t smpRate) +{ + self->hasSmpRate = true; + self->smpRate = smpRate; +} diff --git a/src/sampled_values/sv_publisher.h b/src/sampled_values/sv_publisher.h index 458b00b2..8e843b36 100644 --- a/src/sampled_values/sv_publisher.h +++ b/src/sampled_values/sv_publisher.h @@ -121,6 +121,18 @@ SV_ASDU_setRefrTm(SV_ASDU self, uint64_t refrTm); void SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod); +/** + * \brief Set the sample rate of the ASDU. + * + * If not set the transmitted ASDU will not contain an smpRate value. + * + * \param self the SV_ASDU + * + * \param smpRate Amount of samples (default per nominal period, see SmpMod). + */ +void +SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod); + #ifdef __cplusplus } #endif From 60c7d3a75fae124b779749795fb2fcbceef555cb Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 15:32:40 +0100 Subject: [PATCH 53/64] sampled values: fix encoding of optional smpMod attribute: - The attribute must be encoded as an 16bit unsigned integer. The existing code encodes it as 32 bit integer. - The attribute is encoded with the ASN.1 BER encoding Tag number 8. The existing code encodes it with tag number 4 which is used for the refrTm attribute. See also: IEC 61850-9-2:2011 (page 20) --- src/sampled_values/sv_publisher.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/sampled_values/sv_publisher.c b/src/sampled_values/sv_publisher.c index bc777fe8..1ea66116 100644 --- a/src/sampled_values/sv_publisher.c +++ b/src/sampled_values/sv_publisher.c @@ -377,15 +377,11 @@ SV_ASDU_encodeToBuffer(SV_ASDU self, uint8_t* buffer, int bufPos) self->_dataBuffer = buffer + bufPos; bufPos += self->dataSize; /* data has to inserted by user before sending message */ - + /* SmpMod */ if (self->hasSmpMod) { - bufPos = BerEncoder_encodeTL(0x84, 4, buffer, bufPos); - buffer[bufPos++] = 0; - buffer[bufPos++] = 0; - buffer[bufPos++] = 0; - buffer[bufPos++] = self->smpMod; - + bufPos = BerEncoder_encodeTL(0x88, 4, buffer, bufPos); + bufPos = encodeUint16FixedSize(self->smpMod, buffer, bufPos); } return bufPos; From e95b321d12c84810a17ef0535a185a2543bcabd8 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 10 Nov 2017 16:50:05 +0100 Subject: [PATCH 54/64] sampled values: fix data type for smpRate --- src/sampled_values/sv_publisher.c | 2 +- src/sampled_values/sv_publisher.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sampled_values/sv_publisher.c b/src/sampled_values/sv_publisher.c index 58b4e5aa..de6e21a4 100644 --- a/src/sampled_values/sv_publisher.c +++ b/src/sampled_values/sv_publisher.c @@ -599,7 +599,7 @@ SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod) } void -SV_ASDU_setSmpRate(SV_ASDU self, uint8_t smpRate) +SV_ASDU_setSmpRate(SV_ASDU self, uint16_t smpRate) { self->hasSmpRate = true; self->smpRate = smpRate; diff --git a/src/sampled_values/sv_publisher.h b/src/sampled_values/sv_publisher.h index 8e843b36..f0954395 100644 --- a/src/sampled_values/sv_publisher.h +++ b/src/sampled_values/sv_publisher.h @@ -131,7 +131,7 @@ SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod); * \param smpRate Amount of samples (default per nominal period, see SmpMod). */ void -SV_ASDU_setSmpMod(SV_ASDU self, uint8_t smpMod); +SV_ASDU_setSmpRate(SV_ASDU self, uint16_t smpRate); #ifdef __cplusplus } From ddae3c70ee60ffe9347f690b0e98e2acd5f4978d Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 12 Nov 2017 11:13:18 +0100 Subject: [PATCH 55/64] use correct include path for generated configuration files --- CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 440acaf5..cff01918 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ option(DEBUG_MMS_CLIENT "Enable MMS CLIENT printf debugging" OFF) # DEBUG_IED_CLIENT DEBUG_MMS_SERVER DEBUG_MMS_CLIENT) include_directories( - config + ${CMAKE_CURRENT_BINARY_DIR}/config src/common/inc src/goose src/sampled_values @@ -116,7 +116,10 @@ if(MSVC) endif(MSVC) # write the detected stuff to this file -configure_file(${CMAKE_CURRENT_LIST_DIR}/config/stack_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config/stack_config.h) +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/config/stack_config.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/config/stack_config.h +) if(BUILD_EXAMPLES) add_subdirectory(examples) From ba985ec2b021f43681dc7b9165773676c0e4d01b Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sun, 12 Nov 2017 18:34:13 +0100 Subject: [PATCH 56/64] - MMS client: delete named variable list service supports VMD specific lists --- .../client/mms_client_named_variable_list.c | 73 ++++++++++++------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/src/mms/iso_mms/client/mms_client_named_variable_list.c b/src/mms/iso_mms/client/mms_client_named_variable_list.c index e678388f..9714fd7e 100644 --- a/src/mms/iso_mms/client/mms_client_named_variable_list.c +++ b/src/mms/iso_mms/client/mms_client_named_variable_list.c @@ -35,45 +35,48 @@ void mmsClient_createDeleteNamedVariableListRequest(long invokeId, ByteBuffer* writeBuffer, - const char* domainId, const char* listNameId) + const char* domainId, const char* listNameId) { - MmsPdu_t* mmsPdu = mmsClient_createConfirmedRequestPdu(invokeId); + MmsPdu_t* mmsPdu = mmsClient_createConfirmedRequestPdu(invokeId); - mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.present = - ConfirmedServiceRequest_PR_deleteNamedVariableList; + mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.present = + ConfirmedServiceRequest_PR_deleteNamedVariableList; - DeleteNamedVariableListRequest_t* request = - &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.deleteNamedVariableList); + DeleteNamedVariableListRequest_t* request = + &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.deleteNamedVariableList); - request->listOfVariableListName = (struct DeleteNamedVariableListRequest__listOfVariableListName*) GLOBAL_CALLOC(1, - sizeof(struct DeleteNamedVariableListRequest__listOfVariableListName)); + request->listOfVariableListName = (struct DeleteNamedVariableListRequest__listOfVariableListName*) GLOBAL_CALLOC(1, + sizeof(struct DeleteNamedVariableListRequest__listOfVariableListName)); - request->listOfVariableListName->list.count = 1; - request->listOfVariableListName->list.size = 1; + request->listOfVariableListName->list.count = 1; + request->listOfVariableListName->list.size = 1; - request->listOfVariableListName->list.array = (ObjectName_t**) GLOBAL_CALLOC(1, sizeof(ObjectName_t*)); - request->listOfVariableListName->list.array[0] = (ObjectName_t*) GLOBAL_CALLOC(1, sizeof(ObjectName_t)); + request->listOfVariableListName->list.array = (ObjectName_t**) GLOBAL_CALLOC(1, sizeof(ObjectName_t*)); + request->listOfVariableListName->list.array[0] = (ObjectName_t*) GLOBAL_CALLOC(1, sizeof(ObjectName_t)); - if (domainId != NULL) { + if (domainId != NULL) { request->listOfVariableListName->list.array[0]->present = ObjectName_PR_domainspecific; request->listOfVariableListName->list.array[0]->choice.domainspecific.domainId.size = strlen(domainId); - request->listOfVariableListName->list.array[0]->choice.domainspecific.domainId.buf = (uint8_t*) StringUtils_copyString(domainId); + request->listOfVariableListName->list.array[0]->choice.domainspecific.domainId.buf = + (uint8_t*) StringUtils_copyString(domainId); request->listOfVariableListName->list.array[0]->choice.domainspecific.itemId.size = strlen(listNameId); - request->listOfVariableListName->list.array[0]->choice.domainspecific.itemId.buf = (uint8_t*) StringUtils_copyString(listNameId); - } - else { - request->listOfVariableListName->list.array[0]->present = ObjectName_PR_vmdspecific; - request->listOfVariableListName->list.array[0]->choice.vmdspecific.size = strlen(listNameId); - request->listOfVariableListName->list.array[0]->choice.vmdspecific.buf = (uint8_t*) StringUtils_copyString(listNameId); - } - - request->scopeOfDelete = (INTEGER_t*) GLOBAL_CALLOC(1, sizeof(INTEGER_t)); - asn_long2INTEGER(request->scopeOfDelete, DeleteNamedVariableListRequest__scopeOfDelete_specific); + request->listOfVariableListName->list.array[0]->choice.domainspecific.itemId.buf = + (uint8_t*) StringUtils_copyString(listNameId); + } + else { + request->listOfVariableListName->list.array[0]->present = ObjectName_PR_vmdspecific; + request->listOfVariableListName->list.array[0]->choice.vmdspecific.size = strlen(listNameId); + request->listOfVariableListName->list.array[0]->choice.vmdspecific.buf = + (uint8_t*) StringUtils_copyString(listNameId); + } + + request->scopeOfDelete = (INTEGER_t*) GLOBAL_CALLOC(1, sizeof(INTEGER_t)); + asn_long2INTEGER(request->scopeOfDelete, DeleteNamedVariableListRequest__scopeOfDelete_specific); der_encode(&asn_DEF_MmsPdu, mmsPdu, - (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); + (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); - asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); + asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); } void @@ -220,11 +223,25 @@ parseNamedVariableAttributes(GetNamedVariableListAttributesResponse_t* response, LinkedList attributes = LinkedList_create(); for (i = 0; i < attributesCount; i++) { - char* domainId = mmsMsg_createStringFromAsnIdentifier(response->listOfVariable.list.array[i]-> + + char* domainId; + char* itemId; + + + if (response->listOfVariable.list.array[i]->variableSpecification.choice.name.present == ObjectName_PR_vmdspecific) { + + domainId = NULL; + + itemId = mmsMsg_createStringFromAsnIdentifier(response->listOfVariable.list.array[i]-> + variableSpecification.choice.name.choice.vmdspecific); + } + else { + domainId = mmsMsg_createStringFromAsnIdentifier(response->listOfVariable.list.array[i]-> variableSpecification.choice.name.choice.domainspecific.domainId); - char* itemId = mmsMsg_createStringFromAsnIdentifier(response->listOfVariable.list.array[i]-> + itemId = mmsMsg_createStringFromAsnIdentifier(response->listOfVariable.list.array[i]-> variableSpecification.choice.name.choice.domainspecific.itemId); + } MmsVariableAccessSpecification* listEntry = MmsVariableAccessSpecification_create(domainId, itemId); From bc6b7e68a8f57f48c1615e47ec497492785afb47 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sun, 12 Nov 2017 18:43:50 +0100 Subject: [PATCH 57/64] - fixed typo in src/sampled_values/sv_publisher.c --- build/pyiec61850/CTestTestfile.cmake | 7 - build/pyiec61850/Makefile | 266 --------------------------- examples/mms_utility/mms_utility.c | 2 +- src/sampled_values/sv_publisher.c | 2 +- 4 files changed, 2 insertions(+), 275 deletions(-) delete mode 100644 build/pyiec61850/CTestTestfile.cmake delete mode 100644 build/pyiec61850/Makefile diff --git a/build/pyiec61850/CTestTestfile.cmake b/build/pyiec61850/CTestTestfile.cmake deleted file mode 100644 index 628a0177..00000000 --- a/build/pyiec61850/CTestTestfile.cmake +++ /dev/null @@ -1,7 +0,0 @@ -# CMake generated Testfile for -# Source directory: /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/pyiec61850 -# Build directory: /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/pyiec61850 -# -# This file includes the relevant testing commands required for -# testing this directory and lists subdirectories to be tested as well. -add_test(test_pyiec61850 "/opt/local/bin/python3.6" "/Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/pyiec61850/test_pyiec61850.py") diff --git a/build/pyiec61850/Makefile b/build/pyiec61850/Makefile deleted file mode 100644 index bd54c89f..00000000 --- a/build/pyiec61850/Makefile +++ /dev/null @@ -1,266 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.9 - -# Default target executed when no arguments are given to make. -default_target: all - -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /opt/local/bin/cmake - -# The command to remove a file. -RM = /opt/local/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850 - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target install/strip -install/strip: preinstall - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." - /opt/local/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake -.PHONY : install/strip - -# Special rule for the target install/strip -install/strip/fast: preinstall/fast - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." - /opt/local/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake -.PHONY : install/strip/fast - -# Special rule for the target install -install: preinstall - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." - /opt/local/bin/cmake -P cmake_install.cmake -.PHONY : install - -# Special rule for the target install -install/fast: preinstall/fast - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." - /opt/local/bin/cmake -P cmake_install.cmake -.PHONY : install/fast - -# Special rule for the target list_install_components -list_install_components: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Development\" \"Libraries\" \"Unspecified\"" -.PHONY : list_install_components - -# Special rule for the target list_install_components -list_install_components/fast: list_install_components - -.PHONY : list_install_components/fast - -# Special rule for the target install/local -install/local: preinstall - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." - /opt/local/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake -.PHONY : install/local - -# Special rule for the target install/local -install/local/fast: preinstall/fast - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." - /opt/local/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake -.PHONY : install/local/fast - -# Special rule for the target test -test: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." - /opt/local/bin/ctest --force-new-ctest-process $(ARGS) -.PHONY : test - -# Special rule for the target test -test/fast: test - -.PHONY : test/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /opt/local/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache - -.PHONY : edit_cache/fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /opt/local/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache - -.PHONY : rebuild_cache/fast - -# Special rule for the target package_source -package_source: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Run CPack packaging tool for source..." - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && /opt/local/bin/cpack --config ./CPackSourceConfig.cmake /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/CPackSourceConfig.cmake -.PHONY : package_source - -# Special rule for the target package_source -package_source/fast: package_source - -.PHONY : package_source/fast - -# Special rule for the target package -package: preinstall - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Run CPack packaging tool..." - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && /opt/local/bin/cpack --config ./CPackConfig.cmake -.PHONY : package - -# Special rule for the target package -package/fast: package - -.PHONY : package/fast - -# The main all target -all: cmake_check_build_system - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(CMAKE_COMMAND) -E cmake_progress_start /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/CMakeFiles /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/pyiec61850/CMakeFiles/progress.marks - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/all - $(CMAKE_COMMAND) -E cmake_progress_start /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/clean -.PHONY : clean - -# The main clean target -clean/fast: clean - -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -# Convenience name for target. -pyiec61850/CMakeFiles/_iec61850.dir/rule: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f CMakeFiles/Makefile2 pyiec61850/CMakeFiles/_iec61850.dir/rule -.PHONY : pyiec61850/CMakeFiles/_iec61850.dir/rule - -# Convenience name for target. -_iec61850: pyiec61850/CMakeFiles/_iec61850.dir/rule - -.PHONY : _iec61850 - -# fast build rule for target. -_iec61850/fast: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f pyiec61850/CMakeFiles/_iec61850.dir/build.make pyiec61850/CMakeFiles/_iec61850.dir/build -.PHONY : _iec61850/fast - -iec61850PYTHON_wrap.o: iec61850PYTHON_wrap.cxx.o - -.PHONY : iec61850PYTHON_wrap.o - -# target to build an object file -iec61850PYTHON_wrap.cxx.o: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f pyiec61850/CMakeFiles/_iec61850.dir/build.make pyiec61850/CMakeFiles/_iec61850.dir/iec61850PYTHON_wrap.cxx.o -.PHONY : iec61850PYTHON_wrap.cxx.o - -iec61850PYTHON_wrap.i: iec61850PYTHON_wrap.cxx.i - -.PHONY : iec61850PYTHON_wrap.i - -# target to preprocess a source file -iec61850PYTHON_wrap.cxx.i: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f pyiec61850/CMakeFiles/_iec61850.dir/build.make pyiec61850/CMakeFiles/_iec61850.dir/iec61850PYTHON_wrap.cxx.i -.PHONY : iec61850PYTHON_wrap.cxx.i - -iec61850PYTHON_wrap.s: iec61850PYTHON_wrap.cxx.s - -.PHONY : iec61850PYTHON_wrap.s - -# target to generate assembly for a file -iec61850PYTHON_wrap.cxx.s: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(MAKE) -f pyiec61850/CMakeFiles/_iec61850.dir/build.make pyiec61850/CMakeFiles/_iec61850.dir/iec61850PYTHON_wrap.cxx.s -.PHONY : iec61850PYTHON_wrap.cxx.s - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... install/strip" - @echo "... install" - @echo "... list_install_components" - @echo "... install/local" - @echo "... test" - @echo "... edit_cache" - @echo "... rebuild_cache" - @echo "... package_source" - @echo "... package" - @echo "... _iec61850" - @echo "... iec61850PYTHON_wrap.o" - @echo "... iec61850PYTHON_wrap.i" - @echo "... iec61850PYTHON_wrap.s" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - cd /Users/stv0g/workspace/rwth/villas/node/thirdparty/libiec61850/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/examples/mms_utility/mms_utility.c b/examples/mms_utility/mms_utility.c index d6c537b6..f505348e 100644 --- a/examples/mms_utility/mms_utility.c +++ b/examples/mms_utility/mms_utility.c @@ -81,7 +81,7 @@ printJournalEntries(LinkedList journalEntries) } } -void* +void printRawMmsMessage(void* parameter, uint8_t* message, int messageLength, bool received) { if (received) diff --git a/src/sampled_values/sv_publisher.c b/src/sampled_values/sv_publisher.c index b724dd01..969992a4 100644 --- a/src/sampled_values/sv_publisher.c +++ b/src/sampled_values/sv_publisher.c @@ -411,7 +411,7 @@ SV_ASDU_encodeToBuffer(SV_ASDU self, uint8_t* buffer, int bufPos) /* SmpMod */ if (self->hasSmpMod) { bufPos = BerEncoder_encodeTL(0x88, 4, buffer, bufPos); - bufPos = encodeUint16FixedSize(self->smpMod, buffer, bufPos); + bufPos = encodeUInt16FixedSize(self->smpMod, buffer, bufPos); } return bufPos; From 87583f585958b07b242c01da60b28391ab080ad6 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sun, 12 Nov 2017 18:52:14 +0100 Subject: [PATCH 58/64] - integrated travis status into README.MD --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e4e945c0..1cd1ac84 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # README libIEC61850 +[![Build Status](https://travis-ci.org/mz-automation/libiec61850.svg?branch=master)](https://travis-ci.org/mz-automation/libiec61850) + This file is part of the documentation of **libIEC61850**. More documentation can be found online at http://libiec61850.com or in the provided doxygen documentation. Also consider to review the examples to understand how to use the library Content: From f7b04a02ed21e2b12fe4ccdb0066e804f301e33f Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 17 Nov 2017 17:29:48 +0100 Subject: [PATCH 59/64] - MMS client: fixed bug in MmsConnection_connect (COTP payload buffer was not reset in case of an error during connect -> connection failed in case of reuse of MmsConnection object) --- src/mms/iso_client/iso_client_connection.c | 1 - src/mms/iso_cotp/cotp.c | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mms/iso_client/iso_client_connection.c b/src/mms/iso_client/iso_client_connection.c index b68631b0..6f6d48f6 100644 --- a/src/mms/iso_client/iso_client_connection.c +++ b/src/mms/iso_client/iso_client_connection.c @@ -351,7 +351,6 @@ IsoClientConnection_associate(IsoClientConnection self, IsoConnectionParameters goto returnError; } - ByteBuffer_wrap(self->receivePayloadBuffer, self->acseConnection.userDataBuffer, self->acseConnection.userDataBufferSize, self->acseConnection.userDataBufferSize); diff --git a/src/mms/iso_cotp/cotp.c b/src/mms/iso_cotp/cotp.c index a29c8378..c9165afc 100644 --- a/src/mms/iso_cotp/cotp.c +++ b/src/mms/iso_cotp/cotp.c @@ -449,6 +449,8 @@ CotpConnection_init(CotpConnection* self, Socket socket, self->options.tSelDst = tsel; self->payload = payloadBuffer; + CotpConnection_resetPayload(self); + /* default TPDU size is maximum size */ CotpConnection_setTpduSize(self, COTP_MAX_TPDU_SIZE); From f0184fdd4baff1fcb73c71d6ac2fbc3e23bb6d18 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 8 Dec 2017 06:34:40 +0100 Subject: [PATCH 60/64] - fixed potential memory alignement problem --- src/mms/iso_mms/common/mms_value.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mms/iso_mms/common/mms_value.c b/src/mms/iso_mms/common/mms_value.c index f95d159e..e0a27ee6 100644 --- a/src/mms/iso_mms/common/mms_value.c +++ b/src/mms/iso_mms/common/mms_value.c @@ -1015,9 +1015,7 @@ MmsValue_cloneToBuffer(const MmsValue* self, uint8_t* destinationAddress) int i; for (i = 0; i < self->value.structure.size; i++) { - newValue->value.structure.components[i] = (MmsValue*) destinationAddress; - //memcpy(&(newValue->value.structure.components[i]), &(destinationAddress), sizeof (MmsValue*)); - + memcpy(&(newValue->value.structure.components[i]), &(destinationAddress), sizeof (MmsValue*)); destinationAddress = MmsValue_cloneToBuffer(self->value.structure.components[i], destinationAddress); } } From 0e97f4ac6b571a586edd16d245d3414f467279d2 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 14 Dec 2017 13:31:44 +0100 Subject: [PATCH 61/64] - IEC 61850 client: ClientReportControlBlock now accepts "$" and "." as seperator for RCB object reference --- src/iec61850/client/client_report_control.c | 29 +++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/iec61850/client/client_report_control.c b/src/iec61850/client/client_report_control.c index d9d187ef..bce37e21 100644 --- a/src/iec61850/client/client_report_control.c +++ b/src/iec61850/client/client_report_control.c @@ -32,12 +32,19 @@ #include "libiec61850_platform_includes.h" static bool -isBufferedRcb(const char* objectReference) +isBufferedRcb(const char* objectReference, bool* isValid) { const char* separator = strchr(objectReference, '.'); if (separator == NULL) + separator = strchr(objectReference, '$'); + + if (separator == NULL) { + *isValid = false; return false; + } + + *isValid = true; if (*(separator + 1) == 'B') return true; @@ -48,12 +55,24 @@ isBufferedRcb(const char* objectReference) ClientReportControlBlock ClientReportControlBlock_create(const char* objectReference) { - ClientReportControlBlock self = (ClientReportControlBlock) GLOBAL_CALLOC(1, sizeof(struct sClientReportControlBlock)); + bool isReferenceValid; + bool isBuffered; + + isBuffered = isBufferedRcb(objectReference, &isReferenceValid); + + if (isReferenceValid == false) { + if (DEBUG_IED_CLIENT) + printf("DEBUG_IED_CLIENT: RCB reference invalid\n"); + + return NULL; + } - //TODO check validity of object reference?! + ClientReportControlBlock self = (ClientReportControlBlock) GLOBAL_CALLOC(1, sizeof(struct sClientReportControlBlock)); - self->objectReference = StringUtils_copyString(objectReference); - self->isBuffered = isBufferedRcb(objectReference); + if (self) { + self->objectReference = StringUtils_copyString(objectReference); + self->isBuffered = isBuffered; + } return self; } From d3eee25a3a8b4b69701650703544ffd2e2b39352 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 14 Dec 2017 16:46:35 +0100 Subject: [PATCH 62/64] - IEC 61850 client: fixed bug in APC control handling --- src/iec61850/client/client_control.c | 170 ++------------------------- 1 file changed, 12 insertions(+), 158 deletions(-) diff --git a/src/iec61850/client/client_control.c b/src/iec61850/client/client_control.c index af9dd5d4..6358f614 100644 --- a/src/iec61850/client/client_control.c +++ b/src/iec61850/client/client_control.c @@ -149,6 +149,7 @@ ControlObjectClient_create(const char* objectReference, IedConnection connection bool hasOper = false; bool hasTimeActivatedControl = false; bool hasCtlNum = false; + bool isAPC = false; MmsVariableSpecification* ctlVal = NULL; MmsVariableSpecification* t = NULL; @@ -157,7 +158,12 @@ ControlObjectClient_create(const char* objectReference, IedConnection connection if (oper) { - hasOper = true; + hasOper = true; + + ctlVal = MmsVariableSpecification_getNamedVariableRecursive(oper, "ctlVal"); + + if (MmsVariableSpecification_getType(ctlVal) == MMS_STRUCTURE) + isAPC = true; MmsVariableSpecification* operTm = MmsVariableSpecification_getNamedVariableRecursive(oper, "operTm"); @@ -169,7 +175,6 @@ ControlObjectClient_create(const char* objectReference, IedConnection connection if (ctlNum) hasCtlNum = true; - ctlVal = MmsVariableSpecification_getNamedVariableRecursive(oper, "ctlVal"); t = MmsVariableSpecification_getNamedVariableRecursive(oper, "T"); } } @@ -200,6 +205,11 @@ ControlObjectClient_create(const char* objectReference, IedConnection connection self->hasCtlNum = hasCtlNum; self->ctlVal = MmsValue_newDefaultValue(ctlVal); + if (isAPC) + self->analogValue = MmsValue_createEmptyStructure(1); + else + self->analogValue = NULL; + /* Check for T element type (Binary time -> Ed.1,UTC time -> Ed.2) */ if (MmsVariableSpecification_getType(t) == MMS_BINARY_TIME) self->edition = 1; @@ -218,162 +228,6 @@ exit_function: return self; } - -#if 0 -ControlObjectClient -ControlObjectClient_create(const char* objectReference, IedConnection connection) -{ - ControlObjectClient self = NULL; - - /* request control model from server */ - char domainId[65]; - char itemId[129]; - - char* domainName = MmsMapping_getMmsDomainFromObjectReference(objectReference, domainId); - - if (domainName == NULL) - goto exit_function; - - convertToMmsAndInsertFC(itemId, objectReference + strlen(domainId) + 1, "CF"); - - int controlObjectItemIdLen = strlen(itemId); - - strncat(itemId, "$ctlModel", 64 - controlObjectItemIdLen); - - MmsError mmsError; - - MmsValue* ctlModel = MmsConnection_readVariable(IedConnection_getMmsConnection(connection), - &mmsError, domainId, itemId); - - if (ctlModel == NULL) { - if (DEBUG_IED_CLIENT) - printf("IED_CLIENT: ControlObjectClient_create: failed to get ctlModel from server\n"); - - goto exit_function; - } - - int ctlModelVal = MmsValue_toUint32(ctlModel); - - MmsValue_delete(ctlModel); - - IedClientError error; - - LinkedList dataDirectory = - IedConnection_getDataDirectory(connection, &error, objectReference); - - if (dataDirectory == NULL) { - if (DEBUG_IED_CLIENT) - printf("IED_CLIENT: ControlObjectClient_create: failed to get data directory of control object\n"); - - goto exit_function; - } - - /* check what control elements are available */ - bool hasOper = false; - - LinkedList element = LinkedList_getNext(dataDirectory); - - while (element != NULL) { - char* objectName = (char*) element->data; - - if (strcmp(objectName, "Oper") == 0) - hasOper = true; - - element = LinkedList_getNext(element); - } - - LinkedList_destroy(dataDirectory); - - if (hasOper == false) { - if (DEBUG_IED_CLIENT) - printf("IED_CLIENT: control is missing required element \"Oper\"\n"); - - goto exit_function; - } - - /* check for time activated control and ctlNum */ - bool hasTimeActivatedControl = false; - bool hasCtlNum = false; - - strcpy(itemId, objectReference); - strcat(itemId, ".Oper"); - dataDirectory = IedConnection_getDataDirectory(connection, &error, itemId); - - if (dataDirectory == NULL) - goto exit_function; - - element = LinkedList_getNext(dataDirectory); - - while (element != NULL) { - char* objectName = (char*) element->data; - - if (strcmp(objectName, "operTm") == 0) { - hasTimeActivatedControl = true; - } - else if (strcmp(objectName, "ctlNum") == 0) { - hasCtlNum = true; - } - - element = LinkedList_getNext(element); - } - - LinkedList_destroy(dataDirectory); - - /* get default parameters for Oper control variable */ - - MmsValue* oper = IedConnection_readObject(connection, &error, itemId, IEC61850_FC_CO); - - if (oper == NULL) { - if (DEBUG_IED_CLIENT) - printf("IED_CLIENT: reading \"Oper\" failed!\n"); - - goto exit_function; - } - - self = (ControlObjectClient) GLOBAL_CALLOC(1, sizeof(struct sControlObjectClient)); - - if (self == NULL) - goto exit_function; - - self->objectReference = StringUtils_copyString(objectReference); - self->connection = connection; - self->ctlModel = (ControlModel) ctlModelVal; - self->hasTimeActivatedMode = hasTimeActivatedControl; - self->hasCtlNum = hasCtlNum; - self->ctlVal = MmsValue_getElement(oper, 0); - - if (MmsValue_getType(self->ctlVal) == MMS_STRUCTURE) - self->analogValue = MmsValue_createEmptyStructure(1); - else - self->analogValue = NULL; - - - /* Check for T element type (Binary time -> Ed.1,UTC time -> Ed.2) */ - MmsValue* t; - - if (hasTimeActivatedControl) - t = MmsValue_getElement(oper, 4); - else - t = MmsValue_getElement(oper, 3); - - if (MmsValue_getType(t) == MMS_BINARY_TIME) - self->edition = 1; - else - self->edition = 2; - - if (DEBUG_IED_CLIENT) - printf("IED_CLIENT: Detected edition %i control\n", self->edition); - - MmsValue_setElement(oper, 0, NULL); - MmsValue_delete(oper); - - private_IedConnection_addControlClient(connection, self); - -exit_function: - return self; -} -#endif - void ControlObjectClient_destroy(ControlObjectClient self) { From a978286efa657c8ac275e49775fe1d16a8359154 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 14 Dec 2017 20:26:49 +0100 Subject: [PATCH 63/64] - Updated CHANGELOG; Updated version to 1.1.1 --- CHANGELOG | 22 +++++++++++++++++++ CMakeLists.txt | 2 +- config/stack_config.h | 2 +- .../inc/libiec61850_platform_includes.h | 2 +- src/doxygen.config | 2 +- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 2fc311be..25ac39bf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,25 @@ +Changes to version 1.1.1 +------------------------ + +- IEC 61850 client: fixed bug in APC control handling +- IEC 61850 client: ClientReportControlBlock now accepts "$" and "." as seperator for RCB object reference +- MMS client: fixed bug in MmsConnection_connect (COTP payload buffer was not reset in case of an error during connect -> connection failed in case of reuse of MmsConnection object +- MMS client: delete named variable list service supports VMD specific lists +- SV subscriber/publisher: additional features and bug fixes +- SV: fixed data type for smpRate +- SV: fixed encoding of optional smpMod attribute +- SV receiver: Added semaphore to make subscriber list thread-safe +- .NET API: ControlObject implements IDisposable interface +- IED server: added new function IedServer_udpateDbposValue +- fixed problem with cmake include folders +- MMS client: file services -fixed encoding problem with long file names +- MMS server: ACSE authenticator passes application reference (ap-title and ae-qualifier) +- example directory cleanup +- MMS: fixed potential memory leak in asn1 code that can be caused by malformed MMS messages +- MMS client: MmsConnection_getVariableAccessAttributes support for VMD specific variables +- Java SCL parser: added support for "Val" elements for Octet64 types + + Changes to version 1.1.0 ------------------------ diff --git a/CMakeLists.txt b/CMakeLists.txt index cff01918..95e47983 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ ENABLE_TESTING() set(LIB_VERSION_MAJOR "1") set(LIB_VERSION_MINOR "1") -set(LIB_VERSION_PATCH "0") +set(LIB_VERSION_PATCH "1") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/third_party/cmake/modules/") diff --git a/config/stack_config.h b/config/stack_config.h index 770353c2..a5ef361e 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -44,7 +44,7 @@ * * WARNING: If set to 1 normal single- and multi-threaded server are no longer working! */ -#define CONFIG_MMS_THREADLESS_STACK 0 +#define CONFIG_MMS_THREADLESS_STACK 1 /* number of concurrent MMS client connections the server accepts, -1 for no limit */ #define CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS 5 diff --git a/src/common/inc/libiec61850_platform_includes.h b/src/common/inc/libiec61850_platform_includes.h index 9130f50f..68526a4b 100644 --- a/src/common/inc/libiec61850_platform_includes.h +++ b/src/common/inc/libiec61850_platform_includes.h @@ -15,7 +15,7 @@ #include "platform_endian.h" -#define LIBIEC61850_VERSION "1.1.0" +#define LIBIEC61850_VERSION "1.1.1" #ifndef CONFIG_DEFAULT_MMS_VENDOR_NAME #define CONFIG_DEFAULT_MMS_VENDOR_NAME "libiec61850.com" diff --git a/src/doxygen.config b/src/doxygen.config index 2970a10b..69580e5d 100644 --- a/src/doxygen.config +++ b/src/doxygen.config @@ -18,7 +18,7 @@ DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "libIEC61850" -PROJECT_NUMBER = 1.1 +PROJECT_NUMBER = 1.1.1 PROJECT_BRIEF = "Open-source IEC 61850 MMS/GOOSE/SV server and client library" From 0f1afc971833165ee14277b9430baa567c1cf943 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 15 Dec 2017 09:05:46 +0100 Subject: [PATCH 64/64] - updated default configuration --- config/stack_config.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/stack_config.h b/config/stack_config.h index a5ef361e..b25c7da1 100644 --- a/config/stack_config.h +++ b/config/stack_config.h @@ -28,7 +28,7 @@ #define DEBUG_HAL_ETHERNET 0 /* Maximum MMS PDU SIZE - default is 65000 */ -#define CONFIG_MMS_MAXIMUM_PDU_SIZE 120000 +#define CONFIG_MMS_MAXIMUM_PDU_SIZE 65000 /* * Enable single threaded mode @@ -37,14 +37,14 @@ * 0 ==> server runs in multi-threaded mode (one thread for each connection and * one server background thread ) */ -#define CONFIG_MMS_SINGLE_THREADED 0 +#define CONFIG_MMS_SINGLE_THREADED 1 /* * Optimize stack for threadless operation - don't use semaphores * * WARNING: If set to 1 normal single- and multi-threaded server are no longer working! */ -#define CONFIG_MMS_THREADLESS_STACK 1 +#define CONFIG_MMS_THREADLESS_STACK 0 /* number of concurrent MMS client connections the server accepts, -1 for no limit */ #define CONFIG_MAXIMUM_TCP_CLIENT_CONNECTIONS 5